diff options
Diffstat (limited to 'firmware/drivers/lcd-16bit-common.c')
-rw-r--r-- | firmware/drivers/lcd-16bit-common.c | 64 |
1 files changed, 34 insertions, 30 deletions
diff --git a/firmware/drivers/lcd-16bit-common.c b/firmware/drivers/lcd-16bit-common.c index ad41485dfe..a3a6dc6663 100644 --- a/firmware/drivers/lcd-16bit-common.c +++ b/firmware/drivers/lcd-16bit-common.c | |||
@@ -31,14 +31,15 @@ | |||
31 | /* Clear the current viewport */ | 31 | /* Clear the current viewport */ |
32 | void lcd_clear_viewport(void) | 32 | void lcd_clear_viewport(void) |
33 | { | 33 | { |
34 | struct viewport *vp = lcd_current_viewport; | ||
34 | fb_data *dst, *dst_end; | 35 | fb_data *dst, *dst_end; |
35 | int x, y, width, height; | 36 | int x, y, width, height; |
36 | int len, step; | 37 | int len, step; |
37 | 38 | ||
38 | x = lcd_current_viewport->x; | 39 | x = vp->x; |
39 | y = lcd_current_viewport->y; | 40 | y = vp->y; |
40 | width = lcd_current_viewport->width; | 41 | width = vp->width; |
41 | height = lcd_current_viewport->height; | 42 | height = vp->height; |
42 | 43 | ||
43 | len = STRIDE_MAIN(width, height); | 44 | len = STRIDE_MAIN(width, height); |
44 | step = STRIDE_MAIN(ROW_INC, COL_INC); | 45 | step = STRIDE_MAIN(ROW_INC, COL_INC); |
@@ -46,18 +47,18 @@ void lcd_clear_viewport(void) | |||
46 | dst = FBADDR(x, y); | 47 | dst = FBADDR(x, y); |
47 | dst_end = FBADDR(x + width - 1 , y + height - 1); | 48 | dst_end = FBADDR(x + width - 1 , y + height - 1); |
48 | 49 | ||
49 | if (lcd_current_viewport->drawmode & DRMODE_INVERSEVID) | 50 | if (vp->drawmode & DRMODE_INVERSEVID) |
50 | { | 51 | { |
51 | do | 52 | do |
52 | { | 53 | { |
53 | memset16(dst, lcd_current_viewport->fg_pattern, len); | 54 | memset16(dst, vp->fg_pattern, len); |
54 | dst += step; | 55 | dst += step; |
55 | } | 56 | } |
56 | while (dst <= dst_end); | 57 | while (dst <= dst_end); |
57 | } | 58 | } |
58 | else | 59 | else |
59 | { | 60 | { |
60 | if (lcd_backdrop && lcd_current_viewport->buffer == &lcd_framebuffer_default) | 61 | if (lcd_backdrop && vp->buffer == &lcd_framebuffer_default) |
61 | { | 62 | { |
62 | do | 63 | do |
63 | { | 64 | { |
@@ -71,19 +72,19 @@ void lcd_clear_viewport(void) | |||
71 | { | 72 | { |
72 | do | 73 | do |
73 | { | 74 | { |
74 | memset16(dst, lcd_current_viewport->bg_pattern, len); | 75 | memset16(dst, vp->bg_pattern, len); |
75 | dst += step; | 76 | dst += step; |
76 | } | 77 | } |
77 | while (dst <= dst_end); | 78 | while (dst <= dst_end); |
78 | } | 79 | } |
79 | } | 80 | } |
80 | 81 | ||
81 | if (lcd_current_viewport == &default_vp) | 82 | if (vp == &default_vp) |
82 | lcd_scroll_stop(); | 83 | lcd_scroll_stop(); |
83 | else | 84 | else |
84 | lcd_scroll_stop_viewport(lcd_current_viewport); | 85 | lcd_scroll_stop_viewport(vp); |
85 | 86 | ||
86 | lcd_current_viewport->flags &= ~(VP_FLAG_VP_SET_CLEAN); | 87 | vp->flags &= ~(VP_FLAG_VP_SET_CLEAN); |
87 | } | 88 | } |
88 | 89 | ||
89 | /*** low-level drawing functions ***/ | 90 | /*** low-level drawing functions ***/ |
@@ -128,6 +129,7 @@ lcd_fastpixelfunc_type* const * lcd_fastpixelfuncs = lcd_fastpixelfuncs_bgcolor; | |||
128 | /* Fill a rectangular area */ | 129 | /* Fill a rectangular area */ |
129 | void lcd_fillrect(int x, int y, int width, int height) | 130 | void lcd_fillrect(int x, int y, int width, int height) |
130 | { | 131 | { |
132 | struct viewport *vp = lcd_current_viewport; | ||
131 | unsigned bits = 0; | 133 | unsigned bits = 0; |
132 | enum fill_opt fillopt = OPT_NONE; | 134 | enum fill_opt fillopt = OPT_NONE; |
133 | fb_data *dst, *dst_end; | 135 | fb_data *dst, *dst_end; |
@@ -137,14 +139,14 @@ void lcd_fillrect(int x, int y, int width, int height) | |||
137 | return; | 139 | return; |
138 | 140 | ||
139 | /* drawmode and optimisation */ | 141 | /* drawmode and optimisation */ |
140 | if (lcd_current_viewport->drawmode & DRMODE_INVERSEVID) | 142 | if (vp->drawmode & DRMODE_INVERSEVID) |
141 | { | 143 | { |
142 | if (lcd_current_viewport->drawmode & DRMODE_BG) | 144 | if (vp->drawmode & DRMODE_BG) |
143 | { | 145 | { |
144 | if (!lcd_backdrop) | 146 | if (!lcd_backdrop) |
145 | { | 147 | { |
146 | fillopt = OPT_SET; | 148 | fillopt = OPT_SET; |
147 | bits = lcd_current_viewport->bg_pattern; | 149 | bits = vp->bg_pattern; |
148 | } | 150 | } |
149 | else | 151 | else |
150 | fillopt = OPT_COPY; | 152 | fillopt = OPT_COPY; |
@@ -152,13 +154,13 @@ void lcd_fillrect(int x, int y, int width, int height) | |||
152 | } | 154 | } |
153 | else | 155 | else |
154 | { | 156 | { |
155 | if (lcd_current_viewport->drawmode & DRMODE_FG) | 157 | if (vp->drawmode & DRMODE_FG) |
156 | { | 158 | { |
157 | fillopt = OPT_SET; | 159 | fillopt = OPT_SET; |
158 | bits = lcd_current_viewport->fg_pattern; | 160 | bits = vp->fg_pattern; |
159 | } | 161 | } |
160 | } | 162 | } |
161 | if (fillopt == OPT_NONE && lcd_current_viewport->drawmode != DRMODE_COMPLEMENT) | 163 | if (fillopt == OPT_NONE && vp->drawmode != DRMODE_COMPLEMENT) |
162 | return; | 164 | return; |
163 | 165 | ||
164 | dst = FBADDR(x, y); | 166 | dst = FBADDR(x, y); |
@@ -213,6 +215,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x, | |||
213 | int src_y, int stride, int x, int y, | 215 | int src_y, int stride, int x, int y, |
214 | int width, int height) | 216 | int width, int height) |
215 | { | 217 | { |
218 | struct viewport *vp = lcd_current_viewport; | ||
216 | if (!lcd_clip_viewport_rect(&x, &y, &width, &height, &src_x, &src_y)) | 219 | if (!lcd_clip_viewport_rect(&x, &y, &width, &height, &src_x, &src_y)) |
217 | return; | 220 | return; |
218 | 221 | ||
@@ -221,7 +224,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x, | |||
221 | src_y &= 7; | 224 | src_y &= 7; |
222 | 225 | ||
223 | unsigned dmask = 0; | 226 | unsigned dmask = 0; |
224 | int drmode = lcd_current_viewport->drawmode; | 227 | int drmode = vp->drawmode; |
225 | 228 | ||
226 | if (drmode & DRMODE_INVERSEVID) | 229 | if (drmode & DRMODE_INVERSEVID) |
227 | { | 230 | { |
@@ -267,7 +270,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x, | |||
267 | break; | 270 | break; |
268 | 271 | ||
269 | case DRMODE_BG: | 272 | case DRMODE_BG: |
270 | bg = lcd_current_viewport->bg_pattern; | 273 | bg = vp->bg_pattern; |
271 | do { | 274 | do { |
272 | data = (*src_col++ ^ dmask) >> src_y; | 275 | data = (*src_col++ ^ dmask) >> src_y; |
273 | if(!(data & 0x01)) | 276 | if(!(data & 0x01)) |
@@ -278,7 +281,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x, | |||
278 | break; | 281 | break; |
279 | 282 | ||
280 | case DRMODE_FG: | 283 | case DRMODE_FG: |
281 | fg = lcd_current_viewport->fg_pattern; | 284 | fg = vp->fg_pattern; |
282 | do { | 285 | do { |
283 | data = (*src_col++ ^ dmask) >> src_y; | 286 | data = (*src_col++ ^ dmask) >> src_y; |
284 | if(data & 0x01) | 287 | if(data & 0x01) |
@@ -289,7 +292,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x, | |||
289 | break; | 292 | break; |
290 | 293 | ||
291 | case DRMODE_SOLID|DRMODE_INT_BD: | 294 | case DRMODE_SOLID|DRMODE_INT_BD: |
292 | fg = lcd_current_viewport->fg_pattern; | 295 | fg = vp->fg_pattern; |
293 | bo = lcd_backdrop_offset; | 296 | bo = lcd_backdrop_offset; |
294 | do { | 297 | do { |
295 | data = (*src_col++ ^ dmask) >> src_y; | 298 | data = (*src_col++ ^ dmask) >> src_y; |
@@ -303,8 +306,8 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x, | |||
303 | break; | 306 | break; |
304 | 307 | ||
305 | case DRMODE_SOLID: | 308 | case DRMODE_SOLID: |
306 | fg = lcd_current_viewport->fg_pattern; | 309 | fg = vp->fg_pattern; |
307 | bg = lcd_current_viewport->bg_pattern; | 310 | bg = vp->bg_pattern; |
308 | do { | 311 | do { |
309 | data = (*src_col++ ^ dmask) >> src_y; | 312 | data = (*src_col++ ^ dmask) >> src_y; |
310 | if(data & 0x01) | 313 | if(data & 0x01) |
@@ -416,9 +419,10 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image, | |||
416 | int width, int height, | 419 | int width, int height, |
417 | int stride_image, int stride_src) | 420 | int stride_image, int stride_src) |
418 | { | 421 | { |
422 | struct viewport *vp = lcd_current_viewport; | ||
419 | fb_data *dst, *dst_row; | 423 | fb_data *dst, *dst_row; |
420 | unsigned dmask = 0x00000000; | 424 | unsigned dmask = 0x00000000; |
421 | int drmode = lcd_current_viewport->drawmode; | 425 | int drmode = vp->drawmode; |
422 | 426 | ||
423 | if (!lcd_clip_viewport_rect(&x, &y, &width, &height, &src_x, &src_y)) | 427 | if (!lcd_clip_viewport_rect(&x, &y, &width, &height, &src_x, &src_y)) |
424 | return; | 428 | return; |
@@ -545,7 +549,7 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image, | |||
545 | while (--col); | 549 | while (--col); |
546 | break; | 550 | break; |
547 | case DRMODE_BG: | 551 | case DRMODE_BG: |
548 | bg = lcd_current_viewport->bg_pattern; | 552 | bg = vp->bg_pattern; |
549 | do | 553 | do |
550 | { | 554 | { |
551 | *dst = blend_two_colors(bg, *dst, data & ALPHA_COLOR_LOOKUP_SIZE ); | 555 | *dst = blend_two_colors(bg, *dst, data & ALPHA_COLOR_LOOKUP_SIZE ); |
@@ -565,7 +569,7 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image, | |||
565 | while (--col); | 569 | while (--col); |
566 | break; | 570 | break; |
567 | case DRMODE_FG: | 571 | case DRMODE_FG: |
568 | fg = lcd_current_viewport->fg_pattern; | 572 | fg = vp->fg_pattern; |
569 | do | 573 | do |
570 | { | 574 | { |
571 | *dst = blend_two_colors(*dst, fg, data & ALPHA_COLOR_LOOKUP_SIZE ); | 575 | *dst = blend_two_colors(*dst, fg, data & ALPHA_COLOR_LOOKUP_SIZE ); |
@@ -576,7 +580,7 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image, | |||
576 | break; | 580 | break; |
577 | case DRMODE_SOLID|DRMODE_INT_BD: | 581 | case DRMODE_SOLID|DRMODE_INT_BD: |
578 | bo = lcd_backdrop_offset; | 582 | bo = lcd_backdrop_offset; |
579 | fg = lcd_current_viewport->fg_pattern; | 583 | fg = vp->fg_pattern; |
580 | do | 584 | do |
581 | { | 585 | { |
582 | fb_data *c = (fb_data *)((uintptr_t)dst + bo); | 586 | fb_data *c = (fb_data *)((uintptr_t)dst + bo); |
@@ -587,7 +591,7 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image, | |||
587 | while (--col); | 591 | while (--col); |
588 | break; | 592 | break; |
589 | case DRMODE_SOLID|DRMODE_INT_IMG: | 593 | case DRMODE_SOLID|DRMODE_INT_IMG: |
590 | bg = lcd_current_viewport->bg_pattern; | 594 | bg = vp->bg_pattern; |
591 | img_offset = image - dst; | 595 | img_offset = image - dst; |
592 | do | 596 | do |
593 | { | 597 | { |
@@ -610,8 +614,8 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image, | |||
610 | while (--col); | 614 | while (--col); |
611 | break; | 615 | break; |
612 | case DRMODE_SOLID: | 616 | case DRMODE_SOLID: |
613 | bg = lcd_current_viewport->bg_pattern; | 617 | bg = vp->bg_pattern; |
614 | fg = lcd_current_viewport->fg_pattern; | 618 | fg = vp->fg_pattern; |
615 | do | 619 | do |
616 | { | 620 | { |
617 | *dst = blend_two_colors(bg, fg, data & ALPHA_COLOR_LOOKUP_SIZE ); | 621 | *dst = blend_two_colors(bg, fg, data & ALPHA_COLOR_LOOKUP_SIZE ); |