From 977e7829ba3b662bcb18b43def0189bcf36b0800 Mon Sep 17 00:00:00 2001
|
From: Jinkun Hong <jinkun.hong@rock-chips.com>
|
Date: Mon, 6 Jun 2022 09:47:20 +0800
|
Subject: [PATCH 5/6] add _lv_img_cache_get_info
|
|
Signed-off-by: Jinkun Hong <jinkun.hong@rock-chips.com>
|
---
|
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
|