From f07e677af13c0bfdbfca3f549a53bbde4214c26c Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 22 Sep 2018 20:08:06 +0200 Subject: [PATCH] Replace switch towers with std::map --- src/openrct2/drawing/Font.cpp | 570 +++++------------- .../localisation/ConversionTables.cpp | 64 +- src/openrct2/localisation/FormatCodes.h | 61 +- 3 files changed, 240 insertions(+), 455 deletions(-) diff --git a/src/openrct2/drawing/Font.cpp b/src/openrct2/drawing/Font.cpp index 734eece8da..52731c75e9 100644 --- a/src/openrct2/drawing/Font.cpp +++ b/src/openrct2/drawing/Font.cpp @@ -17,6 +17,8 @@ #include "Drawing.h" #include "TTF.h" +#include + static constexpr const int32_t SpriteFontLineHeight[FONT_SIZE_COUNT] = { 6, 10, 10 }; static uint8_t _spriteFontCharacterWidths[FONT_SIZE_COUNT][FONT_SPRITE_GLYPH_COUNT]; @@ -26,6 +28,156 @@ static uint8_t _additionalSpriteFontCharacterWidth[FONT_SIZE_COUNT][SPR_G2_GLYPH TTFFontSetDescriptor* gCurrentTTFFontSet; #endif // NO_TTF +static const std::map codepointOffsetMap = { + { UnicodeChar::ae_uc, SPR_G2_AE_UPPER - SPR_CHAR_START }, + { UnicodeChar::o_stroke_uc, SPR_G2_O_STROKE_UPPER - SPR_CHAR_START }, + { UnicodeChar::y_acute_uc, SPR_G2_Y_ACUTE_UPPER - SPR_CHAR_START }, + { UnicodeChar::ae, SPR_G2_AE_LOWER - SPR_CHAR_START }, + { UnicodeChar::o_stroke, SPR_G2_O_STROKE_LOWER - SPR_CHAR_START }, + { UnicodeChar::y_acute, SPR_G2_Y_ACUTE_LOWER - SPR_CHAR_START }, + { UnicodeChar::a_breve_uc, SPR_G2_A_BREVE_UPPER - SPR_CHAR_START }, + { UnicodeChar::a_breve, 226 - CS_SPRITE_FONT_OFFSET }, // Render as â, no visual difference in the RCT font + { UnicodeChar::a_ogonek_uc, CSChar::a_ogonek_uc - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::a_ogonek, CSChar::a_ogonek - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::c_acute_uc, CSChar::c_acute_uc - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::c_acute, CSChar::c_acute - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::c_caron_uc, SPR_G2_C_CARON_UPPER - SPR_CHAR_START }, + { UnicodeChar::c_caron, SPR_G2_C_CARON_LOWER - SPR_CHAR_START }, + { UnicodeChar::e_ogonek_uc, CSChar::e_ogonek_uc - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::e_ogonek, CSChar::e_ogonek - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::g_breve_uc, SPR_G2_G_BREVE_UPPER - SPR_CHAR_START }, + { UnicodeChar::g_breve, SPR_G2_G_BREVE_LOWER - SPR_CHAR_START }, + { UnicodeChar::i_with_dot_uc, SPR_G2_I_WITH_DOT_UPPER - SPR_CHAR_START }, + { UnicodeChar::i_without_dot, SPR_G2_I_WITHOUT_DOT_LOWER - SPR_CHAR_START }, + { UnicodeChar::l_stroke_uc, CSChar::l_stroke_uc - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::l_stroke, CSChar::l_stroke - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::n_acute_uc, CSChar::n_acute_uc - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::n_acute, CSChar::n_acute - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::o_double_acute_uc, SPR_G2_O_DOUBLE_ACUTE_UPPER - SPR_CHAR_START }, + { UnicodeChar::o_double_acute, SPR_G2_O_DOUBLE_ACUTE_LOWER - SPR_CHAR_START }, + { UnicodeChar::s_acute_uc, CSChar::s_acute_uc - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::s_acute, CSChar::s_acute - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::s_cedilla_uc, SPR_G2_S_CEDILLA_UPPER - SPR_CHAR_START }, + { UnicodeChar::s_cedilla, SPR_G2_S_CEDILLA_LOWER - SPR_CHAR_START }, + { UnicodeChar::u_double_acute_uc, SPR_G2_U_DOUBLE_ACUTE_UPPER - SPR_CHAR_START }, + { UnicodeChar::u_double_acute, SPR_G2_U_DOUBLE_ACUTE_LOWER - SPR_CHAR_START }, + { UnicodeChar::z_acute_uc, CSChar::z_acute_uc - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::z_acute, CSChar::z_acute - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::z_dot_uc, CSChar::z_dot_uc - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::z_dot, CSChar::z_dot - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::f_with_hook_uc, 'F' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::s_comma_uc, SPR_G2_S_CEDILLA_UPPER - SPR_CHAR_START }, // No visual difference + { UnicodeChar::s_comma, SPR_G2_S_CEDILLA_LOWER - SPR_CHAR_START }, // Ditto + { UnicodeChar::t_comma_uc, SPR_G2_T_COMMA_UPPER - SPR_CHAR_START }, + { UnicodeChar::t_comma, SPR_G2_T_COMMA_LOWER - SPR_CHAR_START }, + { UnicodeChar::sharp_s_uc, 223 - CS_SPRITE_FONT_OFFSET }, + + // Cyrillic alphabet + { UnicodeChar::cyrillic_io_uc, 203 - CS_SPRITE_FONT_OFFSET }, // Looks just like Ë + { UnicodeChar::cyrillic_a_uc, 'A' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_be_uc, SPR_G2_CYRILLIC_BE_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_ve_uc, 'B' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_ghe_uc, SPR_G2_CYRILLIC_GHE_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_de_uc, SPR_G2_CYRILLIC_DE_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_ie_uc, 'E' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_zhe_uc, SPR_G2_CYRILLIC_ZHE_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_ze_uc, SPR_G2_CYRILLIC_ZE_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_i_uc, SPR_G2_CYRILLIC_I_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_short_i_uc, SPR_G2_CYRILLIC_SHORT_I_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_ka_uc, 'K' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_el_uc, SPR_G2_CYRILLIC_EL_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_em_uc, 'M' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_en_uc, 'H' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_o_uc, 'O' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_pe_uc, SPR_G2_CYRILLIC_PE_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_er_uc, 'P' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_es_uc, 'C' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_te_uc, 'T' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_u_uc, SPR_G2_CYRILLIC_U_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_ef_uc, SPR_G2_CYRILLIC_EF_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_ha_uc, 'X' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_tse_uc, SPR_G2_CYRILLIC_TSE_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_che_uc, SPR_G2_CYRILLIC_CHE_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_sha_uc, SPR_G2_CYRILLIC_SHA_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_shcha_uc, SPR_G2_CYRILLIC_SHCHA_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_hard_sign_uc, SPR_G2_CYRILLIC_HARD_SIGN_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_yeru_uc, SPR_G2_CYRILLIC_YERU_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_soft_sign_uc, SPR_G2_CYRILLIC_SOFT_SIGN_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_e_uc, SPR_G2_CYRILLIC_E_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_yu_uc, SPR_G2_CYRILLIC_YU_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_ya_uc, SPR_G2_CYRILLIC_YA_UPPER - SPR_CHAR_START }, + + { UnicodeChar::cyrillic_a, 'a' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_be, SPR_G2_CYRILLIC_BE_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_ve, SPR_G2_CYRILLIC_VE_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_ghe, SPR_G2_CYRILLIC_GHE_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_de, SPR_G2_CYRILLIC_DE_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_ie, 'e' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_zhe, SPR_G2_CYRILLIC_ZHE_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_ze, SPR_G2_CYRILLIC_ZE_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_i, SPR_G2_CYRILLIC_I_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_short_i, SPR_G2_CYRILLIC_SHORT_I_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_ka, SPR_G2_CYRILLIC_KA_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_el, SPR_G2_CYRILLIC_EL_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_em, SPR_G2_CYRILLIC_EM_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_en, SPR_G2_CYRILLIC_EN_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_o, 'o' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_pe, SPR_G2_CYRILLIC_PE_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_er, 'p' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_es, 'c' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_te, SPR_G2_CYRILLIC_TE_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_u, 'y' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_ef, SPR_G2_CYRILLIC_EF_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_ha, 'x' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::cyrillic_tse, SPR_G2_CYRILLIC_TSE_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_che, SPR_G2_CYRILLIC_CHE_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_sha, SPR_G2_CYRILLIC_SHA_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_shcha, SPR_G2_CYRILLIC_SHCHA_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_hard_sign, SPR_G2_CYRILLIC_HARD_SIGN_UPPER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_yeru, SPR_G2_CYRILLIC_YERU_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_soft_sign, SPR_G2_CYRILLIC_SOFT_SIGN_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_e, SPR_G2_CYRILLIC_E_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_yu, SPR_G2_CYRILLIC_YU_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_ya, SPR_G2_CYRILLIC_YA_LOWER - SPR_CHAR_START }, + { UnicodeChar::cyrillic_io, 235 - CS_SPRITE_FONT_OFFSET }, // Looks just like ë + + // Punctuation + { UnicodeChar::interpunct, SPR_G2_INTERPUNCT - SPR_CHAR_START }, + { UnicodeChar::single_quote_open, '`' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::single_quote_end, '\'' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::single_german_quote_open, ',' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::german_quote_open, SPR_G2_GERMAN_OPENQUOTES - SPR_CHAR_START }, + { UnicodeChar::bullet, CSChar::bullet - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::ellipsis, SPR_G2_ELLIPSIS - SPR_CHAR_START }, + { UnicodeChar::quote_open, CSChar::quote_open - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::quote_close, CSChar::quote_close - CS_SPRITE_FONT_OFFSET }, + + // Currency + { UnicodeChar::guilder, SPR_G2_GUILDER_SIGN - SPR_CHAR_START }, + { UnicodeChar::euro, CSChar::euro - CS_SPRITE_FONT_OFFSET }, + + // Dingbats + { UnicodeChar::up, CSChar::up - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::small_up, CSChar::small_up - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::right, CSChar::right - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::down, CSChar::down - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::small_down, CSChar::small_down - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::left, CSChar::left - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::air, CSChar::air - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::tick, CSChar::tick - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::plus, '+' - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::minus, '-' - CS_SPRITE_FONT_OFFSET }, + + // Emoji + { UnicodeChar::cross, CSChar::cross - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::water, CSChar::water - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::road, CSChar::road - CS_SPRITE_FONT_OFFSET }, + { UnicodeChar::railway, CSChar::railway - CS_SPRITE_FONT_OFFSET }, + + // Misc + { UnicodeChar::superscript_minus_one, CSChar::superscript_minus_one - CS_SPRITE_FONT_OFFSET }, +}; + /** * * rct2: 0x006C19AC @@ -72,315 +224,14 @@ void font_sprite_initialise_characters() int32_t font_sprite_get_codepoint_offset(int32_t codepoint) { - switch (codepoint) - { - case UnicodeChar::quote_close: - return 34 - 32; + auto result = codepointOffsetMap.find(codepoint); + if (result != codepointOffsetMap.end()) + return result->second; - case UnicodeChar::up: - return 160 - 32; + if (codepoint < 32 || codepoint >= 256) + codepoint = '?'; - case UnicodeChar::down: - return 170 - 32; - case UnicodeChar::tick: - return 172 - 32; - case UnicodeChar::cross: - return 173 - 32; - - case UnicodeChar::right: - return 175 - 32; - case UnicodeChar::railway: - return 177 - 32; - - case UnicodeChar::quote_open: - return 180 - 32; - case UnicodeChar::euro: - return 181 - 32; - case UnicodeChar::road: - return 182 - 32; - case UnicodeChar::air: - return 183 - 32; - case UnicodeChar::water: - return 184 - 32; - case UnicodeChar::superscript_minus_one: - return 185 - 32; - case UnicodeChar::bullet: - return 186 - 32; - case UnicodeChar::small_up: - return 188 - 32; - case UnicodeChar::small_down: - return 189 - 32; - case UnicodeChar::left: - return 190 - 32; - - case UnicodeChar::a_ogonek_uc: - return RCT2_A_OGONEK_UC - 32; - case UnicodeChar::c_acute_uc: - return RCT2_C_ACUTE_UC - 32; - case UnicodeChar::e_ogonek_uc: - return RCT2_E_OGONEK_UC - 32; - case UnicodeChar::n_acute_uc: - return RCT2_N_ACUTE_UC - 32; - case UnicodeChar::l_stroke_uc: - return RCT2_L_STROKE_UC - 32; - case UnicodeChar::s_acute_uc: - return RCT2_S_ACUTE_UC - 32; - case UnicodeChar::z_dot_uc: - return RCT2_Z_DOT_UC - 32; - case UnicodeChar::z_acute_uc: - return RCT2_Z_ACUTE_UC - 32; - - case UnicodeChar::a_ogonek: - return RCT2_A_OGONEK - 32; - case UnicodeChar::c_acute: - return RCT2_C_ACUTE - 32; - case UnicodeChar::e_ogonek: - return RCT2_E_OGONEK - 32; - case UnicodeChar::n_acute: - return RCT2_N_ACUTE - 32; - case UnicodeChar::l_stroke: - return RCT2_L_STROKE - 32; - case UnicodeChar::s_acute: - return RCT2_S_ACUTE - 32; - case UnicodeChar::z_dot: - return RCT2_Z_DOT - 32; - case UnicodeChar::z_acute: - return RCT2_Z_ACUTE - 32; - - // Render capital sharp-S (ẞ) with lowercase sprite (ß) - case UnicodeChar::sharp_s_uc: - return 223 - 32; - - // Norwegian/Danish - case UnicodeChar::ae_uc: - return SPR_G2_AE_UPPER - SPR_CHAR_START; - case UnicodeChar::o_stroke_uc: - return SPR_G2_O_STROKE_UPPER - SPR_CHAR_START; - case UnicodeChar::ae: - return SPR_G2_AE_LOWER - SPR_CHAR_START; - case UnicodeChar::o_stroke: - return SPR_G2_O_STROKE_LOWER - SPR_CHAR_START; - - case UnicodeChar::plus: - return 11; - case UnicodeChar::minus: - return 13; - - // Cyrillic - case UnicodeChar::cyrillic_a_uc: - return 'A' - 32; - case UnicodeChar::cyrillic_be_uc: - return SPR_G2_CYRILLIC_BE_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_ve_uc: - return 'B' - 32; - case UnicodeChar::cyrillic_ghe_uc: - return SPR_G2_CYRILLIC_GHE_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_de_uc: - return SPR_G2_CYRILLIC_DE_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_ie_uc: - return 'E' - 32; - case UnicodeChar::cyrillic_zhe_uc: - return SPR_G2_CYRILLIC_ZHE_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_ze_uc: - return SPR_G2_CYRILLIC_ZE_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_i_uc: - return SPR_G2_CYRILLIC_I_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_short_i_uc: - return SPR_G2_CYRILLIC_SHORT_I_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_ka_uc: - return 'K' - 32; - case UnicodeChar::cyrillic_el_uc: - return SPR_G2_CYRILLIC_EL_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_em_uc: - return 'M' - 32; - case UnicodeChar::cyrillic_en_uc: - return 'H' - 32; - case UnicodeChar::cyrillic_o_uc: - return 'O' - 32; - case UnicodeChar::cyrillic_pe_uc: - return SPR_G2_CYRILLIC_PE_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_er_uc: - return 'P' - 32; - case UnicodeChar::cyrillic_es_uc: - return 'C' - 32; - case UnicodeChar::cyrillic_te_uc: - return 'T' - 32; - case UnicodeChar::cyrillic_u_uc: - return SPR_G2_CYRILLIC_U_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_ef_uc: - return SPR_G2_CYRILLIC_EF_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_ha_uc: - return 'X' - 32; - case UnicodeChar::cyrillic_tse_uc: - return SPR_G2_CYRILLIC_TSE_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_che_uc: - return SPR_G2_CYRILLIC_CHE_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_sha_uc: - return SPR_G2_CYRILLIC_SHA_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_shcha_uc: - return SPR_G2_CYRILLIC_SHCHA_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_hard_sign_uc: - return SPR_G2_CYRILLIC_HARD_SIGN_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_yeru_uc: - return SPR_G2_CYRILLIC_YERU_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_soft_sign_uc: - return SPR_G2_CYRILLIC_SOFT_SIGN_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_e_uc: - return SPR_G2_CYRILLIC_E_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_yu_uc: - return SPR_G2_CYRILLIC_YU_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_ya_uc: - return SPR_G2_CYRILLIC_YA_UPPER - SPR_CHAR_START; - - case UnicodeChar::cyrillic_a: - return 'a' - 32; - case UnicodeChar::cyrillic_be: - return SPR_G2_CYRILLIC_BE_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_ve: - return SPR_G2_CYRILLIC_VE_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_ghe: - return SPR_G2_CYRILLIC_GHE_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_de: - return SPR_G2_CYRILLIC_DE_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_ie: - return 'e' - 32; - case UnicodeChar::cyrillic_zhe: - return SPR_G2_CYRILLIC_ZHE_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_ze: - return SPR_G2_CYRILLIC_ZE_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_i: - return SPR_G2_CYRILLIC_I_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_short_i: - return SPR_G2_CYRILLIC_SHORT_I_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_ka: - return SPR_G2_CYRILLIC_KA_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_el: - return SPR_G2_CYRILLIC_EL_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_em: - return SPR_G2_CYRILLIC_EM_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_en: - return SPR_G2_CYRILLIC_EN_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_o: - return 'o' - 32; - case UnicodeChar::cyrillic_pe: - return SPR_G2_CYRILLIC_PE_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_er: - return 'p' - 32; - case UnicodeChar::cyrillic_es: - return 'c' - 32; - case UnicodeChar::cyrillic_te: - return SPR_G2_CYRILLIC_TE_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_u: - return 'y' - 32; - case UnicodeChar::cyrillic_ef: - return SPR_G2_CYRILLIC_EF_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_ha: - return 'x' - 32; - case UnicodeChar::cyrillic_tse: - return SPR_G2_CYRILLIC_TSE_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_che: - return SPR_G2_CYRILLIC_CHE_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_sha: - return SPR_G2_CYRILLIC_SHA_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_shcha: - return SPR_G2_CYRILLIC_SHCHA_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_hard_sign: - // Not a typo, there is no glyph, use the upper case variant. - return SPR_G2_CYRILLIC_HARD_SIGN_UPPER - SPR_CHAR_START; - case UnicodeChar::cyrillic_yeru: - return SPR_G2_CYRILLIC_YERU_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_soft_sign: - return SPR_G2_CYRILLIC_SOFT_SIGN_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_e: - return SPR_G2_CYRILLIC_E_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_yu: - return SPR_G2_CYRILLIC_YU_LOWER - SPR_CHAR_START; - case UnicodeChar::cyrillic_ya: - return SPR_G2_CYRILLIC_YA_LOWER - SPR_CHAR_START; - - // Looks just like Ë. - case UnicodeChar::cyrillic_io_uc: - return 171; - case UnicodeChar::cyrillic_io: - return 203; - - case UnicodeChar::german_quote_open: - return SPR_G2_GERMAN_OPENQUOTES - SPR_CHAR_START; - - case UnicodeChar::single_quote_open: - return 64; - case UnicodeChar::single_quote_end: - return 7; - case UnicodeChar::single_german_quote_open: - return 12; - - case UnicodeChar::guilder: - return SPR_G2_GUILDER_SIGN - SPR_CHAR_START; - - // Turkish - case UnicodeChar::g_breve_uc: - return SPR_G2_G_BREVE_UPPER - SPR_CHAR_START; - case UnicodeChar::i_with_dot_uc: - return SPR_G2_I_WITH_DOT_UPPER - SPR_CHAR_START; - case UnicodeChar::s_cedilla_uc: - return SPR_G2_S_CEDILLA_UPPER - SPR_CHAR_START; - case UnicodeChar::g_breve: - return SPR_G2_G_BREVE_LOWER - SPR_CHAR_START; - case UnicodeChar::i_without_dot: - return SPR_G2_I_WITHOUT_DOT_LOWER - SPR_CHAR_START; - case UnicodeChar::s_cedilla: - return SPR_G2_S_CEDILLA_LOWER - SPR_CHAR_START; - - case UnicodeChar::interpunct: - return SPR_G2_INTERPUNCT - SPR_CHAR_START; - case UnicodeChar::ellipsis: - return SPR_G2_ELLIPSIS - SPR_CHAR_START; - - // Romanian - case UnicodeChar::a_breve_uc: - return SPR_G2_A_BREVE_UPPER - SPR_CHAR_START; - case UnicodeChar::a_breve: - // Render as â, there is no visual difference on this scale. - return 194; - case UnicodeChar::s_comma_uc: - // Also no visual difference. - return SPR_G2_S_CEDILLA_UPPER - SPR_CHAR_START; - case UnicodeChar::s_comma: - return SPR_G2_S_CEDILLA_LOWER - SPR_CHAR_START; - case UnicodeChar::t_comma_uc: - return SPR_G2_T_COMMA_UPPER - SPR_CHAR_START; - case UnicodeChar::t_comma: - return SPR_G2_T_COMMA_LOWER - SPR_CHAR_START; - - // This is to catch capitalised versions of the guilder sign - case UnicodeChar::f_with_hook_uc: - return 'F' - 32; - - // Czech - case UnicodeChar::c_caron_uc: - return SPR_G2_C_CARON_UPPER - SPR_CHAR_START; - case UnicodeChar::c_caron: - return SPR_G2_C_CARON_LOWER - SPR_CHAR_START; - case UnicodeChar::y_acute_uc: - return SPR_G2_Y_ACUTE_UPPER - SPR_CHAR_START; - case UnicodeChar::y_acute: - return SPR_G2_Y_ACUTE_LOWER - SPR_CHAR_START; - - // Hungarian - case UnicodeChar::o_double_acute_uc: - return SPR_G2_O_DOUBLE_ACUTE_UPPER - SPR_CHAR_START; - case UnicodeChar::o_double_acute: - return SPR_G2_O_DOUBLE_ACUTE_LOWER - SPR_CHAR_START; - case UnicodeChar::u_double_acute_uc: - return SPR_G2_U_DOUBLE_ACUTE_UPPER - SPR_CHAR_START; - case UnicodeChar::u_double_acute: - return SPR_G2_U_DOUBLE_ACUTE_LOWER - SPR_CHAR_START; - - default: - if (codepoint < 32 || codepoint >= 256) - codepoint = '?'; - return codepoint - 32; - } + return codepoint - 32; } int32_t font_sprite_get_codepoint_width(uint16_t fontSpriteBase, int32_t codepoint) @@ -481,106 +332,17 @@ bool font_supports_string_sprite(const utf8* text) while ((codepoint = utf8_get_next(src, &src)) != 0) { bool supported = false; - switch (codepoint) + + if ((codepoint >= 32 && codepoint < 256) + || (codepoint >= UnicodeChar::cyrillic_a_uc && codepoint <= UnicodeChar::cyrillic_ya)) { - // Latin alphabet - case UnicodeChar::ae_uc: - case UnicodeChar::o_stroke_uc: - case UnicodeChar::y_acute_uc: - case UnicodeChar::ae: - case UnicodeChar::o_stroke: - case UnicodeChar::y_acute: - case UnicodeChar::a_breve_uc: - case UnicodeChar::a_breve: - case UnicodeChar::a_ogonek_uc: - case UnicodeChar::a_ogonek: - case UnicodeChar::c_acute_uc: - case UnicodeChar::c_acute: - case UnicodeChar::c_caron_uc: - case UnicodeChar::c_caron: - case UnicodeChar::e_ogonek_uc: - case UnicodeChar::e_ogonek: - case UnicodeChar::g_breve_uc: - case UnicodeChar::g_breve: - case UnicodeChar::i_with_dot_uc: - case UnicodeChar::i_without_dot: - case UnicodeChar::l_stroke_uc: - case UnicodeChar::l_stroke: - case UnicodeChar::n_acute_uc: - case UnicodeChar::n_acute: - case UnicodeChar::o_double_acute_uc: - case UnicodeChar::o_double_acute: - case UnicodeChar::s_acute_uc: - case UnicodeChar::s_acute: - case UnicodeChar::s_cedilla_uc: - case UnicodeChar::s_cedilla: - case UnicodeChar::u_double_acute_uc: - case UnicodeChar::u_double_acute: - case UnicodeChar::z_acute_uc: - case UnicodeChar::z_acute: - case UnicodeChar::z_dot_uc: - case UnicodeChar::z_dot: - case UnicodeChar::f_with_hook_uc: - case UnicodeChar::s_comma_uc: - case UnicodeChar::s_comma: - case UnicodeChar::t_comma_uc: - case UnicodeChar::t_comma: - case UnicodeChar::sharp_s_uc: - - // Cyrillic alphabet - case UnicodeChar::cyrillic_io_uc: - case UnicodeChar::cyrillic_io: - - // Punctuation - case UnicodeChar::leftguillemet: - case UnicodeChar::rightguillemet: - case UnicodeChar::interpunct: - case UnicodeChar::single_quote_open: - case UnicodeChar::single_quote_end: - case UnicodeChar::single_german_quote_open: - case UnicodeChar::german_quote_open: - case UnicodeChar::bullet: - case UnicodeChar::ellipsis: - case UnicodeChar::quote_open: - case UnicodeChar::quote_close: - - // Currency - case UnicodeChar::guilder: - case UnicodeChar::euro: - - // Dingbats - case UnicodeChar::up: - case UnicodeChar::small_up: - case UnicodeChar::right: - case UnicodeChar::down: - case UnicodeChar::small_down: - case UnicodeChar::left: - case UnicodeChar::air: - case UnicodeChar::tick: - case UnicodeChar::plus: - case UnicodeChar::minus: - - // Emoji - case UnicodeChar::cross: - case UnicodeChar::variation_selector: - case UnicodeChar::water: - case UnicodeChar::road: - case UnicodeChar::railway: - - // Misc - case UnicodeChar::superscript_minus_one: - - supported = true; - break; - default: - if ((codepoint >= 32 && codepoint < 256) - || (codepoint >= UnicodeChar::cyrillic_a_uc && codepoint <= UnicodeChar::cyrillic_ya)) - { - supported = true; - } - break; + supported = true; } + auto result = codepointOffsetMap.find(codepoint); + if (result != codepointOffsetMap.end()) + supported = true; + if (!supported) { return false; diff --git a/src/openrct2/localisation/ConversionTables.cpp b/src/openrct2/localisation/ConversionTables.cpp index 0b306193e0..3c3045a34d 100644 --- a/src/openrct2/localisation/ConversionTables.cpp +++ b/src/openrct2/localisation/ConversionTables.cpp @@ -65,38 +65,38 @@ const encoding_convert_entry RCT2ToUnicodeTable[] = { 153, FORMAT_LIGHTPINK }, { 154, FORMAT_PEARLAQUA }, { 155, FORMAT_PALESILVER }, - { RCT2_A_OGONEK_UC, UnicodeChar::a_ogonek_uc }, - { 160, UnicodeChar::up }, - { RCT2_C_ACUTE_UC, UnicodeChar::c_acute_uc }, - { RCT2_E_OGONEK_UC, UnicodeChar::e_ogonek_uc }, - { RCT2_L_STROKE_UC, UnicodeChar::l_stroke_uc }, - { 170, UnicodeChar::down }, - { 172, UnicodeChar::tick }, - { 173, UnicodeChar::cross }, - { 175, UnicodeChar::right }, - { 177, UnicodeChar::railway }, - { 180, UnicodeChar::quote_open }, - { 181, UnicodeChar::euro }, - { 182, UnicodeChar::road }, - { 183, UnicodeChar::air }, - { 184, UnicodeChar::water }, - { 185, UnicodeChar::superscript_minus_one}, - { 186, UnicodeChar::bullet }, - { 188, UnicodeChar::small_up }, - { 189, UnicodeChar::small_down }, - { 190, UnicodeChar::left }, - { RCT2_N_ACUTE_UC, UnicodeChar::n_acute_uc }, - { RCT2_S_ACUTE_UC, UnicodeChar::s_acute_uc }, - { RCT2_Z_ACUTE_UC, UnicodeChar::z_acute_uc }, - { RCT2_Z_DOT_UC, UnicodeChar::z_dot_uc }, - { RCT2_A_OGONEK, UnicodeChar::a_ogonek }, - { RCT2_C_ACUTE, UnicodeChar::c_acute }, - { RCT2_E_OGONEK, UnicodeChar::e_ogonek }, - { RCT2_N_ACUTE, UnicodeChar::n_acute }, - { RCT2_L_STROKE, UnicodeChar::l_stroke }, - { RCT2_S_ACUTE, UnicodeChar::s_acute }, - { RCT2_Z_DOT, UnicodeChar::z_dot }, - { RCT2_Z_ACUTE, UnicodeChar::z_acute }, + { CSChar::a_ogonek_uc, UnicodeChar::a_ogonek_uc }, + { CSChar::up, UnicodeChar::up }, + { CSChar::c_acute_uc, UnicodeChar::c_acute_uc }, + { CSChar::e_ogonek_uc, UnicodeChar::e_ogonek_uc }, + { CSChar::l_stroke_uc, UnicodeChar::l_stroke_uc }, + { CSChar::down, UnicodeChar::down }, + { CSChar::tick, UnicodeChar::tick }, + { CSChar::cross, UnicodeChar::cross }, + { CSChar::right, UnicodeChar::right }, + { CSChar::railway, UnicodeChar::railway }, + { CSChar::quote_open, UnicodeChar::quote_open }, + { CSChar::euro, UnicodeChar::euro }, + { CSChar::road, UnicodeChar::road }, + { CSChar::air, UnicodeChar::air }, + { CSChar::water, UnicodeChar::water }, + { CSChar::superscript_minus_one, UnicodeChar::superscript_minus_one}, + { CSChar::bullet, UnicodeChar::bullet }, + { CSChar::small_up, UnicodeChar::small_up }, + { CSChar::small_down, UnicodeChar::small_down }, + { CSChar::left, UnicodeChar::left }, + { CSChar::n_acute_uc, UnicodeChar::n_acute_uc }, + { CSChar::s_acute_uc, UnicodeChar::s_acute_uc }, + { CSChar::z_acute_uc, UnicodeChar::z_acute_uc }, + { CSChar::z_dot_uc, UnicodeChar::z_dot_uc }, + { CSChar::a_ogonek, UnicodeChar::a_ogonek }, + { CSChar::c_acute, UnicodeChar::c_acute }, + { CSChar::e_ogonek, UnicodeChar::e_ogonek }, + { CSChar::n_acute, UnicodeChar::n_acute }, + { CSChar::l_stroke, UnicodeChar::l_stroke }, + { CSChar::s_acute, UnicodeChar::s_acute }, + { CSChar::z_dot, UnicodeChar::z_dot }, + { CSChar::z_acute, UnicodeChar::z_acute }, }; static int32_t encoding_search_compare(const void *pKey, const void *pEntry) diff --git a/src/openrct2/localisation/FormatCodes.h b/src/openrct2/localisation/FormatCodes.h index 4b32f69ec7..5ab1b7200d 100644 --- a/src/openrct2/localisation/FormatCodes.h +++ b/src/openrct2/localisation/FormatCodes.h @@ -97,26 +97,49 @@ enum FORMAT_COMMA1DP16 = 20004 }; -enum RCT2Polish -{ - RCT2_A_OGONEK_UC = 159, // 0x9F - RCT2_C_ACUTE_UC = 162, // 0xA2 - RCT2_E_OGONEK_UC = 166, // 0xA6 - RCT2_N_ACUTE_UC = 198, // 0xC6 - RCT2_L_STROKE_UC = 167, // 0xA7 - RCT2_S_ACUTE_UC = 208, // 0xD0 - RCT2_Z_DOT_UC = 216, // 0xD8 - RCT2_Z_ACUTE_UC = 215, // 0xD7 +constexpr uint8_t CS_SPRITE_FONT_OFFSET = 32; - RCT2_A_OGONEK = 221, // 0xDD - RCT2_C_ACUTE = 222, // 0xDE - RCT2_E_OGONEK = 230, // 0xE6 - RCT2_N_ACUTE = 240, // 0xF0 - RCT2_L_STROKE = 247, // 0xF7 - RCT2_S_ACUTE = 248, // 0xF8 - RCT2_Z_DOT = 253, // 0xFD - RCT2_Z_ACUTE = 254, // 0xFE -}; +namespace CSChar +{ + constexpr char32_t quote_close = 0x22; + + constexpr char32_t a_ogonek_uc = 0x9F; + constexpr char32_t up = 0xA0; + + constexpr char32_t c_acute_uc = 0xA2; + constexpr char32_t e_ogonek_uc = 0xA6; + constexpr char32_t l_stroke_uc = 0xA7; + + constexpr char32_t down = 0xAA; + constexpr char32_t tick = 0xAC; + constexpr char32_t cross = 0xAD; + constexpr char32_t right = 0xAF; + constexpr char32_t railway = 0xB1; + constexpr char32_t quote_open = 0xB4; + constexpr char32_t euro = 0xB5; + constexpr char32_t road = 0xB6; + constexpr char32_t air = 0xB7; + constexpr char32_t water = 0xB8; + constexpr char32_t superscript_minus_one = 0xB9; + constexpr char32_t bullet = 0xBA; + constexpr char32_t small_up = 0xBC; + constexpr char32_t small_down = 0xBD; + constexpr char32_t left = 0xBE; + + constexpr char32_t n_acute_uc = 0xC6; + constexpr char32_t s_acute_uc = 0xD0; + constexpr char32_t z_acute_uc = 0xD7; + constexpr char32_t z_dot_uc = 0xD8; + constexpr char32_t a_ogonek = 0xDD; + constexpr char32_t c_acute = 0xDE; + constexpr char32_t e_ogonek = 0xE6; + constexpr char32_t n_acute = 0xF0; + constexpr char32_t l_stroke = 0xF7; + constexpr char32_t s_acute = 0xF8; + constexpr char32_t z_acute = 0xFE; + + constexpr char32_t z_dot = 0xFD; +} // namespace CSChar namespace UnicodeChar {