From aaf30651df27e0eb6fab876502fa1e6c084160bf Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Tue, 12 Feb 2013 21:00:05 +1100 Subject: skin_engine: Add a debug screen to display skin ram usage Change-Id: Ida9c33211d9360ac88e30a2cf8df9f191bee8b45 --- apps/gui/bitmap/list.c | 2 ++ apps/gui/skin_engine/skin_backdrops.c | 19 +++++++++++++++++++ apps/gui/skin_engine/skin_engine.c | 16 ++++++++++++++-- apps/gui/skin_engine/skin_engine.h | 2 +- apps/gui/skin_engine/skin_parser.c | 12 +++++++++--- apps/gui/skin_engine/wps_internals.h | 11 +++++++++++ 6 files changed, 56 insertions(+), 6 deletions(-) (limited to 'apps/gui') diff --git a/apps/gui/bitmap/list.c b/apps/gui/bitmap/list.c index 191446e186..ede0de8881 100644 --- a/apps/gui/bitmap/list.c +++ b/apps/gui/bitmap/list.c @@ -277,6 +277,7 @@ void list_draw(struct screen *display, struct gui_synclist *list) list_icons.x += indent; list_text_vp->x += indent; } + list_icons.width -= indent; list_text_vp->width -= indent; } @@ -392,6 +393,7 @@ void list_draw(struct screen *display, struct gui_synclist *list) list_icons.x -= indent; list_text_vp->x -= indent; } + list_icons.width += indent; list_text_vp->width += indent; } } diff --git a/apps/gui/skin_engine/skin_backdrops.c b/apps/gui/skin_engine/skin_backdrops.c index 0d3c8b605f..4d0345c21d 100644 --- a/apps/gui/skin_engine/skin_backdrops.c +++ b/apps/gui/skin_engine/skin_backdrops.c @@ -44,6 +44,25 @@ static struct skin_backdrop { static int handle_being_loaded; static int current_lcd_backdrop[NB_SCREENS]; +bool skin_backdrop_get_debug(int index, char **path, int *ref_count, size_t *size) +{ + + if (index + 1 >= NB_BDROPS) + return false; + + *path = backdrops[index].name; + *ref_count = backdrops[index].ref_count; + +#if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1) + enum screen_type screen = backdrops[index].screen; + if (screen == SCREEN_REMOTE) + *size = REMOTE_LCD_BACKDROP_BYTES; + else +#endif + *size = LCD_BACKDROP_BYTES; + return true; +} + static int buflib_move_callback(int handle, void* current, void* new) { if (handle == handle_being_loaded) diff --git a/apps/gui/skin_engine/skin_engine.c b/apps/gui/skin_engine/skin_engine.c index 3c3f3221b4..4c113e5c68 100644 --- a/apps/gui/skin_engine/skin_engine.c +++ b/apps/gui/skin_engine/skin_engine.c @@ -65,11 +65,21 @@ static struct gui_skin_helper { static struct gui_skin { struct gui_wps gui_wps; struct wps_data data; + struct skin_stats stats; bool failsafe_loaded; bool needs_full_update; } skins[SKINNABLE_SCREENS_COUNT][NB_SCREENS]; +int skin_get_num_skins(void) +{ + return SKINNABLE_SCREENS_COUNT; +} + +struct skin_stats *skin_get_stats(int number, int screen) +{ + return &skins[number][screen].stats; +} static void gui_skin_reset(struct gui_skin *skin) { @@ -167,12 +177,14 @@ void skin_load(enum skinnable_screens skin, enum screen_type screen, skin_helpers[skin].preproccess(screen, &skins[skin][screen].data); if (buf && *buf) - loaded = skin_data_load(screen, &skins[skin][screen].data, buf, isfile); + loaded = skin_data_load(screen, &skins[skin][screen].data, buf, isfile, + &skins[skin][screen].stats); if (!loaded && skin_helpers[skin].default_skin) { loaded = skin_data_load(screen, &skins[skin][screen].data, - skin_helpers[skin].default_skin(screen), false); + skin_helpers[skin].default_skin(screen), false, + &skins[skin][screen].stats); skins[skin][screen].failsafe_loaded = loaded; } diff --git a/apps/gui/skin_engine/skin_engine.h b/apps/gui/skin_engine/skin_engine.h index 07fafe6a10..59e00b5176 100644 --- a/apps/gui/skin_engine/skin_engine.h +++ b/apps/gui/skin_engine/skin_engine.h @@ -57,7 +57,7 @@ void skin_update(enum skinnable_screens skin, enum screen_type screen, * or from a skinfile (isfile = true) */ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data, - const char *buf, bool isfile); + const char *buf, bool isfile, struct skin_stats *stats); bool skin_has_sbs(enum screen_type screen, struct wps_data *data); diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c index adfda54335..cb185d88ba 100644 --- a/apps/gui/skin_engine/skin_parser.c +++ b/apps/gui/skin_engine/skin_parser.c @@ -83,6 +83,7 @@ static char* skin_buffer = NULL; #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) static char *backdrop_filename; #endif +static struct skin_stats *_stats = NULL; static bool isdefault(struct skin_tag_parameter *param) { @@ -1770,6 +1771,8 @@ static int load_skin_bmp(struct wps_data *wps_data, struct bitmap *bitmap, char* close(fd); return handle; } + _stats->buflib_handles++; + _stats->images_size += buf_size; lseek(fd, 0, SEEK_SET); lock_handle(handle); bitmap->data = core_get_data(handle); @@ -2282,7 +2285,7 @@ static int skin_element_callback(struct skin_element* element, void* data) /* to setup up the wps-data from a format-buffer (isfile = false) from a (wps-)file (isfile = true)*/ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data, - const char *buf, bool isfile) + const char *buf, bool isfile, struct skin_stats *stats) { char *wps_buffer = NULL; if (!wps_data || !buf) @@ -2315,8 +2318,9 @@ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data, } #endif - - /* get buffer space from the plugin buffer */ + _stats = stats; + skin_clear_stats(stats); + /* get buffer space from the plugin buffer */ size_t buffersize = 0; wps_buffer = (char *)plugin_get_buffer(&buffersize); @@ -2426,6 +2430,8 @@ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data, wps_data->wps_loaded = true; memcpy(core_get_data(wps_data->buflib_handle), skin_buffer, skin_buffer_usage()); + stats->buflib_handles++; + stats->tree_size = skin_buffer_usage(); } #else wps_data->wps_loaded = wps_data->tree >= 0; diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h index 72bab9b668..c9d5429484 100644 --- a/apps/gui/skin_engine/wps_internals.h +++ b/apps/gui/skin_engine/wps_internals.h @@ -31,6 +31,17 @@ #include "core_alloc.h" #endif +struct skin_stats { + size_t buflib_handles; + size_t tree_size; + size_t images_size; +}; + +int skin_get_num_skins(void); +struct skin_stats *skin_get_stats(int number, int screen); +#define skin_clear_stats(stats) memset(stats, 0, sizeof(struct skin_stats)) +bool skin_backdrop_get_debug(int index, char **path, int *ref_count, size_t *size); + /* Timeout unit expressed in HZ. In WPS, all timeouts are given in seconds (possibly with a decimal fraction) but stored as integer values. E.g. 2.5 is stored as 25. This means 25 tenth of a second, i.e. 25 units. -- cgit v1.2.3