From 186623e7092be0b7c4cb7b547a7258460b9da621 Mon Sep 17 00:00:00 2001 From: Greg White Date: Thu, 18 Jan 2007 02:29:58 +0000 Subject: Move mono DRMODE optimizations from Gigabeat to all 16-bit targets git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12062 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/lcd-16bit.c | 145 +++++++++++++++++++++++-------------------- 1 file changed, 79 insertions(+), 66 deletions(-) (limited to 'firmware/drivers/lcd-16bit.c') diff --git a/firmware/drivers/lcd-16bit.c b/firmware/drivers/lcd-16bit.c index 54601c43bb..a035ea2d3a 100644 --- a/firmware/drivers/lcd-16bit.c +++ b/firmware/drivers/lcd-16bit.c @@ -546,79 +546,92 @@ void lcd_fillrect(int x, int y, int width, int height) /* Draw a partial monochrome bitmap */ -#if !defined(TOSHIBA_GIGABEAT_F) || defined(SIMULATOR) void lcd_mono_bitmap_part(const unsigned char *src, int src_x, int src_y, int stride, int x, int y, int width, int height) ICODE_ATTR; void lcd_mono_bitmap_part(const unsigned char *src, int src_x, int src_y, int stride, int x, int y, int width, int height) { - const unsigned char *src_end; - fb_data *dst, *dst_end; - lcd_fastpixelfunc_type *fgfunc; - lcd_fastpixelfunc_type *bgfunc; - - /* nothing to draw? */ - if ((width <= 0) || (height <= 0) || (x >= LCD_WIDTH) || (y >= LCD_HEIGHT) - || (x + width <= 0) || (y + height <= 0)) - return; - - /* clipping */ - if (x < 0) - { - width += x; - src_x -= x; - x = 0; - } - if (y < 0) - { - height += y; - src_y -= y; - y = 0; - } - if (x + width > LCD_WIDTH) - width = LCD_WIDTH - x; - if (y + height > LCD_HEIGHT) - height = LCD_HEIGHT - y; - - src += stride * (src_y >> 3) + src_x; /* move starting point */ - src_y &= 7; - src_end = src + width; - - dst = LCDADDR(x, y); - fgfunc = lcd_fastpixelfuncs[drawmode]; - bgfunc = lcd_fastpixelfuncs[drawmode ^ DRMODE_INVERSEVID]; - - do - { - const unsigned char *src_col = src++; - unsigned data = *src_col >> src_y; - fb_data *dst_col = dst++; - int numbits = 8 - src_y; - - dst_end = dst_col + height * LCD_WIDTH; - do - { - if (data & 0x01) - fgfunc(dst_col); - else - bgfunc(dst_col); - - dst_col += LCD_WIDTH; - - data >>= 1; - if (--numbits == 0) - { - src_col += stride; - data = *src_col; - numbits = 8; - } - } - while (dst_col < dst_end); - } - while (src < src_end); + const unsigned char *src_end; + fb_data *dst, *dst_end; + + /* nothing to draw? */ + if ((width <= 0) || (height <= 0) || (x >= LCD_WIDTH) || (y >= LCD_HEIGHT) + || (x + width <= 0) || (y + height <= 0)) + return; + + /* clipping */ + if (x < 0) + { + width += x; + src_x -= x; + x = 0; + } + if (y < 0) + { + height += y; + src_y -= y; + y = 0; + } + if (x + width > LCD_WIDTH) + width = LCD_WIDTH - x; + if (y + height > LCD_HEIGHT) + height = LCD_HEIGHT - y; + + src += stride * (src_y >> 3) + src_x; /* move starting point */ + src_y &= 7; + src_end = src + width; + + dst = LCDADDR(x, y); + int drawmode = lcd_get_drawmode(); + fb_data *backdrop = lcd_get_backdrop(); + bool has_backdrop = backdrop ? true : false; + backdrop = backdrop + y * LCD_WIDTH + x; + lcd_fastpixelfunc_type *fgfunc = lcd_fastpixelfuncs[drawmode];; + lcd_fastpixelfunc_type *bgfunc = lcd_fastpixelfuncs[drawmode ^ DRMODE_INVERSEVID];; + do { + const unsigned char *src_col = src++; + unsigned data = *src_col >> src_y; + fb_data *dst_col = dst++; + int numbits = 8 - src_y; + fb_data *backdrop_col = backdrop++; + dst_end = dst_col + height * LCD_WIDTH; + do { + switch(drawmode) { + case DRMODE_SOLID: + if (data & 0x01) + *dst_col = fg_pattern; + else + *dst_col = has_backdrop ? *backdrop_col : bg_pattern; + break; + case DRMODE_FG: + if (data & 0x01) + *dst_col = fg_pattern; + break; + case (DRMODE_SOLID|DRMODE_INVERSEVID): + if(data & 0x01) + *dst_col = has_backdrop ? *backdrop_col : bg_pattern; + else + *dst_col = fg_pattern; + break; + default: + if (data & 0x01) + fgfunc(dst_col); + else + bgfunc(dst_col); + break; + }; + dst_col += LCD_WIDTH; + backdrop_col += LCD_WIDTH; + data >>= 1; + if (--numbits == 0) { + src_col += stride; + data = *src_col; + numbits = 8; + } + } while (dst_col < dst_end); + } while (src < src_end); } -#endif /* Draw a full monochrome bitmap */ void lcd_mono_bitmap(const unsigned char *src, int x, int y, int width, int height) { -- cgit v1.2.3