diff --git a/src/extra/others/snapshot/lv_snapshot.c b/src/extra/others/snapshot/lv_snapshot.c index 913f0adb17..e9fa75109f 100644 --- a/src/extra/others/snapshot/lv_snapshot.c +++ b/src/extra/others/snapshot/lv_snapshot.c @@ -142,6 +142,7 @@ lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t * _lv_refr_set_disp_refreshing(refr_ori); obj_disp->driver->draw_ctx_deinit(fake_disp.driver, draw_ctx); + lv_mem_free(draw_ctx); dsc->data = buf; dsc->header.w = w; diff --git a/tests/src/test_cases/test_snapshot.c b/tests/src/test_cases/test_snapshot.c new file mode 100644 index 0000000000..ed3245d890 --- /dev/null +++ b/tests/src/test_cases/test_snapshot.c @@ -0,0 +1,37 @@ +#if LV_BUILD_TEST +#include "../lvgl.h" + +#include "unity/unity.h" + + +#define NUM_SNAPSHOTS 1 + +void test_snapshot_should_not_leak_memory(void) +{ + uint32_t idx = 0; + uint32_t initial_available_memory = 0; + uint32_t final_available_memory = 0; + lv_mem_monitor_t monitor; + + lv_img_dsc_t *snapshots[NUM_SNAPSHOTS] = {NULL}; + + lv_mem_monitor(&monitor); + initial_available_memory = monitor.free_size; + + for(idx = 0; idx < NUM_SNAPSHOTS; idx++) { + snapshots[idx] = lv_snapshot_take(lv_scr_act(), LV_IMG_CF_TRUE_COLOR_ALPHA); + TEST_ASSERT_NOT_NULL(snapshots[idx]); + } + + for(idx = 0; idx < NUM_SNAPSHOTS; idx++) { + lv_snapshot_free(snapshots[idx]); + } + + lv_mem_monitor(&monitor); + final_available_memory = monitor.free_size; + + TEST_ASSERT_EQUAL(initial_available_memory, final_available_memory); +} + + +#endif