diff options
Diffstat (limited to 'extmod')
| -rw-r--r-- | extmod/modframebuf.c | 10 |
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); } |
