summaryrefslogtreecommitdiff
path: root/apps/gui/skin_engine
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2012-03-15 22:50:17 +1100
committerJonathan Gordon <rockbox@jdgordon.info>2012-03-15 22:52:53 +1100
commit014a08cabb856b2360419aac404744029ee4748c (patch)
tree1bd05c47281446eec2568a96a0e32e16439f1262 /apps/gui/skin_engine
parentdcc78cb86764e5f02bc89693f64dc38c82f776ad (diff)
downloadrockbox-014a08cabb856b2360419aac404744029ee4748c.tar.gz
rockbox-014a08cabb856b2360419aac404744029ee4748c.zip
skin_engine: New tag to draw a rectangle (optionally with a gradient)
%dr(x, y, width, height, [colour1[, colour2]]): x,y - viewport relative pixel coordinates to start the rectangle. width, height - obvious. can be '-' to fill the viewport if both colours are left out the viewports foreground colour will be used if one colour is specified it will fill the rectangle that colour. if both colours are specified it will gradient fill the rectangle. Change-Id: Iad451e99ded663bc7c5d182443659db7d909b388
Diffstat (limited to 'apps/gui/skin_engine')
-rw-r--r--apps/gui/skin_engine/skin_parser.c48
-rw-r--r--apps/gui/skin_engine/skin_render.c23
-rw-r--r--apps/gui/skin_engine/wps_internals.h9
3 files changed, 79 insertions, 1 deletions
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index 2d9d7cd807..49373eca32 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -638,6 +638,51 @@ static int parse_viewporttextstyle(struct skin_element *element,
638 return 0; 638 return 0;
639} 639}
640 640
641static int parse_drawrectangle( struct skin_element *element,
642 struct wps_token *token,
643 struct wps_data *wps_data)
644{
645 (void)wps_data;
646 struct draw_rectangle *rect =
647 (struct draw_rectangle *)skin_buffer_alloc(sizeof(struct draw_rectangle));
648
649 if (!rect)
650 return -1;
651
652 rect->x = get_param(element, 0)->data.number;
653 rect->y = get_param(element, 1)->data.number;
654
655 if (isdefault(get_param(element, 2)))
656 rect->width = curr_vp->vp.width - rect->x;
657 else
658 rect->width = get_param(element, 2)->data.number;
659
660 if (isdefault(get_param(element, 3)))
661 rect->height = curr_vp->vp.height - rect->y;
662 else
663 rect->height = get_param(element, 3)->data.number;
664
665 rect->start_colour = curr_vp->vp.fg_pattern;
666 rect->end_colour = curr_vp->vp.fg_pattern;
667
668 if (element->params_count > 4)
669 {
670 if (!parse_color(curr_screen, get_param_text(element, 4),
671 &rect->start_colour))
672 return -1;
673 rect->end_colour = rect->start_colour;
674 }
675 if (element->params_count > 5)
676 {
677 if (!parse_color(curr_screen, get_param_text(element, 5),
678 &rect->end_colour))
679 return -1;
680 }
681 token->value.data = PTRTOSKINOFFSET(skin_buffer, rect);
682
683 return 0;
684}
685
641static int parse_viewportcolour(struct skin_element *element, 686static int parse_viewportcolour(struct skin_element *element,
642 struct wps_token *token, 687 struct wps_token *token,
643 struct wps_data *wps_data) 688 struct wps_data *wps_data)
@@ -2013,6 +2058,9 @@ static int skin_element_callback(struct skin_element* element, void* data)
2013 sb_skin_has_title(curr_screen); 2058 sb_skin_has_title(curr_screen);
2014#endif 2059#endif
2015 break; 2060 break;
2061 case SKIN_TOKEN_DRAWRECTANGLE:
2062 function = parse_drawrectangle;
2063 break;
2016#endif 2064#endif
2017 case SKIN_TOKEN_FILE_DIRECTORY: 2065 case SKIN_TOKEN_FILE_DIRECTORY:
2018 token->value.i = get_param(element, 0)->data.number; 2066 token->value.i = get_param(element, 0)->data.number;
diff --git a/apps/gui/skin_engine/skin_render.c b/apps/gui/skin_engine/skin_render.c
index 80d8c83d27..7ceb0bce17 100644
--- a/apps/gui/skin_engine/skin_render.c
+++ b/apps/gui/skin_engine/skin_render.c
@@ -176,8 +176,29 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
176 if (do_refresh) 176 if (do_refresh)
177 draw_peakmeters(gwps, info->line_number, vp); 177 draw_peakmeters(gwps, info->line_number, vp);
178 break; 178 break;
179 case SKIN_TOKEN_DRAWRECTANGLE:
180 if (do_refresh)
181 {
182 struct draw_rectangle *rect =
183 SKINOFFSETTOPTR(skin_buffer, token->value.data);
184#ifdef HAVE_LCD_COLOR
185 if (rect->start_colour != rect->end_colour &&
186 gwps->display->screen_type == SCREEN_MAIN)
187 {
188 gwps->display->gradient_fillrect(rect->x, rect->y, rect->width,
189 rect->height, rect->start_colour, rect->end_colour);
190 }
191 else
179#endif 192#endif
180#ifdef HAVE_LCD_BITMAP 193 {
194 unsigned backup = vp->fg_pattern;
195 vp->fg_pattern = rect->start_colour;
196 gwps->display->fillrect(rect->x, rect->y, rect->width,
197 rect->height);
198 vp->fg_pattern = backup;
199 }
200 }
201 break;
181 case SKIN_TOKEN_PEAKMETER_LEFTBAR: 202 case SKIN_TOKEN_PEAKMETER_LEFTBAR:
182 case SKIN_TOKEN_PEAKMETER_RIGHTBAR: 203 case SKIN_TOKEN_PEAKMETER_RIGHTBAR:
183 data->peak_meter_enabled = true; 204 data->peak_meter_enabled = true;
diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h
index 3b1d7cf054..3788712c9d 100644
--- a/apps/gui/skin_engine/wps_internals.h
+++ b/apps/gui/skin_engine/wps_internals.h
@@ -113,6 +113,15 @@ struct progressbar {
113 bool horizontal; 113 bool horizontal;
114 OFFSETTYPE(struct gui_img *) backdrop; 114 OFFSETTYPE(struct gui_img *) backdrop;
115}; 115};
116
117struct draw_rectangle {
118 int x;
119 int y;
120 int width;
121 int height;
122 unsigned start_colour;
123 unsigned end_colour;
124};
116#endif 125#endif
117 126
118 127