Browse Source

Lulzbot ExtUI Western language support (#15208)

Fix #15134
Marcio Teixeira 5 years ago
parent
commit
47d19bab40
100 changed files with 2667 additions and 69 deletions
  1. 6
    0
      Marlin/Configuration_adv.h
  2. 7
    1
      Marlin/src/lcd/extensible_ui/lib/lulzbot/config.h
  3. 1
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/basic/commands.h
  4. 35
    23
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/command_processor.h
  5. 6
    1
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/ftdi_extended.h
  6. 13
    5
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/screen_types.h
  7. 28
    31
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/text_box.cpp
  8. 40
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/README.txt
  9. 55
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp
  10. 30
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps.h
  11. BIN
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.pbm
  12. BIN
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.png
  13. 343
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.svg
  14. 46
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_size_t.cpp
  15. 55
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_size_t.h
  16. 100
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/standard_char_set.cpp
  17. 30
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/standard_char_set.h
  18. 190
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/unicode.cpp
  19. 106
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/unicode.h
  20. 338
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set.cpp
  21. 29
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set.h
  22. 665
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h
  23. 89
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extras/bitmap2cpp.py
  24. 5
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/boot_screen.cpp
  25. 1
    1
      Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/media_player_screen.cpp
  26. 18
    5
      Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/status_screen.cpp
  27. 8
    1
      Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/temperature_screen.cpp
  28. 2
    0
      Marlin/src/lcd/extensible_ui/lib/lulzbot/theme/bitmaps.h
  29. 1
    1
      buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu
  30. 6
    0
      config/default/Configuration_adv.h
  31. 6
    0
      config/examples/3DFabXYZ/Migbot/Configuration_adv.h
  32. 6
    0
      config/examples/ADIMLab/Gantry v1/Configuration_adv.h
  33. 6
    0
      config/examples/ADIMLab/Gantry v2/Configuration_adv.h
  34. 6
    0
      config/examples/AlephObjects/TAZ4/Configuration_adv.h
  35. 6
    0
      config/examples/Alfawise/U20-bltouch/Configuration_adv.h
  36. 6
    0
      config/examples/Alfawise/U20/Configuration_adv.h
  37. 6
    0
      config/examples/AliExpress/UM2pExt/Configuration_adv.h
  38. 6
    0
      config/examples/Anet/A2/Configuration_adv.h
  39. 6
    0
      config/examples/Anet/A2plus/Configuration_adv.h
  40. 6
    0
      config/examples/Anet/A6/Configuration_adv.h
  41. 6
    0
      config/examples/Anet/A8/Configuration_adv.h
  42. 6
    0
      config/examples/Anet/A8plus/Configuration_adv.h
  43. 6
    0
      config/examples/Anet/E16/Configuration_adv.h
  44. 6
    0
      config/examples/AnyCubic/i3/Configuration_adv.h
  45. 6
    0
      config/examples/ArmEd/Configuration_adv.h
  46. 6
    0
      config/examples/BIBO/TouchX/cyclops/Configuration_adv.h
  47. 6
    0
      config/examples/BIBO/TouchX/default/Configuration_adv.h
  48. 6
    0
      config/examples/BQ/Hephestos/Configuration_adv.h
  49. 6
    0
      config/examples/BQ/Hephestos_2/Configuration_adv.h
  50. 6
    0
      config/examples/BQ/WITBOX/Configuration_adv.h
  51. 6
    0
      config/examples/Cartesio/Configuration_adv.h
  52. 6
    0
      config/examples/Creality/CR-10/Configuration_adv.h
  53. 6
    0
      config/examples/Creality/CR-10S/Configuration_adv.h
  54. 6
    0
      config/examples/Creality/CR-10_5S/Configuration_adv.h
  55. 6
    0
      config/examples/Creality/CR-10mini/Configuration_adv.h
  56. 6
    0
      config/examples/Creality/CR-20 Pro/Configuration_adv.h
  57. 6
    0
      config/examples/Creality/CR-20/Configuration_adv.h
  58. 6
    0
      config/examples/Creality/CR-8/Configuration_adv.h
  59. 6
    0
      config/examples/Creality/Ender-2/Configuration_adv.h
  60. 6
    0
      config/examples/Creality/Ender-3/Configuration_adv.h
  61. 6
    0
      config/examples/Creality/Ender-4/Configuration_adv.h
  62. 6
    0
      config/examples/Creality/Ender-5/Configuration_adv.h
  63. 6
    0
      config/examples/Dagoma/Disco Ultimate/Configuration_adv.h
  64. 6
    0
      config/examples/EVNOVO (Artillery)/Sidewinder X1/Configuration_adv.h
  65. 6
    0
      config/examples/Einstart-S/Configuration_adv.h
  66. 6
    0
      config/examples/FYSETC/AIO_II/Configuration_adv.h
  67. 6
    0
      config/examples/FYSETC/Cheetah 1.2/BLTouch/Configuration_adv.h
  68. 6
    0
      config/examples/FYSETC/Cheetah 1.2/base/Configuration_adv.h
  69. 6
    0
      config/examples/FYSETC/Cheetah/BLTouch/Configuration_adv.h
  70. 6
    0
      config/examples/FYSETC/Cheetah/base/Configuration_adv.h
  71. 6
    0
      config/examples/FYSETC/F6_13/Configuration_adv.h
  72. 6
    0
      config/examples/Felix/Configuration_adv.h
  73. 6
    0
      config/examples/FlashForge/CreatorPro/Configuration_adv.h
  74. 6
    0
      config/examples/FolgerTech/i3-2020/Configuration_adv.h
  75. 6
    0
      config/examples/Formbot/Raptor/Configuration_adv.h
  76. 6
    0
      config/examples/Formbot/T_Rex_2+/Configuration_adv.h
  77. 6
    0
      config/examples/Formbot/T_Rex_3/Configuration_adv.h
  78. 6
    0
      config/examples/Geeetech/A10/Configuration_adv.h
  79. 6
    0
      config/examples/Geeetech/A10M/Configuration_adv.h
  80. 6
    0
      config/examples/Geeetech/A20M/Configuration_adv.h
  81. 6
    0
      config/examples/Geeetech/MeCreator2/Configuration_adv.h
  82. 6
    0
      config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h
  83. 6
    0
      config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h
  84. 6
    0
      config/examples/Infitary/i3-M508/Configuration_adv.h
  85. 6
    0
      config/examples/JGAurora/A1/Configuration_adv.h
  86. 6
    0
      config/examples/JGAurora/A5/Configuration_adv.h
  87. 6
    0
      config/examples/JGAurora/A5S/Configuration_adv.h
  88. 6
    0
      config/examples/MakerParts/Configuration_adv.h
  89. 6
    0
      config/examples/Malyan/M150/Configuration_adv.h
  90. 6
    0
      config/examples/Malyan/M200/Configuration_adv.h
  91. 6
    0
      config/examples/Micromake/C1/enhanced/Configuration_adv.h
  92. 6
    0
      config/examples/Mks/Robin/Configuration_adv.h
  93. 6
    0
      config/examples/Mks/Sbase/Configuration_adv.h
  94. 6
    0
      config/examples/RapideLite/RL200/Configuration_adv.h
  95. 6
    0
      config/examples/RigidBot/Configuration_adv.h
  96. 6
    0
      config/examples/SCARA/Configuration_adv.h
  97. 6
    0
      config/examples/STM32/Black_STM32F407VET6/Configuration_adv.h
  98. 6
    0
      config/examples/Sanguinololu/Configuration_adv.h
  99. 6
    0
      config/examples/Tevo/Michelangelo/Configuration_adv.h
  100. 0
    0
      config/examples/Tevo/Tarantula Pro/Configuration_adv.h

+ 6
- 0
Marlin/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 7
- 1
Marlin/src/lcd/extensible_ui/lib/lulzbot/config.h View File

@@ -76,6 +76,12 @@
76 76
 //#define TOUCH_UI_PORTRAIT
77 77
 //#define TOUCH_UI_MIRRORED
78 78
 
79
+// Enable UTF8 rendering capabilities.
80
+//#define TOUCH_UI_USE_UTF8
81
+#ifdef  TOUCH_UI_USE_UTF8
82
+  #define TOUCH_UI_UTF8_WESTERN_CHARSET
83
+#endif
84
+
79 85
 // Use a numeric passcode for "Parental lock".
80 86
 // This is a recommended for smaller displays.
81 87
 //#define TOUCH_UI_PASSCODE
@@ -90,7 +96,7 @@
90 96
 //#define DEVELOPER_SCREENS
91 97
 
92 98
 // Maximum feed rate for manual extrusion (mm/s)
93
-//#define MAX_MANUAL_FEEDRATE 240
99
+#define MAX_MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60}
94 100
 
95 101
 // Sets the SPI speed in Hz
96 102
 

+ 1
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/basic/commands.h View File

@@ -159,6 +159,7 @@ class CLCD::FontMetrics {
159 159
     uint32_t  height;
160 160
     uint32_t  ptr;
161 161
 
162
+    FontMetrics() {}
162 163
     FontMetrics(uint8_t font) {load(font);}
163 164
 
164 165
     void load(uint8_t font);

+ 35
- 23
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/command_processor.h View File

@@ -67,14 +67,14 @@ class CommandProcessor : public CLCD::CommandFifo {
67 67
     }
68 68
 
69 69
     FORCEDINLINE void linear_widget_box(int16_t &x, int16_t &y, int16_t &w, int16_t &h, bool tracker = false) {
70
-      const uint16_t th = widget_thickness()/2;
70
+      const uint16_t th = widget_thickness() / 2;
71 71
       if (w > h) {
72 72
         x += tracker ? th * 2.5 : th;
73
-        y += h/2  - th/2;
73
+        y += (h - th) / 2;
74 74
         w -= tracker ? th * 5.0 : th * 2;
75 75
         h  = th;
76 76
       } else {
77
-        x += w/2  - th/2;
77
+        x += (w - th) / 2;
78 78
         y += tracker ? th * 2.5 : th;
79 79
         w  = th;
80 80
         h -= tracker ? th * 5.0 : th * 2;
@@ -82,9 +82,9 @@ class CommandProcessor : public CLCD::CommandFifo {
82 82
     }
83 83
 
84 84
     FORCEDINLINE uint16_t circular_widget_box(int16_t &x, int16_t &y, int16_t &w, int16_t &h) {
85
-      const uint16_t r = min(w,h)/2;
86
-      x += w/2;
87
-      y += h/2;
85
+      const uint16_t r = min(w,h) / 2;
86
+      x += w / 2;
87
+      y += h / 2;
88 88
       w  = 1;
89 89
       h  = 1;
90 90
       return r;
@@ -200,22 +200,22 @@ class CommandProcessor : public CLCD::CommandFifo {
200 200
     inline CommandProcessor& rectangle(int16_t x, int16_t y, int16_t w, int16_t h) {
201 201
       using namespace FTDI;
202 202
       CLCD::CommandFifo::cmd(BEGIN(RECTS));
203
-      CLCD::CommandFifo::cmd(VERTEX2F(x*16,y*16));
204
-      CLCD::CommandFifo::cmd(VERTEX2F((x+w)*16,(y+h)*16));
203
+      CLCD::CommandFifo::cmd(VERTEX2F(x * 16, y * 16));
204
+      CLCD::CommandFifo::cmd(VERTEX2F((x + w) * 16, (y + h) * 16));
205 205
       return *this;
206 206
     }
207 207
 
208 208
     template<typename T>
209 209
     FORCEDINLINE CommandProcessor& toggle(int16_t x, int16_t y, int16_t w, int16_t h, T text, bool state, uint16_t options = FTDI::OPT_3D) {
210 210
       CLCD::FontMetrics fm(_font);
211
-      const int16_t widget_h = fm.height * 20.0/16;
211
+      const int16_t widget_h = fm.height * 20.0 / 16;
212 212
       //const int16_t outer_bar_r = widget_h / 2;
213 213
       //const int16_t knob_r      = outer_bar_r - 1.5;
214 214
       // The y coordinate of the toggle is the baseline of the text,
215 215
       // so we must introduce a fudge factor based on the line height to
216 216
       // actually center the control.
217
-      const int16_t fudge_y = fm.height*5/16;
218
-      CLCD::CommandFifo::toggle(x + h/2, y + h/2 - widget_h/2 + fudge_y, w - h, _font, options, state);
217
+      const int16_t fudge_y = fm.height * 5 / 16;
218
+      CLCD::CommandFifo::toggle(x + h / 2, y + (h - widget_h) / 2 + fudge_y, w - h, _font, options, state);
219 219
       CLCD::CommandFifo::str(text);
220 220
       return *this;
221 221
     }
@@ -286,23 +286,29 @@ class CommandProcessor : public CLCD::CommandFifo {
286 286
       return *this;
287 287
     }
288 288
 
289
+    void apply_text_alignment(int16_t &x, int16_t &y, int16_t w, int16_t h, uint16_t options) {
290
+      using namespace FTDI;
291
+      x += ((options & OPT_CENTERX) ? w / 2 : ((options & OPT_RIGHTX) ? w : 0));
292
+      y += ((options & OPT_CENTERY) ? h / 2 : h);
293
+    }
294
+
289 295
     CommandProcessor& number(int16_t x, int16_t y, int16_t w, int16_t h, int32_t n, uint16_t options = FTDI::OPT_CENTER) {
290 296
       using namespace FTDI;
291
-      CLCD::CommandFifo::number(
292
-        x + ((options & OPT_CENTERX) ? w/2 : ((options & OPT_RIGHTX) ? w : 0)),
293
-        y + ((options & OPT_CENTERY) ? h/2 : h),
294
-        _font, options, n);
297
+      apply_text_alignment(x, y, w, h, options);
298
+      CLCD::CommandFifo::number(x, y, _font, options, n);
295 299
       return *this;
296 300
     }
297 301
 
298 302
     template<typename T> FORCEDINLINE
299 303
     CommandProcessor& text(int16_t x, int16_t y, int16_t w, int16_t h, T text, uint16_t options = FTDI::OPT_CENTER) {
300 304
       using namespace FTDI;
301
-      CLCD::CommandFifo::text(
302
-        x + ((options & OPT_CENTERX) ? w/2 : ((options & OPT_RIGHTX) ? w : 0)),
303
-        y + ((options & OPT_CENTERY) ? h/2 : h),
304
-        _font, options);
305
-      CLCD::CommandFifo::str(text);
305
+      apply_text_alignment(x, y, w, h, options);
306
+      #ifdef TOUCH_UI_USE_UTF8
307
+        draw_utf8_text(*this, x, y, text, font_size_t::from_romfont(_font), options);
308
+      #else
309
+        CLCD::CommandFifo::text(x, y, _font, options);
310
+        CLCD::CommandFifo::str(text);
311
+      #endif
306 312
       return *this;
307 313
     }
308 314
 
@@ -313,8 +319,8 @@ class CommandProcessor : public CLCD::CommandFifo {
313 319
         cmd(BITMAP_TRANSFORM_A(uint32_t(float(256)/scale)));
314 320
         cmd(BITMAP_TRANSFORM_E(uint32_t(float(256)/scale)));
315 321
       }
316
-      cmd(BITMAP_SIZE(info.filter, info.wrapx, info.wrapy, info.width*scale, info.height*scale));
317
-      cmd(VERTEX2F((x + w/2 - info.width*scale/2)*16, (y + h/2 - info.height*scale/2)*16));
322
+      cmd(BITMAP_SIZE(info.filter, info.wrapx, info.wrapy, info.width * scale, info.height * scale));
323
+      cmd(VERTEX2F((x + w / 2 - info.width * scale / 2) * 16, (y + h / 2 - info.height * scale / 2) * 16));
318 324
       if (scale != 1) {
319 325
         cmd(BITMAP_TRANSFORM_A(256));
320 326
         cmd(BITMAP_TRANSFORM_E(256));
@@ -328,7 +334,13 @@ class CommandProcessor : public CLCD::CommandFifo {
328 334
       bool styleModified = false;
329 335
       if (_btn_style_callback) styleModified = _btn_style_callback(*this, _tag, _style, options, false);
330 336
       CLCD::CommandFifo::button(x, y, w, h, _font, options);
331
-      CLCD::CommandFifo::str(text);
337
+      #ifdef TOUCH_UI_USE_UTF8
338
+        apply_text_alignment(x, y, w, h, OPT_CENTER);
339
+        CLCD::CommandFifo::str(F(""));
340
+        draw_utf8_text(*this, x, y, text, font_size_t::from_romfont(_font), OPT_CENTER);
341
+      #else
342
+        CLCD::CommandFifo::str(text);
343
+      #endif
332 344
       if (_btn_style_callback && styleModified) _btn_style_callback(*this, _tag, _style, options, true);
333 345
       return *this;
334 346
     }

+ 6
- 1
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/ftdi_extended.h View File

@@ -30,14 +30,19 @@
30 30
 #endif
31 31
 
32 32
 #ifdef FTDI_EXTENDED
33
+  #include "unicode/font_size_t.h"
34
+  #include "unicode/unicode.h"
35
+  #include "unicode/standard_char_set.h"
36
+  #include "unicode/western_char_set.h"
37
+  #include "unicode/font_bitmaps.h"
33 38
   #include "rgb_t.h"
34 39
   #include "bitmap_info.h"
35 40
   #include "tiny_timer.h"
36 41
   #include "grid_layout.h"
37 42
   #include "dl_cache.h"
38
-  #include "screen_types.h"
39 43
   #include "event_loop.h"
40 44
   #include "command_processor.h"
45
+  #include "screen_types.h"
41 46
   #include "sound_player.h"
42 47
   #include "sound_list.h"
43 48
   #include "polygon.h"

+ 13
- 5
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/screen_types.h View File

@@ -156,8 +156,11 @@ class UncachedScreen {
156 156
   public:
157 157
     static void onRefresh() {
158 158
       using namespace FTDI;
159
-      CLCD::CommandFifo cmd;
159
+      CommandProcessor cmd;
160 160
       cmd.cmd(CMD_DLSTART);
161
+      #ifdef TOUCH_UI_USE_UTF8
162
+        load_utf8_bitmaps(cmd);
163
+      #endif
161 164
 
162 165
       current_screen.onRedraw(BOTH);
163 166
 
@@ -183,9 +186,12 @@ class CachedScreen {
183 186
     static void repaintBackground() {
184 187
       using namespace FTDI;
185 188
       DLCache dlcache(DL_SLOT);
186
-      CLCD::CommandFifo cmd;
189
+      CommandProcessor cmd;
187 190
 
188 191
       cmd.cmd(CMD_DLSTART);
192
+      #ifdef TOUCH_UI_USE_UTF8
193
+        load_utf8_bitmaps(cmd);
194
+      #endif
189 195
       current_screen.onRedraw(BACKGROUND);
190 196
 
191 197
       dlcache.store(DL_SIZE);
@@ -195,14 +201,16 @@ class CachedScreen {
195 201
     static void onRefresh() {
196 202
       using namespace FTDI;
197 203
       DLCache dlcache(DL_SLOT);
198
-      CLCD::CommandFifo cmd;
204
+      CommandProcessor cmd;
199 205
 
200 206
       cmd.cmd(CMD_DLSTART);
201 207
 
202 208
       if (dlcache.has_data()) {
203 209
         dlcache.append();
204
-      }
205
-      else {
210
+      } else {
211
+        #ifdef TOUCH_UI_USE_UTF8
212
+          load_utf8_bitmaps(cmd);
213
+        #endif
206 214
         current_screen.onRedraw(BACKGROUND);
207 215
         dlcache.store(DL_SIZE);
208 216
       }

+ 28
- 31
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/text_box.cpp View File

@@ -29,41 +29,33 @@ namespace FTDI {
29 29
    * be broken so that the display width is less than w. The line will also
30 30
    * be broken after a '\n'. Returns the display width of the line.
31 31
    */
32
-  static uint16_t find_line_break(const CLCD::FontMetrics &fm, uint16_t w, const char *str, const char *&end) {
32
+  static uint16_t find_line_break(const FontMetrics &fm, uint16_t w, const char *str, const char *&end) {
33
+    w -= fm.get_char_width(' ');
33 34
     const char *p = str;
34
-    end = str + strlen(str);
35
-    uint16_t width = fm.get_text_width(str);
35
+    end = str;
36
+    uint16_t lw = 0, result = 0;
36 37
     for(;;) {
37
-      // Find next tentative line break.
38
-      char delim = *(p);
39
-      while (delim && delim != ' ' && delim != '\n') {
40
-        delim = *(++p);
41
-      }
42
-      // Check to see whether to break the line.
43
-      const uint16_t margin = fm.get_text_width("  ");
44
-      const uint16_t lw = p > str ? fm.get_text_width(str, p - str) + margin : 0;
45
-      if (lw < w) {
46
-        width = lw;
47
-        switch (delim) {
48
-          case '\0':
49
-            end = p;
50
-            break;
51
-          case '\n':
52
-            end = ++p;
53
-            break;
54
-          case ' ':
55
-            end = ++p;
56
-            continue;
38
+      utf8_char_t c = get_utf8_char_and_inc(p);
39
+      if (c == ' ' || c == '\n' || c == '\0') {
40
+        if (lw < w || end == str) {
41
+          end   = (c == '\0') ? p-1 : p;
42
+          result = lw;
57 43
         }
44
+        if (c == '\0' || c == '\n') break;
58 45
       }
59
-      return width;
46
+      lw += fm.get_char_width(c);
47
+    }
48
+    if (end == str) {
49
+      end   = p-1;
50
+      result = lw;
60 51
     }
52
+    return result;
61 53
   }
62 54
 
63 55
   /**
64 56
    * This function returns a measurements of the word-wrapped text box.
65 57
    */
66
-  static void measure_text_box(const CLCD::FontMetrics &fm, const char *str, uint16_t &width, uint16_t &height) {
58
+  static void measure_text_box(const FontMetrics &fm, const char *str, uint16_t &width, uint16_t &height) {
67 59
     const char *line_start = (const char*)str;
68 60
     const char *line_end;
69 61
     const uint16_t wrap_width = width;
@@ -72,7 +64,7 @@ namespace FTDI {
72 64
       uint16_t line_width = find_line_break(fm, wrap_width, line_start, line_end);
73 65
       if (line_end == line_start) break;
74 66
       width  = max(width, line_width);
75
-      height += fm.height;
67
+      height += fm.get_height();
76 68
       line_start = line_end;
77 69
     }
78 70
   }
@@ -81,10 +73,11 @@ namespace FTDI {
81 73
    * This function draws text inside a bounding box, doing word wrapping and using the largest font that will fit.
82 74
    */
83 75
   void draw_text_box(CommandProcessor& cmd, int x, int y, int w, int h, const char *str, uint16_t options, uint8_t font) {
84
-    CLCD::FontMetrics fm(font);
85
-
86 76
     uint16_t box_width, box_height;
87 77
 
78
+    FontMetrics fm(font);
79
+
80
+    // Shrink the font until we find a font that fits
88 81
     for(;;) {
89 82
       box_width = w;
90 83
       measure_text_box(fm, str, box_width, box_height);
@@ -110,10 +103,14 @@ namespace FTDI {
110 103
         if (line[line_len - 1] == '\n' || line[line_len - 1] == ' ')
111 104
           line[line_len - 1] = 0;
112 105
 
113
-        cmd.CLCD::CommandFifo::text(x + dx, y + dy, font, options & ~OPT_CENTERY);
114
-        cmd.CLCD::CommandFifo::str(line);
106
+        #ifdef TOUCH_UI_USE_UTF8
107
+          draw_utf8_text(cmd, x + dx, y + dy, line, fm.fs, options & ~OPT_CENTERY);
108
+        #else
109
+          cmd.CLCD::CommandFifo::text(x + dx, y + dy, font, options & ~OPT_CENTERY);
110
+          cmd.CLCD::CommandFifo::str(line);
111
+        #endif
115 112
       }
116
-      y += fm.height;
113
+      y += fm.get_height();
117 114
 
118 115
       line_start = line_end;
119 116
     }

+ 40
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/README.txt View File

@@ -0,0 +1,40 @@
1
+
2
+FTDI EVE Unicode Rendering
3
+--------------------------
4
+
5
+The FTDI EVE chips have several fonts in ROM, but these fonts only contain a
6
+subset of ASCII characters. Notably, this excludes diacritics and accents
7
+used in most Western languages.
8
+
9
+While the FTDI EVE has the capability for user-defined fonts, such fonts only
10
+support 127 character positions, making them as limiting as the built-in fonts.
11
+
12
+As a further complication, high resolution TFT displays require high resolution
13
+fonts. It is not feasible to put a complete international font into the limited
14
+flash memory of most microprocessors.
15
+
16
+To work around these limitations, this library uses a custom font renderer with
17
+the following characteristics:
18
+
19
+  1) Rather than providing bitmaps for different font sizes, it uses a single
20
+     bitmap for the largest font size (romfont 31) and emulates other sizes by
21
+     scaling the bitmaps using BITMAP_TRANSFORM.
22
+
23
+  2) Rather than loading an entire font, it combines symbols from romfont 31
24
+     with a limited number of symbols from a custom font. For accented letters,
25
+     the rendering code combine basic letter shapes from romfont 31 with
26
+     bitmaps containing only the accent themselves.
27
+
28
+  3) The custom bitmap is RLE compressed into PROGMEM. For accents, which have
29
+     a fairly small number of non-white pixels, the savings are significant.
30
+
31
+These characteristics enable an alphabet for Western languages to be
32
+synthesized from only a few dozen custom symbols and modest PROGMEM use (~10k)
33
+
34
+The text layout is done by the code in "unicode.cpp" with the help of one of
35
+more character renderers (e.g. "western_char_set.cpp"). Each character render
36
+is responsible for loading the necessary bitmap data into RAMG and drawing
37
+characters as requested.
38
+
39
+To add symbols for other languages, it will only be necessary to make a bitmap
40
+and implement a corresponding character renderer.

+ 55
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp View File

@@ -0,0 +1,55 @@
1
+/*******************
2
+ * font_bitmap.cpp *
3
+ *******************/
4
+
5
+/****************************************************************************
6
+ *   Written By Marcio Teixeira 2019 - Aleph Objects, Inc.                  *
7
+ *                                                                          *
8
+ *   This program is free software: you can redistribute it and/or modify   *
9
+ *   it under the terms of the GNU General Public License as published by   *
10
+ *   the Free Software Foundation, either version 3 of the License, or      *
11
+ *   (at your option) any later version.                                    *
12
+ *                                                                          *
13
+ *   This program is distributed in the hope that it will be useful,        *
14
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
15
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
16
+ *   GNU General Public License for more details.                           *
17
+ *                                                                          *
18
+ *   To view a copy of the GNU General Public License, go to the following  *
19
+ *   location: <http://www.gnu.org/licenses/>.                              *
20
+ ****************************************************************************/
21
+
22
+#include "../ftdi_extended.h"
23
+
24
+#ifdef FTDI_EXTENDED
25
+
26
+namespace FTDI {
27
+
28
+  void write_rle_data(uint16_t addr, const uint8_t *data, size_t n) {
29
+    for (; n > 2; n -= 2) {
30
+      uint8_t count = pgm_read_byte(data++);
31
+      uint8_t value = pgm_read_byte(data++);
32
+      while (count--) CLCD::mem_write_8(addr++, value);
33
+    }
34
+  }
35
+
36
+  void set_font_bitmap(CommandProcessor& cmd, CLCD::FontMetrics &fm, uint8_t handle) {
37
+    cmd.cmd(BITMAP_HANDLE(handle));
38
+    cmd.cmd(BITMAP_SOURCE(fm.ptr));
39
+    cmd.bitmap_layout(fm.format, fm.stride, fm.height);
40
+    cmd.bitmap_size(BILINEAR, BORDER, BORDER, fm.width, fm.height);
41
+  }
42
+
43
+  void ext_vertex2ii(CommandProcessor &cmd, int x, int y, uint8_t handle, uint8_t cell) {
44
+    if (x < 0 || y < 0 || x > 511 || y > 511) {
45
+      cmd.cmd(BITMAP_HANDLE(handle));
46
+      cmd.cmd(CELL(cell));
47
+      cmd.cmd(VERTEX2F(x * 16, y * 16));
48
+    } else {
49
+      cmd.cmd(VERTEX2II(x, y, handle, cell));
50
+    }
51
+  }
52
+
53
+} // namespace FTDI
54
+
55
+#endif // FTDI_EXTENDED

+ 30
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps.h View File

@@ -0,0 +1,30 @@
1
+/******************
2
+ * font_bitmaps.h *
3
+ ******************/
4
+
5
+/****************************************************************************
6
+ *   Written By Marcio Teixeira 2019 - Aleph Objects, Inc.                  *
7
+ *                                                                          *
8
+ *   This program is free software: you can redistribute it and/or modify   *
9
+ *   it under the terms of the GNU General Public License as published by   *
10
+ *   the Free Software Foundation, either version 3 of the License, or      *
11
+ *   (at your option) any later version.                                    *
12
+ *                                                                          *
13
+ *   This program is distributed in the hope that it will be useful,        *
14
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
15
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
16
+ *   GNU General Public License for more details.                           *
17
+ *                                                                          *
18
+ *   To view a copy of the GNU General Public License, go to the following  *
19
+ *   location: <http://www.gnu.org/licenses/>.                              *
20
+ ****************************************************************************/
21
+
22
+#pragma once
23
+
24
+class CommandProcessor;
25
+
26
+namespace FTDI {
27
+  void write_rle_data(uint16_t addr, const uint8_t *data, size_t n);
28
+  void set_font_bitmap(CommandProcessor& cmd, CLCD::FontMetrics &fm, uint8_t handle);
29
+  void ext_vertex2ii(CommandProcessor &cmd, int x, int y, uint8_t handle, uint8_t cell);
30
+}

BIN
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.pbm View File


BIN
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.png View File


+ 343
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.svg
File diff suppressed because it is too large
View File


+ 46
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_size_t.cpp View File

@@ -0,0 +1,46 @@
1
+/*******************
2
+ * font_size_t.cpp *
3
+ *******************/
4
+
5
+/****************************************************************************
6
+ *   Written By Marcio Teixeira 2019 - Aleph Objects, Inc.                  *
7
+ *                                                                          *
8
+ *   This program is free software: you can redistribute it and/or modify   *
9
+ *   it under the terms of the GNU General Public License as published by   *
10
+ *   the Free Software Foundation, either version 3 of the License, or      *
11
+ *   (at your option) any later version.                                    *
12
+ *                                                                          *
13
+ *   This program is distributed in the hope that it will be useful,        *
14
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
15
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
16
+ *   GNU General Public License for more details.                           *
17
+ *                                                                          *
18
+ *   To view a copy of the GNU General Public License, go to the following  *
19
+ *   location: <http://www.gnu.org/licenses/>.                              *
20
+ ****************************************************************************/
21
+
22
+#include "../ftdi_extended.h"
23
+
24
+#if defined(FTDI_EXTENDED) && defined(TOUCH_UI_USE_UTF8)
25
+
26
+namespace FTDI {
27
+  // Returns the height of a standard FTDI romfont
28
+  uint8_t font_size_t::get_romfont_height(uint8_t font) {
29
+    static const uint8_t tbl[] PROGMEM = {
30
+      8, 8, 16, 16, 13, 17, 20, 22, 29, 38, 16, 20, 25, 28, 36, 49, 63, 83, 108
31
+    };
32
+    return pgm_read_byte(&tbl[font - 16]);
33
+  }
34
+
35
+  // Sets the scaling coefficient to match a romfont size
36
+  font_size_t font_size_t::from_romfont(uint8_t font) {
37
+    return font_size_t(uint32_t(std_height) * 256 / get_romfont_height(font));
38
+  }
39
+
40
+  // Returns the height of the font
41
+  uint8_t font_size_t::get_height() const {
42
+    return scale(std_height);
43
+  }
44
+}
45
+
46
+#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8

+ 55
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_size_t.h View File

@@ -0,0 +1,55 @@
1
+/*****************
2
+ * font_size_t.h *
3
+ *****************/
4
+
5
+/****************************************************************************
6
+ *   Written By Marcio Teixeira 2019 - Aleph Objects, Inc.                  *
7
+ *                                                                          *
8
+ *   This program is free software: you can redistribute it and/or modify   *
9
+ *   it under the terms of the GNU General Public License as published by   *
10
+ *   the Free Software Foundation, either version 3 of the License, or      *
11
+ *   (at your option) any later version.                                    *
12
+ *                                                                          *
13
+ *   This program is distributed in the hope that it will be useful,        *
14
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
15
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
16
+ *   GNU General Public License for more details.                           *
17
+ *                                                                          *
18
+ *   To view a copy of the GNU General Public License, go to the following  *
19
+ *   location: <http://www.gnu.org/licenses/>.                              *
20
+ ****************************************************************************/
21
+
22
+#pragma once
23
+
24
+class CommandProcessor;
25
+
26
+namespace FTDI {
27
+
28
+  /* The unicode rendering of different font sizes happens by scaling a
29
+   * large-sized font bitmap using the FTDI bitmap transformation matrix.
30
+   * This keeps us from having to have load bitmaps for all font sizes.
31
+   *
32
+   * The font_size_t class helps manage this scaling factor.
33
+   */
34
+  class font_size_t {
35
+    private:
36
+      // Standard height for font bitmaps
37
+      static constexpr uint8_t std_height = 49;
38
+
39
+      // 8.8 fixed point scaling coefficient
40
+      uint16_t coefficient;
41
+
42
+      font_size_t(uint16_t v) : coefficient(v) {}
43
+    public:
44
+      font_size_t() : coefficient(256) {}
45
+
46
+      static uint8_t get_romfont_height(uint8_t font);
47
+
48
+      static font_size_t from_romfont(uint8_t size);
49
+
50
+      template<typename T> T scale(T val) const {return (int32_t(val) * 256 / coefficient);}
51
+
52
+      uint8_t get_height() const;
53
+      uint16_t get_coefficient() const {return coefficient;}
54
+  };
55
+}

+ 100
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/standard_char_set.cpp View File

@@ -0,0 +1,100 @@
1
+/*************************
2
+ * standard_char_set.cpp *
3
+ *************************/
4
+
5
+/****************************************************************************
6
+ *   Written By Marcio Teixeira 2019 - Aleph Objects, Inc.                  *
7
+ *                                                                          *
8
+ *   This program is free software: you can redistribute it and/or modify   *
9
+ *   it under the terms of the GNU General Public License as published by   *
10
+ *   the Free Software Foundation, either version 3 of the License, or      *
11
+ *   (at your option) any later version.                                    *
12
+ *                                                                          *
13
+ *   This program is distributed in the hope that it will be useful,        *
14
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
15
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
16
+ *   GNU General Public License for more details.                           *
17
+ *                                                                          *
18
+ *   To view a copy of the GNU General Public License, go to the following  *
19
+ *   location: <http://www.gnu.org/licenses/>.                              *
20
+ ****************************************************************************/
21
+
22
+#include "../ftdi_extended.h"
23
+
24
+#if defined(FTDI_EXTENDED) && defined(TOUCH_UI_USE_UTF8)
25
+
26
+  constexpr static uint8_t std_font = 31;
27
+
28
+  /* Lookup table of the char widths for standard ROMFONT 31 */
29
+
30
+  uint8_t FTDI::StandardCharSet::std_char_width(char c) {
31
+    static const uint8_t tbl[] PROGMEM = {
32
+      10, 11, 15, 26, 25, 31, 26, 10, 15, 14, 18, 24,  9, 18, 11, 17, 24, 24,
33
+      24, 24, 24, 24, 24, 24, 24, 24, 10, 10, 21, 23, 22, 20, 37, 27, 27, 26,
34
+      28, 23, 22, 28, 29, 12, 23, 26, 22, 35, 29, 28, 26, 29, 27, 26, 26, 28,
35
+      27, 36, 27, 26, 25, 12, 18, 12, 18, 21, 13, 23, 24, 22, 24, 22, 15, 24,
36
+      24, 10, 11, 22, 10, 36, 24, 24, 24, 24, 15, 22, 14, 24, 21, 32, 21, 21,
37
+      22, 15, 10, 15, 29, 10
38
+    };
39
+    return pgm_read_byte(&tbl[c - ' ']);
40
+  }
41
+
42
+  /**
43
+   * Load bitmap data into RAMG. This function is called once at the start
44
+   * of the program.
45
+   *
46
+   * Parameters:
47
+   *
48
+   *   addr  - Address in RAMG where the font data is written
49
+   */
50
+
51
+  void FTDI::StandardCharSet::load_data(uint32_t) {
52
+  }
53
+
54
+  /**
55
+   * Populates the bitmap handles for the custom into the display list.
56
+   * This function is called once at the start of each display list.
57
+   *
58
+   * Parameters:
59
+   *
60
+   *   cmd  - Object used for writing to the FTDI chip command queue.
61
+   */
62
+
63
+  void FTDI::StandardCharSet::load_bitmaps(CommandProcessor& cmd) {
64
+    CLCD::FontMetrics std_fm(std_font);
65
+    set_font_bitmap(cmd, std_fm, std_font);
66
+  }
67
+
68
+  /**
69
+   * Renders a character at location x and y. The x position is incremented
70
+   * by the width of the character.
71
+   *
72
+   * Parameters:
73
+   *
74
+   *   cmd  - If non-NULL the symbol is drawn to the screen.
75
+   *          If NULL, only increment position for text measurement.
76
+   *
77
+   *   x, y - The location at which to draw the character. On output,
78
+   *          incremented to the location of the next character.
79
+   *
80
+   *   fs   - A scaling object used to scale the font. The display will
81
+   *          already be configured to scale bitmaps, but positions
82
+   *          must be scaled using fs.scale()
83
+   *
84
+   *   c    - The unicode code point to draw. If the renderer does not
85
+   *          support the character, it should draw nothing.
86
+   */
87
+
88
+  bool FTDI::StandardCharSet::render_glyph(CommandProcessor* cmd, int &x, int &y, font_size_t fs, utf8_char_t c) {
89
+    uint8_t which = (c >= ' ' && c < 128) ? c : '?';
90
+    uint8_t width = std_char_width(which);
91
+
92
+    // Draw the character
93
+    if (cmd) ext_vertex2ii(*cmd, x, y, std_font, which);
94
+
95
+    // Increment X to the next character position
96
+    x += fs.scale(width);
97
+    return true;
98
+  }
99
+
100
+#endif // FTDI_EXTENDED

+ 30
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/standard_char_set.h View File

@@ -0,0 +1,30 @@
1
+/***********************
2
+ * standard_char_set.h *
3
+ ***********************/
4
+
5
+/****************************************************************************
6
+ *   Written By Marcio Teixeira 2019 - Aleph Objects, Inc.                  *
7
+ *                                                                          *
8
+ *   This program is free software: you can redistribute it and/or modify   *
9
+ *   it under the terms of the GNU General Public License as published by   *
10
+ *   the Free Software Foundation, either version 3 of the License, or      *
11
+ *   (at your option) any later version.                                    *
12
+ *                                                                          *
13
+ *   This program is distributed in the hope that it will be useful,        *
14
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
15
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
16
+ *   GNU General Public License for more details.                           *
17
+ *                                                                          *
18
+ *   To view a copy of the GNU General Public License, go to the following  *
19
+ *   location: <http://www.gnu.org/licenses/>.                              *
20
+ ****************************************************************************/
21
+
22
+namespace FTDI {
23
+  class StandardCharSet {
24
+    public:
25
+      static uint8_t std_char_width(char);
26
+      static void load_data(uint32_t addr);
27
+      static void load_bitmaps(CommandProcessor&);
28
+      static bool render_glyph(CommandProcessor*, int &x, int &y, font_size_t, utf8_char_t);
29
+  };
30
+}

+ 190
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/unicode.cpp View File

@@ -0,0 +1,190 @@
1
+/***************
2
+ * unicode.cpp *
3
+ ***************/
4
+
5
+/****************************************************************************
6
+ *   Written By Marcio Teixeira 2019 - Aleph Objects, Inc.                  *
7
+ *                                                                          *
8
+ *   This program is free software: you can redistribute it and/or modify   *
9
+ *   it under the terms of the GNU General Public License as published by   *
10
+ *   the Free Software Foundation, either version 3 of the License, or      *
11
+ *   (at your option) any later version.                                    *
12
+ *                                                                          *
13
+ *   This program is distributed in the hope that it will be useful,        *
14
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
15
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
16
+ *   GNU General Public License for more details.                           *
17
+ *                                                                          *
18
+ *   To view a copy of the GNU General Public License, go to the following  *
19
+ *   location: <http://www.gnu.org/licenses/>.                              *
20
+ ****************************************************************************/
21
+
22
+#include "../ftdi_extended.h"
23
+
24
+#if defined(FTDI_EXTENDED) && defined(TOUCH_UI_USE_UTF8)
25
+
26
+  using namespace FTDI;
27
+
28
+  /**
29
+   * Return a character in a UTF8 string and increment the
30
+   * pointer to the next character
31
+   *
32
+   * Parameters:
33
+   *
34
+   *   c  - Pointer to a UTF8 encoded string.
35
+   *
36
+   * Returns: The packed bytes of a UTF8 encoding of a single
37
+   *          character (this is not the unicode codepoint)
38
+   */
39
+
40
+  utf8_char_t FTDI::get_utf8_char_and_inc(const char *&c) {
41
+    utf8_char_t val = *(uint8_t*)c++;
42
+    while ((*c & 0xC0) == 0x80)
43
+      val = (val << 8) | *(uint8_t*)c++;
44
+    return val;
45
+  }
46
+
47
+  /**
48
+   * Helper function to draw and/or measure a UTF8 string
49
+   *
50
+   * Parameters:
51
+   *
52
+   *   cmd  - If non-NULL the symbol is drawn to the screen.
53
+   *          If NULL, only increment position for text measurement.
54
+   *
55
+   *   x, y - The location at which to draw the string.
56
+   *
57
+   *   str  - The UTF8 string to draw or measure.
58
+   *
59
+   *   fs   - A scaling object used to specify the font size.
60
+   */
61
+
62
+  static uint16_t render_utf8_text(CommandProcessor* cmd, int x, int y, const char *str, font_size_t fs) {
63
+    const int start_x = x;
64
+    while (*str) {
65
+      const utf8_char_t c = get_utf8_char_and_inc(str);
66
+      #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET
67
+        WesternCharSet::render_glyph(cmd, x, y, fs, c) ||
68
+      #endif
69
+      StandardCharSet::render_glyph(cmd, x, y, fs, c);
70
+    }
71
+    return x - start_x;
72
+  }
73
+
74
+  /**
75
+   * Load the font bitmap data into RAMG. Called once at program start.
76
+   *
77
+   * Parameters:
78
+   *
79
+   *   addr  - Address in RAMG where the font data is written
80
+   */
81
+
82
+  void FTDI::load_utf8_data(uint16_t addr) {
83
+    #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET
84
+      WesternCharSet::load_data(addr);
85
+    #endif
86
+    StandardCharSet::load_data(addr);
87
+  }
88
+
89
+  /**
90
+   * Populate the bitmap handles for the custom fonts into the display list.
91
+   * Called once at the start of each display list.
92
+   *
93
+   * Parameters:
94
+   *
95
+   *   cmd  - Object used for writing to the FTDI chip command queue.
96
+   */
97
+
98
+  void FTDI::load_utf8_bitmaps(CommandProcessor &cmd) {
99
+    #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET
100
+      WesternCharSet::load_bitmaps(cmd);
101
+    #endif
102
+    StandardCharSet::load_bitmaps(cmd);
103
+  }
104
+
105
+   /**
106
+    * Measure a UTF8 text character
107
+    *
108
+    * Parameters:
109
+    *
110
+    *   c    - The unicode code point to measure.
111
+    *
112
+    *   fs   - A scaling object used to specify the font size.
113
+    *
114
+    * Returns: A width in pixels
115
+    */
116
+
117
+  uint16_t FTDI::get_utf8_char_width(utf8_char_t c, font_size_t fs) {
118
+    int x = 0, y = 0;
119
+    #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET
120
+      WesternCharSet::render_glyph(NULL, x, y, fs, c) ||
121
+    #endif
122
+      StandardCharSet::render_glyph(NULL, x, y, fs, c);
123
+    return x;
124
+  }
125
+
126
+   /**
127
+    * Measure a UTF8 text string
128
+    *
129
+    * Parameters:
130
+    *
131
+    *   str  - The UTF8 string to measure.
132
+    *
133
+    *   fs   - A scaling object used to specify the font size.
134
+    *
135
+    * Returns: A width in pixels
136
+    */
137
+
138
+  uint16_t FTDI::get_utf8_text_width(const char *str, font_size_t fs) {
139
+    return render_utf8_text(NULL, 0, 0, str, fs);
140
+  }
141
+
142
+  uint16_t FTDI::get_utf8_text_width(progmem_str pstr, font_size_t fs) {
143
+    char str[strlen_P((const char*)pstr) + 1];
144
+    strcpy_P(str, (const char*)pstr);
145
+    return get_utf8_text_width((const char*) pstr, fs);
146
+  }
147
+
148
+   /**
149
+    * Draw a UTF8 text string
150
+    *
151
+    * Parameters:
152
+    *
153
+    *   cmd  - Object used for writing to the FTDI chip command queue.
154
+    *
155
+    *   x, y - The location at which to draw the string.
156
+    *
157
+    *   str  - The UTF8 string to draw.
158
+    *
159
+    *   fs   - A scaling object used to specify the font size.
160
+    *
161
+    *   options - Text alignment options (i.e. OPT_CENTERX, OPT_CENTERY, OPT_CENTER or OPT_RIGHTX)
162
+    *
163
+    */
164
+
165
+  void FTDI::draw_utf8_text(CommandProcessor& cmd, int x, int y, const char *str, font_size_t fs, uint16_t options) {
166
+    cmd.cmd(SAVE_CONTEXT());
167
+    cmd.cmd(BITMAP_TRANSFORM_A(fs.get_coefficient()));
168
+    cmd.cmd(BITMAP_TRANSFORM_E(fs.get_coefficient()));
169
+    cmd.cmd(BEGIN(BITMAPS));
170
+
171
+    // Apply alignment options
172
+    if (options & OPT_CENTERX)
173
+      x -= get_utf8_text_width(str, fs) / 2;
174
+    else if (options & OPT_RIGHTX)
175
+      x -= get_utf8_text_width(str, fs);
176
+    if (options & OPT_CENTERY)
177
+      y -= fs.get_height()/2;
178
+
179
+    // Render the text
180
+    render_utf8_text(&cmd, x, y, str, fs);
181
+    cmd.cmd(RESTORE_CONTEXT());
182
+  }
183
+
184
+  void FTDI::draw_utf8_text(CommandProcessor& cmd, int x, int y, progmem_str pstr, font_size_t fs, uint16_t options) {
185
+    char str[strlen_P((const char*)pstr) + 1];
186
+    strcpy_P(str, (const char*)pstr);
187
+    draw_utf8_text(cmd, x, y, (const char*) str, fs, options);
188
+  }
189
+
190
+#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8

+ 106
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/unicode.h View File

@@ -0,0 +1,106 @@
1
+/*************
2
+ * unicode.h *
3
+ *************/
4
+
5
+/****************************************************************************
6
+ *   Written By Marcio Teixeira 2019 - Aleph Objects, Inc.                  *
7
+ *                                                                          *
8
+ *   This program is free software: you can redistribute it and/or modify   *
9
+ *   it under the terms of the GNU General Public License as published by   *
10
+ *   the Free Software Foundation, either version 3 of the License, or      *
11
+ *   (at your option) any later version.                                    *
12
+ *                                                                          *
13
+ *   This program is distributed in the hope that it will be useful,        *
14
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
15
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
16
+ *   GNU General Public License for more details.                           *
17
+ *                                                                          *
18
+ *   To view a copy of the GNU General Public License, go to the following  *
19
+ *   location: <http://www.gnu.org/licenses/>.                              *
20
+ ****************************************************************************/
21
+
22
+#pragma once
23
+
24
+class CommandProcessor;
25
+
26
+namespace FTDI {
27
+  #ifdef TOUCH_UI_USE_UTF8
28
+    typedef uint16_t utf8_char_t;
29
+
30
+    /**
31
+     * Converts a 32-bit codepoint into UTF-8. This compile-time function
32
+     * will be useful until the u8'a' character literal becomes more common.
33
+     */
34
+    constexpr uint32_t utf8(const uint32_t c) {
35
+      return (c < 0x7F )  ? c :
36
+             (c < 0x7FF)  ? (0x0000C080 | ((c & 0b011111000000)             << 2) |  (c & 0b111111)) :
37
+             (c < 0xFFFF) ? (0x00E08080 | ((c & 0b001111000000000000)       << 4) | ((c & 0b111111000000)       << 2) | (c & 0b111111)) :
38
+                            (0xF0808080 | ((c & 0b000111000000000000000000) << 6) | ((c & 0b111111000000000000) << 4) | ((c & 0b111111000000) << 2) | (c & 0b111111));
39
+    }
40
+
41
+    /* Returns the next character in a UTF8 string and increments the
42
+     * pointer to the next character */
43
+
44
+    utf8_char_t get_utf8_char_and_inc(const char *&c);
45
+
46
+    /* Returns the next character in a UTF8 string, without incrementing */
47
+
48
+    inline utf8_char_t get_utf8_char(const char *c) {return get_utf8_char_and_inc(c);}
49
+
50
+    void load_utf8_data(uint16_t addr);
51
+  #else
52
+    typedef char utf8_char_t;
53
+
54
+    inline utf8_char_t get_utf8_char_and_inc(const char *&c) {return *c++;}
55
+    inline utf8_char_t get_utf8_char(const char *c) {return *c;}
56
+
57
+    inline void load_utf8_data(uint16_t) {}
58
+  #endif
59
+
60
+  void load_utf8_bitmaps(CommandProcessor& cmd);
61
+
62
+  uint16_t get_utf8_char_width(utf8_char_t, font_size_t);
63
+  uint16_t get_utf8_text_width(progmem_str, font_size_t);
64
+  uint16_t get_utf8_text_width(const char *, font_size_t);
65
+
66
+  void draw_utf8_text(CommandProcessor&, int x, int y, progmem_str, font_size_t, uint16_t options = 0);
67
+  void draw_utf8_text(CommandProcessor&, int x, int y, const char *, font_size_t, uint16_t options = 0);
68
+
69
+  // Similar to CLCD::FontMetrics, but can be used with UTF8 encoded strings.
70
+
71
+  struct FontMetrics {
72
+    #ifdef TOUCH_UI_USE_UTF8
73
+      font_size_t fs;
74
+    #else
75
+      CLCD::FontMetrics fm;
76
+    #endif
77
+
78
+    inline void load(uint8_t rom_font_size) {
79
+      #ifdef TOUCH_UI_USE_UTF8
80
+        fs = font_size_t::from_romfont(rom_font_size);
81
+      #else
82
+        fm.load(rom_font_size);
83
+      #endif
84
+    }
85
+
86
+    inline uint16_t get_char_width(utf8_char_t c) const {
87
+      #ifdef TOUCH_UI_USE_UTF8
88
+        return get_utf8_char_width(c, fs);
89
+      #else
90
+        return fm.char_widths[(uint8_t)c];
91
+      #endif
92
+    }
93
+
94
+    inline uint8_t get_height() const {
95
+      #ifdef TOUCH_UI_USE_UTF8
96
+        return fs.get_height();
97
+      #else
98
+        return fm.height;
99
+      #endif
100
+    }
101
+
102
+    inline FontMetrics(uint8_t rom_font_size) {
103
+      load(rom_font_size);
104
+    }
105
+  };
106
+}

+ 338
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set.cpp View File

@@ -0,0 +1,338 @@
1
+/************************
2
+ * western_char_set.cpp *
3
+ ************************/
4
+
5
+/****************************************************************************
6
+ *   Written By Marcio Teixeira 2019 - Aleph Objects, Inc.                  *
7
+ *                                                                          *
8
+ *   This program is free software: you can redistribute it and/or modify   *
9
+ *   it under the terms of the GNU General Public License as published by   *
10
+ *   the Free Software Foundation, either version 3 of the License, or      *
11
+ *   (at your option) any later version.                                    *
12
+ *                                                                          *
13
+ *   This program is distributed in the hope that it will be useful,        *
14
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
15
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
16
+ *   GNU General Public License for more details.                           *
17
+ *                                                                          *
18
+ *   To view a copy of the GNU General Public License, go to the following  *
19
+ *   location: <http://www.gnu.org/licenses/>.                              *
20
+ ****************************************************************************/
21
+
22
+#include "../ftdi_extended.h"
23
+
24
+#if defined(FTDI_EXTENDED) && defined(TOUCH_UI_USE_UTF8) && defined(TOUCH_UI_UTF8_WESTERN_CHARSET)
25
+  #include "western_char_set_bitmap_31.h"
26
+
27
+  #define NUM_ELEMENTS(a) (sizeof(a)/sizeof(a[0]))
28
+
29
+  using namespace FTDI;
30
+
31
+  constexpr static uint8_t std_font = 31;
32
+  constexpr static uint8_t alt_font = 1;
33
+
34
+  static uint32_t bitmap_addr;
35
+
36
+  /* Glyphs in the WesternCharSet bitmap */
37
+
38
+  enum {
39
+    GRAVE,
40
+    ACUTE,
41
+    CIRCUMFLEX,
42
+    TILDE,
43
+    DIAERESIS,
44
+    DOT_ABOVE,
45
+    CEDILLA,
46
+    NO_DOT_I,
47
+    SHARP_S,
48
+    LRG_O_STROKE,
49
+    SML_O_STROKE,
50
+    LRG_AE,
51
+    SML_AE,
52
+    LRG_ETH,
53
+    SML_ETH,
54
+    LRG_THORN,
55
+    SML_THORN,
56
+    LEFT_DBL_QUOTE,
57
+    RIGHT_DBL_QUOTE,
58
+    INV_EXCLAMATION,
59
+    INV_QUESTION,
60
+    CENT_SIGN,
61
+    POUND_SIGN,
62
+    CURRENCY_SIGN,
63
+    YEN_SIGN
64
+  };
65
+
66
+  /* Centerline of characters that can take accents */
67
+
68
+  constexpr int8_t mid_a = 12;
69
+  constexpr int8_t mid_e = 12;
70
+  constexpr int8_t mid_i = 5;
71
+  constexpr int8_t mid_o = 12;
72
+  constexpr int8_t mid_u = 12;
73
+  constexpr int8_t mid_y = 11;
74
+  constexpr int8_t mid_n = 12;
75
+  constexpr int8_t mid_c = 12;
76
+  constexpr int8_t mid_A = 13;
77
+  constexpr int8_t mid_E = 13;
78
+  constexpr int8_t mid_I = 6;
79
+  constexpr int8_t mid_O = 14;
80
+  constexpr int8_t mid_U = 14;
81
+  constexpr int8_t mid_Y = 13;
82
+  constexpr int8_t mid_N = 15;
83
+  constexpr int8_t mid_C = 13;
84
+
85
+  /* Centerline of accent glyphs */
86
+
87
+  constexpr int8_t mid_accent = 16;
88
+
89
+  /* When reusing the DOT_ABOVE accent glyph for the degree sign, we need to trim the leading space */
90
+  constexpr uint8_t deg_sign_leading = 9;
91
+
92
+  /* Look-up table for constructing characters (must be ordered by unicode)
93
+   *
94
+   * Characters are either complete symbols from the Western Char Set bitmap,
95
+   * or they are constructed using a standard letter from the romfont and
96
+   * drawing an accent from the Western Char Set bitmap over it.
97
+   */
98
+
99
+  #define UTF8(A) uint16_t(utf8(U##A))
100
+
101
+  PROGMEM constexpr struct {
102
+    uint16_t unicode;
103
+    uint8_t  std_char; // Glyph from standard ROMFONT (zero if none)
104
+    uint8_t  alt_char; // Glyph from Western Char Set bitmap
105
+    uint8_t  alt_data; // For accented characters, the centerline; else char width
106
+  } char_recipe[] = {
107
+    {0,          0,  NO_DOT_I,           10   },
108
+    {UTF8('¡'),  0 , INV_EXCLAMATION,    13   },
109
+    {UTF8('¢'),  0 , CENT_SIGN,          23   },
110
+    {UTF8('£'),  0 , POUND_SIGN,         24   },
111
+    {UTF8('¤'),  0 , CURRENCY_SIGN,      26   },
112
+    {UTF8('¥'),  0 , YEN_SIGN,           26   },
113
+    {UTF8('«'),  0 , LEFT_DBL_QUOTE,     23   },
114
+    {UTF8('°'),  0 , DOT_ABOVE,          24   },
115
+    {UTF8('»'),  0 , RIGHT_DBL_QUOTE,    24   },
116
+    {UTF8('¿'),  0 , INV_QUESTION,       21   },
117
+    {UTF8('À'), 'A', GRAVE,              mid_A},
118
+    {UTF8('Á'), 'A', ACUTE,              mid_A},
119
+    {UTF8('Â'), 'A', CIRCUMFLEX,         mid_A},
120
+    {UTF8('Ã'), 'A', TILDE,              mid_A},
121
+    {UTF8('Ä'), 'A', DIAERESIS,          mid_A},
122
+    {UTF8('Å'), 'A', DOT_ABOVE,          mid_A},
123
+    {UTF8('Æ'),  0 , LRG_AE,             mid_E},
124
+    {UTF8('Ç'), 'C', CEDILLA,            mid_C},
125
+    {UTF8('È'), 'E', GRAVE,              mid_E},
126
+    {UTF8('É'), 'E', ACUTE,              mid_E},
127
+    {UTF8('Ê'), 'E', CIRCUMFLEX,         mid_E},
128
+    {UTF8('Ë'), 'E', DIAERESIS,          mid_E},
129
+    {UTF8('Ì'), 'I', GRAVE,              mid_I},
130
+    {UTF8('Í'), 'I', ACUTE,              mid_I},
131
+    {UTF8('Î'), 'I', CIRCUMFLEX,         mid_I},
132
+    {UTF8('Ï'), 'I', DIAERESIS,          mid_I},
133
+    {UTF8('Ð'),  0,  LRG_ETH,            31   },
134
+    {UTF8('Ñ'), 'N', TILDE,              mid_N},
135
+    {UTF8('Ò'), 'O', GRAVE,              mid_O},
136
+    {UTF8('Ó'), 'O', ACUTE,              mid_O},
137
+    {UTF8('Ô'), 'O', CIRCUMFLEX,         mid_O},
138
+    {UTF8('Õ'), 'O', TILDE,              mid_O},
139
+    {UTF8('Ö'), 'O', DIAERESIS,          mid_O},
140
+    {UTF8('Ø'),  0 , LRG_O_STROKE,       32   },
141
+    {UTF8('Ù'), 'U', GRAVE,              mid_U},
142
+    {UTF8('Ú'), 'U', ACUTE,              mid_U},
143
+    {UTF8('Û'), 'U', CIRCUMFLEX,         mid_U},
144
+    {UTF8('Ü'), 'U', DIAERESIS,          mid_U},
145
+    {UTF8('Ý'), 'Y', ACUTE,              mid_Y},
146
+    {UTF8('Þ'),  0 , LRG_THORN,          25   },
147
+    {UTF8('ß'),  0 , SHARP_S,            26   },
148
+    {UTF8('à'), 'a', GRAVE,              mid_a},
149
+    {UTF8('á'), 'a', ACUTE,              mid_a},
150
+    {UTF8('â'), 'a', CIRCUMFLEX,         mid_a},
151
+    {UTF8('ã'), 'a', TILDE,              mid_a},
152
+    {UTF8('ä'), 'a', DIAERESIS,          mid_a},
153
+    {UTF8('å'), 'a', DOT_ABOVE,          mid_a},
154
+    {UTF8('æ'),  0 , SML_AE,             40   },
155
+    {UTF8('ç'), 'c', CEDILLA,            mid_c},
156
+    {UTF8('è'), 'e', GRAVE,              mid_e},
157
+    {UTF8('é'), 'e', ACUTE,              mid_e},
158
+    {UTF8('ê'), 'e', CIRCUMFLEX,         mid_e},
159
+    {UTF8('ë'), 'e', DIAERESIS,          mid_e},
160
+    {UTF8('ì'), 'i', GRAVE,              mid_i},
161
+    {UTF8('í'), 'i', ACUTE,              mid_i},
162
+    {UTF8('î'), 'i', CIRCUMFLEX,         mid_i},
163
+    {UTF8('ï'), 'i', DIAERESIS,          mid_i},
164
+    {UTF8('ð'),  0,  SML_ETH,            24   },
165
+    {UTF8('ñ'), 'n', TILDE,              mid_n},
166
+    {UTF8('ò'), 'o', GRAVE,              mid_o},
167
+    {UTF8('ó'), 'o', ACUTE,              mid_o},
168
+    {UTF8('ô'), 'o', CIRCUMFLEX,         mid_o},
169
+    {UTF8('õ'), 'o', TILDE,              mid_o},
170
+    {UTF8('ö'), 'o', DIAERESIS,          mid_o},
171
+    {UTF8('ø'),  0 , SML_O_STROKE,       25   },
172
+    {UTF8('ù'), 'u', GRAVE,              mid_u},
173
+    {UTF8('ú'), 'u', ACUTE,              mid_u},
174
+    {UTF8('û'), 'u', CIRCUMFLEX,         mid_u},
175
+    {UTF8('ü'), 'u', DIAERESIS,          mid_u},
176
+    {UTF8('ý'), 'y', ACUTE,              mid_y},
177
+    {UTF8('þ'),  0 , SML_THORN,          25   },
178
+    {UTF8('ÿ'), 'y', DIAERESIS,          mid_y}
179
+  };
180
+
181
+  static_assert(UTF8('¡') == 0xC2A1, "Incorrect encoding for character");
182
+
183
+  /* Compile-time check that the table is in sorted order */
184
+
185
+  constexpr bool is_sorted(size_t n) {
186
+    return n < 2 ? true : char_recipe[n-2].unicode < char_recipe[n-1].unicode && is_sorted(n-1);
187
+  }
188
+
189
+  static_assert(is_sorted(NUM_ELEMENTS(char_recipe)), "The table must be sorted by unicode value");
190
+
191
+  /* Performs a binary search to find a unicode character in the table */
192
+
193
+  static int8_t find_char_data(FTDI::utf8_char_t c) {
194
+    int8_t min = 0, max = NUM_ELEMENTS(char_recipe), index;
195
+    for (;;) {
196
+      index = (min + max)/2;
197
+      const uint16_t char_at = pgm_read_word(&char_recipe[index].unicode);
198
+      if (char_at == c) break;
199
+      if (min == max) return -1;
200
+      if (c > char_at)
201
+        min = index + 1;
202
+      else
203
+        max = index;
204
+    }
205
+    return index;
206
+  }
207
+
208
+  static void get_char_data(uint8_t index, uint8_t &std_char, uint8_t &alt_char, uint8_t &alt_data) {
209
+    std_char = pgm_read_byte(&char_recipe[index].std_char);
210
+    alt_char = pgm_read_byte(&char_recipe[index].alt_char);
211
+    alt_data = pgm_read_byte(&char_recipe[index].alt_data);
212
+  }
213
+
214
+  /**
215
+   * Load bitmap data into RAMG. This function is called once at the start
216
+   * of the program.
217
+   *
218
+   * Parameters:
219
+   *
220
+   *   addr  - Address in RAMG where the font data is written
221
+   */
222
+
223
+  void FTDI::WesternCharSet::load_data(uint32_t addr) {
224
+    // Load the alternative font metrics
225
+    CLCD::FontMetrics alt_fm;
226
+    alt_fm.ptr    = addr + 148;
227
+    alt_fm.format = L4;
228
+    alt_fm.stride = 19;
229
+    alt_fm.width  = 38;
230
+    alt_fm.height = 49;
231
+    for (uint8_t i = 0; i < 127; i++) {
232
+      alt_fm.char_widths[i] = 0;
233
+    }
234
+    // For special characters, copy the character widths from the char tables
235
+    for (uint8_t i = 0; i < NUM_ELEMENTS(char_recipe); i++) {
236
+      uint8_t std_char, alt_char, alt_data;
237
+      get_char_data(i, std_char, alt_char, alt_data);
238
+      if (std_char == 0)
239
+        alt_fm.char_widths[alt_char] = alt_data;
240
+    }
241
+    CLCD::mem_write_bulk(addr, &alt_fm,  148);
242
+
243
+    // Decode the RLE data and load it into RAMG as a bitmap
244
+    write_rle_data(addr + 148, font, sizeof(font));
245
+
246
+    bitmap_addr = addr;
247
+  }
248
+
249
+  /**
250
+   * Populates the bitmap handles for the custom into the display list.
251
+   * This function is called once at the start of each display list.
252
+   *
253
+   * Parameters:
254
+   *
255
+   *   cmd  - Object used for writing to the FTDI chip command queue.
256
+   */
257
+
258
+  void FTDI::WesternCharSet::load_bitmaps(CommandProcessor& cmd) {
259
+    CLCD::FontMetrics alt_fm;
260
+    alt_fm.ptr    = bitmap_addr + 148;
261
+    alt_fm.format = L4;
262
+    alt_fm.stride = 19;
263
+    alt_fm.width  = 38;
264
+    alt_fm.height = 49;
265
+    set_font_bitmap(cmd, alt_fm, alt_font);
266
+  }
267
+
268
+  /**
269
+   * Renders a character at location x and y. The x position is incremented
270
+   * by the width of the character.
271
+   *
272
+   * Parameters:
273
+   *
274
+   *   cmd  - If non-NULL the symbol is drawn to the screen.
275
+   *          If NULL, only increment position for text measurement.
276
+   *
277
+   *   x, y - The location at which to draw the character. On output,
278
+   *          incremented to the location of the next character.
279
+   *
280
+   *   fs   - A scaling object used to scale the font. The display will
281
+   *          already be configured to scale bitmaps, but positions
282
+   *          must be scaled using fs.scale()
283
+   *
284
+   *   c    - The unicode code point to draw. If the renderer does not
285
+   *          support the character, it should return false.
286
+
287
+   * Returns: Whether the character was supported.
288
+   */
289
+
290
+  bool FTDI::WesternCharSet::render_glyph(CommandProcessor* cmd, int &x, int &y, font_size_t fs, utf8_char_t c) {
291
+
292
+    // A supported character?
293
+    if (c < UTF8('¡') || c > UTF8('ÿ')) return false;
294
+
295
+    int8_t index = find_char_data(c);
296
+    if (index == -1) return false;
297
+
298
+    // Determine character characteristics
299
+    uint8_t std_char, alt_char, alt_data;
300
+    get_char_data(index, std_char, alt_char, alt_data);
301
+
302
+    bool    base_special;
303
+    uint8_t base_width;
304
+    uint8_t base_char;
305
+    uint8_t accent_char;
306
+    int8_t  accent_dx, accent_dy;
307
+
308
+    if (std_char == 0) {
309
+      // Special character, non-accented
310
+      base_width   = alt_data;
311
+      base_special = true;
312
+      base_char    = alt_char;
313
+      accent_char  = 0;
314
+      if (c == UTF8('°'))
315
+        x -= fs.scale(deg_sign_leading);
316
+    } else {
317
+      // Regular character with accent:
318
+      accent_dx   = alt_data - mid_accent;
319
+      accent_dy   = isupper(std_char) ? -7 : 0;
320
+      accent_char = alt_char;
321
+      base_width  = StandardCharSet::std_char_width(std_char);
322
+      base_special = std_char == 'i';
323
+      base_char   = base_special ? NO_DOT_I : std_char;
324
+    }
325
+
326
+    // If cmd != NULL, draw the glyph to the screen
327
+    if (cmd) {
328
+      ext_vertex2ii(*cmd, x, y, base_special ? alt_font : std_font, base_char);
329
+      if (accent_char)
330
+        ext_vertex2ii(*cmd, x + fs.scale(accent_dx), y + fs.scale(accent_dy), alt_font, accent_char);
331
+    }
332
+
333
+    // Increment X to the next character position
334
+    x += fs.scale(base_width);
335
+    return true;
336
+  }
337
+
338
+#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8 && TOUCH_UI_UTF8_WESTERN_CHARSET

+ 29
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set.h View File

@@ -0,0 +1,29 @@
1
+/**********************
2
+ * western_char_set.h *
3
+ **********************/
4
+
5
+/****************************************************************************
6
+ *   Written By Marcio Teixeira 2019 - Aleph Objects, Inc.                  *
7
+ *                                                                          *
8
+ *   This program is free software: you can redistribute it and/or modify   *
9
+ *   it under the terms of the GNU General Public License as published by   *
10
+ *   the Free Software Foundation, either version 3 of the License, or      *
11
+ *   (at your option) any later version.                                    *
12
+ *                                                                          *
13
+ *   This program is distributed in the hope that it will be useful,        *
14
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
15
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
16
+ *   GNU General Public License for more details.                           *
17
+ *                                                                          *
18
+ *   To view a copy of the GNU General Public License, go to the following  *
19
+ *   location: <http://www.gnu.org/licenses/>.                              *
20
+ ****************************************************************************/
21
+
22
+namespace FTDI {
23
+  class WesternCharSet {
24
+    public:
25
+      static void load_data(uint32_t addr);
26
+      static void load_bitmaps(CommandProcessor&);
27
+      static bool render_glyph(CommandProcessor*, int &x, int &y, font_size_t, utf8_char_t);
28
+  };
29
+}

+ 665
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h View File

@@ -0,0 +1,665 @@
1
+/********************************
2
+ * western_european_bitmap_31.h *
3
+ ********************************/
4
+
5
+/****************************************************************************
6
+ *   Written By Marcio Teixeira 2019 - Aleph Objects, Inc.                  *
7
+ *                                                                          *
8
+ *   This program is free software: you can redistribute it and/or modify   *
9
+ *   it under the terms of the GNU General Public License as published by   *
10
+ *   the Free Software Foundation, either version 3 of the License, or      *
11
+ *   (at your option) any later version.                                    *
12
+ *                                                                          *
13
+ *   This program is distributed in the hope that it will be useful,        *
14
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of         *
15
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
16
+ *   GNU General Public License for more details.                           *
17
+ *                                                                          *
18
+ *   To view a copy of the GNU General Public License, go to the following  *
19
+ *   location: <http://www.gnu.org/licenses/>.                              *
20
+ ****************************************************************************/
21
+
22
+#pragma once
23
+
24
+/* This is a dump of "font_bitmaps/western_european_bitmap_31.png"
25
+ * using the tool "bitmap2cpp.py". The tool converts the image into
26
+ * 16-level grayscale and packs two pixels per byte. The resulting
27
+ * bytes are then RLE compressed to yield (count, byte) pairs.
28
+ */
29
+
30
+const unsigned char font[] PROGMEM = {
31
+  0x76, 0x00, 0x01, 0x08, 0x01, 0xee, 0x01, 0xe5, 0x11, 0x00, 0x01, 0xaf,
32
+  0x01, 0xff, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xd0,
33
+  0x10, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xf9, 0x11, 0x00, 0x01, 0x2e,
34
+  0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf2,
35
+  0x11, 0x00, 0x01, 0x5f, 0x01, 0xfd, 0x11, 0x00, 0x01, 0x06, 0x01, 0x99,
36
+  0x01, 0x40, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x20, 0x00, 0x01, 0x9e,
37
+  0x01, 0xee, 0x01, 0x50, 0x0f, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8,
38
+  0x10, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0xcf,
39
+  0x01, 0xfc, 0x10, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xd1, 0x10, 0x00,
40
+  0x01, 0x4f, 0x01, 0xfe, 0x01, 0x20, 0x0f, 0x00, 0x01, 0x01, 0x01, 0xef,
41
+  0x01, 0xf3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xaa, 0x01, 0x40, 0xff, 0x00,
42
+  0xff, 0x00, 0xff, 0x00, 0x1f, 0x00, 0x01, 0xcf, 0x01, 0xfc, 0x10, 0x00,
43
+  0x01, 0x07, 0x02, 0xff, 0x01, 0x60, 0x0f, 0x00, 0x01, 0x2f, 0x02, 0xff,
44
+  0x01, 0xf2, 0x0f, 0x00, 0x01, 0xcf, 0x01, 0xf6, 0x01, 0x6f, 0x01, 0xfb,
45
+  0x0e, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x0a, 0x01, 0xff,
46
+  0x01, 0x60, 0x0d, 0x00, 0x01, 0x1f, 0x01, 0xfd, 0x01, 0x00, 0x01, 0x01,
47
+  0x01, 0xdf, 0x01, 0xf1, 0x0d, 0x00, 0x01, 0xbf, 0x01, 0xf3, 0x02, 0x00,
48
+  0x01, 0x3f, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x02, 0x01, 0x99, 0x01, 0x50,
49
+  0x02, 0x00, 0x01, 0x05, 0x01, 0x99, 0x01, 0x20, 0xff, 0x00, 0xff, 0x00,
50
+  0xff, 0x00, 0x1f, 0x00, 0x01, 0x11, 0x0d, 0x00, 0x01, 0x09, 0x01, 0xff,
51
+  0x01, 0xc3, 0x02, 0x00, 0x01, 0xff, 0x01, 0x80, 0x0c, 0x00, 0x01, 0xaf,
52
+  0x02, 0xff, 0x01, 0x50, 0x01, 0x01, 0x01, 0xff, 0x01, 0x60, 0x0b, 0x00,
53
+  0x01, 0x02, 0x01, 0xff, 0x01, 0xd9, 0x01, 0xff, 0x01, 0xf7, 0x01, 0x07,
54
+  0x01, 0xff, 0x01, 0x40, 0x0b, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0x20,
55
+  0x01, 0x3e, 0x02, 0xff, 0x01, 0xfd, 0x0c, 0x00, 0x01, 0x09, 0x01, 0xfe,
56
+  0x01, 0x00, 0x01, 0x02, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xf4, 0x0c, 0x00,
57
+  0x01, 0x07, 0x01, 0xa8, 0x02, 0x00, 0x01, 0x06, 0x01, 0x98, 0x01, 0x20,
58
+  0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x41, 0x00, 0x02, 0x44, 0x02, 0x00,
59
+  0x02, 0x44, 0x0d, 0x00, 0x02, 0xff, 0x01, 0x10, 0x01, 0x01, 0x02, 0xff,
60
+  0x0d, 0x00, 0x02, 0xff, 0x01, 0x10, 0x01, 0x01, 0x02, 0xff, 0x0d, 0x00,
61
+  0x02, 0xff, 0x01, 0x10, 0x01, 0x01, 0x02, 0xff, 0x0d, 0x00, 0x02, 0xcc,
62
+  0x01, 0x10, 0x01, 0x01, 0x02, 0xcc, 0xff, 0x00, 0xff, 0x00, 0xf6, 0x00,
63
+  0x01, 0x13, 0x01, 0x30, 0x10, 0x00, 0x01, 0x2b, 0x02, 0xff, 0x01, 0xa1,
64
+  0x0e, 0x00, 0x01, 0x02, 0x01, 0xef, 0x02, 0xff, 0x01, 0xfd, 0x01, 0x10,
65
+  0x0d, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0x94, 0x01, 0x5a, 0x01, 0xff,
66
+  0x01, 0xb0, 0x0d, 0x00, 0x01, 0x4f, 0x01, 0xf7, 0x02, 0x00, 0x01, 0x9f,
67
+  0x01, 0xf2, 0x0d, 0x00, 0x01, 0x8f, 0x01, 0xf0, 0x02, 0x00, 0x01, 0x2f,
68
+  0x01, 0xf6, 0x0d, 0x00, 0x01, 0x8f, 0x01, 0xe0, 0x02, 0x00, 0x01, 0x0f,
69
+  0x01, 0xf7, 0x0d, 0x00, 0x01, 0x7f, 0x01, 0xf2, 0x02, 0x00, 0x01, 0x4f,
70
+  0x01, 0xf5, 0x0d, 0x00, 0x01, 0x2f, 0x01, 0xfc, 0x01, 0x10, 0x01, 0x02,
71
+  0x01, 0xdf, 0x01, 0xf0, 0x0d, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb,
72
+  0x01, 0xcf, 0x01, 0xff, 0x01, 0x60, 0x0e, 0x00, 0x01, 0x9f, 0x02, 0xff,
73
+  0x01, 0xf8, 0x0f, 0x00, 0x01, 0x03, 0x01, 0x9c, 0x01, 0xc9, 0x01, 0x30,
74
+  0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x93, 0x00,
75
+  0x01, 0x06, 0x01, 0xff, 0x01, 0x20, 0x11, 0x00, 0x01, 0xcf, 0x01, 0xc0,
76
+  0x11, 0x00, 0x01, 0x3f, 0x01, 0xf6, 0x11, 0x00, 0x01, 0x0f, 0x01, 0xfb,
77
+  0x11, 0x00, 0x01, 0x3f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0x07, 0x01, 0xd9,
78
+  0x01, 0x89, 0x01, 0xff, 0x01, 0xfb, 0x0e, 0x00, 0x01, 0x07, 0x03, 0xff,
79
+  0x01, 0xf3, 0x0e, 0x00, 0x01, 0x04, 0x01, 0xbd, 0x01, 0xee, 0x01, 0xd9,
80
+  0x01, 0x20, 0xff, 0x00, 0x61, 0x00, 0x01, 0x01, 0x01, 0x99, 0x01, 0x96,
81
+  0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01,
82
+  0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9,
83
+  0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01,
84
+  0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9,
85
+  0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01,
86
+  0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9,
87
+  0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01,
88
+  0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9,
89
+  0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01,
90
+  0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9,
91
+  0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01,
92
+  0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9,
93
+  0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01,
94
+  0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9,
95
+  0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0xff, 0x00, 0x58, 0x00,
96
+  0x01, 0x35, 0x01, 0x66, 0x01, 0x52, 0x0e, 0x00, 0x01, 0x03, 0x01, 0xaf,
97
+  0x03, 0xff, 0x01, 0xe7, 0x0d, 0x00, 0x01, 0x7f, 0x05, 0xff, 0x01, 0xc1,
98
+  0x0b, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0xfc, 0x01, 0xaa, 0x01, 0xdf,
99
+  0x01, 0xff, 0x01, 0xfc, 0x0b, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf9,
100
+  0x01, 0x10, 0x01, 0x00, 0x01, 0x02, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x70,
101
+  0x0a, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x80, 0x03, 0x00, 0x01, 0x0d,
102
+  0x01, 0xff, 0x01, 0xe0, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x04, 0x00,
103
+  0x01, 0x05, 0x01, 0xff, 0x01, 0xf3, 0x09, 0x00, 0x01, 0x02, 0x01, 0xff,
104
+  0x01, 0xfb, 0x04, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf7, 0x09, 0x00,
105
+  0x01, 0x03, 0x01, 0xff, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x03, 0x01, 0x9e,
106
+  0x01, 0xff, 0x01, 0xf8, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8,
107
+  0x02, 0x00, 0x01, 0x01, 0x01, 0xaf, 0x02, 0xff, 0x01, 0xd7, 0x09, 0x00,
108
+  0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x1d, 0x01, 0xff,
109
+  0x01, 0xfc, 0x01, 0x50, 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8,
110
+  0x02, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x70, 0x0b, 0x00, 0x01, 0x03,
111
+  0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xfa,
112
+  0x0c, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x05,
113
+  0x01, 0xff, 0x01, 0xf4, 0x0c, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8,
114
+  0x01, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf4, 0x0c, 0x00, 0x01, 0x03,
115
+  0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf9,
116
+  0x0c, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x02,
117
+  0x02, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8,
118
+  0x02, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x03,
119
+  0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x1d, 0x02, 0xff, 0x01, 0xd3,
120
+  0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x01,
121
+  0x01, 0xcf, 0x02, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff,
122
+  0x01, 0xf8, 0x03, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0xfb, 0x09, 0x00,
123
+  0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x2b, 0x02, 0xff,
124
+  0x01, 0xb0, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00,
125
+  0x01, 0x6f, 0x01, 0xff, 0x01, 0xf6, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff,
126
+  0x01, 0xf8, 0x05, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfd, 0x08, 0x00,
127
+  0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xdf, 0x01, 0xff,
128
+  0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xbf,
129
+  0x01, 0xff, 0x01, 0x10, 0x07, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8,
130
+  0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff,
131
+  0x01, 0xf8, 0x05, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xfd, 0x08, 0x00,
132
+  0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x02, 0x01, 0x84, 0x03, 0x00,
133
+  0x01, 0x2d, 0x01, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff,
134
+  0x01, 0xf8, 0x01, 0x02, 0x01, 0xff, 0x01, 0xec, 0x01, 0xa9, 0x01, 0xac,
135
+  0x02, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8,
136
+  0x01, 0x02, 0x05, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x08, 0x00, 0x01, 0x03,
137
+  0x01, 0xee, 0x01, 0xe7, 0x01, 0x01, 0x01, 0xbf, 0x03, 0xff, 0x01, 0xfe,
138
+  0x01, 0x80, 0x0e, 0x00, 0x01, 0x35, 0x01, 0x78, 0x01, 0x76, 0x01, 0x30,
139
+  0xff, 0x00, 0x48, 0x00, 0x01, 0x40, 0x0a, 0x00, 0x01, 0x47, 0x01, 0x9a,
140
+  0x01, 0xba, 0x01, 0x95, 0x01, 0x10, 0x02, 0x00, 0x01, 0x07, 0x01, 0xf8,
141
+  0x08, 0x00, 0x01, 0x02, 0x01, 0xae, 0x04, 0xff, 0x01, 0xfc, 0x01, 0x50,
142
+  0x01, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x30, 0x07, 0x00, 0x01, 0x8f,
143
+  0x06, 0xff, 0x01, 0xfc, 0x01, 0x23, 0x01, 0xff, 0x01, 0xf6, 0x07, 0x00,
144
+  0x01, 0x1c, 0x03, 0xff, 0x01, 0xca, 0x01, 0x9b, 0x01, 0xdf, 0x02, 0xff,
145
+  0x01, 0xfe, 0x01, 0xff, 0x01, 0x80, 0x07, 0x00, 0x01, 0xcf, 0x01, 0xff,
146
+  0x01, 0xfd, 0x01, 0x50, 0x02, 0x00, 0x01, 0x02, 0x01, 0x9f, 0x02, 0xff,
147
+  0x01, 0xfa, 0x07, 0x00, 0x01, 0x09, 0x02, 0xff, 0x01, 0x90, 0x04, 0x00,
148
+  0x01, 0x03, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf3, 0x07, 0x00, 0x01, 0x5f,
149
+  0x01, 0xff, 0x01, 0xf9, 0x06, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xfc,
150
+  0x07, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x06,
151
+  0x03, 0xff, 0x01, 0x60, 0x05, 0x00, 0x01, 0x04, 0x02, 0xff, 0x01, 0x30,
152
+  0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xc0,
153
+  0x05, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfc, 0x05, 0x00, 0x01, 0x02,
154
+  0x01, 0xef, 0x01, 0xf7, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00,
155
+  0x01, 0x0f, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0x1d, 0x01, 0xff,
156
+  0x01, 0xa0, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x3f,
157
+  0x01, 0xff, 0x01, 0xf2, 0x05, 0x00, 0x01, 0xcf, 0x01, 0xfc, 0x01, 0x00,
158
+  0x01, 0x09, 0x01, 0xff, 0x01, 0xfb, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff,
159
+  0x01, 0xe0, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xd1, 0x01, 0x00,
160
+  0x01, 0x06, 0x01, 0xff, 0x01, 0xfe, 0x05, 0x00, 0x01, 0x8f, 0x01, 0xff,
161
+  0x01, 0xc0, 0x04, 0x00, 0x01, 0x7f, 0x01, 0xfe, 0x01, 0x20, 0x01, 0x00,
162
+  0x01, 0x03, 0x02, 0xff, 0x05, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xb0,
163
+  0x03, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf4, 0x02, 0x00, 0x01, 0x02,
164
+  0x02, 0xff, 0x01, 0x10, 0x04, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0,
165
+  0x03, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0x60, 0x02, 0x00, 0x01, 0x01,
166
+  0x02, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0,
167
+  0x02, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xf8, 0x03, 0x00, 0x01, 0x02,
168
+  0x02, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xb0,
169
+  0x02, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xb0, 0x03, 0x00, 0x01, 0x03,
170
+  0x02, 0xff, 0x01, 0x10, 0x04, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xc0,
171
+  0x02, 0x00, 0x01, 0xbf, 0x01, 0xfd, 0x04, 0x00, 0x01, 0x04, 0x02, 0xff,
172
+  0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x00, 0x01, 0x08,
173
+  0x01, 0xff, 0x01, 0xe1, 0x04, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfe,
174
+  0x05, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf2, 0x01, 0x00, 0x01, 0x6f,
175
+  0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfa,
176
+  0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf6, 0x01, 0x04, 0x01, 0xff,
177
+  0x01, 0xf5, 0x05, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf7, 0x05, 0x00,
178
+  0x01, 0x09, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x2e, 0x01, 0xff, 0x01, 0x70,
179
+  0x05, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf2, 0x05, 0x00, 0x01, 0x03,
180
+  0x02, 0xff, 0x01, 0xef, 0x01, 0xf9, 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff,
181
+  0x01, 0xb0, 0x06, 0x00, 0x01, 0xcf, 0x02, 0xff, 0x01, 0xc0, 0x05, 0x00,
182
+  0x01, 0x06, 0x02, 0xff, 0x01, 0x40, 0x06, 0x00, 0x01, 0x2f, 0x02, 0xff,
183
+  0x01, 0x20, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xfb, 0x07, 0x00,
184
+  0x01, 0x0b, 0x02, 0xff, 0x01, 0xd2, 0x04, 0x00, 0x01, 0x06, 0x02, 0xff,
185
+  0x01, 0xe1, 0x07, 0x00, 0x01, 0x5f, 0x03, 0xff, 0x01, 0x93, 0x02, 0x00,
186
+  0x01, 0x05, 0x01, 0xcf, 0x02, 0xff, 0x01, 0x30, 0x06, 0x00, 0x01, 0x03,
187
+  0x01, 0xff, 0x01, 0xfb, 0x03, 0xff, 0x01, 0xfd, 0x01, 0xde, 0x03, 0xff,
188
+  0x01, 0xe3, 0x07, 0x00, 0x01, 0x1e, 0x01, 0xff, 0x01, 0x80, 0x01, 0x4d,
189
+  0x06, 0xff, 0x01, 0xfa, 0x01, 0x10, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xfb,
190
+  0x02, 0x00, 0x01, 0x5c, 0x04, 0xff, 0x01, 0xe9, 0x01, 0x30, 0x08, 0x00,
191
+  0x01, 0x1c, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x04, 0x01, 0x67, 0x01, 0x86,
192
+  0x01, 0x53, 0x0b, 0x00, 0x01, 0x10, 0xff, 0x00, 0xbd, 0x00, 0x01, 0x02,
193
+  0x01, 0x20, 0x0c, 0x00, 0x01, 0x02, 0x01, 0x32, 0x01, 0x10, 0x02, 0x00,
194
+  0x01, 0x1e, 0x01, 0xe3, 0x0a, 0x00, 0x01, 0x01, 0x01, 0x7c, 0x02, 0xff,
195
+  0x01, 0xfd, 0x01, 0x82, 0x01, 0x00, 0x01, 0xcf, 0x01, 0xf7, 0x0a, 0x00,
196
+  0x01, 0x6e, 0x05, 0xff, 0x01, 0x8a, 0x01, 0xff, 0x01, 0xa0, 0x09, 0x00,
197
+  0x01, 0x08, 0x07, 0xff, 0x01, 0xfc, 0x0a, 0x00, 0x01, 0x6f, 0x01, 0xff,
198
+  0x01, 0xfc, 0x01, 0x50, 0x01, 0x00, 0x01, 0x3a, 0x02, 0xff, 0x01, 0xf1,
199
+  0x09, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x7f,
200
+  0x01, 0xff, 0x01, 0xf5, 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfc,
201
+  0x03, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfd, 0x09, 0x00,
202
+  0x01, 0x0e, 0x01, 0xff, 0x01, 0xf3, 0x03, 0x00, 0x01, 0x0b, 0x03, 0xff,
203
+  0x01, 0x30, 0x08, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00,
204
+  0x01, 0x9f, 0x01, 0xfa, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x80, 0x08, 0x00,
205
+  0x01, 0x7f, 0x01, 0xff, 0x01, 0x80, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff,
206
+  0x01, 0xc0, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x9f,
207
+  0x01, 0xff, 0x01, 0x50, 0x02, 0x00, 0x01, 0x3f, 0x01, 0xfe, 0x01, 0x10,
208
+  0x01, 0x1f, 0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0xaf, 0x01, 0xff,
209
+  0x01, 0x40, 0x01, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xf3, 0x01, 0x00,
210
+  0x01, 0x0f, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff,
211
+  0x01, 0x30, 0x01, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0x50, 0x01, 0x00,
212
+  0x01, 0x0e, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xaf, 0x01, 0xff,
213
+  0x01, 0x30, 0x01, 0x00, 0x01, 0xbf, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x0f,
214
+  0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
215
+  0x01, 0x08, 0x01, 0xff, 0x01, 0xb0, 0x02, 0x00, 0x01, 0x0f, 0x01, 0xff,
216
+  0x01, 0xe0, 0x08, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x60, 0x01, 0x5f,
217
+  0x01, 0xfd, 0x03, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xc0, 0x08, 0x00,
218
+  0x01, 0x4f, 0x01, 0xff, 0x01, 0xa3, 0x01, 0xff, 0x01, 0xe2, 0x03, 0x00,
219
+  0x01, 0x7f, 0x01, 0xff, 0x01, 0x90, 0x08, 0x00, 0x01, 0x0f, 0x01, 0xff,
220
+  0x01, 0xfe, 0x01, 0xff, 0x01, 0x40, 0x03, 0x00, 0x01, 0xcf, 0x01, 0xff,
221
+  0x01, 0x50, 0x08, 0x00, 0x01, 0x0a, 0x02, 0xff, 0x01, 0xf6, 0x03, 0x00,
222
+  0x01, 0x05, 0x01, 0xff, 0x01, 0xfe, 0x09, 0x00, 0x01, 0x02, 0x02, 0xff,
223
+  0x01, 0xb0, 0x03, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xf8, 0x0a, 0x00,
224
+  0x01, 0xbf, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00, 0x01, 0x05, 0x01, 0xef,
225
+  0x01, 0xff, 0x01, 0xd0, 0x09, 0x00, 0x01, 0x04, 0x03, 0xff, 0x01, 0xfc,
226
+  0x01, 0xab, 0x01, 0xef, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x09, 0x00,
227
+  0x01, 0x2f, 0x01, 0xff, 0x01, 0xaf, 0x05, 0xff, 0x01, 0xd2, 0x09, 0x00,
228
+  0x01, 0x01, 0x01, 0xdf, 0x01, 0xf5, 0x01, 0x04, 0x01, 0xbf, 0x03, 0xff,
229
+  0x01, 0xd6, 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0x70, 0x01, 0x00,
230
+  0x01, 0x01, 0x01, 0x46, 0x01, 0x76, 0x01, 0x52, 0x0c, 0x00, 0x01, 0x28,
231
+  0xff, 0x00, 0x48, 0x00, 0x01, 0x14, 0x0b, 0x44, 0x01, 0x41, 0x06, 0x00,
232
+  0x01, 0x8f, 0x0b, 0xff, 0x01, 0xf3, 0x06, 0x00, 0x01, 0xef, 0x0b, 0xff,
233
+  0x01, 0xf3, 0x05, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0xee, 0x09, 0xff,
234
+  0x01, 0xf3, 0x05, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf5, 0x01, 0x00,
235
+  0x01, 0xdf, 0x01, 0xff, 0x01, 0x63, 0x06, 0x33, 0x01, 0x30, 0x05, 0x00,
236
+  0x01, 0x3f, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x00, 0x01, 0xdf, 0x01, 0xff,
237
+  0x01, 0x40, 0x0c, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x80, 0x01, 0x00,
238
+  0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00, 0x01, 0x01, 0x02, 0xff,
239
+  0x01, 0x10, 0x01, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00,
240
+  0x01, 0x07, 0x01, 0xff, 0x01, 0xfa, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xff,
241
+  0x01, 0x40, 0x0b, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf3, 0x02, 0x00,
242
+  0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00, 0x01, 0x4f, 0x01, 0xff,
243
+  0x01, 0xd0, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00,
244
+  0x01, 0xbf, 0x01, 0xff, 0x01, 0x60, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xff,
245
+  0x01, 0x40, 0x0a, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfe, 0x03, 0x00,
246
+  0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0a, 0x00, 0x01, 0x08, 0x01, 0xff,
247
+  0x01, 0xf9, 0x03, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xed, 0x06, 0xdd,
248
+  0x01, 0x80, 0x03, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x03, 0x00,
249
+  0x01, 0xdf, 0x08, 0xff, 0x01, 0xa0, 0x03, 0x00, 0x01, 0x6f, 0x01, 0xff,
250
+  0x01, 0xb0, 0x03, 0x00, 0x01, 0xdf, 0x08, 0xff, 0x01, 0xa0, 0x03, 0x00,
251
+  0x01, 0xcf, 0x01, 0xff, 0x01, 0x40, 0x03, 0x00, 0x01, 0xdf, 0x01, 0xff,
252
+  0x01, 0xa8, 0x06, 0x88, 0x01, 0x50, 0x02, 0x00, 0x01, 0x03, 0x01, 0xff,
253
+  0x01, 0xfe, 0x04, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x09, 0x00,
254
+  0x01, 0x0a, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, 0x01, 0xdf, 0x01, 0xff,
255
+  0x01, 0x40, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf4, 0x04, 0x33,
256
+  0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x09, 0x00, 0x01, 0x7f, 0x08, 0xff,
257
+  0x01, 0x40, 0x09, 0x00, 0x01, 0xef, 0x08, 0xff, 0x01, 0x40, 0x08, 0x00,
258
+  0x01, 0x05, 0x09, 0xff, 0x01, 0x40, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff,
259
+  0x01, 0xf7, 0x05, 0x33, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x08, 0x00,
260
+  0x01, 0x2f, 0x01, 0xff, 0x01, 0xe0, 0x05, 0x00, 0x01, 0xdf, 0x01, 0xff,
261
+  0x01, 0x40, 0x08, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x80, 0x05, 0x00,
262
+  0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x08, 0x00, 0x02, 0xff, 0x01, 0x20,
263
+  0x05, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x06,
264
+  0x01, 0xff, 0x01, 0xfb, 0x06, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xa8,
265
+  0x06, 0x88, 0x01, 0x85, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf4, 0x06, 0x00,
266
+  0x01, 0xdf, 0x08, 0xff, 0x01, 0xf9, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xe0,
267
+  0x06, 0x00, 0x01, 0xdf, 0x08, 0xff, 0x01, 0xf9, 0x01, 0x8d, 0x01, 0xdd,
268
+  0x01, 0x60, 0x06, 0x00, 0x01, 0xbd, 0x08, 0xdd, 0x01, 0xd8, 0xff, 0x00,
269
+  0xe0, 0x00, 0x01, 0x01, 0x01, 0x34, 0x01, 0x31, 0x06, 0x00, 0x01, 0x12,
270
+  0x01, 0x42, 0x01, 0x10, 0x05, 0x00, 0x01, 0x02, 0x01, 0x7b, 0x01, 0xef,
271
+  0x02, 0xff, 0x01, 0xfb, 0x01, 0x60, 0x02, 0x00, 0x01, 0x03, 0x01, 0x9e,
272
+  0x02, 0xff, 0x01, 0xfd, 0x01, 0x81, 0x04, 0x00, 0x01, 0xbf, 0x05, 0xff,
273
+  0x01, 0xfe, 0x01, 0x40, 0x01, 0x01, 0x01, 0x9f, 0x05, 0xff, 0x01, 0x60,
274
+  0x03, 0x00, 0x01, 0xdf, 0x02, 0xff, 0x01, 0xee, 0x03, 0xff, 0x01, 0xf5,
275
+  0x01, 0x1d, 0x03, 0xff, 0x01, 0xef, 0x02, 0xff, 0x01, 0xf8, 0x03, 0x00,
276
+  0x01, 0xdf, 0x01, 0xb6, 0x01, 0x20, 0x01, 0x00, 0x01, 0x01, 0x01, 0x5d,
277
+  0x02, 0xff, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xe7, 0x01, 0x20, 0x01, 0x00,
278
+  0x01, 0x29, 0x02, 0xff, 0x01, 0x50, 0x02, 0x00, 0x01, 0x71, 0x05, 0x00,
279
+  0x01, 0xaf, 0x02, 0xff, 0x01, 0xfb, 0x01, 0x10, 0x03, 0x00, 0x01, 0x4f,
280
+  0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0x0d, 0x02, 0xff, 0x01, 0xd0,
281
+  0x04, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, 0x08, 0x00, 0x01, 0x06,
282
+  0x02, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0xef, 0x01, 0xfd, 0x08, 0x00,
283
+  0x01, 0x03, 0x01, 0xff, 0x01, 0xfd, 0x06, 0x00, 0x01, 0x9f, 0x01, 0xff,
284
+  0x04, 0x00, 0x01, 0x02, 0x01, 0x45, 0x02, 0x66, 0x01, 0x67, 0x01, 0xff,
285
+  0x01, 0xf9, 0x06, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x03, 0x00, 0x01, 0x4a,
286
+  0x06, 0xff, 0x01, 0xfb, 0x03, 0x66, 0x01, 0x67, 0x02, 0x77, 0x01, 0xaf,
287
+  0x01, 0xff, 0x02, 0x00, 0x01, 0x1b, 0x10, 0xff, 0x01, 0x00, 0x01, 0x01,
288
+  0x01, 0xdf, 0x02, 0xff, 0x01, 0xcb, 0x01, 0xa8, 0x01, 0x88, 0x01, 0x89,
289
+  0x0a, 0xff, 0x01, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x40,
290
+  0x03, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfa, 0x08, 0x77, 0x01, 0x00,
291
+  0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x04, 0x00, 0x01, 0x03, 0x01, 0xff,
292
+  0x01, 0xf7, 0x09, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x60, 0x04, 0x00,
293
+  0x01, 0x05, 0x01, 0xff, 0x01, 0xfa, 0x09, 0x00, 0x01, 0x7f, 0x01, 0xff,
294
+  0x01, 0x30, 0x04, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfe, 0x09, 0x00,
295
+  0x01, 0x7f, 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0f, 0x02, 0xff,
296
+  0x01, 0x50, 0x08, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x60, 0x04, 0x00,
297
+  0x01, 0x8f, 0x02, 0xff, 0x01, 0xe1, 0x08, 0x00, 0x01, 0x3f, 0x01, 0xff,
298
+  0x01, 0xd0, 0x03, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfe, 0x01, 0xff,
299
+  0x01, 0xfc, 0x01, 0x10, 0x05, 0x00, 0x01, 0x45, 0x01, 0x00, 0x01, 0x0d,
300
+  0x01, 0xff, 0x01, 0xfc, 0x01, 0x20, 0x01, 0x00, 0x01, 0x01, 0x01, 0x9f,
301
+  0x01, 0xff, 0x01, 0xa2, 0x02, 0xff, 0x01, 0xe6, 0x01, 0x10, 0x02, 0x00,
302
+  0x01, 0x02, 0x01, 0x8d, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x05, 0x02, 0xff,
303
+  0x01, 0xfd, 0x01, 0xab, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x00,
304
+  0x01, 0x3f, 0x02, 0xff, 0x01, 0xfd, 0x01, 0xba, 0x01, 0xbc, 0x02, 0xff,
305
+  0x01, 0xf8, 0x02, 0x00, 0x01, 0x7f, 0x05, 0xff, 0x01, 0xa0, 0x01, 0x00,
306
+  0x01, 0x02, 0x01, 0xcf, 0x06, 0xff, 0x01, 0xf7, 0x02, 0x00, 0x01, 0x03,
307
+  0x01, 0xbf, 0x03, 0xff, 0x01, 0xb4, 0x03, 0x00, 0x01, 0x05, 0x01, 0xbf,
308
+  0x04, 0xff, 0x01, 0xb7, 0x01, 0x10, 0x03, 0x00, 0x01, 0x01, 0x01, 0x46,
309
+  0x01, 0x76, 0x01, 0x41, 0x06, 0x00, 0x01, 0x35, 0x01, 0x67, 0x01, 0x64,
310
+  0x01, 0x20, 0xff, 0x00, 0x48, 0x00, 0x01, 0x34, 0x03, 0x44, 0x01, 0x43,
311
+  0x01, 0x21, 0x0d, 0x00, 0x01, 0xbf, 0x05, 0xff, 0x01, 0xfe, 0x01, 0xb8,
312
+  0x01, 0x40, 0x0a, 0x00, 0x01, 0xbf, 0x07, 0xff, 0x01, 0xfe, 0x01, 0x81,
313
+  0x09, 0x00, 0x01, 0xbf, 0x08, 0xff, 0x01, 0xfe, 0x01, 0x60, 0x08, 0x00,
314
+  0x01, 0xbf, 0x01, 0xff, 0x01, 0x61, 0x02, 0x11, 0x01, 0x23, 0x01, 0x58,
315
+  0x01, 0xcf, 0x02, 0xff, 0x01, 0xf9, 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff,
316
+  0x01, 0x50, 0x04, 0x00, 0x01, 0x02, 0x01, 0x9f, 0x02, 0xff, 0x01, 0x80,
317
+  0x07, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x05, 0x00, 0x01, 0x04,
318
+  0x01, 0xef, 0x01, 0xff, 0x01, 0xf4, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff,
319
+  0x01, 0x50, 0x06, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xfd, 0x07, 0x00,
320
+  0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, 0x01, 0x06, 0x02, 0xff,
321
+  0x01, 0x50, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00,
322
+  0x01, 0xef, 0x01, 0xff, 0x01, 0xb0, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff,
323
+  0x01, 0x50, 0x07, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xf0, 0x06, 0x00,
324
+  0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, 0x01, 0x3f, 0x01, 0xff,
325
+  0x01, 0xf3, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00,
326
+  0x01, 0x0f, 0x01, 0xff, 0x01, 0xf5, 0x04, 0x00, 0x01, 0x23, 0x01, 0x33,
327
+  0x01, 0xcf, 0x01, 0xff, 0x01, 0x73, 0x02, 0x33, 0x01, 0x30, 0x04, 0x00,
328
+  0x01, 0x0d, 0x01, 0xff, 0x01, 0xf6, 0x04, 0x00, 0x01, 0xcf, 0x06, 0xff,
329
+  0x01, 0xf2, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00,
330
+  0x01, 0xcf, 0x06, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0x0b, 0x01, 0xff,
331
+  0x01, 0xf9, 0x04, 0x00, 0x01, 0x9b, 0x01, 0xbb, 0x01, 0xef, 0x01, 0xff,
332
+  0x01, 0xdb, 0x02, 0xbb, 0x01, 0xb1, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff,
333
+  0x01, 0xf8, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00,
334
+  0x01, 0x0d, 0x01, 0xff, 0x01, 0xf7, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff,
335
+  0x01, 0x50, 0x07, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf6, 0x06, 0x00,
336
+  0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
337
+  0x01, 0xf4, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00,
338
+  0x01, 0x5f, 0x01, 0xff, 0x01, 0xf1, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff,
339
+  0x01, 0x50, 0x07, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xd0, 0x06, 0x00,
340
+  0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, 0x01, 0x01, 0x02, 0xff,
341
+  0x01, 0x80, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00,
342
+  0x01, 0x0b, 0x02, 0xff, 0x01, 0x20, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff,
343
+  0x01, 0x50, 0x06, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf9, 0x07, 0x00,
344
+  0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x05, 0x00, 0x01, 0x1a, 0x02, 0xff,
345
+  0x01, 0xe1, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x04, 0x00,
346
+  0x01, 0x29, 0x03, 0xff, 0x01, 0x30, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff,
347
+  0x01, 0xa7, 0x01, 0x77, 0x01, 0x78, 0x01, 0x9a, 0x01, 0xbf, 0x03, 0xff,
348
+  0x01, 0xe3, 0x08, 0x00, 0x01, 0xbf, 0x08, 0xff, 0x01, 0xf9, 0x01, 0x10,
349
+  0x08, 0x00, 0x01, 0xbf, 0x07, 0xff, 0x01, 0xd8, 0x01, 0x10, 0x09, 0x00,
350
+  0x01, 0xad, 0x03, 0xdd, 0x01, 0xdc, 0x01, 0xbb, 0x01, 0xa7, 0x01, 0x41,
351
+  0xff, 0x00, 0x50, 0x00, 0x01, 0x38, 0x01, 0x88, 0x01, 0x81, 0x10, 0x00,
352
+  0x01, 0x0b, 0x01, 0xff, 0x01, 0xfc, 0x03, 0x00, 0x01, 0x5a, 0x01, 0x40,
353
+  0x0c, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xb0, 0x01, 0x04, 0x01, 0xaf,
354
+  0x01, 0xff, 0x01, 0xa0, 0x0c, 0x00, 0x01, 0x1e, 0x01, 0xff, 0x01, 0xfc,
355
+  0x02, 0xff, 0x01, 0xd8, 0x01, 0x20, 0x0c, 0x00, 0x01, 0x07, 0x02, 0xff,
356
+  0x01, 0xfd, 0x01, 0x82, 0x0d, 0x00, 0x01, 0x5a, 0x03, 0xff, 0x01, 0xf4,
357
+  0x0d, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x87, 0x02, 0xff,
358
+  0x01, 0x30, 0x0c, 0x00, 0x01, 0x6f, 0x01, 0xe9, 0x01, 0x30, 0x01, 0x00,
359
+  0x01, 0x8f, 0x01, 0xff, 0x01, 0xe2, 0x0c, 0x00, 0x01, 0x03, 0x03, 0x00,
360
+  0x01, 0x0a, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x0e, 0x00, 0x01, 0x23,
361
+  0x01, 0x44, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xb0, 0x0c, 0x00, 0x01, 0x02,
362
+  0x01, 0x9e, 0x04, 0xff, 0x01, 0xf7, 0x0c, 0x00, 0x01, 0x7f, 0x06, 0xff,
363
+  0x01, 0x30, 0x0a, 0x00, 0x01, 0x09, 0x02, 0xff, 0x01, 0xfe, 0x01, 0xcb,
364
+  0x01, 0xdf, 0x02, 0xff, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0x6f, 0x01, 0xff,
365
+  0x01, 0xfb, 0x01, 0x30, 0x02, 0x00, 0x01, 0x4e, 0x01, 0xff, 0x01, 0xf5,
366
+  0x09, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x70, 0x03, 0x00, 0x01, 0x05,
367
+  0x01, 0xff, 0x01, 0xfd, 0x09, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfa,
368
+  0x05, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x20, 0x08, 0x00, 0x01, 0x0f,
369
+  0x01, 0xff, 0x01, 0xf1, 0x05, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70,
370
+  0x08, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa0, 0x05, 0x00, 0x01, 0x4f,
371
+  0x01, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70,
372
+  0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x9f,
373
+  0x01, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf0,
374
+  0x08, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x30, 0x05, 0x00, 0x01, 0x0e,
375
+  0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x30,
376
+  0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x9f,
377
+  0x01, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xe0,
378
+  0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70, 0x05, 0x00, 0x01, 0x2f,
379
+  0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa0,
380
+  0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x90, 0x08, 0x00, 0x01, 0x0f,
381
+  0x01, 0xff, 0x01, 0xf1, 0x05, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50,
382
+  0x08, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x05,
383
+  0x01, 0xff, 0x01, 0xfe, 0x09, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x60,
384
+  0x03, 0x00, 0x01, 0x3e, 0x01, 0xff, 0x01, 0xf6, 0x0a, 0x00, 0x01, 0x7f,
385
+  0x01, 0xff, 0x01, 0xf9, 0x01, 0x20, 0x01, 0x00, 0x01, 0x07, 0x02, 0xff,
386
+  0x01, 0xb0, 0x0a, 0x00, 0x01, 0x09, 0x02, 0xff, 0x01, 0xfd, 0x01, 0xbd,
387
+  0x02, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x0b, 0x00, 0x01, 0x7f, 0x05, 0xff,
388
+  0x01, 0xb0, 0x0c, 0x00, 0x01, 0x02, 0x01, 0xae, 0x03, 0xff, 0x01, 0xb4,
389
+  0x0f, 0x00, 0x01, 0x35, 0x01, 0x65, 0x01, 0x40, 0xff, 0x00, 0x51, 0x00,
390
+  0x02, 0x55, 0x11, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff,
391
+  0x01, 0x20, 0x10, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff,
392
+  0x01, 0x20, 0x10, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x05, 0xff,
393
+  0x01, 0xed, 0x01, 0xa7, 0x01, 0x10, 0x0b, 0x00, 0x07, 0xff, 0x01, 0xfa,
394
+  0x01, 0x10, 0x0a, 0x00, 0x08, 0xff, 0x01, 0xe2, 0x0a, 0x00, 0x02, 0xff,
395
+  0x01, 0x65, 0x01, 0x55, 0x01, 0x56, 0x01, 0x7a, 0x02, 0xff, 0x01, 0xfe,
396
+  0x01, 0x10, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0x1b,
397
+  0x02, 0xff, 0x01, 0x80, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x04, 0x00,
398
+  0x01, 0xcf, 0x01, 0xff, 0x01, 0xf0, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20,
399
+  0x04, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x09, 0x00, 0x02, 0xff,
400
+  0x01, 0x20, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf6, 0x09, 0x00,
401
+  0x02, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf7,
402
+  0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0d, 0x01, 0xff,
403
+  0x01, 0xf7, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0f,
404
+  0x01, 0xff, 0x01, 0xf6, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x04, 0x00,
405
+  0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20,
406
+  0x04, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xf0, 0x09, 0x00, 0x02, 0xff,
407
+  0x01, 0x20, 0x03, 0x00, 0x01, 0x1b, 0x02, 0xff, 0x01, 0x80, 0x09, 0x00,
408
+  0x02, 0xff, 0x01, 0x65, 0x02, 0x55, 0x01, 0x7a, 0x02, 0xff, 0x01, 0xfe,
409
+  0x01, 0x10, 0x09, 0x00, 0x08, 0xff, 0x01, 0xe2, 0x0a, 0x00, 0x07, 0xff,
410
+  0x01, 0xfa, 0x01, 0x10, 0x0a, 0x00, 0x05, 0xff, 0x01, 0xed, 0x01, 0xa7,
411
+  0x01, 0x10, 0x0b, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff,
412
+  0x01, 0x20, 0x10, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff,
413
+  0x01, 0x20, 0x10, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff,
414
+  0x01, 0x20, 0x10, 0x00, 0x02, 0xcc, 0x01, 0x10, 0xff, 0x00, 0x53, 0x00,
415
+  0x01, 0x02, 0x01, 0x99, 0x01, 0x94, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff,
416
+  0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00,
417
+  0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff,
418
+  0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00,
419
+  0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff,
420
+  0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00,
421
+  0x01, 0x13, 0x01, 0x54, 0x01, 0x20, 0x0b, 0x00, 0x01, 0x03, 0x01, 0xff,
422
+  0x01, 0xf7, 0x01, 0x00, 0x01, 0x5c, 0x02, 0xff, 0x01, 0xfd, 0x01, 0x70,
423
+  0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x01, 0x0a, 0x04, 0xff,
424
+  0x01, 0xfd, 0x01, 0x20, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7,
425
+  0x01, 0xaf, 0x01, 0xff, 0x01, 0xec, 0x01, 0xdf, 0x02, 0xff, 0x01, 0xe1,
426
+  0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfd, 0x01, 0xff, 0x01, 0xc3,
427
+  0x02, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xfc, 0x09, 0x00, 0x01, 0x03,
428
+  0x02, 0xff, 0x01, 0xfa, 0x03, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff,
429
+  0x01, 0x60, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0xe0, 0x04, 0x00,
430
+  0x01, 0x5f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff,
431
+  0x01, 0x60, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf3, 0x08, 0x00,
432
+  0x01, 0x03, 0x02, 0xff, 0x05, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf7,
433
+  0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfc, 0x05, 0x00, 0x01, 0x02,
434
+  0x01, 0xff, 0x01, 0xfb, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf9,
435
+  0x06, 0x00, 0x01, 0xff, 0x01, 0xfd, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff,
436
+  0x01, 0xf8, 0x06, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x08, 0x00, 0x01, 0x03,
437
+  0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xef, 0x01, 0xff, 0x08, 0x00,
438
+  0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xef, 0x01, 0xfe,
439
+  0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf9, 0x06, 0x00, 0x01, 0xff,
440
+  0x01, 0xfd, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfc, 0x05, 0x00,
441
+  0x01, 0x02, 0x01, 0xff, 0x01, 0xfb, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff,
442
+  0x05, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x03,
443
+  0x02, 0xff, 0x01, 0x60, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf3,
444
+  0x08, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0xd0, 0x04, 0x00, 0x01, 0x5f,
445
+  0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0xfa,
446
+  0x03, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, 0x01, 0x60, 0x08, 0x00,
447
+  0x01, 0x03, 0x01, 0xff, 0x01, 0xfd, 0x01, 0xff, 0x01, 0xc3, 0x02, 0x00,
448
+  0x01, 0x6e, 0x01, 0xff, 0x01, 0xfc, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff,
449
+  0x01, 0xf7, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xec, 0x01, 0xcf, 0x02, 0xff,
450
+  0x01, 0xe2, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x01, 0x0b,
451
+  0x04, 0xff, 0x01, 0xfd, 0x01, 0x20, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff,
452
+  0x01, 0xf7, 0x01, 0x00, 0x01, 0x6c, 0x02, 0xff, 0x01, 0xfe, 0x01, 0x70,
453
+  0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00, 0x01, 0x23,
454
+  0x01, 0x54, 0x01, 0x20, 0x0b, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7,
455
+  0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03,
456
+  0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7,
457
+  0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03,
458
+  0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7,
459
+  0x10, 0x00, 0x01, 0x01, 0x01, 0x66, 0x01, 0x63, 0xff, 0x00, 0x6c, 0x00,
460
+  0x01, 0x30, 0x03, 0x00, 0x01, 0x02, 0x0d, 0x00, 0x01, 0x08, 0x01, 0xa0,
461
+  0x02, 0x00, 0x01, 0x01, 0x01, 0xc6, 0x0d, 0x00, 0x01, 0xaf, 0x01, 0xa0,
462
+  0x02, 0x00, 0x01, 0x1d, 0x01, 0xf6, 0x0c, 0x00, 0x01, 0x1c, 0x01, 0xff,
463
+  0x01, 0xa0, 0x01, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xf6, 0x0b, 0x00,
464
+  0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x50, 0x01, 0x00, 0x01, 0x3e,
465
+  0x01, 0xff, 0x01, 0xe2, 0x0b, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xf4,
466
+  0x01, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x20, 0x0a, 0x00,
467
+  0x01, 0x04, 0x01, 0xef, 0x01, 0xfe, 0x01, 0x30, 0x01, 0x00, 0x01, 0x6f,
468
+  0x01, 0xff, 0x01, 0xd1, 0x0b, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xd2,
469
+  0x01, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb, 0x0b, 0x00, 0x01, 0x06,
470
+  0x01, 0xff, 0x01, 0xfc, 0x01, 0x10, 0x01, 0x00, 0x01, 0xaf, 0x01, 0xff,
471
+  0x01, 0xa0, 0x0b, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00,
472
+  0x01, 0xff, 0x01, 0xfa, 0x0c, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf8,
473
+  0x02, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x50, 0x0c, 0x00, 0x01, 0xaf,
474
+  0x01, 0xff, 0x01, 0xa0, 0x01, 0x00, 0x01, 0x1c, 0x01, 0xff, 0x01, 0xf6,
475
+  0x0c, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb, 0x02, 0x00, 0x01, 0xbf,
476
+  0x01, 0xff, 0x01, 0x90, 0x0c, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xd1,
477
+  0x01, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfa, 0x0c, 0x00, 0x01, 0x05,
478
+  0x01, 0xff, 0x01, 0xfd, 0x01, 0x20, 0x01, 0x00, 0x01, 0x8f, 0x01, 0xff,
479
+  0x01, 0xb0, 0x0c, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x00,
480
+  0x01, 0x07, 0x01, 0xff, 0x01, 0xf6, 0x0c, 0x00, 0x01, 0x02, 0x01, 0xef,
481
+  0x01, 0xa0, 0x02, 0x00, 0x01, 0x5f, 0x01, 0xf6, 0x0d, 0x00, 0x01, 0x1d,
482
+  0x01, 0xa0, 0x02, 0x00, 0x01, 0x04, 0x01, 0xe6, 0x0d, 0x00, 0x01, 0x01,
483
+  0x01, 0x60, 0x03, 0x00, 0x01, 0x24, 0xff, 0x00, 0xff, 0x00, 0x46, 0x00,
484
+  0x01, 0x20, 0x03, 0x00, 0x01, 0x20, 0x0d, 0x00, 0x01, 0x01, 0x01, 0xe3,
485
+  0x03, 0x00, 0x01, 0x5d, 0x01, 0x10, 0x0c, 0x00, 0x01, 0x01, 0x01, 0xff,
486
+  0x01, 0x50, 0x02, 0x00, 0x01, 0x5f, 0x01, 0xe2, 0x0c, 0x00, 0x01, 0x01,
487
+  0x01, 0xff, 0x01, 0xf6, 0x02, 0x00, 0x01, 0x5f, 0x01, 0xfe, 0x01, 0x30,
488
+  0x0c, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x80, 0x01, 0x00, 0x01, 0x2e,
489
+  0x01, 0xff, 0x01, 0xf5, 0x0c, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfa,
490
+  0x01, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x60, 0x0c, 0x00,
491
+  0x01, 0x8f, 0x01, 0xff, 0x01, 0xb0, 0x01, 0x00, 0x01, 0x0b, 0x01, 0xff,
492
+  0x01, 0xf9, 0x0c, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x10,
493
+  0x01, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0, 0x0c, 0x00, 0x01, 0x5f,
494
+  0x01, 0xff, 0x01, 0xd1, 0x01, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb,
495
+  0x0c, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x9f,
496
+  0x01, 0xff, 0x01, 0x10, 0x0b, 0x00, 0x01, 0x2d, 0x01, 0xff, 0x01, 0xf3,
497
+  0x01, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, 0x0a, 0x00,
498
+  0x01, 0x03, 0x01, 0xef, 0x01, 0xff, 0x01, 0x40, 0x01, 0x00, 0x01, 0x5f,
499
+  0x01, 0xff, 0x01, 0xd2, 0x0b, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xe3,
500
+  0x01, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x10, 0x0a, 0x00,
501
+  0x01, 0x05, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x01, 0x00, 0x01, 0x9f,
502
+  0x01, 0xff, 0x01, 0xb0, 0x0b, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xc1,
503
+  0x01, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf9, 0x0b, 0x00, 0x01, 0x01,
504
+  0x01, 0xff, 0x01, 0xfa, 0x02, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x70,
505
+  0x0b, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x5f,
506
+  0x01, 0xf6, 0x0c, 0x00, 0x01, 0x01, 0x01, 0xf8, 0x03, 0x00, 0x01, 0x5f,
507
+  0x01, 0x40, 0x0c, 0x00, 0x01, 0x01, 0x01, 0x50, 0x03, 0x00, 0x01, 0x43,
508
+  0xff, 0x00, 0xff, 0x00, 0x38, 0x00, 0x01, 0xad, 0x01, 0xdd, 0x01, 0x40,
509
+  0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf,
510
+  0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50,
511
+  0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0x34,
512
+  0x01, 0x44, 0x01, 0x10, 0x49, 0x00, 0x01, 0x02, 0x01, 0x22, 0x11, 0x00,
513
+  0x01, 0x6f, 0x01, 0xff, 0x11, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x11, 0x00,
514
+  0x01, 0x7f, 0x01, 0xff, 0x01, 0x10, 0x10, 0x00, 0x01, 0x8f, 0x01, 0xff,
515
+  0x01, 0x20, 0x10, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x30, 0x10, 0x00,
516
+  0x01, 0xaf, 0x01, 0xff, 0x01, 0x30, 0x10, 0x00, 0x01, 0xbf, 0x01, 0xff,
517
+  0x01, 0x40, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00,
518
+  0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff,
519
+  0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00,
520
+  0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff,
521
+  0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00,
522
+  0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff,
523
+  0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00,
524
+  0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff,
525
+  0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00,
526
+  0x01, 0x34, 0x01, 0x44, 0x01, 0x10, 0xff, 0x00, 0x69, 0x00, 0x02, 0xdd,
527
+  0x11, 0x00, 0x02, 0xff, 0x11, 0x00, 0x02, 0xff, 0x11, 0x00, 0x02, 0xff,
528
+  0x11, 0x00, 0x02, 0xff, 0x11, 0x00, 0x02, 0x44, 0x37, 0x00, 0x01, 0xbc,
529
+  0x01, 0xcb, 0x11, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x11, 0x00, 0x01, 0xef,
530
+  0x01, 0xfe, 0x11, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x11, 0x00, 0x01, 0xff,
531
+  0x01, 0xfd, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfb, 0x10, 0x00,
532
+  0x01, 0x0c, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0xaf, 0x01, 0xff,
533
+  0x01, 0xd0, 0x0f, 0x00, 0x01, 0x0a, 0x02, 0xff, 0x01, 0x30, 0x0f, 0x00,
534
+  0x01, 0xaf, 0x01, 0xff, 0x01, 0xf4, 0x0f, 0x00, 0x01, 0x09, 0x02, 0xff,
535
+  0x01, 0x40, 0x0f, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xf4, 0x0f, 0x00,
536
+  0x01, 0x03, 0x02, 0xff, 0x01, 0x40, 0x0f, 0x00, 0x01, 0x0a, 0x01, 0xff,
537
+  0x01, 0xf8, 0x10, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00,
538
+  0x01, 0x1f, 0x01, 0xff, 0x01, 0xf0, 0x10, 0x00, 0x01, 0x0f, 0x01, 0xff,
539
+  0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00,
540
+  0x01, 0x05, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0x08, 0x02, 0xff, 0x01, 0x70,
541
+  0x02, 0x00, 0x01, 0x05, 0x01, 0xcf, 0x01, 0xf0, 0x0a, 0x00, 0x01, 0x01,
542
+  0x01, 0xef, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x98, 0x01, 0x8b, 0x02, 0xff,
543
+  0x01, 0xf0, 0x0b, 0x00, 0x01, 0x3f, 0x06, 0xff, 0x01, 0xc0, 0x0b, 0x00,
544
+  0x01, 0x02, 0x01, 0xcf, 0x04, 0xff, 0x01, 0xc5, 0x0d, 0x00, 0x01, 0x03,
545
+  0x01, 0x8b, 0x01, 0xcc, 0x01, 0xb9, 0x01, 0x62, 0xe2, 0x00, 0x01, 0x01,
546
+  0x01, 0x32, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05,
547
+  0x01, 0xfb, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05,
548
+  0x01, 0xfc, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x11, 0x00, 0x01, 0x39,
549
+  0x01, 0xfd, 0x01, 0x42, 0x0e, 0x00, 0x01, 0x05, 0x01, 0xbf, 0x03, 0xff,
550
+  0x01, 0xfb, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x03, 0x01, 0xcf, 0x05, 0xff,
551
+  0x01, 0xf6, 0x0b, 0x00, 0x01, 0x4f, 0x02, 0xff, 0x02, 0xfe, 0x01, 0xce,
552
+  0x01, 0xff, 0x01, 0xf6, 0x0a, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0xe6,
553
+  0x01, 0x05, 0x01, 0xfc, 0x01, 0x00, 0x01, 0x38, 0x01, 0xe6, 0x0a, 0x00,
554
+  0x01, 0x0c, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x01, 0x05, 0x01, 0xfc,
555
+  0x02, 0x00, 0x01, 0x02, 0x0a, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xe1,
556
+  0x01, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0d, 0x00, 0x01, 0xcf, 0x01, 0xff,
557
+  0x01, 0x60, 0x01, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0d, 0x00, 0x02, 0xff,
558
+  0x02, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x04, 0x01, 0xff,
559
+  0x01, 0xfb, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x06,
560
+  0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0c, 0x00,
561
+  0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfb,
562
+  0x0c, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6, 0x02, 0x00, 0x01, 0x05,
563
+  0x01, 0xfc, 0x0c, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00,
564
+  0x01, 0x05, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf9,
565
+  0x02, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x03, 0x01, 0xff,
566
+  0x01, 0xfc, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x0d, 0x00, 0x02, 0xff,
567
+  0x01, 0x10, 0x01, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x0d, 0x00, 0x01, 0xaf,
568
+  0x01, 0xff, 0x01, 0x80, 0x01, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x0d, 0x00,
569
+  0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x01, 0x00, 0x01, 0x05, 0x01, 0xfb,
570
+  0x0d, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x30, 0x01, 0x05,
571
+  0x01, 0xfb, 0x02, 0x00, 0x01, 0x33, 0x0a, 0x00, 0x01, 0x01, 0x01, 0xef,
572
+  0x01, 0xff, 0x01, 0xf9, 0x01, 0x35, 0x01, 0xfb, 0x01, 0x02, 0x01, 0x6c,
573
+  0x01, 0xf6, 0x0b, 0x00, 0x01, 0x2d, 0x06, 0xff, 0x01, 0xf6, 0x0b, 0x00,
574
+  0x01, 0x01, 0x01, 0x9f, 0x05, 0xff, 0x01, 0xf5, 0x0c, 0x00, 0x01, 0x02,
575
+  0x01, 0x8d, 0x03, 0xff, 0x01, 0xc7, 0x01, 0x20, 0x0e, 0x00, 0x01, 0x06,
576
+  0x01, 0xfc, 0x01, 0x20, 0x10, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00,
577
+  0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00,
578
+  0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, 0xf5, 0x00,
579
+  0x01, 0x6b, 0x01, 0xdf, 0x01, 0xfd, 0x01, 0xc9, 0x01, 0x40, 0x0d, 0x00,
580
+  0x01, 0x6e, 0x05, 0xff, 0x01, 0x30, 0x0b, 0x00, 0x01, 0x07, 0x06, 0xff,
581
+  0x01, 0x30, 0x0b, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x85,
582
+  0x01, 0x34, 0x01, 0x7b, 0x01, 0xff, 0x01, 0x30, 0x0b, 0x00, 0x01, 0xaf,
583
+  0x01, 0xff, 0x01, 0xc1, 0x03, 0x00, 0x01, 0x18, 0x01, 0x30, 0x0a, 0x00,
584
+  0x01, 0x01, 0x02, 0xff, 0x01, 0x30, 0x0f, 0x00, 0x01, 0x04, 0x01, 0xff,
585
+  0x01, 0xfd, 0x10, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xfa, 0x10, 0x00,
586
+  0x01, 0x08, 0x01, 0xff, 0x01, 0xf8, 0x10, 0x00, 0x01, 0x09, 0x01, 0xff,
587
+  0x01, 0xf7, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00,
588
+  0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff,
589
+  0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00,
590
+  0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x0e, 0x00, 0x01, 0x0a, 0x07, 0xff,
591
+  0x01, 0xf4, 0x0a, 0x00, 0x01, 0x0a, 0x07, 0xff, 0x01, 0xf4, 0x0a, 0x00,
592
+  0x01, 0x08, 0x01, 0xdd, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfe, 0x03, 0xdd,
593
+  0x01, 0xd4, 0x0c, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00,
594
+  0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff,
595
+  0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00,
596
+  0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff,
597
+  0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00,
598
+  0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff,
599
+  0x01, 0xf6, 0x0e, 0x00, 0x01, 0x4b, 0x01, 0xbb, 0x01, 0xbe, 0x01, 0xff,
600
+  0x01, 0xfd, 0x05, 0xbb, 0x01, 0x70, 0x08, 0x00, 0x01, 0x6f, 0x09, 0xff,
601
+  0x01, 0xa0, 0x08, 0x00, 0x01, 0x6f, 0x09, 0xff, 0x01, 0xa0, 0x08, 0x00,
602
+  0x01, 0x4a, 0x09, 0xaa, 0x01, 0x60, 0xff, 0x00, 0xd2, 0x00, 0x01, 0x30,
603
+  0x07, 0x00, 0x01, 0x01, 0x01, 0x40, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xf5,
604
+  0x07, 0x00, 0x01, 0x1d, 0x01, 0xf4, 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff,
605
+  0x01, 0x40, 0x05, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x30,
606
+  0x07, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x00, 0x01, 0x6b,
607
+  0x01, 0xdd, 0x01, 0xc8, 0x01, 0x20, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfa,
608
+  0x08, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0x8e, 0x03, 0xff, 0x01, 0xfa,
609
+  0x01, 0xdf, 0x01, 0xff, 0x01, 0xa0, 0x09, 0x00, 0x01, 0x5f, 0x07, 0xff,
610
+  0x01, 0xfa, 0x0a, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0xe9, 0x01, 0x55,
611
+  0x01, 0x7c, 0x02, 0xff, 0x01, 0xa0, 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff,
612
+  0x01, 0xfb, 0x01, 0x10, 0x02, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xa0,
613
+  0x0a, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x07,
614
+  0x01, 0xff, 0x01, 0xf2, 0x0a, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x30,
615
+  0x04, 0x00, 0x01, 0xdf, 0x01, 0xf7, 0x0a, 0x00, 0x01, 0x4f, 0x01, 0xfd,
616
+  0x05, 0x00, 0x01, 0x8f, 0x01, 0xfa, 0x0a, 0x00, 0x01, 0x6f, 0x01, 0xfc,
617
+  0x05, 0x00, 0x01, 0x6f, 0x01, 0xfc, 0x0a, 0x00, 0x01, 0x5f, 0x01, 0xfc,
618
+  0x05, 0x00, 0x01, 0x7f, 0x01, 0xfb, 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff,
619
+  0x01, 0x10, 0x04, 0x00, 0x01, 0xbf, 0x01, 0xf8, 0x0a, 0x00, 0x01, 0x0e,
620
+  0x01, 0xff, 0x01, 0x80, 0x03, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf3,
621
+  0x0a, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf5, 0x03, 0x00, 0x01, 0x1d,
622
+  0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x92,
623
+  0x01, 0x00, 0x01, 0x16, 0x01, 0xef, 0x01, 0xff, 0x01, 0x60, 0x0a, 0x00,
624
+  0x01, 0x1d, 0x03, 0xff, 0x01, 0xfe, 0x03, 0xff, 0x01, 0xf4, 0x09, 0x00,
625
+  0x01, 0x01, 0x01, 0xdf, 0x05, 0xff, 0x01, 0xfe, 0x02, 0xff, 0x01, 0x40,
626
+  0x08, 0x00, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfa, 0x01, 0x06, 0x01, 0xdf,
627
+  0x01, 0xff, 0x01, 0xfe, 0x01, 0x81, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf4,
628
+  0x08, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x00, 0x01, 0x01,
629
+  0x01, 0x44, 0x01, 0x20, 0x01, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0x20,
630
+  0x07, 0x00, 0x01, 0x4f, 0x01, 0xfa, 0x07, 0x00, 0x01, 0x4f, 0x01, 0xf8,
631
+  0x08, 0x00, 0x01, 0x05, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x05, 0x01, 0x80,
632
+  0xff, 0x00, 0x84, 0x00, 0x01, 0x01, 0x01, 0x88, 0x01, 0x85, 0x07, 0x00,
633
+  0x01, 0x38, 0x01, 0x88, 0x01, 0x40, 0x07, 0x00, 0x01, 0xcf, 0x01, 0xff,
634
+  0x01, 0x10, 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x07, 0x00,
635
+  0x01, 0x3f, 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0x05, 0x01, 0xff,
636
+  0x01, 0xf8, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf2, 0x05, 0x00,
637
+  0x01, 0x0d, 0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0x02, 0x01, 0xff,
638
+  0x01, 0xfa, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x60, 0x09, 0x00,
639
+  0x01, 0xaf, 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0xef, 0x01, 0xfd,
640
+  0x0a, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x07,
641
+  0x01, 0xff, 0x01, 0xf5, 0x0a, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf4,
642
+  0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x01,
643
+  0x01, 0xef, 0x01, 0xfd, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
644
+  0x0b, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x50, 0x01, 0x00, 0x01, 0x02,
645
+  0x01, 0xff, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xe0,
646
+  0x01, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf3, 0x0c, 0x00, 0x01, 0x06,
647
+  0x01, 0xff, 0x01, 0xf7, 0x01, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xa0,
648
+  0x0a, 0x00, 0x01, 0x2a, 0x02, 0xaa, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10,
649
+  0x01, 0xbf, 0x01, 0xff, 0x01, 0xca, 0x01, 0xaa, 0x01, 0xa5, 0x08, 0x00,
650
+  0x01, 0x4f, 0x04, 0xff, 0x01, 0x83, 0x04, 0xff, 0x01, 0xf8, 0x08, 0x00,
651
+  0x01, 0x3c, 0x02, 0xcc, 0x01, 0xce, 0x01, 0xff, 0x01, 0xfd, 0x01, 0xff,
652
+  0x01, 0xfc, 0x02, 0xcc, 0x01, 0xc6, 0x0b, 0x00, 0x01, 0x03, 0x03, 0xff,
653
+  0x01, 0x70, 0x0f, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xfe, 0x10, 0x00,
654
+  0x01, 0x2f, 0x01, 0xff, 0x01, 0xf5, 0x0c, 0x00, 0x01, 0x01, 0x03, 0x11,
655
+  0x01, 0x1e, 0x01, 0xff, 0x01, 0xf3, 0x03, 0x11, 0x01, 0x10, 0x08, 0x00,
656
+  0x01, 0x4f, 0x09, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x4f, 0x09, 0xff,
657
+  0x01, 0xf8, 0x08, 0x00, 0x01, 0x27, 0x03, 0x77, 0x01, 0x7e, 0x01, 0xff,
658
+  0x01, 0xf8, 0x03, 0x77, 0x01, 0x73, 0x0c, 0x00, 0x01, 0x0e, 0x01, 0xff,
659
+  0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00,
660
+  0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff,
661
+  0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00,
662
+  0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff,
663
+  0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00,
664
+  0x01, 0x08, 0x01, 0x99, 0x01, 0x91, 0xc9, 0x00
665
+};

+ 89
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extras/bitmap2cpp.py View File

@@ -0,0 +1,89 @@
1
+#!/usr/bin/python
2
+
3
+# Written By Marcio Teixeira 2018 - Aleph Objects, Inc.
4
+#
5
+# This program is free software: you can redistribute it and/or modify
6
+# it under the terms of the GNU General Public License as published by
7
+# the Free Software Foundation, either version 3 of the License, or
8
+# (at your option) any later version.
9
+#
10
+# This program is distributed in the hope that it will be useful,
11
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
+# GNU General Public License for more details.
14
+#
15
+# To view a copy of the GNU General Public License, go to the following
16
+# location: <http://www.gnu.org/licenses/>.
17
+
18
+from __future__ import print_function
19
+from PIL import Image
20
+import argparse
21
+import textwrap
22
+
23
+def pack_rle(data):
24
+  """Use run-length encoding to pack the bytes"""
25
+  rle = []
26
+  value = data[0]
27
+  count = 0
28
+  for i in data:
29
+    if i != value or count == 255:
30
+      rle.append(count)
31
+      rle.append(value)
32
+      value = i
33
+      count = 1
34
+    else:
35
+      count += 1
36
+  rle.append(count)
37
+  rle.append(value)
38
+  return rle
39
+
40
+class WriteSource:
41
+  def __init__(self):
42
+    self.values = []
43
+
44
+  def add_pixel(self, value):
45
+    self.values.append(value)
46
+
47
+  def convert_to_4bpp(self, data):
48
+    # Invert the image
49
+    data = map(lambda i: 255 - i, data)
50
+    # Quanitize 8-bit values into 4-bits
51
+    data = map(lambda i: i >> 4, data)
52
+    # Make sure there is an even number of elements
53
+    if (len(data) & 1) == 1:
54
+      result.append(0)
55
+    # Combine each two adjacent values into one
56
+    i = iter(data)
57
+    data = map(lambda a, b: a << 4 | b, i ,i)
58
+    # Pack the data
59
+    data = pack_rle(data)
60
+    # Convert values into hex strings
61
+    return map(lambda a: "0x" + format(a, '02x'), data)
62
+
63
+  def end_row(self):
64
+    # Pad each row into even number of values
65
+    if len(self.values) & 1:
66
+      self.values.append(0)
67
+
68
+  def write(self):
69
+    data = self.convert_to_4bpp(self.values)
70
+    data = ', '.join(data)
71
+    data = textwrap.fill(data, 75, initial_indent = '  ', subsequent_indent = '  ')
72
+
73
+    print("const unsigned char font[] PROGMEM = {")
74
+    print(data);
75
+    print("};")
76
+
77
+if __name__ == "__main__":
78
+  parser = argparse.ArgumentParser(description='Converts a grayscale bitmap into a 16-level RLE packed C array for use as font data')
79
+  parser.add_argument("input")
80
+  args = parser.parse_args()
81
+
82
+  img = Image.open(args.input).convert('L')
83
+
84
+  writer = WriteSource()
85
+  for y in range(img.height):
86
+    for x in range(img.width):
87
+      writer.add_pixel(img.getpixel((x,y)))
88
+    writer.end_row()
89
+  writer.write()

+ 5
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/boot_screen.cpp View File

@@ -62,6 +62,7 @@ void BootScreen::onIdle() {
62 62
     PUSH_SCREEN(StatusScreen);
63 63
   } else {
64 64
     if (!UIFlashStorage::is_valid()) {
65
+      StatusScreen::loadBitmaps();
65 66
       SpinnerDialogBox::show(F("Please wait..."));
66 67
       UIFlashStorage::format_flash();
67 68
       SpinnerDialogBox::hide();
@@ -73,12 +74,16 @@ void BootScreen::onIdle() {
73 74
       if (!MediaPlayerScreen::playBootMedia())
74 75
         showSplashScreen();
75 76
     }
77
+
78
+    StatusScreen::loadBitmaps();
79
+
76 80
     #ifdef LULZBOT_USE_BIOPRINTER_UI
77 81
       GOTO_SCREEN(BioConfirmHomeXYZ);
78 82
       current_screen.forget();
79 83
       PUSH_SCREEN(StatusScreen);
80 84
       PUSH_SCREEN(BioConfirmHomeE);
81 85
     #else
86
+      StatusScreen::setStatusMessage(F(WELCOME_MSG));
82 87
       GOTO_SCREEN(StatusScreen);
83 88
     #endif
84 89
   }

+ 1
- 1
Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/media_player_screen.cpp View File

@@ -161,7 +161,7 @@ void MediaPlayerScreen::playStream(void *obj, media_streamer_func_t *data_stream
161 161
       // everything that is stored in RAMG.
162 162
       cmd.cmd(CMD_DLSTART).execute();
163 163
       DLCache::init();
164
-      StatusScreen::onStartup();
164
+      StatusScreen::loadBitmaps();
165 165
     }
166 166
   #endif // FTDI_API_LEVEL >= 810
167 167
 }

+ 18
- 5
Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/status_screen.cpp View File

@@ -193,8 +193,13 @@ void StatusScreen::draw_temperature(draw_mode_t what) {
193 193
       int8_t(getActualFan_percent(FAN0))
194 194
     );
195 195
 
196
-    const char *idle = PSTR("%-3d C / idle");
197
-    const char *not_idle = PSTR("%-3d / %-3d C");
196
+    #if defined(TOUCH_UI_USE_UTF8) && defined(TOUCH_UI_UTF8_WESTERN_CHARSET)
197
+      const char *idle = PSTR(u8"%3d°C / idle");
198
+      const char *not_idle = PSTR(u8"%3d / %3d°C");
199
+    #else
200
+      const char *idle = PSTR("%3d C / idle");
201
+      const char *not_idle = PSTR("%3d / %3d C");
202
+    #endif
198 203
 
199 204
     sprintf_P(
200 205
       bed_str,
@@ -353,10 +358,14 @@ void StatusScreen::setStatusMessage(const char* message) {
353 358
      .cmd(CLEAR(true,true,true));
354 359
 
355 360
   draw_temperature(BACKGROUND);
361
+  #ifdef TOUCH_UI_USE_UTF8
362
+    load_utf8_bitmaps(cmd);
363
+  #endif
356 364
   draw_progress(BACKGROUND);
357 365
   draw_axis_position(BACKGROUND);
358 366
   draw_status_message(BACKGROUND, message);
359 367
   draw_interaction_buttons(BACKGROUND);
368
+
360 369
   storeBackground();
361 370
 
362 371
   #ifdef UI_FRAMEWORK_DEBUG
@@ -369,9 +378,8 @@ void StatusScreen::setStatusMessage(const char* message) {
369 378
   }
370 379
 }
371 380
 
372
-void StatusScreen::onStartup() {
381
+void StatusScreen::loadBitmaps() {
373 382
   // Load the bitmaps for the status screen
374
-
375 383
   using namespace Theme;
376 384
   constexpr uint32_t base = ftdi_memory_map::RAM_G;
377 385
   CLCD::mem_write_pgm(base + TD_Icon_Info.RAMG_offset,       TD_Icon,       sizeof(TD_Icon));
@@ -379,8 +387,13 @@ void StatusScreen::onStartup() {
379 387
   CLCD::mem_write_pgm(base + Bed_Heat_Icon_Info.RAMG_offset, Bed_Heat_Icon, sizeof(Bed_Heat_Icon));
380 388
   CLCD::mem_write_pgm(base + Fan_Icon_Info.RAMG_offset,      Fan_Icon,      sizeof(Fan_Icon));
381 389
 
382
-  setStatusMessage(F(WELCOME_MSG));
390
+  // Load fonts for internationalization
391
+  #ifdef TOUCH_UI_USE_UTF8
392
+    load_utf8_data(base + UTF8_FONT_OFFSET);
393
+  #endif
394
+}
383 395
 
396
+void StatusScreen::onStartup() {
384 397
   UIFlashStorage::initialize();
385 398
 }
386 399
 

+ 8
- 1
Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/temperature_screen.cpp View File

@@ -32,7 +32,14 @@ using namespace ExtUI;
32 32
 
33 33
 void TemperatureScreen::onRedraw(draw_mode_t what) {
34 34
   widgets_t w(what);
35
-  w.precision(0).color(temp).units(PSTR("C"));
35
+  w.precision(0).color(temp).units(
36
+    PSTR(
37
+    #if defined(TOUCH_UI_USE_UTF8) && defined(TOUCH_UI_UTF8_WESTERN_CHARSET)
38
+      u8"°C"
39
+    #else
40
+      "C"
41
+    #endif
42
+  ));
36 43
   w.heading(         PSTR("Temperature:"));
37 44
   w.button(30, PSTR("Cooldown (All Off)"));
38 45
   #ifndef LULZBOT_DISABLE_TOOLHEAD_HEATER

+ 2
- 0
Marlin/src/lcd/extensible_ui/lib/lulzbot/theme/bitmaps.h View File

@@ -178,4 +178,6 @@ namespace Theme {
178 178
     0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
179 179
     0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00
180 180
   };
181
+
182
+  constexpr PROGMEM uint32_t UTF8_FONT_OFFSET = 10000;
181 183
 }; // namespace Theme

+ 1
- 1
buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu View File

@@ -63,4 +63,4 @@
63 63
         "id": "AutoBuild",
64 64
         "mnemonic": "A"
65 65
     }
66
-]
66
+]

+ 6
- 0
config/default/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/3DFabXYZ/Migbot/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/ADIMLab/Gantry v1/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/ADIMLab/Gantry v2/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/AlephObjects/TAZ4/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Alfawise/U20-bltouch/Configuration_adv.h View File

@@ -1209,6 +1209,12 @@
1209 1209
   //#define TOUCH_UI_PORTRAIT
1210 1210
   //#define TOUCH_UI_MIRRORED
1211 1211
 
1212
+  // Enable UTF8 rendering capabilities.
1213
+  //#define TOUCH_UI_USE_UTF8
1214
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1215
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1216
+  #endif
1217
+
1212 1218
   // Use a numeric passcode for "Screen lock" keypad.
1213 1219
   // (recommended for smaller displays)
1214 1220
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Alfawise/U20/Configuration_adv.h View File

@@ -1208,6 +1208,12 @@
1208 1208
   //#define TOUCH_UI_PORTRAIT
1209 1209
   //#define TOUCH_UI_MIRRORED
1210 1210
 
1211
+  // Enable UTF8 rendering capabilities.
1212
+  //#define TOUCH_UI_USE_UTF8
1213
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1214
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1215
+  #endif
1216
+
1211 1217
   // Use a numeric passcode for "Screen lock" keypad.
1212 1218
   // (recommended for smaller displays)
1213 1219
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/AliExpress/UM2pExt/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Anet/A2/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Anet/A2plus/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Anet/A6/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Anet/A8/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Anet/A8plus/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Anet/E16/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/AnyCubic/i3/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/ArmEd/Configuration_adv.h View File

@@ -1209,6 +1209,12 @@
1209 1209
   //#define TOUCH_UI_PORTRAIT
1210 1210
   //#define TOUCH_UI_MIRRORED
1211 1211
 
1212
+  // Enable UTF8 rendering capabilities.
1213
+  //#define TOUCH_UI_USE_UTF8
1214
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1215
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1216
+  #endif
1217
+
1212 1218
   // Use a numeric passcode for "Screen lock" keypad.
1213 1219
   // (recommended for smaller displays)
1214 1220
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/BIBO/TouchX/cyclops/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/BIBO/TouchX/default/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/BQ/Hephestos/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/BQ/Hephestos_2/Configuration_adv.h View File

@@ -1213,6 +1213,12 @@
1213 1213
   //#define TOUCH_UI_PORTRAIT
1214 1214
   //#define TOUCH_UI_MIRRORED
1215 1215
 
1216
+  // Enable UTF8 rendering capabilities.
1217
+  //#define TOUCH_UI_USE_UTF8
1218
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1219
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1220
+  #endif
1221
+
1216 1222
   // Use a numeric passcode for "Screen lock" keypad.
1217 1223
   // (recommended for smaller displays)
1218 1224
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/BQ/WITBOX/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Cartesio/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Creality/CR-10/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Creality/CR-10S/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Creality/CR-10_5S/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Creality/CR-10mini/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Creality/CR-20 Pro/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Creality/CR-20/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Creality/CR-8/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Creality/Ender-2/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Creality/Ender-3/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Creality/Ender-4/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Creality/Ender-5/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Dagoma/Disco Ultimate/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/EVNOVO (Artillery)/Sidewinder X1/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Einstart-S/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/FYSETC/AIO_II/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/FYSETC/Cheetah 1.2/BLTouch/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/FYSETC/Cheetah 1.2/base/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/FYSETC/Cheetah/BLTouch/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/FYSETC/Cheetah/base/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/FYSETC/F6_13/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Felix/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/FlashForge/CreatorPro/Configuration_adv.h View File

@@ -1204,6 +1204,12 @@
1204 1204
   //#define TOUCH_UI_PORTRAIT
1205 1205
   //#define TOUCH_UI_MIRRORED
1206 1206
 
1207
+  // Enable UTF8 rendering capabilities.
1208
+  //#define TOUCH_UI_USE_UTF8
1209
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1210
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1211
+  #endif
1212
+
1207 1213
   // Use a numeric passcode for "Screen lock" keypad.
1208 1214
   // (recommended for smaller displays)
1209 1215
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/FolgerTech/i3-2020/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Formbot/Raptor/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Formbot/T_Rex_2+/Configuration_adv.h View File

@@ -1209,6 +1209,12 @@
1209 1209
   //#define TOUCH_UI_PORTRAIT
1210 1210
   //#define TOUCH_UI_MIRRORED
1211 1211
 
1212
+  // Enable UTF8 rendering capabilities.
1213
+  //#define TOUCH_UI_USE_UTF8
1214
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1215
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1216
+  #endif
1217
+
1212 1218
   // Use a numeric passcode for "Screen lock" keypad.
1213 1219
   // (recommended for smaller displays)
1214 1220
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Formbot/T_Rex_3/Configuration_adv.h View File

@@ -1209,6 +1209,12 @@
1209 1209
   //#define TOUCH_UI_PORTRAIT
1210 1210
   //#define TOUCH_UI_MIRRORED
1211 1211
 
1212
+  // Enable UTF8 rendering capabilities.
1213
+  //#define TOUCH_UI_USE_UTF8
1214
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1215
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1216
+  #endif
1217
+
1212 1218
   // Use a numeric passcode for "Screen lock" keypad.
1213 1219
   // (recommended for smaller displays)
1214 1220
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Geeetech/A10/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Geeetech/A10M/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Geeetech/A20M/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Geeetech/MeCreator2/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Infitary/i3-M508/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/JGAurora/A1/Configuration_adv.h View File

@@ -1210,6 +1210,12 @@
1210 1210
   //#define TOUCH_UI_PORTRAIT
1211 1211
   //#define TOUCH_UI_MIRRORED
1212 1212
 
1213
+  // Enable UTF8 rendering capabilities.
1214
+  //#define TOUCH_UI_USE_UTF8
1215
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1216
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1217
+  #endif
1218
+
1213 1219
   // Use a numeric passcode for "Screen lock" keypad.
1214 1220
   // (recommended for smaller displays)
1215 1221
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/JGAurora/A5/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/JGAurora/A5S/Configuration_adv.h View File

@@ -1210,6 +1210,12 @@
1210 1210
   //#define TOUCH_UI_PORTRAIT
1211 1211
   //#define TOUCH_UI_MIRRORED
1212 1212
 
1213
+  // Enable UTF8 rendering capabilities.
1214
+  //#define TOUCH_UI_USE_UTF8
1215
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1216
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1217
+  #endif
1218
+
1213 1219
   // Use a numeric passcode for "Screen lock" keypad.
1214 1220
   // (recommended for smaller displays)
1215 1221
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/MakerParts/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Malyan/M150/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Malyan/M200/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Micromake/C1/enhanced/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Mks/Robin/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Mks/Sbase/Configuration_adv.h View File

@@ -1206,6 +1206,12 @@
1206 1206
   //#define TOUCH_UI_PORTRAIT
1207 1207
   //#define TOUCH_UI_MIRRORED
1208 1208
 
1209
+  // Enable UTF8 rendering capabilities.
1210
+  //#define TOUCH_UI_USE_UTF8
1211
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1212
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1213
+  #endif
1214
+
1209 1215
   // Use a numeric passcode for "Screen lock" keypad.
1210 1216
   // (recommended for smaller displays)
1211 1217
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/RapideLite/RL200/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/RigidBot/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/SCARA/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/STM32/Black_STM32F407VET6/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Sanguinololu/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 6
- 0
config/examples/Tevo/Michelangelo/Configuration_adv.h View File

@@ -1205,6 +1205,12 @@
1205 1205
   //#define TOUCH_UI_PORTRAIT
1206 1206
   //#define TOUCH_UI_MIRRORED
1207 1207
 
1208
+  // Enable UTF8 rendering capabilities.
1209
+  //#define TOUCH_UI_USE_UTF8
1210
+  #if ENABLED(TOUCH_UI_USE_UTF8)
1211
+    #define TOUCH_UI_UTF8_WESTERN_CHARSET
1212
+  #endif
1213
+
1208 1214
   // Use a numeric passcode for "Screen lock" keypad.
1209 1215
   // (recommended for smaller displays)
1210 1216
   //#define TOUCH_UI_PASSCODE

+ 0
- 0
config/examples/Tevo/Tarantula Pro/Configuration_adv.h View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save