summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/library/framebuf.rst4
-rw-r--r--extmod/modframebuf.c24
-rw-r--r--tests/extmod/framebuf8.py32
-rw-r--r--tests/extmod/framebuf8.py.exp15
4 files changed, 75 insertions, 0 deletions
diff --git a/docs/library/framebuf.rst b/docs/library/framebuf.rst
index 4f0026e38..ed4b78ab1 100644
--- a/docs/library/framebuf.rst
+++ b/docs/library/framebuf.rst
@@ -155,3 +155,7 @@ Constants
.. data:: framebuf.GS4_HMSB
Grayscale (4-bit) color format
+
+.. data:: framebuf.GS8
+
+ Grayscale (8-bit) color format
diff --git a/extmod/modframebuf.c b/extmod/modframebuf.c
index f2dc4e858..a7f6ba905 100644
--- a/extmod/modframebuf.c
+++ b/extmod/modframebuf.c
@@ -56,6 +56,7 @@ typedef struct _mp_framebuf_p_t {
#define FRAMEBUF_RGB565 (1)
#define FRAMEBUF_GS2_HMSB (5)
#define FRAMEBUF_GS4_HMSB (2)
+#define FRAMEBUF_GS8 (6)
#define FRAMEBUF_MHLSB (3)
#define FRAMEBUF_MHMSB (4)
@@ -206,11 +207,31 @@ STATIC void gs4_hmsb_fill_rect(const mp_obj_framebuf_t *fb, int x, int y, int w,
}
}
+// Functions for GS8 format
+
+STATIC void gs8_setpixel(const mp_obj_framebuf_t *fb, int x, int y, uint32_t col) {
+ uint8_t *pixel = &((uint8_t*)fb->buf)[(x + y * fb->stride)];
+ *pixel = col & 0xff;
+}
+
+STATIC uint32_t gs8_getpixel(const mp_obj_framebuf_t *fb, int x, int y) {
+ return ((uint8_t*)fb->buf)[(x + y * fb->stride)];
+}
+
+STATIC void gs8_fill_rect(const mp_obj_framebuf_t *fb, int x, int y, int w, int h, uint32_t col) {
+ uint8_t *pixel = &((uint8_t*)fb->buf)[(x + y * fb->stride)];
+ while (h--) {
+ memset(pixel, col, w);
+ pixel += fb->stride;
+ }
+}
+
STATIC mp_framebuf_p_t formats[] = {
[FRAMEBUF_MVLSB] = {mvlsb_setpixel, mvlsb_getpixel, mvlsb_fill_rect},
[FRAMEBUF_RGB565] = {rgb565_setpixel, rgb565_getpixel, rgb565_fill_rect},
[FRAMEBUF_GS2_HMSB] = {gs2_hmsb_setpixel, gs2_hmsb_getpixel, gs2_hmsb_fill_rect},
[FRAMEBUF_GS4_HMSB] = {gs4_hmsb_setpixel, gs4_hmsb_getpixel, gs4_hmsb_fill_rect},
+ [FRAMEBUF_GS8] = {gs8_setpixel, gs8_getpixel, gs8_fill_rect},
[FRAMEBUF_MHLSB] = {mono_horiz_setpixel, mono_horiz_getpixel, mono_horiz_fill_rect},
[FRAMEBUF_MHMSB] = {mono_horiz_setpixel, mono_horiz_getpixel, mono_horiz_fill_rect},
};
@@ -272,6 +293,8 @@ STATIC mp_obj_t framebuf_make_new(const mp_obj_type_t *type, size_t n_args, size
case FRAMEBUF_GS4_HMSB:
o->stride = (o->stride + 1) & ~1;
break;
+ case FRAMEBUF_GS8:
+ break;
default:
mp_raise_ValueError("invalid format");
}
@@ -610,6 +633,7 @@ STATIC const mp_rom_map_elem_t framebuf_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_RGB565), MP_ROM_INT(FRAMEBUF_RGB565) },
{ MP_ROM_QSTR(MP_QSTR_GS2_HMSB), MP_ROM_INT(FRAMEBUF_GS2_HMSB) },
{ MP_ROM_QSTR(MP_QSTR_GS4_HMSB), MP_ROM_INT(FRAMEBUF_GS4_HMSB) },
+ { MP_ROM_QSTR(MP_QSTR_GS8), MP_ROM_INT(FRAMEBUF_GS8) },
{ MP_ROM_QSTR(MP_QSTR_MONO_HLSB), MP_ROM_INT(FRAMEBUF_MHLSB) },
{ MP_ROM_QSTR(MP_QSTR_MONO_HMSB), MP_ROM_INT(FRAMEBUF_MHMSB) },
};
diff --git a/tests/extmod/framebuf8.py b/tests/extmod/framebuf8.py
new file mode 100644
index 000000000..b6899aae9
--- /dev/null
+++ b/tests/extmod/framebuf8.py
@@ -0,0 +1,32 @@
+try:
+ import framebuf
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+def printbuf():
+ print("--8<--")
+ for y in range(h):
+ for x in range(w):
+ print('%02x' % buf[(x + y * w)], end='')
+ print()
+ print("-->8--")
+
+w = 8
+h = 5
+buf = bytearray(w * h)
+fbuf = framebuf.FrameBuffer(buf, w, h, framebuf.GS8)
+
+# fill
+fbuf.fill(0x55)
+printbuf()
+
+# put pixel
+fbuf.pixel(0, 0, 0x11)
+fbuf.pixel(w - 1, 0, 0x22)
+fbuf.pixel(0, h - 1, 0x33)
+fbuf.pixel(w - 1, h - 1, 0xff)
+printbuf()
+
+# get pixel
+print(hex(fbuf.pixel(0, h - 1)), hex(fbuf.pixel(1, 1)))
diff --git a/tests/extmod/framebuf8.py.exp b/tests/extmod/framebuf8.py.exp
new file mode 100644
index 000000000..01d8976fe
--- /dev/null
+++ b/tests/extmod/framebuf8.py.exp
@@ -0,0 +1,15 @@
+--8<--
+5555555555555555
+5555555555555555
+5555555555555555
+5555555555555555
+5555555555555555
+-->8--
+--8<--
+1155555555555522
+5555555555555555
+5555555555555555
+5555555555555555
+33555555555555ff
+-->8--
+0x33 0x55