FabGL
ESP32 Display Controller and Graphics Library
codepages.cpp
1 /*
2  Created by Fabrizio Di Vittorio (fdivitto2013@gmail.com) - <http://www.fabgl.com>
3  Copyright (c) 2019-2021 Fabrizio Di Vittorio.
4  All rights reserved.
5 
6 
7 * Please contact fdivitto2013@gmail.com if you need a commercial license.
8 
9 
10 * This library and related software is available under GPL v3. Feel free to use FabGL in free software and hardware:
11 
12  FabGL is free software: you can redistribute it and/or modify
13  it under the terms of the GNU General Public License as published by
14  the Free Software Foundation, either version 3 of the License, or
15  (at your option) any later version.
16 
17  FabGL is distributed in the hope that it will be useful,
18  but WITHOUT ANY WARRANTY; without even the implied warranty of
19  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  GNU General Public License for more details.
21 
22  You should have received a copy of the GNU General Public License
23  along with FabGL. If not, see <http://www.gnu.org/licenses/>.
24  */
25 
26 
27 #include "codepages.h"
28 
29 
30 #pragma GCC optimize ("O2")
31 
32 
33 
34 namespace fabgl {
35 
36 
37 
39 // Codepage 437
40 
41 const VirtualKeyToASCII VK2ASCII437[] = {
42 
43  { VK_GRAVE_a, 0x85 }, // à
44  { VK_GRAVE_e, 0x8a }, // è
45  { VK_ACUTE_e, 0x82 }, // é
46  { VK_GRAVE_i, 0x8d }, // ì
47  { VK_GRAVE_o, 0x95 }, // ò
48  { VK_GRAVE_u, 0x97 }, // ù
49  { VK_CEDILLA_c, 0x87 }, // ç
50  { VK_ESZETT, 0xe1 }, // ß
51  { VK_UMLAUT_u, 0x81 }, // ü
52  { VK_UMLAUT_o, 0x94 }, // ö
53  { VK_UMLAUT_a, 0x84 }, // ä
54  { VK_ACUTEACCENT, 0x27 }, // ´ -> ' (not in cp437)
55  { VK_POUND, 0x9c }, // £
56  { VK_EURO, 0xee }, // € -> ε (not in cp437)
57  { VK_DEGREE, 0xf8 }, // °
58  { VK_NEGATION, 0xaa }, // ¬
59  { VK_SQUARE, 0xfd }, // ²
60  { VK_MU, 0xe6 }, // µ
61  { VK_CEDILLA_C, 0x80 }, // Ç
62  { VK_TILDE_n, 0xa4 }, // ñ
63  { VK_TILDE_N, 0xa5 }, // Ñ
64  { VK_UPPER_a, 0xa6 }, // ª
65  { VK_ACUTE_a, 0xa0 }, // á
66  { VK_ACUTE_o, 0xa2 }, // ó
67  { VK_ACUTE_u, 0xa3 }, // ú
68  { VK_UMLAUT_i, 0x8b }, // ï
69  { VK_EXCLAIM_INV, 0xad }, // ¡
70  { VK_QUESTION_INV, 0xa8 }, // ¿
71  { VK_ACUTE_A, 0x41 }, // Á -> A (not in cp437)
72  { VK_ACUTE_E, 0x90 }, // É
73  { VK_ACUTE_I, 0x49 }, // Í -> I (not in cp437)
74  { VK_ACUTE_O, 0xe0 }, // Ó -> O (not in cp437)
75  { VK_ACUTE_U, 0x55 }, // Ú -> U (not in cp437)
76  { VK_GRAVE_A, 0x41 }, // À -> A (not in cp437)
77  { VK_GRAVE_E, 0x45 }, // È -> E (not in cp437)
78  { VK_GRAVE_I, 0x49 }, // Ì -> I (not in cp437)
79  { VK_GRAVE_O, 0x4f }, // Ò -> O (not in cp437)
80  { VK_GRAVE_U, 0x55 }, // Ù -> U (not in cp437)
81  { VK_INTERPUNCT, 0xfa }, // ·
82  { VK_UMLAUT_e, 0x89 }, // ë
83  { VK_UMLAUT_A, 0x8e }, // Ä
84  { VK_UMLAUT_E, 0x45 }, // Ë -> E (not in cp437)
85  { VK_UMLAUT_I, 0x49 }, // Ï -> I (not in cp437)
86  { VK_UMLAUT_O, 0x99 }, // Ö
87  { VK_UMLAUT_U, 0x9a }, // Ü
88  { VK_CARET_a, 0x83 }, // â
89  { VK_CARET_e, 0x88 }, // ê
90  { VK_CARET_i, 0x8c }, // î
91  { VK_CARET_o, 0x93 }, // ô
92  { VK_CARET_u, 0x96 }, // û
93  { VK_CARET_A, 0x41 }, // Â -> A (not in cp437)
94  { VK_CARET_E, 0x45 }, // Ê -> E (not in cp437)
95  { VK_CARET_I, 0x49 }, // Î -> I (not in cp437)
96  { VK_CARET_O, 0x4f }, // Ô -> O (not in cp437)
97  { VK_CARET_U, 0x55 }, // Û -> U (not in cp437)
98  { VK_TILDE_a, 0x61 }, // ã -> a (not in cp437)
99  { VK_TILDE_A, 0x41 }, // Ã -> A (not in cp437)
100  { VK_TILDE_o, 0x6f }, // õ -> o (not in cp437)
101  { VK_TILDE_O, 0x4f }, // Õ -> O (not in cp437)
102  { VK_GRAVE_y, 0x79 }, // ỳ -> y (not in cp437)
103  { VK_GRAVE_Y, 0x59 }, // Ỳ -> Y (not in cp437)
104  { VK_ACUTE_y, 0x79 }, // ý -> y (not in cp437)
105  { VK_ACUTE_Y, 0x59 }, // Ý -> Y (not in cp437)
106  { VK_CARET_y, 0x79 }, // ŷ -> y (not in cp437)
107  { VK_CARET_Y, 0x59 }, // Ŷ -> Y (not in cp437)
108  { VK_UMLAUT_y, 0x98 }, // ÿ
109  { VK_UMLAUT_Y, 0x59 }, // Ÿ -> Y (not in cp437)
110 
111  { VK_NONE, 0x00 }, // end of table
112 };
113 
114 const CodePage CodePage437 = {
115  437,
116  VK2ASCII437,
117 };
118 
119 
120 
122 // Codepage 1252
123 
124 const VirtualKeyToASCII VK2ASCII1252[] = {
125  { VK_GRAVE_a, 0xe0 }, // à
126  { VK_GRAVE_e, 0xe8 }, // è
127  { VK_ACUTE_e, 0xe9 }, // é
128  { VK_GRAVE_i, 0xec }, // ì
129  { VK_GRAVE_o, 0xf2 }, // ò
130  { VK_GRAVE_u, 0xf9 }, // ù
131  { VK_CEDILLA_c, 0xe7 }, // ç
132  { VK_ESZETT, 0xdf }, // ß
133  { VK_UMLAUT_u, 0xfc }, // ü
134  { VK_UMLAUT_o, 0xf6 }, // ö
135  { VK_UMLAUT_a, 0xe4 }, // ä
136  { VK_ACUTEACCENT, 0xb4 }, // ´
137  { VK_POUND, 0xa3 }, // £
138  { VK_EURO, 0x80 }, // €
139  { VK_DEGREE, 0xb0 }, // °
140  { VK_SECTION, 0xa7 }, // §
141  { VK_NEGATION, 0xac }, // ¬
142  { VK_SQUARE, 0xb2 }, // ²
143  { VK_MU, 0xb5 }, // µ
144  { VK_CEDILLA_C, 0xc7 }, // Ç
145  { VK_TILDE_n, 0xf1 }, // ñ
146  { VK_TILDE_N, 0xd1 }, // Ñ
147  { VK_UPPER_a, 0xaa }, // ª
148  { VK_ACUTE_a, 0xe1 }, // á
149  { VK_ACUTE_o, 0xf3 }, // ó
150  { VK_ACUTE_u, 0xfa }, // ú
151  { VK_UMLAUT_i, 0xef }, // ï
152  { VK_EXCLAIM_INV, 0xa1 }, // ¡
153  { VK_QUESTION_INV, 0xbf }, // ¿
154  { VK_ACUTE_A, 0xc1 }, // Á
155  { VK_ACUTE_E, 0xc9 }, // É
156  { VK_ACUTE_I, 0xcd }, // Í
157  { VK_ACUTE_O, 0xd3 }, // Ó
158  { VK_ACUTE_U, 0xda }, // Ú
159  { VK_GRAVE_A, 0xc0 }, // À
160  { VK_GRAVE_E, 0xc8 }, // È
161  { VK_GRAVE_I, 0xcc }, // Ì
162  { VK_GRAVE_O, 0xd2 }, // Ò
163  { VK_GRAVE_U, 0xd9 }, // Ù
164  { VK_INTERPUNCT, 0xb7 }, // ·
165  { VK_DIAERESIS, 0xa8 }, // ¨
166  { VK_UMLAUT_e, 0xeb }, // ë
167  { VK_UMLAUT_A, 0xc4 }, // Ä
168  { VK_UMLAUT_E, 0xcb }, // Ë
169  { VK_UMLAUT_I, 0xcf }, // Ï
170  { VK_UMLAUT_O, 0xd6 }, // Ö
171  { VK_UMLAUT_U, 0xdc }, // Ü
172  { VK_CARET_a, 0xe2 }, // â
173  { VK_CARET_e, 0xea }, // ê
174  { VK_CARET_i, 0xee }, // î
175  { VK_CARET_o, 0xf4 }, // ô
176  { VK_CARET_u, 0xfb }, // û
177  { VK_CARET_A, 0xc2 }, // Â
178  { VK_CARET_E, 0xca }, // Ê
179  { VK_CARET_I, 0xce }, // Î
180  { VK_CARET_O, 0xd4 }, // Ô
181  { VK_CARET_U, 0xdb }, // Û
182  { VK_TILDE_a, 0xe3 }, // ã
183  { VK_TILDE_A, 0xc3 }, // Ã
184  { VK_TILDE_o, 0xf5 }, // õ
185  { VK_TILDE_O, 0xd5 }, // Õ
186  { VK_GRAVE_y, 0x79 }, // ỳ -> y (not in cp1252)
187  { VK_GRAVE_Y, 0x59 }, // Ỳ -> Y (not in cp1252)
188  { VK_ACUTE_y, 0xfd }, // ý
189  { VK_ACUTE_Y, 0xdd }, // Ý
190  { VK_CARET_y, 0x79 }, // ŷ -> y (not in cp1252)
191  { VK_CARET_Y, 0x59 }, // Ŷ -> Y (not in cp1252)
192  { VK_UMLAUT_y, 0xff }, // ÿ
193  { VK_UMLAUT_Y, 0x9f }, // Ÿ
194 
195  { VK_NONE, 0x00 }, // end of table
196 };
197 
198 const CodePage CodePage1252 = {
199  1252,
200  VK2ASCII1252,
201 };
202 
203 
204 
205 
207 // virtualKeyToASCII
208 
209 
210 // -1 = virtual key cannot be translated to ASCII
211 // of VirtualKeyItem uses:
212 // - .vk
213 // - .CTRL
214 // - .SHIFT
215 // - .SCROLLLOCK
216 int virtualKeyToASCII(VirtualKeyItem const & item, CodePage const * codepage)
217 {
218  int r = -1;
219 
220  if (item.CTRL) {
221 
222  // CTRL + ....
223 
224  switch (item.vk) {
225 
226  case VK_SPACE:
227  r = ASCII_NUL; // CTRL SPACE = NUL
228  break;
229 
230  case VK_BACKSPACE:
231  r = ASCII_DEL; // CTRL BACKSPACE = DEL
232  break;
233 
234  case VK_DELETE:
235  case VK_KP_DELETE:
236  r = ASCII_DEL; // DELETE = dEL
237  break;
238 
239  case VK_RETURN:
240  case VK_KP_ENTER:
241  r = ASCII_LF; // CTRL ENTER = LF
242  break;
243 
244  case VK_ESCAPE:
245  r = ASCII_ESC; // CTRL ESCAPE = ESC
246  break;
247 
248  case VK_2:
249  r = ASCII_NUL; // CTRL 2 = NUL
250  break;
251 
252  case VK_6:
253  r = ASCII_RS; // CTRL 6 = RS
254  break;
255 
256  case VK_a ... VK_z:
257  r = item.vk - VK_a + ASCII_SOH ; // CTRL alpha = SOH (a) ...SUB (z)
258  break;
259 
260  case VK_A ... VK_Z:
261  r = item.vk - VK_A + ASCII_SOH; // CTRL alpha = SOH (A) ...SUB (Z)
262  break;
263 
264  case VK_MINUS:
265  r = ASCII_US; // CTRL - = US
266  break;
267 
268  case VK_BACKSLASH:
269  r = ASCII_FS; // CTRL \ = FS
270  break;
271 
272  case VK_QUESTION:
273  r = ASCII_US; // CTRL ? = US
274  break;
275 
276  case VK_LEFTBRACKET:
277  r = ASCII_ESC; // CTRL [ = ESC
278  break;
279 
280  case VK_RIGHTBRACKET:
281  r = ASCII_GS; // CTRL ] = GS
282  break;
283 
284  case VK_TILDE:
285  r = ASCII_RS; // CTRL ~ = RS
286  break;
287 
288  default:
289  break;
290 
291  }
292 
293  } else {
294 
295  switch (item.vk) {
296 
297  case VK_BACKSPACE:
298  r = ASCII_BS; // BACKSPACE = BS
299  break;
300 
301  case VK_RETURN:
302  case VK_KP_ENTER:
303  r = ASCII_CR; // ENTER = CR
304  break;
305 
306  case VK_TAB:
307  if (!item.SHIFT)
308  r = ASCII_HT; // TAB = HT
309  break;
310 
311  case VK_ESCAPE:
312  r = ASCII_ESC; // ESCAPE = ESC
313  break;
314 
315  case VK_SCROLLLOCK:
316  r = item.SCROLLLOCK ? ASCII_XOFF : ASCII_XON; // SCROLLLOCK = switch XOFF / XON
317  break;
318 
319  case VK_0 ... VK_9:
320  r = item.vk - VK_0 + '0'; // digits
321  break;
322 
323  case VK_KP_0 ... VK_KP_9:
324  r = item.vk - VK_KP_0 + '0'; // keypad digits
325  break;
326 
327  case VK_a ... VK_z:
328  r = item.vk - VK_a + 'a'; // lowercase alpha
329  break;
330 
331  case VK_A ... VK_Z:
332  r = item.vk - VK_A + 'A'; // uppercase alpha
333  break;
334 
335  case VK_SPACE:
336  r = ASCII_SPC; // SPACE
337  break;
338 
339  case VK_QUOTE:
340  r = '\''; // '
341  break;
342 
343  case VK_QUOTEDBL:
344  r = '"'; // "
345  break;
346 
347  case VK_EQUALS:
348  r = '='; // =
349  break;
350 
351  case VK_MINUS:
352  case VK_KP_MINUS:
353  r = '-'; // -
354  break;
355 
356  case VK_PLUS:
357  case VK_KP_PLUS:
358  r = '+'; // +
359  break;
360 
361  case VK_KP_MULTIPLY:
362  case VK_ASTERISK:
363  r = '*'; // *
364  break;
365 
366  case VK_KP_DIVIDE:
367  case VK_SLASH:
368  r = '/'; // /
369  break;
370 
371  case VK_KP_PERIOD:
372  case VK_PERIOD:
373  r = '.'; // .
374  break;
375 
376  case VK_COLON:
377  r = ':'; // :
378  break;
379 
380  case VK_COMMA:
381  r = ','; // ,
382  break;
383 
384  case VK_SEMICOLON:
385  r = ';'; // ;
386  break;
387 
388  case VK_AMPERSAND:
389  r = '&'; // &
390  break;
391 
392  case VK_VERTICALBAR:
393  r = '|'; // |
394  break;
395 
396  case VK_HASH:
397  r = '#'; // #
398  break;
399 
400  case VK_AT:
401  r = '@'; // @
402  break;
403 
404  case VK_CARET:
405  r = '^'; // ^
406  break;
407 
408  case VK_DOLLAR:
409  r = '$'; // $
410  break;
411 
412  case VK_GRAVEACCENT:
413  r = 0x60; // `
414  break;
415 
416  case VK_PERCENT:
417  r = '%'; // %
418  break;
419 
420  case VK_EXCLAIM:
421  r = '!'; // !
422  break;
423 
424  case VK_LEFTBRACE:
425  r = '{'; // {
426  break;
427 
428  case VK_RIGHTBRACE:
429  r = '}'; // }
430  break;
431 
432  case VK_LEFTPAREN:
433  r = '('; // (
434  break;
435 
436  case VK_RIGHTPAREN:
437  r = ')'; // )
438  break;
439 
440  case VK_LESS:
441  r = '<'; // <
442  break;
443 
444  case VK_GREATER:
445  r = '>'; // >
446  break;
447 
448  case VK_UNDERSCORE:
449  r = '_'; // _
450  break;
451 
452  case VK_BACKSLASH:
453  r = '\\'; // backslash
454  break;
455 
456  case VK_QUESTION:
457  r = '?'; // ?
458  break;
459 
460  case VK_LEFTBRACKET:
461  r = '['; // [
462  break;
463 
464  case VK_RIGHTBRACKET:
465  r = ']'; // ]
466  break;
467 
468  case VK_TILDE:
469  r = '~'; // ~
470  break;
471 
472  default:
473  // look into codepage table
474  if (codepage) {
475  for (auto cpitem = codepage->convTable; cpitem->vk != VK_NONE; ++cpitem) {
476  if (item.vk == cpitem->vk) {
477  r = cpitem->ASCII;
478  break;
479  }
480  }
481  }
482  break;
483 
484  }
485 
486  }
487 
488  return r;
489 }
490 
491 
492 
493 
494 } // fabgl namespace
This file contains codepages declarations.
Definition: canvas.cpp:36