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;