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,
enum skinnable_screens skin, enum screen_type screen);
static struct gui_skin_helper {
int (*preproccess)(enum screen_type screen, struct wps_data *data);
int (*postproccess)(enum screen_type screen, struct wps_data *data);
struct gui_skin_helper {
void (*process)(enum screen_type screen, struct wps_data *data, bool preprocess);
char* (*default_skin)(enum screen_type screen);
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
[FM_SCREEN] = { NULL, NULL, default_radio_skin, false }
[FM_SCREEN] = SKH(dummy_process, default_radio_skin, false),
#endif
};
@ -71,7 +79,6 @@ static struct gui_skin {
struct wps_data data;
struct skin_stats stats;
bool failsafe_loaded;
bool needs_full_update;
} skins[SKINNABLE_SCREENS_COUNT][NB_SCREENS];
@ -187,7 +194,7 @@ void settings_apply_skins(void)
}
gui_skin_reset(&skins[i][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);
}
}
@ -206,24 +213,22 @@ void skin_load(enum skinnable_screens skin, enum screen_type screen,
{
bool loaded = false;
if (skin_helpers[skin].preproccess)
skin_helpers[skin].preproccess(screen, &skins[skin][screen].data);
skin_helpers[skin]->process(screen, &skins[skin][screen].data, true);
if (buf && *buf)
loaded = skin_data_load(screen, &skins[skin][screen].data, buf, isfile,
&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,
skin_helpers[skin].default_skin(screen), false,
skin_helpers[skin]->default_skin(screen), false,
&skins[skin][screen].stats);
skins[skin][screen].failsafe_loaded = loaded;
}
skins[skin][screen].needs_full_update = true;
if (skin_helpers[skin].postproccess)
skin_helpers[skin].postproccess(screen, &skins[skin][screen].data);
skin_helpers[skin]->process(screen, &skins[skin][screen].data, false);
#ifdef HAVE_BACKDROP_IMAGE
if (loaded)
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)
{
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 screen *display = &screens[curr_screen];

View file

@ -98,8 +98,8 @@ struct gui_img {
struct bitmap bm;
int buflib_handle;
OFFSETTYPE(char*) label;
bool loaded; /* load state */
int display;
bool loaded; /* load state */
bool using_preloaded_icons; /* using the icon system instead of a bmp */
bool is_9_segment;
bool dither;
@ -114,6 +114,9 @@ struct image_display {
struct progressbar {
enum skin_token_type type;
bool follow_lang_direction;
bool horizontal;
char setting_offset;
/* regular pb */
short x;
/* >=0: explicitly set in the tag -> y-coord within the viewport
@ -122,17 +125,14 @@ struct progressbar {
short y;
short width;
short height;
bool follow_lang_direction;
OFFSETTYPE(struct gui_img *) image;
bool invert_fill_direction;
bool nofill;
bool noborder;
bool nobar;
OFFSETTYPE(struct gui_img *) slider;
bool horizontal;
char setting_offset;
OFFSETTYPE(struct gui_img *) backdrop;
const struct settings_list *setting;
};
@ -185,10 +185,10 @@ struct gradient_config {
struct skin_viewport {
struct viewport vp; /* The LCD viewport struct */
struct frame_buffer_t framebuf; /* holds reference to current framebuffer */
char hidden_flags;
bool is_infovp;
OFFSETTYPE(char*) label;
int parsed_fontid;
char hidden_flags;
bool is_infovp;
#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
bool output_to_backdrop_buffer;
bool fgbg_changed;
@ -213,14 +213,15 @@ struct touchregion {
short int hpad; /* padding to height */
bool reverse_bar; /* if true 0% is the left or top */
bool allow_while_locked;
bool armed; /* A region is armed on press. Only armed regions are triggered
on repeat or release. */
enum {
PRESS, /* quick press only */
LONG_PRESS, /* Long press without repeat */
REPEAT, /* long press allowing repeats */
} press_length;
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 */
struct touchsetting {
const struct settings_list *setting; /* setting being controlled */
@ -365,8 +366,8 @@ struct wps_data
#endif
#ifdef HAVE_TOUCHSCREEN
OFFSETTYPE(struct skin_token_list *) touchregions;
bool touchscreen_locked;
OFFSETTYPE(struct skin_token_list *) touchregions;
#endif
#ifdef HAVE_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;
}
int sb_preproccess(enum screen_type screen, struct wps_data *data)
{
(void)data;
sbs_loaded[screen] = false;
sbs_has_title[screen] = false;
viewportmanager_theme_enable(screen, false, NULL);
return 1;
}
int sb_postproccess(enum screen_type screen, struct wps_data *data)
void sb_process(enum screen_type screen, struct wps_data *data, bool preprocess)
{
if (preprocess)
{
sbs_loaded[screen] = false;
sbs_has_title[screen] = false;
viewportmanager_theme_enable(screen, false, NULL);
return;
}
if (data->wps_loaded)
{
/* 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)
{ /* no second viewport, let parsing fail */
return 0;
return;
}
/* hide this viewport, forever */
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;
}
viewportmanager_theme_undo(screen, false);
return 1;
}
static OFFSETTYPE(char*) infovp_label[NB_SCREENS];

View file

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

View file

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