diff options
author | Nicolas Pennequin <nicolas.pennequin@free.fr> | 2007-09-27 15:42:55 +0000 |
---|---|---|
committer | Nicolas Pennequin <nicolas.pennequin@free.fr> | 2007-09-27 15:42:55 +0000 |
commit | f3b015f73b29f2d3514c32a9b8b8f0338b52e358 (patch) | |
tree | 65e1694745947a9a7d673811d12155f3b2a03019 /firmware | |
parent | 5353473b723749a7cd92d72e94423b74058287dc (diff) |
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')
-rw-r--r-- | firmware/drivers/lcd-16bit.c | 98 | ||||
-rw-r--r-- | firmware/export/lcd.h | 8 | ||||
-rw-r--r-- | firmware/export/scroll_engine.h | 6 |
3 files changed, 106 insertions, 6 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; #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; |