summaryrefslogtreecommitdiff
path: root/apps/gui/skin_engine/skin_render.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/skin_engine/skin_render.c')
-rw-r--r--apps/gui/skin_engine/skin_render.c41
1 files changed, 25 insertions, 16 deletions
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
96static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info, 97static 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));