summaryrefslogtreecommitdiff
path: root/extmod/modframebuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'extmod/modframebuf.c')
-rw-r--r--extmod/modframebuf.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/extmod/modframebuf.c b/extmod/modframebuf.c
index f3ce5b5ef..cd0f50d10 100644
--- a/extmod/modframebuf.c
+++ b/extmod/modframebuf.c
@@ -282,23 +282,29 @@ static mp_obj_t framebuf_make_new(const mp_obj_type_t *type, size_t n_args, size
mp_raise_ValueError(NULL);
}
- size_t height_required = height;
size_t bpp = 1;
+ size_t height_required = height;
+ size_t width_required = width;
+ size_t strides_required = height - 1;
switch (format) {
case FRAMEBUF_MVLSB:
height_required = (height + 7) & ~7;
+ strides_required = height_required - 8;
break;
case FRAMEBUF_MHLSB:
case FRAMEBUF_MHMSB:
stride = (stride + 7) & ~7;
+ width_required = (width + 7) & ~7;
break;
case FRAMEBUF_GS2_HMSB:
stride = (stride + 3) & ~3;
+ width_required = (width + 3) & ~3;
bpp = 2;
break;
case FRAMEBUF_GS4_HMSB:
stride = (stride + 1) & ~1;
+ width_required = (width + 1) & ~1;
bpp = 4;
break;
case FRAMEBUF_GS8:
@@ -314,7 +320,7 @@ static mp_obj_t framebuf_make_new(const mp_obj_type_t *type, size_t n_args, size
mp_buffer_info_t bufinfo;
mp_get_buffer_raise(args_in[0], &bufinfo, MP_BUFFER_WRITE);
- if (height_required * stride * bpp / 8 > bufinfo.len) {
+ if ((strides_required * stride + (height_required - strides_required) * width_required) * bpp / 8 > bufinfo.len) {
mp_raise_ValueError(NULL);
}