Asset Packs: Optimize icon loader (#164)

* Original pointer can be const

* Back to const icons

* Missed this one

* Simpler string alloc

* Single allocation and header struct for static icons

* Shared allocation and meta struct for animated icons

* Only try to load if dir exists

* Restructure momentum lib

* Use some internal headers

* Swap icons at draw

* Properly init and free, no more original in icon struct
This commit is contained in:
WillyJL
2024-07-18 03:35:21 +01:00
committed by GitHub
parent b67544391a
commit aa6d4de9fe
17 changed files with 700 additions and 608 deletions

View File

@@ -5,7 +5,8 @@
#include <furi_hal.h>
#include <stdint.h>
#include <u8g2_glue.h>
#include <momentum/momentum.h>
#include <momentum/asset_packs_i.h>
#include <momentum/settings.h>
const CanvasFontParameters canvas_font_params[FontTotalNumber] = {
[FontPrimary] = {.leading_default = 12, .leading_min = 11, .height = 8, .descender = 2},
@@ -137,8 +138,8 @@ size_t canvas_current_font_width(const Canvas* canvas) {
const CanvasFontParameters* canvas_get_font_params(const Canvas* canvas, Font font) {
furi_check(canvas);
furi_check(font < FontTotalNumber);
if(asset_packs.font_params[font]) {
return asset_packs.font_params[font];
if(asset_packs && asset_packs->font_params[font]) {
return asset_packs->font_params[font];
}
return &canvas_font_params[font];
}
@@ -176,8 +177,8 @@ void canvas_invert_color(Canvas* canvas) {
void canvas_set_font(Canvas* canvas, Font font) {
furi_check(canvas);
u8g2_SetFontMode(&canvas->fb, 1);
if(asset_packs.fonts[font]) {
u8g2_SetFont(&canvas->fb, asset_packs.fonts[font]);
if(asset_packs && asset_packs->fonts[font]) {
u8g2_SetFont(&canvas->fb, asset_packs->fonts[font]);
return;
}
switch(font) {
@@ -424,6 +425,7 @@ void canvas_draw_icon_ex(
x += canvas->offset_x;
y += canvas->offset_y;
uint8_t* icon_data = NULL;
icon = asset_packs_swap_icon(icon);
compress_icon_decode(canvas->compress_icon, icon_get_frame_data(icon, 0), &icon_data);
canvas_draw_u8g2_bitmap(
&canvas->fb, x, y, icon_get_width(icon), icon_get_height(icon), icon_data, rotation);
@@ -436,6 +438,7 @@ void canvas_draw_icon(Canvas* canvas, int32_t x, int32_t y, const Icon* icon) {
x += canvas->offset_x;
y += canvas->offset_y;
uint8_t* icon_data = NULL;
icon = asset_packs_swap_icon(icon);
compress_icon_decode(canvas->compress_icon, icon_get_frame_data(icon, 0), &icon_data);
canvas_draw_u8g2_bitmap(
&canvas->fb, x, y, icon_get_width(icon), icon_get_height(icon), icon_data, IconRotation0);

View File

@@ -2,11 +2,13 @@
#include "icon_i.h" // IWYU pragma: keep
#include <furi.h>
#include <momentum/asset_packs_i.h>
IconAnimation* icon_animation_alloc(const Icon* icon) {
furi_check(icon);
IconAnimation* instance = malloc(sizeof(IconAnimation));
icon = asset_packs_swap_icon(icon);
instance->icon = icon;
instance->timer =
furi_timer_alloc(icon_animation_timer_callback, FuriTimerTypePeriodic, instance);

View File

@@ -14,6 +14,4 @@ struct Icon {
const uint8_t frame_count;
const uint8_t frame_rate;
const uint8_t* const* frames;
Icon* original;
};

View File

@@ -5,6 +5,8 @@
extern "C" {
#endif
#define MAINMENU_APPS_PATH CFG_PATH("mainmenu_apps.txt")
typedef struct LoaderMenu LoaderMenu;
LoaderMenu* loader_menu_alloc(void (*closed_cb)(void*), void* context, bool settings_only);