Added Slovak C2C3C4 mapper implementation.

This commit is contained in:
Roman Moravčík 2017-10-04 21:07:31 +02:00 committed by Scott Lahteine
parent 0ec9a7f090
commit 2a46ab288e
5 changed files with 294 additions and 51 deletions

View file

@ -26,9 +26,9 @@
#include "language.h"
#if ENABLED(DOGLCD)
#define HARDWARE_CHAR_OUT u8g.print
#define HARDWARE_CHAR_OUT(C) u8g.print((char)(C))
#else
#define HARDWARE_CHAR_OUT lcd.write
#define HARDWARE_CHAR_OUT(C) lcd.write((char)(C))
#endif
#if DISABLED(SIMULATE_ROMFONT) && ENABLED(DOGLCD)
@ -161,9 +161,9 @@
else if (seen_c2) {
d &= 0x3Fu;
#ifndef MAPPER_ONE_TO_ONE
HARDWARE_CHAR_OUT((char)pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20));
HARDWARE_CHAR_OUT(pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20));
#else
HARDWARE_CHAR_OUT((char)(0x80u + (utf_hi_char << 6) + d)) ;
HARDWARE_CHAR_OUT(0x80u + (utf_hi_char << 6) + d) ;
#endif
}
else {
@ -171,7 +171,7 @@
}
}
else {
HARDWARE_CHAR_OUT((char) c );
HARDWARE_CHAR_OUT(c);
}
seen_c2 = false;
return 1;
@ -203,7 +203,7 @@
case 0xB1u: d = 0xFDu; break;
default: d = '?';
}
HARDWARE_CHAR_OUT((char)d) ;
HARDWARE_CHAR_OUT(d) ;
}
else if (seen_c5) {
switch(d) {
@ -211,14 +211,14 @@
case 0x9Fu: d = 0xFEu; break;
default: d = '?';
}
HARDWARE_CHAR_OUT((char)d) ;
HARDWARE_CHAR_OUT(d) ;
}
else if (seen_c2) {
d &= 0x3Fu;
#ifndef MAPPER_ONE_TO_ONE
HARDWARE_CHAR_OUT((char)pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20));
HARDWARE_CHAR_OUT(pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20));
#else
HARDWARE_CHAR_OUT((char)(0x80u + (utf_hi_char << 6) + d)) ;
HARDWARE_CHAR_OUT(0x80u + (utf_hi_char << 6) + d);
#endif
}
else {
@ -226,7 +226,7 @@
}
}
else {
HARDWARE_CHAR_OUT((char) c );
HARDWARE_CHAR_OUT(c);
}
seen_c2 = seen_c4 = seen_c5 = false;
return 1;
@ -247,9 +247,9 @@
else if (seen_ce) {
d &= 0x3F;
#ifndef MAPPER_ONE_TO_ONE
HARDWARE_CHAR_OUT((char)pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20));
HARDWARE_CHAR_OUT(pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20));
#else
HARDWARE_CHAR_OUT((char)(0x80 + (utf_hi_char << 6) + d)) ;
HARDWARE_CHAR_OUT(0x80 + (utf_hi_char << 6) + d);
#endif
}
else {
@ -257,7 +257,7 @@
}
}
else {
HARDWARE_CHAR_OUT((char)c);
HARDWARE_CHAR_OUT(c);
}
seen_ce = false;
return 1;
@ -278,9 +278,9 @@
else if (seen_ce) {
d &= 0x3F;
#ifndef MAPPER_ONE_TO_ONE
HARDWARE_CHAR_OUT((char)pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20));
HARDWARE_CHAR_OUT(pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20));
#else
HARDWARE_CHAR_OUT((char)(0x80 + (utf_hi_char << 6) + d)) ;
HARDWARE_CHAR_OUT(0x80 + (utf_hi_char << 6) + d);
#endif
}
else {
@ -288,7 +288,7 @@
}
}
else {
HARDWARE_CHAR_OUT((char) c );
HARDWARE_CHAR_OUT(c);
}
seen_ce = false;
return 1;
@ -311,13 +311,13 @@
else if (seen_d5) {
d &= 0x3F;
if (!utf_hi_char && d == 1) {
HARDWARE_CHAR_OUT((char) 0xA2); // Ё
HARDWARE_CHAR_OUT(0xA2); // Ё
}
else if (utf_hi_char == 1 && d == 0x11) {
HARDWARE_CHAR_OUT((char)0xB5); // ё
HARDWARE_CHAR_OUT(0xB5); // ё
}
else {
HARDWARE_CHAR_OUT((char)pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x10));
HARDWARE_CHAR_OUT(pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x10));
}
}
else {
@ -325,7 +325,7 @@
}
}
else {
HARDWARE_CHAR_OUT((char) c );
HARDWARE_CHAR_OUT(c);
}
seen_d5 = false;
return 1;
@ -346,9 +346,9 @@
else if (seen_d5) {
d &= 0x3Fu;
#ifndef MAPPER_ONE_TO_ONE
HARDWARE_CHAR_OUT((char)pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20));
HARDWARE_CHAR_OUT(pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20));
#else
HARDWARE_CHAR_OUT((char)(0xA0u + (utf_hi_char << 6) + d)) ;
HARDWARE_CHAR_OUT(0xA0u + (utf_hi_char << 6) + d);
#endif
}
else {
@ -356,7 +356,7 @@
}
}
else {
HARDWARE_CHAR_OUT((char) c );
HARDWARE_CHAR_OUT(c);
}
seen_d5 = false;
return 1;
@ -382,18 +382,17 @@
else if (seen_e3 && seen_82_83) {
d &= 0x3F;
#ifndef MAPPER_ONE_TO_ONE
HARDWARE_CHAR_OUT((char)pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20));
HARDWARE_CHAR_OUT(pgm_read_byte_near(utf_recode + d + (utf_hi_char << 6) - 0x20));
#else
HARDWARE_CHAR_OUT((char)(0x80 + (utf_hi_char << 6) + d)) ;
HARDWARE_CHAR_OUT(0x80 + (utf_hi_char << 6) + d);
#endif
}
else {
HARDWARE_CHAR_OUT((char) '?' );
}
}
else {
HARDWARE_CHAR_OUT((char) c );
else
HARDWARE_CHAR_OUT('?');
}
else
HARDWARE_CHAR_OUT(c);
seen_e3 = false;
seen_82_83 = false;
return 1;
@ -437,7 +436,7 @@
case 0x98u ... 0x99u: d -= 20; break; //Ę i ę
default: d = '?';
}
HARDWARE_CHAR_OUT((char)d) ;
HARDWARE_CHAR_OUT(d) ;
}
else if (seen_c5) {
switch(d) {
@ -446,7 +445,7 @@
case 0xB9u ... 0xBCu: d -= 0x2Bu; break; //Ź - ż
default: d = '?';
}
HARDWARE_CHAR_OUT((char)d) ;
HARDWARE_CHAR_OUT(d) ;
}
else if (seen_c3) {
switch(d) {
@ -454,13 +453,13 @@
case 0xB3u: d = 0x8Bu; break; //ó
d = '?';
}
HARDWARE_CHAR_OUT((char)d) ;
HARDWARE_CHAR_OUT(d) ;
}
}
else {
HARDWARE_CHAR_OUT((char) c );
}
else
HARDWARE_CHAR_OUT(c);
seen_c3 = seen_c4 = seen_c5 = false;
return 1;
}
@ -515,7 +514,7 @@
case 0x9Au ... 0x9Bu: d -= 10; break; // Ěě
default: d = '?';
}
HARDWARE_CHAR_OUT((char)d) ;
HARDWARE_CHAR_OUT(d) ;
}
else if (seen_c5) {
switch(d) {
@ -527,7 +526,7 @@
case 0xBDu ... 0xBEu: d -= 0x21u; break; // Žž
default: d = '?';
}
HARDWARE_CHAR_OUT((char)d) ;
HARDWARE_CHAR_OUT(d) ;
}
else if (seen_c3) {
switch(d) {
@ -545,21 +544,115 @@
case 0xBDu: d = 0x8Bu; break; // ý
default: d = '?';
}
HARDWARE_CHAR_OUT((char)d) ;
HARDWARE_CHAR_OUT(d) ;
}
}
else {
HARDWARE_CHAR_OUT((char) c );
}
else
HARDWARE_CHAR_OUT(c);
seen_c3 = seen_c4 = seen_c5 = false;
return 1;
}
#elif ENABLED(MAPPER_C3C4C5_SK)
// TBD
#error "No mapping for Slovak at this time. Use MAPPER_NON."
/**
* Á C3 81 = 80
* Ä C3 84 = 81
* É C3 89 = 82
* Í C3 8D = 83
* Ó C3 93 = 84
* Ô C3 94 = 85
* Ú C3 9A = 86
* Ý C3 9D = 87
* á C3 A1 = 88
* ä C3 A4 = 89
* é C3 A9 = 8A
* í C3 AD = 8B
* ó C3 B3 = 8C
* ô C3 B4 = 8D
* ú C3 BA = 8E
* ý C3 BD = 8F
* Č C4 8C = 90
* č C4 8D = 91
* Ď C4 8E = 92
* ď C4 8F = 93
* Ĺ C4 B9 = 94
* ĺ C4 BA = 95
* Ľ C4 BD = 96
* ľ C4 BE = 97
* Ň C5 87 = 98
* ň C5 88 = 99
* Ŕ C5 94 = 9A
* ŕ C5 95 = 9B
* Š C5 A0 = 9C
* š C5 A1 = 9D
* Ť C5 A4 = 9E
* ť C5 A5 = 9F
* Ž C5 BD = A0
* ž C5 BE = A1
*/
char charset_mapper(const char c) {
static bool seen_c3 = false,
seen_c4 = false,
seen_c5 = false;
uint8_t d = c;
if (d >= 0x80u) { // UTF-8 handling
if (d == 0xC4u) { seen_c4 = true; return 0; }
else if (d == 0xC5u) { seen_c5 = true; return 0; }
else if (d == 0xC3u) { seen_c3 = true; return 0; }
else if (seen_c4) {
switch(d) {
case 0x8Cu ... 0x8Fu: d += 0x04u; break; // ČčĎď
case 0xB9u ... 0xBAu: d -= 0x25u; break; // Ĺĺ
case 0xBDu ... 0xBEu: d -= 0x27u; break; // Ľľ
default: d = '?';
}
HARDWARE_CHAR_OUT(d) ;
}
else if (seen_c5) {
switch(d) {
case 0x87u ... 0x88u: d += 0x11u; break; // Ňň
case 0x94u ... 0x95u: d += 0x06u; break; // Ŕŕ
case 0xA0u ... 0xA1u: d -= 0x04u; break; // Šš
case 0xA4u ... 0xA5u: d -= 0x06u; break; // Ťť
case 0xBDu ... 0xBEu: d -= 0x1Du; break; // Žž
default: d = '?';
}
HARDWARE_CHAR_OUT(d) ;
}
else if (seen_c3) {
switch(d) {
case 0x81u: d = 0x80u; break; // Á
case 0x84u: d = 0x81u; break; // Ä
case 0x89u: d = 0x82u; break; // É
case 0x8Du: d = 0x83u; break; // Í
case 0x93u: d = 0x84u; break; // Ó
case 0x94u: d = 0x85u; break; // Ô
case 0x9Au: d = 0x86u; break; // Ú
case 0x9Du: d = 0x87u; break; // Ý
case 0xA1u: d = 0x88u; break; // á
case 0xA4u: d = 0x89u; break; // ä
case 0xA9u: d = 0x8Au; break; // é
case 0xADu: d = 0x8Bu; break; // í
case 0xB3u: d = 0x8Cu; break; // ó
case 0xB4u: d = 0x8Du; break; // ô
case 0xBAu: d = 0x8Eu; break; // ú
case 0xBDu: d = 0x8Fu; break; // ý
default: d = '?';
}
HARDWARE_CHAR_OUT(d) ;
}
}
else
HARDWARE_CHAR_OUT(c);
seen_c3 = seen_c4 = seen_c5 = false;
return 1;
}
#else