diff --git a/desktop_version/lang/ca/meta.xml b/desktop_version/lang/ca/meta.xml index 00e1d907..3423ffd0 100644 --- a/desktop_version/lang/ca/meta.xml +++ b/desktop_version/lang/ca/meta.xml @@ -26,4 +26,7 @@ [ {label} ] [{label}] + + + font diff --git a/desktop_version/lang/en/meta.xml b/desktop_version/lang/en/meta.xml index 0f61c54d..32bb5bae 100644 --- a/desktop_version/lang/en/meta.xml +++ b/desktop_version/lang/en/meta.xml @@ -26,4 +26,7 @@ [ {label} ] [{label}] + + + font diff --git a/desktop_version/lang/eo/meta.xml b/desktop_version/lang/eo/meta.xml index f87527f4..b1641aed 100644 --- a/desktop_version/lang/eo/meta.xml +++ b/desktop_version/lang/eo/meta.xml @@ -26,4 +26,7 @@ [ {label} ] [{label}] + + + font diff --git a/desktop_version/lang/es/meta.xml b/desktop_version/lang/es/meta.xml index 7b158cb1..8e5c6553 100644 --- a/desktop_version/lang/es/meta.xml +++ b/desktop_version/lang/es/meta.xml @@ -26,4 +26,7 @@ [ {label} ] [{label}] + + + font diff --git a/desktop_version/lang/nl/meta.xml b/desktop_version/lang/nl/meta.xml index 14561de6..1511919e 100644 --- a/desktop_version/lang/nl/meta.xml +++ b/desktop_version/lang/nl/meta.xml @@ -26,4 +26,7 @@ [ {label} ] [{label}] + + + font diff --git a/desktop_version/src/Font.cpp b/desktop_version/src/Font.cpp index a681fab5..3c4347dd 100644 --- a/desktop_version/src/Font.cpp +++ b/desktop_version/src/Font.cpp @@ -21,11 +21,10 @@ namespace font static FontContainer fonts_main = {}; static FontContainer fonts_custom = {}; -static size_t font_idx_interface = 0; -static size_t font_idx_8x8 = 0; +static uint8_t font_idx_8x8 = 0; static bool font_idx_custom_is_custom = false; -static size_t font_idx_custom = 0; +static uint8_t font_idx_custom = 0; static void codepoint_split( const uint32_t codepoint, @@ -147,15 +146,19 @@ static bool decode_xml_range(tinyxml2::XMLElement* elem, unsigned* start, unsign return true; } -static size_t load_font(FontContainer* container, const char* name) +static uint8_t load_font(FontContainer* container, const char* name) { + if (container->count >= 254) + { + return 0; + } Font* new_fonts = (Font*) SDL_realloc(container->fonts, sizeof(Font)*(container->count+1)); if (new_fonts == NULL) { return 0; } container->fonts = new_fonts; - size_t f_idx = container->count++; + uint8_t f_idx = container->count++; Font* f = &container->fonts[f_idx]; vlog_info("Loading font \"%s\"...", name); @@ -329,11 +332,11 @@ static size_t load_font(FontContainer* container, const char* name) return f_idx; } -static bool find_font_by_name(FontContainer* container, const char* name, size_t* idx) +static bool find_font_by_name(FontContainer* container, const char* name, uint8_t* idx) { // Returns true if font found (and idx is set), false if not found - for (size_t i = 0; i < container->count; i++) + for (uint8_t i = 0; i < container->count; i++) { if (SDL_strcmp(name, container->fonts[i].name) == 0) { @@ -344,6 +347,16 @@ static bool find_font_by_name(FontContainer* container, const char* name, size_t return false; } +bool find_main_font_by_name(const char* name, uint8_t* idx) +{ + return find_font_by_name(&fonts_main, name, idx); +} + +uint8_t get_font_idx_8x8(void) +{ + return font_idx_8x8; +} + static void set_custom_font(const char* name) { /* Apply the choice for a certain level-specific font. */ @@ -381,7 +394,7 @@ static void load_font_filename(bool is_custom, const char* filename) SDL_strlcpy(font_name, filename, sizeof(font_name)); font_name[SDL_min(63, expected_ext_start)] = '\0'; - size_t f_idx = load_font(is_custom ? &fonts_custom : &fonts_main, font_name); + uint8_t f_idx = load_font(is_custom ? &fonts_custom : &fonts_main, font_name); if (is_fontpng && !is_custom) { @@ -400,9 +413,6 @@ void load_main(void) load_font_filename(false, item); } FILESYSTEM_freeEnumerate(&handle); - - //font_idx_interface = 1; // TODO TEMP - //font_idx_custom = 1; } void load_custom(void) @@ -433,7 +443,7 @@ void unload_font(Font* f) void unload_font_container(FontContainer* container) { - for (size_t i = 0; i < container->count; i++) + for (uint8_t i = 0; i < container->count; i++) { unload_font(&container->fonts[i]); } @@ -702,7 +712,7 @@ static int print_char( return glyph->advance * scale; } -static Font* container_get(FontContainer* container, size_t idx) +static Font* container_get(FontContainer* container, uint8_t idx) { /* Get a certain font from the given container (with bounds checking). * Does its best to return at least something, @@ -727,6 +737,37 @@ static Font* container_get(FontContainer* container, size_t idx) return NULL; } +bool glyph_dimensions_main(uint8_t idx, uint8_t* glyph_w, uint8_t* glyph_h) +{ + /* Gets the dimensions (glyph_w and glyph_h) of fonts_main[idx]. + * Returns true if the font is valid (glyph_w and/or glyph_h were written to if not NULL), false if not. */ + + Font* f = container_get(&fonts_main, idx); + if (f == NULL) + { + return false; + } + if (glyph_w != NULL) + { + *glyph_w = f->glyph_w; + } + if (glyph_h != NULL) + { + *glyph_h = f->glyph_h; + } + return true; +} + +const char* get_main_font_name(uint8_t idx) +{ + Font* f = container_get(&fonts_main, idx); + if (f == NULL) + { + return ""; + } + return f->name; +} + static Font* fontsel_to_font(int sel) { /* Take font selection integer (0-31) and turn it into the correct Font @@ -744,7 +785,7 @@ static Font* fontsel_to_font(int sel) switch (sel) { case 0: - return container_get(&fonts_main, font_idx_interface); + return container_get(&fonts_main, loc::get_langmeta()->font_idx); case 1: if (font_idx_custom_is_custom) { diff --git a/desktop_version/src/Font.h b/desktop_version/src/Font.h index c79397f6..6b1fb59a 100644 --- a/desktop_version/src/Font.h +++ b/desktop_version/src/Font.h @@ -64,7 +64,7 @@ struct Font struct FontContainer { - size_t count; + uint8_t count; Font* fonts; }; @@ -105,6 +105,10 @@ struct PrintFlags #define PR_CJK_LOW (1 << 20) /* larger fonts should stick out fully on the bottom (draw at Y) */ #define PR_CJK_HIGH (2 << 20) /* larger fonts should stick out fully on the top */ +bool find_main_font_by_name(const char* name, uint8_t* idx); +const char* get_main_font_name(uint8_t idx); +uint8_t get_font_idx_8x8(void); + void load_main(void); void load_custom(void); void unload_custom(void); @@ -114,6 +118,8 @@ std::string string_wordwrap(const std::string& s, int maxwidth, short *lines = N std::string string_wordwrap_balanced(const std::string& s, int maxwidth); std::string string_unwordwrap(const std::string& s); +bool glyph_dimensions_main(uint8_t idx, uint8_t* glyph_w, uint8_t* glyph_h); + int len(uint32_t flags, const std::string& t); int height(const uint32_t flags); diff --git a/desktop_version/src/Localization.h b/desktop_version/src/Localization.h index 5a503732..fceaa97d 100644 --- a/desktop_version/src/Localization.h +++ b/desktop_version/src/Localization.h @@ -28,8 +28,7 @@ struct LangMeta bool toupper_lower_escape_char; // = false; enable ~ to mark lowercase letters for uppercasing std::string menu_select; std::string menu_select_tight; - unsigned char font_w; - unsigned char font_h; + uint8_t font_idx; }; struct TextboxFormat diff --git a/desktop_version/src/LocalizationMaint.cpp b/desktop_version/src/LocalizationMaint.cpp index 6001c678..5f0a7689 100644 --- a/desktop_version/src/LocalizationMaint.cpp +++ b/desktop_version/src/LocalizationMaint.cpp @@ -57,6 +57,8 @@ static void sync_lang_file(const std::string& langcode) pElem->SetText(langmeta.menu_select.c_str()); else if (SDL_strcmp(pKey, "menu_select_tight") == 0) pElem->SetText(langmeta.menu_select_tight.c_str()); + else if (SDL_strcmp(pKey, "font") == 0) + pElem->SetText(font::get_main_font_name(langmeta.font_idx)); } /* This part exists because we want to preserve blank lines between the commented diff --git a/desktop_version/src/LocalizationStorage.cpp b/desktop_version/src/LocalizationStorage.cpp index 45c2acc3..0edaf9dd 100644 --- a/desktop_version/src/LocalizationStorage.cpp +++ b/desktop_version/src/LocalizationStorage.cpp @@ -65,8 +65,7 @@ static void loadmeta(LangMeta& meta, const std::string& langcode = lang) meta.toupper_lower_escape_char = false; meta.menu_select = "[ {label} ]"; meta.menu_select_tight = "[{label}]"; - meta.font_w = 8; - meta.font_h = 8; + meta.font_idx = font::get_font_idx_8x8(); tinyxml2::XMLDocument doc; tinyxml2::XMLHandle hDoc(&doc); @@ -106,6 +105,8 @@ static void loadmeta(LangMeta& meta, const std::string& langcode = lang) meta.menu_select = std::string(pText); else if (SDL_strcmp(pKey, "menu_select_tight") == 0) meta.menu_select_tight = std::string(pText); + else if (SDL_strcmp(pKey, "font") == 0) + font::find_main_font_by_name(pText, &meta.font_idx); } } @@ -298,8 +299,12 @@ static bool max_check_string(const char* str, const char* max) max_h = 2; } - unsigned short max_w_px = max_w * get_langmeta()->font_w; - unsigned short max_h_px = max_h * SDL_max(10, get_langmeta()->font_h); + uint8_t font_w = 8; + uint8_t font_h = 8; + font::glyph_dimensions_main(get_langmeta()->font_idx, &font_w, &font_h); + + unsigned short max_w_px = max_w * font_w; + unsigned short max_h_px = max_h * SDL_max(10, font_h); bool does_overflow = false; diff --git a/desktop_version/src/Render.cpp b/desktop_version/src/Render.cpp index 7269645c..9fe53c51 100644 --- a/desktop_version/src/Render.cpp +++ b/desktop_version/src/Render.cpp @@ -712,8 +712,11 @@ static void menurender(void) ); graphics.Print(10, 10, buffer, tr/2, tg/2, tb/2); + uint8_t font_h = 8; + font::glyph_dimensions_main(loc::get_langmeta()->font_idx, NULL, &font_h); + int box_x = SDL_min(10, (320-overflow.max_w_px)/2); - int box_h = overflow.max_h_px - SDL_max(0, 10-loc::get_langmeta()->font_h); + int box_h = overflow.max_h_px - SDL_max(0, 10-font_h); graphics.fill_rect(box_x-1, 30-1, overflow.max_w_px+2, box_h+2, tr/3, tg/3, tb/3); int wraplimit; diff --git a/desktop_version/src/Textbox.cpp b/desktop_version/src/Textbox.cpp index d170539d..55ca44ba 100644 --- a/desktop_version/src/Textbox.cpp +++ b/desktop_version/src/Textbox.cpp @@ -105,7 +105,7 @@ void textboxclass::resize(void) for (size_t iter = 0; iter < lines.size(); iter++) { int len = font::len(print_flags, lines[iter]); - if (len > (unsigned int)max) max = len; + if (len > max) max = len; } // 16 for the borders