diff options
| author | Jens Arnold <amiconn@rockbox.org> | 2005-07-06 22:58:02 +0000 |
|---|---|---|
| committer | Jens Arnold <amiconn@rockbox.org> | 2005-07-06 22:58:02 +0000 |
| commit | f894a4c2691fbde1758a05407cb5eadcaec4a6c8 (patch) | |
| tree | 46cb7ce63c794020175ab251cf0299663be8bf3c /apps/misc.c | |
| parent | 1076eb1d2720b88757616f642be0c39c6a3b76df (diff) | |
| download | rockbox-f894a4c2691fbde1758a05407cb5eadcaec4a6c8.zip rockbox-f894a4c2691fbde1758a05407cb5eadcaec4a6c8.tar.gz rockbox-f894a4c2691fbde1758a05407cb5eadcaec4a6c8.tar.bz2 rockbox-f894a4c2691fbde1758a05407cb5eadcaec4a6c8.tar.xz | |
4-shades greyscale graphics core for iriver H1x0. 4-grey rockbox logo and light grey background in splash() boxes. Simplified the splash() box creation as the new graphics core does clipping. Adapted screendump feature and added flexible preprocessing to construct the bmp header. Rockboy now uses 4-grey mode as well. 4-grey support for win32 simulator. Fixed win32 player sim to not use double bitmap conversion via a recorder-like framebuffer, and correctly display double-height text. X11 simulator temporarily adapted. The display won't be distorted, but it still shows b&w only.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7046 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/misc.c')
| -rw-r--r-- | apps/misc.c | 105 |
1 files changed, 86 insertions, 19 deletions
diff --git a/apps/misc.c b/apps/misc.c index 055bcd2..9a89015 100644 --- a/apps/misc.c +++ b/apps/misc.c @@ -136,35 +136,81 @@ int read_line(int fd, char* buffer, int buffer_size) } #ifdef HAVE_LCD_BITMAP -extern unsigned char lcd_framebuffer[LCD_HEIGHT/8][LCD_WIDTH]; -static const unsigned char bmpheader[] = -{ - 0x42, 0x4d, 0x3e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, - 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, LCD_WIDTH, 0x00, 0x00, 0x00, LCD_HEIGHT, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, -#if LCD_WIDTH == 160 - 0x00, 0x00, 0x00, 0x0a, + +#if LCD_DEPTH <= 8 +#define BMP_NUMCOLORS (1 << LCD_DEPTH) #else - 0x00, 0x00, 0x00, 0x04, +#define BMP_NUMCOLORS 0 #endif - 0x00, 0x00, 0xc4, 0x0e, 0x00, 0x00, 0xc4, 0x0e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -#ifdef IRIVER_H100 - 0xe6, 0xd8, 0xad, + +#if LCD_DEPTH == 1 +#define BMP_BPP 1 +#define BMP_LINESIZE ((LCD_WIDTH/8 + 3) & ~3) +#elif LCD_DEPTH <= 4 +#define BMP_BPP 4 +#define BMP_LINESIZE ((LCD_WIDTH/2 + 3) & ~3) +#elif LCD_DEPTH <= 8 +#define BMP_BPP 8 +#define BMP_LINESIZE ((LCD_WIDTH + 3) & ~3) +#elif LCD_DEPTH <= 16 +#define BMP_BPP 16 +#define BMP_LINESIZE ((LCD_WIDTH*2 + 3) & ~3) #else - 0x90, 0xee, 0x90, +#define BMP_BPP 24 +#define BMP_LINESIZE ((LCD_WIDTH*3 + 3) & ~3) +#endif + +#define BMP_HEADERSIZE (54 + 4 * BMP_NUMCOLORS) +#define BMP_DATASIZE (BMP_LINESIZE * LCD_HEIGHT) +#define BMP_TOTALSIZE (BMP_HEADERSIZE + BMP_DATASIZE) + +#define LE16_CONST(x) (x)&0xff, ((x)>>8)&0xff +#define LE32_CONST(x) (x)&0xff, ((x)>>8)&0xff, ((x)>>16)&0xff, ((x)>>24)&0xff + +static const unsigned char bmpheader[] = +{ + 0x42, 0x4d, /* 'BM' */ + LE32_CONST(BMP_TOTALSIZE), /* Total file size */ + 0x00, 0x00, 0x00, 0x00, /* Reserved */ + LE32_CONST(BMP_HEADERSIZE), /* Offset to start of pixel data */ + + 0x28, 0x00, 0x00, 0x00, /* Size of (2nd) header */ + LE32_CONST(LCD_WIDTH), /* Width in pixels */ + LE32_CONST(LCD_HEIGHT), /* Height in pixels */ + 0x01, 0x00, /* Number of planes (always 1) */ + LE16_CONST(BMP_BPP), /* Bits per pixel 1/4/8/16/24 */ + 0x00, 0x00, 0x00, 0x00, /* Compression mode, 0 = none */ + LE32_CONST(BMP_DATASIZE), /* Size of bitmap data */ + 0xc4, 0x0e, 0x00, 0x00, /* Horizontal resolution (pixels/meter) */ + 0xc4, 0x0e, 0x00, 0x00, /* Vertical resolution (pixels/meter) */ + LE32_CONST(BMP_NUMCOLORS), /* Number of used colours */ + LE32_CONST(BMP_NUMCOLORS), /* Number of important colours */ + +#if LCD_DEPTH == 1 + 0x90, 0xee, 0x90, 0x00, /* Colour #0 */ + 0x00, 0x00, 0x00, 0x00 /* Colour #1 */ +#elif LCD_DEPTH == 2 + 0xe6, 0xd8, 0xad, 0x00, /* Colour #0 */ + 0x99, 0x90, 0x73, 0x00, /* Colour #1 */ + 0x4c, 0x48, 0x39, 0x00, /* Colour #2 */ + 0x00, 0x00, 0x00, 0x00 /* Colour #3 */ #endif - 0x00, 0x00, 0x00, - 0x00, 0x00 }; void screen_dump(void) { int fh; - int bx, by, ix, iy; - int src_byte, src_mask, dst_mask; + int bx, by, iy; + int src_byte; char filename[MAX_PATH]; - static unsigned char line_block[8][(LCD_WIDTH/8+3) & ~3]; +#if LCD_DEPTH == 1 + int ix, src_mask, dst_mask; + static unsigned char line_block[8][BMP_LINESIZE]; +#elif LCD_DEPTH == 2 + int src_byte2; + static unsigned char line_block[4][BMP_LINESIZE]; +#endif + #ifdef HAVE_RTC struct tm *tm = get_time(); @@ -213,6 +259,7 @@ void screen_dump(void) write(fh, bmpheader, sizeof(bmpheader)); /* BMP image goes bottom up */ +#if LCD_DEPTH == 1 for (by = LCD_HEIGHT/8 - 1; by >= 0; by--) { memset(&line_block[0][0], 0, sizeof(line_block)); @@ -236,6 +283,26 @@ void screen_dump(void) write(fh, &line_block[0][0], sizeof(line_block)); } +#elif LCD_DEPTH == 2 + for (by = LCD_HEIGHT/4 - 1; by >= 0; by--) + { + memset(&line_block[0][0], 0, sizeof(line_block)); + + for (bx = 0; bx < LCD_WIDTH/2; bx++) + { + src_byte = lcd_framebuffer[by][2*bx]; + src_byte2 = lcd_framebuffer[by][2*bx+1]; + for (iy = 3; iy >= 0; iy--) + { + line_block[iy][bx] = ((src_byte & 3) << 4) | (src_byte2 & 3); + src_byte >>= 2; + src_byte2 >>= 2; + } + } + + write(fh, &line_block[0][0], sizeof(line_block)); + } +#endif close(fh); } #endif |