Index: apps/screen_access.c =================================================================== --- apps/screen_access.c (revision 16999) +++ apps/screen_access.c (working copy) @@ -83,6 +83,8 @@ .set_background=&lcd_set_background, .set_foreground=&lcd_set_foreground, #ifdef HAVE_LCD_COLOR + .get_background_use_backdrop=&lcd_get_background_use_backdrop, + .set_background_use_backdrop=&lcd_set_background_use_backdrop, .set_selector_start=&lcd_set_selector_start, .set_selector_end=&lcd_set_selector_end, .set_selector_text=&lcd_set_selector_text, Index: apps/screen_access.h =================================================================== --- apps/screen_access.h (revision 16999) +++ apps/screen_access.h (working copy) @@ -112,6 +112,8 @@ void (*set_foreground)(unsigned foreground); #endif /* (LCD_DEPTH > 1) || (LCD_REMOTE_DEPTH > 1) */ #if defined(HAVE_LCD_COLOR) + bool (*get_background_use_backdrop)(void); + void (*set_background_use_backdrop)(bool bg_use_backdrop); void (*set_selector_start)(unsigned selector); void (*set_selector_end)(unsigned selector); void (*set_selector_text)(unsigned selector_text); Index: apps/plugins/test_viewports.c =================================================================== --- apps/plugins/test_viewports.c (revision 16999) +++ apps/plugins/test_viewports.c (working copy) @@ -29,7 +29,7 @@ #define BGCOLOR_1 LCD_RGBPACK(255,255,0) #define BGCOLOR_2 LCD_RGBPACK(0,255,0) #define FGCOLOR_1 LCD_RGBPACK(0,0,255) -#else if LCD_DEPTH > 1 +#elif LCD_DEPTH > 1 #define BGCOLOR_1 LCD_DARKGRAY #define BGCOLOR_2 LCD_LIGHTGRAY #define FGCOLOR_1 LCD_WHITE @@ -50,6 +50,7 @@ .bg_pattern = BGCOLOR_1, #endif #ifdef HAVE_LCD_COLOR + .bg_use_backdrop = false, .lss_pattern = LCD_DEFAULT_BG, .lse_pattern = LCD_DEFAULT_BG, .lst_pattern = LCD_DEFAULT_BG, @@ -70,6 +71,7 @@ .fg_pattern = LCD_DEFAULT_FG, .bg_pattern = LCD_DEFAULT_BG, #ifdef HAVE_LCD_COLOR + .bg_use_backdrop = true, .lss_pattern = LCD_DEFAULT_BG, .lse_pattern = LCD_DEFAULT_BG, .lst_pattern = LCD_DEFAULT_BG, @@ -91,6 +93,7 @@ .fg_pattern = FGCOLOR_1, .bg_pattern = BGCOLOR_2, #ifdef HAVE_LCD_COLOR + .bg_use_backdrop = false, .lss_pattern = LCD_DEFAULT_BG, .lse_pattern = LCD_DEFAULT_BG, .lst_pattern = LCD_DEFAULT_BG, @@ -113,6 +116,7 @@ .fg_pattern = LCD_BLACK, .bg_pattern = LCD_WHITE, #ifdef HAVE_LCD_COLOR + .bg_use_backdrop = true, .lss_pattern = LCD_DEFAULT_BG, .lse_pattern = LCD_DEFAULT_BG, .lst_pattern = LCD_DEFAULT_BG, @@ -167,14 +171,18 @@ rb->screens[SCREEN_MAIN]->set_viewport(&vp0); rb->screens[SCREEN_MAIN]->clear_viewport(); - rb->screens[SCREEN_MAIN]->puts_scroll(0,0,"Viewport testing plugin - this is a scrolling title"); + rb->snprintf(buf,sizeof(buf), + "Viewport testing plugin - this is a scrolling title (bg_use_backdrop=%d)", + rb->screens[SCREEN_MAIN]->get_background_use_backdrop()); + rb->screens[SCREEN_MAIN]->puts_scroll(0,0,buf); rb->screens[SCREEN_MAIN]->set_viewport(&vp1); rb->screens[SCREEN_MAIN]->clear_viewport(); for (i = 0 ; i < 3; i++) { - rb->snprintf(buf,sizeof(buf),"Left text, scrolling_line %d",i); + rb->snprintf(buf,sizeof(buf),"Left text, scrolling_line %d (bg_use_backdrop=%d)",i, + rb->screens[SCREEN_MAIN]->get_background_use_backdrop()); rb->screens[SCREEN_MAIN]->puts_scroll(0,i,buf); } @@ -182,7 +190,8 @@ rb->screens[SCREEN_MAIN]->clear_viewport(); for (i = 1 ; i < 3; i++) { - rb->snprintf(buf,sizeof(buf),"Right text, scrolling line %d",i); + rb->snprintf(buf,sizeof(buf),"Right text, scrolling line %d (bg_use_backdrop=%d",i, + rb->screens[SCREEN_MAIN]->get_background_use_backdrop()); rb->screens[SCREEN_MAIN]->puts_scroll(1,i,buf); } @@ -194,9 +203,10 @@ rb->screens[SCREEN_MAIN]->set_viewport(&vp3); rb->screens[SCREEN_MAIN]->clear_viewport(); - for (i = 1 ; i < 2; i++) + for (i = 0 ; i < 2; i++) { - rb->snprintf(buf,sizeof(buf),"Bottom text, a scrolling line %d",i); + rb->snprintf(buf,sizeof(buf),"Bottom text, a scrolling line %d (bg_use_backdrop=%d)",i, + rb->screens[SCREEN_MAIN]->get_background_use_backdrop()); rb->screens[SCREEN_MAIN]->puts_scroll(2,i,buf); } rb->screens[SCREEN_MAIN]->puts_scroll(4,i,"Short line"); Index: apps/gui/wps_debug.c =================================================================== --- apps/gui/wps_debug.c (revision 16999) +++ apps/gui/wps_debug.c (working copy) @@ -502,8 +502,17 @@ DEBUGF("Number of viewports : %d\n", data->num_viewports); for (v = 0; v < data->num_viewports; v++) { + DEBUGF("vp %d: vp ptr: 0x%X\n", v, data->viewports[v].vp); DEBUGF("vp %d: First line: %d\n", v, data->viewports[v].first_line); - DEBUGF("vp %d: Last line: %d\n", v, data->viewports[v].last_line); + DEBUGF("vp %d: Last line: %d\n", v, data->viewports[v].last_line); +#if LCD_DEPTH > 1 + DEBUGF("vp %d: fg_pattern: 0x%6.6X\n", v, data->viewports[v].vp.fg_pattern); + DEBUGF("vp %d: bg_pattern: 0x%6.6X\n", v, data->viewports[v].vp.bg_pattern); +#ifdef HAVE_LCD_COLOR + DEBUGF("vp %d: bg_use_backdrop: %s\n", v, + data->viewports[v].vp.bg_use_backdrop ? "true" : "false"); +#endif +#endif } DEBUGF("Number of sublines : %d\n", data->num_sublines); DEBUGF("Number of tokens : %d\n", data->num_tokens); Index: apps/gui/viewport.c =================================================================== --- apps/gui/viewport.c (revision 16999) +++ apps/gui/viewport.c (working copy) @@ -65,6 +65,7 @@ #ifdef HAVE_LCD_COLOR vp->fg_pattern = global_settings.fg_color; vp->bg_pattern = global_settings.bg_color; + vp->bg_use_backdrop = true; vp->lss_pattern = global_settings.lss_color; vp->lse_pattern = global_settings.lse_color; vp->lst_pattern = global_settings.lst_color; Index: apps/gui/wps_parser.c =================================================================== --- apps/gui/wps_parser.c (revision 16999) +++ apps/gui/wps_parser.c (working copy) @@ -537,6 +537,44 @@ return skip_end_of_line(wps_bufptr); } +#ifdef HAVE_LCD_COLOR +static const char *parse_viewport_opt_param(const char *ptr, bool *result) +{ + /* default is to use the backdrop color */ + *result = true; + + if (!ptr) + return NULL; + + switch (*ptr) + { + case '0': + *result = false; + /* attentional fall through... */ + + case '1': + ptr++; + /* check for trailing '|' */ + if (!ptr || *ptr != '|') + return NULL; + break; + + case '|': + *result = false; + break; + + case '\n': + break; + + default: + return NULL; + break; + } + + return ptr; +} +#endif + static int parse_viewport(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data) @@ -551,7 +589,7 @@ return WPS_ERROR_INVALID_PARAM; /* malformed token: e.g. %Cl7 */ ptr = wps_bufptr + 1; - /* format: %V|x|y|width|height|fg_pattern|bg_pattern| */ + /* format: %V|x|y|width|height|font|fg_pattern|bg_pattern|[[bg_use_backdrop]|] */ if (wps_data->num_viewports >= WPS_MAX_VIEWPORTS) return WPS_ERROR_INVALID_PARAM; @@ -599,10 +637,20 @@ #endif {} - /* Check for trailing | */ + /* Check there is a terminating | */ if (*ptr != '|') return WPS_ERROR_INVALID_PARAM; +#ifdef HAVE_LCD_COLOR + /* get the optional bg_use_backdrop parameter */ + if (depth == 16) + { + ptr++; + if (!(ptr = parse_viewport_opt_param(ptr, &(vp->bg_use_backdrop)))) + return WPS_ERROR_INVALID_PARAM; + } +#endif + /* Default to using the user font if the font was an invalid number */ if ((vp->font != FONT_SYSFIXED) && (vp->font != FONT_UI)) vp->font = FONT_UI; @@ -649,7 +697,6 @@ return skip_end_of_line(wps_bufptr); } - static int parse_image_special(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data) @@ -1493,6 +1540,9 @@ { wps_data->viewports[0].vp.fg_pattern = display->get_foreground(); wps_data->viewports[0].vp.bg_pattern = display->get_background(); +#ifdef HAVE_LCD_COLOR + wps_data->viewports[0].vp.bg_use_backdrop = true; +#endif } #endif if (!isfile) Index: firmware/export/lcd.h =================================================================== --- firmware/export/lcd.h (revision 16999) +++ firmware/export/lcd.h (working copy) @@ -39,6 +39,7 @@ unsigned fg_pattern; unsigned bg_pattern; #ifdef HAVE_LCD_COLOR + bool bg_use_backdrop; unsigned lss_pattern; unsigned lse_pattern; unsigned lst_pattern; @@ -423,6 +424,8 @@ extern void lcd_set_background(unsigned background); extern unsigned lcd_get_background(void); #ifdef HAVE_LCD_COLOR +extern void lcd_set_background_use_backdrop(bool bg_use_backdrop); +extern bool lcd_get_background_use_backdrop(void); extern void lcd_set_selector_start(unsigned selector); extern void lcd_set_selector_end(unsigned selector); extern void lcd_set_selector_text(unsigned selector_text); Index: firmware/drivers/lcd-16bit.c =================================================================== --- firmware/drivers/lcd-16bit.c (revision 16999) +++ firmware/drivers/lcd-16bit.c (working copy) @@ -61,6 +61,7 @@ .ymargin = 0, .fg_pattern = LCD_DEFAULT_FG, .bg_pattern = LCD_DEFAULT_BG, + .bg_use_backdrop = true, .lss_pattern = LCD_DEFAULT_BG, .lse_pattern = LCD_DEFAULT_BG, .lst_pattern = LCD_DEFAULT_BG, @@ -137,6 +138,16 @@ return current_vp->bg_pattern; } +void lcd_set_background_use_backdrop(bool bg_use_backdrop) +{ + current_vp->bg_use_backdrop = bg_use_backdrop; +} + +bool lcd_get_background_use_backdrop(void) +{ + return current_vp->bg_use_backdrop; +} + void lcd_set_selector_start(unsigned color) { current_vp->lss_pattern = color; @@ -155,8 +166,8 @@ void lcd_set_drawinfo(int mode, unsigned fg_color, unsigned bg_color) { lcd_set_drawmode(mode); - current_vp->fg_pattern = fg_color; - current_vp->bg_pattern = bg_color; + lcd_set_foreground(fg_color); + lcd_set_background(bg_color); } void lcd_setmargins(int x, int y) @@ -448,13 +459,16 @@ { if (current_vp->drawmode & DRMODE_BG) { - if (!lcd_backdrop) + if (!lcd_backdrop || !lcd_get_background_use_backdrop()) { fillopt = OPT_SET; bits = current_vp->bg_pattern; } else + { + /* use the color of the backdrop */ fillopt = OPT_COPY; + } } } else @@ -573,13 +587,16 @@ { if (current_vp->drawmode & DRMODE_BG) { - if (!lcd_backdrop) + if (!lcd_backdrop || !lcd_get_background_use_backdrop()) { fillopt = OPT_SET; bits = current_vp->bg_pattern; } else + { + /* use the color of the backdrop */ fillopt = OPT_COPY; + } } } else @@ -758,7 +775,11 @@ if (data & 0x01) *dst_col = current_vp->fg_pattern; else - *dst_col = has_backdrop ? *backdrop_col : current_vp->bg_pattern; + { + *dst_col = (has_backdrop && + lcd_get_background_use_backdrop()) ? + *backdrop_col : current_vp->bg_pattern; + } break; case DRMODE_FG: if (data & 0x01) @@ -766,7 +787,11 @@ break; case (DRMODE_SOLID|DRMODE_INVERSEVID): if (data & 0x01) - *dst_col = has_backdrop ? *backdrop_col : current_vp->bg_pattern; + { + *dst_col = (has_backdrop && + lcd_get_background_use_backdrop()) ? + *backdrop_col : current_vp->bg_pattern; + } else *dst_col = current_vp->fg_pattern; break;