A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd

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

authored by

William Wilgus and committed by
William Wilgus
68d4fd0e f1010005

+49 -43
+20 -15
apps/gui/skin_engine/skin_engine.c
··· 53 53 static char* get_skin_filename(char *buf, size_t buf_size, 54 54 enum skinnable_screens skin, enum screen_type screen); 55 55 56 - static struct gui_skin_helper { 57 - int (*preproccess)(enum screen_type screen, struct wps_data *data); 58 - int (*postproccess)(enum screen_type screen, struct wps_data *data); 56 + struct gui_skin_helper { 57 + void (*process)(enum screen_type screen, struct wps_data *data, bool preprocess); 59 58 char* (*default_skin)(enum screen_type screen); 60 59 bool load_on_boot; 61 - } skin_helpers[SKINNABLE_SCREENS_COUNT] = { 62 - [CUSTOM_STATUSBAR] = { sb_preproccess, sb_postproccess, sb_create_from_settings, true }, 63 - [WPS] = { NULL, NULL, wps_default_skin, true }, 60 + }; 61 + 62 + void dummy_process(enum screen_type screen, struct wps_data *data, bool preprocess) 63 + { (void)screen, (void)data, (void)preprocess; } /* dummy replaces conditionals */ 64 + 65 + static const struct gui_skin_helper empty_skin_helper = {&dummy_process,NULL,false}; 66 + static const struct gui_skin_helper const * skin_helpers[SKINNABLE_SCREENS_COUNT] = 67 + { 68 + #define SKH(proc, def, lob) &((struct gui_skin_helper){proc, def, lob}) 69 + &empty_skin_helper, 70 + [CUSTOM_STATUSBAR] = SKH(sb_process, sb_create_from_settings, true), 71 + [WPS] = SKH(dummy_process, wps_default_skin, true), 64 72 #if CONFIG_TUNER 65 - [FM_SCREEN] = { NULL, NULL, default_radio_skin, false } 73 + [FM_SCREEN] = SKH(dummy_process, default_radio_skin, false), 66 74 #endif 67 75 }; 68 76 ··· 71 79 struct wps_data data; 72 80 struct skin_stats stats; 73 81 bool failsafe_loaded; 74 - 75 82 bool needs_full_update; 76 83 } skins[SKINNABLE_SCREENS_COUNT][NB_SCREENS]; 77 84 ··· 187 194 } 188 195 gui_skin_reset(&skins[i][j]); 189 196 skins[i][j].gui_wps.display = &screens[j]; 190 - if (skin_helpers[i].load_on_boot) 197 + if (skin_helpers[i]->load_on_boot) 191 198 skin_get_gwps(i, j); 192 199 } 193 200 } ··· 206 213 { 207 214 bool loaded = false; 208 215 209 - if (skin_helpers[skin].preproccess) 210 - skin_helpers[skin].preproccess(screen, &skins[skin][screen].data); 216 + skin_helpers[skin]->process(screen, &skins[skin][screen].data, true); 211 217 212 218 if (buf && *buf) 213 219 loaded = skin_data_load(screen, &skins[skin][screen].data, buf, isfile, 214 220 &skins[skin][screen].stats); 215 221 216 - if (!loaded && skin_helpers[skin].default_skin) 222 + if (!loaded && skin_helpers[skin]->default_skin) 217 223 { 218 224 loaded = skin_data_load(screen, &skins[skin][screen].data, 219 - skin_helpers[skin].default_skin(screen), false, 225 + skin_helpers[skin]->default_skin(screen), false, 220 226 &skins[skin][screen].stats); 221 227 skins[skin][screen].failsafe_loaded = loaded; 222 228 } 223 229 224 230 skins[skin][screen].needs_full_update = true; 225 - if (skin_helpers[skin].postproccess) 226 - skin_helpers[skin].postproccess(screen, &skins[skin][screen].data); 231 + skin_helpers[skin]->process(screen, &skins[skin][screen].data, false); 227 232 #ifdef HAVE_BACKDROP_IMAGE 228 233 if (loaded) 229 234 skin_backdrops_preload();
+4
apps/gui/skin_engine/skin_parser.c
··· 2162 2162 2163 2163 static int convert_viewport(struct wps_data *data, struct skin_element* element) 2164 2164 { 2165 + if (element->tag) 2166 + DEBUGF("%s %s\n", __func__, element->tag->name); 2167 + else 2168 + DEBUGF("%s %s\n", __func__, "?"); 2165 2169 struct skin_viewport *skin_vp = skin_buffer_alloc(sizeof(*skin_vp)); 2166 2170 struct screen *display = &screens[curr_screen]; 2167 2171
+11 -10
apps/gui/skin_engine/wps_internals.h
··· 98 98 struct bitmap bm; 99 99 int buflib_handle; 100 100 OFFSETTYPE(char*) label; 101 - bool loaded; /* load state */ 102 101 int display; 102 + bool loaded; /* load state */ 103 103 bool using_preloaded_icons; /* using the icon system instead of a bmp */ 104 104 bool is_9_segment; 105 105 bool dither; ··· 114 114 115 115 struct progressbar { 116 116 enum skin_token_type type; 117 + bool follow_lang_direction; 118 + bool horizontal; 119 + char setting_offset; 117 120 /* regular pb */ 118 121 short x; 119 122 /* >=0: explicitly set in the tag -> y-coord within the viewport ··· 122 125 short y; 123 126 short width; 124 127 short height; 125 - bool follow_lang_direction; 126 128 127 129 OFFSETTYPE(struct gui_img *) image; 128 - 129 130 bool invert_fill_direction; 130 131 bool nofill; 131 132 bool noborder; 132 133 bool nobar; 133 134 OFFSETTYPE(struct gui_img *) slider; 134 - bool horizontal; 135 - char setting_offset; 135 + 136 136 OFFSETTYPE(struct gui_img *) backdrop; 137 137 const struct settings_list *setting; 138 138 }; ··· 185 185 struct skin_viewport { 186 186 struct viewport vp; /* The LCD viewport struct */ 187 187 struct frame_buffer_t framebuf; /* holds reference to current framebuffer */ 188 + OFFSETTYPE(char*) label; 189 + int parsed_fontid; 188 190 char hidden_flags; 189 191 bool is_infovp; 190 - OFFSETTYPE(char*) label; 191 - int parsed_fontid; 192 192 #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) 193 193 bool output_to_backdrop_buffer; 194 194 bool fgbg_changed; ··· 213 213 short int hpad; /* padding to height */ 214 214 bool reverse_bar; /* if true 0% is the left or top */ 215 215 bool allow_while_locked; 216 + bool armed; /* A region is armed on press. Only armed regions are triggered 217 + on repeat or release. */ 216 218 enum { 217 219 PRESS, /* quick press only */ 218 220 LONG_PRESS, /* Long press without repeat */ 219 221 REPEAT, /* long press allowing repeats */ 220 222 } press_length; 221 223 int action; /* action this button will return */ 222 - bool armed; /* A region is armed on press. Only armed regions are triggered 223 - on repeat or release. */ 224 + 224 225 union { /* Extra data, action dependant */ 225 226 struct touchsetting { 226 227 const struct settings_list *setting; /* setting being controlled */ ··· 365 366 #endif 366 367 367 368 #ifdef HAVE_TOUCHSCREEN 368 - OFFSETTYPE(struct skin_token_list *) touchregions; 369 369 bool touchscreen_locked; 370 + OFFSETTYPE(struct skin_token_list *) touchregions; 370 371 #endif 371 372 #ifdef HAVE_ALBUMART 372 373 OFFSETTYPE(struct skin_albumart *) albumart;
+9 -11
apps/gui/statusbar-skinned.c
··· 76 76 return sbs_has_title[screen] ? sbs_icon[screen] : Icon_NOICON + 2; 77 77 } 78 78 79 - int sb_preproccess(enum screen_type screen, struct wps_data *data) 80 - { 81 - (void)data; 82 - sbs_loaded[screen] = false; 83 - sbs_has_title[screen] = false; 84 - viewportmanager_theme_enable(screen, false, NULL); 85 - return 1; 86 - } 87 - int sb_postproccess(enum screen_type screen, struct wps_data *data) 79 + void sb_process(enum screen_type screen, struct wps_data *data, bool preprocess) 88 80 { 81 + if (preprocess) 82 + { 83 + sbs_loaded[screen] = false; 84 + sbs_has_title[screen] = false; 85 + viewportmanager_theme_enable(screen, false, NULL); 86 + return; 87 + } 89 88 if (data->wps_loaded) 90 89 { 91 90 /* hide the sb's default viewport because it has nasty effect with stuff ··· 100 99 { 101 100 if (!next_vp) 102 101 { /* no second viewport, let parsing fail */ 103 - return 0; 102 + return; 104 103 } 105 104 /* hide this viewport, forever */ 106 105 vp->hidden_flags = VP_NEVER_VISIBLE; ··· 109 108 sbs_loaded[screen] = true; 110 109 } 111 110 viewportmanager_theme_undo(screen, false); 112 - return 1; 113 111 } 114 112 115 113 static OFFSETTYPE(char*) infovp_label[NB_SCREENS];
+1 -2
apps/gui/statusbar-skinned.h
··· 49 49 #endif 50 50 51 51 int sb_get_backdrop(enum screen_type screen); 52 - int sb_preproccess(enum screen_type screen, struct wps_data *data); 53 - int sb_postproccess(enum screen_type screen, struct wps_data *data); 52 + void sb_process(enum screen_type screen, struct wps_data *data, bool preprocess); 54 53 55 54 void do_sbs_update_callback(unsigned short id, void *param); 56 55 #endif /* __STATUSBAR_SKINNED_H__ */
+4 -5
lib/skin_parser/skin_parser.h
··· 107 107 DEFAULT 108 108 } type; 109 109 110 + char type_code; 111 + 110 112 union 111 113 { 112 114 int number; 113 115 OFFSETTYPE(char*) text; 114 116 OFFSETTYPE(struct skin_element*) code; 115 - } data; 116 - 117 - char type_code; 118 - 117 + } data; 119 118 }; 120 119 121 120 /* Defines an element of a SKIN file, ··· 151 150 152 151 enum skin_cb_returnvalue 153 152 { 154 - CALLBACK_ERROR = -666, 153 + CALLBACK_ERROR = -128, 155 154 FEATURE_NOT_AVAILABLE, 156 155 CALLBACK_OK = 0, 157 156 /* > 0 reserved for future use */