summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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,
set_drawinfo(display, DRMODE_SOLID, text_color,
background_color);
- if (global_settings.invert_cursor)
+ if (global_settings.cursor_style != 0)
{
/* Draw solid bar selection bar */
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)
int selected_line=gui_list->selected_item-gui_list->start_item+SHOW_LIST_TITLE;
#ifdef HAVE_LCD_BITMAP
int line_ypos=display->getymargin()+display->char_height*selected_line;
- if (global_settings.invert_cursor)
+ if (global_settings.cursor_style)
{
int line_xpos=display->getxmargin();
display->set_drawmode(DRMODE_COMPLEMENT);
@@ -313,7 +313,7 @@ static void gui_list_draw_smart(struct gui_list *gui_list)
draw_scrollbar = (global_settings.scrollbar &&
lines < gui_list->nb_items);
- draw_cursor = !global_settings.invert_cursor &&
+ draw_cursor = !global_settings.cursor_style &&
gui_list->show_selection_marker;
text_pos = 0; /* here it's in pixels */
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)
current_item < gui_list->selected_item + gui_list->selected_size)
{/* The selected item must be displayed scrolling */
#ifdef HAVE_LCD_BITMAP
- if (global_settings.invert_cursor)/* Display inverted-line-style*/
+ if (global_settings.cursor_style == 1
+#ifdef HAVE_REMOTE_LCD
+ || display->screen_type == SCREEN_REMOTE
+#endif
+ )
{
+ /* Display inverted-line-style */
style |= STYLE_INVERT;
}
- else /* if (!global_settings.invert_cursor) */
+#ifdef HAVE_LCD_COLOR
+ else if (global_settings.cursor_style == 2)
+ {
+ /* Display colour line selector */
+ style |= STYLE_COLORBAR;
+ }
+ else if (global_settings.cursor_style == 3)
+ {
+ /* Display gradient line selector */
+ style |= STYLE_GRADIENT;
+ }
+#endif
+ else /* if (!global_settings.cursor_style) */
{
if (current_item % gui_list->selected_size != 0)
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 @@
user:
<source>
*: none
- lcd_bitmap: "Line Selector"
+ lcd_bitmap: "Line Selector Type"
</source>
<dest>
*: none
- lcd_bitmap: "Line Selector"
+ lcd_bitmap: "Line Selector Type"
</dest>
<voice>
*: none
- lcd_bitmap: "Line Selector"
+ lcd_bitmap: "Line Selector Type"
</voice>
</phrase>
<phrase>
@@ -11242,3 +11242,89 @@
usbstack: "Device Driver"
</voice>
</phrase>
+<phrase>
+ id: LANG_SELECTOR_START_COLOR
+ desc: line selector color option
+ user:
+ <source>
+ *: none
+ lcd_color: "Line Selector Primary Colour"
+ </source>
+ <dest>
+ *: none
+ lcd_color: "Line Selector Primary Colour"
+ </dest>
+ <voice>
+ *: none
+ lcd_color: "Line Selector Primary Colour"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_SELECTOR_END_COLOR
+ desc: line selector color option
+ user:
+ <source>
+ *: none
+ lcd_color: "Line Selector Secondary Colour"
+ </source>
+ <dest>
+ *: none
+ lcd_color: "Line Selector Secondary Colour"
+ </dest>
+ <voice>
+ *: none
+ lcd_color: "Line Selector Secondary Colour"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_SELECTOR_TEXT_COLOR
+ desc: line selector text color option
+ user:
+ <source>
+ *: none
+ lcd_color: "Line Selector Text Colour"
+ </source>
+ <dest>
+ *: none
+ lcd_color: "Line Selector Text Colour"
+ </dest>
+ <voice>
+ *: none
+ lcd_color: "Line Selector Text Colour"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_INVERT_CURSOR_COLOR
+ desc: in settings_menu
+ user:
+ <source>
+ *: none
+ lcd_color: "Bar (Solid Colour)"
+ </source>
+ <dest>
+ *: none
+ lcd_color: "Bar (Solid Colour)"
+ </dest>
+ <voice>
+ *: none
+ lcd_color: "Bar (Solid Colour)"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_INVERT_CURSOR_GRADIENT
+ desc: in settings_menu
+ user:
+ <source>
+ *: none
+ lcd_color: "Bar (Gradient Colour)"
+ </source>
+ <dest>
+ *: none
+ lcd_color: "Bar (Gradient Colour)"
+ </dest>
+ <voice>
+ *: none
+ lcd_color: "Bar (Gradient Colour)"
+ </voice>
+</phrase>
+
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);
#ifdef HAVE_LCD_FLIP
MENUITEM_SETTING(flip_display, &global_settings.flip_display, flipdisplay_callback);
#endif
-MENUITEM_SETTING(invert_cursor, &global_settings.invert_cursor, NULL);
+MENUITEM_SETTING(cursor_style, &global_settings.cursor_style, NULL);
#endif /* HAVE_LCD_BITMAP */
#if LCD_DEPTH > 1
/**
@@ -157,13 +157,55 @@ static int set_bg_color(void)
settings_save();
return res;
}
+
+/* Line selector colour */
+static int set_lss_color(void)
+{
+ int res;
+ res = (int)set_color(&screens[SCREEN_MAIN],str(LANG_SELECTOR_START_COLOR),
+ &global_settings.lss_color,-1);
+
+ screens[SCREEN_MAIN].set_selector_start(global_settings.lss_color);
+ settings_save();
+ return res;
+}
+
+static int set_lse_color(void)
+{
+ int res;
+ res = (int)set_color(&screens[SCREEN_MAIN],str(LANG_SELECTOR_END_COLOR),
+ &global_settings.lse_color,-1);
+
+ screens[SCREEN_MAIN].set_selector_end(global_settings.lse_color);
+ settings_save();
+ return res;
+}
+
+/* Line selector text colour */
+static int set_lst_color(void)
+{
+ int res;
+ res = (int)set_color(&screens[SCREEN_MAIN],str(LANG_SELECTOR_TEXT_COLOR),
+ &global_settings.lst_color,global_settings.lss_color);
+
+ screens[SCREEN_MAIN].set_selector_text(global_settings.lst_color);
+ settings_save();
+ return res;
+}
+
static int reset_color(void)
{
global_settings.fg_color = LCD_DEFAULT_FG;
global_settings.bg_color = LCD_DEFAULT_BG;
+ global_settings.lss_color = LCD_DEFAULT_LS;
+ global_settings.lse_color = LCD_DEFAULT_BG;
+ global_settings.lst_color = LCD_DEFAULT_FG;
screens[SCREEN_MAIN].set_foreground(global_settings.fg_color);
screens[SCREEN_MAIN].set_background(global_settings.bg_color);
+ screens[SCREEN_MAIN].set_selector_start(global_settings.lss_color);
+ screens[SCREEN_MAIN].set_selector_end(global_settings.lse_color);
+ screens[SCREEN_MAIN].set_selector_text(global_settings.lst_color);
settings_save();
return 0;
}
@@ -171,6 +213,12 @@ MENUITEM_FUNCTION(set_bg_col, 0, ID2P(LANG_BACKGROUND_COLOR),
set_bg_color, NULL, NULL, Icon_NOICON);
MENUITEM_FUNCTION(set_fg_col, 0, ID2P(LANG_FOREGROUND_COLOR),
set_fg_color, NULL, NULL, Icon_NOICON);
+MENUITEM_FUNCTION(set_lss_col, 0, ID2P(LANG_SELECTOR_START_COLOR),
+ set_lss_color, NULL, NULL, Icon_NOICON);
+MENUITEM_FUNCTION(set_lse_col, 0, ID2P(LANG_SELECTOR_END_COLOR),
+ set_lse_color, NULL, NULL, Icon_NOICON);
+MENUITEM_FUNCTION(set_lst_col, 0, ID2P(LANG_SELECTOR_TEXT_COLOR),
+ set_lst_color, NULL, NULL, Icon_NOICON);
MENUITEM_FUNCTION(reset_colors, 0, ID2P(LANG_RESET_COLORS),
reset_color, NULL, NULL, Icon_NOICON);
#endif
@@ -208,8 +256,11 @@ MAKE_MENU(lcd_settings,ID2P(LANG_LCD_MENU),
# ifdef HAVE_LCD_FLIP
,&flip_display
# endif
- ,&invert_cursor
+ ,&cursor_style
#endif /* HAVE_LCD_BITMAP */
+#ifdef HAVE_LCD_COLOR
+ ,&set_lss_col, &set_lse_col, &set_lst_col
+#endif
#if LCD_DEPTH > 1
,&clear_main_bd,
#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)
ID2P(LANG_GIGABYTE)
};
+ int style = STYLE_INVERT;
+#ifdef HAVE_LCD_COLOR
+ if (global_settings.cursor_style == 2) {
+ style |= STYLE_COLORBAR;
+ }
+ else if (global_settings.cursor_style == 3) {
+ style |= STYLE_GRADIENT;
+ }
+#endif
+
struct audio_recording_options rec_options;
if (check_dir(global_settings.rec_directory) == false)
{
@@ -930,7 +940,7 @@ bool recording_screen(bool no_source)
{
screens[i].setfont(FONT_SYSFIXED);
screens[i].getstringsize("M", &w, &h);
- screens[i].setmargins(global_settings.invert_cursor ? 0 : w, 8);
+ screens[i].setmargins(global_settings.cursor_style ? 0 : w, 8);
filename_offset[i] = ((screens[i].height >= 80) ? 1 : 0);
pm_y[i] = 8 + h * (2 + filename_offset[i]);
}
@@ -1331,7 +1341,7 @@ bool recording_screen(bool no_source)
{
screens[i].setfont(FONT_SYSFIXED);
screens[i].setmargins(
- global_settings.invert_cursor ? 0 : w, 8);
+ global_settings.cursor_style ? 0 : w, 8);
}
}
}
@@ -1555,11 +1565,11 @@ bool recording_screen(bool no_source)
global_settings.volume,
buf2, sizeof(buf2)));
- if (global_settings.invert_cursor && (pos++ == cursor))
+ if (global_settings.cursor_style && (pos++ == cursor))
{
for(i = 0; i < screen_update; i++)
screens[i].puts_style_offset(0, filename_offset[i] +
- PM_HEIGHT + 2, buf, STYLE_INVERT,0);
+ PM_HEIGHT + 2, buf, style,0);
}
else
{
@@ -1574,11 +1584,11 @@ bool recording_screen(bool no_source)
fmt_gain(SOUND_MIC_GAIN,
global_settings.rec_mic_gain,
buf2, sizeof(buf2)));
- if(global_settings.invert_cursor && ((1==cursor)||(2==cursor)))
+ if(global_settings.cursor_style && ((1==cursor)||(2==cursor)))
{
for(i = 0; i < screen_update; i++)
screens[i].puts_style_offset(0, filename_offset[i] +
- PM_HEIGHT + 3, buf, STYLE_INVERT,0);
+ PM_HEIGHT + 3, buf, style,0);
}
else
{
@@ -1598,11 +1608,11 @@ bool recording_screen(bool no_source)
fmt_gain(SOUND_LEFT_GAIN,
global_settings.rec_left_gain,
buf2, sizeof(buf2)));
- if(global_settings.invert_cursor && ((1==cursor)||(2==cursor)))
+ if(global_settings.cursor_style && ((1==cursor)||(2==cursor)))
{
for(i = 0; i < screen_update; i++)
screens[i].puts_style_offset(0, filename_offset[i] +
- PM_HEIGHT + 3, buf, STYLE_INVERT,0);
+ PM_HEIGHT + 3, buf, style,0);
}
else
{
@@ -1616,11 +1626,11 @@ bool recording_screen(bool no_source)
fmt_gain(SOUND_RIGHT_GAIN,
global_settings.rec_right_gain,
buf2, sizeof(buf2)));
- if(global_settings.invert_cursor && ((1==cursor)||(3==cursor)))
+ if(global_settings.cursor_style && ((1==cursor)||(3==cursor)))
{
for(i = 0; i < screen_update; i++)
screens[i].puts_style_offset(0, filename_offset[i] +
- PM_HEIGHT + 4, buf, STYLE_INVERT,0);
+ PM_HEIGHT + 4, buf, style,0);
}
else
{
@@ -1701,11 +1711,11 @@ bool recording_screen(bool no_source)
global_settings.rec_right_gain)/2,
buf2, sizeof(buf2)));
- if(global_settings.invert_cursor && ((cursor==4) || (cursor==5)))
+ if(global_settings.cursor_style && ((cursor==4) || (cursor==5)))
{
for(i = 0; i < screen_update; i++)
screens[i].puts_style_offset(0, filename_offset[i] +
- PM_HEIGHT + line[i], buf, STYLE_INVERT,0);
+ PM_HEIGHT + line[i], buf, style,0);
}
else if (
global_settings.rec_source == AUDIO_SRC_MIC
@@ -1737,7 +1747,7 @@ bool recording_screen(bool no_source)
}
#endif /* HAVE_AGC */
- if(!global_settings.invert_cursor) {
+ if(!global_settings.cursor_style) {
switch(cursor)
{
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] =
.get_foreground=&lcd_get_foreground,
.set_background=&lcd_set_background,
.set_foreground=&lcd_set_foreground,
+#ifdef HAVE_LCD_COLOR
+ .set_selector_start=&lcd_set_selector_start,
+ .set_selector_end=&lcd_set_selector_end,
+ .set_selector_text=&lcd_set_selector_text,
+#endif
#endif /* LCD_DEPTH > 1 */
.update_rect=&lcd_update_rect,
.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
void (*set_background)(unsigned background);
void (*set_foreground)(unsigned foreground);
#endif /* (LCD_DEPTH > 1) || (LCD_REMOTE_DEPTH > 1) */
+#if defined(HAVE_LCD_COLOR)
+ void (*set_selector_start)(unsigned selector);
+ void (*set_selector_end)(unsigned selector);
+ void (*set_selector_text)(unsigned selector_text);
+#endif
void (*update_rect)(int x, int y, int width, int height);
void (*fillrect)(int x, int y, int width, int height);
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)
#ifdef HAVE_LCD_COLOR
screens[SCREEN_MAIN].set_foreground(global_settings.fg_color);
screens[SCREEN_MAIN].set_background(global_settings.bg_color);
+ screens[SCREEN_MAIN].set_selector_start(global_settings.lss_color);
+ screens[SCREEN_MAIN].set_selector_end(global_settings.lse_color);
+ screens[SCREEN_MAIN].set_selector_text(global_settings.lst_color);
#endif
#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
int contrast; /* lcd contrast */
#endif
bool invert; /* invert display */
- bool invert_cursor; /* invert the current file in dir browser and menu
- instead of using the default cursor */
+ int cursor_style; /* style of the selection cursor */
bool flip_display; /* turn display (and button layout) by 180 degrees */
int poweroff; /* power off timer */
int backlight_timeout; /* backlight off timeout: 0-18 0=never,
@@ -641,6 +640,9 @@ struct user_settings
#ifdef HAVE_LCD_COLOR
int bg_color; /* background color native format */
int fg_color; /* foreground color native format */
+ int lss_color; /* background color for the selector or start color for the gradient */
+ int lse_color; /* end color for the selector gradient */
+ int lst_color; /* color of the text for the selector */
#endif
bool party_mode; /* party mode - unstoppable music */
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[] = {
OFFON_SETTING(0,flip_display, LANG_FLIP_DISPLAY, false,"flip display", NULL),
#endif
/* display */
- BOOL_SETTING(F_TEMPVAR, invert_cursor, LANG_INVERT_CURSOR, true ,"invert cursor", off_on,
- LANG_INVERT_CURSOR_BAR, LANG_INVERT_CURSOR_POINTER, NULL),
+ CHOICE_SETTING(F_TEMPVAR|F_THEMESETTING, cursor_style, LANG_INVERT_CURSOR, 1,
+ #ifdef HAVE_LCD_COLOR
+ "selector type", "pointer,bar (inverse),bar (color),bar (gradient)",
+ NULL, 4,
+ ID2P(LANG_INVERT_CURSOR_POINTER), ID2P(LANG_INVERT_CURSOR_BAR),
+ ID2P(LANG_INVERT_CURSOR_COLOR), ID2P(LANG_INVERT_CURSOR_GRADIENT)),
+ #else
+ "selector type", "pointer,bar (inverse)", NULL, 2,
+ ID2P(LANG_INVERT_CURSOR_POINTER), ID2P(LANG_INVERT_CURSOR_BAR)),
+ #endif
OFFON_SETTING(F_THEMESETTING|F_TEMPVAR, statusbar,
LANG_STATUS_BAR, true,"statusbar", NULL),
OFFON_SETTING(0,scrollbar, LANG_SCROLL_BAR, true,"scrollbar", NULL),
@@ -625,6 +633,12 @@ const struct settings_list settings[] = {
"foreground color",NULL,UNUSED},
{F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.bg_color,-1,INT(LCD_DEFAULT_BG),
"background color",NULL,UNUSED},
+ {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.lss_color,-1,INT(LCD_DEFAULT_LS),
+ "line selector start color",NULL,UNUSED},
+ {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.lse_color,-1,INT(LCD_DEFAULT_BG),
+ "line selector end color",NULL,UNUSED},
+ {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.lst_color,-1,INT(LCD_DEFAULT_FG),
+ "line selector text color",NULL,UNUSED},
#endif
/* more playback */
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
Max Kelley
Alexander Eickhoff
Pinitnun Shanasabang
+Ken Fazzone
The libmad team
The 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;
#if !defined(TOSHIBA_GIGABEAT_F) || defined(SIMULATOR)
static unsigned fg_pattern IDATA_ATTR = LCD_DEFAULT_FG;
static unsigned bg_pattern IDATA_ATTR = LCD_DEFAULT_BG;
+static unsigned lss_pattern IDATA_ATTR = LCD_DEFAULT_LS;
+static unsigned lse_pattern IDATA_ATTR = LCD_DEFAULT_BG;
+static unsigned lst_pattern IDATA_ATTR = LCD_DEFAULT_FG;
#else
unsigned fg_pattern IDATA_ATTR = LCD_DEFAULT_FG;
unsigned bg_pattern IDATA_ATTR = LCD_DEFAULT_BG;
+unsigned lss_pattern IDATA_ATTR = LCD_DEFAULT_LS;
+unsigned lse_pattern IDATA_ATTR = LCD_DEFAULT_BG;
+unsigned lst_pattern IDATA_ATTR = LCD_DEFAULT_FG;
#endif
static int drawmode = DRMODE_SOLID;
@@ -103,6 +109,21 @@ unsigned lcd_get_background(void)
return bg_pattern;
}
+void lcd_set_selector_start(unsigned color)
+{
+ lss_pattern = color;
+}
+
+void lcd_set_selector_end(unsigned color)
+{
+ lse_pattern = color;
+}
+
+void lcd_set_selector_text(unsigned color)
+{
+ lst_pattern = color;
+}
+
void lcd_set_drawinfo(int mode, unsigned fg_color, unsigned bg_color)
{
lcd_set_drawmode(mode);
@@ -808,16 +829,48 @@ void lcd_puts_style_offset(int x, int y, const unsigned char *str, int style,
ypos = ymargin + y*h;
drawmode = (style & STYLE_INVERT) ?
(DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID;
- if (style & STYLE_COLORED) {
+ if (style & STYLE_GRADIENT || style & STYLE_COLORBAR) {
+ fg_pattern = lss_pattern;
+ }
+ else if (style & STYLE_COLORED) {
if (drawmode == DRMODE_SOLID)
fg_pattern = style & STYLE_COLOR_MASK;
else
bg_pattern = style & STYLE_COLOR_MASK;
}
- lcd_putsxyofs(xpos, ypos, offset, str);
drawmode ^= DRMODE_INVERSEVID;
xrect = xpos + MAX(w - offset, 0);
- lcd_fillrect(xrect, ypos, LCD_WIDTH - xrect, h);
+
+ if (style & STYLE_GRADIENT) {
+ int h_r = RGB_UNPACK_RED(lss_pattern) << 16;
+ int h_b = RGB_UNPACK_BLUE(lss_pattern) << 16;
+ int h_g = RGB_UNPACK_GREEN(lss_pattern) << 16;
+ int rstep = (h_r - ((signed)RGB_UNPACK_RED(lse_pattern) << 16)) / h;
+ int gstep = (h_g - ((signed)RGB_UNPACK_GREEN(lse_pattern) << 16)) / h;
+ int bstep = (h_b - ((signed)RGB_UNPACK_BLUE(lse_pattern) << 16)) / h;
+ int count;
+
+ drawmode = DRMODE_FG;
+ for(count = 0; count < h; count++) {
+ lcd_hline(xpos, LCD_WIDTH, ypos + count);
+ h_r -= rstep;
+ h_g -= gstep;
+ h_b -= bstep;
+ fg_pattern = LCD_RGBPACK(h_r >> 16, h_g >> 16, h_b >> 16);
+ }
+ fg_pattern = lst_pattern;
+ }
+ else if (style & STYLE_COLORBAR) {
+ drawmode = DRMODE_FG;
+ lcd_fillrect(xpos, ypos, LCD_WIDTH - xpos, h);
+ fg_pattern = lst_pattern;
+ }
+ else {
+ lcd_fillrect(xrect, ypos, LCD_WIDTH - xrect, h);
+ drawmode = (style & STYLE_INVERT) ?
+ (DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID;
+ }
+ lcd_putsxyofs(xpos, ypos, offset, str);
drawmode = lastmode;
fg_pattern = oldfgcolor;
bg_pattern = oldbgcolor;
@@ -852,7 +905,13 @@ void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *string,
s->start_tick = current_tick + lcd_scroll_info.delay;
s->invert = false;
if (style & STYLE_INVERT) {
- s->invert = true;
+ s->invert = 1;
+ }
+ else if (style & STYLE_COLORBAR) {
+ s->invert = 2;
+ }
+ else if (style & STYLE_GRADIENT) {
+ s->invert = 3;
}
lcd_puts_style_offset(x,y,string,style,offset);
@@ -961,8 +1020,37 @@ void lcd_scroll_fn(void)
}
lastmode = drawmode;
- drawmode = s->invert ?
+ drawmode = s->invert == 1 ?
(DRMODE_SOLID|DRMODE_INVERSEVID) : DRMODE_SOLID;
+ if (s->invert == 2) {
+ fg_pattern = lss_pattern;
+ drawmode = DRMODE_FG;
+ lcd_fillrect(0, ypos, LCD_WIDTH, pf->height);
+ fg_pattern = lst_pattern;
+ }
+ else if (s->invert == 3) {
+ int h_r = RGB_UNPACK_RED(lss_pattern) << 16;
+ int h_b = RGB_UNPACK_BLUE(lss_pattern) << 16;
+ int h_g = RGB_UNPACK_GREEN(lss_pattern) << 16;
+ int rstep = (h_r - ((signed)RGB_UNPACK_RED(lse_pattern) << 16))
+ / pf->height;
+ int gstep = (h_g - ((signed)RGB_UNPACK_GREEN(lse_pattern) << 16))
+ / pf->height;
+ int bstep = (h_b - ((signed)RGB_UNPACK_BLUE(lse_pattern) << 16))
+ / pf->height;
+ unsigned int count;
+
+ fg_pattern = lss_pattern;
+ drawmode = DRMODE_FG;
+ for(count = 0; count < pf->height; count++) {
+ lcd_hline(0, LCD_WIDTH , ypos + count);
+ h_r -= rstep;
+ h_g -= gstep;
+ h_b -= bstep;
+ fg_pattern = LCD_RGBPACK(h_r >> 16, h_g >> 16, h_b >> 16);
+ }
+ fg_pattern = lst_pattern;
+ }
lcd_putsxyofs(xpos, ypos, s->offset, s->line);
drawmode = lastmode;
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 @@
#define STYLE_DEFAULT 0x00000000
#define STYLE_INVERT 0x20000000
#define STYLE_COLORED 0x10000000
+#define STYLE_COLORBAR 0x40000000
+#define STYLE_GRADIENT 0x80000000
#define STYLE_COLOR_MASK 0x0000FFFF
#ifdef SIMULATOR
@@ -233,6 +235,7 @@ static inline unsigned lcd_color_to_native(unsigned color)
#define LCD_WHITE LCD_RGBPACK(255, 255, 255)
#define LCD_DEFAULT_FG LCD_BLACK
#define LCD_DEFAULT_BG LCD_RGBPACK(182, 198, 229) /* rockbox blue */
+#define LCD_DEFAULT_LS LCD_WHITE
#elif LCD_DEPTH > 1 /* greyscale */
@@ -355,6 +358,11 @@ extern void lcd_set_foreground(unsigned foreground);
extern unsigned lcd_get_foreground(void);
extern void lcd_set_background(unsigned background);
extern unsigned lcd_get_background(void);
+#ifdef HAVE_LCD_COLOR
+extern void lcd_set_selector_start(unsigned selector);
+extern void lcd_set_selector_end(unsigned selector);
+extern void lcd_set_selector_text(unsigned selector_text);
+#endif
extern void lcd_set_drawinfo(int mode, unsigned foreground,
unsigned background);
void 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
int startx;
#ifdef HAVE_LCD_BITMAP
int width; /* length of line in pixels */
- bool invert; /* invert the scrolled text */
+#ifdef HAVE_LCD_COLOR
+ int invert; /* invert the scrolled text */
+#else
+ bool invert;
#endif
+#endif/* HAVE_LCD_BITMAP */
bool backward; /* scroll presently forward or backward? */
bool bidir;
long start_tick;