diff options
-rw-r--r-- | apps/gui/skin_engine/skin_parser.c | 8 | ||||
-rw-r--r-- | apps/gui/skin_engine/skin_render.c | 41 | ||||
-rw-r--r-- | apps/gui/skin_engine/wps_internals.h | 5 |
3 files changed, 27 insertions, 27 deletions
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, | |||
700 | if (element->line == curr_viewport_element->line) | 700 | if (element->line == curr_viewport_element->line) |
701 | { | 701 | { |
702 | if (token->type == SKIN_TOKEN_VIEWPORT_FGCOLOUR) | 702 | if (token->type == SKIN_TOKEN_VIEWPORT_FGCOLOUR) |
703 | { | ||
704 | curr_vp->start_fgcolour = colour->colour; | ||
705 | curr_vp->vp.fg_pattern = colour->colour; | 703 | curr_vp->vp.fg_pattern = colour->colour; |
706 | } | ||
707 | else | 704 | else |
708 | { | ||
709 | curr_vp->start_bgcolour = colour->colour; | ||
710 | curr_vp->vp.bg_pattern = colour->colour; | 705 | curr_vp->vp.bg_pattern = colour->colour; |
711 | } | ||
712 | } | 706 | } |
713 | return 0; | 707 | return 0; |
714 | } | 708 | } |
@@ -1953,8 +1947,6 @@ static int convert_viewport(struct wps_data *data, struct skin_element* element) | |||
1953 | 1947 | ||
1954 | #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) | 1948 | #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) |
1955 | skin_vp->output_to_backdrop_buffer = false; | 1949 | skin_vp->output_to_backdrop_buffer = false; |
1956 | skin_vp->start_fgcolour = skin_vp->vp.fg_pattern; | ||
1957 | skin_vp->start_bgcolour = skin_vp->vp.bg_pattern; | ||
1958 | #endif | 1950 | #endif |
1959 | #ifdef HAVE_LCD_COLOR | 1951 | #ifdef HAVE_LCD_COLOR |
1960 | skin_vp->start_gradient.start = global_settings.lss_color; | 1952 | 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 { | |||
66 | bool no_line_break; | 66 | bool no_line_break; |
67 | bool line_scrolls; | 67 | bool line_scrolls; |
68 | bool force_redraw; | 68 | bool force_redraw; |
69 | bool viewport_change; | ||
69 | 70 | ||
70 | char *buf; | 71 | char *buf; |
71 | size_t buf_size; | 72 | size_t buf_size; |
@@ -94,15 +95,16 @@ get_child(OFFSETTYPE(struct skin_element**) children, int child) | |||
94 | 95 | ||
95 | 96 | ||
96 | static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info, | 97 | static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info, |
97 | struct skin_element *element, struct viewport* vp) | 98 | struct skin_element *element, struct skin_viewport* skin_vp) |
98 | { | 99 | { |
99 | #ifndef HAVE_LCD_BITMAP | 100 | #ifndef HAVE_LCD_BITMAP |
100 | (void)vp; /* silence warnings */ | 101 | (void)skin_vp; /* silence warnings */ |
101 | (void)info; | 102 | (void)info; |
102 | #endif | 103 | #endif |
103 | struct wps_token *token = (struct wps_token *)SKINOFFSETTOPTR(skin_buffer, element->data); | 104 | struct wps_token *token = (struct wps_token *)SKINOFFSETTOPTR(skin_buffer, element->data); |
104 | 105 | ||
105 | #ifdef HAVE_LCD_BITMAP | 106 | #ifdef HAVE_LCD_BITMAP |
107 | struct viewport *vp = &skin_vp->vp; | ||
106 | struct wps_data *data = gwps->data; | 108 | struct wps_data *data = gwps->data; |
107 | bool do_refresh = (element->tag->flags & info->refresh_type) > 0; | 109 | bool do_refresh = (element->tag->flags & info->refresh_type) > 0; |
108 | #endif | 110 | #endif |
@@ -114,6 +116,7 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info, | |||
114 | struct viewport_colour *col = SKINOFFSETTOPTR(skin_buffer, token->value.data); | 116 | struct viewport_colour *col = SKINOFFSETTOPTR(skin_buffer, token->value.data); |
115 | struct viewport *vp = SKINOFFSETTOPTR(skin_buffer, col->vp); | 117 | struct viewport *vp = SKINOFFSETTOPTR(skin_buffer, col->vp); |
116 | vp->fg_pattern = col->colour; | 118 | vp->fg_pattern = col->colour; |
119 | skin_vp->fgbg_changed = true; | ||
117 | } | 120 | } |
118 | break; | 121 | break; |
119 | case SKIN_TOKEN_VIEWPORT_BGCOLOUR: | 122 | case SKIN_TOKEN_VIEWPORT_BGCOLOUR: |
@@ -121,6 +124,7 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info, | |||
121 | struct viewport_colour *col = SKINOFFSETTOPTR(skin_buffer, token->value.data); | 124 | struct viewport_colour *col = SKINOFFSETTOPTR(skin_buffer, token->value.data); |
122 | struct viewport *vp = SKINOFFSETTOPTR(skin_buffer, col->vp); | 125 | struct viewport *vp = SKINOFFSETTOPTR(skin_buffer, col->vp); |
123 | vp->bg_pattern = col->colour; | 126 | vp->bg_pattern = col->colour; |
127 | skin_vp->fgbg_changed = true; | ||
124 | } | 128 | } |
125 | break; | 129 | break; |
126 | case SKIN_TOKEN_VIEWPORT_TEXTSTYLE: | 130 | case SKIN_TOKEN_VIEWPORT_TEXTSTYLE: |
@@ -588,7 +592,7 @@ static bool skin_render_line(struct skin_element* line, struct skin_draw_info *i | |||
588 | { | 592 | { |
589 | break; | 593 | break; |
590 | } | 594 | } |
591 | if (!do_non_text_tags(info->gwps, info, child, &info->skin_vp->vp)) | 595 | if (!do_non_text_tags(info->gwps, info, child, info->skin_vp)) |
592 | { | 596 | { |
593 | static char tempbuf[128]; | 597 | static char tempbuf[128]; |
594 | const char *valuestr = get_token_value(info->gwps, SKINOFFSETTOPTR(skin_buffer, child->data), | 598 | 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, | |||
736 | }; | 740 | }; |
737 | 741 | ||
738 | struct align_pos * align = &info.align; | 742 | struct align_pos * align = &info.align; |
739 | bool needs_update; | 743 | bool needs_update, update_all = false; |
740 | skin_buffer = get_skin_buffer(gwps->data); | 744 | skin_buffer = get_skin_buffer(gwps->data); |
741 | #ifdef HAVE_LCD_BITMAP | 745 | #ifdef HAVE_LCD_BITMAP |
742 | /* Set images to not to be displayed */ | 746 | /* Set images to not to be displayed */ |
@@ -753,6 +757,8 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps, | |||
753 | if (skin_viewport->parsed_fontid == 1) | 757 | if (skin_viewport->parsed_fontid == 1) |
754 | skin_viewport->vp.font = display->getuifont(); | 758 | skin_viewport->vp.font = display->getuifont(); |
755 | #endif | 759 | #endif |
760 | |||
761 | |||
756 | 762 | ||
757 | while (line) | 763 | while (line) |
758 | { | 764 | { |
@@ -760,6 +766,8 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps, | |||
760 | info.no_line_break = false; | 766 | info.no_line_break = false; |
761 | info.line_scrolls = false; | 767 | info.line_scrolls = false; |
762 | info.force_redraw = false; | 768 | info.force_redraw = false; |
769 | #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) | ||
770 | skin_viewport->fgbg_changed = false; | ||
763 | #ifdef HAVE_LCD_COLOR | 771 | #ifdef HAVE_LCD_COLOR |
764 | if (info.line_desc.style&STYLE_GRADIENT) | 772 | if (info.line_desc.style&STYLE_GRADIENT) |
765 | { | 773 | { |
@@ -767,6 +775,7 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps, | |||
767 | info.line_desc.style = STYLE_DEFAULT; | 775 | info.line_desc.style = STYLE_DEFAULT; |
768 | } | 776 | } |
769 | #endif | 777 | #endif |
778 | #endif | ||
770 | info.cur_align_start = info.buf; | 779 | info.cur_align_start = info.buf; |
771 | align->left = info.buf; | 780 | align->left = info.buf; |
772 | align->center = NULL; | 781 | align->center = NULL; |
@@ -777,21 +786,23 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps, | |||
777 | func = skin_render_alternator; | 786 | func = skin_render_alternator; |
778 | else if (line->type == LINE) | 787 | else if (line->type == LINE) |
779 | func = skin_render_line; | 788 | func = skin_render_line; |
780 | 789 | ||
781 | needs_update = func(line, &info); | 790 | needs_update = func(line, &info); |
782 | #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) | 791 | #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) |
783 | if (skin_viewport->vp.fg_pattern != skin_viewport->start_fgcolour || | 792 | if (skin_viewport->fgbg_changed) |
784 | skin_viewport->vp.bg_pattern != skin_viewport->start_bgcolour) | ||
785 | { | 793 | { |
786 | /* 2bit lcd drivers need lcd_set_viewport() to be called to change | 794 | /* if fg/bg changed due to a conditional tag the colors |
787 | * the colour, 16bit doesnt. But doing this makes static text | 795 | * need to be set (2bit displays requires set_{fore,back}ground |
788 | * get the new colour also */ | 796 | * for this. the rest of the viewport needs to be redrawn |
789 | needs_update = true; | 797 | * to get the new colors */ |
790 | display->set_viewport(&skin_viewport->vp); | 798 | display->set_foreground(skin_viewport->vp.fg_pattern); |
799 | display->set_background(skin_viewport->vp.bg_pattern); | ||
800 | if (needs_update) | ||
801 | update_all = true; | ||
791 | } | 802 | } |
792 | #endif | 803 | #endif |
793 | /* only update if the line needs to be, and there is something to write */ | 804 | /* only update if the line needs to be, and there is something to write */ |
794 | if (refresh_type && needs_update) | 805 | if (refresh_type && (needs_update || update_all)) |
795 | { | 806 | { |
796 | if (info.force_redraw) | 807 | if (info.force_redraw) |
797 | display->scroll_stop_viewport_rect(&skin_viewport->vp, | 808 | display->scroll_stop_viewport_rect(&skin_viewport->vp, |
@@ -847,8 +858,6 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode) | |||
847 | skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data); | 858 | skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data); |
848 | unsigned vp_refresh_mode = refresh_mode; | 859 | unsigned vp_refresh_mode = refresh_mode; |
849 | #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1) | 860 | #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1) |
850 | skin_viewport->vp.fg_pattern = skin_viewport->start_fgcolour; | ||
851 | skin_viewport->vp.bg_pattern = skin_viewport->start_bgcolour; | ||
852 | if (skin_viewport->output_to_backdrop_buffer) | 861 | if (skin_viewport->output_to_backdrop_buffer) |
853 | { | 862 | { |
854 | display->set_framebuffer(skin_backdrop_get_buffer(data->backdrop_id)); | 863 | 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 { | |||
186 | bool is_infovp; | 186 | bool is_infovp; |
187 | OFFSETTYPE(char*) label; | 187 | OFFSETTYPE(char*) label; |
188 | int parsed_fontid; | 188 | int parsed_fontid; |
189 | #if LCD_DEPTH > 1 | 189 | #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) |
190 | bool output_to_backdrop_buffer; | 190 | bool output_to_backdrop_buffer; |
191 | unsigned start_fgcolour; | 191 | bool fgbg_changed; |
192 | unsigned start_bgcolour; | ||
193 | #ifdef HAVE_LCD_COLOR | 192 | #ifdef HAVE_LCD_COLOR |
194 | struct gradient_config start_gradient; | 193 | struct gradient_config start_gradient; |
195 | #endif | 194 | #endif |