1
0
Fork 0
forked from len0rd/rockbox

Grayscale lib: Working screendump on iPod (target + sim).

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10478 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jens Arnold 2006-08-07 21:58:32 +00:00
parent 87902874c9
commit 754e173c25

View file

@ -29,7 +29,7 @@
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
#include "gray.h" #include "gray.h"
#ifdef CPU_PP #if defined(CPU_PP) && defined(HAVE_ADJUSTABLE_CPU_FREQ)
#define NEED_BOOST #define NEED_BOOST
#endif #endif
@ -1469,10 +1469,15 @@ static const unsigned char bmpheader[] =
static void gray_screendump_hook(int fd) static void gray_screendump_hook(int fd)
{ {
int i; int i;
int x, y, by; int x, y;
int gx, gy, mask; int gx, gy, mask;
#if LCD_PIXELFORMAT == HORIZONTAL_PACKING
unsigned data;
#else
int by;
#if LCD_DEPTH == 2 #if LCD_DEPTH == 2
int shift; int shift;
#endif
#endif #endif
unsigned char *clut_entry; unsigned char *clut_entry;
unsigned char *lcdptr; unsigned char *lcdptr;
@ -1499,6 +1504,75 @@ static void gray_screendump_hook(int fd)
_gray_rb->memset(linebuf, 0, BMP_LINESIZE); _gray_rb->memset(linebuf, 0, BMP_LINESIZE);
gy = y - _gray_info.y; gy = y - _gray_info.y;
#if LCD_PIXELFORMAT == HORIZONTAL_PACKING
#if LCD_DEPTH == 2
lcdptr = _gray_rb->lcd_framebuffer + MULU16(LCD_FBWIDTH, y);
if ((unsigned) gy < (unsigned) _gray_info.height)
{
/* line contains greyscale (and maybe b&w) graphics */
#ifndef SIMULATOR
unsigned char *grayptr = _gray_info.plane_data
+ MULU16(_gray_info.bwidth, gy);
#endif
for (x = 0; x < LCD_WIDTH; x += 4)
{
gx = x - _gray_info.x;
if ((unsigned)gx < (unsigned)_gray_info.width)
{
#ifdef SIMULATOR
data = MULU16(gy, _gray_info.width) + gx;
for (i = 0; i < 4; i++)
linebuf[x + i] = BMP_FIXEDCOLORS + _gray_info.depth
- _gray_info.cur_buffer[data + i];
#else
mask = 0x80 >> (gx & 7);
for (i = 0; i < 4; i++)
{
int j;
int idx = BMP_FIXEDCOLORS;
unsigned char *grayptr2 = grayptr + (gx >> 3);
for (j = _gray_info.depth; j > 0; j--)
{
if (*grayptr2 & mask)
idx++;
grayptr2 += _gray_info.plane_size;
}
linebuf[x + i] = idx;
mask >>= 1;
}
#endif
}
else
{
data = *lcdptr;
linebuf[x] = (data >> 6) & 3;
linebuf[x + 1] = (data >> 4) & 3;
linebuf[x + 2] = (data >> 2) & 3;
linebuf[x + 3] = data & 3;
}
lcdptr++;
}
}
else
{
/* line contains only b&w graphics */
for (x = 0; x < LCD_WIDTH; x += 4)
{
data = *lcdptr++;
linebuf[x] = (data >> 6) & 3;
linebuf[x + 1] = (data >> 4) & 3;
linebuf[x + 2] = (data >> 2) & 3;
linebuf[x + 3] = data & 3;
}
}
#endif /* LCD_DEPTH */
#else /* LCD_PIXELFORMAT == VERTICAL_PACKING */
#if LCD_DEPTH == 1 #if LCD_DEPTH == 1
mask = 1 << (y & 7); mask = 1 << (y & 7);
by = y >> 3; by = y >> 3;
@ -1599,6 +1673,7 @@ static void gray_screendump_hook(int fd)
linebuf[x] = (*lcdptr++ >> shift) & 3; linebuf[x] = (*lcdptr++ >> shift) & 3;
} }
#endif /* LCD_DEPTH */ #endif /* LCD_DEPTH */
#endif /* LCD_PIXELFORMAT */
_gray_rb->write(fd, linebuf, BMP_LINESIZE); _gray_rb->write(fd, linebuf, BMP_LINESIZE);
} }