hc
2023-05-26 a23f51ed7a39e452c1037343a84d7db1ca2c5bd7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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