Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
- index 9475e5f..16b5cdc 100644
- --- a/apps/gui/skin_engine/skin_parser.c
- +++ b/apps/gui/skin_engine/skin_parser.c
- @@ -438,6 +438,7 @@ static int parse_viewportcolour(struct skin_element *element,
- }
- else
- {
- + curr_vp->vp.ignore_bg_image = true;
- curr_vp->start_bgcolour = colour->colour;
- curr_vp->vp.bg_pattern = colour->colour;
- }
- diff --git a/apps/gui/viewport.c b/apps/gui/viewport.c
- index 45094e4..95b4e08 100644
- --- a/apps/gui/viewport.c
- +++ b/apps/gui/viewport.c
- @@ -332,7 +332,8 @@ void viewport_set_fullscreen(struct viewport *vp,
- #endif
- {
- vp->fg_pattern = FG_FALLBACK;
- - vp->bg_pattern = BG_FALLBACK;
- + vp->bg_pattern = LCD_DARKGRAY;//BG_FALLBACK;
- + vp->ignore_bg_image = false;
- #ifdef HAVE_LCD_COLOR
- vp->lss_pattern = global_settings.lss_color;
- vp->lse_pattern = global_settings.lse_color;
- diff --git a/firmware/drivers/lcd-16bit-vert.c b/firmware/drivers/lcd-16bit-vert.c
- index a2f47d3..ada2f18 100644
- --- a/firmware/drivers/lcd-16bit-vert.c
- +++ b/firmware/drivers/lcd-16bit-vert.c
- @@ -61,6 +61,7 @@ static struct viewport default_vp =
- .drawmode = DRMODE_SOLID,
- .fg_pattern = LCD_DEFAULT_FG,
- .bg_pattern = LCD_DEFAULT_BG,
- + .ignore_bg_image = false,
- .lss_pattern = LCD_DEFAULT_BG,
- .lse_pattern = LCD_DEFAULT_BG,
- .lst_pattern = LCD_DEFAULT_BG,
- @@ -206,6 +207,10 @@ int lcd_getstringsize(const unsigned char *str, int *w, int *h)
- }
- /*** low-level drawing functions ***/
- +static inline bool lcd_using_backdrop(void)
- +{
- + return !current_vp->ignore_bg_image;
- +}
- #define LCDADDR(x, y) (&lcd_framebuffer[0][0] + LCD_HEIGHT*(x) + (y))
- @@ -221,7 +226,10 @@ static void ICODE_ATTR clearpixel(fb_data *address)
- static void ICODE_ATTR clearimgpixel(fb_data *address)
- {
- - *address = *(fb_data *)((long)address + lcd_backdrop_offset);
- + if (lcd_using_backdrop())
- + *address = *(fb_data *)((long)address + lcd_backdrop_offset);
- + else
- + *address = current_vp->bg_pattern;
- }
- static void ICODE_ATTR flippixel(fb_data *address)
- @@ -287,7 +295,7 @@ void lcd_clear_viewport(void)
- }
- else
- {
- - if (!lcd_backdrop)
- + if (!lcd_backdrop || !lcd_using_backdrop())
- {
- do
- {
- @@ -543,7 +551,7 @@ void lcd_vline(int x, int y1, int y2)
- {
- if (current_vp->drawmode & DRMODE_BG)
- {
- - if (!lcd_backdrop)
- + if (!lcd_backdrop || !lcd_using_backdrop())
- {
- fillopt = OPT_SET;
- bits = current_vp->bg_pattern;
- @@ -661,7 +669,7 @@ void lcd_fillrect(int x, int y, int width, int height)
- {
- if (current_vp->drawmode & DRMODE_BG)
- {
- - if (!lcd_backdrop)
- + if (!lcd_backdrop || !lcd_using_backdrop())
- {
- fillopt = OPT_SET;
- bits = current_vp->bg_pattern;
- @@ -831,7 +839,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
- break;
- case DRMODE_BG:
- - if (lcd_backdrop)
- + if (lcd_backdrop && lcd_using_backdrop())
- {
- bo = lcd_backdrop_offset;
- do
- @@ -874,7 +882,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
- case DRMODE_SOLID:
- fg = current_vp->fg_pattern;
- - if (lcd_backdrop)
- + if (lcd_backdrop && lcd_using_backdrop())
- {
- bo = lcd_backdrop_offset;
- do
- diff --git a/firmware/drivers/lcd-16bit.c b/firmware/drivers/lcd-16bit.c
- index be4f21f..656828f 100644
- --- a/firmware/drivers/lcd-16bit.c
- +++ b/firmware/drivers/lcd-16bit.c
- @@ -60,6 +60,7 @@ static struct viewport default_vp =
- .drawmode = DRMODE_SOLID,
- .fg_pattern = LCD_DEFAULT_FG,
- .bg_pattern = LCD_DEFAULT_BG,
- + .ignore_bg_image = false,
- .lss_pattern = LCD_DEFAULT_BG,
- .lse_pattern = LCD_DEFAULT_BG,
- .lst_pattern = LCD_DEFAULT_BG,
- @@ -199,6 +200,10 @@ int lcd_getstringsize(const unsigned char *str, int *w, int *h)
- }
- /*** low-level drawing functions ***/
- +static inline bool lcd_using_backdrop(void)
- +{
- + return !current_vp->ignore_bg_image;
- +}
- #define LCDADDR(x, y) (&lcd_framebuffer[(y)][(x)])
- @@ -214,7 +219,10 @@ static void ICODE_ATTR clearpixel(fb_data *address)
- static void ICODE_ATTR clearimgpixel(fb_data *address)
- {
- - *address = *(fb_data *)((long)address + lcd_backdrop_offset);
- + if (lcd_using_backdrop())
- + *address = *(fb_data *)((long)address + lcd_backdrop_offset);
- + else
- + *address = current_vp->bg_pattern;
- }
- static void ICODE_ATTR flippixel(fb_data *address)
- @@ -280,7 +288,7 @@ void lcd_clear_viewport(void)
- }
- else
- {
- - if (!lcd_backdrop)
- + if (!lcd_backdrop || !lcd_using_backdrop())
- {
- do
- {
- @@ -479,7 +487,7 @@ void lcd_hline(int x1, int x2, int y)
- {
- if (current_vp->drawmode & DRMODE_BG)
- {
- - if (!lcd_backdrop)
- + if (!lcd_backdrop || !lcd_using_backdrop())
- {
- fillopt = OPT_SET;
- bits = current_vp->bg_pattern;
- @@ -654,7 +662,7 @@ void lcd_fillrect(int x, int y, int width, int height)
- {
- if (current_vp->drawmode & DRMODE_BG)
- {
- - if (!lcd_backdrop)
- + if (!lcd_backdrop || !lcd_using_backdrop())
- {
- fillopt = OPT_SET;
- bits = current_vp->bg_pattern;
- @@ -824,7 +832,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
- break;
- case DRMODE_BG:
- - if (lcd_backdrop)
- + if (lcd_backdrop && lcd_using_backdrop())
- {
- bo = lcd_backdrop_offset;
- do
- @@ -867,7 +875,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
- case DRMODE_SOLID:
- fg = current_vp->fg_pattern;
- - if (lcd_backdrop)
- + if (lcd_backdrop && lcd_using_backdrop())
- {
- bo = lcd_backdrop_offset;
- do
- diff --git a/firmware/drivers/lcd-2bit-horz.c b/firmware/drivers/lcd-2bit-horz.c
- index b480509..0c71a64 100644
- --- a/firmware/drivers/lcd-2bit-horz.c
- +++ b/firmware/drivers/lcd-2bit-horz.c
- @@ -57,7 +57,8 @@ static struct viewport default_vp =
- .font = FONT_SYSFIXED,
- .drawmode = DRMODE_SOLID,
- .fg_pattern = LCD_DEFAULT_FG,
- - .bg_pattern = LCD_DEFAULT_BG
- + .bg_pattern = LCD_DEFAULT_BG,
- + .ignore_bg_image = false
- };
- static struct viewport* current_vp IBSS_ATTR;
- @@ -189,6 +190,10 @@ int lcd_getstringsize(const unsigned char *str, int *w, int *h)
- }
- /*** low-level drawing functions ***/
- +static inline bool lcd_using_backdrop(void)
- +{
- + return false;//!current_vp->ignore_bg_image;
- +}
- static void setpixel(int x, int y)
- {
- @@ -213,8 +218,12 @@ static void clearimgpixel(int x, int y)
- unsigned mask = pixmask[x & 3];
- fb_data *address = &lcd_framebuffer[y][x>>2];
- unsigned data = *address;
- + unsigned pattern = *(address + lcd_backdrop_offset);
- +
- + if (!lcd_using_backdrop())
- + pattern = bg_pattern;
- - *address = data ^ ((data ^ *(address + lcd_backdrop_offset)) & mask);
- + *address = data ^ ((data ^ pattern) & mask);
- }
- static void flippixel(int x, int y)
- @@ -263,8 +272,12 @@ static void ICODE_ATTR bgimgblock(fb_data *address, unsigned mask,
- unsigned bits)
- {
- unsigned data = *address;
- + unsigned pattern = *(address + lcd_backdrop_offset);
- +
- + if (!lcd_using_backdrop())
- + pattern = bg_pattern;
- - *address = data ^ ((data ^ *(address + lcd_backdrop_offset)) & mask & ~bits);
- + *address = data ^ ((data ^ pattern) & mask & ~bits);
- }
- static void ICODE_ATTR fgblock(fb_data *address, unsigned mask,
- @@ -290,6 +303,9 @@ static void ICODE_ATTR solidimgblock(fb_data *address, unsigned mask,
- {
- unsigned data = *address;
- unsigned bgp = *(address + lcd_backdrop_offset);
- +
- + if (!lcd_using_backdrop())
- + bgp = bg_pattern;
- bits = bgp ^ ((bgp ^ fg_pattern) & bits);
- *address = data ^ ((data ^ bits) & mask);
- @@ -313,8 +329,12 @@ static void ICODE_ATTR bgimginvblock(fb_data *address, unsigned mask,
- unsigned bits)
- {
- unsigned data = *address;
- + unsigned bgp = *(address + lcd_backdrop_offset);
- +
- + if (!lcd_using_backdrop())
- + bgp = bg_pattern;
- - *address = data ^ ((data ^ *(address + lcd_backdrop_offset)) & mask & bits);
- + *address = data ^ ((data ^ bgp) & mask & bits);
- }
- static void ICODE_ATTR fginvblock(fb_data *address, unsigned mask,
- @@ -340,8 +360,12 @@ static void ICODE_ATTR solidimginvblock(fb_data *address, unsigned mask,
- {
- unsigned data = *address;
- unsigned fgp = fg_pattern;
- + unsigned bgp = *(address + lcd_backdrop_offset);
- +
- + if (!lcd_using_backdrop())
- + bgp = bg_pattern;
- - bits = fgp ^ ((fgp ^ *(address + lcd_backdrop_offset)) & bits);
- + bits = fgp ^ ((fgp ^ bgp) & bits);
- *address = data ^ ((data ^ bits) & mask);
- }
- @@ -400,7 +424,7 @@ void lcd_clear_display(void)
- }
- else
- {
- - if (lcd_backdrop)
- + if (lcd_backdrop && lcd_using_backdrop())
- memcpy(lcd_framebuffer, lcd_backdrop, sizeof lcd_framebuffer);
- else
- memset(lcd_framebuffer, bg_pattern, sizeof lcd_framebuffer);
- @@ -877,7 +901,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
- break;
- case DRMODE_BG:
- - if (lcd_backdrop)
- + if (lcd_backdrop && lcd_using_backdrop())
- {
- bo = lcd_backdrop_offset;
- do
- @@ -927,7 +951,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
- case DRMODE_SOLID:
- fg = fg_pattern;
- - if (lcd_backdrop)
- + if (lcd_backdrop && lcd_using_backdrop())
- {
- bo = lcd_backdrop_offset;
- do
- diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h
- index 79231d1..a3ec33f 100644
- --- a/firmware/export/lcd.h
- +++ b/firmware/export/lcd.h
- @@ -48,6 +48,7 @@ struct viewport {
- #if LCD_DEPTH > 1
- unsigned fg_pattern;
- unsigned bg_pattern;
- + bool ignore_bg_image;
- #ifdef HAVE_LCD_COLOR
- unsigned lss_pattern;
- unsigned lse_pattern;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement