diff options
| author | Jonathan Gordon <rockbox@jdgordon.info> | 2011-09-08 11:24:29 +0000 |
|---|---|---|
| committer | Jonathan Gordon <rockbox@jdgordon.info> | 2011-09-08 11:24:29 +0000 |
| commit | 070f6e13978aa5a77004b719ea0895f55ec67337 (patch) | |
| tree | 621dccfceb6d37f326d724737e0a0d09e374531c | |
| parent | ae5d09b252f1038167a56488eb4058b6d8eb8427 (diff) | |
| download | rockbox-070f6e13978aa5a77004b719ea0895f55ec67337.zip rockbox-070f6e13978aa5a77004b719ea0895f55ec67337.tar.gz rockbox-070f6e13978aa5a77004b719ea0895f55ec67337.tar.bz2 rockbox-070f6e13978aa5a77004b719ea0895f55ec67337.tar.xz | |
Use buflib for the skin backdrop images potentially allowing multiple images per skin in the future
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30475 a1c6a512-1295-4272-9138-f99709370657
| -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 12950a6..303a353 100644 --- a/apps/gui/skin_engine/skin_backdrops.c +++ b/apps/gui/skin_engine/skin_backdrops.c @@ -22,11 +22,11 @@ #include "config.h" #include <stdio.h> #include <stdlib.h> +#include "core_alloc.h" #include "string-extra.h" #include "settings.h" #include "wps_internals.h" #include "skin_engine.h" -#include "skin_buffer.h" #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) @@ -36,19 +36,51 @@ static struct skin_backdrop { char *buffer; enum screen_type screen; bool loaded; + int buflib_handle; } backdrops[NB_BDROPS]; #define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS +int handle_being_loaded; +int current_lcd_backdrop[NB_SCREENS]; +int buflib_move_callback(int handle, void* current, void* new) +{ + int i; + if (handle == handle_being_loaded) + return BUFLIB_CB_CANNOT_MOVE; + for (i=0; i<NB_BDROPS; i++) + { + if (backdrops[i].buffer == current) + { + backdrops[i].buffer = new; + break; + } + } + FOR_NB_SCREENS(i) + skin_backdrop_show(current_lcd_backdrop[i]); + return BUFLIB_CB_OK; +} +static struct buflib_callbacks buflib_ops = {buflib_move_callback, NULL}; +static bool first_go = true; void skin_backdrop_init(void) { int i; + for (i=0; i<NB_BDROPS; i++) { + if (first_go) + backdrops[i].buflib_handle = -1; + else + skin_backdrop_unload(i); backdrops[i].name[0] = '\0'; backdrops[i].buffer = NULL; backdrops[i].loaded = false; + } + first_go = false; + FOR_NB_SCREENS(i) + current_lcd_backdrop[i] = -1; + handle_being_loaded = -1; } int skin_backdrop_assign(char* backdrop, char *bmpdir, @@ -117,10 +149,18 @@ bool skin_backdrops_preload(void) } if (*filename && *filename != '-') { - backdrops[i].buffer = (char*)skin_buffer_alloc(buf_size); - backdrops[i].loaded = backdrops[i].buffer && - screens[screen].backdrop_load(filename, backdrops[i].buffer); - if (!backdrops[i].loaded) + backdrops[i].buflib_handle = core_alloc_ex(filename, buf_size, &buflib_ops); + if (backdrops[i].buflib_handle > 0) + { + backdrops[i].buffer = core_get_data(backdrops[i].buflib_handle); + handle_being_loaded = backdrops[i].buflib_handle; + backdrops[i].loaded = + screens[screen].backdrop_load(filename, backdrops[i].buffer); + handle_being_loaded = -1; + if (!backdrops[i].loaded) + retval = false; + } + else retval = false; } if (backdrops[i].name[0] == '-' && backdrops[i].loaded) @@ -147,7 +187,10 @@ void skin_backdrop_show(int backdrop_id) void skin_backdrop_unload(int backdrop_id) { + if (backdrops[backdrop_id].buflib_handle > 0) + core_free(backdrops[backdrop_id].buflib_handle); backdrops[backdrop_id].buffer = NULL; + backdrops[backdrop_id].buflib_handle = -1; } void skin_backdrop_load_setting(void) @@ -161,13 +204,21 @@ void skin_backdrop_load_setting(void) global_settings.backdrop_file[0] != '-') { if (!backdrops[i].buffer) - backdrops[i].buffer = (char*)skin_buffer_alloc(LCD_BACKDROP_BYTES); - - bool loaded = backdrops[i].buffer && - screens[SCREEN_MAIN].backdrop_load( - global_settings.backdrop_file, - backdrops[i].buffer); - backdrops[i].name[2] = loaded ? '.' : '\0'; + { + bool loaded; + backdrops[i].buflib_handle = + core_alloc_ex(global_settings.backdrop_file, + LCD_BACKDROP_BYTES, &buflib_ops); + if (backdrops[i].buflib_handle < 0) + return; + backdrops[i].buffer = core_get_data(backdrops[i].buflib_handle); + handle_being_loaded = backdrops[i].buflib_handle; + loaded = screens[SCREEN_MAIN].backdrop_load( + global_settings.backdrop_file, + backdrops[i].buffer); + handle_being_loaded = -1; + backdrops[i].name[2] = loaded ? '.' : '\0'; + } return; } else diff --git a/apps/gui/skin_engine/skin_engine.h b/apps/gui/skin_engine/skin_engine.h index ef4297d..52ec19d 100644 --- a/apps/gui/skin_engine/skin_engine.h +++ b/apps/gui/skin_engine/skin_engine.h @@ -43,12 +43,10 @@ enum skinnable_screens { #ifdef HAVE_LCD_BITMAP -#define MAIN_BUFFER ((2*LCD_HEIGHT*LCD_WIDTH*LCD_DEPTH/8) \ - + (SKINNABLE_SCREENS_COUNT * LCD_BACKDROP_BYTES)) +#define MAIN_BUFFER (2*LCD_HEIGHT*LCD_WIDTH*LCD_DEPTH/8) #if (NB_SCREENS > 1) -#define REMOTE_BUFFER (2*(LCD_REMOTE_HEIGHT*LCD_REMOTE_WIDTH*LCD_REMOTE_DEPTH/8) \ - + (SKINNABLE_SCREENS_COUNT * REMOTE_LCD_BACKDROP_BYTES)) +#define REMOTE_BUFFER (2*(LCD_REMOTE_HEIGHT*LCD_REMOTE_WIDTH*LCD_REMOTE_DEPTH/8)) #else #define REMOTE_BUFFER 0 #endif |