diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h
index d9055f13c1f6247c256ad16e4b12c286ccbec356..48f7d4d6a7728dfdc813088fb9a642d1ce870c76 100644
--- a/epicardium/epicardium.h
+++ b/epicardium/epicardium.h
@@ -1677,7 +1677,6 @@ API(API_DISP_BLIT, int epic_disp_blit(
int16_t y,
int16_t w,
int16_t h,
- size_t size,
uint16_t *img,
uint8_t *alpha
));
diff --git a/epicardium/modules/display.c b/epicardium/modules/display.c
index 21be30a3b4e911201376776fc92f2204dee2ddaa..d7607a2027735db1813c86fc49c8a1718756d0b3 100644
--- a/epicardium/modules/display.c
+++ b/epicardium/modules/display.c
@@ -92,7 +92,6 @@ int epic_disp_blit(
int16_t pos_y,
int16_t width,
int16_t height,
- size_t size,
uint16_t *img,
uint8_t *alpha
) {
@@ -107,10 +106,10 @@ int epic_disp_blit(
int16_t count_y = height - offset_y;
if (pos_x + width >= 160) {
- count_x -= (pos_x + width) - 160;
+ count_x -= (pos_x + width) % 160;
}
if (pos_y + height >= 80) {
- count_y -= (pos_y + height) - 80;
+ count_y -= (pos_y + height) % 80;
}
if (offset_x == 0 && offset_y == 0 && count_x == width &&
@@ -123,7 +122,7 @@ int epic_disp_blit(
width,
height,
GFX_RAW,
- size,
+ width * height * 2,
img
);
} else {
@@ -140,7 +139,7 @@ int epic_disp_blit(
count_x,
1,
GFX_RAW,
- size,
+ count_x * 2,
curr_img
);
}
diff --git a/pycardium/modules/py/display.py b/pycardium/modules/py/display.py
index d6bc0dc8a57e628772936528190194d4a17d9f4a..20616e14757fb03b5e51fd9ffe462803150ac4cd 100644
--- a/pycardium/modules/py/display.py
+++ b/pycardium/modules/py/display.py
@@ -120,7 +120,7 @@ class Display:
sys_display.pixel(x, y, col)
return self
- def blit(self, x, y, w, h, img, alpha=None):
+ def blit(self, x, y, w, h, img, rgb565=False, alpha=None):
"""
Blit an image to the display
@@ -128,8 +128,9 @@ class Display:
:param y: top left Y coordinate
:param w: image width
:param h: image height
- :param img: a byte buffer with pixel data (rgb565)
+ :param img: a byte buffer with pixel data (RGB)
:param alpha: alpha mask for `img`
+ :param rgb565: Set to `True` if the data supplied is in rgb565 format
.. note::
The alpha channel is not implemented yet.
@@ -137,12 +138,13 @@ class Display:
"""
# TODO: alpha is not yet supported by epicardium
- assert alpha == None
+ if alpha is not None:
+ raise ValueError("alpha not yet supported")
if alpha is None:
- sys_display.blit(x, y, w, h, img)
+ sys_display.blit(x, y, w, h, img, rgb565)
else:
- sys_display.blit(x, y, w, h, img, alpha)
+ sys_display.blit(x, y, w, h, img, rgb565, alpha)
return self
diff --git a/pycardium/modules/sys_display.c b/pycardium/modules/sys_display.c
index a4713c0a18065d662991b9fbf6570967958a8576..fa416dc66cb6f45e43828a89246f1c3408faab64 100644
--- a/pycardium/modules/sys_display.c
+++ b/pycardium/modules/sys_display.c
@@ -100,10 +100,11 @@ static mp_obj_t mp_display_blit(size_t n_args, const mp_obj_t *args)
/* Required arguments: posx, posy (on display),
width, height (of image),
buffer (rgb data of image) */
- int pos_x = mp_obj_get_int(args[0]);
- int pos_y = mp_obj_get_int(args[1]);
- int width = mp_obj_get_int(args[2]);
- int height = mp_obj_get_int(args[3]);
+ int pos_x = mp_obj_get_int(args[0]);
+ int pos_y = mp_obj_get_int(args[1]);
+ int width = mp_obj_get_int(args[2]);
+ int height = mp_obj_get_int(args[3]);
+ bool rgb565 = mp_obj_is_true(args[5]);
mp_buffer_info_t img;
int res = 0;
@@ -112,15 +113,28 @@ static mp_obj_t mp_display_blit(size_t n_args, const mp_obj_t *args)
if (!mp_get_buffer(args[4], &img, MP_BUFFER_READ)) {
mp_raise_TypeError("'img' does not support buffer protocol.");
}
- if ((int)img.len < width * height * 2) {
+
+ int bpp = rgb565 ? 2 : 3;
+ if ((int)img.len < width * height * bpp) {
mp_raise_ValueError("'img' is too small.");
}
- if (n_args > 5) {
+ uint16_t *buf;
+ if (rgb565) {
+ buf = (uint16_t *)img.buf;
+ } else {
+ /* Will raise an exception if out of memory: */
+ buf = m_malloc(width * height * bpp);
+ for (int i = 0; i < width * height; i++) {
+ buf[i] = rgb888_to_rgb565(((uint8_t *)img.buf) + 3 * i);
+ }
+ }
+
+ if (n_args > 6) {
mp_buffer_info_t alpha;
/* Load alpha buffer and check size */
- if (!mp_get_buffer(args[5], &alpha, MP_BUFFER_READ)) {
+ if (!mp_get_buffer(args[6], &alpha, MP_BUFFER_READ)) {
mp_raise_TypeError(
"'alpha' does not support buffer protocol."
);
@@ -130,24 +144,10 @@ static mp_obj_t mp_display_blit(size_t n_args, const mp_obj_t *args)
}
res = epic_disp_blit(
- pos_x,
- pos_y,
- width,
- height,
- img.len,
- (uint16_t *)img.buf,
- (uint8_t *)alpha.buf
+ pos_x, pos_y, width, height, buf, (uint8_t *)alpha.buf
);
} else {
- res = epic_disp_blit(
- pos_x,
- pos_y,
- width,
- height,
- img.len,
- (uint16_t *)img.buf,
- NULL
- );
+ res = epic_disp_blit(pos_x, pos_y, width, height, buf, NULL);
}
if (res < 0) {