forked from len0rd/rockbox
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
This commit is contained in:
parent
9cd3444e27
commit
d4d3f3c494
3 changed files with 27 additions and 27 deletions
|
|
@ -700,15 +700,9 @@ static int parse_viewportcolour(struct skin_element *element,
|
||||||
if (element->line == curr_viewport_element->line)
|
if (element->line == curr_viewport_element->line)
|
||||||
{
|
{
|
||||||
if (token->type == SKIN_TOKEN_VIEWPORT_FGCOLOUR)
|
if (token->type == SKIN_TOKEN_VIEWPORT_FGCOLOUR)
|
||||||
{
|
|
||||||
curr_vp->start_fgcolour = colour->colour;
|
|
||||||
curr_vp->vp.fg_pattern = colour->colour;
|
curr_vp->vp.fg_pattern = colour->colour;
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
curr_vp->start_bgcolour = colour->colour;
|
|
||||||
curr_vp->vp.bg_pattern = colour->colour;
|
curr_vp->vp.bg_pattern = colour->colour;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0;
|
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))
|
#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
|
||||||
skin_vp->output_to_backdrop_buffer = false;
|
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
|
#endif
|
||||||
#ifdef HAVE_LCD_COLOR
|
#ifdef HAVE_LCD_COLOR
|
||||||
skin_vp->start_gradient.start = global_settings.lss_color;
|
skin_vp->start_gradient.start = global_settings.lss_color;
|
||||||
|
|
|
||||||
|
|
@ -66,6 +66,7 @@ struct skin_draw_info {
|
||||||
bool no_line_break;
|
bool no_line_break;
|
||||||
bool line_scrolls;
|
bool line_scrolls;
|
||||||
bool force_redraw;
|
bool force_redraw;
|
||||||
|
bool viewport_change;
|
||||||
|
|
||||||
char *buf;
|
char *buf;
|
||||||
size_t buf_size;
|
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,
|
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
|
#ifndef HAVE_LCD_BITMAP
|
||||||
(void)vp; /* silence warnings */
|
(void)skin_vp; /* silence warnings */
|
||||||
(void)info;
|
(void)info;
|
||||||
#endif
|
#endif
|
||||||
struct wps_token *token = (struct wps_token *)SKINOFFSETTOPTR(skin_buffer, element->data);
|
struct wps_token *token = (struct wps_token *)SKINOFFSETTOPTR(skin_buffer, element->data);
|
||||||
|
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
|
struct viewport *vp = &skin_vp->vp;
|
||||||
struct wps_data *data = gwps->data;
|
struct wps_data *data = gwps->data;
|
||||||
bool do_refresh = (element->tag->flags & info->refresh_type) > 0;
|
bool do_refresh = (element->tag->flags & info->refresh_type) > 0;
|
||||||
#endif
|
#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_colour *col = SKINOFFSETTOPTR(skin_buffer, token->value.data);
|
||||||
struct viewport *vp = SKINOFFSETTOPTR(skin_buffer, col->vp);
|
struct viewport *vp = SKINOFFSETTOPTR(skin_buffer, col->vp);
|
||||||
vp->fg_pattern = col->colour;
|
vp->fg_pattern = col->colour;
|
||||||
|
skin_vp->fgbg_changed = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SKIN_TOKEN_VIEWPORT_BGCOLOUR:
|
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_colour *col = SKINOFFSETTOPTR(skin_buffer, token->value.data);
|
||||||
struct viewport *vp = SKINOFFSETTOPTR(skin_buffer, col->vp);
|
struct viewport *vp = SKINOFFSETTOPTR(skin_buffer, col->vp);
|
||||||
vp->bg_pattern = col->colour;
|
vp->bg_pattern = col->colour;
|
||||||
|
skin_vp->fgbg_changed = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SKIN_TOKEN_VIEWPORT_TEXTSTYLE:
|
case SKIN_TOKEN_VIEWPORT_TEXTSTYLE:
|
||||||
|
|
@ -588,7 +592,7 @@ static bool skin_render_line(struct skin_element* line, struct skin_draw_info *i
|
||||||
{
|
{
|
||||||
break;
|
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];
|
static char tempbuf[128];
|
||||||
const char *valuestr = get_token_value(info->gwps, SKINOFFSETTOPTR(skin_buffer, child->data),
|
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;
|
struct align_pos * align = &info.align;
|
||||||
bool needs_update;
|
bool needs_update, update_all = false;
|
||||||
skin_buffer = get_skin_buffer(gwps->data);
|
skin_buffer = get_skin_buffer(gwps->data);
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
/* Set images to not to be displayed */
|
/* 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)
|
if (skin_viewport->parsed_fontid == 1)
|
||||||
skin_viewport->vp.font = display->getuifont();
|
skin_viewport->vp.font = display->getuifont();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
while (line)
|
while (line)
|
||||||
{
|
{
|
||||||
|
|
@ -760,6 +766,8 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps,
|
||||||
info.no_line_break = false;
|
info.no_line_break = false;
|
||||||
info.line_scrolls = false;
|
info.line_scrolls = false;
|
||||||
info.force_redraw = 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
|
#ifdef HAVE_LCD_COLOR
|
||||||
if (info.line_desc.style&STYLE_GRADIENT)
|
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;
|
info.line_desc.style = STYLE_DEFAULT;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
info.cur_align_start = info.buf;
|
info.cur_align_start = info.buf;
|
||||||
align->left = info.buf;
|
align->left = info.buf;
|
||||||
align->center = NULL;
|
align->center = NULL;
|
||||||
|
|
@ -777,21 +786,23 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps,
|
||||||
func = skin_render_alternator;
|
func = skin_render_alternator;
|
||||||
else if (line->type == LINE)
|
else if (line->type == LINE)
|
||||||
func = skin_render_line;
|
func = skin_render_line;
|
||||||
|
|
||||||
needs_update = func(line, &info);
|
needs_update = func(line, &info);
|
||||||
#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
|
#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
|
||||||
if (skin_viewport->vp.fg_pattern != skin_viewport->start_fgcolour ||
|
if (skin_viewport->fgbg_changed)
|
||||||
skin_viewport->vp.bg_pattern != skin_viewport->start_bgcolour)
|
|
||||||
{
|
{
|
||||||
/* 2bit lcd drivers need lcd_set_viewport() to be called to change
|
/* if fg/bg changed due to a conditional tag the colors
|
||||||
* the colour, 16bit doesnt. But doing this makes static text
|
* need to be set (2bit displays requires set_{fore,back}ground
|
||||||
* get the new colour also */
|
* for this. the rest of the viewport needs to be redrawn
|
||||||
needs_update = true;
|
* to get the new colors */
|
||||||
display->set_viewport(&skin_viewport->vp);
|
display->set_foreground(skin_viewport->vp.fg_pattern);
|
||||||
|
display->set_background(skin_viewport->vp.bg_pattern);
|
||||||
|
if (needs_update)
|
||||||
|
update_all = true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* only update if the line needs to be, and there is something to write */
|
/* 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)
|
if (info.force_redraw)
|
||||||
display->scroll_stop_viewport_rect(&skin_viewport->vp,
|
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);
|
skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data);
|
||||||
unsigned vp_refresh_mode = refresh_mode;
|
unsigned vp_refresh_mode = refresh_mode;
|
||||||
#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1)
|
#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)
|
if (skin_viewport->output_to_backdrop_buffer)
|
||||||
{
|
{
|
||||||
display->set_framebuffer(skin_backdrop_get_buffer(data->backdrop_id));
|
display->set_framebuffer(skin_backdrop_get_buffer(data->backdrop_id));
|
||||||
|
|
|
||||||
|
|
@ -186,10 +186,9 @@ struct skin_viewport {
|
||||||
bool is_infovp;
|
bool is_infovp;
|
||||||
OFFSETTYPE(char*) label;
|
OFFSETTYPE(char*) label;
|
||||||
int parsed_fontid;
|
int parsed_fontid;
|
||||||
#if LCD_DEPTH > 1
|
#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
|
||||||
bool output_to_backdrop_buffer;
|
bool output_to_backdrop_buffer;
|
||||||
unsigned start_fgcolour;
|
bool fgbg_changed;
|
||||||
unsigned start_bgcolour;
|
|
||||||
#ifdef HAVE_LCD_COLOR
|
#ifdef HAVE_LCD_COLOR
|
||||||
struct gradient_config start_gradient;
|
struct gradient_config start_gradient;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue