summaryrefslogtreecommitdiff
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
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
-rw-r--r--apps/gui/color_picker.c2
-rw-r--r--apps/gui/list.c25
-rw-r--r--apps/lang/english.lang92
-rw-r--r--apps/menus/display_menu.c55
-rw-r--r--apps/recorder/recording.c36
-rw-r--r--apps/screen_access.c5
-rw-r--r--apps/screen_access.h5
-rw-r--r--apps/settings.c3
-rw-r--r--apps/settings.h6
-rw-r--r--apps/settings_list.c18
-rw-r--r--docs/CREDITS1
-rw-r--r--firmware/drivers/lcd-16bit.c98
-rw-r--r--firmware/export/lcd.h8
-rw-r--r--firmware/export/scroll_engine.h6
14 files changed, 327 insertions, 33 deletions
diff --git a/apps/gui/color_picker.c b/apps/gui/color_picker.c
index 1116aaae23..513db74bf9 100644
--- a/apps/gui/color_picker.c
+++ b/apps/gui/color_picker.c
@@ -200,7 +200,7 @@ static void draw_screen(struct screen *display, char *title,
200 set_drawinfo(display, DRMODE_SOLID, text_color, 200 set_drawinfo(display, DRMODE_SOLID, text_color,
201 background_color); 201 background_color);
202 202
203 if (global_settings.invert_cursor) 203 if (global_settings.cursor_style != 0)
204 { 204 {
205 /* Draw solid bar selection bar */ 205 /* Draw solid bar selection bar */
206 display->fillrect(0, 206 display->fillrect(0,
diff --git a/apps/gui/list.c b/apps/gui/list.c
index a8bbce8cda..6a7d21cc4b 100644
--- a/apps/gui/list.c
+++ b/apps/gui/list.c
@@ -141,7 +141,7 @@ static void gui_list_flash(struct gui_list * gui_list)
141 int selected_line=gui_list->selected_item-gui_list->start_item+SHOW_LIST_TITLE; 141 int selected_line=gui_list->selected_item-gui_list->start_item+SHOW_LIST_TITLE;
142#ifdef HAVE_LCD_BITMAP 142#ifdef HAVE_LCD_BITMAP
143 int line_ypos=display->getymargin()+display->char_height*selected_line; 143 int line_ypos=display->getymargin()+display->char_height*selected_line;
144 if (global_settings.invert_cursor) 144 if (global_settings.cursor_style)
145 { 145 {
146 int line_xpos=display->getxmargin(); 146 int line_xpos=display->getxmargin();
147 display->set_drawmode(DRMODE_COMPLEMENT); 147 display->set_drawmode(DRMODE_COMPLEMENT);
@@ -313,7 +313,7 @@ static void gui_list_draw_smart(struct gui_list *gui_list)
313 draw_scrollbar = (global_settings.scrollbar && 313 draw_scrollbar = (global_settings.scrollbar &&
314 lines < gui_list->nb_items); 314 lines < gui_list->nb_items);
315 315
316 draw_cursor = !global_settings.invert_cursor && 316 draw_cursor = !global_settings.cursor_style &&
317 gui_list->show_selection_marker; 317 gui_list->show_selection_marker;
318 text_pos = 0; /* here it's in pixels */ 318 text_pos = 0; /* here it's in pixels */
319 if(draw_scrollbar || SHOW_LIST_TITLE) /* indent if there's 319 if(draw_scrollbar || SHOW_LIST_TITLE) /* indent if there's
@@ -390,11 +390,28 @@ static void gui_list_draw_smart(struct gui_list *gui_list)
390 current_item < gui_list->selected_item + gui_list->selected_size) 390 current_item < gui_list->selected_item + gui_list->selected_size)
391 {/* The selected item must be displayed scrolling */ 391 {/* The selected item must be displayed scrolling */
392#ifdef HAVE_LCD_BITMAP 392#ifdef HAVE_LCD_BITMAP
393 if (global_settings.invert_cursor)/* Display inverted-line-style*/ 393 if (global_settings.cursor_style == 1
394#ifdef HAVE_REMOTE_LCD
395 || display->screen_type == SCREEN_REMOTE
396#endif
397 )
394 { 398 {
399 /* Display inverted-line-style */
395 style |= STYLE_INVERT; 400 style |= STYLE_INVERT;
396 } 401 }
397 else /* if (!global_settings.invert_cursor) */ 402#ifdef HAVE_LCD_COLOR
403 else if (global_settings.cursor_style == 2)
404 {
405 /* Display colour line selector */
406 style |= STYLE_COLORBAR;
407 }
408 else if (global_settings.cursor_style == 3)
409 {
410 /* Display gradient line selector */
411 style |= STYLE_GRADIENT;
412 }
413#endif
414 else /* if (!global_settings.cursor_style) */
398 { 415 {
399 if (current_item % gui_list->selected_size != 0) 416 if (current_item % gui_list->selected_size != 0)
400 draw_cursor = false; 417 draw_cursor = false;
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 490f6d38b0..de254a3b1d 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -2899,15 +2899,15 @@
2899 user: 2899 user:
2900 <source> 2900 <source>
2901 *: none 2901 *: none
2902 lcd_bitmap: "Line Selector" 2902 lcd_bitmap: "Line Selector Type"
2903 </source> 2903 </source>
2904 <dest> 2904 <dest>
2905 *: none 2905 *: none
2906 lcd_bitmap: "Line Selector" 2906 lcd_bitmap: "Line Selector Type"
2907 </dest> 2907 </dest>
2908 <voice> 2908 <voice>
2909 *: none 2909 *: none
2910 lcd_bitmap: "Line Selector" 2910 lcd_bitmap: "Line Selector Type"
2911 </voice> 2911 </voice>
2912</phrase> 2912</phrase>
2913<phrase> 2913<phrase>
@@ -11242,3 +11242,89 @@
11242 usbstack: "Device Driver" 11242 usbstack: "Device Driver"
11243 </voice> 11243 </voice>
11244</phrase> 11244</phrase>
11245<phrase>
11246 id: LANG_SELECTOR_START_COLOR
11247 desc: line selector color option
11248 user:
11249 <source>
11250 *: none
11251 lcd_color: "Line Selector Primary Colour"
11252 </source>
11253 <dest>
11254 *: none
11255 lcd_color: "Line Selector Primary Colour"
11256 </dest>
11257 <voice>
11258 *: none
11259 lcd_color: "Line Selector Primary Colour"
11260 </voice>
11261</phrase>
11262<phrase>
11263 id: LANG_SELECTOR_END_COLOR
11264 desc: line selector color option
11265 user:
11266 <source>
11267 *: none
11268 lcd_color: "Line Selector Secondary Colour"
11269 </source>
11270 <dest>
11271 *: none
11272 lcd_color: "Line Selector Secondary Colour"
11273 </dest>
11274 <voice>
11275 *: none
11276 lcd_color: "Line Selector Secondary Colour"
11277 </voice>
11278</phrase>
11279<phrase>
11280 id: LANG_SELECTOR_TEXT_COLOR
11281 desc: line selector text color option
11282 user:
11283 <source>
11284 *: none
11285 lcd_color: "Line Selector Text Colour"
11286 </source>
11287 <dest>
11288 *: none
11289 lcd_color: "Line Selector Text Colour"
11290 </dest>
11291 <voice>
11292 *: none
11293 lcd_color: "Line Selector Text Colour"
11294 </voice>
11295</phrase>
11296<phrase>
11297 id: LANG_INVERT_CURSOR_COLOR
11298 desc: in settings_menu
11299 user:
11300 <source>
11301 *: none
11302 lcd_color: "Bar (Solid Colour)"
11303 </source>
11304 <dest>
11305 *: none
11306 lcd_color: "Bar (Solid Colour)"
11307 </dest>
11308 <voice>
11309 *: none
11310 lcd_color: "Bar (Solid Colour)"
11311 </voice>
11312</phrase>
11313<phrase>
11314 id: LANG_INVERT_CURSOR_GRADIENT
11315 desc: in settings_menu
11316 user:
11317 <source>
11318 *: none
11319 lcd_color: "Bar (Gradient Colour)"
11320 </source>
11321 <dest>
11322 *: none
11323 lcd_color: "Bar (Gradient Colour)"
11324 </dest>
11325 <voice>
11326 *: none
11327 lcd_color: "Bar (Gradient Colour)"
11328 </voice>
11329</phrase>
11330
diff --git a/apps/menus/display_menu.c b/apps/menus/display_menu.c
index c1e574a974..11d1f25e7f 100644
--- a/apps/menus/display_menu.c
+++ b/apps/menus/display_menu.c
@@ -115,7 +115,7 @@ MENUITEM_SETTING(invert, &global_settings.invert, NULL);
115#ifdef HAVE_LCD_FLIP 115#ifdef HAVE_LCD_FLIP
116MENUITEM_SETTING(flip_display, &global_settings.flip_display, flipdisplay_callback); 116MENUITEM_SETTING(flip_display, &global_settings.flip_display, flipdisplay_callback);
117#endif 117#endif
118MENUITEM_SETTING(invert_cursor, &global_settings.invert_cursor, NULL); 118MENUITEM_SETTING(cursor_style, &global_settings.cursor_style, NULL);
119#endif /* HAVE_LCD_BITMAP */ 119#endif /* HAVE_LCD_BITMAP */
120#if LCD_DEPTH > 1 120#if LCD_DEPTH > 1
121/** 121/**
@@ -157,13 +157,55 @@ static int set_bg_color(void)
157 settings_save(); 157 settings_save();
158 return res; 158 return res;
159} 159}
160
161/* Line selector colour */
162static int set_lss_color(void)
163{
164 int res;
165 res = (int)set_color(&screens[SCREEN_MAIN],str(LANG_SELECTOR_START_COLOR),
166 &global_settings.lss_color,-1);
167
168 screens[SCREEN_MAIN].set_selector_start(global_settings.lss_color);
169 settings_save();
170 return res;
171}
172
173static int set_lse_color(void)
174{
175 int res;
176 res = (int)set_color(&screens[SCREEN_MAIN],str(LANG_SELECTOR_END_COLOR),
177 &global_settings.lse_color,-1);
178
179 screens[SCREEN_MAIN].set_selector_end(global_settings.lse_color);
180 settings_save();
181 return res;
182}
183
184/* Line selector text colour */
185static int set_lst_color(void)
186{
187 int res;
188 res = (int)set_color(&screens[SCREEN_MAIN],str(LANG_SELECTOR_TEXT_COLOR),
189 &global_settings.lst_color,global_settings.lss_color);
190
191 screens[SCREEN_MAIN].set_selector_text(global_settings.lst_color);
192 settings_save();
193 return res;
194}
195
160static int reset_color(void) 196static int reset_color(void)
161{ 197{
162 global_settings.fg_color = LCD_DEFAULT_FG; 198 global_settings.fg_color = LCD_DEFAULT_FG;
163 global_settings.bg_color = LCD_DEFAULT_BG; 199 global_settings.bg_color = LCD_DEFAULT_BG;
200 global_settings.lss_color = LCD_DEFAULT_LS;
201 global_settings.lse_color = LCD_DEFAULT_BG;
202 global_settings.lst_color = LCD_DEFAULT_FG;
164 203
165 screens[SCREEN_MAIN].set_foreground(global_settings.fg_color); 204 screens[SCREEN_MAIN].set_foreground(global_settings.fg_color);
166 screens[SCREEN_MAIN].set_background(global_settings.bg_color); 205 screens[SCREEN_MAIN].set_background(global_settings.bg_color);
206 screens[SCREEN_MAIN].set_selector_start(global_settings.lss_color);
207 screens[SCREEN_MAIN].set_selector_end(global_settings.lse_color);
208 screens[SCREEN_MAIN].set_selector_text(global_settings.lst_color);
167 settings_save(); 209 settings_save();
168 return 0; 210 return 0;
169} 211}
@@ -171,6 +213,12 @@ MENUITEM_FUNCTION(set_bg_col, 0, ID2P(LANG_BACKGROUND_COLOR),
171 set_bg_color, NULL, NULL, Icon_NOICON); 213 set_bg_color, NULL, NULL, Icon_NOICON);
172MENUITEM_FUNCTION(set_fg_col, 0, ID2P(LANG_FOREGROUND_COLOR), 214MENUITEM_FUNCTION(set_fg_col, 0, ID2P(LANG_FOREGROUND_COLOR),
173 set_fg_color, NULL, NULL, Icon_NOICON); 215 set_fg_color, NULL, NULL, Icon_NOICON);
216MENUITEM_FUNCTION(set_lss_col, 0, ID2P(LANG_SELECTOR_START_COLOR),
217 set_lss_color, NULL, NULL, Icon_NOICON);
218MENUITEM_FUNCTION(set_lse_col, 0, ID2P(LANG_SELECTOR_END_COLOR),
219 set_lse_color, NULL, NULL, Icon_NOICON);
220MENUITEM_FUNCTION(set_lst_col, 0, ID2P(LANG_SELECTOR_TEXT_COLOR),
221 set_lst_color, NULL, NULL, Icon_NOICON);
174MENUITEM_FUNCTION(reset_colors, 0, ID2P(LANG_RESET_COLORS), 222MENUITEM_FUNCTION(reset_colors, 0, ID2P(LANG_RESET_COLORS),
175 reset_color, NULL, NULL, Icon_NOICON); 223 reset_color, NULL, NULL, Icon_NOICON);
176#endif 224#endif
@@ -208,8 +256,11 @@ MAKE_MENU(lcd_settings,ID2P(LANG_LCD_MENU),
208# ifdef HAVE_LCD_FLIP 256# ifdef HAVE_LCD_FLIP
209 ,&flip_display 257 ,&flip_display
210# endif 258# endif
211 ,&invert_cursor 259 ,&cursor_style
212#endif /* HAVE_LCD_BITMAP */ 260#endif /* HAVE_LCD_BITMAP */
261#ifdef HAVE_LCD_COLOR
262 ,&set_lss_col, &set_lse_col, &set_lst_col
263#endif
213#if LCD_DEPTH > 1 264#if LCD_DEPTH > 1
214 ,&clear_main_bd, 265 ,&clear_main_bd,
215#endif 266#endif
diff --git a/apps/recorder/recording.c b/apps/recorder/recording.c
index f643b8442a..bd04d26929 100644
--- a/apps/recorder/recording.c
+++ b/apps/recorder/recording.c
@@ -857,6 +857,16 @@ bool recording_screen(bool no_source)
857 ID2P(LANG_GIGABYTE) 857 ID2P(LANG_GIGABYTE)
858 }; 858 };
859 859
860 int style = STYLE_INVERT;
861#ifdef HAVE_LCD_COLOR
862 if (global_settings.cursor_style == 2) {
863 style |= STYLE_COLORBAR;
864 }
865 else if (global_settings.cursor_style == 3) {
866 style |= STYLE_GRADIENT;
867 }
868#endif
869
860 struct audio_recording_options rec_options; 870 struct audio_recording_options rec_options;
861 if (check_dir(global_settings.rec_directory) == false) 871 if (check_dir(global_settings.rec_directory) == false)
862 { 872 {
@@ -930,7 +940,7 @@ bool recording_screen(bool no_source)
930 { 940 {
931 screens[i].setfont(FONT_SYSFIXED); 941 screens[i].setfont(FONT_SYSFIXED);
932 screens[i].getstringsize("M", &w, &h); 942 screens[i].getstringsize("M", &w, &h);
933 screens[i].setmargins(global_settings.invert_cursor ? 0 : w, 8); 943 screens[i].setmargins(global_settings.cursor_style ? 0 : w, 8);
934 filename_offset[i] = ((screens[i].height >= 80) ? 1 : 0); 944 filename_offset[i] = ((screens[i].height >= 80) ? 1 : 0);
935 pm_y[i] = 8 + h * (2 + filename_offset[i]); 945 pm_y[i] = 8 + h * (2 + filename_offset[i]);
936 } 946 }
@@ -1331,7 +1341,7 @@ bool recording_screen(bool no_source)
1331 { 1341 {
1332 screens[i].setfont(FONT_SYSFIXED); 1342 screens[i].setfont(FONT_SYSFIXED);
1333 screens[i].setmargins( 1343 screens[i].setmargins(
1334 global_settings.invert_cursor ? 0 : w, 8); 1344 global_settings.cursor_style ? 0 : w, 8);
1335 } 1345 }
1336 } 1346 }
1337 } 1347 }
@@ -1555,11 +1565,11 @@ bool recording_screen(bool no_source)
1555 global_settings.volume, 1565 global_settings.volume,
1556 buf2, sizeof(buf2))); 1566 buf2, sizeof(buf2)));
1557 1567
1558 if (global_settings.invert_cursor && (pos++ == cursor)) 1568 if (global_settings.cursor_style && (pos++ == cursor))
1559 { 1569 {
1560 for(i = 0; i < screen_update; i++) 1570 for(i = 0; i < screen_update; i++)
1561 screens[i].puts_style_offset(0, filename_offset[i] + 1571 screens[i].puts_style_offset(0, filename_offset[i] +
1562 PM_HEIGHT + 2, buf, STYLE_INVERT,0); 1572 PM_HEIGHT + 2, buf, style,0);
1563 } 1573 }
1564 else 1574 else
1565 { 1575 {
@@ -1574,11 +1584,11 @@ bool recording_screen(bool no_source)
1574 fmt_gain(SOUND_MIC_GAIN, 1584 fmt_gain(SOUND_MIC_GAIN,
1575 global_settings.rec_mic_gain, 1585 global_settings.rec_mic_gain,
1576 buf2, sizeof(buf2))); 1586 buf2, sizeof(buf2)));
1577 if(global_settings.invert_cursor && ((1==cursor)||(2==cursor))) 1587 if(global_settings.cursor_style && ((1==cursor)||(2==cursor)))
1578 { 1588 {
1579 for(i = 0; i < screen_update; i++) 1589 for(i = 0; i < screen_update; i++)
1580 screens[i].puts_style_offset(0, filename_offset[i] + 1590 screens[i].puts_style_offset(0, filename_offset[i] +
1581 PM_HEIGHT + 3, buf, STYLE_INVERT,0); 1591 PM_HEIGHT + 3, buf, style,0);
1582 } 1592 }
1583 else 1593 else
1584 { 1594 {
@@ -1598,11 +1608,11 @@ bool recording_screen(bool no_source)
1598 fmt_gain(SOUND_LEFT_GAIN, 1608 fmt_gain(SOUND_LEFT_GAIN,
1599 global_settings.rec_left_gain, 1609 global_settings.rec_left_gain,
1600 buf2, sizeof(buf2))); 1610 buf2, sizeof(buf2)));
1601 if(global_settings.invert_cursor && ((1==cursor)||(2==cursor))) 1611 if(global_settings.cursor_style && ((1==cursor)||(2==cursor)))
1602 { 1612 {
1603 for(i = 0; i < screen_update; i++) 1613 for(i = 0; i < screen_update; i++)
1604 screens[i].puts_style_offset(0, filename_offset[i] + 1614 screens[i].puts_style_offset(0, filename_offset[i] +
1605 PM_HEIGHT + 3, buf, STYLE_INVERT,0); 1615 PM_HEIGHT + 3, buf, style,0);
1606 } 1616 }
1607 else 1617 else
1608 { 1618 {
@@ -1616,11 +1626,11 @@ bool recording_screen(bool no_source)
1616 fmt_gain(SOUND_RIGHT_GAIN, 1626 fmt_gain(SOUND_RIGHT_GAIN,
1617 global_settings.rec_right_gain, 1627 global_settings.rec_right_gain,
1618 buf2, sizeof(buf2))); 1628 buf2, sizeof(buf2)));
1619 if(global_settings.invert_cursor && ((1==cursor)||(3==cursor))) 1629 if(global_settings.cursor_style && ((1==cursor)||(3==cursor)))
1620 { 1630 {
1621 for(i = 0; i < screen_update; i++) 1631 for(i = 0; i < screen_update; i++)
1622 screens[i].puts_style_offset(0, filename_offset[i] + 1632 screens[i].puts_style_offset(0, filename_offset[i] +
1623 PM_HEIGHT + 4, buf, STYLE_INVERT,0); 1633 PM_HEIGHT + 4, buf, style,0);
1624 } 1634 }
1625 else 1635 else
1626 { 1636 {
@@ -1701,11 +1711,11 @@ bool recording_screen(bool no_source)
1701 global_settings.rec_right_gain)/2, 1711 global_settings.rec_right_gain)/2,
1702 buf2, sizeof(buf2))); 1712 buf2, sizeof(buf2)));
1703 1713
1704 if(global_settings.invert_cursor && ((cursor==4) || (cursor==5))) 1714 if(global_settings.cursor_style && ((cursor==4) || (cursor==5)))
1705 { 1715 {
1706 for(i = 0; i < screen_update; i++) 1716 for(i = 0; i < screen_update; i++)
1707 screens[i].puts_style_offset(0, filename_offset[i] + 1717 screens[i].puts_style_offset(0, filename_offset[i] +
1708 PM_HEIGHT + line[i], buf, STYLE_INVERT,0); 1718 PM_HEIGHT + line[i], buf, style,0);
1709 } 1719 }
1710 else if ( 1720 else if (
1711 global_settings.rec_source == AUDIO_SRC_MIC 1721 global_settings.rec_source == AUDIO_SRC_MIC
@@ -1737,7 +1747,7 @@ bool recording_screen(bool no_source)
1737 } 1747 }
1738#endif /* HAVE_AGC */ 1748#endif /* HAVE_AGC */
1739 1749
1740 if(!global_settings.invert_cursor) { 1750 if(!global_settings.cursor_style) {
1741 switch(cursor) 1751 switch(cursor)
1742 { 1752 {
1743 case 1: 1753 case 1:
diff --git a/apps/screen_access.c b/apps/screen_access.c
index 251bd7e848..a10e96475e 100644
--- a/apps/screen_access.c
+++ b/apps/screen_access.c
@@ -77,6 +77,11 @@ struct screen screens[NB_SCREENS] =
77 .get_foreground=&lcd_get_foreground, 77 .get_foreground=&lcd_get_foreground,
78 .set_background=&lcd_set_background, 78 .set_background=&lcd_set_background,
79 .set_foreground=&lcd_set_foreground, 79 .set_foreground=&lcd_set_foreground,
80#ifdef HAVE_LCD_COLOR
81 .set_selector_start=&lcd_set_selector_start,
82 .set_selector_end=&lcd_set_selector_end,
83 .set_selector_text=&lcd_set_selector_text,
84#endif
80#endif /* LCD_DEPTH > 1 */ 85#endif /* LCD_DEPTH > 1 */
81 .update_rect=&lcd_update_rect, 86 .update_rect=&lcd_update_rect,
82 .fillrect=&lcd_fillrect, 87 .fillrect=&lcd_fillrect,
diff --git a/apps/screen_access.h b/apps/screen_access.h
index 05a53d5d0f..6333251d29 100644
--- a/apps/screen_access.h
+++ b/apps/screen_access.h
@@ -107,6 +107,11 @@ struct screen
107 void (*set_background)(unsigned background); 107 void (*set_background)(unsigned background);
108 void (*set_foreground)(unsigned foreground); 108 void (*set_foreground)(unsigned foreground);
109#endif /* (LCD_DEPTH > 1) || (LCD_REMOTE_DEPTH > 1) */ 109#endif /* (LCD_DEPTH > 1) || (LCD_REMOTE_DEPTH > 1) */
110#if defined(HAVE_LCD_COLOR)
111 void (*set_selector_start)(unsigned selector);
112 void (*set_selector_end)(unsigned selector);
113 void (*set_selector_text)(unsigned selector_text);
114#endif
110 void (*update_rect)(int x, int y, int width, int height); 115 void (*update_rect)(int x, int y, int width, int height);
111 void (*fillrect)(int x, int y, int width, int height); 116 void (*fillrect)(int x, int y, int width, int height);
112 void (*drawrect)(int x, int y, int width, int height); 117 void (*drawrect)(int x, int y, int width, int height);
diff --git a/apps/settings.c b/apps/settings.c
index 6e26574f6a..a020c18e1b 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -778,6 +778,9 @@ void settings_apply(void)
778#ifdef HAVE_LCD_COLOR 778#ifdef HAVE_LCD_COLOR
779 screens[SCREEN_MAIN].set_foreground(global_settings.fg_color); 779 screens[SCREEN_MAIN].set_foreground(global_settings.fg_color);
780 screens[SCREEN_MAIN].set_background(global_settings.bg_color); 780 screens[SCREEN_MAIN].set_background(global_settings.bg_color);
781 screens[SCREEN_MAIN].set_selector_start(global_settings.lss_color);
782 screens[SCREEN_MAIN].set_selector_end(global_settings.lse_color);
783 screens[SCREEN_MAIN].set_selector_text(global_settings.lst_color);
781#endif 784#endif
782 785
783#if defined(HAVE_REMOTE_LCD) && (NB_SCREENS > 1) 786#if defined(HAVE_REMOTE_LCD) && (NB_SCREENS > 1)
diff --git a/apps/settings.h b/apps/settings.h
index 72f607d693..ee8fd48831 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -412,8 +412,7 @@ struct user_settings
412 int contrast; /* lcd contrast */ 412 int contrast; /* lcd contrast */
413#endif 413#endif
414 bool invert; /* invert display */ 414 bool invert; /* invert display */
415 bool invert_cursor; /* invert the current file in dir browser and menu 415 int cursor_style; /* style of the selection cursor */
416 instead of using the default cursor */
417 bool flip_display; /* turn display (and button layout) by 180 degrees */ 416 bool flip_display; /* turn display (and button layout) by 180 degrees */
418 int poweroff; /* power off timer */ 417 int poweroff; /* power off timer */
419 int backlight_timeout; /* backlight off timeout: 0-18 0=never, 418 int backlight_timeout; /* backlight off timeout: 0-18 0=never,
@@ -641,6 +640,9 @@ struct user_settings
641#ifdef HAVE_LCD_COLOR 640#ifdef HAVE_LCD_COLOR
642 int bg_color; /* background color native format */ 641 int bg_color; /* background color native format */
643 int fg_color; /* foreground color native format */ 642 int fg_color; /* foreground color native format */
643 int lss_color; /* background color for the selector or start color for the gradient */
644 int lse_color; /* end color for the selector gradient */
645 int lst_color; /* color of the text for the selector */
644#endif 646#endif
645 bool party_mode; /* party mode - unstoppable music */ 647 bool party_mode; /* party mode - unstoppable music */
646 648
diff --git a/apps/settings_list.c b/apps/settings_list.c
index 176d1cee69..51ac3eb473 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -457,8 +457,16 @@ const struct settings_list settings[] = {
457 OFFON_SETTING(0,flip_display, LANG_FLIP_DISPLAY, false,"flip display", NULL), 457 OFFON_SETTING(0,flip_display, LANG_FLIP_DISPLAY, false,"flip display", NULL),
458#endif 458#endif
459 /* display */ 459 /* display */
460 BOOL_SETTING(F_TEMPVAR, invert_cursor, LANG_INVERT_CURSOR, true ,"invert cursor", off_on, 460 CHOICE_SETTING(F_TEMPVAR|F_THEMESETTING, cursor_style, LANG_INVERT_CURSOR, 1,
461 LANG_INVERT_CURSOR_BAR, LANG_INVERT_CURSOR_POINTER, NULL), 461 #ifdef HAVE_LCD_COLOR
462 "selector type", "pointer,bar (inverse),bar (color),bar (gradient)",
463 NULL, 4,
464 ID2P(LANG_INVERT_CURSOR_POINTER), ID2P(LANG_INVERT_CURSOR_BAR),
465 ID2P(LANG_INVERT_CURSOR_COLOR), ID2P(LANG_INVERT_CURSOR_GRADIENT)),
466 #else
467 "selector type", "pointer,bar (inverse)", NULL, 2,
468 ID2P(LANG_INVERT_CURSOR_POINTER), ID2P(LANG_INVERT_CURSOR_BAR)),
469 #endif
462 OFFON_SETTING(F_THEMESETTING|F_TEMPVAR, statusbar, 470 OFFON_SETTING(F_THEMESETTING|F_TEMPVAR, statusbar,
463 LANG_STATUS_BAR, true,"statusbar", NULL), 471 LANG_STATUS_BAR, true,"statusbar", NULL),
464 OFFON_SETTING(0,scrollbar, LANG_SCROLL_BAR, true,"scrollbar", NULL), 472 OFFON_SETTING(0,scrollbar, LANG_SCROLL_BAR, true,"scrollbar", NULL),
@@ -625,6 +633,12 @@ const struct settings_list settings[] = {
625 "foreground color",NULL,UNUSED}, 633 "foreground color",NULL,UNUSED},
626 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.bg_color,-1,INT(LCD_DEFAULT_BG), 634 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.bg_color,-1,INT(LCD_DEFAULT_BG),
627 "background color",NULL,UNUSED}, 635 "background color",NULL,UNUSED},
636 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.lss_color,-1,INT(LCD_DEFAULT_LS),
637 "line selector start color",NULL,UNUSED},
638 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.lse_color,-1,INT(LCD_DEFAULT_BG),
639 "line selector end color",NULL,UNUSED},
640 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.lst_color,-1,INT(LCD_DEFAULT_FG),
641 "line selector text color",NULL,UNUSED},
628#endif 642#endif
629 /* more playback */ 643 /* more playback */
630 OFFON_SETTING(0,play_selected,LANG_PLAY_SELECTED,true,"play selected",NULL), 644 OFFON_SETTING(0,play_selected,LANG_PLAY_SELECTED,true,"play selected",NULL),
diff --git a/docs/CREDITS b/docs/CREDITS
index 77d34f1abc..542278e914 100644
--- a/docs/CREDITS
+++ b/docs/CREDITS
@@ -334,6 +334,7 @@ Peter Harley
334Max Kelley 334Max Kelley
335Alexander Eickhoff 335Alexander Eickhoff
336Pinitnun Shanasabang 336Pinitnun Shanasabang
337Ken Fazzone
337 338
338The libmad team 339The libmad team
339The wavpack team 340The wavpack team
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);
diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h
index ac0aea8664..2ea9906a2a 100644
--- a/firmware/export/lcd.h
+++ b/firmware/export/lcd.h
@@ -27,6 +27,8 @@
27#define STYLE_DEFAULT 0x00000000 27#define STYLE_DEFAULT 0x00000000
28#define STYLE_INVERT 0x20000000 28#define STYLE_INVERT 0x20000000
29#define STYLE_COLORED 0x10000000 29#define STYLE_COLORED 0x10000000
30#define STYLE_COLORBAR 0x40000000
31#define STYLE_GRADIENT 0x80000000
30#define STYLE_COLOR_MASK 0x0000FFFF 32#define STYLE_COLOR_MASK 0x0000FFFF
31 33
32#ifdef SIMULATOR 34#ifdef SIMULATOR
@@ -233,6 +235,7 @@ static inline unsigned lcd_color_to_native(unsigned color)
233#define LCD_WHITE LCD_RGBPACK(255, 255, 255) 235#define LCD_WHITE LCD_RGBPACK(255, 255, 255)
234#define LCD_DEFAULT_FG LCD_BLACK 236#define LCD_DEFAULT_FG LCD_BLACK
235#define LCD_DEFAULT_BG LCD_RGBPACK(182, 198, 229) /* rockbox blue */ 237#define LCD_DEFAULT_BG LCD_RGBPACK(182, 198, 229) /* rockbox blue */
238#define LCD_DEFAULT_LS LCD_WHITE
236 239
237#elif LCD_DEPTH > 1 /* greyscale */ 240#elif LCD_DEPTH > 1 /* greyscale */
238 241
@@ -355,6 +358,11 @@ extern void lcd_set_foreground(unsigned foreground);
355extern unsigned lcd_get_foreground(void); 358extern unsigned lcd_get_foreground(void);
356extern void lcd_set_background(unsigned background); 359extern void lcd_set_background(unsigned background);
357extern unsigned lcd_get_background(void); 360extern unsigned lcd_get_background(void);
361#ifdef HAVE_LCD_COLOR
362extern void lcd_set_selector_start(unsigned selector);
363extern void lcd_set_selector_end(unsigned selector);
364extern void lcd_set_selector_text(unsigned selector_text);
365#endif
358extern void lcd_set_drawinfo(int mode, unsigned foreground, 366extern void lcd_set_drawinfo(int mode, unsigned foreground,
359 unsigned background); 367 unsigned background);
360void lcd_set_backdrop(fb_data* backdrop); 368void lcd_set_backdrop(fb_data* backdrop);
diff --git a/firmware/export/scroll_engine.h b/firmware/export/scroll_engine.h
index aa11a9ba1f..f40a00f96c 100644
--- a/firmware/export/scroll_engine.h
+++ b/firmware/export/scroll_engine.h
@@ -43,8 +43,12 @@ struct scrollinfo
43 int startx; 43 int startx;
44#ifdef HAVE_LCD_BITMAP 44#ifdef HAVE_LCD_BITMAP
45 int width; /* length of line in pixels */ 45 int width; /* length of line in pixels */
46 bool invert; /* invert the scrolled text */ 46#ifdef HAVE_LCD_COLOR
47 int invert; /* invert the scrolled text */
48#else
49 bool invert;
47#endif 50#endif
51#endif/* HAVE_LCD_BITMAP */
48 bool backward; /* scroll presently forward or backward? */ 52 bool backward; /* scroll presently forward or backward? */
49 bool bidir; 53 bool bidir;
50 long start_tick; 54 long start_tick;