From d3b2480fdbca1476d9d49c3d580ef7d62bb26e05 Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Mon, 18 May 2026 10:08:50 +0200 Subject: [PATCH] refactor: remove transliteration from DisplayDriver base class Lemon font supports Latin Extended, Greek, and Cyrillic natively, so transliteration to ASCII is not needed. SH1106Display overrides translateUTF8ToBlocks to pass UTF-8 directly to the Lemon renderer. The base class implementation is now a simple pass-through copy. Co-Authored-By: Claude Sonnet 4.6 --- src/helpers/ui/DisplayDriver.h | 112 ++------------------------------- 1 file changed, 4 insertions(+), 108 deletions(-) diff --git a/src/helpers/ui/DisplayDriver.h b/src/helpers/ui/DisplayDriver.h index 9b4a8014..99ceb540 100644 --- a/src/helpers/ui/DisplayDriver.h +++ b/src/helpers/ui/DisplayDriver.h @@ -44,115 +44,11 @@ public: print(str); } - static char transliterateCodepoint(uint32_t cp) { - switch (cp) { - // Polish - case 0x0105: return 'a'; case 0x0104: return 'A'; // ą Ą - case 0x0107: return 'c'; case 0x0106: return 'C'; // ć Ć - case 0x0119: return 'e'; case 0x0118: return 'E'; // ę Ę - case 0x0142: return 'l'; case 0x0141: return 'L'; // ł Ł - case 0x0144: return 'n'; case 0x0143: return 'N'; // ń Ń - case 0x00F3: return 'o'; case 0x00D3: return 'O'; // ó Ó - case 0x015B: return 's'; case 0x015A: return 'S'; // ś Ś - case 0x017A: return 'z'; case 0x0179: return 'Z'; // ź Ź - case 0x017C: return 'z'; case 0x017B: return 'Z'; // ż Ż - // Czech/Slovak - case 0x010D: return 'c'; case 0x010C: return 'C'; // č Č - case 0x0161: return 's'; case 0x0160: return 'S'; // š Š - case 0x017E: return 'z'; case 0x017D: return 'Z'; // ž Ž - case 0x0159: return 'r'; case 0x0158: return 'R'; // ř Ř - case 0x011B: return 'e'; case 0x011A: return 'E'; // ě Ě - case 0x016F: return 'u'; case 0x016E: return 'U'; // ů Ů - case 0x010F: return 'd'; case 0x010E: return 'D'; // ď Ď - case 0x0165: return 't'; case 0x0164: return 'T'; // ť Ť - case 0x0148: return 'n'; case 0x0147: return 'N'; // ň Ň - case 0x013E: return 'l'; case 0x013D: return 'L'; // ľ Ľ - case 0x013A: return 'l'; case 0x0139: return 'L'; // ĺ Ĺ - case 0x0155: return 'r'; case 0x0154: return 'R'; // ŕ Ŕ - // German - case 0x00E4: return 'a'; case 0x00C4: return 'A'; // ä Ä - case 0x00F6: return 'o'; case 0x00D6: return 'O'; // ö Ö - case 0x00FC: return 'u'; case 0x00DC: return 'U'; // ü Ü - case 0x00DF: return 's'; // ß - // Scandinavian - case 0x00E5: return 'a'; case 0x00C5: return 'A'; // å Å - case 0x00F8: return 'o'; case 0x00D8: return 'O'; // ø Ø - case 0x00E6: return 'a'; case 0x00C6: return 'A'; // æ Æ - // Hungarian - case 0x0151: return 'o'; case 0x0150: return 'O'; // ő Ő - case 0x0171: return 'u'; case 0x0170: return 'U'; // ű Ű - // Romanian - case 0x0103: return 'a'; case 0x0102: return 'A'; // ă Ă - case 0x0219: return 's'; case 0x0218: return 'S'; // ș Ș - case 0x021B: return 't'; case 0x021A: return 'T'; // ț Ț - // Croatian - case 0x0111: return 'd'; case 0x0110: return 'D'; // đ Đ - // Icelandic - case 0x00F0: return 'd'; case 0x00D0: return 'D'; // ð Ð (eth) - case 0x00FE: return 't'; case 0x00DE: return 'T'; // þ Þ (thorn) - // Romanian cedilla variants (legacy encoding) - case 0x0163: return 't'; case 0x0162: return 'T'; // ţ Ţ - // Turkish - case 0x011F: return 'g'; case 0x011E: return 'G'; // ğ Ğ - case 0x015F: return 's'; case 0x015E: return 'S'; // ş Ş - case 0x0131: return 'i'; // ı - // Baltic (Lithuanian/Latvian) - case 0x0101: return 'a'; case 0x0100: return 'A'; // ā Ā - case 0x0113: return 'e'; case 0x0112: return 'E'; // ē Ē - case 0x012B: return 'i'; case 0x012A: return 'I'; // ī Ī - case 0x016B: return 'u'; case 0x016A: return 'U'; // ū Ū - case 0x0123: return 'g'; case 0x0122: return 'G'; // ģ Ģ - case 0x0137: return 'k'; case 0x0136: return 'K'; // ķ Ķ - case 0x013C: return 'l'; case 0x013B: return 'L'; // ļ Ļ - case 0x0146: return 'n'; case 0x0145: return 'N'; // ņ Ņ - case 0x0157: return 'r'; case 0x0156: return 'R'; // ŗ Ŗ - case 0x0173: return 'u'; case 0x0172: return 'U'; // ų Ų - case 0x0117: return 'e'; case 0x0116: return 'E'; // ė Ė - case 0x012F: return 'i'; case 0x012E: return 'I'; // į Į - // French/Spanish/Portuguese common accents - case 0x00E0: case 0x00E1: case 0x00E2: case 0x00E3: return 'a'; - case 0x00C0: case 0x00C1: case 0x00C2: case 0x00C3: return 'A'; - case 0x00E8: case 0x00E9: case 0x00EA: case 0x00EB: return 'e'; - case 0x00C8: case 0x00C9: case 0x00CA: case 0x00CB: return 'E'; - case 0x00EC: case 0x00ED: case 0x00EE: case 0x00EF: return 'i'; - case 0x00CC: case 0x00CD: case 0x00CE: case 0x00CF: return 'I'; - case 0x00F2: case 0x00F4: case 0x00F5: return 'o'; - case 0x00D2: case 0x00D4: case 0x00D5: return 'O'; - case 0x00F9: case 0x00FA: case 0x00FB: return 'u'; - case 0x00D9: case 0x00DA: case 0x00DB: return 'U'; - case 0x00E7: return 'c'; case 0x00C7: return 'C'; // ç Ç - case 0x00F1: return 'n'; case 0x00D1: return 'N'; // ñ Ñ - case 0x00FD: return 'y'; case 0x00DD: return 'Y'; // ý Ý - default: return '\xDB'; // CP437 full block █ - } - } - - // convert UTF-8 to ASCII, transliterating accented/diacritic characters virtual void translateUTF8ToBlocks(char* dest, const char* src, size_t dest_size) { - size_t j = 0; - const uint8_t* p = (const uint8_t*)src; - while (*p && j < dest_size - 1) { - uint8_t c = *p++; - if (c < 0x80) { - if (c >= 32) dest[j++] = c; - } else { - uint32_t cp = c; - if ((c & 0xE0) == 0xC0) { - cp = c & 0x1F; - if (*p) cp = (cp << 6) | (*p++ & 0x3F); - } else if ((c & 0xF0) == 0xE0) { - cp = c & 0x0F; - if (*p) cp = (cp << 6) | (*p++ & 0x3F); - if (*p) cp = (cp << 6) | (*p++ & 0x3F); - } else { - while (*p && (*p & 0xC0) == 0x80) p++; - dest[j++] = '\xDB'; - continue; - } - dest[j++] = transliterateCodepoint(cp); - } - } - dest[j] = 0; + size_t n = strlen(src); + if (n >= dest_size) n = dest_size - 1; + memcpy(dest, src, n); + dest[n] = 0; } // draw text with ellipsis if it exceeds max_width