From d4d3f3c494e48304d41eada0a4881a9d2b4b97f4 Mon Sep 17 00:00:00 2001 From: Thomas Martitz Date: Fri, 10 Jan 2014 21:50:37 +0100 Subject: skin engine: Fix FS#12884. The %Vf and %Vb tags change the colors for the rest of the viewport. This requires the rest of the vp to be redrawn when they change due to a conditional. The previous code did this redraw in all cases (conditional or not) which led to visible blinking. Change-Id: Ie59dfc6fe8ed76485a2a2bd7caf1315f1944c227 --- apps/gui/skin_engine/skin_parser.c | 8 ------- apps/gui/skin_engine/skin_render.c | 41 ++++++++++++++++++++++-------------- apps/gui/skin_engine/wps_internals.h | 5 ++--- 3 files changed, 27 insertions(+), 27 deletions(-) (limited to 'apps/gui') diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c index 1946e179c0..1de1047583 100644 --- a/apps/gui/skin_engine/skin_parser.c +++ b/apps/gui/skin_engine/skin_parser.c @@ -700,15 +700,9 @@ static int parse_viewportcolour(struct skin_element *element, if (element->line == curr_viewport_element->line) { if (token->type == SKIN_TOKEN_VIEWPORT_FGCOLOUR) - { - curr_vp->start_fgcolour = colour->colour; curr_vp->vp.fg_pattern = colour->colour; - } else - { - curr_vp->start_bgcolour = colour->colour; curr_vp->vp.bg_pattern = colour->colour; - } } return 0; } @@ -1953,8 +1947,6 @@ static int convert_viewport(struct wps_data *data, struct skin_element* element) #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) skin_vp->output_to_backdrop_buffer = false; - skin_vp->start_fgcolour = skin_vp->vp.fg_pattern; - skin_vp->start_bgcolour = skin_vp->vp.bg_pattern; #endif #ifdef HAVE_LCD_COLOR skin_vp->start_gradient.start = global_settings.lss_color; diff --git a/apps/gui/skin_engine/skin_render.c b/apps/gui/skin_engine/skin_render.c index 2bcd101ea0..700694e382 100644 --- a/apps/gui/skin_engine/skin_render.c +++ b/apps/gui/skin_engine/skin_render.c @@ -66,6 +66,7 @@ struct skin_draw_info { bool no_line_break; bool line_scrolls; bool force_redraw; + bool viewport_change; char *buf; size_t buf_size; @@ -94,15 +95,16 @@ get_child(OFFSETTYPE(struct skin_element**) children, int child) static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info, - struct skin_element *element, struct viewport* vp) + struct skin_element *element, struct skin_viewport* skin_vp) { #ifndef HAVE_LCD_BITMAP - (void)vp; /* silence warnings */ + (void)skin_vp; /* silence warnings */ (void)info; -#endif +#endif struct wps_token *token = (struct wps_token *)SKINOFFSETTOPTR(skin_buffer, element->data); #ifdef HAVE_LCD_BITMAP + struct viewport *vp = &skin_vp->vp; struct wps_data *data = gwps->data; bool do_refresh = (element->tag->flags & info->refresh_type) > 0; #endif @@ -114,6 +116,7 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info, struct viewport_colour *col = SKINOFFSETTOPTR(skin_buffer, token->value.data); struct viewport *vp = SKINOFFSETTOPTR(skin_buffer, col->vp); vp->fg_pattern = col->colour; + skin_vp->fgbg_changed = true; } break; case SKIN_TOKEN_VIEWPORT_BGCOLOUR: @@ -121,6 +124,7 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info, struct viewport_colour *col = SKINOFFSETTOPTR(skin_buffer, token->value.data); struct viewport *vp = SKINOFFSETTOPTR(skin_buffer, col->vp); vp->bg_pattern = col->colour; + skin_vp->fgbg_changed = true; } break; case SKIN_TOKEN_VIEWPORT_TEXTSTYLE: @@ -588,7 +592,7 @@ static bool skin_render_line(struct skin_element* line, struct skin_draw_info *i { break; } - if (!do_non_text_tags(info->gwps, info, child, &info->skin_vp->vp)) + if (!do_non_text_tags(info->gwps, info, child, info->skin_vp)) { static char tempbuf[128]; const char *valuestr = get_token_value(info->gwps, SKINOFFSETTOPTR(skin_buffer, child->data), @@ -736,7 +740,7 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps, }; struct align_pos * align = &info.align; - bool needs_update; + bool needs_update, update_all = false; skin_buffer = get_skin_buffer(gwps->data); #ifdef HAVE_LCD_BITMAP /* Set images to not to be displayed */ @@ -753,6 +757,8 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps, if (skin_viewport->parsed_fontid == 1) skin_viewport->vp.font = display->getuifont(); #endif + + while (line) { @@ -760,6 +766,8 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps, info.no_line_break = false; info.line_scrolls = false; info.force_redraw = false; +#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) + skin_viewport->fgbg_changed = false; #ifdef HAVE_LCD_COLOR if (info.line_desc.style&STYLE_GRADIENT) { @@ -767,6 +775,7 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps, info.line_desc.style = STYLE_DEFAULT; } #endif +#endif info.cur_align_start = info.buf; align->left = info.buf; align->center = NULL; @@ -777,21 +786,23 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps, func = skin_render_alternator; else if (line->type == LINE) func = skin_render_line; - + needs_update = func(line, &info); #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) - if (skin_viewport->vp.fg_pattern != skin_viewport->start_fgcolour || - skin_viewport->vp.bg_pattern != skin_viewport->start_bgcolour) + if (skin_viewport->fgbg_changed) { - /* 2bit lcd drivers need lcd_set_viewport() to be called to change - * the colour, 16bit doesnt. But doing this makes static text - * get the new colour also */ - needs_update = true; - display->set_viewport(&skin_viewport->vp); + /* if fg/bg changed due to a conditional tag the colors + * need to be set (2bit displays requires set_{fore,back}ground + * for this. the rest of the viewport needs to be redrawn + * to get the new colors */ + display->set_foreground(skin_viewport->vp.fg_pattern); + display->set_background(skin_viewport->vp.bg_pattern); + if (needs_update) + update_all = true; } #endif /* only update if the line needs to be, and there is something to write */ - if (refresh_type && needs_update) + if (refresh_type && (needs_update || update_all)) { if (info.force_redraw) display->scroll_stop_viewport_rect(&skin_viewport->vp, @@ -847,8 +858,6 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode) skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data); unsigned vp_refresh_mode = refresh_mode; #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1) - skin_viewport->vp.fg_pattern = skin_viewport->start_fgcolour; - skin_viewport->vp.bg_pattern = skin_viewport->start_bgcolour; if (skin_viewport->output_to_backdrop_buffer) { display->set_framebuffer(skin_backdrop_get_buffer(data->backdrop_id)); diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h index be99ad82ae..339669570a 100644 --- a/apps/gui/skin_engine/wps_internals.h +++ b/apps/gui/skin_engine/wps_internals.h @@ -186,10 +186,9 @@ struct skin_viewport { bool is_infovp; OFFSETTYPE(char*) label; int parsed_fontid; -#if LCD_DEPTH > 1 +#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) bool output_to_backdrop_buffer; - unsigned start_fgcolour; - unsigned start_bgcolour; + bool fgbg_changed; #ifdef HAVE_LCD_COLOR struct gradient_config start_gradient; #endif -- cgit v1.2.3