From c190374c79945733415cec2e2c4937a63227d3da Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Mon, 30 Sep 2019 11:56:38 +0200 Subject: [PATCH] img_cache: store the filename instead of its pointer --- src/lv_draw/lv_img_cache.c | 12 +++++++++++- src/lv_draw/lv_img_decoder.c | 14 +++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/lv_draw/lv_img_cache.c b/src/lv_draw/lv_img_cache.c index eab900c8e..64da19bdf 100644 --- a/src/lv_draw/lv_img_cache.c +++ b/src/lv_draw/lv_img_cache.c @@ -7,6 +7,8 @@ * INCLUDES *********************/ #include "lv_img_cache.h" +#include "lv_img_decoder.h" +#include "lv_draw_img.h" #include "../lv_hal/lv_hal_tick.h" #include "../lv_misc/lv_gc.h" @@ -79,7 +81,15 @@ lv_img_cache_entry_t * lv_img_cache_open(const void * src, const lv_style_t * st /*Is the image cached?*/ lv_img_cache_entry_t * cached_src = NULL; for(i = 0; i < entry_cnt; i++) { - if(cache[i].dec_dsc.src == src) { + bool match = false; + lv_img_src_t src_type = lv_img_src_get_type(cache[i].dec_dsc.src); + if(src_type == LV_IMG_SRC_VARIABLE) { + if(cache[i].dec_dsc.src == src) match = true; + } else if(src_type == LV_IMG_SRC_FILE) { + if(strcmp(cache[i].dec_dsc.src, src) == 0) match = true; + } + + if(match) { /* If opened increment its life. * Image difficult to open should live longer to keep avoid frequent their recaching. * Therefore increase `life` with `time_to_open`*/ diff --git a/src/lv_draw/lv_img_decoder.c b/src/lv_draw/lv_img_decoder.c index 730739c16..ae71818cc 100644 --- a/src/lv_draw/lv_img_decoder.c +++ b/src/lv_draw/lv_img_decoder.c @@ -118,10 +118,17 @@ lv_res_t lv_img_decoder_get_info(const char * src, lv_img_header_t * header) lv_res_t lv_img_decoder_open(lv_img_decoder_dsc_t * dsc, const void * src, const lv_style_t * style) { dsc->style = style; - dsc->src = src; dsc->src_type = lv_img_src_get_type(src); dsc->user_data = NULL; + if(dsc->src_type == LV_IMG_SRC_FILE) { + uint16_t fnlen = strlen(src); + dsc->src = lv_mem_alloc(fnlen + 1); + strcpy((char *)dsc->src, src); + } else { + dsc->src = src; + } + lv_res_t res = LV_RES_INV; lv_img_decoder_t * d; @@ -175,6 +182,11 @@ void lv_img_decoder_close(lv_img_decoder_dsc_t * dsc) { if(dsc->decoder) { if(dsc->decoder->close_cb) dsc->decoder->close_cb(dsc->decoder, dsc); + + if(dsc->src_type == LV_IMG_SRC_FILE) { + lv_mem_free(dsc->src); + dsc->src = NULL; + } } }