diff options
Diffstat (limited to 'firmware/drivers/lcd-2bit-horz.c')
-rw-r--r-- | firmware/drivers/lcd-2bit-horz.c | 33 |
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 | ||
48 | static const unsigned char pixmask[4] ICONST_ATTR = { | 48 | static const unsigned char pixmask[4] ICONST_ATTR = { |
49 | 0x03, 0x0C, 0x30, 0xC0 | 49 | 0xC0, 0x30, 0x0C, 0x03 |
50 | }; | 50 | }; |
51 | 51 | ||
52 | static unsigned fg_pattern IDATA_ATTR = 0xFF; /* initially black */ | 52 | static 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 */ |
523 | void lcd_mono_bitmap_part(const unsigned char *src, int src_x, int src_y, | 521 | void 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; |