skin_engine minor refactoring struct alignment No Functional Changes

Move some elements around to save 720 bytes in the skin engine with cabbie

saves some code manipulating the skin_helpers arrays in skin_engine
eliminate conditionals checking for pre/post process functions
using a dummy fn(), consolidate pre/post process into a single function
adding a bool preprocess to indicate stage

Change-Id: Id2df4706b73e9025c7300be135dc02e135e587fe
This commit is contained in:
William Wilgus 2024-12-03 01:09:24 -05:00 committed by William Wilgus
parent f1010005b0
commit 68d4fd0e5b
6 changed files with 49 additions and 43 deletions

View file

@ -53,16 +53,24 @@ static bool skins_initialised = false;
static char* get_skin_filename(char *buf, size_t buf_size, static char* get_skin_filename(char *buf, size_t buf_size,
enum skinnable_screens skin, enum screen_type screen); enum skinnable_screens skin, enum screen_type screen);
static struct gui_skin_helper { struct gui_skin_helper {
int (*preproccess)(enum screen_type screen, struct wps_data *data); void (*process)(enum screen_type screen, struct wps_data *data, bool preprocess);
int (*postproccess)(enum screen_type screen, struct wps_data *data);
char* (*default_skin)(enum screen_type screen); char* (*default_skin)(enum screen_type screen);
bool load_on_boot; bool load_on_boot;
} skin_helpers[SKINNABLE_SCREENS_COUNT] = { };
[CUSTOM_STATUSBAR] = { sb_preproccess, sb_postproccess, sb_create_from_settings, true },
[WPS] = { NULL, NULL, wps_default_skin, true }, void dummy_process(enum screen_type screen, struct wps_data *data, bool preprocess)
{ (void)screen, (void)data, (void)preprocess; } /* dummy replaces conditionals */
static const struct gui_skin_helper empty_skin_helper = {&dummy_process,NULL,false};
static const struct gui_skin_helper const * skin_helpers[SKINNABLE_SCREENS_COUNT] =
{
#define SKH(proc, def, lob) &((struct gui_skin_helper){proc, def, lob})
&empty_skin_helper,
[CUSTOM_STATUSBAR] = SKH(sb_process, sb_create_from_settings, true),
[WPS] = SKH(dummy_process, wps_default_skin, true),
#if CONFIG_TUNER #if CONFIG_TUNER
[FM_SCREEN] = { NULL, NULL, default_radio_skin, false } [FM_SCREEN] = SKH(dummy_process, default_radio_skin, false),
#endif #endif
}; };
@ -71,7 +79,6 @@ static struct gui_skin {
struct wps_data data; struct wps_data data;
struct skin_stats stats; struct skin_stats stats;
bool failsafe_loaded; bool failsafe_loaded;
bool needs_full_update; bool needs_full_update;
} skins[SKINNABLE_SCREENS_COUNT][NB_SCREENS]; } skins[SKINNABLE_SCREENS_COUNT][NB_SCREENS];
@ -187,7 +194,7 @@ void settings_apply_skins(void)
} }
gui_skin_reset(&skins[i][j]); gui_skin_reset(&skins[i][j]);
skins[i][j].gui_wps.display = &screens[j]; skins[i][j].gui_wps.display = &screens[j];
if (skin_helpers[i].load_on_boot) if (skin_helpers[i]->load_on_boot)
skin_get_gwps(i, j); skin_get_gwps(i, j);
} }
} }
@ -206,24 +213,22 @@ void skin_load(enum skinnable_screens skin, enum screen_type screen,
{ {
bool loaded = false; bool loaded = false;
if (skin_helpers[skin].preproccess) skin_helpers[skin]->process(screen, &skins[skin][screen].data, true);
skin_helpers[skin].preproccess(screen, &skins[skin][screen].data);
if (buf && *buf) 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); &skins[skin][screen].stats);
if (!loaded && skin_helpers[skin].default_skin) if (!loaded && skin_helpers[skin]->default_skin)
{ {
loaded = skin_data_load(screen, &skins[skin][screen].data, 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].stats);
skins[skin][screen].failsafe_loaded = loaded; skins[skin][screen].failsafe_loaded = loaded;
} }
skins[skin][screen].needs_full_update = true; skins[skin][screen].needs_full_update = true;
if (skin_helpers[skin].postproccess) skin_helpers[skin]->process(screen, &skins[skin][screen].data, false);
skin_helpers[skin].postproccess(screen, &skins[skin][screen].data);
#ifdef HAVE_BACKDROP_IMAGE #ifdef HAVE_BACKDROP_IMAGE
if (loaded) if (loaded)
skin_backdrops_preload(); skin_backdrops_preload();

View file

@ -2162,6 +2162,10 @@ static bool skin_load_fonts(struct wps_data *data)
static int convert_viewport(struct wps_data *data, struct skin_element* element) static int convert_viewport(struct wps_data *data, struct skin_element* element)
{ {
if (element->tag)
DEBUGF("%s %s\n", __func__, element->tag->name);
else
DEBUGF("%s %s\n", __func__, "?");
struct skin_viewport *skin_vp = skin_buffer_alloc(sizeof(*skin_vp)); struct skin_viewport *skin_vp = skin_buffer_alloc(sizeof(*skin_vp));
struct screen *display = &screens[curr_screen]; struct screen *display = &screens[curr_screen];

View file

@ -98,8 +98,8 @@ struct gui_img {
struct bitmap bm; struct bitmap bm;
int buflib_handle; int buflib_handle;
OFFSETTYPE(char*) label; OFFSETTYPE(char*) label;
bool loaded; /* load state */
int display; int display;
bool loaded; /* load state */
bool using_preloaded_icons; /* using the icon system instead of a bmp */ bool using_preloaded_icons; /* using the icon system instead of a bmp */
bool is_9_segment; bool is_9_segment;
bool dither; bool dither;
@ -114,6 +114,9 @@ struct image_display {
struct progressbar { struct progressbar {
enum skin_token_type type; enum skin_token_type type;
bool follow_lang_direction;
bool horizontal;
char setting_offset;
/* regular pb */ /* regular pb */
short x; short x;
/* >=0: explicitly set in the tag -> y-coord within the viewport /* >=0: explicitly set in the tag -> y-coord within the viewport
@ -122,17 +125,14 @@ struct progressbar {
short y; short y;
short width; short width;
short height; short height;
bool follow_lang_direction;
OFFSETTYPE(struct gui_img *) image; OFFSETTYPE(struct gui_img *) image;
bool invert_fill_direction; bool invert_fill_direction;
bool nofill; bool nofill;
bool noborder; bool noborder;
bool nobar; bool nobar;
OFFSETTYPE(struct gui_img *) slider; OFFSETTYPE(struct gui_img *) slider;
bool horizontal;
char setting_offset;
OFFSETTYPE(struct gui_img *) backdrop; OFFSETTYPE(struct gui_img *) backdrop;
const struct settings_list *setting; const struct settings_list *setting;
}; };
@ -185,10 +185,10 @@ struct gradient_config {
struct skin_viewport { struct skin_viewport {
struct viewport vp; /* The LCD viewport struct */ struct viewport vp; /* The LCD viewport struct */
struct frame_buffer_t framebuf; /* holds reference to current framebuffer */ struct frame_buffer_t framebuf; /* holds reference to current framebuffer */
char hidden_flags;
bool is_infovp;
OFFSETTYPE(char*) label; OFFSETTYPE(char*) label;
int parsed_fontid; int parsed_fontid;
char hidden_flags;
bool is_infovp;
#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
bool output_to_backdrop_buffer; bool output_to_backdrop_buffer;
bool fgbg_changed; bool fgbg_changed;
@ -213,14 +213,15 @@ struct touchregion {
short int hpad; /* padding to height */ short int hpad; /* padding to height */
bool reverse_bar; /* if true 0% is the left or top */ bool reverse_bar; /* if true 0% is the left or top */
bool allow_while_locked; bool allow_while_locked;
bool armed; /* A region is armed on press. Only armed regions are triggered
on repeat or release. */
enum { enum {
PRESS, /* quick press only */ PRESS, /* quick press only */
LONG_PRESS, /* Long press without repeat */ LONG_PRESS, /* Long press without repeat */
REPEAT, /* long press allowing repeats */ REPEAT, /* long press allowing repeats */
} press_length; } press_length;
int action; /* action this button will return */ int action; /* action this button will return */
bool armed; /* A region is armed on press. Only armed regions are triggered
on repeat or release. */
union { /* Extra data, action dependant */ union { /* Extra data, action dependant */
struct touchsetting { struct touchsetting {
const struct settings_list *setting; /* setting being controlled */ const struct settings_list *setting; /* setting being controlled */
@ -365,8 +366,8 @@ struct wps_data
#endif #endif
#ifdef HAVE_TOUCHSCREEN #ifdef HAVE_TOUCHSCREEN
OFFSETTYPE(struct skin_token_list *) touchregions;
bool touchscreen_locked; bool touchscreen_locked;
OFFSETTYPE(struct skin_token_list *) touchregions;
#endif #endif
#ifdef HAVE_ALBUMART #ifdef HAVE_ALBUMART
OFFSETTYPE(struct skin_albumart *) albumart; OFFSETTYPE(struct skin_albumart *) albumart;

View file

@ -76,16 +76,15 @@ enum themable_icons sb_get_icon(enum screen_type screen)
return sbs_has_title[screen] ? sbs_icon[screen] : Icon_NOICON + 2; return sbs_has_title[screen] ? sbs_icon[screen] : Icon_NOICON + 2;
} }
int sb_preproccess(enum screen_type screen, struct wps_data *data) void sb_process(enum screen_type screen, struct wps_data *data, bool preprocess)
{ {
(void)data; if (preprocess)
{
sbs_loaded[screen] = false; sbs_loaded[screen] = false;
sbs_has_title[screen] = false; sbs_has_title[screen] = false;
viewportmanager_theme_enable(screen, false, NULL); viewportmanager_theme_enable(screen, false, NULL);
return 1; return;
} }
int sb_postproccess(enum screen_type screen, struct wps_data *data)
{
if (data->wps_loaded) if (data->wps_loaded)
{ {
/* hide the sb's default viewport because it has nasty effect with stuff /* hide the sb's default viewport because it has nasty effect with stuff
@ -100,7 +99,7 @@ int sb_postproccess(enum screen_type screen, struct wps_data *data)
{ {
if (!next_vp) if (!next_vp)
{ /* no second viewport, let parsing fail */ { /* no second viewport, let parsing fail */
return 0; return;
} }
/* hide this viewport, forever */ /* hide this viewport, forever */
vp->hidden_flags = VP_NEVER_VISIBLE; vp->hidden_flags = VP_NEVER_VISIBLE;
@ -109,7 +108,6 @@ int sb_postproccess(enum screen_type screen, struct wps_data *data)
sbs_loaded[screen] = true; sbs_loaded[screen] = true;
} }
viewportmanager_theme_undo(screen, false); viewportmanager_theme_undo(screen, false);
return 1;
} }
static OFFSETTYPE(char*) infovp_label[NB_SCREENS]; static OFFSETTYPE(char*) infovp_label[NB_SCREENS];

View file

@ -49,8 +49,7 @@ int sb_touch_to_button(int context);
#endif #endif
int sb_get_backdrop(enum screen_type screen); int sb_get_backdrop(enum screen_type screen);
int sb_preproccess(enum screen_type screen, struct wps_data *data); void sb_process(enum screen_type screen, struct wps_data *data, bool preprocess);
int sb_postproccess(enum screen_type screen, struct wps_data *data);
void do_sbs_update_callback(unsigned short id, void *param); void do_sbs_update_callback(unsigned short id, void *param);
#endif /* __STATUSBAR_SKINNED_H__ */ #endif /* __STATUSBAR_SKINNED_H__ */

View file

@ -107,15 +107,14 @@ struct skin_tag_parameter
DEFAULT DEFAULT
} type; } type;
char type_code;
union union
{ {
int number; int number;
OFFSETTYPE(char*) text; OFFSETTYPE(char*) text;
OFFSETTYPE(struct skin_element*) code; OFFSETTYPE(struct skin_element*) code;
} data; } data;
char type_code;
}; };
/* Defines an element of a SKIN file, /* Defines an element of a SKIN file,
@ -151,7 +150,7 @@ struct skin_element
enum skin_cb_returnvalue enum skin_cb_returnvalue
{ {
CALLBACK_ERROR = -666, CALLBACK_ERROR = -128,
FEATURE_NOT_AVAILABLE, FEATURE_NOT_AVAILABLE,
CALLBACK_OK = 0, CALLBACK_OK = 0,
/* > 0 reserved for future use */ /* > 0 reserved for future use */