1
0
Fork 0
forked from len0rd/rockbox

fixed lcd_bitmap, again. Works for y%8 != 0 as well now.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@374 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Felix Arends 2002-05-01 17:05:55 +00:00
parent fa16227b25
commit fea4cfa41a

View file

@ -487,46 +487,41 @@ void lcd_puts(int x, int y, char *str, int font)
void lcd_bitmap (unsigned char *src, int x, int y, int nx, int ny, void lcd_bitmap (unsigned char *src, int x, int y, int nx, int ny,
bool clear) bool clear)
{ {
unsigned char *dst;
unsigned char *dst2; unsigned char *dst2;
unsigned int data, mask, mask2, mask3, mask4; unsigned int mask1, mask2;
int shift; int shift;
int nny, _nnx = x, _nny = y; int nny, _nnx = x, _nny = y;
for (nny = ny; nny > 0; nny -= 8, _nny += 8) for (nny = ny; nny > 0; nny -= 8, _nny += 8)
{ {
x = _nnx; y = _nny; ny = 8; x = _nnx; y = _nny; ny = (nny >= 8)?8:nny;
dst2 = &display[x][y/8]; dst2 = &display[x][y/8];
shift = y & 7; shift = y & 7;
mask1 = 0xFF >> (8 - shift);
mask2 = ~mask1;
ny += shift; ny += shift;
/* Calculate bit masks */ /* Loop for each column */
mask4 = ~(0xfe << ((ny-1) & 7));
if (clear) if (clear)
{ {
mask = ~(0xff << shift); for (x = 0; x < nx; x++)
mask2 = 0; {
mask3 = ~mask4; *dst2 = (*dst2 & mask1) | ((*(src)) << shift);
if (ny <= 8) *(dst2 + 1) = (*(dst2+1) & mask2) | ((*(src++)) >> (8 - shift));
mask3 |= mask; dst2 += LCD_HEIGHT/8;
}
} }
else else
mask = mask2 = mask3 = 0xff;
/* Loop for each column */
for (x = 0; x < nx; x++)
{ {
dst = dst2; for (x = 0; x < nx; x++)
dst2 += LCD_HEIGHT/8; {
data = 0; *dst2 |= (*(src)) << shift;
y = 0; *(dst2 + 1) |= (*(src++)) >> (8 - shift);
dst2 += LCD_HEIGHT/8;
/* Last partial row */ }
if (y + shift < ny)
data |= *src++ << shift;
*dst = (*dst & mask3) ^ (data & mask4);
} }
} }
} }