diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/gui/skin_engine/skin_display.c | 29 | ||||
-rw-r--r-- | apps/gui/skin_engine/skin_display.h | 6 | ||||
-rw-r--r-- | apps/gui/skin_engine/skin_parser.c | 84 | ||||
-rw-r--r-- | apps/gui/skin_engine/skin_render.c | 45 | ||||
-rw-r--r-- | apps/gui/skin_engine/skin_tokens.h | 1 | ||||
-rw-r--r-- | apps/gui/skin_engine/wps_internals.h | 13 |
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 | */ |
453 | void write_line(struct screen *display, | 453 | void 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 | */ |
51 | void write_line(struct screen *display, | 51 | void 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); | ||
55 | void draw_peakmeters(struct gui_wps *gwps, int line_number, | 53 | void 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 | ||
457 | static 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 | ||
485 | static 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 | ||
165 | struct 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 | }; |
179 | struct viewport_colour { | 192 | struct viewport_colour { |
180 | struct viewport *vp; | 193 | struct viewport *vp; |