summaryrefslogtreecommitdiffstats
path: root/firmware/drivers/lcd-16bit-common.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/lcd-16bit-common.c')
-rw-r--r--firmware/drivers/lcd-16bit-common.c64
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 @@
/* Clear the current viewport */
void lcd_clear_viewport(void)
{
+ struct viewport *vp = lcd_current_viewport;
fb_data *dst, *dst_end;
int x, y, width, height;
int len, step;
- x = lcd_current_viewport->x;
- y = lcd_current_viewport->y;
- width = lcd_current_viewport->width;
- height = lcd_current_viewport->height;
+ x = vp->x;
+ y = vp->y;
+ width = vp->width;
+ height = vp->height;
len = STRIDE_MAIN(width, height);
step = STRIDE_MAIN(ROW_INC, COL_INC);
@@ -46,18 +47,18 @@ void lcd_clear_viewport(void)
dst = FBADDR(x, y);
dst_end = FBADDR(x + width - 1 , y + height - 1);
- if (lcd_current_viewport->drawmode & DRMODE_INVERSEVID)
+ if (vp->drawmode & DRMODE_INVERSEVID)
{
do
{
- memset16(dst, lcd_current_viewport->fg_pattern, len);
+ memset16(dst, vp->fg_pattern, len);
dst += step;
}
while (dst <= dst_end);
}
else
{
- if (lcd_backdrop && lcd_current_viewport->buffer == &lcd_framebuffer_default)
+ if (lcd_backdrop && vp->buffer == &lcd_framebuffer_default)
{
do
{
@@ -71,19 +72,19 @@ void lcd_clear_viewport(void)
{
do
{
- memset16(dst, lcd_current_viewport->bg_pattern, len);
+ memset16(dst, vp->bg_pattern, len);
dst += step;
}
while (dst <= dst_end);
}
}
- if (lcd_current_viewport == &default_vp)
+ if (vp == &default_vp)
lcd_scroll_stop();
else
- lcd_scroll_stop_viewport(lcd_current_viewport);
+ lcd_scroll_stop_viewport(vp);
- lcd_current_viewport->flags &= ~(VP_FLAG_VP_SET_CLEAN);
+ vp->flags &= ~(VP_FLAG_VP_SET_CLEAN);
}
/*** low-level drawing functions ***/
@@ -128,6 +129,7 @@ lcd_fastpixelfunc_type* const * lcd_fastpixelfuncs = lcd_fastpixelfuncs_bgcolor;
/* Fill a rectangular area */
void lcd_fillrect(int x, int y, int width, int height)
{
+ struct viewport *vp = lcd_current_viewport;
unsigned bits = 0;
enum fill_opt fillopt = OPT_NONE;
fb_data *dst, *dst_end;
@@ -137,14 +139,14 @@ void lcd_fillrect(int x, int y, int width, int height)
return;
/* drawmode and optimisation */
- if (lcd_current_viewport->drawmode & DRMODE_INVERSEVID)
+ if (vp->drawmode & DRMODE_INVERSEVID)
{
- if (lcd_current_viewport->drawmode & DRMODE_BG)
+ if (vp->drawmode & DRMODE_BG)
{
if (!lcd_backdrop)
{
fillopt = OPT_SET;
- bits = lcd_current_viewport->bg_pattern;
+ bits = vp->bg_pattern;
}
else
fillopt = OPT_COPY;
@@ -152,13 +154,13 @@ void lcd_fillrect(int x, int y, int width, int height)
}
else
{
- if (lcd_current_viewport->drawmode & DRMODE_FG)
+ if (vp->drawmode & DRMODE_FG)
{
fillopt = OPT_SET;
- bits = lcd_current_viewport->fg_pattern;
+ bits = vp->fg_pattern;
}
}
- if (fillopt == OPT_NONE && lcd_current_viewport->drawmode != DRMODE_COMPLEMENT)
+ if (fillopt == OPT_NONE && vp->drawmode != DRMODE_COMPLEMENT)
return;
dst = FBADDR(x, y);
@@ -213,6 +215,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
int src_y, int stride, int x, int y,
int width, int height)
{
+ struct viewport *vp = lcd_current_viewport;
if (!lcd_clip_viewport_rect(&x, &y, &width, &height, &src_x, &src_y))
return;
@@ -221,7 +224,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
src_y &= 7;
unsigned dmask = 0;
- int drmode = lcd_current_viewport->drawmode;
+ int drmode = vp->drawmode;
if (drmode & DRMODE_INVERSEVID)
{
@@ -267,7 +270,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
break;
case DRMODE_BG:
- bg = lcd_current_viewport->bg_pattern;
+ bg = vp->bg_pattern;
do {
data = (*src_col++ ^ dmask) >> src_y;
if(!(data & 0x01))
@@ -278,7 +281,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
break;
case DRMODE_FG:
- fg = lcd_current_viewport->fg_pattern;
+ fg = vp->fg_pattern;
do {
data = (*src_col++ ^ dmask) >> src_y;
if(data & 0x01)
@@ -289,7 +292,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
break;
case DRMODE_SOLID|DRMODE_INT_BD:
- fg = lcd_current_viewport->fg_pattern;
+ fg = vp->fg_pattern;
bo = lcd_backdrop_offset;
do {
data = (*src_col++ ^ dmask) >> src_y;
@@ -303,8 +306,8 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
break;
case DRMODE_SOLID:
- fg = lcd_current_viewport->fg_pattern;
- bg = lcd_current_viewport->bg_pattern;
+ fg = vp->fg_pattern;
+ bg = vp->bg_pattern;
do {
data = (*src_col++ ^ dmask) >> src_y;
if(data & 0x01)
@@ -416,9 +419,10 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image,
int width, int height,
int stride_image, int stride_src)
{
+ struct viewport *vp = lcd_current_viewport;
fb_data *dst, *dst_row;
unsigned dmask = 0x00000000;
- int drmode = lcd_current_viewport->drawmode;
+ int drmode = vp->drawmode;
if (!lcd_clip_viewport_rect(&x, &y, &width, &height, &src_x, &src_y))
return;
@@ -545,7 +549,7 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image,
while (--col);
break;
case DRMODE_BG:
- bg = lcd_current_viewport->bg_pattern;
+ bg = vp->bg_pattern;
do
{
*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,
while (--col);
break;
case DRMODE_FG:
- fg = lcd_current_viewport->fg_pattern;
+ fg = vp->fg_pattern;
do
{
*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,
break;
case DRMODE_SOLID|DRMODE_INT_BD:
bo = lcd_backdrop_offset;
- fg = lcd_current_viewport->fg_pattern;
+ fg = vp->fg_pattern;
do
{
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,
while (--col);
break;
case DRMODE_SOLID|DRMODE_INT_IMG:
- bg = lcd_current_viewport->bg_pattern;
+ bg = vp->bg_pattern;
img_offset = image - dst;
do
{
@@ -610,8 +614,8 @@ static void ICODE_ATTR lcd_alpha_bitmap_part_mix(const fb_data* image,
while (--col);
break;
case DRMODE_SOLID:
- bg = lcd_current_viewport->bg_pattern;
- fg = lcd_current_viewport->fg_pattern;
+ bg = vp->bg_pattern;
+ fg = vp->fg_pattern;
do
{
*dst = blend_two_colors(bg, fg, data & ALPHA_COLOR_LOOKUP_SIZE );