diff options
author | Jonathan Gordon <rockbox@jdgordon.info> | 2010-02-16 05:24:27 +0000 |
---|---|---|
committer | Jonathan Gordon <rockbox@jdgordon.info> | 2010-02-16 05:24:27 +0000 |
commit | 877d378710337e7b89b015e3901e467fbcff53be (patch) | |
tree | e372499593369a7dd64f2f8dc72994bc183a829e /apps/gui | |
parent | 82f05895af2e361b983aa782e4294a641b287429 (diff) |
Reuse the backdrop buffers if 2 skins use the same backdrop (on the same screen of course)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24690 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/gui')
-rw-r--r-- | apps/gui/skin_engine/skin_backdrops.c | 119 | ||||
-rw-r--r-- | apps/gui/skin_engine/skin_engine.h | 6 | ||||
-rw-r--r-- | apps/gui/skin_engine/skin_parser.c | 43 | ||||
-rw-r--r-- | apps/gui/skin_engine/wps_internals.h | 3 |
4 files changed, 130 insertions, 41 deletions
diff --git a/apps/gui/skin_engine/skin_backdrops.c b/apps/gui/skin_engine/skin_backdrops.c new file mode 100644 index 0000000000..b057935241 --- /dev/null +++ b/apps/gui/skin_engine/skin_backdrops.c @@ -0,0 +1,119 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: skin_tokens.c 24526 2010-02-05 23:58:53Z jdgordon $ + * + * Copyright (C) 2010 Jonathan Gordon + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "config.h" +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#include "settings.h" +#include "skin_buffer.h" +#include "wps_internals.h" +#include "skin_engine.h" + +#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) + +static struct skin_backdrop { + char name[MAX_FILENAME+1]; + char *buffer; + enum screen_type screen; +} backdrops[SKINNABLE_SCREENS_COUNT*NB_SCREENS]; + +void skin_backdrop_init(void) +{ + int i; + for(i=0;i<SKINNABLE_SCREENS_COUNT*NB_SCREENS;i++) + { + backdrops[i].name[0] = '\0'; + backdrops[i].buffer = NULL; + } +} + +/* load a backdrop into the skin buffer. + * reuse buffers if the file is already loaded */ +char* skin_backdrop_load(char* backdrop, char *bmpdir, enum screen_type screen) +{ + int i; + struct skin_backdrop *bdrop = NULL; + char filename[MAX_PATH]; + size_t buf_size; + bool loaded = false; +#if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1) + if (screen == SCREEN_REMOTE) + buf_size = REMOTE_LCD_BACKDROP_BYTES; + else +#endif + buf_size = LCD_BACKDROP_BYTES; + + if (backdrop[0] == '-') + { +#if NB_SCREENS > 1 + if (screen == SCREEN_REMOTE) + { + return NULL; /* remotes don't have a backdrop setting (yet!) */ + } + else +#endif + { + if (!global_settings.backdrop_file[0]) + { + return NULL; /* backdrop setting not set */ + } + snprintf(filename, sizeof(filename), "%s/%s.bmp", + BACKDROP_DIR, global_settings.backdrop_file); + } + } + else + { + get_image_filename(backdrop, bmpdir, filename, sizeof(filename)); + } + + for(i=0;i<SKINNABLE_SCREENS_COUNT*NB_SCREENS;i++) + { + if (!strcmp(backdrops[i].name, backdrop) && backdrops[i].screen == screen) + { + return backdrops[i].buffer; + } + else if (backdrops[i].buffer == NULL) + { + bdrop = &backdrops[i]; + } + } + if (!bdrop) + return NULL; /* too many backdrops loaded */ + + bdrop->buffer = skin_buffer_alloc(buf_size); + if (!bdrop->buffer) + return NULL; + loaded = screens[screen].backdrop_load(filename, bdrop->buffer); + bdrop->screen = screen; + strlcpy(bdrop->name, backdrop, MAX_FILENAME+1); + bdrop->name[MAX_FILENAME] = '\0'; + + return loaded ? bdrop->buffer : NULL; +} +#else + +void skin_backdrop_init(void) +{ +} +#endif + diff --git a/apps/gui/skin_engine/skin_engine.h b/apps/gui/skin_engine/skin_engine.h index c5afe3e9f5..642f15aaad 100644 --- a/apps/gui/skin_engine/skin_engine.h +++ b/apps/gui/skin_engine/skin_engine.h @@ -60,4 +60,10 @@ void skin_data_init(struct wps_data *wps_data); /* call this in statusbar toggle handlers if needed */ void skin_statusbar_changed(struct gui_wps*); + + +/* load a backdrop into the skin buffer. + * reuse buffers if the file is already loaded */ +char* skin_backdrop_load(char* backdrop, char *bmpdir, enum screen_type screen); +void skin_backdrop_init(void); #endif diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c index 034ff532f0..fe68c7c57e 100644 --- a/apps/gui/skin_engine/skin_parser.c +++ b/apps/gui/skin_engine/skin_parser.c @@ -567,7 +567,7 @@ static int get_image_id(int c) return -1; } -static char *get_image_filename(const char *start, const char* bmpdir, +char *get_image_filename(const char *start, const char* bmpdir, char *buf, int buf_size) { const char *end = strchr(start, '|'); @@ -2045,45 +2045,8 @@ static bool load_skin_bitmaps(struct wps_data *wps_data, char *bmpdir) */ if (wps_data->backdrop) { - char img_path[MAX_PATH]; - bool loaded = false; - size_t buf_size; -#if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1) - if (curr_screen == SCREEN_REMOTE) - buf_size = REMOTE_LCD_BACKDROP_BYTES; - else -#endif - buf_size = LCD_BACKDROP_BYTES; - if (wps_data->backdrop[0] == '-') - { -#if NB_SCREENS > 1 - if (curr_screen == SCREEN_REMOTE) - { - wps_data->backdrop = NULL; - return true; - } - else -#endif - { - if (!global_settings.backdrop_file[0]) - { - wps_data->backdrop = NULL; - return true; - } - snprintf(img_path, sizeof(img_path), "%s/%s.bmp", - BACKDROP_DIR, global_settings.backdrop_file); - } - } - else - { - get_image_filename(wps_data->backdrop, bmpdir, - img_path, sizeof(img_path)); - } - char *buffer = skin_buffer_alloc(buf_size); - if (!buffer) - return false; - loaded = screens[curr_screen].backdrop_load(img_path, buffer); - wps_data->backdrop = loaded ? buffer : NULL; + wps_data->backdrop = skin_backdrop_load(wps_data->backdrop, + bmpdir, curr_screen); } #endif /* has backdrop support */ diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h index e659f08d35..04a295a449 100644 --- a/apps/gui/skin_engine/wps_internals.h +++ b/apps/gui/skin_engine/wps_internals.h @@ -353,7 +353,8 @@ struct gui_wps /* gui_wps end */ - +char *get_image_filename(const char *start, const char* bmpdir, + char *buf, int buf_size); /***** wps_tokens.c ******/ const char *get_token_value(struct gui_wps *gwps, |