From 070f6e13978aa5a77004b719ea0895f55ec67337 Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Thu, 8 Sep 2011 11:24:29 +0000 Subject: 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 --- apps/gui/skin_engine/skin_backdrops.c | 75 +++++++++++++++++++++++++++++------ apps/gui/skin_engine/skin_engine.h | 6 +-- 2 files changed, 65 insertions(+), 16 deletions(-) (limited to 'apps/gui/skin_engine') 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 @@ #include "config.h" #include #include +#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 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 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 { #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 -- cgit v1.2.3