Replace switch towers with std::map

This commit is contained in:
Gymnasiast 2018-09-22 20:08:06 +02:00
parent 7d7d0aeab5
commit f07e677af1
3 changed files with 240 additions and 455 deletions

View File

@ -17,6 +17,8 @@
#include "Drawing.h"
#include "TTF.h"
#include <map>
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<char32_t, int32_t> 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;

View File

@ -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)

View File

@ -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
{