diff options
author | Jonathan Gordon <rockbox@jdgordon.info> | 2010-09-14 11:56:50 +0000 |
---|---|---|
committer | Jonathan Gordon <rockbox@jdgordon.info> | 2010-09-14 11:56:50 +0000 |
commit | 9928e3418f67fe6d2f82292ddbddcf56ae20b8f6 (patch) | |
tree | 397b13a537a476feb77b7d052250b98055924aec /apps/gui/skin_engine/skin_backdrops.c | |
parent | 0928cdf074c8991f470fa0d96e6d4f828998b643 (diff) | |
download | rockbox-9928e3418f67fe6d2f82292ddbddcf56ae20b8f6.tar.gz rockbox-9928e3418f67fe6d2f82292ddbddcf56ae20b8f6.zip |
Another major skin backend update/hopefully bugfix:
Skins are now more self contained in the skin manager which in the future might allow on demand skin loading (i.e smaller skin buffers)
Skin backdrops are also managed more intelegently (fixes a bug where you can get a crazy backdrop loaded if a .sbs fails to load)
the rockbox_default rescue theme is now called rockbox_failsafe to better express what it actually is.
This commit hopefully/maybe fixes the heavily reported data aborts, so please check if you are getting them
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28073 a1c6a512-1295-4272-9138-f99709370657
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) |