Index: rockbox_svn/apps/gui/gwps-common.c =================================================================== --- rockbox_svn.orig/apps/gui/gwps-common.c +++ rockbox_svn/apps/gui/gwps-common.c @@ -1501,7 +1501,22 @@ static char *get_token_value(struct gui_ break; } return NULL; - + case WPS_TOKEN_FG_COLOR: +#ifdef HAVE_LCD_COLOR + if(gwps->display->depth>2){ + gwps->display->set_foreground(token->value.i); + } +#endif + return NULL; + + case WPS_TOKEN_BG_COLOR: +#ifdef HAVE_LCD_COLOR + if(gwps->display->depth>2){ + gwps->display->set_background(token->value.i); + } + #endif + return NULL; + default: return NULL; } @@ -2065,9 +2080,11 @@ bool gui_wps_refresh(struct gui_wps *gwp bool update_line, new_subline_refresh; #ifdef HAVE_LCD_COLOR + int bgcolor_save; int fgcolor_save; if(display->depth>2){ fgcolor_save=display->get_foreground(); + bgcolor_save=display->get_background(); } #endif int leftmargin_save=display->getleftmargin(); @@ -2137,7 +2154,7 @@ bool gui_wps_refresh(struct gui_wps *gwp update_line = get_line(gwps, line, data->lines[line].curr_subline, &align, linebuf, sizeof(linebuf)); } - + #ifdef HAVE_LCD_BITMAP /* progressbar */ if (flags & refresh_mode & WPS_REFRESH_PLAYER_PROGRESS) @@ -2241,6 +2258,7 @@ bool gui_wps_refresh(struct gui_wps *gwp #ifdef HAVE_LCD_COLOR if(display->depth>2){ display->set_foreground(fgcolor_save); + display->set_background(bgcolor_save); } #endif display->setmargins( leftmargin_save, rightmargin_save, ymargin_save ); Index: rockbox_svn/apps/gui/gwps.h =================================================================== --- rockbox_svn.orig/apps/gui/gwps.h +++ rockbox_svn/apps/gui/gwps.h @@ -218,6 +218,10 @@ enum wps_token_type { WPS_TOKEN_CUSTOMLINE_WIDTH, WPS_TOKEN_CUSTOMLINE_FONT, WPS_TOKEN_CUSTOMLINE_COLOR, + + /* colorized wps */ + WPS_TOKEN_FG_COLOR, + WPS_TOKEN_BG_COLOR, #endif /* Metadata */ Index: rockbox_svn/apps/gui/wps_parser.c =================================================================== --- rockbox_svn.orig/apps/gui/wps_parser.c +++ rockbox_svn/apps/gui/wps_parser.c @@ -132,6 +132,11 @@ static int parse_albumart_conditional(co struct wps_token *token, struct wps_data *wps_data); static int parse_customline(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data); +static int parse_fg_color(const char *wps_bufptr, + struct wps_token *token, struct wps_data *wps_data); +static int parse_bg_color(const char *wps_bufptr, + struct wps_token *token, struct wps_data *wps_data); + #endif /*HAVE_LCD_BITMAP */ #ifdef CONFIG_RTC @@ -277,6 +282,9 @@ static const struct wps_tag all_tags[] = { WPS_TOKEN_SUBLINE_TIMEOUT, "t", 0, parse_subline_timeout }, #ifdef HAVE_LCD_BITMAP + { WPS_NO_TOKEN, "Cf", 0, parse_fg_color }, + { WPS_NO_TOKEN, "Cb", 0, parse_bg_color }, + { WPS_NO_TOKEN, "Cl", 0, parse_albumart_load }, { WPS_TOKEN_ALBUMART_DISPLAY, "C", WPS_REFRESH_DYNAMIC, parse_albumart_conditional }, { WPS_NO_TOKEN, "we", 0, parse_statusbar_enable }, @@ -714,6 +722,46 @@ static int parse_customline(const char * return( _pos - wps_bufptr + 1 ); } +static int parse_bg_color(const char *wps_bufptr, + struct wps_token *token, + struct wps_data *wps_data) +{ + /* format: %Cb[rgb] */ + const char* _pos; + + _pos=wps_bufptr; + char color[7]; + snprintf(color, 7, "%s", _pos); + int color_value = hex_to_rgb(color); + + _pos+=6; + + wps_data->num_tokens +=1; + token->type = WPS_TOKEN_BG_COLOR; + token->value.i = color_value; + return( _pos - wps_bufptr ); +} + +static int parse_fg_color(const char *wps_bufptr, + struct wps_token *token, + struct wps_data *wps_data) +{ + /* format: %Cf[rgb] */ + const char* _pos; + + _pos=wps_bufptr; + char color[7]; + snprintf(color, 7, "%s", _pos); + int color_value = hex_to_rgb(color); + + _pos+=6; + + wps_data->num_tokens +=1; + token->type = WPS_TOKEN_FG_COLOR; + token->value.i = color_value; + return( _pos - wps_bufptr ); +} + static int parse_albumart_load(const char *wps_bufptr, struct wps_token *token, struct wps_data *wps_data) Index: rockbox_svn/firmware/drivers/lcd-16bit.c =================================================================== --- rockbox_svn.orig/firmware/drivers/lcd-16bit.c +++ rockbox_svn/firmware/drivers/lcd-16bit.c @@ -988,6 +988,7 @@ void lcd_puts_customline_scroll_style_of s->line_xpos = lcd_getleftmargin(); s->line_ypos = lcd_getymargin(); s->fgcolor = lcd_get_foreground(); + s->bgcolor = lcd_get_background(); s->line_width = lcd_getrightmargin()-lcd_getleftmargin(); s->start_tick = current_tick + scroll_delay; @@ -1075,6 +1076,7 @@ void lcd_puts_scroll_style_offset(int x, s->line_ypos = 0; s->line_width=0; s->fgcolor = lcd_get_foreground(); + s->bgcolor = lcd_get_background(); s->start_tick = current_tick + scroll_delay; s->invert = false; s->invert = false; @@ -1139,6 +1141,7 @@ static void scroll_thread(void) int lastmode; unsigned old_bgcolour, old_fgcolour; int fgcolor_save; + int bgcolor_save; /* initialize scroll struct array */ scrolling_lines = 0; @@ -1213,6 +1216,8 @@ static void scroll_thread(void) fgcolor_save = lcd_get_foreground(); lcd_set_foreground(s->fgcolor); + bgcolor_save = lcd_get_background(); + lcd_set_background(s->bgcolor); lastmode = drawmode; drawmode = s->invert ? @@ -1222,6 +1227,7 @@ static void scroll_thread(void) lcd_update_rect(xpos, ypos, s->right_margin - xpos, pf->height); lcd_set_foreground(fgcolor_save); + lcd_set_background(bgcolor_save); } lcd_set_foreground(old_fgcolour); lcd_set_background(old_bgcolour); Index: rockbox_svn/firmware/export/lcd.h =================================================================== --- rockbox_svn.orig/firmware/export/lcd.h +++ rockbox_svn/firmware/export/lcd.h @@ -421,6 +421,7 @@ struct scrollinfo { int line_ypos; int line_width; int fgcolor; + int bgcolor; }; #endif /* __LCD_H__ */