Index: target/dartuinoP0/display/LS013B7DH06.c |
diff --git a/target/dartuinoP0/display/LS013B7DH06.c b/target/dartuinoP0/display/LS013B7DH06.c |
index 21730324eda34d5bbeeb4b1ece7c31604a63b08a..3e3bceab35eda07698dd29f479eb282961f539f0 100644 |
--- a/target/dartuinoP0/display/LS013B7DH06.c |
+++ b/target/dartuinoP0/display/LS013B7DH06.c |
@@ -24,63 +24,77 @@ |
// 1.33 Inch 3-Bit RGB Sharp Color LCD |
#include <target/display/LS013B7DH06.h> |
#include <string.h> |
+#include <assert.h> |
-#define SET_BIT(BUF, BITNUM) ((BUF)[(BITNUM) >> 3] |= (0xff & (0x1 << ((BITNUM) & 0x07)))) |
+#define SET_BIT(BUF, BITNUM) ((BUF)[(BITNUM) >> 3] |= (0x1 << ((BITNUM) & 0x07))) |
-uint8_t lcd_get_line(uint8_t *framebuffer, uint8_t idx, uint8_t *result) |
+uint8_t lcd_get_line(struct display_image *image, uint8_t idx, uint8_t *result) |
{ |
- framebuffer += FB_STRIDE * idx; |
+ uint8_t *framebuffer = (uint8_t *)image->pixels + image->rowbytes * idx; |
memset(result, 0, MLCD_BYTES_LINE); |
-#if FB_FORMAT == DISPLAY_FORMAT_RGB_332 |
- for (int i = 0; i < MLCD_WIDTH; ++i) { |
- uint8_t inpix = framebuffer[i]; |
+ if (image->format == IMAGE_FORMAT_RGB_332) { |
+ for (int i = 0; i < MLCD_WIDTH; ++i) { |
+ uint8_t inpix = framebuffer[i]; |
- int j = i * 3; |
+ int j = i * 3; |
- if (inpix & 0x80) { |
- SET_BIT(result, j); |
+ if (inpix & 0x80) { |
+ SET_BIT(result, j); |
+ } |
+ if (inpix & 0x10) { |
+ SET_BIT(result, j + 1); |
+ } |
+ if (inpix & 0x02) { |
+ SET_BIT(result, j + 2); |
+ } |
} |
- if (inpix & 0x10) { |
- SET_BIT(result, j + 1); |
- } |
- if (inpix & 0x02) { |
- SET_BIT(result, j + 2); |
- } |
- } |
-#elif FB_FORMAT == DISPLAY_FORMAT_RGB_x111 |
- for (int i = 0; i < FB_STRIDE; ++i) { |
- uint8_t val = framebuffer[i]; |
- uint8_t inpix; |
+ } else if (image->format == IMAGE_FORMAT_RGB_x111) { |
+ int j = 0; |
+ for (uint i = 0; i < image->width; i += 2) { |
+ uint8_t val = *framebuffer++; |
+ uint8_t inpix = val & 0xf; |
- int j = i * 6; |
+ if (inpix & 0x4) { |
+ SET_BIT(result, j); |
+ } |
+ if (inpix & 0x2) { |
+ SET_BIT(result, j + 1); |
+ } |
+ if (inpix & 0x1) { |
+ SET_BIT(result, j + 2); |
+ } |
- inpix = val & 0xf; |
- if (inpix & 0x4) { |
- SET_BIT(result, j); |
- } |
- if (inpix & 0x2) { |
- SET_BIT(result, j + 1); |
- } |
- if (inpix & 0x1) { |
- SET_BIT(result, j + 2); |
+ inpix = val >> 4; |
+ if (inpix & 0x4) { |
+ SET_BIT(result, j + 3); |
+ } |
+ if (inpix & 0x2) { |
+ SET_BIT(result, j + 4); |
+ } |
+ if (inpix & 0x1) { |
+ SET_BIT(result, j + 5); |
+ } |
+ j += 6; |
} |
+ if (image->width & 1) { |
+ uint8_t val = *framebuffer; |
+ uint8_t inpix = val & 0xf; |
- inpix = val >> 4; |
- if (inpix & 0x4) { |
- SET_BIT(result, j + 3); |
- } |
- if (inpix & 0x2) { |
- SET_BIT(result, j + 4); |
- } |
- if (inpix & 0x1) { |
- SET_BIT(result, j + 5); |
+ if (inpix & 0x4) { |
+ SET_BIT(result, j); |
+ } |
+ if (inpix & 0x2) { |
+ SET_BIT(result, j + 1); |
+ } |
+ if (inpix & 0x1) { |
+ SET_BIT(result, j + 2); |
+ } |
} |
+ } else { |
+ DEBUG_ASSERT(false); |
} |
-#else |
- #error Unhandled FB_FORMAT |
-#endif |
return MLCD_BYTES_LINE; |
} |