summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2011-08-14 13:50:07 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2011-08-14 13:50:07 +0000
commit281f1a1ed6f6213139fbc230dc819bbcbe3ee40a (patch)
tree8407e89f6ce32200f2cdfc4efc08233957eff3cf /apps
parentb2d0ea204c36785b5ec658ae0aecb89787886d8b (diff)
downloadrockbox-281f1a1ed6f6213139fbc230dc819bbcbe3ee40a.tar.gz
rockbox-281f1a1ed6f6213139fbc230dc819bbcbe3ee40a.zip
New skin tags: %Vs() to set the text style and %Vg() to get the viewports gradient colours
%Vs(mode[, param]) : mode can be "invert", "color" (where param is the colour to use", "clear" to disable the current style, "gradient" where param is the number of lines the gradient should draw over. %Vg(start colour, end colour, [text colour]), if this tag isnt used the list selection colours from the settings will set the gradient colours git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30302 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/gui/skin_engine/skin_display.c29
-rw-r--r--apps/gui/skin_engine/skin_display.h6
-rw-r--r--apps/gui/skin_engine/skin_parser.c84
-rw-r--r--apps/gui/skin_engine/skin_render.c45
-rw-r--r--apps/gui/skin_engine/skin_tokens.h1
-rw-r--r--apps/gui/skin_engine/wps_internals.h13
6 files changed, 150 insertions, 28 deletions
diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c
index a967114125..02e9d39711 100644
--- a/apps/gui/skin_engine/skin_display.c
+++ b/apps/gui/skin_engine/skin_display.c
@@ -450,15 +450,12 @@ int evaluate_conditional(struct gui_wps *gwps, int offset,
450 line is the index of the line on the screen. 450 line is the index of the line on the screen.
451 scroll indicates whether the line is a scrolling one or not. 451 scroll indicates whether the line is a scrolling one or not.
452*/ 452*/
453void write_line(struct screen *display, 453void write_line(struct screen *display, struct align_pos *format_align,
454 struct align_pos *format_align, 454 int line, bool scroll, unsigned style)
455 int line,
456 bool scroll)
457{ 455{
458 int left_width = 0, left_xpos; 456 int left_width = 0, left_xpos;
459 int center_width = 0, center_xpos; 457 int center_width = 0, center_xpos;
460 int right_width = 0, right_xpos; 458 int right_width = 0, right_xpos;
461 int ypos;
462 int space_width; 459 int space_width;
463 int string_height; 460 int string_height;
464 int scroll_width; 461 int scroll_width;
@@ -565,22 +562,19 @@ void write_line(struct screen *display,
565 right_width = 0; 562 right_width = 0;
566 } 563 }
567 564
568 ypos = (line * string_height);
569
570
571 if (scroll && ((left_width > scroll_width) || 565 if (scroll && ((left_width > scroll_width) ||
572 (center_width > scroll_width) || 566 (center_width > scroll_width) ||
573 (right_width > scroll_width))) 567 (right_width > scroll_width)))
574 { 568 {
575 display->puts_scroll(0, line, 569 display->puts_scroll_style(0, line,
576 (unsigned char *)format_align->left); 570 (unsigned char *)format_align->left, style);
577 } 571 }
578 else 572 else
579 { 573 {
580#ifdef HAVE_LCD_BITMAP 574#ifdef HAVE_LCD_BITMAP
581 /* clear the line first */ 575 /* clear the line first */
582 display->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); 576 display->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
583 display->fillrect(left_xpos, ypos, display->getwidth(), string_height); 577 display->fillrect(left_xpos, line*string_height, display->getwidth(), string_height);
584 display->set_drawmode(DRMODE_SOLID); 578 display->set_drawmode(DRMODE_SOLID);
585#endif 579#endif
586 580
@@ -591,18 +585,19 @@ void write_line(struct screen *display,
591 /* print aligned strings */ 585 /* print aligned strings */
592 if (left_width != 0) 586 if (left_width != 0)
593 { 587 {
594 display->putsxy(left_xpos, ypos, 588 display->puts_style_xyoffset(left_xpos/space_width, line,
595 (unsigned char *)format_align->left); 589 (unsigned char *)format_align->left, style, 0, 0);
590
596 } 591 }
597 if (center_width != 0) 592 if (center_width != 0)
598 { 593 {
599 display->putsxy(center_xpos, ypos, 594 display->puts_style_xyoffset(center_xpos/space_width, line,
600 (unsigned char *)format_align->center); 595 (unsigned char *)format_align->center, style, 0, 0);
601 } 596 }
602 if (right_width != 0) 597 if (right_width != 0)
603 { 598 {
604 display->putsxy(right_xpos, ypos, 599 display->puts_style_xyoffset(right_xpos/space_width, line,
605 (unsigned char *)format_align->right); 600 (unsigned char *)format_align->right, style, 0, 0);
606 } 601 }
607 } 602 }
608} 603}
diff --git a/apps/gui/skin_engine/skin_display.h b/apps/gui/skin_engine/skin_display.h
index da4bb92aef..9faaea30cf 100644
--- a/apps/gui/skin_engine/skin_display.h
+++ b/apps/gui/skin_engine/skin_display.h
@@ -48,10 +48,8 @@ int evaluate_conditional(struct gui_wps *gwps, int offset,
48 line is the index of the line on the screen. 48 line is the index of the line on the screen.
49 scroll indicates whether the line is a scrolling one or not. 49 scroll indicates whether the line is a scrolling one or not.
50*/ 50*/
51void write_line(struct screen *display, 51void write_line(struct screen *display, struct align_pos *format_align,
52 struct align_pos *format_align, 52 int line, bool scroll, unsigned style);
53 int line,
54 bool scroll);
55void draw_peakmeters(struct gui_wps *gwps, int line_number, 53void draw_peakmeters(struct gui_wps *gwps, int line_number,
56 struct viewport *viewport); 54 struct viewport *viewport);
57#endif 55#endif
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index 53e1efedd8..b7bb045411 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -453,6 +453,77 @@ static int parse_playlistview(struct skin_element *element,
453 return 0; 453 return 0;
454} 454}
455#endif 455#endif
456#ifdef HAVE_LCD_COLOR
457static int parse_viewport_gradient_setup(struct skin_element *element,
458 struct wps_token *token,
459 struct wps_data *wps_data)
460{
461 (void)wps_data;
462 struct gradient_config *cfg;
463 if (element->params_count < 2) /* only start and end are required */
464 return 1;
465 cfg = (struct gradient_config *)skin_buffer_alloc(sizeof(struct gradient_config));
466 if (!cfg)
467 return 1;
468 if (!parse_color(curr_screen, element->params[0].data.text, &cfg->start) ||
469 !parse_color(curr_screen, element->params[1].data.text, &cfg->end))
470 return 1;
471 if (element->params_count > 2)
472 {
473 if (!parse_color(curr_screen, element->params[2].data.text, &cfg->text))
474 return 1;
475 }
476 else
477 {
478 cfg->text = curr_vp->vp.fg_pattern;
479 }
480
481 token->value.data = cfg;
482 return 0;
483}
484#endif
485static int parse_viewporttextstyle(struct skin_element *element,
486 struct wps_token *token,
487 struct wps_data *wps_data)
488{
489 (void)wps_data;
490 int style;
491 char *mode = element->params[0].data.text;
492 unsigned colour;
493
494 if (!strcmp(mode, "invert"))
495 {
496 style = STYLE_INVERT;
497 }
498 else if (!strcmp(mode, "colour") || !strcmp(mode, "color"))
499 {
500 if (element->params_count < 2 ||
501 !parse_color(curr_screen, element->params[1].data.text, &colour))
502 return 1;
503 style = STYLE_COLORED|(STYLE_COLOR_MASK&colour);
504 }
505#ifdef HAVE_LCD_COLOR
506 else if (!strcmp(mode, "gradient"))
507 {
508 int num_lines;
509 if (element->params_count < 2)
510 num_lines = 1;
511 else /* atoi() instead of using a number in the parser is because [si]
512 * will select the number for something which looks like a colour
513 * making the "colour" case (above) harder to parse */
514 num_lines = atoi(element->params[1].data.text);
515 style = STYLE_GRADIENT|NUMLN_PACK(num_lines)|CURLN_PACK(0);
516 }
517#endif
518 else if (!strcmp(mode, "clear"))
519 {
520 style = STYLE_DEFAULT;
521 }
522 else
523 return 1;
524 token->value.l = style;
525 return 0;
526}
456 527
457#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) 528#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
458 529
@@ -1514,6 +1585,11 @@ static int convert_viewport(struct wps_data *data, struct skin_element* element)
1514 skin_vp->start_fgcolour = skin_vp->vp.fg_pattern; 1585 skin_vp->start_fgcolour = skin_vp->vp.fg_pattern;
1515 skin_vp->start_bgcolour = skin_vp->vp.bg_pattern; 1586 skin_vp->start_bgcolour = skin_vp->vp.bg_pattern;
1516#endif 1587#endif
1588#ifdef HAVE_LCD_COLOR
1589 skin_vp->start_gradient.start = skin_vp->vp.lss_pattern;
1590 skin_vp->start_gradient.end = skin_vp->vp.lse_pattern;
1591 skin_vp->start_gradient.text = skin_vp->vp.lst_pattern;
1592#endif
1517 1593
1518 1594
1519 struct skin_tag_parameter *param = element->params; 1595 struct skin_tag_parameter *param = element->params;
@@ -1684,6 +1760,14 @@ static int skin_element_callback(struct skin_element* element, void* data)
1684 function = parse_image_special; 1760 function = parse_image_special;
1685 break; 1761 break;
1686#endif 1762#endif
1763 case SKIN_TOKEN_VIEWPORT_TEXTSTYLE:
1764 function = parse_viewporttextstyle;
1765 break;
1766#ifdef HAVE_LCD_COLOR
1767 case SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP:
1768 function = parse_viewport_gradient_setup;
1769 break;
1770#endif
1687 case SKIN_TOKEN_TRANSLATEDSTRING: 1771 case SKIN_TOKEN_TRANSLATEDSTRING:
1688 case SKIN_TOKEN_SETTING: 1772 case SKIN_TOKEN_SETTING:
1689 function = parse_setting_and_lang; 1773 function = parse_setting_and_lang;
diff --git a/apps/gui/skin_engine/skin_render.c b/apps/gui/skin_engine/skin_render.c
index 13eb69c744..27e6747c29 100644
--- a/apps/gui/skin_engine/skin_render.c
+++ b/apps/gui/skin_engine/skin_render.c
@@ -55,6 +55,7 @@ struct skin_draw_info {
55 struct skin_viewport *skin_vp; 55 struct skin_viewport *skin_vp;
56 int line_number; 56 int line_number;
57 unsigned long refresh_type; 57 unsigned long refresh_type;
58 unsigned text_style;
58 59
59 char* cur_align_start; 60 char* cur_align_start;
60 struct align_pos align; 61 struct align_pos align;
@@ -106,6 +107,19 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
106 col->vp->bg_pattern = col->colour; 107 col->vp->bg_pattern = col->colour;
107 } 108 }
108 break; 109 break;
110 case SKIN_TOKEN_VIEWPORT_TEXTSTYLE:
111 info->text_style = token->value.l;
112 break;
113#endif
114#ifdef HAVE_LCD_COLOR
115 case SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP:
116 {
117 struct gradient_config *cfg = token->value.data;
118 vp->lss_pattern = cfg->start;
119 vp->lse_pattern = cfg->end;
120 vp->lst_pattern = cfg->text;
121 }
122 break;
109#endif 123#endif
110 case SKIN_TOKEN_VIEWPORT_ENABLE: 124 case SKIN_TOKEN_VIEWPORT_ENABLE:
111 { 125 {
@@ -614,7 +628,8 @@ static void skin_render_viewport(struct skin_element* viewport, struct gui_wps *
614 .line_scrolls = false, 628 .line_scrolls = false,
615 .refresh_type = refresh_type, 629 .refresh_type = refresh_type,
616 .skin_vp = skin_viewport, 630 .skin_vp = skin_viewport,
617 .offset = 0 631 .offset = 0,
632 .text_style = STYLE_DEFAULT
618 }; 633 };
619 634
620 struct align_pos * align = &info.align; 635 struct align_pos * align = &info.align;
@@ -636,7 +651,17 @@ static void skin_render_viewport(struct skin_element* viewport, struct gui_wps *
636 info.no_line_break = false; 651 info.no_line_break = false;
637 info.line_scrolls = false; 652 info.line_scrolls = false;
638 info.force_redraw = false; 653 info.force_redraw = false;
639 654#ifdef HAVE_LCD_COLOR
655 if (info.text_style&STYLE_GRADIENT)
656 {
657 int cur = CURLN_UNPACK(info.text_style);
658 int num = NUMLN_UNPACK(info.text_style);
659 if (cur+1 == num)
660 info.text_style = STYLE_DEFAULT;
661 else
662 info.text_style = STYLE_GRADIENT|CURLN_PACK(cur+1)|NUMLN_PACK(num);
663 }
664#endif
640 info.cur_align_start = info.buf; 665 info.cur_align_start = info.buf;
641 align->left = info.buf; 666 align->left = info.buf;
642 align->center = NULL; 667 align->center = NULL;
@@ -668,10 +693,10 @@ static void skin_render_viewport(struct skin_element* viewport, struct gui_wps *
668 /* if the line is a scrolling one we don't want to update 693 /* if the line is a scrolling one we don't want to update
669 too often, so that it has the time to scroll */ 694 too often, so that it has the time to scroll */
670 if ((refresh_type & SKIN_REFRESH_SCROLL) || info.force_redraw) 695 if ((refresh_type & SKIN_REFRESH_SCROLL) || info.force_redraw)
671 write_line(display, align, info.line_number, true); 696 write_line(display, align, info.line_number, true, info.text_style);
672 } 697 }
673 else 698 else
674 write_line(display, align, info.line_number, false); 699 write_line(display, align, info.line_number, false, info.text_style);
675 } 700 }
676 if (!info.no_line_break) 701 if (!info.no_line_break)
677 info.line_number++; 702 info.line_number++;
@@ -717,6 +742,11 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode)
717 skin_viewport->vp.fg_pattern = skin_viewport->start_fgcolour; 742 skin_viewport->vp.fg_pattern = skin_viewport->start_fgcolour;
718 skin_viewport->vp.bg_pattern = skin_viewport->start_bgcolour; 743 skin_viewport->vp.bg_pattern = skin_viewport->start_bgcolour;
719#endif 744#endif
745#ifdef HAVE_LCD_COLOR
746 skin_viewport->vp.lss_pattern = skin_viewport->start_gradient.start;
747 skin_viewport->vp.lse_pattern = skin_viewport->start_gradient.end;
748 skin_viewport->vp.lst_pattern = skin_viewport->start_gradient.text;
749#endif
720 750
721 /* dont redraw the viewport if its disabled */ 751 /* dont redraw the viewport if its disabled */
722 if (skin_viewport->hidden_flags&VP_NEVER_VISIBLE) 752 if (skin_viewport->hidden_flags&VP_NEVER_VISIBLE)
@@ -772,7 +802,8 @@ static __attribute__((noinline)) void skin_render_playlistviewer(struct playlist
772 .line_scrolls = false, 802 .line_scrolls = false,
773 .refresh_type = refresh_type, 803 .refresh_type = refresh_type,
774 .skin_vp = skin_viewport, 804 .skin_vp = skin_viewport,
775 .offset = viewer->start_offset 805 .offset = viewer->start_offset,
806 .text_style = STYLE_DEFAULT
776 }; 807 };
777 808
778 struct align_pos * align = &info.align; 809 struct align_pos * align = &info.align;
@@ -829,10 +860,10 @@ static __attribute__((noinline)) void skin_render_playlistviewer(struct playlist
829 /* if the line is a scrolling one we don't want to update 860 /* if the line is a scrolling one we don't want to update
830 too often, so that it has the time to scroll */ 861 too often, so that it has the time to scroll */
831 if ((refresh_type & SKIN_REFRESH_SCROLL) || info.force_redraw) 862 if ((refresh_type & SKIN_REFRESH_SCROLL) || info.force_redraw)
832 write_line(display, align, info.line_number, true); 863 write_line(display, align, info.line_number, true, info.text_style);
833 } 864 }
834 else 865 else
835 write_line(display, align, info.line_number, false); 866 write_line(display, align, info.line_number, false, info.text_style);
836 } 867 }
837 info.line_number++; 868 info.line_number++;
838 info.offset++; 869 info.offset++;
diff --git a/apps/gui/skin_engine/skin_tokens.h b/apps/gui/skin_engine/skin_tokens.h
index d259fe431c..9df2137ece 100644
--- a/apps/gui/skin_engine/skin_tokens.h
+++ b/apps/gui/skin_engine/skin_tokens.h
@@ -35,6 +35,7 @@ struct wps_token {
35 union { 35 union {
36 char c; 36 char c;
37 unsigned short i; 37 unsigned short i;
38 long l;
38 void* data; 39 void* data;
39 } value; 40 } value;
40}; 41};
diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h
index 6de98455a7..01f67d4a0b 100644
--- a/apps/gui/skin_engine/wps_internals.h
+++ b/apps/gui/skin_engine/wps_internals.h
@@ -161,6 +161,14 @@ enum wps_parse_error {
161 PARSE_FAIL_COND_INVALID_PARAM, 161 PARSE_FAIL_COND_INVALID_PARAM,
162 PARSE_FAIL_LIMITS_EXCEEDED, 162 PARSE_FAIL_LIMITS_EXCEEDED,
163}; 163};
164#ifdef HAVE_LCD_COLOR
165struct gradient_config {
166 unsigned start;
167 unsigned end;
168 unsigned text;
169 int lines_count;
170};
171#endif
164 172
165#define VP_DRAW_HIDEABLE 0x1 173#define VP_DRAW_HIDEABLE 0x1
166#define VP_DRAW_HIDDEN 0x2 174#define VP_DRAW_HIDDEN 0x2
@@ -173,8 +181,13 @@ struct skin_viewport {
173 char hidden_flags; 181 char hidden_flags;
174 bool is_infovp; 182 bool is_infovp;
175 char* label; 183 char* label;
184#if LCD_DEPTH > 1
176 unsigned start_fgcolour; 185 unsigned start_fgcolour;
177 unsigned start_bgcolour; 186 unsigned start_bgcolour;
187#ifdef HAVE_LCD_COLOR
188 struct gradient_config start_gradient;
189#endif
190#endif
178}; 191};
179struct viewport_colour { 192struct viewport_colour {
180 struct viewport *vp; 193 struct viewport *vp;