diff options
author | Thomas Martitz <kugel@rockbox.org> | 2013-04-16 23:50:43 +0200 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2014-01-07 14:13:48 +0100 |
commit | deb6ac3693a6fb5c47abd0c32f966f5e38b6a68a (patch) | |
tree | 08cb6563035e9aca18618548c86b10a9d39a5cbe /firmware/drivers | |
parent | 36e469db8bb7789c89ff642b51c1471669b830f5 (diff) | |
download | rockbox-deb6ac3693a6fb5c47abd0c32f966f5e38b6a68a.tar.gz rockbox-deb6ac3693a6fb5c47abd0c32f966f5e38b6a68a.zip |
lcd-16bit: Move lcd_gradient_fillrect/_part() to lcd-16bit-common.c.
Change-Id: I6b2d2ba73464610556cfd9ecec52fc62adb007c7
Diffstat (limited to 'firmware/drivers')
-rw-r--r-- | firmware/drivers/lcd-16bit-common.c | 66 | ||||
-rw-r--r-- | firmware/drivers/lcd-bitmap-common.c | 70 |
2 files changed, 66 insertions, 70 deletions
diff --git a/firmware/drivers/lcd-16bit-common.c b/firmware/drivers/lcd-16bit-common.c index 99cbe489fc..9d36499418 100644 --- a/firmware/drivers/lcd-16bit-common.c +++ b/firmware/drivers/lcd-16bit-common.c @@ -1362,3 +1362,69 @@ void lcd_blit_yuv(unsigned char * const src[3], lcd_update_rect(LCD_WIDTH - y - height, x, height, width); #endif } + +/* Fill a rectangle with a gradient. This function draws only the partial + * gradient. It assumes the original gradient is src_height high and skips + * the first few rows. This is useful for drawing only the bottom half of + * a full gradient. + * + * height == src_height and row_skip == 0 will draw the full gradient + * + * x, y, width, height - dimensions describing the rectangle + * start_rgb - beginning color of the gradient + * end_rgb - end color of the gradient + * src_height - assumed original height (only height rows will be drawn) + * row_skip - how many rows of the original gradient to skip + */ +void lcd_gradient_fillrect_part(int x, int y, int width, int height, + unsigned start_rgb, unsigned end_rgb, int src_height, int row_skip) +{ + int old_pattern = current_vp->fg_pattern; + int step_mul, i; + int x1, x2; + x1 = x; + x2 = x + width; + + if (height == 0) return; + + step_mul = (1 << 16) / src_height; + int h_r = RGB_UNPACK_RED(start_rgb); + int h_g = RGB_UNPACK_GREEN(start_rgb); + int h_b = RGB_UNPACK_BLUE(start_rgb); + int rstep = (h_r - RGB_UNPACK_RED(end_rgb)) * step_mul; + int gstep = (h_g - RGB_UNPACK_GREEN(end_rgb)) * step_mul; + int bstep = (h_b - RGB_UNPACK_BLUE(end_rgb)) * step_mul; + h_r = (h_r << 16) + (1 << 15); + h_g = (h_g << 16) + (1 << 15); + h_b = (h_b << 16) + (1 << 15); + + if (row_skip > 0) + { + h_r -= rstep * row_skip; + h_g -= gstep * row_skip; + h_b -= bstep * row_skip; + } + + for(i = y; i < y + height; i++) { + current_vp->fg_pattern = LCD_RGBPACK(h_r >> 16, h_g >> 16, h_b >> 16); + lcd_hline(x1, x2, i); + h_r -= rstep; + h_g -= gstep; + h_b -= bstep; + } + + current_vp->fg_pattern = old_pattern; +} + +/* Fill a rectangle with a gradient. The gradient's color will fade from + * start_rgb to end_rgb over the height of the rectangle + * + * x, y, width, height - dimensions describing the rectangle + * start_rgb - beginning color of the gradient + * end_rgb - end color of the gradient + */ +void lcd_gradient_fillrect(int x, int y, int width, int height, + unsigned start_rgb, unsigned end_rgb) +{ + lcd_gradient_fillrect_part(x, y, width, height, start_rgb, end_rgb, height, 0); +} diff --git a/firmware/drivers/lcd-bitmap-common.c b/firmware/drivers/lcd-bitmap-common.c index e37da51a1b..81decadbcb 100644 --- a/firmware/drivers/lcd-bitmap-common.c +++ b/firmware/drivers/lcd-bitmap-common.c @@ -40,76 +40,6 @@ #define MAIN_LCD #endif -#if defined(MAIN_LCD) && defined(HAVE_LCD_COLOR) - -/* Fill a rectangle with a gradient. This function draws only the partial - * gradient. It assumes the original gradient is src_height high and skips - * the first few rows. This is useful for drawing only the bottom half of - * a full gradient. - * - * height == src_height and row_skip == 0 will draw the full gradient - * - * x, y, width, height - dimensions describing the rectangle - * start_rgb - beginning color of the gradient - * end_rgb - end color of the gradient - * src_height - assumed original height (only height rows will be drawn) - * row_skip - how many rows of the original gradient to skip - */ -void lcd_gradient_fillrect_part(int x, int y, int width, int height, - unsigned start_rgb, unsigned end_rgb, int src_height, int row_skip) -{ - int old_pattern = current_vp->fg_pattern; - int step_mul, i; - int x1, x2; - x1 = x; - x2 = x + width; - - if (height == 0) return; - - step_mul = (1 << 16) / src_height; - int h_r = RGB_UNPACK_RED(start_rgb); - int h_g = RGB_UNPACK_GREEN(start_rgb); - int h_b = RGB_UNPACK_BLUE(start_rgb); - int rstep = (h_r - RGB_UNPACK_RED(end_rgb)) * step_mul; - int gstep = (h_g - RGB_UNPACK_GREEN(end_rgb)) * step_mul; - int bstep = (h_b - RGB_UNPACK_BLUE(end_rgb)) * step_mul; - h_r = (h_r << 16) + (1 << 15); - h_g = (h_g << 16) + (1 << 15); - h_b = (h_b << 16) + (1 << 15); - - if (row_skip > 0) - { - h_r -= rstep * row_skip; - h_g -= gstep * row_skip; - h_b -= bstep * row_skip; - } - - for(i = y; i < y + height; i++) { - current_vp->fg_pattern = LCD_RGBPACK(h_r >> 16, h_g >> 16, h_b >> 16); - lcd_hline(x1, x2, i); - h_r -= rstep; - h_g -= gstep; - h_b -= bstep; - } - - current_vp->fg_pattern = old_pattern; -} - -/* Fill a rectangle with a gradient. The gradient's color will fade from - * start_rgb to end_rgb over the height of the rectangle - * - * x, y, width, height - dimensions describing the rectangle - * start_rgb - beginning color of the gradient - * end_rgb - end color of the gradient - */ -void lcd_gradient_fillrect(int x, int y, int width, int height, - unsigned start_rgb, unsigned end_rgb) -{ - lcd_gradient_fillrect_part(x, y, width, height, start_rgb, end_rgb, height, 0); -} - -#endif - void LCDFN(set_framebuffer)(FBFN(data) *fb) { if (fb) |