summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
authorNicolas Pennequin <nicolas.pennequin@free.fr>2007-09-27 15:42:55 +0000
committerNicolas Pennequin <nicolas.pennequin@free.fr>2007-09-27 15:42:55 +0000
commitf3b015f73b29f2d3514c32a9b8b8f0338b52e358 (patch)
tree65e1694745947a9a7d673811d12155f3b2a03019 /firmware/drivers
parent5353473b723749a7cd92d72e94423b74058287dc (diff)
downloadrockbox-f3b015f73b29f2d3514c32a9b8b8f0338b52e358.tar.gz
rockbox-f3b015f73b29f2d3514c32a9b8b8f0338b52e358.zip
FS#7808 by Tom Ross, Ken Fazzone and me, with help from Antoine Cellerier.
Add two new line selector types: solid colour and gradient. Solid colour only uses the primary colour setting. The secondary colour setting is used for the gradient. Text colour for the selected item is also changeable. These new settings are a bit controversial so they may be removed later. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14868 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers')
-rw-r--r--firmware/drivers/lcd-16bit.c98
1 files changed, 93 insertions, 5 deletions
diff --git a/firmware/drivers/lcd-16bit.c b/firmware/drivers/lcd-16bit.c
index 96a9e1a4d7..44d468521d 100644
--- a/firmware/drivers/lcd-16bit.c
+++ b/firmware/drivers/lcd-16bit.c
@@ -51,9 +51,15 @@ static long lcd_backdrop_offset IDATA_ATTR = 0;
51#if !defined(TOSHIBA_GIGABEAT_F) || defined(SIMULATOR) 51#if !defined(TOSHIBA_GIGABEAT_F) || defined(SIMULATOR)
52static unsigned fg_pattern IDATA_ATTR = LCD_DEFAULT_FG; 52static unsigned fg_pattern IDATA_ATTR = LCD_DEFAULT_FG;
53static unsigned bg_pattern IDATA_ATTR = LCD_DEFAULT_BG; 53static unsigned bg_pattern IDATA_ATTR = LCD_DEFAULT_BG;
54static unsigned lss_pattern IDATA_ATTR = LCD_DEFAULT_LS;
55static unsigned lse_pattern IDATA_ATTR = LCD_DEFAULT_BG;
56static unsigned lst_pattern IDATA_ATTR = LCD_DEFAULT_FG;
54#else 57#else
55unsigned fg_pattern IDATA_ATTR = LCD_DEFAULT_FG; 58unsigned fg_pattern IDATA_ATTR = LCD_DEFAULT_FG;
56unsigned bg_pattern IDATA_ATTR = LCD_DEFAULT_BG; 59unsigned bg_pattern IDATA_ATTR = LCD_DEFAULT_BG;
60unsigned lss_pattern IDATA_ATTR = LCD_DEFAULT_LS;
61unsigned lse_pattern IDATA_ATTR = LCD_DEFAULT_BG;
62unsigned lst_pattern IDATA_ATTR = LCD_DEFAULT_FG;
57#endif 63#endif
58 64
59static int drawmode = DRMODE_SOLID; 65static int drawmode = DRMODE_SOLID;
@@ -103,6 +109,21 @@ unsigned lcd_get_background(void)
103 return bg_pattern; 109 return bg_pattern;
104} 110}
105 111
112void lcd_set_selector_start(unsigned color)
113{
114 lss_pattern = color;
115}
116
117void lcd_set_selector_end(unsigned color)
118{
119 lse_pattern = color;
120}
121
122void lcd_set_selector_text(unsigned color)
123{
124 lst_pattern = color;
125}
126
106void lcd_set_drawinfo(int mode, unsigned fg_color, unsigned bg_color) 127void lcd_set_drawinfo(int mode, unsigned fg_color, unsigned bg_color)
107{ 128{
108 lcd_set_drawmode(mode); 129 lcd_set_drawmode(mode);
@@ -808,16 +829,48 @@ void lcd_puts_style_offset(int x, int y, const unsigned char *str, int style,
808 ypos = ymargin + y*h; 829 ypos = ymargin + y*h;
809 drawmode = (style & STYLE_INVERT) ? 830 drawmode = (style & STYLE_INVERT) ?
810 (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; 831 (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID;
811 if (style & STYLE_COLORED) { 832 if (style & STYLE_GRADIENT || style & STYLE_COLORBAR) {
833 fg_pattern = lss_pattern;
834 }
835 else if (style & STYLE_COLORED) {
812 if (drawmode == DRMODE_SOLID) 836 if (drawmode == DRMODE_SOLID)
813 fg_pattern = style & STYLE_COLOR_MASK; 837 fg_pattern = style & STYLE_COLOR_MASK;
814 else 838 else
815 bg_pattern = style & STYLE_COLOR_MASK; 839 bg_pattern = style & STYLE_COLOR_MASK;
816 } 840 }
817 lcd_putsxyofs(xpos, ypos, offset, str);
818 drawmode ^= DRMODE_INVERSEVID; 841 drawmode ^= DRMODE_INVERSEVID;
819 xrect = xpos + MAX(w - offset, 0); 842 xrect = xpos + MAX(w - offset, 0);
820 lcd_fillrect(xrect, ypos, LCD_WIDTH - xrect, h); 843
844 if (style & STYLE_GRADIENT) {
845 int h_r = RGB_UNPACK_RED(lss_pattern) << 16;
846 int h_b = RGB_UNPACK_BLUE(lss_pattern) << 16;
847 int h_g = RGB_UNPACK_GREEN(lss_pattern) << 16;
848 int rstep = (h_r - ((signed)RGB_UNPACK_RED(lse_pattern) << 16)) / h;
849 int gstep = (h_g - ((signed)RGB_UNPACK_GREEN(lse_pattern) << 16)) / h;
850 int bstep = (h_b - ((signed)RGB_UNPACK_BLUE(lse_pattern) << 16)) / h;
851 int count;
852
853 drawmode = DRMODE_FG;
854 for(count = 0; count < h; count++) {
855 lcd_hline(xpos, LCD_WIDTH, ypos + count);
856 h_r -= rstep;
857 h_g -= gstep;
858 h_b -= bstep;
859 fg_pattern = LCD_RGBPACK(h_r >> 16, h_g >> 16, h_b >> 16);
860 }
861 fg_pattern = lst_pattern;
862 }
863 else if (style & STYLE_COLORBAR) {
864 drawmode = DRMODE_FG;
865 lcd_fillrect(xpos, ypos, LCD_WIDTH - xpos, h);
866 fg_pattern = lst_pattern;
867 }
868 else {
869 lcd_fillrect(xrect, ypos, LCD_WIDTH - xrect, h);
870 drawmode = (style & STYLE_INVERT) ?
871 (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID;
872 }
873 lcd_putsxyofs(xpos, ypos, offset, str);
821 drawmode = lastmode; 874 drawmode = lastmode;
822 fg_pattern = oldfgcolor; 875 fg_pattern = oldfgcolor;
823 bg_pattern = oldbgcolor; 876 bg_pattern = oldbgcolor;
@@ -852,7 +905,13 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string,
852 s->start_tick = current_tick + lcd_scroll_info.delay; 905 s->start_tick = current_tick + lcd_scroll_info.delay;
853 s->invert = false; 906 s->invert = false;
854 if (style & STYLE_INVERT) { 907 if (style & STYLE_INVERT) {
855 s->invert = true; 908 s->invert = 1;
909 }
910 else if (style & STYLE_COLORBAR) {
911 s->invert = 2;
912 }
913 else if (style & STYLE_GRADIENT) {
914 s->invert = 3;
856 } 915 }
857 lcd_puts_style_offset(x,y,string,style,offset); 916 lcd_puts_style_offset(x,y,string,style,offset);
858 917
@@ -961,8 +1020,37 @@ void lcd_scroll_fn(void)
961 } 1020 }
962 1021
963 lastmode = drawmode; 1022 lastmode = drawmode;
964 drawmode = s->invert ? 1023 drawmode = s->invert == 1 ?
965 (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID; 1024 (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID;
1025 if (s->invert == 2) {
1026 fg_pattern = lss_pattern;
1027 drawmode = DRMODE_FG;
1028 lcd_fillrect(0, ypos, LCD_WIDTH, pf->height);
1029 fg_pattern = lst_pattern;
1030 }
1031 else if (s->invert == 3) {
1032 int h_r = RGB_UNPACK_RED(lss_pattern) << 16;
1033 int h_b = RGB_UNPACK_BLUE(lss_pattern) << 16;
1034 int h_g = RGB_UNPACK_GREEN(lss_pattern) << 16;
1035 int rstep = (h_r - ((signed)RGB_UNPACK_RED(lse_pattern) << 16))
1036 / pf->height;
1037 int gstep = (h_g - ((signed)RGB_UNPACK_GREEN(lse_pattern) << 16))
1038 / pf->height;
1039 int bstep = (h_b - ((signed)RGB_UNPACK_BLUE(lse_pattern) << 16))
1040 / pf->height;
1041 unsigned int count;
1042
1043 fg_pattern = lss_pattern;
1044 drawmode = DRMODE_FG;
1045 for(count = 0; count < pf->height; count++) {
1046 lcd_hline(0, LCD_WIDTH , ypos + count);
1047 h_r -= rstep;
1048 h_g -= gstep;
1049 h_b -= bstep;
1050 fg_pattern = LCD_RGBPACK(h_r >> 16, h_g >> 16, h_b >> 16);
1051 }
1052 fg_pattern = lst_pattern;
1053 }
966 lcd_putsxyofs(xpos, ypos, s->offset, s->line); 1054 lcd_putsxyofs(xpos, ypos, s->offset, s->line);
967 drawmode = lastmode; 1055 drawmode = lastmode;
968 lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height); 1056 lcd_update_rect(xpos, ypos, LCD_WIDTH - xpos, pf->height);