summaryrefslogtreecommitdiff
path: root/firmware/drivers/lcd-2bit-horz.c
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2006-04-04 00:55:16 +0000
committerJens Arnold <amiconn@rockbox.org>2006-04-04 00:55:16 +0000
commitfcab617331ad6aed89aaacb24b5901175151dd53 (patch)
tree605d6ae039be937688122e350a34f919e28b25bd /firmware/drivers/lcd-2bit-horz.c
parentec5f78398819e4d662c6c07971864f1550628cd1 (diff)
downloadrockbox-fcab617331ad6aed89aaacb24b5901175151dd53.tar.gz
rockbox-fcab617331ad6aed89aaacb24b5901175151dd53.zip
Grayscale iPods: Bit-flipped the 2bit LCD driver to use the same format as apple. No more mirrored display when loading retailos, after a bootloader update.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9478 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers/lcd-2bit-horz.c')
-rw-r--r--firmware/drivers/lcd-2bit-horz.c33
1 files changed, 15 insertions, 18 deletions
diff --git a/firmware/drivers/lcd-2bit-horz.c b/firmware/drivers/lcd-2bit-horz.c
index 826f68a06a..e15d8ddbc4 100644
--- a/firmware/drivers/lcd-2bit-horz.c
+++ b/firmware/drivers/lcd-2bit-horz.c
@@ -46,7 +46,7 @@ static const unsigned char dibits[16] ICONST_ATTR = {
46}; 46};
47 47
48static const unsigned char pixmask[4] ICONST_ATTR = { 48static const unsigned char pixmask[4] ICONST_ATTR = {
49 0x03, 0x0C, 0x30, 0xC0 49 0xC0, 0x30, 0x0C, 0x03
50}; 50};
51 51
52static unsigned fg_pattern IDATA_ATTR = 0xFF; /* initially black */ 52static unsigned fg_pattern IDATA_ATTR = 0xFF; /* initially black */
@@ -381,8 +381,8 @@ void lcd_hline(int x1, int x2, int y)
381 bfunc = lcd_blockfuncs[drawmode]; 381 bfunc = lcd_blockfuncs[drawmode];
382 dst = &lcd_framebuffer[y][x1>>2]; 382 dst = &lcd_framebuffer[y][x1>>2];
383 nx = x2 - (x1 & ~3); 383 nx = x2 - (x1 & ~3);
384 mask = 0xFFu << (2 * (x1 & 3)); 384 mask = 0xFFu >> (2 * (x1 & 3));
385 mask_right = 0xFFu >> (2 * (~nx & 3)); 385 mask_right = 0xFFu << (2 * (~nx & 3));
386 386
387 for (; nx >= 4; nx -= 4) 387 for (; nx >= 4; nx -= 4)
388 { 388 {
@@ -479,8 +479,8 @@ void lcd_fillrect(int x, int y, int width, int height)
479 bfunc = lcd_blockfuncs[drawmode]; 479 bfunc = lcd_blockfuncs[drawmode];
480 dst = &lcd_framebuffer[y][x>>2]; 480 dst = &lcd_framebuffer[y][x>>2];
481 nx = width - 1 + (x & 3); 481 nx = width - 1 + (x & 3);
482 mask = 0xFFu << (2 * (x & 3)); 482 mask = 0xFFu >> (2 * (x & 3));
483 mask_right = 0xFFu >> (2 * (~nx & 3)); 483 mask_right = 0xFFu << (2 * (~nx & 3));
484 484
485 for (; nx >= 4; nx -= 4) 485 for (; nx >= 4; nx -= 4)
486 { 486 {
@@ -515,9 +515,7 @@ void lcd_fillrect(int x, int y, int width, int height)
515 * at top. 515 * at top.
516 * The bytes are stored in row-major order, with byte 0 being top left, 516 * The bytes are stored in row-major order, with byte 0 being top left,
517 * byte 1 2nd from left etc. The first row of bytes defines pixel row 517 * byte 1 2nd from left etc. The first row of bytes defines pixel row
518 * 0, the second row defines pixel row 1 etc. 518 * 0, the second row defines pixel row 1 etc. */
519 *
520 * This is similar to the internal lcd hw format. */
521 519
522/* Draw a partial monochrome bitmap */ 520/* Draw a partial monochrome bitmap */
523void lcd_mono_bitmap_part(const unsigned char *src, int src_x, int src_y, 521void lcd_mono_bitmap_part(const unsigned char *src, int src_x, int src_y,
@@ -602,7 +600,7 @@ void lcd_mono_bitmap(const unsigned char *src, int x, int y, int width, int heig
602 * 600 *
603 * A bitmap contains two bits for every pixel. 00 = white, 01 = light grey, 601 * A bitmap contains two bits for every pixel. 00 = white, 01 = light grey,
604 * 10 = dark grey, 11 = black. Bits within a byte are arranged horizontally, 602 * 10 = dark grey, 11 = black. Bits within a byte are arranged horizontally,
605 * LSB at the left. 603 * MSB at the left.
606 * The bytes are stored in row-major order, with byte 0 being top left, 604 * The bytes are stored in row-major order, with byte 0 being top left,
607 * byte 1 2nd from left etc. Each row of bytes defines one pixel row. 605 * byte 1 2nd from left etc. Each row of bytes defines one pixel row.
608 * 606 *
@@ -651,8 +649,8 @@ void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
651 shift = x & 3; 649 shift = x & 3;
652 nx = width - 1 + shift + src_x; 650 nx = width - 1 + shift + src_x;
653 651
654 mask = 0xFFu << (2 * (shift + src_x)); 652 mask = 0xFF00u >> (2 * (shift + src_x));
655 mask_right = 0xFFu >> (2 * (~nx & 3)); 653 mask_right = 0xFFu << (2 * (~nx & 3));
656 654
657 shift *= 2; 655 shift *= 2;
658 dst_end = dst + height * LCD_FBWIDTH; 656 dst_end = dst + height * LCD_FBWIDTH;
@@ -660,26 +658,25 @@ void lcd_bitmap_part(const unsigned char *src, int src_x, int src_y,
660 { 658 {
661 const unsigned char *src_row = src; 659 const unsigned char *src_row = src;
662 unsigned char *dst_row = dst; 660 unsigned char *dst_row = dst;
663 unsigned mask_row = mask; 661 unsigned mask_row = mask >> 8;
664 unsigned data = 0; 662 unsigned data = 0;
665 663
666 for (x = nx; x >= 4; x -= 4) 664 for (x = nx; x >= 4; x -= 4)
667 { 665 {
668 data |= *src_row++ << shift; 666 data = (data << 8) | *src_row++;
669 667
670 if (mask_row & 0xFF) 668 if (mask_row & 0xFF)
671 { 669 {
672 setblock(dst_row, mask_row, data); 670 setblock(dst_row, mask_row, data >> shift);
673 mask_row = 0xFF; 671 mask_row = 0xFF;
674 } 672 }
675 else 673 else
676 mask_row >>= 8; 674 mask_row = mask;
677 675
678 dst_row++; 676 dst_row++;
679 data >>= 8;
680 } 677 }
681 data |= *src_row << shift; 678 data = (data << 8) | *src_row;
682 setblock(dst_row, mask_row & mask_right, data); 679 setblock(dst_row, mask_row & mask_right, data >> shift);
683 680
684 src += stride; 681 src += stride;
685 dst += LCD_FBWIDTH; 682 dst += LCD_FBWIDTH;