From 977e7829ba3b662bcb18b43def0189bcf36b0800 Mon Sep 17 00:00:00 2001 From: Jinkun Hong Date: Mon, 6 Jun 2022 09:47:20 +0800 Subject: [PATCH 5/6] add _lv_img_cache_get_info Signed-off-by: Jinkun Hong --- src/draw/lv_img_cache.c | 43 +++++++++++++++++++++++++++++++++++++++++++ src/draw/lv_img_cache.h | 2 ++ src/draw/lv_img_decoder.c | 3 +++ 3 files changed, 48 insertions(+) diff --git a/src/draw/lv_img_cache.c b/src/draw/lv_img_cache.c index 2caf512..dfa0d7d 100644 --- a/src/draw/lv_img_cache.c +++ b/src/draw/lv_img_cache.c @@ -140,6 +140,49 @@ _lv_img_cache_entry_t * _lv_img_cache_open(const void * src, lv_color_t color, i return cached_src; } +bool _lv_img_cache_get_info(const void * src, lv_img_header_t * header) +{ + /*Is the image cached?*/ + _lv_img_cache_entry_t * cached_src = NULL; + +#if LV_IMG_CACHE_DEF_SIZE + if(entry_cnt == 0) { + printf("lv_img_cache_open: the cache size is 0"); + return NULL; + } + + _lv_img_cache_entry_t * cache = LV_GC_ROOT(_lv_img_cache_array); + + /*Decrement all lifes. Make the entries older*/ + uint16_t i; + for(i = 0; i < entry_cnt; i++) { + if(cache[i].life > INT32_MIN + LV_IMG_CACHE_AGING) { + cache[i].life -= LV_IMG_CACHE_AGING; + } + } + + for(i = 0; i < entry_cnt; i++) { + if(lv_img_cache_match(src, cache[i].dec_dsc.src)) { + /*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`*/ + cached_src = &cache[i]; + cached_src->life += cached_src->dec_dsc.time_to_open * LV_IMG_CACHE_LIFE_GAIN; + if(cached_src->life > LV_IMG_CACHE_LIFE_LIMIT) cached_src->life = LV_IMG_CACHE_LIFE_LIMIT; + LV_LOG_TRACE("image source found in the cache"); + break; + } + } + + /*The image is not cached then cache it now*/ + if(cached_src) { + memcpy(header, &cached_src->dec_dsc.header, sizeof(lv_img_header_t)); + return true; + } +#endif + return false; +} + /** * Set the number of images to be cached. * More cached images mean more opened image at same time which might mean more memory usage. diff --git a/src/draw/lv_img_cache.h b/src/draw/lv_img_cache.h index dc0c5d9..6b4664f 100644 --- a/src/draw/lv_img_cache.h +++ b/src/draw/lv_img_cache.h @@ -67,6 +67,8 @@ void lv_img_cache_set_size(uint16_t new_slot_num); */ void lv_img_cache_invalidate_src(const void * src); +bool _lv_img_cache_get_info(const void * src, lv_img_header_t * header); + /********************** * MACROS **********************/ diff --git a/src/draw/lv_img_decoder.c b/src/draw/lv_img_decoder.c index 3678a57..555951c 100644 --- a/src/draw/lv_img_decoder.c +++ b/src/draw/lv_img_decoder.c @@ -86,6 +86,9 @@ lv_res_t lv_img_decoder_get_info(const void * src, lv_img_header_t * header) if(src == NULL) return LV_RES_INV; + if (_lv_img_cache_get_info(src, header) == true) { + return LV_RES_OK; + } lv_img_src_t src_type = lv_img_src_get_type(src); if(src_type == LV_IMG_SRC_VARIABLE) { const lv_img_dsc_t * img_dsc = src; -- 2.7.4