diff options
author | Thomas Martitz <kugel@rockbox.org> | 2013-12-20 23:34:28 +0100 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2014-01-07 14:13:40 +0100 |
commit | 91ef65306bf4e459f430d6dc44e5923d6b9f8399 (patch) | |
tree | fefdfa516c8b061371f7a79ed22647aaec1a1922 /apps/gui/skin_engine/skin_render.c | |
parent | eec89a90ffdd077d687914fe18a9e48028f07fb4 (diff) | |
download | rockbox-91ef65306bf4e459f430d6dc44e5923d6b9f8399.tar.gz rockbox-91ef65306bf4e459f430d6dc44e5923d6b9f8399.zip |
skin_engine: Adapt put_line().
This allows for code unification and removal of a workaround (STYLE_XY_PIXELS).
Change-Id: Ie92d377414cad943cdb06976af10b4f315f32710
Diffstat (limited to 'apps/gui/skin_engine/skin_render.c')
-rw-r--r-- | apps/gui/skin_engine/skin_render.c | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/apps/gui/skin_engine/skin_render.c b/apps/gui/skin_engine/skin_render.c index d95b769fa3..f40c3b90e0 100644 --- a/apps/gui/skin_engine/skin_render.c +++ b/apps/gui/skin_engine/skin_render.c | |||
@@ -59,7 +59,7 @@ struct skin_draw_info { | |||
59 | struct skin_viewport *skin_vp; | 59 | struct skin_viewport *skin_vp; |
60 | int line_number; | 60 | int line_number; |
61 | unsigned long refresh_type; | 61 | unsigned long refresh_type; |
62 | unsigned text_style; | 62 | struct line_desc line_desc; |
63 | 63 | ||
64 | char* cur_align_start; | 64 | char* cur_align_start; |
65 | struct align_pos align; | 65 | struct align_pos align; |
@@ -105,6 +105,7 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info, | |||
105 | #ifdef HAVE_LCD_BITMAP | 105 | #ifdef HAVE_LCD_BITMAP |
106 | struct wps_data *data = gwps->data; | 106 | struct wps_data *data = gwps->data; |
107 | bool do_refresh = (element->tag->flags & info->refresh_type) > 0; | 107 | bool do_refresh = (element->tag->flags & info->refresh_type) > 0; |
108 | struct line_desc *linedes = &info->line_desc; | ||
108 | #endif | 109 | #endif |
109 | switch (token->type) | 110 | switch (token->type) |
110 | { | 111 | { |
@@ -124,16 +125,33 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info, | |||
124 | } | 125 | } |
125 | break; | 126 | break; |
126 | case SKIN_TOKEN_VIEWPORT_TEXTSTYLE: | 127 | case SKIN_TOKEN_VIEWPORT_TEXTSTYLE: |
127 | info->text_style = token->value.l; | 128 | { |
128 | break; | 129 | struct line_desc *data = SKINOFFSETTOPTR(skin_buffer, token->value.data); |
130 | /* gradient colors are handled with a separate tag | ||
131 | * (SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP, see below). since it may | ||
132 | * come before the text style tag color fields need to be preserved */ | ||
133 | if (data->style & STYLE_GRADIENT) | ||
134 | { | ||
135 | fb_data tc = linedes->text_color, | ||
136 | lc = linedes->line_color, | ||
137 | lec = linedes->line_end_color; | ||
138 | *linedes = *data; | ||
139 | linedes->text_color = tc; | ||
140 | linedes->line_color = lc; | ||
141 | linedes->line_end_color = lec; | ||
142 | } | ||
143 | else | ||
144 | *linedes = *data; | ||
145 | } | ||
146 | break; | ||
129 | #endif | 147 | #endif |
130 | #ifdef HAVE_LCD_COLOR | 148 | #ifdef HAVE_LCD_COLOR |
131 | case SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP: | 149 | case SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP: |
132 | { | 150 | { |
133 | struct gradient_config *cfg = SKINOFFSETTOPTR(skin_buffer, token->value.data); | 151 | struct gradient_config *cfg = SKINOFFSETTOPTR(skin_buffer, token->value.data); |
134 | vp->lss_pattern = cfg->start; | 152 | linedes->text_color = cfg->text; |
135 | vp->lse_pattern = cfg->end; | 153 | linedes->line_color = cfg->start; |
136 | vp->lst_pattern = cfg->text; | 154 | linedes->line_end_color = cfg->end; |
137 | } | 155 | } |
138 | break; | 156 | break; |
139 | #endif | 157 | #endif |
@@ -713,7 +731,7 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps, | |||
713 | .refresh_type = refresh_type, | 731 | .refresh_type = refresh_type, |
714 | .skin_vp = skin_viewport, | 732 | .skin_vp = skin_viewport, |
715 | .offset = 0, | 733 | .offset = 0, |
716 | .text_style = STYLE_DEFAULT | 734 | .line_desc = LINE_DESC_DEFINIT, |
717 | }; | 735 | }; |
718 | 736 | ||
719 | struct align_pos * align = &info.align; | 737 | struct align_pos * align = &info.align; |
@@ -742,14 +760,10 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps, | |||
742 | info.line_scrolls = false; | 760 | info.line_scrolls = false; |
743 | info.force_redraw = false; | 761 | info.force_redraw = false; |
744 | #ifdef HAVE_LCD_COLOR | 762 | #ifdef HAVE_LCD_COLOR |
745 | if (info.text_style&STYLE_GRADIENT) | 763 | if (info.line_desc.style&STYLE_GRADIENT) |
746 | { | 764 | { |
747 | int cur = CURLN_UNPACK(info.text_style); | 765 | if (++info.line_desc.line > info.line_desc.nlines) |
748 | int num = NUMLN_UNPACK(info.text_style); | 766 | info.line_desc.style = STYLE_DEFAULT; |
749 | if (cur+1 == num) | ||
750 | info.text_style = STYLE_DEFAULT; | ||
751 | else | ||
752 | info.text_style = STYLE_GRADIENT|CURLN_PACK(cur+1)|NUMLN_PACK(num); | ||
753 | } | 767 | } |
754 | #endif | 768 | #endif |
755 | info.cur_align_start = info.buf; | 769 | info.cur_align_start = info.buf; |
@@ -783,7 +797,7 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps, | |||
783 | 0, info.line_number*display->getcharheight(), | 797 | 0, info.line_number*display->getcharheight(), |
784 | skin_viewport->vp.width, display->getcharheight()); | 798 | skin_viewport->vp.width, display->getcharheight()); |
785 | write_line(display, align, info.line_number, | 799 | write_line(display, align, info.line_number, |
786 | info.line_scrolls, info.text_style); | 800 | info.line_scrolls, &info.line_desc); |
787 | } | 801 | } |
788 | if (!info.no_line_break) | 802 | if (!info.no_line_break) |
789 | info.line_number++; | 803 | info.line_number++; |
@@ -917,7 +931,7 @@ void skin_render_playlistviewer(struct playlistviewer* viewer, | |||
917 | .refresh_type = refresh_type, | 931 | .refresh_type = refresh_type, |
918 | .skin_vp = skin_viewport, | 932 | .skin_vp = skin_viewport, |
919 | .offset = viewer->start_offset, | 933 | .offset = viewer->start_offset, |
920 | .text_style = STYLE_DEFAULT | 934 | .line_desc = LINE_DESC_DEFINIT, |
921 | }; | 935 | }; |
922 | 936 | ||
923 | struct align_pos * align = &info.align; | 937 | struct align_pos * align = &info.align; |
@@ -975,7 +989,7 @@ void skin_render_playlistviewer(struct playlistviewer* viewer, | |||
975 | 0, info.line_number*display->getcharheight(), | 989 | 0, info.line_number*display->getcharheight(), |
976 | vp->width, display->getcharheight()); | 990 | vp->width, display->getcharheight()); |
977 | write_line(display, align, info.line_number, | 991 | write_line(display, align, info.line_number, |
978 | info.line_scrolls, info.text_style); | 992 | info.line_scrolls, &info.line_desc); |
979 | } | 993 | } |
980 | info.line_number++; | 994 | info.line_number++; |
981 | info.offset++; | 995 | info.offset++; |