From 0f67cbe760e5ef4062a2a9044b030e7c4a2fd389 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Wed, 24 Jan 2024 05:12:30 +0000 Subject: [PATCH] Build font parameters for asset packs fonts --- applications/services/gui/canvas.c | 3 +++ lib/xtreme/assets.c | 19 ++++++++++++++++--- lib/xtreme/xtreme.h | 2 ++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/applications/services/gui/canvas.c b/applications/services/gui/canvas.c index 972647dd8..4630fc329 100644 --- a/applications/services/gui/canvas.c +++ b/applications/services/gui/canvas.c @@ -112,6 +112,9 @@ uint8_t canvas_current_font_width(const Canvas* canvas) { const CanvasFontParameters* canvas_get_font_params(const Canvas* canvas, Font font) { furi_assert(canvas); furi_assert(font < FontTotalNumber); + if((FontSwap)font < FontSwapCount && xtreme_assets.font_params[font]) { + return xtreme_assets.font_params[font]; + } return &canvas_font_params[font]; } diff --git a/lib/xtreme/assets.c b/lib/xtreme/assets.c index c3ba83a14..f8f6e780b 100644 --- a/lib/xtreme/assets.c +++ b/lib/xtreme/assets.c @@ -13,6 +13,7 @@ XtremeAssets xtreme_assets = { .is_nsfw = false, .fonts = {NULL}, + .font_params = {NULL}, }; void load_icon_animated(const Icon* replace, const char* name, FuriString* path, File* file) { @@ -113,8 +114,14 @@ void load_font(FontSwap font, const char* name, FuriString* path, File* file) { uint64_t size = storage_file_size(file); uint8_t* swap = malloc(size); - if(storage_file_read(file, swap, size) == size) { + if(size > 20 && storage_file_read(file, swap, size) == size) { xtreme_assets.fonts[font] = swap; + CanvasFontParameters* params = malloc(sizeof(CanvasFontParameters)); + params->leading_default = swap[10]; // max_char_height + params->leading_min = params->leading_default - 2; // good enough + params->height = swap[13]; // ascent_A + params->descender = swap[19]; // start_pos_lower_a + xtreme_assets.font_params[font] = params; } else { free(swap); } @@ -122,6 +129,13 @@ void load_font(FontSwap font, const char* name, FuriString* path, File* file) { storage_file_close(file); } +void free_font(FontSwap font) { + free(xtreme_assets.fonts[font]); + xtreme_assets.fonts[font] = NULL; + free(xtreme_assets.font_params[font]); + xtreme_assets.font_params[font] = NULL; +} + static const char* font_names[] = { [FontSwapPrimary] = "Primary", [FontSwapSecondary] = "Secondary", @@ -172,8 +186,7 @@ void XTREME_ASSETS_FREE() { for(FontSwap font = 0; font < FontSwapCount; font++) { if(xtreme_assets.fonts[font] != NULL) { - free(xtreme_assets.fonts[font]); - xtreme_assets.fonts[font] = NULL; + free_font(font); } } } diff --git a/lib/xtreme/xtreme.h b/lib/xtreme/xtreme.h index 54b21bae0..458f0e9a2 100644 --- a/lib/xtreme/xtreme.h +++ b/lib/xtreme/xtreme.h @@ -3,6 +3,7 @@ #include #include #include +#include #ifdef __cplusplus extern "C" { @@ -97,6 +98,7 @@ typedef enum { typedef struct { bool is_nsfw; // TODO: replace with packs text support uint8_t* fonts[FontSwapCount]; + CanvasFontParameters* font_params[FontSwapCount]; } XtremeAssets; void XTREME_SETTINGS_LOAD();