diff options
| author | Jens Arnold <amiconn@rockbox.org> | 2006-04-06 21:05:59 +0000 |
|---|---|---|
| committer | Jens Arnold <amiconn@rockbox.org> | 2006-04-06 21:05:59 +0000 |
| commit | a5d2a2808998ff9a7b319b9a41e5e130b9636565 (patch) | |
| tree | 02cd88d4999edff41ac578bb79fa96a50919245c | |
| parent | cf23618980461702dc7f75e77c480afb09b86c10 (diff) | |
| download | rockbox-a5d2a2808998ff9a7b319b9a41e5e130b9636565.zip rockbox-a5d2a2808998ff9a7b319b9a41e5e130b9636565.tar.gz rockbox-a5d2a2808998ff9a7b319b9a41e5e130b9636565.tar.bz2 rockbox-a5d2a2808998ff9a7b319b9a41e5e130b9636565.tar.xz | |
lcd_blit() (with mono->2bit expansion) implemented for greyscale ipods. Changed the flip mode maths for the mini LCD for coexistence with lcd_blit().
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9540 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | firmware/drivers/lcd-2bit-horz.c | 5 | ||||
| -rw-r--r-- | firmware/drivers/lcd-ipod.c | 57 |
2 files changed, 32 insertions, 30 deletions
diff --git a/firmware/drivers/lcd-2bit-horz.c b/firmware/drivers/lcd-2bit-horz.c index e15d8dd..f965e1b 100644 --- a/firmware/drivers/lcd-2bit-horz.c +++ b/firmware/drivers/lcd-2bit-horz.c @@ -40,11 +40,6 @@ unsigned char lcd_framebuffer[LCD_HEIGHT][LCD_FBWIDTH] IBSS_ATTR; -static const unsigned char dibits[16] ICONST_ATTR = { - 0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F, - 0xC0, 0xC3, 0xCC, 0xCF, 0xF0, 0xF3, 0xFC, 0xFF -}; - static const unsigned char pixmask[4] ICONST_ATTR = { 0xC0, 0x30, 0x0C, 0x03 }; diff --git a/firmware/drivers/lcd-ipod.c b/firmware/drivers/lcd-ipod.c index ab0940d..74bda3b 100644 --- a/firmware/drivers/lcd-ipod.c +++ b/firmware/drivers/lcd-ipod.c @@ -76,6 +76,11 @@ static int addr_offset; static int pix_offset; #endif +static const unsigned char dibits[16] ICONST_ATTR = { + 0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F, + 0xC0, 0xC3, 0xCC, 0xCF, 0xF0, 0xF3, 0xFC, 0xFF +}; + /* wait for LCD with timeout */ static inline void lcd_wait_write(void) { @@ -139,23 +144,6 @@ void lcd_init_device(void) #endif } -/*** update functions ***/ -/* srccopy bitblt, opcode is currently ignored*/ - -/* Performance function that works with an external buffer - note that x and bwidtht are in 8-pixel units! */ -void lcd_blit(const unsigned char* data, int x, int by, int width, - int bheight, int stride) -{ - /* TODO implement this on iPod */ - (void)data; - (void)x; - (void)by; - (void)width; - (void)bheight; - (void)stride; -} - /*** hardware configuration ***/ /* Rockbox stores the contrast as 0..63 - we add 64 to it */ @@ -183,8 +171,8 @@ void lcd_set_flip(bool yesno) /* 168x112, inverse COM order */ lcd_cmd_and_data(R_DRV_OUTPUT_CONTROL, 0x020d); lcd_cmd_and_data(R_1ST_SCR_DRV_POS, 0x8316); /* 22..131 */ - addr_offset = (22 << 5) | (20 - 3); - pix_offset = 6; + addr_offset = (22 << 5) | (20 - 4); + pix_offset = -2; } else { /* 168x112, inverse SEG order */ lcd_cmd_and_data(R_DRV_OUTPUT_CONTROL, 0x010d); @@ -207,6 +195,28 @@ void lcd_set_flip(bool yesno) #endif } +/*** update functions ***/ + +/* Performance function that works with an external buffer + note that x, bwidtht and stride are in 8-pixel units! */ +void lcd_blit(const unsigned char* data, int bx, int y, int bwidth, + int height, int stride) +{ + const unsigned char *src, *src_end; + + while (height--) { + src = data; + src_end = data + bwidth; + lcd_cmd_and_data(R_RAM_ADDR_SET, (y++ << 5) + addr_offset - bx); + lcd_prepare_cmd(R_RAM_DATA); + do { + unsigned byte = *src++; + lcd_send_data((dibits[byte>>4] << 8) | dibits[byte&0x0f]); + } while (src < src_end); + data += stride; + } +} + void lcd_update_rect(int x, int y, int width, int height) { int xmax, ymax; @@ -230,23 +240,20 @@ void lcd_update_rect(int x, int y, int width, int height) for (; y <= ymax; y++) { unsigned char *data, *data_end; - int ram_addr = (y << 5) + addr_offset - x; - lcd_cmd_and_data(R_RAM_ADDR_SET, ram_addr); + lcd_cmd_and_data(R_RAM_ADDR_SET, (y << 5) + addr_offset - x); lcd_prepare_cmd(R_RAM_DATA); data = &lcd_framebuffer[y][2*x]; data_end = data + 2 * width; #if defined(IPOD_MINI) || defined(IPOD_MINI2G) - if (pix_offset == 6) { - data -= 2; - data_end -= 1; + if (pix_offset == -2) { unsigned cur_word = *data++; do { cur_word = (cur_word << 8) | *data++; cur_word = (cur_word << 8) | *data++; lcd_send_data((cur_word >> 4) & 0xffff); - } while (data < data_end); + } while (data <= data_end); } else #endif { |