diff options
Diffstat (limited to 'apps/gui/skin_engine/skin_backdrops.c')
-rw-r--r-- | apps/gui/skin_engine/skin_backdrops.c | 56 |
1 files changed, 34 insertions, 22 deletions
diff --git a/apps/gui/skin_engine/skin_backdrops.c b/apps/gui/skin_engine/skin_backdrops.c index 0b67125bbf..0433d0258d 100644 --- a/apps/gui/skin_engine/skin_backdrops.c +++ b/apps/gui/skin_engine/skin_backdrops.c | |||
@@ -37,6 +37,7 @@ static struct skin_backdrop { | |||
37 | enum screen_type screen; | 37 | enum screen_type screen; |
38 | bool loaded; | 38 | bool loaded; |
39 | int buflib_handle; | 39 | int buflib_handle; |
40 | int ref_count; | ||
40 | } backdrops[NB_BDROPS]; | 41 | } backdrops[NB_BDROPS]; |
41 | 42 | ||
42 | #define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS | 43 | #define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS |
@@ -63,21 +64,21 @@ static struct buflib_callbacks buflib_ops = {buflib_move_callback, NULL}; | |||
63 | static bool first_go = true; | 64 | static bool first_go = true; |
64 | void skin_backdrop_init(void) | 65 | void skin_backdrop_init(void) |
65 | { | 66 | { |
66 | for (int i=0; i<NB_BDROPS; i++) | 67 | if (first_go) |
67 | { | 68 | { |
68 | if (first_go) | 69 | for (int i=0; i<NB_BDROPS; i++) |
70 | { | ||
69 | backdrops[i].buflib_handle = -1; | 71 | backdrops[i].buflib_handle = -1; |
70 | else | 72 | backdrops[i].name[0] = '\0'; |
71 | skin_backdrop_unload(i); | 73 | backdrops[i].buffer = NULL; |
72 | backdrops[i].name[0] = '\0'; | 74 | backdrops[i].loaded = false; |
73 | backdrops[i].buffer = NULL; | 75 | backdrops[i].ref_count = 0; |
74 | backdrops[i].loaded = false; | 76 | } |
75 | 77 | FOR_NB_SCREENS(i) | |
78 | current_lcd_backdrop[i] = -1; | ||
79 | handle_being_loaded = -1; | ||
80 | first_go = false; | ||
76 | } | 81 | } |
77 | first_go = false; | ||
78 | FOR_NB_SCREENS(i) | ||
79 | current_lcd_backdrop[i] = -1; | ||
80 | handle_being_loaded = -1; | ||
81 | } | 82 | } |
82 | 83 | ||
83 | int skin_backdrop_assign(char* backdrop, char *bmpdir, | 84 | int skin_backdrop_assign(char* backdrop, char *bmpdir, |
@@ -101,22 +102,26 @@ int skin_backdrop_assign(char* backdrop, char *bmpdir, | |||
101 | for (i=0; i<NB_BDROPS; i++) | 102 | for (i=0; i<NB_BDROPS; i++) |
102 | { | 103 | { |
103 | if (!backdrops[i].name[0] && free < 0) | 104 | if (!backdrops[i].name[0] && free < 0) |
105 | { | ||
104 | free = i; | 106 | free = i; |
105 | if (!strcmp(backdrops[i].name, filename) && backdrops[i].screen == screen) | 107 | break; |
108 | } | ||
109 | else if (!strcmp(backdrops[i].name, filename) && backdrops[i].screen == screen) | ||
106 | { | 110 | { |
111 | backdrops[i].ref_count++; | ||
107 | break; | 112 | break; |
108 | } | 113 | } |
109 | } | 114 | } |
110 | if (i < NB_BDROPS) | 115 | if (free >= 0) |
111 | return i; | ||
112 | else if (free >= 0) | ||
113 | { | 116 | { |
114 | strlcpy(backdrops[free].name, filename, | 117 | strlcpy(backdrops[free].name, filename, MAX_PATH); |
115 | sizeof (backdrops[free].name)); | ||
116 | backdrops[free].buffer = NULL; | 118 | backdrops[free].buffer = NULL; |
117 | backdrops[free].screen = screen; | 119 | backdrops[free].screen = screen; |
120 | backdrops[free].ref_count = 1; | ||
118 | return free; | 121 | return free; |
119 | } | 122 | } |
123 | else if (i < NB_BDROPS) | ||
124 | return i; | ||
120 | return -1; | 125 | return -1; |
121 | } | 126 | } |
122 | 127 | ||
@@ -188,10 +193,17 @@ void skin_backdrop_show(int backdrop_id) | |||
188 | 193 | ||
189 | void skin_backdrop_unload(int backdrop_id) | 194 | void skin_backdrop_unload(int backdrop_id) |
190 | { | 195 | { |
191 | if (backdrops[backdrop_id].buflib_handle > 0) | 196 | backdrops[backdrop_id].ref_count--; |
192 | core_free(backdrops[backdrop_id].buflib_handle); | 197 | if (backdrops[backdrop_id].ref_count <= 0) |
193 | backdrops[backdrop_id].buffer = NULL; | 198 | { |
194 | backdrops[backdrop_id].buflib_handle = -1; | 199 | if (backdrops[backdrop_id].buflib_handle > 0) |
200 | core_free(backdrops[backdrop_id].buflib_handle); | ||
201 | backdrops[backdrop_id].buffer = NULL; | ||
202 | backdrops[backdrop_id].buflib_handle = -1; | ||
203 | backdrops[backdrop_id].loaded = false; | ||
204 | backdrops[backdrop_id].name[0] = '\0'; | ||
205 | backdrops[backdrop_id].ref_count = 0; | ||
206 | } | ||
195 | } | 207 | } |
196 | 208 | ||
197 | void skin_backdrop_load_setting(void) | 209 | void skin_backdrop_load_setting(void) |