1
0
Fork 0
forked from len0rd/rockbox

Colour LCD driver: * Bring non-backdrop rendering back up to speed. * Speed up rendering with backdrop. * Restore correct behaviour of lcd_clear_display().

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8549 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jens Arnold 2006-02-03 21:11:51 +00:00
parent 3f66e8edff
commit 3c17330af6
2 changed files with 44 additions and 51 deletions

View file

@ -38,8 +38,8 @@
/*** globals ***/
fb_data lcd_framebuffer[LCD_HEIGHT][LCD_WIDTH] __attribute__ ((aligned (16)));
fb_data* lcd_backdrop IDATA_ATTR = NULL;
int lcd_backdrop_offset = NULL;
static fb_data* lcd_backdrop = NULL;
static int lcd_backdrop_offset IDATA_ATTR = 0;
static unsigned fg_pattern IDATA_ATTR = LCD_DEFAULT_FG;
static unsigned bg_pattern IDATA_ATTR = LCD_DEFAULT_BG;
@ -108,18 +108,6 @@ void lcd_set_background(unsigned color)
bg_pattern = color;
}
void lcd_set_backdrop(fb_data* backdrop)
{
lcd_backdrop = backdrop;
if (backdrop)
lcd_backdrop_offset = (int)backdrop - (int)&lcd_framebuffer[0][0];
}
fb_data* lcd_get_backdrop(void)
{
return lcd_backdrop;
}
unsigned lcd_get_background(void)
{
return bg_pattern;
@ -192,46 +180,65 @@ static void nopixel(fb_data *address)
(void)address;
}
lcd_fastpixelfunc_type* const lcd_fastpixelfuncs[8] = {
lcd_fastpixelfunc_type* const lcd_fastpixelfuncs_bgcolor[8] = {
flippixel, nopixel, setpixel, setpixel,
nopixel, clearpixel, nopixel, clearpixel
};
lcd_fastpixelfunc_type* const lcd_fastimgpixelfuncs[8] = {
lcd_fastpixelfunc_type* const lcd_fastpixelfuncs_backdrop[8] = {
flippixel, nopixel, setpixel, setpixel,
nopixel, clearimgpixel, nopixel, clearimgpixel
};
lcd_fastpixelfunc_type* const * lcd_fastpixelfuncs = lcd_fastpixelfuncs_bgcolor;
void lcd_set_backdrop(fb_data* backdrop)
{
lcd_backdrop = backdrop;
if (backdrop)
{
lcd_backdrop_offset = (int)backdrop - (int)&lcd_framebuffer[0][0];
lcd_fastpixelfuncs = lcd_fastpixelfuncs_backdrop;
}
else
{
lcd_backdrop_offset = 0;
lcd_fastpixelfuncs = lcd_fastpixelfuncs_bgcolor;
}
}
fb_data* lcd_get_backdrop(void)
{
return lcd_backdrop;
}
/*** drawing functions ***/
/* Clear the whole display */
void lcd_clear_display(void)
{
fb_data *dst = LCDADDR(0, 0);
fb_data *dst_end = dst + LCD_HEIGHT*LCD_WIDTH;
if (lcd_backdrop) {
if (!lcd_backdrop || (drawmode & DRMODE_INVERSEVID))
{
fb_data bits = (drawmode & DRMODE_INVERSEVID) ? fg_pattern : bg_pattern;
fb_data *dst_end = dst + LCD_HEIGHT*LCD_WIDTH;
do
clearimgpixel(dst++);
while (dst < dst_end);
} else {
do
clearpixel(dst++);
*dst++ = bits;
while (dst < dst_end);
}
else
{
memcpy(dst, lcd_backdrop, sizeof(lcd_framebuffer));
}
scrolling_lines = 0;
}
/* Set a single pixel */
void lcd_drawpixel(int x, int y)
{
if (((unsigned)x < LCD_WIDTH) && ((unsigned)y < LCD_HEIGHT)) {
if (lcd_backdrop) {
lcd_fastimgpixelfuncs[drawmode](LCDADDR(x, y));
} else {
lcd_fastpixelfuncs[drawmode](LCDADDR(x, y));
}
}
if (((unsigned)x < LCD_WIDTH) && ((unsigned)y < LCD_HEIGHT))
lcd_fastpixelfuncs[drawmode](LCDADDR(x, y));
}
/* Draw a line */
@ -243,10 +250,7 @@ void lcd_drawline(int x1, int y1, int x2, int y2)
int d, dinc1, dinc2;
int x, xinc1, xinc2;
int y, yinc1, yinc2;
lcd_fastpixelfunc_type *pfunc = (lcd_backdrop ?
lcd_fastimgpixelfuncs[drawmode] :
lcd_fastpixelfuncs[drawmode]);
lcd_fastpixelfunc_type *pfunc = lcd_fastpixelfuncs[drawmode];
deltax = abs(x2 - x1);
deltay = abs(y2 - y1);
@ -313,9 +317,7 @@ void lcd_hline(int x1, int x2, int y)
{
int x;
fb_data *dst, *dst_end;
lcd_fastpixelfunc_type *pfunc = (lcd_backdrop ?
lcd_fastimgpixelfuncs[drawmode] :
lcd_fastpixelfuncs[drawmode]);
lcd_fastpixelfunc_type *pfunc = lcd_fastpixelfuncs[drawmode];
/* direction flip */
if (x2 < x1)
@ -348,9 +350,7 @@ void lcd_vline(int x, int y1, int y2)
{
int y;
fb_data *dst, *dst_end;
lcd_fastpixelfunc_type *pfunc = (lcd_backdrop ?
lcd_fastimgpixelfuncs[drawmode] :
lcd_fastpixelfuncs[drawmode]);
lcd_fastpixelfunc_type *pfunc = lcd_fastpixelfuncs[drawmode];
/* direction flip */
if (y2 < y1)
@ -400,9 +400,7 @@ void lcd_drawrect(int x, int y, int width, int height)
void lcd_fillrect(int x, int y, int width, int height)
{
fb_data *dst, *dst_end;
lcd_fastpixelfunc_type *pfunc = (lcd_backdrop ?
lcd_fastimgpixelfuncs[drawmode] :
lcd_fastpixelfuncs[drawmode]);
lcd_fastpixelfunc_type *pfunc = lcd_fastpixelfuncs[drawmode];
/* nothing to draw? */
if ((width <= 0) || (height <= 0) || (x >= LCD_WIDTH) || (y >= LCD_HEIGHT)
@ -494,13 +492,8 @@ void lcd_mono_bitmap_part(const unsigned char *src, int src_x, int src_y,
src_end = src + width;
dst = LCDADDR(x, y);
if (lcd_backdrop) {
fgfunc = lcd_fastimgpixelfuncs[drawmode];
bgfunc = lcd_fastimgpixelfuncs[drawmode ^ DRMODE_INVERSEVID];
} else {
fgfunc = lcd_fastpixelfuncs[drawmode];
bgfunc = lcd_fastpixelfuncs[drawmode ^ DRMODE_INVERSEVID];
}
fgfunc = lcd_fastpixelfuncs[drawmode];
bgfunc = lcd_fastpixelfuncs[drawmode ^ DRMODE_INVERSEVID];
do
{

View file

@ -239,7 +239,7 @@ extern void lcd_puts_scroll_style_offset(int x, int y, const unsigned char *stri
extern lcd_pixelfunc_type* const lcd_pixelfuncs[8];
extern lcd_blockfunc_type* const lcd_blockfuncs[8];
#if LCD_DEPTH >= 8
extern lcd_fastpixelfunc_type* const lcd_fastpixelfuncs[8];
extern lcd_fastpixelfunc_type* const * lcd_fastpixelfuncs;
#endif
extern void lcd_drawpixel(int x, int y);