From 492721c99fd63c8a2c6467e257d20fd3e730d6b9 Mon Sep 17 00:00:00 2001 From: Niklas Fiekas Date: Sat, 9 Dec 2023 19:47:08 +0100 Subject: [PATCH] fix(snapshot): set data_size on returned dsc (#4964) --- docs/others/snapshot.rst | 2 +- src/others/snapshot/lv_snapshot.c | 18 ++++++++++-------- src/others/snapshot/lv_snapshot.h | 4 ++-- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/docs/others/snapshot.rst b/docs/others/snapshot.rst index a0dd9a8a2..7ec19c5af 100644 --- a/docs/others/snapshot.rst +++ b/docs/others/snapshot.rst @@ -47,7 +47,7 @@ Use Existing Buffer ~~~~~~~~~~~~~~~~~~~ If the snapshot needs update now and then, or simply caller provides memory, use API -``lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_image_dsc_t * dsc, void * buf, uint32_t buff_size);`` +``lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_image_dsc_t * dsc, void * buf, uint32_t buf_size);`` for this case. It's caller's responsibility to alloc/free the memory. If snapshot is generated successfully, the image descriptor is updated diff --git a/src/others/snapshot/lv_snapshot.c b/src/others/snapshot/lv_snapshot.c index c35af26a6..3f1db40a3 100644 --- a/src/others/snapshot/lv_snapshot.c +++ b/src/others/snapshot/lv_snapshot.c @@ -77,11 +77,11 @@ uint32_t lv_snapshot_buf_size_needed(lv_obj_t * obj, lv_color_format_t cf) * @param cf color format for generated image. * @param dsc image descriptor to store the image result. * @param buf the buffer to store image data. - * @param buff_size provided buffer size in bytes. + * @param buf_size provided buffer size in bytes. * @return LV_RESULT_OK on success, LV_RESULT_INVALID on error. */ lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_image_dsc_t * dsc, void * buf, - uint32_t buff_size) + uint32_t buf_size) { LV_ASSERT_NULL(obj); LV_ASSERT_NULL(dsc); @@ -98,7 +98,8 @@ lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_ima return LV_RESULT_INVALID; } - if(lv_snapshot_buf_size_needed(obj, cf) > buff_size || buff_size == 0) return LV_RESULT_INVALID; + uint32_t buf_size_needed = lv_snapshot_buf_size_needed(obj, cf); + if(buf_size_needed == 0 || buf_size < buf_size_needed) return LV_RESULT_INVALID; LV_ASSERT_MSG(buf == lv_draw_buf_align(buf, cf), "Buffer is not aligned"); @@ -113,9 +114,10 @@ lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_ima lv_obj_get_coords(obj, &snapshot_area); lv_area_increase(&snapshot_area, ext_size, ext_size); - lv_memzero(buf, buff_size); + lv_memzero(buf, buf_size); lv_memzero(dsc, sizeof(lv_image_dsc_t)); dsc->data = buf; + dsc->data_size = buf_size_needed; dsc->header.w = w; dsc->header.h = h; dsc->header.cf = cf; @@ -159,10 +161,10 @@ lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_ima lv_image_dsc_t * lv_snapshot_take(lv_obj_t * obj, lv_color_format_t cf) { LV_ASSERT_NULL(obj); - uint32_t buff_size = lv_snapshot_buf_size_needed(obj, cf); - if(buff_size == 0) return NULL; + uint32_t buf_size = lv_snapshot_buf_size_needed(obj, cf); + if(buf_size == 0) return NULL; - void * buf = lv_draw_buf_malloc(buff_size, cf); + void * buf = lv_draw_buf_malloc(buf_size, cf); LV_ASSERT_MALLOC(buf); if(buf == NULL) { return NULL; @@ -175,7 +177,7 @@ lv_image_dsc_t * lv_snapshot_take(lv_obj_t * obj, lv_color_format_t cf) return NULL; } - if(lv_snapshot_take_to_buf(obj, cf, dsc, buf, buff_size) != LV_RESULT_OK) { + if(lv_snapshot_take_to_buf(obj, cf, dsc, buf, buf_size) != LV_RESULT_OK) { lv_draw_buf_free(buf); lv_free(dsc); return NULL; diff --git a/src/others/snapshot/lv_snapshot.h b/src/others/snapshot/lv_snapshot.h index 6459898f0..ea11c0a15 100644 --- a/src/others/snapshot/lv_snapshot.h +++ b/src/others/snapshot/lv_snapshot.h @@ -60,11 +60,11 @@ uint32_t lv_snapshot_buf_size_needed(lv_obj_t * obj, lv_color_format_t cf); * @param cf color format for generated image. * @param dsc image descriptor to store the image result. * @param buf the buffer to store image data. - * @param buff_size provided buffer size in bytes. + * @param buf_size provided buffer size in bytes. * @return LV_RESULT_OK on success, LV_RESULT_INVALID on error. */ lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_image_dsc_t * dsc, void * buf, - uint32_t buff_size); + uint32_t buf_size); /********************** * MACROS