From 44c8c2a79cccdd1d7b929b15fb40365153960fa3 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 17 Feb 2019 23:18:28 +0100 Subject: [PATCH] - added German Umlauts for the BigFont and fixed the character substitution logic. For pure uppercase fonts it makes no sense to try a lowercase substitution as a first step. --- src/gamedata/fonts/font.cpp | 54 +++++++++++++----- src/gamedata/fonts/v_font.h | 1 + .../game-doomchex/fonts/bigfont/00C4.lmp | Bin 0 -> 301 bytes .../game-doomchex/fonts/bigfont/00D6.lmp | Bin 0 -> 353 bytes .../game-doomchex/fonts/bigfont/00DC.lmp | Bin 0 -> 296 bytes 5 files changed, 42 insertions(+), 13 deletions(-) create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C4.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00D6.lmp create mode 100644 wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00DC.lmp diff --git a/src/gamedata/fonts/font.cpp b/src/gamedata/fonts/font.cpp index a151f1095..a777cdef0 100644 --- a/src/gamedata/fonts/font.cpp +++ b/src/gamedata/fonts/font.cpp @@ -708,24 +708,52 @@ int FFont::GetCharCode(int code, bool needpic) const return code; } - int originalcode = code; - int newcode; - - // Try stripping accents from accented characters. This may repeat to allow multi-step fallbacks. - while ((newcode = stripaccent(code)) != code) + // Use different substitution logic based on the fonts content: + // In a font which has both upper and lower case, prefer unaccented small characters over capital ones. + // In a pure upper-case font, do not check for lower case replacements. + if (!MixedCase) { - code = newcode; - if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) + // Try converting lowercase characters to uppercase. + if (myislower(code)) { - return code; + code = upperforlower[code]; + if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) + { + return code; + } + } + // Try stripping accents from accented characters. + int newcode = stripaccent(code); + if (newcode != code) + { + code = newcode; + if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) + { + return code; + } } } - - if (myislower(code)) + else { - int upper = upperforlower[code]; - // Stripping accents did not help - now try uppercase for lowercase - if (upper != code) return GetCharCode(upper, needpic); + int originalcode = code; + int newcode; + + // Try stripping accents from accented characters. This may repeat to allow multi-step fallbacks. + while ((newcode = stripaccent(code)) != code) + { + code = newcode; + if (code >= FirstChar && code <= LastChar && (!needpic || Chars[code - FirstChar].TranslatedPic != nullptr)) + { + return code; + } + } + + if (myislower(code)) + { + int upper = upperforlower[code]; + // Stripping accents did not help - now try uppercase for lowercase + if (upper != code) return GetCharCode(upper, needpic); + } } return -1; diff --git a/src/gamedata/fonts/v_font.h b/src/gamedata/fonts/v_font.h index 0702781e9..18ca18978 100644 --- a/src/gamedata/fonts/v_font.h +++ b/src/gamedata/fonts/v_font.h @@ -126,6 +126,7 @@ protected: char Cursor; bool noTranslate; bool translateUntranslated; + bool MixedCase = false; struct CharData { FTexture *TranslatedPic = nullptr; // Texture for use with font translations. diff --git a/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C4.lmp b/wadsrc_extra/static/filter/game-doomchex/fonts/bigfont/00C4.lmp new file mode 100644 index 0000000000000000000000000000000000000000..88866e396cb066b679a54aaf0e546f47d13e7402 GIT binary patch literal 301 zcmX|*!41MN3`J7`El?yDU>uHIDug1-K~XAB|H2Tgzy>V901UtgtiTFf!go_}^pg17 z`Oey{oW+*x$dR1Mg);?1J`>$K7SPDr zTC4M%cg8uRY3o%BBsdqNH#&_1;OM1Vgk}kJthFBFzffva2QO5|d}S2Ob#lnyu#B}W q;CTig>s*{8AcT}8NfqkgF-FP4?$bk@PgzRI@=o@G2