diff options
Diffstat (limited to 'apps/gui/skin_engine')
-rw-r--r-- | apps/gui/skin_engine/skin_backdrops.c | 75 | ||||
-rw-r--r-- | apps/gui/skin_engine/skin_engine.h | 6 |
2 files changed, 65 insertions, 16 deletions
diff --git a/apps/gui/skin_engine/skin_backdrops.c b/apps/gui/skin_engine/skin_backdrops.c index 12950a666c..303a35333e 100644 --- a/apps/gui/skin_engine/skin_backdrops.c +++ b/apps/gui/skin_engine/skin_backdrops.c | |||
@@ -22,11 +22,11 @@ | |||
22 | #include "config.h" | 22 | #include "config.h" |
23 | #include <stdio.h> | 23 | #include <stdio.h> |
24 | #include <stdlib.h> | 24 | #include <stdlib.h> |
25 | #include "core_alloc.h" | ||
25 | #include "string-extra.h" | 26 | #include "string-extra.h" |
26 | #include "settings.h" | 27 | #include "settings.h" |
27 | #include "wps_internals.h" | 28 | #include "wps_internals.h" |
28 | #include "skin_engine.h" | 29 | #include "skin_engine.h" |
29 | #include "skin_buffer.h" | ||
30 | 30 | ||
31 | #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) | 31 | #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) |
32 | 32 | ||
@@ -36,19 +36,51 @@ static struct skin_backdrop { | |||
36 | char *buffer; | 36 | char *buffer; |
37 | enum screen_type screen; | 37 | enum screen_type screen; |
38 | bool loaded; | 38 | bool loaded; |
39 | int buflib_handle; | ||
39 | } backdrops[NB_BDROPS]; | 40 | } backdrops[NB_BDROPS]; |
40 | 41 | ||
41 | #define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS | 42 | #define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS |
43 | int handle_being_loaded; | ||
44 | int current_lcd_backdrop[NB_SCREENS]; | ||
42 | 45 | ||
46 | int buflib_move_callback(int handle, void* current, void* new) | ||
47 | { | ||
48 | int i; | ||
49 | if (handle == handle_being_loaded) | ||
50 | return BUFLIB_CB_CANNOT_MOVE; | ||
51 | for (i=0; i<NB_BDROPS; i++) | ||
52 | { | ||
53 | if (backdrops[i].buffer == current) | ||
54 | { | ||
55 | backdrops[i].buffer = new; | ||
56 | break; | ||
57 | } | ||
58 | } | ||
59 | FOR_NB_SCREENS(i) | ||
60 | skin_backdrop_show(current_lcd_backdrop[i]); | ||
61 | return BUFLIB_CB_OK; | ||
62 | } | ||
63 | static struct buflib_callbacks buflib_ops = {buflib_move_callback, NULL}; | ||
64 | static bool first_go = true; | ||
43 | void skin_backdrop_init(void) | 65 | void skin_backdrop_init(void) |
44 | { | 66 | { |
45 | int i; | 67 | int i; |
68 | |||
46 | for (i=0; i<NB_BDROPS; i++) | 69 | for (i=0; i<NB_BDROPS; i++) |
47 | { | 70 | { |
71 | if (first_go) | ||
72 | backdrops[i].buflib_handle = -1; | ||
73 | else | ||
74 | skin_backdrop_unload(i); | ||
48 | backdrops[i].name[0] = '\0'; | 75 | backdrops[i].name[0] = '\0'; |
49 | backdrops[i].buffer = NULL; | 76 | backdrops[i].buffer = NULL; |
50 | backdrops[i].loaded = false; | 77 | backdrops[i].loaded = false; |
78 | |||
51 | } | 79 | } |
80 | first_go = false; | ||
81 | FOR_NB_SCREENS(i) | ||
82 | current_lcd_backdrop[i] = -1; | ||
83 | handle_being_loaded = -1; | ||
52 | } | 84 | } |
53 | 85 | ||
54 | int skin_backdrop_assign(char* backdrop, char *bmpdir, | 86 | int skin_backdrop_assign(char* backdrop, char *bmpdir, |
@@ -117,10 +149,18 @@ bool skin_backdrops_preload(void) | |||
117 | } | 149 | } |
118 | if (*filename && *filename != '-') | 150 | if (*filename && *filename != '-') |
119 | { | 151 | { |
120 | backdrops[i].buffer = (char*)skin_buffer_alloc(buf_size); | 152 | backdrops[i].buflib_handle = core_alloc_ex(filename, buf_size, &buflib_ops); |
121 | backdrops[i].loaded = backdrops[i].buffer && | 153 | if (backdrops[i].buflib_handle > 0) |
122 | screens[screen].backdrop_load(filename, backdrops[i].buffer); | 154 | { |
123 | if (!backdrops[i].loaded) | 155 | backdrops[i].buffer = core_get_data(backdrops[i].buflib_handle); |
156 | handle_being_loaded = backdrops[i].buflib_handle; | ||
157 | backdrops[i].loaded = | ||
158 | screens[screen].backdrop_load(filename, backdrops[i].buffer); | ||
159 | handle_being_loaded = -1; | ||
160 | if (!backdrops[i].loaded) | ||
161 | retval = false; | ||
162 | } | ||
163 | else | ||
124 | retval = false; | 164 | retval = false; |
125 | } | 165 | } |
126 | if (backdrops[i].name[0] == '-' && backdrops[i].loaded) | 166 | if (backdrops[i].name[0] == '-' && backdrops[i].loaded) |
@@ -147,7 +187,10 @@ void skin_backdrop_show(int backdrop_id) | |||
147 | 187 | ||
148 | void skin_backdrop_unload(int backdrop_id) | 188 | void skin_backdrop_unload(int backdrop_id) |
149 | { | 189 | { |
190 | if (backdrops[backdrop_id].buflib_handle > 0) | ||
191 | core_free(backdrops[backdrop_id].buflib_handle); | ||
150 | backdrops[backdrop_id].buffer = NULL; | 192 | backdrops[backdrop_id].buffer = NULL; |
193 | backdrops[backdrop_id].buflib_handle = -1; | ||
151 | } | 194 | } |
152 | 195 | ||
153 | void skin_backdrop_load_setting(void) | 196 | void skin_backdrop_load_setting(void) |
@@ -161,13 +204,21 @@ void skin_backdrop_load_setting(void) | |||
161 | global_settings.backdrop_file[0] != '-') | 204 | global_settings.backdrop_file[0] != '-') |
162 | { | 205 | { |
163 | if (!backdrops[i].buffer) | 206 | if (!backdrops[i].buffer) |
164 | backdrops[i].buffer = (char*)skin_buffer_alloc(LCD_BACKDROP_BYTES); | 207 | { |
165 | 208 | bool loaded; | |
166 | bool loaded = backdrops[i].buffer && | 209 | backdrops[i].buflib_handle = |
167 | screens[SCREEN_MAIN].backdrop_load( | 210 | core_alloc_ex(global_settings.backdrop_file, |
168 | global_settings.backdrop_file, | 211 | LCD_BACKDROP_BYTES, &buflib_ops); |
169 | backdrops[i].buffer); | 212 | if (backdrops[i].buflib_handle < 0) |
170 | backdrops[i].name[2] = loaded ? '.' : '\0'; | 213 | return; |
214 | backdrops[i].buffer = core_get_data(backdrops[i].buflib_handle); | ||
215 | handle_being_loaded = backdrops[i].buflib_handle; | ||
216 | loaded = screens[SCREEN_MAIN].backdrop_load( | ||
217 | global_settings.backdrop_file, | ||
218 | backdrops[i].buffer); | ||
219 | handle_being_loaded = -1; | ||
220 | backdrops[i].name[2] = loaded ? '.' : '\0'; | ||
221 | } | ||
171 | return; | 222 | return; |
172 | } | 223 | } |
173 | else | 224 | else |
diff --git a/apps/gui/skin_engine/skin_engine.h b/apps/gui/skin_engine/skin_engine.h index ef4297d0ce..52ec19d5f9 100644 --- a/apps/gui/skin_engine/skin_engine.h +++ b/apps/gui/skin_engine/skin_engine.h | |||
@@ -43,12 +43,10 @@ enum skinnable_screens { | |||
43 | 43 | ||
44 | 44 | ||
45 | #ifdef HAVE_LCD_BITMAP | 45 | #ifdef HAVE_LCD_BITMAP |
46 | #define MAIN_BUFFER ((2*LCD_HEIGHT*LCD_WIDTH*LCD_DEPTH/8) \ | 46 | #define MAIN_BUFFER (2*LCD_HEIGHT*LCD_WIDTH*LCD_DEPTH/8) |
47 | + (SKINNABLE_SCREENS_COUNT * LCD_BACKDROP_BYTES)) | ||
48 | 47 | ||
49 | #if (NB_SCREENS > 1) | 48 | #if (NB_SCREENS > 1) |
50 | #define REMOTE_BUFFER (2*(LCD_REMOTE_HEIGHT*LCD_REMOTE_WIDTH*LCD_REMOTE_DEPTH/8) \ | 49 | #define REMOTE_BUFFER (2*(LCD_REMOTE_HEIGHT*LCD_REMOTE_WIDTH*LCD_REMOTE_DEPTH/8)) |
51 | + (SKINNABLE_SCREENS_COUNT * REMOTE_LCD_BACKDROP_BYTES)) | ||
52 | #else | 50 | #else |
53 | #define REMOTE_BUFFER 0 | 51 | #define REMOTE_BUFFER 0 |
54 | #endif | 52 | #endif |