diff options
Diffstat (limited to 'apps/gui/skin_engine/skin_backdrops.c')
-rw-r--r-- | apps/gui/skin_engine/skin_backdrops.c | 164 |
1 files changed, 120 insertions, 44 deletions
diff --git a/apps/gui/skin_engine/skin_backdrops.c b/apps/gui/skin_engine/skin_backdrops.c index 9ceee0cd05..f5b72a9652 100644 --- a/apps/gui/skin_engine/skin_backdrops.c +++ b/apps/gui/skin_engine/skin_backdrops.c | |||
@@ -30,88 +30,164 @@ | |||
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 | ||
33 | #define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS | ||
33 | static struct skin_backdrop { | 34 | static struct skin_backdrop { |
34 | char name[MAX_PATH]; | 35 | char name[MAX_PATH]; |
35 | char *buffer; | 36 | char *buffer; |
36 | enum screen_type screen; | 37 | enum screen_type screen; |
37 | } backdrops[SKINNABLE_SCREENS_COUNT*NB_SCREENS]; | 38 | } backdrops[NB_BDROPS]; |
39 | |||
40 | #define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS | ||
38 | 41 | ||
39 | void skin_backdrop_init(void) | 42 | void skin_backdrop_init(void) |
40 | { | 43 | { |
41 | int i; | 44 | int i; |
42 | for(i=0;i<SKINNABLE_SCREENS_COUNT*NB_SCREENS;i++) | 45 | for (i=0; i<NB_BDROPS; i++) |
43 | { | 46 | { |
44 | backdrops[i].name[0] = '\0'; | 47 | backdrops[i].name[0] = '\0'; |
45 | backdrops[i].buffer = NULL; | 48 | backdrops[i].buffer = NULL; |
46 | } | 49 | } |
47 | } | 50 | } |
48 | 51 | ||
49 | /* load a backdrop into the skin buffer. | 52 | int skin_backdrop_assign(char* backdrop, char *bmpdir, |
50 | * reuse buffers if the file is already loaded */ | 53 | enum screen_type screen) |
51 | char* skin_backdrop_load(char* backdrop, char *bmpdir, enum screen_type screen) | ||
52 | { | 54 | { |
53 | int i; | ||
54 | struct skin_backdrop *bdrop = NULL; | ||
55 | char dir[MAX_PATH]; | 55 | char dir[MAX_PATH]; |
56 | char filename[MAX_PATH]; | 56 | char filename[MAX_PATH]; |
57 | size_t buf_size; | 57 | int i, free = -1; |
58 | bool loaded = false; | 58 | if (!backdrop) |
59 | #if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1) | 59 | return -1; |
60 | if (screen == SCREEN_REMOTE) | ||
61 | buf_size = REMOTE_LCD_BACKDROP_BYTES; | ||
62 | else | ||
63 | #endif | ||
64 | buf_size = LCD_BACKDROP_BYTES; | ||
65 | |||
66 | if (backdrop[0] == '-') | 60 | if (backdrop[0] == '-') |
67 | { | 61 | { |
62 | filename[0] = '-'; | ||
63 | filename[1] = '\0'; | ||
64 | filename[2] = '\0'; /* we check this later to see if we actually have an | ||
65 | image to load. != '\0' means display the image */ | ||
68 | #if NB_SCREENS > 1 | 66 | #if NB_SCREENS > 1 |
69 | if (screen == SCREEN_REMOTE) | 67 | if (screen == SCREEN_REMOTE) |
70 | { | 68 | { |
71 | return NULL; /* remotes don't have a backdrop setting (yet!) */ | 69 | filename[0] = '\0'; |
72 | } | 70 | } |
73 | else | ||
74 | #endif | 71 | #endif |
75 | { | ||
76 | char settings_bdrop = global_settings.backdrop_file[0]; | ||
77 | if (settings_bdrop == '\0' || settings_bdrop == '-') | ||
78 | { | ||
79 | return NULL; /* backdrop setting not set */ | ||
80 | } | ||
81 | snprintf(filename, sizeof(filename), "%s/%s.bmp", | ||
82 | get_user_file_path(BACKDROP_DIR, 0, dir, sizeof(dir)), | ||
83 | global_settings.backdrop_file); | ||
84 | } | ||
85 | } | 72 | } |
86 | else | 73 | else |
87 | { | 74 | { |
88 | const char *bd_dir = get_user_file_path(bmpdir, 0, dir, sizeof(dir)); | 75 | const char *bd_dir = get_user_file_path(bmpdir, 0, dir, sizeof(dir)); |
89 | get_image_filename(backdrop, bd_dir, filename, sizeof(filename)); | 76 | get_image_filename(backdrop, bd_dir, filename, sizeof(filename)); |
90 | } | 77 | } |
91 | 78 | for (i=0; i<NB_BDROPS; i++) | |
92 | for(i=0;i<SKINNABLE_SCREENS_COUNT*NB_SCREENS;i++) | ||
93 | { | 79 | { |
80 | if (!backdrops[i].name[0] && free < 0) | ||
81 | free = i; | ||
94 | if (!strcmp(backdrops[i].name, filename) && backdrops[i].screen == screen) | 82 | if (!strcmp(backdrops[i].name, filename) && backdrops[i].screen == screen) |
95 | { | 83 | { |
96 | return backdrops[i].buffer; | 84 | break; |
85 | } | ||
86 | } | ||
87 | if (i < NB_BDROPS) | ||
88 | return i; | ||
89 | else if (free >= 0) | ||
90 | { | ||
91 | strlcpy(backdrops[free].name, filename, | ||
92 | sizeof (backdrops[free].name)); | ||
93 | backdrops[free].buffer = NULL; | ||
94 | backdrops[free].screen = screen; | ||
95 | return free; | ||
96 | } | ||
97 | return -1; | ||
98 | } | ||
99 | |||
100 | bool skin_backdrops_preload(void) | ||
101 | { | ||
102 | bool retval = true; | ||
103 | int i; | ||
104 | char *filename; | ||
105 | for (i=0; i<NB_BDROPS; i++) | ||
106 | { | ||
107 | if (backdrops[i].name[0] && !backdrops[i].buffer) | ||
108 | { | ||
109 | size_t buf_size; | ||
110 | bool loaded = false; | ||
111 | enum screen_type screen = backdrops[i].screen; | ||
112 | #if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1) | ||
113 | if (screen == SCREEN_REMOTE) | ||
114 | buf_size = REMOTE_LCD_BACKDROP_BYTES; | ||
115 | else | ||
116 | #endif | ||
117 | buf_size = LCD_BACKDROP_BYTES; | ||
118 | |||
119 | filename = backdrops[i].name; | ||
120 | if (screen == SCREEN_MAIN && global_settings.backdrop_file[0] && | ||
121 | global_settings.backdrop_file[0] != '-' && filename[0] == '-') | ||
122 | { | ||
123 | char dir[MAX_PATH]; | ||
124 | char* temp = filename+2; /* slightly hacky to get a buffer */ | ||
125 | size_t size = sizeof(backdrops[i].name) - 2; | ||
126 | snprintf(temp, size, "%s/%s.bmp", | ||
127 | get_user_file_path(BACKDROP_DIR, 0, dir, sizeof(dir)), | ||
128 | global_settings.backdrop_file); | ||
129 | filename = temp; | ||
130 | } | ||
131 | if (*filename && *filename != '-') | ||
132 | { | ||
133 | backdrops[i].buffer = (char*)skin_buffer_alloc(buf_size); | ||
134 | loaded = backdrops[i].buffer && | ||
135 | screens[screen].backdrop_load(filename, backdrops[i].buffer); | ||
136 | if (!loaded) | ||
137 | retval = false; | ||
138 | } | ||
139 | if (backdrops[i].name[0] == '-' && loaded) | ||
140 | backdrops[i].name[2] = '.'; | ||
97 | } | 141 | } |
98 | else if (!bdrop && backdrops[i].buffer == NULL) | 142 | } |
143 | return retval; | ||
144 | } | ||
145 | |||
146 | void skin_backdrop_show(int backdrop_id) | ||
147 | { | ||
148 | if (backdrop_id < 0) | ||
149 | return; | ||
150 | enum screen_type screen = backdrops[backdrop_id].screen; | ||
151 | if (backdrops[backdrop_id].name[0] == '-' && | ||
152 | backdrops[backdrop_id].name[2] == '\0') | ||
153 | return; | ||
154 | if (backdrops[backdrop_id].buffer) | ||
155 | screens[screen].backdrop_show(backdrops[backdrop_id].buffer); | ||
156 | } | ||
157 | |||
158 | void skin_backdrop_unload(int backdrop_id) | ||
159 | { | ||
160 | backdrops[backdrop_id].buffer = NULL; | ||
161 | } | ||
162 | |||
163 | void skin_backdrop_load_setting(void) | ||
164 | { | ||
165 | int i; | ||
166 | char filename[MAX_PATH], dir[MAX_PATH]; | ||
167 | for(i=0;i<SKINNABLE_SCREENS_COUNT*NB_SCREENS;i++) | ||
168 | { | ||
169 | if (backdrops[i].name[0] == '-' && backdrops[i].screen == SCREEN_MAIN) | ||
99 | { | 170 | { |
100 | bdrop = &backdrops[i]; | 171 | if (global_settings.backdrop_file[0] && |
172 | global_settings.backdrop_file[0] != '-') | ||
173 | { | ||
174 | if (!backdrops[i].buffer) | ||
175 | backdrops[i].buffer = (char*)skin_buffer_alloc(LCD_BACKDROP_BYTES); | ||
176 | snprintf(filename, sizeof filename, "%s/%s.bmp", | ||
177 | get_user_file_path(BACKDROP_DIR, 0, dir, sizeof(dir)), | ||
178 | global_settings.backdrop_file); | ||
179 | bool loaded = backdrops[i].buffer && | ||
180 | screens[SCREEN_MAIN].backdrop_load(filename, | ||
181 | backdrops[i].buffer); | ||
182 | backdrops[i].name[2] = loaded ? '.' : '\0'; | ||
183 | return; | ||
184 | } | ||
185 | else | ||
186 | backdrops[i].name[2] = '\0'; | ||
101 | } | 187 | } |
102 | } | 188 | } |
103 | if (!bdrop) | ||
104 | return NULL; /* too many backdrops loaded */ | ||
105 | |||
106 | bdrop->buffer = (char*)skin_buffer_alloc(buf_size); | ||
107 | if (!bdrop->buffer) | ||
108 | return NULL; | ||
109 | loaded = screens[screen].backdrop_load(filename, bdrop->buffer); | ||
110 | bdrop->screen = screen; | ||
111 | strlcpy(bdrop->name, filename, sizeof(bdrop->name)); | ||
112 | |||
113 | return loaded ? bdrop->buffer : NULL; | ||
114 | } | 189 | } |
190 | |||
115 | #else | 191 | #else |
116 | 192 | ||
117 | void skin_backdrop_init(void) | 193 | void skin_backdrop_init(void) |