1
0
Fork 0
forked from len0rd/rockbox

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
This commit is contained in:
Greg White 2007-01-18 02:29:58 +00:00
parent 10dfc06163
commit 186623e709
2 changed files with 75 additions and 150 deletions

View file

@ -546,7 +546,6 @@ 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;
@ -555,8 +554,6 @@ void lcd_mono_bitmap_part(const unsigned char *src, int src_x, int src_y,
{
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)
@ -586,39 +583,55 @@ void lcd_mono_bitmap_part(const unsigned char *src, int src_x, int src_y,
src_end = src + width;
dst = LCDADDR(x, y);
fgfunc = lcd_fastpixelfuncs[drawmode];
bgfunc = lcd_fastpixelfuncs[drawmode ^ DRMODE_INVERSEVID];
do
{
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
{
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)
{
if (--numbits == 0) {
src_col += stride;
data = *src_col;
numbits = 8;
}
} while (dst_col < dst_end);
} while (src < src_end);
}
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)
{

View file

@ -293,94 +293,6 @@ void lcd_bitmap_transparent_part(const fb_data *src, int src_x, int src_y,
: : "r" (src), "r" (dst), "r" (width), "r" (dst_end), "r" (stride), "r" (transcolor) : "r0", "r1" );
}
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;
/* 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);
}
#define CSUB_X 2
#define CSUB_Y 2