From 47d19bab407d08927a0c266344467162332a3416 Mon Sep 17 00:00:00 2001 From: Marcio Teixeira Date: Tue, 10 Sep 2019 19:07:03 -0600 Subject: [PATCH] Lulzbot ExtUI Western language support (#15208) Fix #15134 --- Marlin/Configuration_adv.h | 6 + .../lcd/extensible_ui/lib/lulzbot/config.h | 8 +- .../lib/lulzbot/ftdi_eve_lib/basic/commands.h | 1 + .../ftdi_eve_lib/extended/command_processor.h | 58 +- .../ftdi_eve_lib/extended/ftdi_extended.h | 7 +- .../ftdi_eve_lib/extended/screen_types.h | 18 +- .../ftdi_eve_lib/extended/text_box.cpp | 59 +- .../ftdi_eve_lib/extended/unicode/README.txt | 40 ++ .../extended/unicode/font_bitmaps.cpp | 55 ++ .../extended/unicode/font_bitmaps.h | 30 + .../unicode/font_bitmaps/romfont_31.pbm | Bin 0 -> 23570 bytes .../western_char_set_bitmap_31.png | Bin 0 -> 14018 bytes .../western_char_set_bitmap_31.svg | 343 +++++++++ .../extended/unicode/font_size_t.cpp | 46 ++ .../extended/unicode/font_size_t.h | 55 ++ .../extended/unicode/standard_char_set.cpp | 100 +++ .../extended/unicode/standard_char_set.h | 30 + .../ftdi_eve_lib/extended/unicode/unicode.cpp | 190 +++++ .../ftdi_eve_lib/extended/unicode/unicode.h | 106 +++ .../extended/unicode/western_char_set.cpp | 338 +++++++++ .../extended/unicode/western_char_set.h | 29 + .../unicode/western_char_set_bitmap_31.h | 665 ++++++++++++++++++ .../lulzbot/ftdi_eve_lib/extras/bitmap2cpp.py | 89 +++ .../lib/lulzbot/screens/boot_screen.cpp | 5 + .../lulzbot/screens/media_player_screen.cpp | 2 +- .../lib/lulzbot/screens/status_screen.cpp | 23 +- .../lulzbot/screens/temperature_screen.cpp | 9 +- .../extensible_ui/lib/lulzbot/theme/bitmaps.h | 2 + .../auto_build_sublime_menu/Main.sublime-menu | 2 +- config/default/Configuration_adv.h | 6 + .../3DFabXYZ/Migbot/Configuration_adv.h | 6 + .../ADIMLab/Gantry v1/Configuration_adv.h | 6 + .../ADIMLab/Gantry v2/Configuration_adv.h | 6 + .../AlephObjects/TAZ4/Configuration_adv.h | 6 + .../Alfawise/U20-bltouch/Configuration_adv.h | 6 + .../examples/Alfawise/U20/Configuration_adv.h | 6 + .../AliExpress/UM2pExt/Configuration_adv.h | 6 + config/examples/Anet/A2/Configuration_adv.h | 6 + .../examples/Anet/A2plus/Configuration_adv.h | 6 + config/examples/Anet/A6/Configuration_adv.h | 6 + config/examples/Anet/A8/Configuration_adv.h | 6 + .../examples/Anet/A8plus/Configuration_adv.h | 6 + config/examples/Anet/E16/Configuration_adv.h | 6 + .../examples/AnyCubic/i3/Configuration_adv.h | 6 + config/examples/ArmEd/Configuration_adv.h | 6 + .../BIBO/TouchX/cyclops/Configuration_adv.h | 6 + .../BIBO/TouchX/default/Configuration_adv.h | 6 + .../examples/BQ/Hephestos/Configuration_adv.h | 6 + .../BQ/Hephestos_2/Configuration_adv.h | 6 + config/examples/BQ/WITBOX/Configuration_adv.h | 6 + config/examples/Cartesio/Configuration_adv.h | 6 + .../Creality/CR-10/Configuration_adv.h | 6 + .../Creality/CR-10S/Configuration_adv.h | 6 + .../Creality/CR-10_5S/Configuration_adv.h | 6 + .../Creality/CR-10mini/Configuration_adv.h | 6 + .../Creality/CR-20 Pro/Configuration_adv.h | 6 + .../Creality/CR-20/Configuration_adv.h | 6 + .../Creality/CR-8/Configuration_adv.h | 6 + .../Creality/Ender-2/Configuration_adv.h | 6 + .../Creality/Ender-3/Configuration_adv.h | 6 + .../Creality/Ender-4/Configuration_adv.h | 6 + .../Creality/Ender-5/Configuration_adv.h | 6 + .../Dagoma/Disco Ultimate/Configuration_adv.h | 6 + .../Sidewinder X1/Configuration_adv.h | 6 + .../examples/Einstart-S/Configuration_adv.h | 6 + .../FYSETC/AIO_II/Configuration_adv.h | 6 + .../Cheetah 1.2/BLTouch/Configuration_adv.h | 6 + .../Cheetah 1.2/base/Configuration_adv.h | 6 + .../Cheetah/BLTouch/Configuration_adv.h | 6 + .../FYSETC/Cheetah/base/Configuration_adv.h | 6 + .../examples/FYSETC/F6_13/Configuration_adv.h | 6 + config/examples/Felix/Configuration_adv.h | 6 + .../FlashForge/CreatorPro/Configuration_adv.h | 6 + .../FolgerTech/i3-2020/Configuration_adv.h | 6 + .../Formbot/Raptor/Configuration_adv.h | 6 + .../Formbot/T_Rex_2+/Configuration_adv.h | 6 + .../Formbot/T_Rex_3/Configuration_adv.h | 6 + .../examples/Geeetech/A10/Configuration_adv.h | 6 + .../Geeetech/A10M/Configuration_adv.h | 6 + .../Geeetech/A20M/Configuration_adv.h | 6 + .../Geeetech/MeCreator2/Configuration_adv.h | 6 + .../Prusa i3 Pro C/Configuration_adv.h | 6 + .../Prusa i3 Pro W/Configuration_adv.h | 6 + .../Infitary/i3-M508/Configuration_adv.h | 6 + .../examples/JGAurora/A1/Configuration_adv.h | 6 + .../examples/JGAurora/A5/Configuration_adv.h | 6 + .../examples/JGAurora/A5S/Configuration_adv.h | 6 + .../examples/MakerParts/Configuration_adv.h | 6 + .../examples/Malyan/M150/Configuration_adv.h | 6 + .../examples/Malyan/M200/Configuration_adv.h | 6 + .../Micromake/C1/enhanced/Configuration_adv.h | 6 + config/examples/Mks/Robin/Configuration_adv.h | 6 + config/examples/Mks/Sbase/Configuration_adv.h | 6 + .../RapideLite/RL200/Configuration_adv.h | 6 + config/examples/RigidBot/Configuration_adv.h | 6 + config/examples/SCARA/Configuration_adv.h | 6 + .../Black_STM32F407VET6/Configuration_adv.h | 6 + .../examples/Sanguinololu/Configuration_adv.h | 6 + .../Tevo/Michelangelo/Configuration_adv.h | 6 + .../Tevo/Tarantula Pro/Configuration_adv.h | 6 + .../Tornado/V1 (MKS Base)/Configuration_adv.h | 6 + .../V2 (MKS GEN-L)/Configuration_adv.h | 6 + config/examples/TheBorg/Configuration_adv.h | 6 + config/examples/TinyBoy2/Configuration_adv.h | 6 + .../examples/Tronxy/X3A/Configuration_adv.h | 6 + .../Tronxy/X5S-2E/Configuration_adv.h | 6 + .../UltiMachine/Archim1/Configuration_adv.h | 6 + .../UltiMachine/Archim2/Configuration_adv.h | 6 + .../examples/VORONDesign/Configuration_adv.h | 6 + .../Velleman/K8200/Configuration_adv.h | 6 + .../Velleman/K8400/Configuration_adv.h | 6 + .../WASP/PowerWASP/Configuration_adv.h | 6 + .../Wanhao/Duplicator 6/Configuration_adv.h | 6 + .../Duplicator i3 Mini/Configuration_adv.h | 6 + .../delta/Anycubic/Kossel/Configuration_adv.h | 6 + .../Dreammaker/Overlord/Configuration_adv.h | 6 + .../Overlord_Pro/Configuration_adv.h | 6 + .../FLSUN/auto_calibrate/Configuration_adv.h | 6 + .../delta/FLSUN/kossel/Configuration_adv.h | 6 + .../FLSUN/kossel_mini/Configuration_adv.h | 6 + .../Geeetech/Rostock 301/Configuration_adv.h | 6 + .../delta/MKS/SBASE/Configuration_adv.h | 6 + .../Tevo Little Monster/Configuration_adv.h | 6 + .../delta/generic/Configuration_adv.h | 6 + .../delta/kossel_mini/Configuration_adv.h | 6 + .../delta/kossel_xl/Configuration_adv.h | 6 + .../gCreate/gMax1.5+/Configuration_adv.h | 6 + config/examples/makibox/Configuration_adv.h | 6 + .../tvrrug/Round2/Configuration_adv.h | 6 + config/examples/wt150/Configuration_adv.h | 6 + 130 files changed, 2853 insertions(+), 69 deletions(-) create mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/README.txt create mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp create mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps.h create mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.pbm create mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.png create mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.svg create mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_size_t.cpp create mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_size_t.h create mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/standard_char_set.cpp create mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/standard_char_set.h create mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/unicode.cpp create mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/unicode.h create mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set.cpp create mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set.h create mode 100644 Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h create mode 100755 Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extras/bitmap2cpp.py diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index fd61fc7c4..0beb3ef4e 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/config.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/config.h index 5313bb947..8a5876c19 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/config.h +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/config.h @@ -76,6 +76,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED +// Enable UTF8 rendering capabilities. +//#define TOUCH_UI_USE_UTF8 +#ifdef TOUCH_UI_USE_UTF8 + #define TOUCH_UI_UTF8_WESTERN_CHARSET +#endif + // Use a numeric passcode for "Parental lock". // This is a recommended for smaller displays. //#define TOUCH_UI_PASSCODE @@ -90,7 +96,7 @@ //#define DEVELOPER_SCREENS // Maximum feed rate for manual extrusion (mm/s) -//#define MAX_MANUAL_FEEDRATE 240 +#define MAX_MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Sets the SPI speed in Hz diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/basic/commands.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/basic/commands.h index c90452993..b0082867e 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/basic/commands.h +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/basic/commands.h @@ -159,6 +159,7 @@ class CLCD::FontMetrics { uint32_t height; uint32_t ptr; + FontMetrics() {} FontMetrics(uint8_t font) {load(font);} void load(uint8_t font); diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/command_processor.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/command_processor.h index d2b0e309c..b011e9637 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/command_processor.h +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/command_processor.h @@ -67,14 +67,14 @@ class CommandProcessor : public CLCD::CommandFifo { } FORCEDINLINE void linear_widget_box(int16_t &x, int16_t &y, int16_t &w, int16_t &h, bool tracker = false) { - const uint16_t th = widget_thickness()/2; + const uint16_t th = widget_thickness() / 2; if (w > h) { x += tracker ? th * 2.5 : th; - y += h/2 - th/2; + y += (h - th) / 2; w -= tracker ? th * 5.0 : th * 2; h = th; } else { - x += w/2 - th/2; + x += (w - th) / 2; y += tracker ? th * 2.5 : th; w = th; h -= tracker ? th * 5.0 : th * 2; @@ -82,9 +82,9 @@ class CommandProcessor : public CLCD::CommandFifo { } FORCEDINLINE uint16_t circular_widget_box(int16_t &x, int16_t &y, int16_t &w, int16_t &h) { - const uint16_t r = min(w,h)/2; - x += w/2; - y += h/2; + const uint16_t r = min(w,h) / 2; + x += w / 2; + y += h / 2; w = 1; h = 1; return r; @@ -200,22 +200,22 @@ class CommandProcessor : public CLCD::CommandFifo { inline CommandProcessor& rectangle(int16_t x, int16_t y, int16_t w, int16_t h) { using namespace FTDI; CLCD::CommandFifo::cmd(BEGIN(RECTS)); - CLCD::CommandFifo::cmd(VERTEX2F(x*16,y*16)); - CLCD::CommandFifo::cmd(VERTEX2F((x+w)*16,(y+h)*16)); + CLCD::CommandFifo::cmd(VERTEX2F(x * 16, y * 16)); + CLCD::CommandFifo::cmd(VERTEX2F((x + w) * 16, (y + h) * 16)); return *this; } template 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) { CLCD::FontMetrics fm(_font); - const int16_t widget_h = fm.height * 20.0/16; + const int16_t widget_h = fm.height * 20.0 / 16; //const int16_t outer_bar_r = widget_h / 2; //const int16_t knob_r = outer_bar_r - 1.5; // The y coordinate of the toggle is the baseline of the text, // so we must introduce a fudge factor based on the line height to // actually center the control. - const int16_t fudge_y = fm.height*5/16; - CLCD::CommandFifo::toggle(x + h/2, y + h/2 - widget_h/2 + fudge_y, w - h, _font, options, state); + const int16_t fudge_y = fm.height * 5 / 16; + CLCD::CommandFifo::toggle(x + h / 2, y + (h - widget_h) / 2 + fudge_y, w - h, _font, options, state); CLCD::CommandFifo::str(text); return *this; } @@ -286,23 +286,29 @@ class CommandProcessor : public CLCD::CommandFifo { return *this; } + void apply_text_alignment(int16_t &x, int16_t &y, int16_t w, int16_t h, uint16_t options) { + using namespace FTDI; + x += ((options & OPT_CENTERX) ? w / 2 : ((options & OPT_RIGHTX) ? w : 0)); + y += ((options & OPT_CENTERY) ? h / 2 : h); + } + CommandProcessor& number(int16_t x, int16_t y, int16_t w, int16_t h, int32_t n, uint16_t options = FTDI::OPT_CENTER) { using namespace FTDI; - CLCD::CommandFifo::number( - x + ((options & OPT_CENTERX) ? w/2 : ((options & OPT_RIGHTX) ? w : 0)), - y + ((options & OPT_CENTERY) ? h/2 : h), - _font, options, n); + apply_text_alignment(x, y, w, h, options); + CLCD::CommandFifo::number(x, y, _font, options, n); return *this; } template FORCEDINLINE CommandProcessor& text(int16_t x, int16_t y, int16_t w, int16_t h, T text, uint16_t options = FTDI::OPT_CENTER) { using namespace FTDI; - CLCD::CommandFifo::text( - x + ((options & OPT_CENTERX) ? w/2 : ((options & OPT_RIGHTX) ? w : 0)), - y + ((options & OPT_CENTERY) ? h/2 : h), - _font, options); - CLCD::CommandFifo::str(text); + apply_text_alignment(x, y, w, h, options); + #ifdef TOUCH_UI_USE_UTF8 + draw_utf8_text(*this, x, y, text, font_size_t::from_romfont(_font), options); + #else + CLCD::CommandFifo::text(x, y, _font, options); + CLCD::CommandFifo::str(text); + #endif return *this; } @@ -313,8 +319,8 @@ class CommandProcessor : public CLCD::CommandFifo { cmd(BITMAP_TRANSFORM_A(uint32_t(float(256)/scale))); cmd(BITMAP_TRANSFORM_E(uint32_t(float(256)/scale))); } - cmd(BITMAP_SIZE(info.filter, info.wrapx, info.wrapy, info.width*scale, info.height*scale)); - cmd(VERTEX2F((x + w/2 - info.width*scale/2)*16, (y + h/2 - info.height*scale/2)*16)); + cmd(BITMAP_SIZE(info.filter, info.wrapx, info.wrapy, info.width * scale, info.height * scale)); + cmd(VERTEX2F((x + w / 2 - info.width * scale / 2) * 16, (y + h / 2 - info.height * scale / 2) * 16)); if (scale != 1) { cmd(BITMAP_TRANSFORM_A(256)); cmd(BITMAP_TRANSFORM_E(256)); @@ -328,7 +334,13 @@ class CommandProcessor : public CLCD::CommandFifo { bool styleModified = false; if (_btn_style_callback) styleModified = _btn_style_callback(*this, _tag, _style, options, false); CLCD::CommandFifo::button(x, y, w, h, _font, options); - CLCD::CommandFifo::str(text); + #ifdef TOUCH_UI_USE_UTF8 + apply_text_alignment(x, y, w, h, OPT_CENTER); + CLCD::CommandFifo::str(F("")); + draw_utf8_text(*this, x, y, text, font_size_t::from_romfont(_font), OPT_CENTER); + #else + CLCD::CommandFifo::str(text); + #endif if (_btn_style_callback && styleModified) _btn_style_callback(*this, _tag, _style, options, true); return *this; } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/ftdi_extended.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/ftdi_extended.h index 02a8738e9..329bea46f 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/ftdi_extended.h +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/ftdi_extended.h @@ -30,14 +30,19 @@ #endif #ifdef FTDI_EXTENDED + #include "unicode/font_size_t.h" + #include "unicode/unicode.h" + #include "unicode/standard_char_set.h" + #include "unicode/western_char_set.h" + #include "unicode/font_bitmaps.h" #include "rgb_t.h" #include "bitmap_info.h" #include "tiny_timer.h" #include "grid_layout.h" #include "dl_cache.h" - #include "screen_types.h" #include "event_loop.h" #include "command_processor.h" + #include "screen_types.h" #include "sound_player.h" #include "sound_list.h" #include "polygon.h" diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/screen_types.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/screen_types.h index ede0a9218..c7ef3cd61 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/screen_types.h +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/screen_types.h @@ -156,8 +156,11 @@ class UncachedScreen { public: static void onRefresh() { using namespace FTDI; - CLCD::CommandFifo cmd; + CommandProcessor cmd; cmd.cmd(CMD_DLSTART); + #ifdef TOUCH_UI_USE_UTF8 + load_utf8_bitmaps(cmd); + #endif current_screen.onRedraw(BOTH); @@ -183,9 +186,12 @@ class CachedScreen { static void repaintBackground() { using namespace FTDI; DLCache dlcache(DL_SLOT); - CLCD::CommandFifo cmd; + CommandProcessor cmd; cmd.cmd(CMD_DLSTART); + #ifdef TOUCH_UI_USE_UTF8 + load_utf8_bitmaps(cmd); + #endif current_screen.onRedraw(BACKGROUND); dlcache.store(DL_SIZE); @@ -195,14 +201,16 @@ class CachedScreen { static void onRefresh() { using namespace FTDI; DLCache dlcache(DL_SLOT); - CLCD::CommandFifo cmd; + CommandProcessor cmd; cmd.cmd(CMD_DLSTART); if (dlcache.has_data()) { dlcache.append(); - } - else { + } else { + #ifdef TOUCH_UI_USE_UTF8 + load_utf8_bitmaps(cmd); + #endif current_screen.onRedraw(BACKGROUND); dlcache.store(DL_SIZE); } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/text_box.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/text_box.cpp index 69b3b7d7a..3760e3a5c 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/text_box.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/text_box.cpp @@ -29,41 +29,33 @@ namespace FTDI { * be broken so that the display width is less than w. The line will also * be broken after a '\n'. Returns the display width of the line. */ - static uint16_t find_line_break(const CLCD::FontMetrics &fm, uint16_t w, const char *str, const char *&end) { + static uint16_t find_line_break(const FontMetrics &fm, uint16_t w, const char *str, const char *&end) { + w -= fm.get_char_width(' '); const char *p = str; - end = str + strlen(str); - uint16_t width = fm.get_text_width(str); + end = str; + uint16_t lw = 0, result = 0; for(;;) { - // Find next tentative line break. - char delim = *(p); - while (delim && delim != ' ' && delim != '\n') { - delim = *(++p); - } - // Check to see whether to break the line. - const uint16_t margin = fm.get_text_width(" "); - const uint16_t lw = p > str ? fm.get_text_width(str, p - str) + margin : 0; - if (lw < w) { - width = lw; - switch (delim) { - case '\0': - end = p; - break; - case '\n': - end = ++p; - break; - case ' ': - end = ++p; - continue; + utf8_char_t c = get_utf8_char_and_inc(p); + if (c == ' ' || c == '\n' || c == '\0') { + if (lw < w || end == str) { + end = (c == '\0') ? p-1 : p; + result = lw; } + if (c == '\0' || c == '\n') break; } - return width; + lw += fm.get_char_width(c); + } + if (end == str) { + end = p-1; + result = lw; } + return result; } /** * This function returns a measurements of the word-wrapped text box. */ - static void measure_text_box(const CLCD::FontMetrics &fm, const char *str, uint16_t &width, uint16_t &height) { + static void measure_text_box(const FontMetrics &fm, const char *str, uint16_t &width, uint16_t &height) { const char *line_start = (const char*)str; const char *line_end; const uint16_t wrap_width = width; @@ -72,7 +64,7 @@ namespace FTDI { uint16_t line_width = find_line_break(fm, wrap_width, line_start, line_end); if (line_end == line_start) break; width = max(width, line_width); - height += fm.height; + height += fm.get_height(); line_start = line_end; } } @@ -81,10 +73,11 @@ namespace FTDI { * This function draws text inside a bounding box, doing word wrapping and using the largest font that will fit. */ void draw_text_box(CommandProcessor& cmd, int x, int y, int w, int h, const char *str, uint16_t options, uint8_t font) { - CLCD::FontMetrics fm(font); - uint16_t box_width, box_height; + FontMetrics fm(font); + + // Shrink the font until we find a font that fits for(;;) { box_width = w; measure_text_box(fm, str, box_width, box_height); @@ -110,10 +103,14 @@ namespace FTDI { if (line[line_len - 1] == '\n' || line[line_len - 1] == ' ') line[line_len - 1] = 0; - cmd.CLCD::CommandFifo::text(x + dx, y + dy, font, options & ~OPT_CENTERY); - cmd.CLCD::CommandFifo::str(line); + #ifdef TOUCH_UI_USE_UTF8 + draw_utf8_text(cmd, x + dx, y + dy, line, fm.fs, options & ~OPT_CENTERY); + #else + cmd.CLCD::CommandFifo::text(x + dx, y + dy, font, options & ~OPT_CENTERY); + cmd.CLCD::CommandFifo::str(line); + #endif } - y += fm.height; + y += fm.get_height(); line_start = line_end; } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/README.txt b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/README.txt new file mode 100644 index 000000000..818bf08ce --- /dev/null +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/README.txt @@ -0,0 +1,40 @@ + +FTDI EVE Unicode Rendering +-------------------------- + +The FTDI EVE chips have several fonts in ROM, but these fonts only contain a +subset of ASCII characters. Notably, this excludes diacritics and accents +used in most Western languages. + +While the FTDI EVE has the capability for user-defined fonts, such fonts only +support 127 character positions, making them as limiting as the built-in fonts. + +As a further complication, high resolution TFT displays require high resolution +fonts. It is not feasible to put a complete international font into the limited +flash memory of most microprocessors. + +To work around these limitations, this library uses a custom font renderer with +the following characteristics: + + 1) Rather than providing bitmaps for different font sizes, it uses a single + bitmap for the largest font size (romfont 31) and emulates other sizes by + scaling the bitmaps using BITMAP_TRANSFORM. + + 2) Rather than loading an entire font, it combines symbols from romfont 31 + with a limited number of symbols from a custom font. For accented letters, + the rendering code combine basic letter shapes from romfont 31 with + bitmaps containing only the accent themselves. + + 3) The custom bitmap is RLE compressed into PROGMEM. For accents, which have + a fairly small number of non-white pixels, the savings are significant. + +These characteristics enable an alphabet for Western languages to be +synthesized from only a few dozen custom symbols and modest PROGMEM use (~10k) + +The text layout is done by the code in "unicode.cpp" with the help of one of +more character renderers (e.g. "western_char_set.cpp"). Each character render +is responsible for loading the necessary bitmap data into RAMG and drawing +characters as requested. + +To add symbols for other languages, it will only be necessary to make a bitmap +and implement a corresponding character renderer. diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp new file mode 100644 index 000000000..de1d4a600 --- /dev/null +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp @@ -0,0 +1,55 @@ +/******************* + * font_bitmap.cpp * + *******************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../ftdi_extended.h" + +#ifdef FTDI_EXTENDED + +namespace FTDI { + + void write_rle_data(uint16_t addr, const uint8_t *data, size_t n) { + for (; n > 2; n -= 2) { + uint8_t count = pgm_read_byte(data++); + uint8_t value = pgm_read_byte(data++); + while (count--) CLCD::mem_write_8(addr++, value); + } + } + + void set_font_bitmap(CommandProcessor& cmd, CLCD::FontMetrics &fm, uint8_t handle) { + cmd.cmd(BITMAP_HANDLE(handle)); + cmd.cmd(BITMAP_SOURCE(fm.ptr)); + cmd.bitmap_layout(fm.format, fm.stride, fm.height); + cmd.bitmap_size(BILINEAR, BORDER, BORDER, fm.width, fm.height); + } + + void ext_vertex2ii(CommandProcessor &cmd, int x, int y, uint8_t handle, uint8_t cell) { + if (x < 0 || y < 0 || x > 511 || y > 511) { + cmd.cmd(BITMAP_HANDLE(handle)); + cmd.cmd(CELL(cell)); + cmd.cmd(VERTEX2F(x * 16, y * 16)); + } else { + cmd.cmd(VERTEX2II(x, y, handle, cell)); + } + } + +} // namespace FTDI + +#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps.h new file mode 100644 index 000000000..85ece6b77 --- /dev/null +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps.h @@ -0,0 +1,30 @@ +/****************** + * font_bitmaps.h * + ******************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +class CommandProcessor; + +namespace FTDI { + void write_rle_data(uint16_t addr, const uint8_t *data, size_t n); + void set_font_bitmap(CommandProcessor& cmd, CLCD::FontMetrics &fm, uint8_t handle); + void ext_vertex2ii(CommandProcessor &cmd, int x, int y, uint8_t handle, uint8_t cell); +} diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.pbm b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.pbm new file mode 100644 index 0000000000000000000000000000000000000000..39cb67034f36f46ee251359a602fddeb48bbc6d9 GIT binary patch literal 23570 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

G>DC*>Yg5!VGd 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 literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.svg b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.svg new file mode 100644 index 000000000..1ff1445f7 --- /dev/null +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.svg @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + ̀ ́ ̂ ̃ ̈ ̊ ̧ıßØøÆæÐðÞþ«»¡¿¢£¤¥ + + + + + + + + diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_size_t.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_size_t.cpp new file mode 100644 index 000000000..f9b421b39 --- /dev/null +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_size_t.cpp @@ -0,0 +1,46 @@ +/******************* + * font_size_t.cpp * + *******************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../ftdi_extended.h" + +#if defined(FTDI_EXTENDED) && defined(TOUCH_UI_USE_UTF8) + +namespace FTDI { + // Returns the height of a standard FTDI romfont + uint8_t font_size_t::get_romfont_height(uint8_t font) { + static const uint8_t tbl[] PROGMEM = { + 8, 8, 16, 16, 13, 17, 20, 22, 29, 38, 16, 20, 25, 28, 36, 49, 63, 83, 108 + }; + return pgm_read_byte(&tbl[font - 16]); + } + + // Sets the scaling coefficient to match a romfont size + font_size_t font_size_t::from_romfont(uint8_t font) { + return font_size_t(uint32_t(std_height) * 256 / get_romfont_height(font)); + } + + // Returns the height of the font + uint8_t font_size_t::get_height() const { + return scale(std_height); + } +} + +#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8 diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_size_t.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_size_t.h new file mode 100644 index 000000000..9cf6c181f --- /dev/null +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/font_size_t.h @@ -0,0 +1,55 @@ +/***************** + * font_size_t.h * + *****************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +class CommandProcessor; + +namespace FTDI { + + /* The unicode rendering of different font sizes happens by scaling a + * large-sized font bitmap using the FTDI bitmap transformation matrix. + * This keeps us from having to have load bitmaps for all font sizes. + * + * The font_size_t class helps manage this scaling factor. + */ + class font_size_t { + private: + // Standard height for font bitmaps + static constexpr uint8_t std_height = 49; + + // 8.8 fixed point scaling coefficient + uint16_t coefficient; + + font_size_t(uint16_t v) : coefficient(v) {} + public: + font_size_t() : coefficient(256) {} + + static uint8_t get_romfont_height(uint8_t font); + + static font_size_t from_romfont(uint8_t size); + + template T scale(T val) const {return (int32_t(val) * 256 / coefficient);} + + uint8_t get_height() const; + uint16_t get_coefficient() const {return coefficient;} + }; +} diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/standard_char_set.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/standard_char_set.cpp new file mode 100644 index 000000000..0c1a07b7d --- /dev/null +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/standard_char_set.cpp @@ -0,0 +1,100 @@ +/************************* + * standard_char_set.cpp * + *************************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../ftdi_extended.h" + +#if defined(FTDI_EXTENDED) && defined(TOUCH_UI_USE_UTF8) + + constexpr static uint8_t std_font = 31; + + /* Lookup table of the char widths for standard ROMFONT 31 */ + + uint8_t FTDI::StandardCharSet::std_char_width(char c) { + static const uint8_t tbl[] PROGMEM = { + 10, 11, 15, 26, 25, 31, 26, 10, 15, 14, 18, 24, 9, 18, 11, 17, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 10, 10, 21, 23, 22, 20, 37, 27, 27, 26, + 28, 23, 22, 28, 29, 12, 23, 26, 22, 35, 29, 28, 26, 29, 27, 26, 26, 28, + 27, 36, 27, 26, 25, 12, 18, 12, 18, 21, 13, 23, 24, 22, 24, 22, 15, 24, + 24, 10, 11, 22, 10, 36, 24, 24, 24, 24, 15, 22, 14, 24, 21, 32, 21, 21, + 22, 15, 10, 15, 29, 10 + }; + return pgm_read_byte(&tbl[c - ' ']); + } + + /** + * Load bitmap data into RAMG. This function is called once at the start + * of the program. + * + * Parameters: + * + * addr - Address in RAMG where the font data is written + */ + + void FTDI::StandardCharSet::load_data(uint32_t) { + } + + /** + * Populates the bitmap handles for the custom into the display list. + * This function is called once at the start of each display list. + * + * Parameters: + * + * cmd - Object used for writing to the FTDI chip command queue. + */ + + void FTDI::StandardCharSet::load_bitmaps(CommandProcessor& cmd) { + CLCD::FontMetrics std_fm(std_font); + set_font_bitmap(cmd, std_fm, std_font); + } + + /** + * Renders a character at location x and y. The x position is incremented + * by the width of the character. + * + * Parameters: + * + * cmd - If non-NULL the symbol is drawn to the screen. + * If NULL, only increment position for text measurement. + * + * x, y - The location at which to draw the character. On output, + * incremented to the location of the next character. + * + * fs - A scaling object used to scale the font. The display will + * already be configured to scale bitmaps, but positions + * must be scaled using fs.scale() + * + * c - The unicode code point to draw. If the renderer does not + * support the character, it should draw nothing. + */ + + bool FTDI::StandardCharSet::render_glyph(CommandProcessor* cmd, int &x, int &y, font_size_t fs, utf8_char_t c) { + uint8_t which = (c >= ' ' && c < 128) ? c : '?'; + uint8_t width = std_char_width(which); + + // Draw the character + if (cmd) ext_vertex2ii(*cmd, x, y, std_font, which); + + // Increment X to the next character position + x += fs.scale(width); + return true; + } + +#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/standard_char_set.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/standard_char_set.h new file mode 100644 index 000000000..17ccfe6e3 --- /dev/null +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/standard_char_set.h @@ -0,0 +1,30 @@ +/*********************** + * standard_char_set.h * + ***********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +namespace FTDI { + class StandardCharSet { + public: + static uint8_t std_char_width(char); + static void load_data(uint32_t addr); + static void load_bitmaps(CommandProcessor&); + static bool render_glyph(CommandProcessor*, int &x, int &y, font_size_t, utf8_char_t); + }; +} diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/unicode.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/unicode.cpp new file mode 100644 index 000000000..48b0883fa --- /dev/null +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/unicode.cpp @@ -0,0 +1,190 @@ +/*************** + * unicode.cpp * + ***************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../ftdi_extended.h" + +#if defined(FTDI_EXTENDED) && defined(TOUCH_UI_USE_UTF8) + + using namespace FTDI; + + /** + * Return a character in a UTF8 string and increment the + * pointer to the next character + * + * Parameters: + * + * c - Pointer to a UTF8 encoded string. + * + * Returns: The packed bytes of a UTF8 encoding of a single + * character (this is not the unicode codepoint) + */ + + utf8_char_t FTDI::get_utf8_char_and_inc(const char *&c) { + utf8_char_t val = *(uint8_t*)c++; + while ((*c & 0xC0) == 0x80) + val = (val << 8) | *(uint8_t*)c++; + return val; + } + + /** + * Helper function to draw and/or measure a UTF8 string + * + * Parameters: + * + * cmd - If non-NULL the symbol is drawn to the screen. + * If NULL, only increment position for text measurement. + * + * x, y - The location at which to draw the string. + * + * str - The UTF8 string to draw or measure. + * + * fs - A scaling object used to specify the font size. + */ + + static uint16_t render_utf8_text(CommandProcessor* cmd, int x, int y, const char *str, font_size_t fs) { + const int start_x = x; + while (*str) { + const utf8_char_t c = get_utf8_char_and_inc(str); + #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET + WesternCharSet::render_glyph(cmd, x, y, fs, c) || + #endif + StandardCharSet::render_glyph(cmd, x, y, fs, c); + } + return x - start_x; + } + + /** + * Load the font bitmap data into RAMG. Called once at program start. + * + * Parameters: + * + * addr - Address in RAMG where the font data is written + */ + + void FTDI::load_utf8_data(uint16_t addr) { + #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET + WesternCharSet::load_data(addr); + #endif + StandardCharSet::load_data(addr); + } + + /** + * Populate the bitmap handles for the custom fonts into the display list. + * Called once at the start of each display list. + * + * Parameters: + * + * cmd - Object used for writing to the FTDI chip command queue. + */ + + void FTDI::load_utf8_bitmaps(CommandProcessor &cmd) { + #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET + WesternCharSet::load_bitmaps(cmd); + #endif + StandardCharSet::load_bitmaps(cmd); + } + + /** + * Measure a UTF8 text character + * + * Parameters: + * + * c - The unicode code point to measure. + * + * fs - A scaling object used to specify the font size. + * + * Returns: A width in pixels + */ + + uint16_t FTDI::get_utf8_char_width(utf8_char_t c, font_size_t fs) { + int x = 0, y = 0; + #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET + WesternCharSet::render_glyph(NULL, x, y, fs, c) || + #endif + StandardCharSet::render_glyph(NULL, x, y, fs, c); + return x; + } + + /** + * Measure a UTF8 text string + * + * Parameters: + * + * str - The UTF8 string to measure. + * + * fs - A scaling object used to specify the font size. + * + * Returns: A width in pixels + */ + + uint16_t FTDI::get_utf8_text_width(const char *str, font_size_t fs) { + return render_utf8_text(NULL, 0, 0, str, fs); + } + + uint16_t FTDI::get_utf8_text_width(progmem_str pstr, font_size_t fs) { + char str[strlen_P((const char*)pstr) + 1]; + strcpy_P(str, (const char*)pstr); + return get_utf8_text_width((const char*) pstr, fs); + } + + /** + * Draw a UTF8 text string + * + * Parameters: + * + * cmd - Object used for writing to the FTDI chip command queue. + * + * x, y - The location at which to draw the string. + * + * str - The UTF8 string to draw. + * + * fs - A scaling object used to specify the font size. + * + * options - Text alignment options (i.e. OPT_CENTERX, OPT_CENTERY, OPT_CENTER or OPT_RIGHTX) + * + */ + + void FTDI::draw_utf8_text(CommandProcessor& cmd, int x, int y, const char *str, font_size_t fs, uint16_t options) { + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(BITMAP_TRANSFORM_A(fs.get_coefficient())); + cmd.cmd(BITMAP_TRANSFORM_E(fs.get_coefficient())); + cmd.cmd(BEGIN(BITMAPS)); + + // Apply alignment options + if (options & OPT_CENTERX) + x -= get_utf8_text_width(str, fs) / 2; + else if (options & OPT_RIGHTX) + x -= get_utf8_text_width(str, fs); + if (options & OPT_CENTERY) + y -= fs.get_height()/2; + + // Render the text + render_utf8_text(&cmd, x, y, str, fs); + cmd.cmd(RESTORE_CONTEXT()); + } + + void FTDI::draw_utf8_text(CommandProcessor& cmd, int x, int y, progmem_str pstr, font_size_t fs, uint16_t options) { + char str[strlen_P((const char*)pstr) + 1]; + strcpy_P(str, (const char*)pstr); + draw_utf8_text(cmd, x, y, (const char*) str, fs, options); + } + +#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8 diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/unicode.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/unicode.h new file mode 100644 index 000000000..0b9c8f1ce --- /dev/null +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/unicode.h @@ -0,0 +1,106 @@ +/************* + * unicode.h * + *************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +class CommandProcessor; + +namespace FTDI { + #ifdef TOUCH_UI_USE_UTF8 + typedef uint16_t utf8_char_t; + + /** + * Converts a 32-bit codepoint into UTF-8. This compile-time function + * will be useful until the u8'a' character literal becomes more common. + */ + constexpr uint32_t utf8(const uint32_t c) { + return (c < 0x7F ) ? c : + (c < 0x7FF) ? (0x0000C080 | ((c & 0b011111000000) << 2) | (c & 0b111111)) : + (c < 0xFFFF) ? (0x00E08080 | ((c & 0b001111000000000000) << 4) | ((c & 0b111111000000) << 2) | (c & 0b111111)) : + (0xF0808080 | ((c & 0b000111000000000000000000) << 6) | ((c & 0b111111000000000000) << 4) | ((c & 0b111111000000) << 2) | (c & 0b111111)); + } + + /* Returns the next character in a UTF8 string and increments the + * pointer to the next character */ + + utf8_char_t get_utf8_char_and_inc(const char *&c); + + /* Returns the next character in a UTF8 string, without incrementing */ + + inline utf8_char_t get_utf8_char(const char *c) {return get_utf8_char_and_inc(c);} + + void load_utf8_data(uint16_t addr); + #else + typedef char utf8_char_t; + + inline utf8_char_t get_utf8_char_and_inc(const char *&c) {return *c++;} + inline utf8_char_t get_utf8_char(const char *c) {return *c;} + + inline void load_utf8_data(uint16_t) {} + #endif + + void load_utf8_bitmaps(CommandProcessor& cmd); + + uint16_t get_utf8_char_width(utf8_char_t, font_size_t); + uint16_t get_utf8_text_width(progmem_str, font_size_t); + uint16_t get_utf8_text_width(const char *, font_size_t); + + void draw_utf8_text(CommandProcessor&, int x, int y, progmem_str, font_size_t, uint16_t options = 0); + void draw_utf8_text(CommandProcessor&, int x, int y, const char *, font_size_t, uint16_t options = 0); + + // Similar to CLCD::FontMetrics, but can be used with UTF8 encoded strings. + + struct FontMetrics { + #ifdef TOUCH_UI_USE_UTF8 + font_size_t fs; + #else + CLCD::FontMetrics fm; + #endif + + inline void load(uint8_t rom_font_size) { + #ifdef TOUCH_UI_USE_UTF8 + fs = font_size_t::from_romfont(rom_font_size); + #else + fm.load(rom_font_size); + #endif + } + + inline uint16_t get_char_width(utf8_char_t c) const { + #ifdef TOUCH_UI_USE_UTF8 + return get_utf8_char_width(c, fs); + #else + return fm.char_widths[(uint8_t)c]; + #endif + } + + inline uint8_t get_height() const { + #ifdef TOUCH_UI_USE_UTF8 + return fs.get_height(); + #else + return fm.height; + #endif + } + + inline FontMetrics(uint8_t rom_font_size) { + load(rom_font_size); + } + }; +} diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set.cpp new file mode 100644 index 000000000..7554582dd --- /dev/null +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set.cpp @@ -0,0 +1,338 @@ +/************************ + * western_char_set.cpp * + ************************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../ftdi_extended.h" + +#if defined(FTDI_EXTENDED) && defined(TOUCH_UI_USE_UTF8) && defined(TOUCH_UI_UTF8_WESTERN_CHARSET) + #include "western_char_set_bitmap_31.h" + + #define NUM_ELEMENTS(a) (sizeof(a)/sizeof(a[0])) + + using namespace FTDI; + + constexpr static uint8_t std_font = 31; + constexpr static uint8_t alt_font = 1; + + static uint32_t bitmap_addr; + + /* Glyphs in the WesternCharSet bitmap */ + + enum { + GRAVE, + ACUTE, + CIRCUMFLEX, + TILDE, + DIAERESIS, + DOT_ABOVE, + CEDILLA, + NO_DOT_I, + SHARP_S, + LRG_O_STROKE, + SML_O_STROKE, + LRG_AE, + SML_AE, + LRG_ETH, + SML_ETH, + LRG_THORN, + SML_THORN, + LEFT_DBL_QUOTE, + RIGHT_DBL_QUOTE, + INV_EXCLAMATION, + INV_QUESTION, + CENT_SIGN, + POUND_SIGN, + CURRENCY_SIGN, + YEN_SIGN + }; + + /* Centerline of characters that can take accents */ + + constexpr int8_t mid_a = 12; + constexpr int8_t mid_e = 12; + constexpr int8_t mid_i = 5; + constexpr int8_t mid_o = 12; + constexpr int8_t mid_u = 12; + constexpr int8_t mid_y = 11; + constexpr int8_t mid_n = 12; + constexpr int8_t mid_c = 12; + constexpr int8_t mid_A = 13; + constexpr int8_t mid_E = 13; + constexpr int8_t mid_I = 6; + constexpr int8_t mid_O = 14; + constexpr int8_t mid_U = 14; + constexpr int8_t mid_Y = 13; + constexpr int8_t mid_N = 15; + constexpr int8_t mid_C = 13; + + /* Centerline of accent glyphs */ + + constexpr int8_t mid_accent = 16; + + /* When reusing the DOT_ABOVE accent glyph for the degree sign, we need to trim the leading space */ + constexpr uint8_t deg_sign_leading = 9; + + /* Look-up table for constructing characters (must be ordered by unicode) + * + * Characters are either complete symbols from the Western Char Set bitmap, + * or they are constructed using a standard letter from the romfont and + * drawing an accent from the Western Char Set bitmap over it. + */ + + #define UTF8(A) uint16_t(utf8(U##A)) + + PROGMEM constexpr struct { + uint16_t unicode; + uint8_t std_char; // Glyph from standard ROMFONT (zero if none) + uint8_t alt_char; // Glyph from Western Char Set bitmap + uint8_t alt_data; // For accented characters, the centerline; else char width + } char_recipe[] = { + {0, 0, NO_DOT_I, 10 }, + {UTF8('¡'), 0 , INV_EXCLAMATION, 13 }, + {UTF8('¢'), 0 , CENT_SIGN, 23 }, + {UTF8('£'), 0 , POUND_SIGN, 24 }, + {UTF8('¤'), 0 , CURRENCY_SIGN, 26 }, + {UTF8('¥'), 0 , YEN_SIGN, 26 }, + {UTF8('«'), 0 , LEFT_DBL_QUOTE, 23 }, + {UTF8('°'), 0 , DOT_ABOVE, 24 }, + {UTF8('»'), 0 , RIGHT_DBL_QUOTE, 24 }, + {UTF8('¿'), 0 , INV_QUESTION, 21 }, + {UTF8('À'), 'A', GRAVE, mid_A}, + {UTF8('Á'), 'A', ACUTE, mid_A}, + {UTF8('Â'), 'A', CIRCUMFLEX, mid_A}, + {UTF8('Ã'), 'A', TILDE, mid_A}, + {UTF8('Ä'), 'A', DIAERESIS, mid_A}, + {UTF8('Å'), 'A', DOT_ABOVE, mid_A}, + {UTF8('Æ'), 0 , LRG_AE, mid_E}, + {UTF8('Ç'), 'C', CEDILLA, mid_C}, + {UTF8('È'), 'E', GRAVE, mid_E}, + {UTF8('É'), 'E', ACUTE, mid_E}, + {UTF8('Ê'), 'E', CIRCUMFLEX, mid_E}, + {UTF8('Ë'), 'E', DIAERESIS, mid_E}, + {UTF8('Ì'), 'I', GRAVE, mid_I}, + {UTF8('Í'), 'I', ACUTE, mid_I}, + {UTF8('Î'), 'I', CIRCUMFLEX, mid_I}, + {UTF8('Ï'), 'I', DIAERESIS, mid_I}, + {UTF8('Ð'), 0, LRG_ETH, 31 }, + {UTF8('Ñ'), 'N', TILDE, mid_N}, + {UTF8('Ò'), 'O', GRAVE, mid_O}, + {UTF8('Ó'), 'O', ACUTE, mid_O}, + {UTF8('Ô'), 'O', CIRCUMFLEX, mid_O}, + {UTF8('Õ'), 'O', TILDE, mid_O}, + {UTF8('Ö'), 'O', DIAERESIS, mid_O}, + {UTF8('Ø'), 0 , LRG_O_STROKE, 32 }, + {UTF8('Ù'), 'U', GRAVE, mid_U}, + {UTF8('Ú'), 'U', ACUTE, mid_U}, + {UTF8('Û'), 'U', CIRCUMFLEX, mid_U}, + {UTF8('Ü'), 'U', DIAERESIS, mid_U}, + {UTF8('Ý'), 'Y', ACUTE, mid_Y}, + {UTF8('Þ'), 0 , LRG_THORN, 25 }, + {UTF8('ß'), 0 , SHARP_S, 26 }, + {UTF8('à'), 'a', GRAVE, mid_a}, + {UTF8('á'), 'a', ACUTE, mid_a}, + {UTF8('â'), 'a', CIRCUMFLEX, mid_a}, + {UTF8('ã'), 'a', TILDE, mid_a}, + {UTF8('ä'), 'a', DIAERESIS, mid_a}, + {UTF8('å'), 'a', DOT_ABOVE, mid_a}, + {UTF8('æ'), 0 , SML_AE, 40 }, + {UTF8('ç'), 'c', CEDILLA, mid_c}, + {UTF8('è'), 'e', GRAVE, mid_e}, + {UTF8('é'), 'e', ACUTE, mid_e}, + {UTF8('ê'), 'e', CIRCUMFLEX, mid_e}, + {UTF8('ë'), 'e', DIAERESIS, mid_e}, + {UTF8('ì'), 'i', GRAVE, mid_i}, + {UTF8('í'), 'i', ACUTE, mid_i}, + {UTF8('î'), 'i', CIRCUMFLEX, mid_i}, + {UTF8('ï'), 'i', DIAERESIS, mid_i}, + {UTF8('ð'), 0, SML_ETH, 24 }, + {UTF8('ñ'), 'n', TILDE, mid_n}, + {UTF8('ò'), 'o', GRAVE, mid_o}, + {UTF8('ó'), 'o', ACUTE, mid_o}, + {UTF8('ô'), 'o', CIRCUMFLEX, mid_o}, + {UTF8('õ'), 'o', TILDE, mid_o}, + {UTF8('ö'), 'o', DIAERESIS, mid_o}, + {UTF8('ø'), 0 , SML_O_STROKE, 25 }, + {UTF8('ù'), 'u', GRAVE, mid_u}, + {UTF8('ú'), 'u', ACUTE, mid_u}, + {UTF8('û'), 'u', CIRCUMFLEX, mid_u}, + {UTF8('ü'), 'u', DIAERESIS, mid_u}, + {UTF8('ý'), 'y', ACUTE, mid_y}, + {UTF8('þ'), 0 , SML_THORN, 25 }, + {UTF8('ÿ'), 'y', DIAERESIS, mid_y} + }; + + static_assert(UTF8('¡') == 0xC2A1, "Incorrect encoding for character"); + + /* Compile-time check that the table is in sorted order */ + + constexpr bool is_sorted(size_t n) { + return n < 2 ? true : char_recipe[n-2].unicode < char_recipe[n-1].unicode && is_sorted(n-1); + } + + static_assert(is_sorted(NUM_ELEMENTS(char_recipe)), "The table must be sorted by unicode value"); + + /* Performs a binary search to find a unicode character in the table */ + + static int8_t find_char_data(FTDI::utf8_char_t c) { + int8_t min = 0, max = NUM_ELEMENTS(char_recipe), index; + for (;;) { + index = (min + max)/2; + const uint16_t char_at = pgm_read_word(&char_recipe[index].unicode); + if (char_at == c) break; + if (min == max) return -1; + if (c > char_at) + min = index + 1; + else + max = index; + } + return index; + } + + static void get_char_data(uint8_t index, uint8_t &std_char, uint8_t &alt_char, uint8_t &alt_data) { + std_char = pgm_read_byte(&char_recipe[index].std_char); + alt_char = pgm_read_byte(&char_recipe[index].alt_char); + alt_data = pgm_read_byte(&char_recipe[index].alt_data); + } + + /** + * Load bitmap data into RAMG. This function is called once at the start + * of the program. + * + * Parameters: + * + * addr - Address in RAMG where the font data is written + */ + + void FTDI::WesternCharSet::load_data(uint32_t addr) { + // Load the alternative font metrics + CLCD::FontMetrics alt_fm; + alt_fm.ptr = addr + 148; + alt_fm.format = L4; + alt_fm.stride = 19; + alt_fm.width = 38; + alt_fm.height = 49; + for (uint8_t i = 0; i < 127; i++) { + alt_fm.char_widths[i] = 0; + } + // For special characters, copy the character widths from the char tables + for (uint8_t i = 0; i < NUM_ELEMENTS(char_recipe); i++) { + uint8_t std_char, alt_char, alt_data; + get_char_data(i, std_char, alt_char, alt_data); + if (std_char == 0) + alt_fm.char_widths[alt_char] = alt_data; + } + CLCD::mem_write_bulk(addr, &alt_fm, 148); + + // Decode the RLE data and load it into RAMG as a bitmap + write_rle_data(addr + 148, font, sizeof(font)); + + bitmap_addr = addr; + } + + /** + * Populates the bitmap handles for the custom into the display list. + * This function is called once at the start of each display list. + * + * Parameters: + * + * cmd - Object used for writing to the FTDI chip command queue. + */ + + void FTDI::WesternCharSet::load_bitmaps(CommandProcessor& cmd) { + CLCD::FontMetrics alt_fm; + alt_fm.ptr = bitmap_addr + 148; + alt_fm.format = L4; + alt_fm.stride = 19; + alt_fm.width = 38; + alt_fm.height = 49; + set_font_bitmap(cmd, alt_fm, alt_font); + } + + /** + * Renders a character at location x and y. The x position is incremented + * by the width of the character. + * + * Parameters: + * + * cmd - If non-NULL the symbol is drawn to the screen. + * If NULL, only increment position for text measurement. + * + * x, y - The location at which to draw the character. On output, + * incremented to the location of the next character. + * + * fs - A scaling object used to scale the font. The display will + * already be configured to scale bitmaps, but positions + * must be scaled using fs.scale() + * + * c - The unicode code point to draw. If the renderer does not + * support the character, it should return false. + + * Returns: Whether the character was supported. + */ + + bool FTDI::WesternCharSet::render_glyph(CommandProcessor* cmd, int &x, int &y, font_size_t fs, utf8_char_t c) { + + // A supported character? + if (c < UTF8('¡') || c > UTF8('ÿ')) return false; + + int8_t index = find_char_data(c); + if (index == -1) return false; + + // Determine character characteristics + uint8_t std_char, alt_char, alt_data; + get_char_data(index, std_char, alt_char, alt_data); + + bool base_special; + uint8_t base_width; + uint8_t base_char; + uint8_t accent_char; + int8_t accent_dx, accent_dy; + + if (std_char == 0) { + // Special character, non-accented + base_width = alt_data; + base_special = true; + base_char = alt_char; + accent_char = 0; + if (c == UTF8('°')) + x -= fs.scale(deg_sign_leading); + } else { + // Regular character with accent: + accent_dx = alt_data - mid_accent; + accent_dy = isupper(std_char) ? -7 : 0; + accent_char = alt_char; + base_width = StandardCharSet::std_char_width(std_char); + base_special = std_char == 'i'; + base_char = base_special ? NO_DOT_I : std_char; + } + + // If cmd != NULL, draw the glyph to the screen + if (cmd) { + ext_vertex2ii(*cmd, x, y, base_special ? alt_font : std_font, base_char); + if (accent_char) + ext_vertex2ii(*cmd, x + fs.scale(accent_dx), y + fs.scale(accent_dy), alt_font, accent_char); + } + + // Increment X to the next character position + x += fs.scale(base_width); + return true; + } + +#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8 && TOUCH_UI_UTF8_WESTERN_CHARSET diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set.h new file mode 100644 index 000000000..704de9508 --- /dev/null +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set.h @@ -0,0 +1,29 @@ +/********************** + * western_char_set.h * + **********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +namespace FTDI { + class WesternCharSet { + public: + static void load_data(uint32_t addr); + static void load_bitmaps(CommandProcessor&); + static bool render_glyph(CommandProcessor*, int &x, int &y, font_size_t, utf8_char_t); + }; +} diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h new file mode 100644 index 000000000..08d252afb --- /dev/null +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h @@ -0,0 +1,665 @@ +/******************************** + * western_european_bitmap_31.h * + ********************************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +/* This is a dump of "font_bitmaps/western_european_bitmap_31.png" + * using the tool "bitmap2cpp.py". The tool converts the image into + * 16-level grayscale and packs two pixels per byte. The resulting + * bytes are then RLE compressed to yield (count, byte) pairs. + */ + +const unsigned char font[] PROGMEM = { + 0x76, 0x00, 0x01, 0x08, 0x01, 0xee, 0x01, 0xe5, 0x11, 0x00, 0x01, 0xaf, + 0x01, 0xff, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xd0, + 0x10, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xf9, 0x11, 0x00, 0x01, 0x2e, + 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf2, + 0x11, 0x00, 0x01, 0x5f, 0x01, 0xfd, 0x11, 0x00, 0x01, 0x06, 0x01, 0x99, + 0x01, 0x40, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x20, 0x00, 0x01, 0x9e, + 0x01, 0xee, 0x01, 0x50, 0x0f, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8, + 0x10, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0xcf, + 0x01, 0xfc, 0x10, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xd1, 0x10, 0x00, + 0x01, 0x4f, 0x01, 0xfe, 0x01, 0x20, 0x0f, 0x00, 0x01, 0x01, 0x01, 0xef, + 0x01, 0xf3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xaa, 0x01, 0x40, 0xff, 0x00, + 0xff, 0x00, 0xff, 0x00, 0x1f, 0x00, 0x01, 0xcf, 0x01, 0xfc, 0x10, 0x00, + 0x01, 0x07, 0x02, 0xff, 0x01, 0x60, 0x0f, 0x00, 0x01, 0x2f, 0x02, 0xff, + 0x01, 0xf2, 0x0f, 0x00, 0x01, 0xcf, 0x01, 0xf6, 0x01, 0x6f, 0x01, 0xfb, + 0x0e, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x0a, 0x01, 0xff, + 0x01, 0x60, 0x0d, 0x00, 0x01, 0x1f, 0x01, 0xfd, 0x01, 0x00, 0x01, 0x01, + 0x01, 0xdf, 0x01, 0xf1, 0x0d, 0x00, 0x01, 0xbf, 0x01, 0xf3, 0x02, 0x00, + 0x01, 0x3f, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x02, 0x01, 0x99, 0x01, 0x50, + 0x02, 0x00, 0x01, 0x05, 0x01, 0x99, 0x01, 0x20, 0xff, 0x00, 0xff, 0x00, + 0xff, 0x00, 0x1f, 0x00, 0x01, 0x11, 0x0d, 0x00, 0x01, 0x09, 0x01, 0xff, + 0x01, 0xc3, 0x02, 0x00, 0x01, 0xff, 0x01, 0x80, 0x0c, 0x00, 0x01, 0xaf, + 0x02, 0xff, 0x01, 0x50, 0x01, 0x01, 0x01, 0xff, 0x01, 0x60, 0x0b, 0x00, + 0x01, 0x02, 0x01, 0xff, 0x01, 0xd9, 0x01, 0xff, 0x01, 0xf7, 0x01, 0x07, + 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0x20, + 0x01, 0x3e, 0x02, 0xff, 0x01, 0xfd, 0x0c, 0x00, 0x01, 0x09, 0x01, 0xfe, + 0x01, 0x00, 0x01, 0x02, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xf4, 0x0c, 0x00, + 0x01, 0x07, 0x01, 0xa8, 0x02, 0x00, 0x01, 0x06, 0x01, 0x98, 0x01, 0x20, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x41, 0x00, 0x02, 0x44, 0x02, 0x00, + 0x02, 0x44, 0x0d, 0x00, 0x02, 0xff, 0x01, 0x10, 0x01, 0x01, 0x02, 0xff, + 0x0d, 0x00, 0x02, 0xff, 0x01, 0x10, 0x01, 0x01, 0x02, 0xff, 0x0d, 0x00, + 0x02, 0xff, 0x01, 0x10, 0x01, 0x01, 0x02, 0xff, 0x0d, 0x00, 0x02, 0xcc, + 0x01, 0x10, 0x01, 0x01, 0x02, 0xcc, 0xff, 0x00, 0xff, 0x00, 0xf6, 0x00, + 0x01, 0x13, 0x01, 0x30, 0x10, 0x00, 0x01, 0x2b, 0x02, 0xff, 0x01, 0xa1, + 0x0e, 0x00, 0x01, 0x02, 0x01, 0xef, 0x02, 0xff, 0x01, 0xfd, 0x01, 0x10, + 0x0d, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0x94, 0x01, 0x5a, 0x01, 0xff, + 0x01, 0xb0, 0x0d, 0x00, 0x01, 0x4f, 0x01, 0xf7, 0x02, 0x00, 0x01, 0x9f, + 0x01, 0xf2, 0x0d, 0x00, 0x01, 0x8f, 0x01, 0xf0, 0x02, 0x00, 0x01, 0x2f, + 0x01, 0xf6, 0x0d, 0x00, 0x01, 0x8f, 0x01, 0xe0, 0x02, 0x00, 0x01, 0x0f, + 0x01, 0xf7, 0x0d, 0x00, 0x01, 0x7f, 0x01, 0xf2, 0x02, 0x00, 0x01, 0x4f, + 0x01, 0xf5, 0x0d, 0x00, 0x01, 0x2f, 0x01, 0xfc, 0x01, 0x10, 0x01, 0x02, + 0x01, 0xdf, 0x01, 0xf0, 0x0d, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb, + 0x01, 0xcf, 0x01, 0xff, 0x01, 0x60, 0x0e, 0x00, 0x01, 0x9f, 0x02, 0xff, + 0x01, 0xf8, 0x0f, 0x00, 0x01, 0x03, 0x01, 0x9c, 0x01, 0xc9, 0x01, 0x30, + 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x93, 0x00, + 0x01, 0x06, 0x01, 0xff, 0x01, 0x20, 0x11, 0x00, 0x01, 0xcf, 0x01, 0xc0, + 0x11, 0x00, 0x01, 0x3f, 0x01, 0xf6, 0x11, 0x00, 0x01, 0x0f, 0x01, 0xfb, + 0x11, 0x00, 0x01, 0x3f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0x07, 0x01, 0xd9, + 0x01, 0x89, 0x01, 0xff, 0x01, 0xfb, 0x0e, 0x00, 0x01, 0x07, 0x03, 0xff, + 0x01, 0xf3, 0x0e, 0x00, 0x01, 0x04, 0x01, 0xbd, 0x01, 0xee, 0x01, 0xd9, + 0x01, 0x20, 0xff, 0x00, 0x61, 0x00, 0x01, 0x01, 0x01, 0x99, 0x01, 0x96, + 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, + 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, + 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, + 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, + 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, + 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, + 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, + 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, + 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, + 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, + 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, + 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, + 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, + 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, + 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0xff, 0x00, 0x58, 0x00, + 0x01, 0x35, 0x01, 0x66, 0x01, 0x52, 0x0e, 0x00, 0x01, 0x03, 0x01, 0xaf, + 0x03, 0xff, 0x01, 0xe7, 0x0d, 0x00, 0x01, 0x7f, 0x05, 0xff, 0x01, 0xc1, + 0x0b, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0xfc, 0x01, 0xaa, 0x01, 0xdf, + 0x01, 0xff, 0x01, 0xfc, 0x0b, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf9, + 0x01, 0x10, 0x01, 0x00, 0x01, 0x02, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x70, + 0x0a, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x80, 0x03, 0x00, 0x01, 0x0d, + 0x01, 0xff, 0x01, 0xe0, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x04, 0x00, + 0x01, 0x05, 0x01, 0xff, 0x01, 0xf3, 0x09, 0x00, 0x01, 0x02, 0x01, 0xff, + 0x01, 0xfb, 0x04, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf7, 0x09, 0x00, + 0x01, 0x03, 0x01, 0xff, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x03, 0x01, 0x9e, + 0x01, 0xff, 0x01, 0xf8, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, + 0x02, 0x00, 0x01, 0x01, 0x01, 0xaf, 0x02, 0xff, 0x01, 0xd7, 0x09, 0x00, + 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x1d, 0x01, 0xff, + 0x01, 0xfc, 0x01, 0x50, 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, + 0x02, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x70, 0x0b, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xfa, + 0x0c, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xf4, 0x0c, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, + 0x01, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf4, 0x0c, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf9, + 0x0c, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x02, + 0x02, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, + 0x02, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x1d, 0x02, 0xff, 0x01, 0xd3, + 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x01, + 0x01, 0xcf, 0x02, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xf8, 0x03, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0xfb, 0x09, 0x00, + 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x2b, 0x02, 0xff, + 0x01, 0xb0, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, + 0x01, 0x6f, 0x01, 0xff, 0x01, 0xf6, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xf8, 0x05, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfd, 0x08, 0x00, + 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xdf, 0x01, 0xff, + 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x10, 0x07, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, + 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xf8, 0x05, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xfd, 0x08, 0x00, + 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x02, 0x01, 0x84, 0x03, 0x00, + 0x01, 0x2d, 0x01, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xf8, 0x01, 0x02, 0x01, 0xff, 0x01, 0xec, 0x01, 0xa9, 0x01, 0xac, + 0x02, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, + 0x01, 0x02, 0x05, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x08, 0x00, 0x01, 0x03, + 0x01, 0xee, 0x01, 0xe7, 0x01, 0x01, 0x01, 0xbf, 0x03, 0xff, 0x01, 0xfe, + 0x01, 0x80, 0x0e, 0x00, 0x01, 0x35, 0x01, 0x78, 0x01, 0x76, 0x01, 0x30, + 0xff, 0x00, 0x48, 0x00, 0x01, 0x40, 0x0a, 0x00, 0x01, 0x47, 0x01, 0x9a, + 0x01, 0xba, 0x01, 0x95, 0x01, 0x10, 0x02, 0x00, 0x01, 0x07, 0x01, 0xf8, + 0x08, 0x00, 0x01, 0x02, 0x01, 0xae, 0x04, 0xff, 0x01, 0xfc, 0x01, 0x50, + 0x01, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x30, 0x07, 0x00, 0x01, 0x8f, + 0x06, 0xff, 0x01, 0xfc, 0x01, 0x23, 0x01, 0xff, 0x01, 0xf6, 0x07, 0x00, + 0x01, 0x1c, 0x03, 0xff, 0x01, 0xca, 0x01, 0x9b, 0x01, 0xdf, 0x02, 0xff, + 0x01, 0xfe, 0x01, 0xff, 0x01, 0x80, 0x07, 0x00, 0x01, 0xcf, 0x01, 0xff, + 0x01, 0xfd, 0x01, 0x50, 0x02, 0x00, 0x01, 0x02, 0x01, 0x9f, 0x02, 0xff, + 0x01, 0xfa, 0x07, 0x00, 0x01, 0x09, 0x02, 0xff, 0x01, 0x90, 0x04, 0x00, + 0x01, 0x03, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf3, 0x07, 0x00, 0x01, 0x5f, + 0x01, 0xff, 0x01, 0xf9, 0x06, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xfc, + 0x07, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x06, + 0x03, 0xff, 0x01, 0x60, 0x05, 0x00, 0x01, 0x04, 0x02, 0xff, 0x01, 0x30, + 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xc0, + 0x05, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfc, 0x05, 0x00, 0x01, 0x02, + 0x01, 0xef, 0x01, 0xf7, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0x1d, 0x01, 0xff, + 0x01, 0xa0, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x3f, + 0x01, 0xff, 0x01, 0xf2, 0x05, 0x00, 0x01, 0xcf, 0x01, 0xfc, 0x01, 0x00, + 0x01, 0x09, 0x01, 0xff, 0x01, 0xfb, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, + 0x01, 0xe0, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xd1, 0x01, 0x00, + 0x01, 0x06, 0x01, 0xff, 0x01, 0xfe, 0x05, 0x00, 0x01, 0x8f, 0x01, 0xff, + 0x01, 0xc0, 0x04, 0x00, 0x01, 0x7f, 0x01, 0xfe, 0x01, 0x20, 0x01, 0x00, + 0x01, 0x03, 0x02, 0xff, 0x05, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xb0, + 0x03, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf4, 0x02, 0x00, 0x01, 0x02, + 0x02, 0xff, 0x01, 0x10, 0x04, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0, + 0x03, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0x60, 0x02, 0x00, 0x01, 0x01, + 0x02, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0, + 0x02, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xf8, 0x03, 0x00, 0x01, 0x02, + 0x02, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xb0, + 0x02, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xb0, 0x03, 0x00, 0x01, 0x03, + 0x02, 0xff, 0x01, 0x10, 0x04, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xc0, + 0x02, 0x00, 0x01, 0xbf, 0x01, 0xfd, 0x04, 0x00, 0x01, 0x04, 0x02, 0xff, + 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x00, 0x01, 0x08, + 0x01, 0xff, 0x01, 0xe1, 0x04, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfe, + 0x05, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf2, 0x01, 0x00, 0x01, 0x6f, + 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfa, + 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf6, 0x01, 0x04, 0x01, 0xff, + 0x01, 0xf5, 0x05, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf7, 0x05, 0x00, + 0x01, 0x09, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x2e, 0x01, 0xff, 0x01, 0x70, + 0x05, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf2, 0x05, 0x00, 0x01, 0x03, + 0x02, 0xff, 0x01, 0xef, 0x01, 0xf9, 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, + 0x01, 0xb0, 0x06, 0x00, 0x01, 0xcf, 0x02, 0xff, 0x01, 0xc0, 0x05, 0x00, + 0x01, 0x06, 0x02, 0xff, 0x01, 0x40, 0x06, 0x00, 0x01, 0x2f, 0x02, 0xff, + 0x01, 0x20, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xfb, 0x07, 0x00, + 0x01, 0x0b, 0x02, 0xff, 0x01, 0xd2, 0x04, 0x00, 0x01, 0x06, 0x02, 0xff, + 0x01, 0xe1, 0x07, 0x00, 0x01, 0x5f, 0x03, 0xff, 0x01, 0x93, 0x02, 0x00, + 0x01, 0x05, 0x01, 0xcf, 0x02, 0xff, 0x01, 0x30, 0x06, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xfb, 0x03, 0xff, 0x01, 0xfd, 0x01, 0xde, 0x03, 0xff, + 0x01, 0xe3, 0x07, 0x00, 0x01, 0x1e, 0x01, 0xff, 0x01, 0x80, 0x01, 0x4d, + 0x06, 0xff, 0x01, 0xfa, 0x01, 0x10, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xfb, + 0x02, 0x00, 0x01, 0x5c, 0x04, 0xff, 0x01, 0xe9, 0x01, 0x30, 0x08, 0x00, + 0x01, 0x1c, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x04, 0x01, 0x67, 0x01, 0x86, + 0x01, 0x53, 0x0b, 0x00, 0x01, 0x10, 0xff, 0x00, 0xbd, 0x00, 0x01, 0x02, + 0x01, 0x20, 0x0c, 0x00, 0x01, 0x02, 0x01, 0x32, 0x01, 0x10, 0x02, 0x00, + 0x01, 0x1e, 0x01, 0xe3, 0x0a, 0x00, 0x01, 0x01, 0x01, 0x7c, 0x02, 0xff, + 0x01, 0xfd, 0x01, 0x82, 0x01, 0x00, 0x01, 0xcf, 0x01, 0xf7, 0x0a, 0x00, + 0x01, 0x6e, 0x05, 0xff, 0x01, 0x8a, 0x01, 0xff, 0x01, 0xa0, 0x09, 0x00, + 0x01, 0x08, 0x07, 0xff, 0x01, 0xfc, 0x0a, 0x00, 0x01, 0x6f, 0x01, 0xff, + 0x01, 0xfc, 0x01, 0x50, 0x01, 0x00, 0x01, 0x3a, 0x02, 0xff, 0x01, 0xf1, + 0x09, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x7f, + 0x01, 0xff, 0x01, 0xf5, 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfc, + 0x03, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfd, 0x09, 0x00, + 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf3, 0x03, 0x00, 0x01, 0x0b, 0x03, 0xff, + 0x01, 0x30, 0x08, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00, + 0x01, 0x9f, 0x01, 0xfa, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x80, 0x08, 0x00, + 0x01, 0x7f, 0x01, 0xff, 0x01, 0x80, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff, + 0x01, 0xc0, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x50, 0x02, 0x00, 0x01, 0x3f, 0x01, 0xfe, 0x01, 0x10, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0xaf, 0x01, 0xff, + 0x01, 0x40, 0x01, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xf3, 0x01, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff, + 0x01, 0x30, 0x01, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0x50, 0x01, 0x00, + 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xaf, 0x01, 0xff, + 0x01, 0x30, 0x01, 0x00, 0x01, 0xbf, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x01, 0x08, 0x01, 0xff, 0x01, 0xb0, 0x02, 0x00, 0x01, 0x0f, 0x01, 0xff, + 0x01, 0xe0, 0x08, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x60, 0x01, 0x5f, + 0x01, 0xfd, 0x03, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xc0, 0x08, 0x00, + 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa3, 0x01, 0xff, 0x01, 0xe2, 0x03, 0x00, + 0x01, 0x7f, 0x01, 0xff, 0x01, 0x90, 0x08, 0x00, 0x01, 0x0f, 0x01, 0xff, + 0x01, 0xfe, 0x01, 0xff, 0x01, 0x40, 0x03, 0x00, 0x01, 0xcf, 0x01, 0xff, + 0x01, 0x50, 0x08, 0x00, 0x01, 0x0a, 0x02, 0xff, 0x01, 0xf6, 0x03, 0x00, + 0x01, 0x05, 0x01, 0xff, 0x01, 0xfe, 0x09, 0x00, 0x01, 0x02, 0x02, 0xff, + 0x01, 0xb0, 0x03, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xf8, 0x0a, 0x00, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00, 0x01, 0x05, 0x01, 0xef, + 0x01, 0xff, 0x01, 0xd0, 0x09, 0x00, 0x01, 0x04, 0x03, 0xff, 0x01, 0xfc, + 0x01, 0xab, 0x01, 0xef, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x09, 0x00, + 0x01, 0x2f, 0x01, 0xff, 0x01, 0xaf, 0x05, 0xff, 0x01, 0xd2, 0x09, 0x00, + 0x01, 0x01, 0x01, 0xdf, 0x01, 0xf5, 0x01, 0x04, 0x01, 0xbf, 0x03, 0xff, + 0x01, 0xd6, 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0x70, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x46, 0x01, 0x76, 0x01, 0x52, 0x0c, 0x00, 0x01, 0x28, + 0xff, 0x00, 0x48, 0x00, 0x01, 0x14, 0x0b, 0x44, 0x01, 0x41, 0x06, 0x00, + 0x01, 0x8f, 0x0b, 0xff, 0x01, 0xf3, 0x06, 0x00, 0x01, 0xef, 0x0b, 0xff, + 0x01, 0xf3, 0x05, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0xee, 0x09, 0xff, + 0x01, 0xf3, 0x05, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf5, 0x01, 0x00, + 0x01, 0xdf, 0x01, 0xff, 0x01, 0x63, 0x06, 0x33, 0x01, 0x30, 0x05, 0x00, + 0x01, 0x3f, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x00, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0x40, 0x0c, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x80, 0x01, 0x00, + 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00, 0x01, 0x01, 0x02, 0xff, + 0x01, 0x10, 0x01, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00, + 0x01, 0x07, 0x01, 0xff, 0x01, 0xfa, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0x40, 0x0b, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf3, 0x02, 0x00, + 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00, 0x01, 0x4f, 0x01, 0xff, + 0x01, 0xd0, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0x60, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0x40, 0x0a, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfe, 0x03, 0x00, + 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0a, 0x00, 0x01, 0x08, 0x01, 0xff, + 0x01, 0xf9, 0x03, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xed, 0x06, 0xdd, + 0x01, 0x80, 0x03, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x03, 0x00, + 0x01, 0xdf, 0x08, 0xff, 0x01, 0xa0, 0x03, 0x00, 0x01, 0x6f, 0x01, 0xff, + 0x01, 0xb0, 0x03, 0x00, 0x01, 0xdf, 0x08, 0xff, 0x01, 0xa0, 0x03, 0x00, + 0x01, 0xcf, 0x01, 0xff, 0x01, 0x40, 0x03, 0x00, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0xa8, 0x06, 0x88, 0x01, 0x50, 0x02, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xfe, 0x04, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x09, 0x00, + 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0x40, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf4, 0x04, 0x33, + 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x09, 0x00, 0x01, 0x7f, 0x08, 0xff, + 0x01, 0x40, 0x09, 0x00, 0x01, 0xef, 0x08, 0xff, 0x01, 0x40, 0x08, 0x00, + 0x01, 0x05, 0x09, 0xff, 0x01, 0x40, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, + 0x01, 0xf7, 0x05, 0x33, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x08, 0x00, + 0x01, 0x2f, 0x01, 0xff, 0x01, 0xe0, 0x05, 0x00, 0x01, 0xdf, 0x01, 0xff, + 0x01, 0x40, 0x08, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x80, 0x05, 0x00, + 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x08, 0x00, 0x02, 0xff, 0x01, 0x20, + 0x05, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x06, + 0x01, 0xff, 0x01, 0xfb, 0x06, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xa8, + 0x06, 0x88, 0x01, 0x85, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf4, 0x06, 0x00, + 0x01, 0xdf, 0x08, 0xff, 0x01, 0xf9, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xe0, + 0x06, 0x00, 0x01, 0xdf, 0x08, 0xff, 0x01, 0xf9, 0x01, 0x8d, 0x01, 0xdd, + 0x01, 0x60, 0x06, 0x00, 0x01, 0xbd, 0x08, 0xdd, 0x01, 0xd8, 0xff, 0x00, + 0xe0, 0x00, 0x01, 0x01, 0x01, 0x34, 0x01, 0x31, 0x06, 0x00, 0x01, 0x12, + 0x01, 0x42, 0x01, 0x10, 0x05, 0x00, 0x01, 0x02, 0x01, 0x7b, 0x01, 0xef, + 0x02, 0xff, 0x01, 0xfb, 0x01, 0x60, 0x02, 0x00, 0x01, 0x03, 0x01, 0x9e, + 0x02, 0xff, 0x01, 0xfd, 0x01, 0x81, 0x04, 0x00, 0x01, 0xbf, 0x05, 0xff, + 0x01, 0xfe, 0x01, 0x40, 0x01, 0x01, 0x01, 0x9f, 0x05, 0xff, 0x01, 0x60, + 0x03, 0x00, 0x01, 0xdf, 0x02, 0xff, 0x01, 0xee, 0x03, 0xff, 0x01, 0xf5, + 0x01, 0x1d, 0x03, 0xff, 0x01, 0xef, 0x02, 0xff, 0x01, 0xf8, 0x03, 0x00, + 0x01, 0xdf, 0x01, 0xb6, 0x01, 0x20, 0x01, 0x00, 0x01, 0x01, 0x01, 0x5d, + 0x02, 0xff, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xe7, 0x01, 0x20, 0x01, 0x00, + 0x01, 0x29, 0x02, 0xff, 0x01, 0x50, 0x02, 0x00, 0x01, 0x71, 0x05, 0x00, + 0x01, 0xaf, 0x02, 0xff, 0x01, 0xfb, 0x01, 0x10, 0x03, 0x00, 0x01, 0x4f, + 0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0x0d, 0x02, 0xff, 0x01, 0xd0, + 0x04, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, 0x08, 0x00, 0x01, 0x06, + 0x02, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0xef, 0x01, 0xfd, 0x08, 0x00, + 0x01, 0x03, 0x01, 0xff, 0x01, 0xfd, 0x06, 0x00, 0x01, 0x9f, 0x01, 0xff, + 0x04, 0x00, 0x01, 0x02, 0x01, 0x45, 0x02, 0x66, 0x01, 0x67, 0x01, 0xff, + 0x01, 0xf9, 0x06, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x03, 0x00, 0x01, 0x4a, + 0x06, 0xff, 0x01, 0xfb, 0x03, 0x66, 0x01, 0x67, 0x02, 0x77, 0x01, 0xaf, + 0x01, 0xff, 0x02, 0x00, 0x01, 0x1b, 0x10, 0xff, 0x01, 0x00, 0x01, 0x01, + 0x01, 0xdf, 0x02, 0xff, 0x01, 0xcb, 0x01, 0xa8, 0x01, 0x88, 0x01, 0x89, + 0x0a, 0xff, 0x01, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x40, + 0x03, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfa, 0x08, 0x77, 0x01, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x04, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xf7, 0x09, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x60, 0x04, 0x00, + 0x01, 0x05, 0x01, 0xff, 0x01, 0xfa, 0x09, 0x00, 0x01, 0x7f, 0x01, 0xff, + 0x01, 0x30, 0x04, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfe, 0x09, 0x00, + 0x01, 0x7f, 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0f, 0x02, 0xff, + 0x01, 0x50, 0x08, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x60, 0x04, 0x00, + 0x01, 0x8f, 0x02, 0xff, 0x01, 0xe1, 0x08, 0x00, 0x01, 0x3f, 0x01, 0xff, + 0x01, 0xd0, 0x03, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfe, 0x01, 0xff, + 0x01, 0xfc, 0x01, 0x10, 0x05, 0x00, 0x01, 0x45, 0x01, 0x00, 0x01, 0x0d, + 0x01, 0xff, 0x01, 0xfc, 0x01, 0x20, 0x01, 0x00, 0x01, 0x01, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0xa2, 0x02, 0xff, 0x01, 0xe6, 0x01, 0x10, 0x02, 0x00, + 0x01, 0x02, 0x01, 0x8d, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x05, 0x02, 0xff, + 0x01, 0xfd, 0x01, 0xab, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x00, + 0x01, 0x3f, 0x02, 0xff, 0x01, 0xfd, 0x01, 0xba, 0x01, 0xbc, 0x02, 0xff, + 0x01, 0xf8, 0x02, 0x00, 0x01, 0x7f, 0x05, 0xff, 0x01, 0xa0, 0x01, 0x00, + 0x01, 0x02, 0x01, 0xcf, 0x06, 0xff, 0x01, 0xf7, 0x02, 0x00, 0x01, 0x03, + 0x01, 0xbf, 0x03, 0xff, 0x01, 0xb4, 0x03, 0x00, 0x01, 0x05, 0x01, 0xbf, + 0x04, 0xff, 0x01, 0xb7, 0x01, 0x10, 0x03, 0x00, 0x01, 0x01, 0x01, 0x46, + 0x01, 0x76, 0x01, 0x41, 0x06, 0x00, 0x01, 0x35, 0x01, 0x67, 0x01, 0x64, + 0x01, 0x20, 0xff, 0x00, 0x48, 0x00, 0x01, 0x34, 0x03, 0x44, 0x01, 0x43, + 0x01, 0x21, 0x0d, 0x00, 0x01, 0xbf, 0x05, 0xff, 0x01, 0xfe, 0x01, 0xb8, + 0x01, 0x40, 0x0a, 0x00, 0x01, 0xbf, 0x07, 0xff, 0x01, 0xfe, 0x01, 0x81, + 0x09, 0x00, 0x01, 0xbf, 0x08, 0xff, 0x01, 0xfe, 0x01, 0x60, 0x08, 0x00, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0x61, 0x02, 0x11, 0x01, 0x23, 0x01, 0x58, + 0x01, 0xcf, 0x02, 0xff, 0x01, 0xf9, 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff, + 0x01, 0x50, 0x04, 0x00, 0x01, 0x02, 0x01, 0x9f, 0x02, 0xff, 0x01, 0x80, + 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x05, 0x00, 0x01, 0x04, + 0x01, 0xef, 0x01, 0xff, 0x01, 0xf4, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff, + 0x01, 0x50, 0x06, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xfd, 0x07, 0x00, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, 0x01, 0x06, 0x02, 0xff, + 0x01, 0x50, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, + 0x01, 0xef, 0x01, 0xff, 0x01, 0xb0, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, + 0x01, 0x50, 0x07, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xf0, 0x06, 0x00, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, 0x01, 0x3f, 0x01, 0xff, + 0x01, 0xf3, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, + 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf5, 0x04, 0x00, 0x01, 0x23, 0x01, 0x33, + 0x01, 0xcf, 0x01, 0xff, 0x01, 0x73, 0x02, 0x33, 0x01, 0x30, 0x04, 0x00, + 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf6, 0x04, 0x00, 0x01, 0xcf, 0x06, 0xff, + 0x01, 0xf2, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, + 0x01, 0xcf, 0x06, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0x0b, 0x01, 0xff, + 0x01, 0xf9, 0x04, 0x00, 0x01, 0x9b, 0x01, 0xbb, 0x01, 0xef, 0x01, 0xff, + 0x01, 0xdb, 0x02, 0xbb, 0x01, 0xb1, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, + 0x01, 0xf8, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, + 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf7, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, + 0x01, 0x50, 0x07, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf6, 0x06, 0x00, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff, + 0x01, 0xf4, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, + 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf1, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, + 0x01, 0x50, 0x07, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xd0, 0x06, 0x00, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, 0x01, 0x01, 0x02, 0xff, + 0x01, 0x80, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, + 0x01, 0x0b, 0x02, 0xff, 0x01, 0x20, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, + 0x01, 0x50, 0x06, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf9, 0x07, 0x00, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x05, 0x00, 0x01, 0x1a, 0x02, 0xff, + 0x01, 0xe1, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x04, 0x00, + 0x01, 0x29, 0x03, 0xff, 0x01, 0x30, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff, + 0x01, 0xa7, 0x01, 0x77, 0x01, 0x78, 0x01, 0x9a, 0x01, 0xbf, 0x03, 0xff, + 0x01, 0xe3, 0x08, 0x00, 0x01, 0xbf, 0x08, 0xff, 0x01, 0xf9, 0x01, 0x10, + 0x08, 0x00, 0x01, 0xbf, 0x07, 0xff, 0x01, 0xd8, 0x01, 0x10, 0x09, 0x00, + 0x01, 0xad, 0x03, 0xdd, 0x01, 0xdc, 0x01, 0xbb, 0x01, 0xa7, 0x01, 0x41, + 0xff, 0x00, 0x50, 0x00, 0x01, 0x38, 0x01, 0x88, 0x01, 0x81, 0x10, 0x00, + 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfc, 0x03, 0x00, 0x01, 0x5a, 0x01, 0x40, + 0x0c, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xb0, 0x01, 0x04, 0x01, 0xaf, + 0x01, 0xff, 0x01, 0xa0, 0x0c, 0x00, 0x01, 0x1e, 0x01, 0xff, 0x01, 0xfc, + 0x02, 0xff, 0x01, 0xd8, 0x01, 0x20, 0x0c, 0x00, 0x01, 0x07, 0x02, 0xff, + 0x01, 0xfd, 0x01, 0x82, 0x0d, 0x00, 0x01, 0x5a, 0x03, 0xff, 0x01, 0xf4, + 0x0d, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x87, 0x02, 0xff, + 0x01, 0x30, 0x0c, 0x00, 0x01, 0x6f, 0x01, 0xe9, 0x01, 0x30, 0x01, 0x00, + 0x01, 0x8f, 0x01, 0xff, 0x01, 0xe2, 0x0c, 0x00, 0x01, 0x03, 0x03, 0x00, + 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x0e, 0x00, 0x01, 0x23, + 0x01, 0x44, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xb0, 0x0c, 0x00, 0x01, 0x02, + 0x01, 0x9e, 0x04, 0xff, 0x01, 0xf7, 0x0c, 0x00, 0x01, 0x7f, 0x06, 0xff, + 0x01, 0x30, 0x0a, 0x00, 0x01, 0x09, 0x02, 0xff, 0x01, 0xfe, 0x01, 0xcb, + 0x01, 0xdf, 0x02, 0xff, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0x6f, 0x01, 0xff, + 0x01, 0xfb, 0x01, 0x30, 0x02, 0x00, 0x01, 0x4e, 0x01, 0xff, 0x01, 0xf5, + 0x09, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x70, 0x03, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xfd, 0x09, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfa, + 0x05, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x20, 0x08, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0xf1, 0x05, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70, + 0x08, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa0, 0x05, 0x00, 0x01, 0x4f, + 0x01, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70, + 0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf0, + 0x08, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x30, 0x05, 0x00, 0x01, 0x0e, + 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x30, + 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xe0, + 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70, 0x05, 0x00, 0x01, 0x2f, + 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa0, + 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x90, 0x08, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0xf1, 0x05, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, + 0x08, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xfe, 0x09, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x60, + 0x03, 0x00, 0x01, 0x3e, 0x01, 0xff, 0x01, 0xf6, 0x0a, 0x00, 0x01, 0x7f, + 0x01, 0xff, 0x01, 0xf9, 0x01, 0x20, 0x01, 0x00, 0x01, 0x07, 0x02, 0xff, + 0x01, 0xb0, 0x0a, 0x00, 0x01, 0x09, 0x02, 0xff, 0x01, 0xfd, 0x01, 0xbd, + 0x02, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x0b, 0x00, 0x01, 0x7f, 0x05, 0xff, + 0x01, 0xb0, 0x0c, 0x00, 0x01, 0x02, 0x01, 0xae, 0x03, 0xff, 0x01, 0xb4, + 0x0f, 0x00, 0x01, 0x35, 0x01, 0x65, 0x01, 0x40, 0xff, 0x00, 0x51, 0x00, + 0x02, 0x55, 0x11, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff, + 0x01, 0x20, 0x10, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff, + 0x01, 0x20, 0x10, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x05, 0xff, + 0x01, 0xed, 0x01, 0xa7, 0x01, 0x10, 0x0b, 0x00, 0x07, 0xff, 0x01, 0xfa, + 0x01, 0x10, 0x0a, 0x00, 0x08, 0xff, 0x01, 0xe2, 0x0a, 0x00, 0x02, 0xff, + 0x01, 0x65, 0x01, 0x55, 0x01, 0x56, 0x01, 0x7a, 0x02, 0xff, 0x01, 0xfe, + 0x01, 0x10, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0x1b, + 0x02, 0xff, 0x01, 0x80, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x04, 0x00, + 0x01, 0xcf, 0x01, 0xff, 0x01, 0xf0, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, + 0x04, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x09, 0x00, 0x02, 0xff, + 0x01, 0x20, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf6, 0x09, 0x00, + 0x02, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf7, + 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0d, 0x01, 0xff, + 0x01, 0xf7, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0f, + 0x01, 0xff, 0x01, 0xf6, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x04, 0x00, + 0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, + 0x04, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xf0, 0x09, 0x00, 0x02, 0xff, + 0x01, 0x20, 0x03, 0x00, 0x01, 0x1b, 0x02, 0xff, 0x01, 0x80, 0x09, 0x00, + 0x02, 0xff, 0x01, 0x65, 0x02, 0x55, 0x01, 0x7a, 0x02, 0xff, 0x01, 0xfe, + 0x01, 0x10, 0x09, 0x00, 0x08, 0xff, 0x01, 0xe2, 0x0a, 0x00, 0x07, 0xff, + 0x01, 0xfa, 0x01, 0x10, 0x0a, 0x00, 0x05, 0xff, 0x01, 0xed, 0x01, 0xa7, + 0x01, 0x10, 0x0b, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff, + 0x01, 0x20, 0x10, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff, + 0x01, 0x20, 0x10, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff, + 0x01, 0x20, 0x10, 0x00, 0x02, 0xcc, 0x01, 0x10, 0xff, 0x00, 0x53, 0x00, + 0x01, 0x02, 0x01, 0x99, 0x01, 0x94, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, + 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, + 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00, + 0x01, 0x13, 0x01, 0x54, 0x01, 0x20, 0x0b, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xf7, 0x01, 0x00, 0x01, 0x5c, 0x02, 0xff, 0x01, 0xfd, 0x01, 0x70, + 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x01, 0x0a, 0x04, 0xff, + 0x01, 0xfd, 0x01, 0x20, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, + 0x01, 0xaf, 0x01, 0xff, 0x01, 0xec, 0x01, 0xdf, 0x02, 0xff, 0x01, 0xe1, + 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfd, 0x01, 0xff, 0x01, 0xc3, + 0x02, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xfc, 0x09, 0x00, 0x01, 0x03, + 0x02, 0xff, 0x01, 0xfa, 0x03, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, + 0x01, 0x60, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0xe0, 0x04, 0x00, + 0x01, 0x5f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff, + 0x01, 0x60, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf3, 0x08, 0x00, + 0x01, 0x03, 0x02, 0xff, 0x05, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf7, + 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfc, 0x05, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xfb, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf9, + 0x06, 0x00, 0x01, 0xff, 0x01, 0xfd, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xf8, 0x06, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x08, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xef, 0x01, 0xff, 0x08, 0x00, + 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xef, 0x01, 0xfe, + 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf9, 0x06, 0x00, 0x01, 0xff, + 0x01, 0xfd, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfc, 0x05, 0x00, + 0x01, 0x02, 0x01, 0xff, 0x01, 0xfb, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff, + 0x05, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x03, + 0x02, 0xff, 0x01, 0x60, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf3, + 0x08, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0xd0, 0x04, 0x00, 0x01, 0x5f, + 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0xfa, + 0x03, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, 0x01, 0x60, 0x08, 0x00, + 0x01, 0x03, 0x01, 0xff, 0x01, 0xfd, 0x01, 0xff, 0x01, 0xc3, 0x02, 0x00, + 0x01, 0x6e, 0x01, 0xff, 0x01, 0xfc, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xf7, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xec, 0x01, 0xcf, 0x02, 0xff, + 0x01, 0xe2, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x01, 0x0b, + 0x04, 0xff, 0x01, 0xfd, 0x01, 0x20, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xf7, 0x01, 0x00, 0x01, 0x6c, 0x02, 0xff, 0x01, 0xfe, 0x01, 0x70, + 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00, 0x01, 0x23, + 0x01, 0x54, 0x01, 0x20, 0x0b, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, + 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, + 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, + 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, + 0x10, 0x00, 0x01, 0x01, 0x01, 0x66, 0x01, 0x63, 0xff, 0x00, 0x6c, 0x00, + 0x01, 0x30, 0x03, 0x00, 0x01, 0x02, 0x0d, 0x00, 0x01, 0x08, 0x01, 0xa0, + 0x02, 0x00, 0x01, 0x01, 0x01, 0xc6, 0x0d, 0x00, 0x01, 0xaf, 0x01, 0xa0, + 0x02, 0x00, 0x01, 0x1d, 0x01, 0xf6, 0x0c, 0x00, 0x01, 0x1c, 0x01, 0xff, + 0x01, 0xa0, 0x01, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xf6, 0x0b, 0x00, + 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x50, 0x01, 0x00, 0x01, 0x3e, + 0x01, 0xff, 0x01, 0xe2, 0x0b, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xf4, + 0x01, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x20, 0x0a, 0x00, + 0x01, 0x04, 0x01, 0xef, 0x01, 0xfe, 0x01, 0x30, 0x01, 0x00, 0x01, 0x6f, + 0x01, 0xff, 0x01, 0xd1, 0x0b, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xd2, + 0x01, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb, 0x0b, 0x00, 0x01, 0x06, + 0x01, 0xff, 0x01, 0xfc, 0x01, 0x10, 0x01, 0x00, 0x01, 0xaf, 0x01, 0xff, + 0x01, 0xa0, 0x0b, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00, + 0x01, 0xff, 0x01, 0xfa, 0x0c, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf8, + 0x02, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x50, 0x0c, 0x00, 0x01, 0xaf, + 0x01, 0xff, 0x01, 0xa0, 0x01, 0x00, 0x01, 0x1c, 0x01, 0xff, 0x01, 0xf6, + 0x0c, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb, 0x02, 0x00, 0x01, 0xbf, + 0x01, 0xff, 0x01, 0x90, 0x0c, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xd1, + 0x01, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfa, 0x0c, 0x00, 0x01, 0x05, + 0x01, 0xff, 0x01, 0xfd, 0x01, 0x20, 0x01, 0x00, 0x01, 0x8f, 0x01, 0xff, + 0x01, 0xb0, 0x0c, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x00, + 0x01, 0x07, 0x01, 0xff, 0x01, 0xf6, 0x0c, 0x00, 0x01, 0x02, 0x01, 0xef, + 0x01, 0xa0, 0x02, 0x00, 0x01, 0x5f, 0x01, 0xf6, 0x0d, 0x00, 0x01, 0x1d, + 0x01, 0xa0, 0x02, 0x00, 0x01, 0x04, 0x01, 0xe6, 0x0d, 0x00, 0x01, 0x01, + 0x01, 0x60, 0x03, 0x00, 0x01, 0x24, 0xff, 0x00, 0xff, 0x00, 0x46, 0x00, + 0x01, 0x20, 0x03, 0x00, 0x01, 0x20, 0x0d, 0x00, 0x01, 0x01, 0x01, 0xe3, + 0x03, 0x00, 0x01, 0x5d, 0x01, 0x10, 0x0c, 0x00, 0x01, 0x01, 0x01, 0xff, + 0x01, 0x50, 0x02, 0x00, 0x01, 0x5f, 0x01, 0xe2, 0x0c, 0x00, 0x01, 0x01, + 0x01, 0xff, 0x01, 0xf6, 0x02, 0x00, 0x01, 0x5f, 0x01, 0xfe, 0x01, 0x30, + 0x0c, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x80, 0x01, 0x00, 0x01, 0x2e, + 0x01, 0xff, 0x01, 0xf5, 0x0c, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfa, + 0x01, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x60, 0x0c, 0x00, + 0x01, 0x8f, 0x01, 0xff, 0x01, 0xb0, 0x01, 0x00, 0x01, 0x0b, 0x01, 0xff, + 0x01, 0xf9, 0x0c, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x10, + 0x01, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0, 0x0c, 0x00, 0x01, 0x5f, + 0x01, 0xff, 0x01, 0xd1, 0x01, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb, + 0x0c, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0x10, 0x0b, 0x00, 0x01, 0x2d, 0x01, 0xff, 0x01, 0xf3, + 0x01, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, 0x0a, 0x00, + 0x01, 0x03, 0x01, 0xef, 0x01, 0xff, 0x01, 0x40, 0x01, 0x00, 0x01, 0x5f, + 0x01, 0xff, 0x01, 0xd2, 0x0b, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xe3, + 0x01, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x10, 0x0a, 0x00, + 0x01, 0x05, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x01, 0x00, 0x01, 0x9f, + 0x01, 0xff, 0x01, 0xb0, 0x0b, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xc1, + 0x01, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf9, 0x0b, 0x00, 0x01, 0x01, + 0x01, 0xff, 0x01, 0xfa, 0x02, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x70, + 0x0b, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x5f, + 0x01, 0xf6, 0x0c, 0x00, 0x01, 0x01, 0x01, 0xf8, 0x03, 0x00, 0x01, 0x5f, + 0x01, 0x40, 0x0c, 0x00, 0x01, 0x01, 0x01, 0x50, 0x03, 0x00, 0x01, 0x43, + 0xff, 0x00, 0xff, 0x00, 0x38, 0x00, 0x01, 0xad, 0x01, 0xdd, 0x01, 0x40, + 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, + 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, + 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0x34, + 0x01, 0x44, 0x01, 0x10, 0x49, 0x00, 0x01, 0x02, 0x01, 0x22, 0x11, 0x00, + 0x01, 0x6f, 0x01, 0xff, 0x11, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x11, 0x00, + 0x01, 0x7f, 0x01, 0xff, 0x01, 0x10, 0x10, 0x00, 0x01, 0x8f, 0x01, 0xff, + 0x01, 0x20, 0x10, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x30, 0x10, 0x00, + 0x01, 0xaf, 0x01, 0xff, 0x01, 0x30, 0x10, 0x00, 0x01, 0xbf, 0x01, 0xff, + 0x01, 0x40, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, + 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, + 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, + 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, + 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, + 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, + 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, + 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, + 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, + 0x01, 0x34, 0x01, 0x44, 0x01, 0x10, 0xff, 0x00, 0x69, 0x00, 0x02, 0xdd, + 0x11, 0x00, 0x02, 0xff, 0x11, 0x00, 0x02, 0xff, 0x11, 0x00, 0x02, 0xff, + 0x11, 0x00, 0x02, 0xff, 0x11, 0x00, 0x02, 0x44, 0x37, 0x00, 0x01, 0xbc, + 0x01, 0xcb, 0x11, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x11, 0x00, 0x01, 0xef, + 0x01, 0xfe, 0x11, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x11, 0x00, 0x01, 0xff, + 0x01, 0xfd, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfb, 0x10, 0x00, + 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0xaf, 0x01, 0xff, + 0x01, 0xd0, 0x0f, 0x00, 0x01, 0x0a, 0x02, 0xff, 0x01, 0x30, 0x0f, 0x00, + 0x01, 0xaf, 0x01, 0xff, 0x01, 0xf4, 0x0f, 0x00, 0x01, 0x09, 0x02, 0xff, + 0x01, 0x40, 0x0f, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xf4, 0x0f, 0x00, + 0x01, 0x03, 0x02, 0xff, 0x01, 0x40, 0x0f, 0x00, 0x01, 0x0a, 0x01, 0xff, + 0x01, 0xf8, 0x10, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, + 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf0, 0x10, 0x00, 0x01, 0x0f, 0x01, 0xff, + 0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, + 0x01, 0x05, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0x08, 0x02, 0xff, 0x01, 0x70, + 0x02, 0x00, 0x01, 0x05, 0x01, 0xcf, 0x01, 0xf0, 0x0a, 0x00, 0x01, 0x01, + 0x01, 0xef, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x98, 0x01, 0x8b, 0x02, 0xff, + 0x01, 0xf0, 0x0b, 0x00, 0x01, 0x3f, 0x06, 0xff, 0x01, 0xc0, 0x0b, 0x00, + 0x01, 0x02, 0x01, 0xcf, 0x04, 0xff, 0x01, 0xc5, 0x0d, 0x00, 0x01, 0x03, + 0x01, 0x8b, 0x01, 0xcc, 0x01, 0xb9, 0x01, 0x62, 0xe2, 0x00, 0x01, 0x01, + 0x01, 0x32, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05, + 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05, + 0x01, 0xfc, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x11, 0x00, 0x01, 0x39, + 0x01, 0xfd, 0x01, 0x42, 0x0e, 0x00, 0x01, 0x05, 0x01, 0xbf, 0x03, 0xff, + 0x01, 0xfb, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x03, 0x01, 0xcf, 0x05, 0xff, + 0x01, 0xf6, 0x0b, 0x00, 0x01, 0x4f, 0x02, 0xff, 0x02, 0xfe, 0x01, 0xce, + 0x01, 0xff, 0x01, 0xf6, 0x0a, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0xe6, + 0x01, 0x05, 0x01, 0xfc, 0x01, 0x00, 0x01, 0x38, 0x01, 0xe6, 0x0a, 0x00, + 0x01, 0x0c, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x01, 0x05, 0x01, 0xfc, + 0x02, 0x00, 0x01, 0x02, 0x0a, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xe1, + 0x01, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0d, 0x00, 0x01, 0xcf, 0x01, 0xff, + 0x01, 0x60, 0x01, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0d, 0x00, 0x02, 0xff, + 0x02, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x04, 0x01, 0xff, + 0x01, 0xfb, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x06, + 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0c, 0x00, + 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfb, + 0x0c, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6, 0x02, 0x00, 0x01, 0x05, + 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00, + 0x01, 0x05, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf9, + 0x02, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xfc, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x0d, 0x00, 0x02, 0xff, + 0x01, 0x10, 0x01, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x0d, 0x00, 0x01, 0xaf, + 0x01, 0xff, 0x01, 0x80, 0x01, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x0d, 0x00, + 0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x01, 0x00, 0x01, 0x05, 0x01, 0xfb, + 0x0d, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x30, 0x01, 0x05, + 0x01, 0xfb, 0x02, 0x00, 0x01, 0x33, 0x0a, 0x00, 0x01, 0x01, 0x01, 0xef, + 0x01, 0xff, 0x01, 0xf9, 0x01, 0x35, 0x01, 0xfb, 0x01, 0x02, 0x01, 0x6c, + 0x01, 0xf6, 0x0b, 0x00, 0x01, 0x2d, 0x06, 0xff, 0x01, 0xf6, 0x0b, 0x00, + 0x01, 0x01, 0x01, 0x9f, 0x05, 0xff, 0x01, 0xf5, 0x0c, 0x00, 0x01, 0x02, + 0x01, 0x8d, 0x03, 0xff, 0x01, 0xc7, 0x01, 0x20, 0x0e, 0x00, 0x01, 0x06, + 0x01, 0xfc, 0x01, 0x20, 0x10, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, + 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, + 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, 0xf5, 0x00, + 0x01, 0x6b, 0x01, 0xdf, 0x01, 0xfd, 0x01, 0xc9, 0x01, 0x40, 0x0d, 0x00, + 0x01, 0x6e, 0x05, 0xff, 0x01, 0x30, 0x0b, 0x00, 0x01, 0x07, 0x06, 0xff, + 0x01, 0x30, 0x0b, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x85, + 0x01, 0x34, 0x01, 0x7b, 0x01, 0xff, 0x01, 0x30, 0x0b, 0x00, 0x01, 0xaf, + 0x01, 0xff, 0x01, 0xc1, 0x03, 0x00, 0x01, 0x18, 0x01, 0x30, 0x0a, 0x00, + 0x01, 0x01, 0x02, 0xff, 0x01, 0x30, 0x0f, 0x00, 0x01, 0x04, 0x01, 0xff, + 0x01, 0xfd, 0x10, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xfa, 0x10, 0x00, + 0x01, 0x08, 0x01, 0xff, 0x01, 0xf8, 0x10, 0x00, 0x01, 0x09, 0x01, 0xff, + 0x01, 0xf7, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, + 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, + 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, + 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x0e, 0x00, 0x01, 0x0a, 0x07, 0xff, + 0x01, 0xf4, 0x0a, 0x00, 0x01, 0x0a, 0x07, 0xff, 0x01, 0xf4, 0x0a, 0x00, + 0x01, 0x08, 0x01, 0xdd, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfe, 0x03, 0xdd, + 0x01, 0xd4, 0x0c, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, + 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, + 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, + 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, + 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, + 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, + 0x01, 0xf6, 0x0e, 0x00, 0x01, 0x4b, 0x01, 0xbb, 0x01, 0xbe, 0x01, 0xff, + 0x01, 0xfd, 0x05, 0xbb, 0x01, 0x70, 0x08, 0x00, 0x01, 0x6f, 0x09, 0xff, + 0x01, 0xa0, 0x08, 0x00, 0x01, 0x6f, 0x09, 0xff, 0x01, 0xa0, 0x08, 0x00, + 0x01, 0x4a, 0x09, 0xaa, 0x01, 0x60, 0xff, 0x00, 0xd2, 0x00, 0x01, 0x30, + 0x07, 0x00, 0x01, 0x01, 0x01, 0x40, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xf5, + 0x07, 0x00, 0x01, 0x1d, 0x01, 0xf4, 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff, + 0x01, 0x40, 0x05, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x30, + 0x07, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x00, 0x01, 0x6b, + 0x01, 0xdd, 0x01, 0xc8, 0x01, 0x20, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfa, + 0x08, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0x8e, 0x03, 0xff, 0x01, 0xfa, + 0x01, 0xdf, 0x01, 0xff, 0x01, 0xa0, 0x09, 0x00, 0x01, 0x5f, 0x07, 0xff, + 0x01, 0xfa, 0x0a, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0xe9, 0x01, 0x55, + 0x01, 0x7c, 0x02, 0xff, 0x01, 0xa0, 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, + 0x01, 0xfb, 0x01, 0x10, 0x02, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xa0, + 0x0a, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x07, + 0x01, 0xff, 0x01, 0xf2, 0x0a, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x30, + 0x04, 0x00, 0x01, 0xdf, 0x01, 0xf7, 0x0a, 0x00, 0x01, 0x4f, 0x01, 0xfd, + 0x05, 0x00, 0x01, 0x8f, 0x01, 0xfa, 0x0a, 0x00, 0x01, 0x6f, 0x01, 0xfc, + 0x05, 0x00, 0x01, 0x6f, 0x01, 0xfc, 0x0a, 0x00, 0x01, 0x5f, 0x01, 0xfc, + 0x05, 0x00, 0x01, 0x7f, 0x01, 0xfb, 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff, + 0x01, 0x10, 0x04, 0x00, 0x01, 0xbf, 0x01, 0xf8, 0x0a, 0x00, 0x01, 0x0e, + 0x01, 0xff, 0x01, 0x80, 0x03, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf3, + 0x0a, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf5, 0x03, 0x00, 0x01, 0x1d, + 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x92, + 0x01, 0x00, 0x01, 0x16, 0x01, 0xef, 0x01, 0xff, 0x01, 0x60, 0x0a, 0x00, + 0x01, 0x1d, 0x03, 0xff, 0x01, 0xfe, 0x03, 0xff, 0x01, 0xf4, 0x09, 0x00, + 0x01, 0x01, 0x01, 0xdf, 0x05, 0xff, 0x01, 0xfe, 0x02, 0xff, 0x01, 0x40, + 0x08, 0x00, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfa, 0x01, 0x06, 0x01, 0xdf, + 0x01, 0xff, 0x01, 0xfe, 0x01, 0x81, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf4, + 0x08, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x44, 0x01, 0x20, 0x01, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0x20, + 0x07, 0x00, 0x01, 0x4f, 0x01, 0xfa, 0x07, 0x00, 0x01, 0x4f, 0x01, 0xf8, + 0x08, 0x00, 0x01, 0x05, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x05, 0x01, 0x80, + 0xff, 0x00, 0x84, 0x00, 0x01, 0x01, 0x01, 0x88, 0x01, 0x85, 0x07, 0x00, + 0x01, 0x38, 0x01, 0x88, 0x01, 0x40, 0x07, 0x00, 0x01, 0xcf, 0x01, 0xff, + 0x01, 0x10, 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x07, 0x00, + 0x01, 0x3f, 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0x05, 0x01, 0xff, + 0x01, 0xf8, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf2, 0x05, 0x00, + 0x01, 0x0d, 0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0x02, 0x01, 0xff, + 0x01, 0xfa, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x60, 0x09, 0x00, + 0x01, 0xaf, 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0xef, 0x01, 0xfd, + 0x0a, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x07, + 0x01, 0xff, 0x01, 0xf5, 0x0a, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf4, + 0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x01, + 0x01, 0xef, 0x01, 0xfd, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40, + 0x0b, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x50, 0x01, 0x00, 0x01, 0x02, + 0x01, 0xff, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xe0, + 0x01, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf3, 0x0c, 0x00, 0x01, 0x06, + 0x01, 0xff, 0x01, 0xf7, 0x01, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xa0, + 0x0a, 0x00, 0x01, 0x2a, 0x02, 0xaa, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, + 0x01, 0xbf, 0x01, 0xff, 0x01, 0xca, 0x01, 0xaa, 0x01, 0xa5, 0x08, 0x00, + 0x01, 0x4f, 0x04, 0xff, 0x01, 0x83, 0x04, 0xff, 0x01, 0xf8, 0x08, 0x00, + 0x01, 0x3c, 0x02, 0xcc, 0x01, 0xce, 0x01, 0xff, 0x01, 0xfd, 0x01, 0xff, + 0x01, 0xfc, 0x02, 0xcc, 0x01, 0xc6, 0x0b, 0x00, 0x01, 0x03, 0x03, 0xff, + 0x01, 0x70, 0x0f, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xfe, 0x10, 0x00, + 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf5, 0x0c, 0x00, 0x01, 0x01, 0x03, 0x11, + 0x01, 0x1e, 0x01, 0xff, 0x01, 0xf3, 0x03, 0x11, 0x01, 0x10, 0x08, 0x00, + 0x01, 0x4f, 0x09, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x4f, 0x09, 0xff, + 0x01, 0xf8, 0x08, 0x00, 0x01, 0x27, 0x03, 0x77, 0x01, 0x7e, 0x01, 0xff, + 0x01, 0xf8, 0x03, 0x77, 0x01, 0x73, 0x0c, 0x00, 0x01, 0x0e, 0x01, 0xff, + 0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, + 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, + 0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, + 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, + 0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, + 0x01, 0x08, 0x01, 0x99, 0x01, 0x91, 0xc9, 0x00 +}; diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extras/bitmap2cpp.py b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extras/bitmap2cpp.py new file mode 100755 index 000000000..1c331ab0b --- /dev/null +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/ftdi_eve_lib/extras/bitmap2cpp.py @@ -0,0 +1,89 @@ +#!/usr/bin/python + +# Written By Marcio Teixeira 2018 - Aleph Objects, Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# To view a copy of the GNU General Public License, go to the following +# location: . + +from __future__ import print_function +from PIL import Image +import argparse +import textwrap + +def pack_rle(data): + """Use run-length encoding to pack the bytes""" + rle = [] + value = data[0] + count = 0 + for i in data: + if i != value or count == 255: + rle.append(count) + rle.append(value) + value = i + count = 1 + else: + count += 1 + rle.append(count) + rle.append(value) + return rle + +class WriteSource: + def __init__(self): + self.values = [] + + def add_pixel(self, value): + self.values.append(value) + + def convert_to_4bpp(self, data): + # Invert the image + data = map(lambda i: 255 - i, data) + # Quanitize 8-bit values into 4-bits + data = map(lambda i: i >> 4, data) + # Make sure there is an even number of elements + if (len(data) & 1) == 1: + result.append(0) + # Combine each two adjacent values into one + i = iter(data) + data = map(lambda a, b: a << 4 | b, i ,i) + # Pack the data + data = pack_rle(data) + # Convert values into hex strings + return map(lambda a: "0x" + format(a, '02x'), data) + + def end_row(self): + # Pad each row into even number of values + if len(self.values) & 1: + self.values.append(0) + + def write(self): + data = self.convert_to_4bpp(self.values) + data = ', '.join(data) + data = textwrap.fill(data, 75, initial_indent = ' ', subsequent_indent = ' ') + + print("const unsigned char font[] PROGMEM = {") + print(data); + print("};") + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Converts a grayscale bitmap into a 16-level RLE packed C array for use as font data') + parser.add_argument("input") + args = parser.parse_args() + + img = Image.open(args.input).convert('L') + + writer = WriteSource() + for y in range(img.height): + for x in range(img.width): + writer.add_pixel(img.getpixel((x,y))) + writer.end_row() + writer.write() diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/boot_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/boot_screen.cpp index b2f65848d..c697e6340 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/boot_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/boot_screen.cpp @@ -62,6 +62,7 @@ void BootScreen::onIdle() { PUSH_SCREEN(StatusScreen); } else { if (!UIFlashStorage::is_valid()) { + StatusScreen::loadBitmaps(); SpinnerDialogBox::show(F("Please wait...")); UIFlashStorage::format_flash(); SpinnerDialogBox::hide(); @@ -73,12 +74,16 @@ void BootScreen::onIdle() { if (!MediaPlayerScreen::playBootMedia()) showSplashScreen(); } + + StatusScreen::loadBitmaps(); + #ifdef LULZBOT_USE_BIOPRINTER_UI GOTO_SCREEN(BioConfirmHomeXYZ); current_screen.forget(); PUSH_SCREEN(StatusScreen); PUSH_SCREEN(BioConfirmHomeE); #else + StatusScreen::setStatusMessage(F(WELCOME_MSG)); GOTO_SCREEN(StatusScreen); #endif } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/media_player_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/media_player_screen.cpp index 5db38bec0..f336b65a6 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/media_player_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/media_player_screen.cpp @@ -161,7 +161,7 @@ void MediaPlayerScreen::playStream(void *obj, media_streamer_func_t *data_stream // everything that is stored in RAMG. cmd.cmd(CMD_DLSTART).execute(); DLCache::init(); - StatusScreen::onStartup(); + StatusScreen::loadBitmaps(); } #endif // FTDI_API_LEVEL >= 810 } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/status_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/status_screen.cpp index 420ac2b43..c5dfcfebd 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/status_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/status_screen.cpp @@ -193,8 +193,13 @@ void StatusScreen::draw_temperature(draw_mode_t what) { int8_t(getActualFan_percent(FAN0)) ); - const char *idle = PSTR("%-3d C / idle"); - const char *not_idle = PSTR("%-3d / %-3d C"); + #if defined(TOUCH_UI_USE_UTF8) && defined(TOUCH_UI_UTF8_WESTERN_CHARSET) + const char *idle = PSTR(u8"%3d°C / idle"); + const char *not_idle = PSTR(u8"%3d / %3d°C"); + #else + const char *idle = PSTR("%3d C / idle"); + const char *not_idle = PSTR("%3d / %3d C"); + #endif sprintf_P( bed_str, @@ -353,10 +358,14 @@ void StatusScreen::setStatusMessage(const char* message) { .cmd(CLEAR(true,true,true)); draw_temperature(BACKGROUND); + #ifdef TOUCH_UI_USE_UTF8 + load_utf8_bitmaps(cmd); + #endif draw_progress(BACKGROUND); draw_axis_position(BACKGROUND); draw_status_message(BACKGROUND, message); draw_interaction_buttons(BACKGROUND); + storeBackground(); #ifdef UI_FRAMEWORK_DEBUG @@ -369,9 +378,8 @@ void StatusScreen::setStatusMessage(const char* message) { } } -void StatusScreen::onStartup() { +void StatusScreen::loadBitmaps() { // Load the bitmaps for the status screen - using namespace Theme; constexpr uint32_t base = ftdi_memory_map::RAM_G; CLCD::mem_write_pgm(base + TD_Icon_Info.RAMG_offset, TD_Icon, sizeof(TD_Icon)); @@ -379,8 +387,13 @@ void StatusScreen::onStartup() { CLCD::mem_write_pgm(base + Bed_Heat_Icon_Info.RAMG_offset, Bed_Heat_Icon, sizeof(Bed_Heat_Icon)); CLCD::mem_write_pgm(base + Fan_Icon_Info.RAMG_offset, Fan_Icon, sizeof(Fan_Icon)); - setStatusMessage(F(WELCOME_MSG)); + // Load fonts for internationalization + #ifdef TOUCH_UI_USE_UTF8 + load_utf8_data(base + UTF8_FONT_OFFSET); + #endif +} +void StatusScreen::onStartup() { UIFlashStorage::initialize(); } diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/temperature_screen.cpp b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/temperature_screen.cpp index 126562d01..841e1d940 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/temperature_screen.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/screens/temperature_screen.cpp @@ -32,7 +32,14 @@ using namespace ExtUI; void TemperatureScreen::onRedraw(draw_mode_t what) { widgets_t w(what); - w.precision(0).color(temp).units(PSTR("C")); + w.precision(0).color(temp).units( + PSTR( + #if defined(TOUCH_UI_USE_UTF8) && defined(TOUCH_UI_UTF8_WESTERN_CHARSET) + u8"°C" + #else + "C" + #endif + )); w.heading( PSTR("Temperature:")); w.button(30, PSTR("Cooldown (All Off)")); #ifndef LULZBOT_DISABLE_TOOLHEAD_HEATER diff --git a/Marlin/src/lcd/extensible_ui/lib/lulzbot/theme/bitmaps.h b/Marlin/src/lcd/extensible_ui/lib/lulzbot/theme/bitmaps.h index da6188ab9..00952cfc5 100644 --- a/Marlin/src/lcd/extensible_ui/lib/lulzbot/theme/bitmaps.h +++ b/Marlin/src/lcd/extensible_ui/lib/lulzbot/theme/bitmaps.h @@ -178,4 +178,6 @@ namespace Theme { 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00 }; + + constexpr PROGMEM uint32_t UTF8_FONT_OFFSET = 10000; }; // namespace Theme diff --git a/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu b/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu index b1c34930b..cd9718bfb 100644 --- a/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu +++ b/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu @@ -63,4 +63,4 @@ "id": "AutoBuild", "mnemonic": "A" } -] \ No newline at end of file +] diff --git a/config/default/Configuration_adv.h b/config/default/Configuration_adv.h index fd61fc7c4..0beb3ef4e 100644 --- a/config/default/Configuration_adv.h +++ b/config/default/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/3DFabXYZ/Migbot/Configuration_adv.h b/config/examples/3DFabXYZ/Migbot/Configuration_adv.h index 01dd28c0b..1c64ffea5 100644 --- a/config/examples/3DFabXYZ/Migbot/Configuration_adv.h +++ b/config/examples/3DFabXYZ/Migbot/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/ADIMLab/Gantry v1/Configuration_adv.h b/config/examples/ADIMLab/Gantry v1/Configuration_adv.h index f9a2a2f7a..672bab0cc 100644 --- a/config/examples/ADIMLab/Gantry v1/Configuration_adv.h +++ b/config/examples/ADIMLab/Gantry v1/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/ADIMLab/Gantry v2/Configuration_adv.h b/config/examples/ADIMLab/Gantry v2/Configuration_adv.h index e2642e141..ca6f419d4 100644 --- a/config/examples/ADIMLab/Gantry v2/Configuration_adv.h +++ b/config/examples/ADIMLab/Gantry v2/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/AlephObjects/TAZ4/Configuration_adv.h b/config/examples/AlephObjects/TAZ4/Configuration_adv.h index fa590fec3..9a3b1d744 100644 --- a/config/examples/AlephObjects/TAZ4/Configuration_adv.h +++ b/config/examples/AlephObjects/TAZ4/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Alfawise/U20-bltouch/Configuration_adv.h b/config/examples/Alfawise/U20-bltouch/Configuration_adv.h index 667c93a19..4c5400909 100644 --- a/config/examples/Alfawise/U20-bltouch/Configuration_adv.h +++ b/config/examples/Alfawise/U20-bltouch/Configuration_adv.h @@ -1209,6 +1209,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Alfawise/U20/Configuration_adv.h b/config/examples/Alfawise/U20/Configuration_adv.h index dff74f254..a20eaaa7f 100644 --- a/config/examples/Alfawise/U20/Configuration_adv.h +++ b/config/examples/Alfawise/U20/Configuration_adv.h @@ -1208,6 +1208,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/AliExpress/UM2pExt/Configuration_adv.h b/config/examples/AliExpress/UM2pExt/Configuration_adv.h index f8832bf51..7a0009b98 100644 --- a/config/examples/AliExpress/UM2pExt/Configuration_adv.h +++ b/config/examples/AliExpress/UM2pExt/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Anet/A2/Configuration_adv.h b/config/examples/Anet/A2/Configuration_adv.h index 3ef8bdf46..cf6407890 100644 --- a/config/examples/Anet/A2/Configuration_adv.h +++ b/config/examples/Anet/A2/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Anet/A2plus/Configuration_adv.h b/config/examples/Anet/A2plus/Configuration_adv.h index 3ef8bdf46..cf6407890 100644 --- a/config/examples/Anet/A2plus/Configuration_adv.h +++ b/config/examples/Anet/A2plus/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Anet/A6/Configuration_adv.h b/config/examples/Anet/A6/Configuration_adv.h index 4c653ecb8..c009726f2 100644 --- a/config/examples/Anet/A6/Configuration_adv.h +++ b/config/examples/Anet/A6/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Anet/A8/Configuration_adv.h b/config/examples/Anet/A8/Configuration_adv.h index b76295459..7b75ae1d9 100644 --- a/config/examples/Anet/A8/Configuration_adv.h +++ b/config/examples/Anet/A8/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Anet/A8plus/Configuration_adv.h b/config/examples/Anet/A8plus/Configuration_adv.h index 6e316f8ef..8da311ef8 100644 --- a/config/examples/Anet/A8plus/Configuration_adv.h +++ b/config/examples/Anet/A8plus/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Anet/E16/Configuration_adv.h b/config/examples/Anet/E16/Configuration_adv.h index a03866045..698aa63f0 100644 --- a/config/examples/Anet/E16/Configuration_adv.h +++ b/config/examples/Anet/E16/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/AnyCubic/i3/Configuration_adv.h b/config/examples/AnyCubic/i3/Configuration_adv.h index 71c4de309..60ef2b988 100644 --- a/config/examples/AnyCubic/i3/Configuration_adv.h +++ b/config/examples/AnyCubic/i3/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/ArmEd/Configuration_adv.h b/config/examples/ArmEd/Configuration_adv.h index 52018cea9..1b284f0d3 100644 --- a/config/examples/ArmEd/Configuration_adv.h +++ b/config/examples/ArmEd/Configuration_adv.h @@ -1209,6 +1209,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h b/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h index c66417e0c..17662bbf5 100644 --- a/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h +++ b/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/BIBO/TouchX/default/Configuration_adv.h b/config/examples/BIBO/TouchX/default/Configuration_adv.h index 5fe76986b..3e3be7f56 100644 --- a/config/examples/BIBO/TouchX/default/Configuration_adv.h +++ b/config/examples/BIBO/TouchX/default/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/BQ/Hephestos/Configuration_adv.h b/config/examples/BQ/Hephestos/Configuration_adv.h index f4d751d6e..0e49f27e8 100644 --- a/config/examples/BQ/Hephestos/Configuration_adv.h +++ b/config/examples/BQ/Hephestos/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/BQ/Hephestos_2/Configuration_adv.h b/config/examples/BQ/Hephestos_2/Configuration_adv.h index 47d61d3e2..cdf0ef941 100644 --- a/config/examples/BQ/Hephestos_2/Configuration_adv.h +++ b/config/examples/BQ/Hephestos_2/Configuration_adv.h @@ -1213,6 +1213,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/BQ/WITBOX/Configuration_adv.h b/config/examples/BQ/WITBOX/Configuration_adv.h index f4d751d6e..0e49f27e8 100644 --- a/config/examples/BQ/WITBOX/Configuration_adv.h +++ b/config/examples/BQ/WITBOX/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Cartesio/Configuration_adv.h b/config/examples/Cartesio/Configuration_adv.h index 680a27109..34edea512 100644 --- a/config/examples/Cartesio/Configuration_adv.h +++ b/config/examples/Cartesio/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Creality/CR-10/Configuration_adv.h b/config/examples/Creality/CR-10/Configuration_adv.h index a24ee4335..f1a347db1 100644 --- a/config/examples/Creality/CR-10/Configuration_adv.h +++ b/config/examples/Creality/CR-10/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Creality/CR-10S/Configuration_adv.h b/config/examples/Creality/CR-10S/Configuration_adv.h index 3039d93b5..e033545e7 100644 --- a/config/examples/Creality/CR-10S/Configuration_adv.h +++ b/config/examples/Creality/CR-10S/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Creality/CR-10_5S/Configuration_adv.h b/config/examples/Creality/CR-10_5S/Configuration_adv.h index be2706933..f45dc5b33 100644 --- a/config/examples/Creality/CR-10_5S/Configuration_adv.h +++ b/config/examples/Creality/CR-10_5S/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Creality/CR-10mini/Configuration_adv.h b/config/examples/Creality/CR-10mini/Configuration_adv.h index 44b247c56..38c355d51 100644 --- a/config/examples/Creality/CR-10mini/Configuration_adv.h +++ b/config/examples/Creality/CR-10mini/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Creality/CR-20 Pro/Configuration_adv.h b/config/examples/Creality/CR-20 Pro/Configuration_adv.h index 0eb08b381..6876f0b57 100644 --- a/config/examples/Creality/CR-20 Pro/Configuration_adv.h +++ b/config/examples/Creality/CR-20 Pro/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Creality/CR-20/Configuration_adv.h b/config/examples/Creality/CR-20/Configuration_adv.h index cdd5071d8..52cf88618 100644 --- a/config/examples/Creality/CR-20/Configuration_adv.h +++ b/config/examples/Creality/CR-20/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Creality/CR-8/Configuration_adv.h b/config/examples/Creality/CR-8/Configuration_adv.h index 5690f1e5c..052f0c8f2 100644 --- a/config/examples/Creality/CR-8/Configuration_adv.h +++ b/config/examples/Creality/CR-8/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Creality/Ender-2/Configuration_adv.h b/config/examples/Creality/Ender-2/Configuration_adv.h index 49b29c96f..bb9a49696 100644 --- a/config/examples/Creality/Ender-2/Configuration_adv.h +++ b/config/examples/Creality/Ender-2/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Creality/Ender-3/Configuration_adv.h b/config/examples/Creality/Ender-3/Configuration_adv.h index 0c19e4a49..56d361568 100644 --- a/config/examples/Creality/Ender-3/Configuration_adv.h +++ b/config/examples/Creality/Ender-3/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Creality/Ender-4/Configuration_adv.h b/config/examples/Creality/Ender-4/Configuration_adv.h index 18d427c71..f69c73f7f 100644 --- a/config/examples/Creality/Ender-4/Configuration_adv.h +++ b/config/examples/Creality/Ender-4/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Creality/Ender-5/Configuration_adv.h b/config/examples/Creality/Ender-5/Configuration_adv.h index bcc725e71..6788703c1 100644 --- a/config/examples/Creality/Ender-5/Configuration_adv.h +++ b/config/examples/Creality/Ender-5/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Dagoma/Disco Ultimate/Configuration_adv.h b/config/examples/Dagoma/Disco Ultimate/Configuration_adv.h index c4e7ead07..0d4cf77dd 100644 --- a/config/examples/Dagoma/Disco Ultimate/Configuration_adv.h +++ b/config/examples/Dagoma/Disco Ultimate/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/EVNOVO (Artillery)/Sidewinder X1/Configuration_adv.h b/config/examples/EVNOVO (Artillery)/Sidewinder X1/Configuration_adv.h index 2ef2d2f48..5d5d623bf 100755 --- a/config/examples/EVNOVO (Artillery)/Sidewinder X1/Configuration_adv.h +++ b/config/examples/EVNOVO (Artillery)/Sidewinder X1/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Einstart-S/Configuration_adv.h b/config/examples/Einstart-S/Configuration_adv.h index f18712292..3c91537cb 100644 --- a/config/examples/Einstart-S/Configuration_adv.h +++ b/config/examples/Einstart-S/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/FYSETC/AIO_II/Configuration_adv.h b/config/examples/FYSETC/AIO_II/Configuration_adv.h index 3eb56b8f3..14f2b0f01 100644 --- a/config/examples/FYSETC/AIO_II/Configuration_adv.h +++ b/config/examples/FYSETC/AIO_II/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/FYSETC/Cheetah 1.2/BLTouch/Configuration_adv.h b/config/examples/FYSETC/Cheetah 1.2/BLTouch/Configuration_adv.h index 859292aba..c974cc3b5 100644 --- a/config/examples/FYSETC/Cheetah 1.2/BLTouch/Configuration_adv.h +++ b/config/examples/FYSETC/Cheetah 1.2/BLTouch/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/FYSETC/Cheetah 1.2/base/Configuration_adv.h b/config/examples/FYSETC/Cheetah 1.2/base/Configuration_adv.h index 859292aba..c974cc3b5 100644 --- a/config/examples/FYSETC/Cheetah 1.2/base/Configuration_adv.h +++ b/config/examples/FYSETC/Cheetah 1.2/base/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/FYSETC/Cheetah/BLTouch/Configuration_adv.h b/config/examples/FYSETC/Cheetah/BLTouch/Configuration_adv.h index 859292aba..c974cc3b5 100644 --- a/config/examples/FYSETC/Cheetah/BLTouch/Configuration_adv.h +++ b/config/examples/FYSETC/Cheetah/BLTouch/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/FYSETC/Cheetah/base/Configuration_adv.h b/config/examples/FYSETC/Cheetah/base/Configuration_adv.h index 859292aba..c974cc3b5 100644 --- a/config/examples/FYSETC/Cheetah/base/Configuration_adv.h +++ b/config/examples/FYSETC/Cheetah/base/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/FYSETC/F6_13/Configuration_adv.h b/config/examples/FYSETC/F6_13/Configuration_adv.h index 34daecb50..35134d5a7 100644 --- a/config/examples/FYSETC/F6_13/Configuration_adv.h +++ b/config/examples/FYSETC/F6_13/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Felix/Configuration_adv.h b/config/examples/Felix/Configuration_adv.h index 8f634be47..c59c29407 100644 --- a/config/examples/Felix/Configuration_adv.h +++ b/config/examples/Felix/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/FlashForge/CreatorPro/Configuration_adv.h b/config/examples/FlashForge/CreatorPro/Configuration_adv.h index 4298a7b92..67a557cdd 100644 --- a/config/examples/FlashForge/CreatorPro/Configuration_adv.h +++ b/config/examples/FlashForge/CreatorPro/Configuration_adv.h @@ -1204,6 +1204,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/FolgerTech/i3-2020/Configuration_adv.h b/config/examples/FolgerTech/i3-2020/Configuration_adv.h index d76a1e9fb..508f34505 100644 --- a/config/examples/FolgerTech/i3-2020/Configuration_adv.h +++ b/config/examples/FolgerTech/i3-2020/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Formbot/Raptor/Configuration_adv.h b/config/examples/Formbot/Raptor/Configuration_adv.h index 1839493d2..3625e2a78 100644 --- a/config/examples/Formbot/Raptor/Configuration_adv.h +++ b/config/examples/Formbot/Raptor/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Formbot/T_Rex_2+/Configuration_adv.h b/config/examples/Formbot/T_Rex_2+/Configuration_adv.h index 0d9836ec2..60aba4326 100644 --- a/config/examples/Formbot/T_Rex_2+/Configuration_adv.h +++ b/config/examples/Formbot/T_Rex_2+/Configuration_adv.h @@ -1209,6 +1209,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Formbot/T_Rex_3/Configuration_adv.h b/config/examples/Formbot/T_Rex_3/Configuration_adv.h index 1202da297..a39b36ce9 100644 --- a/config/examples/Formbot/T_Rex_3/Configuration_adv.h +++ b/config/examples/Formbot/T_Rex_3/Configuration_adv.h @@ -1209,6 +1209,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Geeetech/A10/Configuration_adv.h b/config/examples/Geeetech/A10/Configuration_adv.h index 0d84fb846..8a0a3e3b7 100644 --- a/config/examples/Geeetech/A10/Configuration_adv.h +++ b/config/examples/Geeetech/A10/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Geeetech/A10M/Configuration_adv.h b/config/examples/Geeetech/A10M/Configuration_adv.h index 3aecc80de..a371b110a 100644 --- a/config/examples/Geeetech/A10M/Configuration_adv.h +++ b/config/examples/Geeetech/A10M/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Geeetech/A20M/Configuration_adv.h b/config/examples/Geeetech/A20M/Configuration_adv.h index adff4d988..d0361f0c5 100644 --- a/config/examples/Geeetech/A20M/Configuration_adv.h +++ b/config/examples/Geeetech/A20M/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Geeetech/MeCreator2/Configuration_adv.h b/config/examples/Geeetech/MeCreator2/Configuration_adv.h index 02c2d434e..1c5bae71d 100644 --- a/config/examples/Geeetech/MeCreator2/Configuration_adv.h +++ b/config/examples/Geeetech/MeCreator2/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h b/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h index 0d84fb846..8a0a3e3b7 100644 --- a/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h +++ b/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h b/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h index 0d84fb846..8a0a3e3b7 100644 --- a/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h +++ b/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Infitary/i3-M508/Configuration_adv.h b/config/examples/Infitary/i3-M508/Configuration_adv.h index 73a11bd81..82310c770 100644 --- a/config/examples/Infitary/i3-M508/Configuration_adv.h +++ b/config/examples/Infitary/i3-M508/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/JGAurora/A1/Configuration_adv.h b/config/examples/JGAurora/A1/Configuration_adv.h index 05a21dc72..c9213cbf0 100644 --- a/config/examples/JGAurora/A1/Configuration_adv.h +++ b/config/examples/JGAurora/A1/Configuration_adv.h @@ -1210,6 +1210,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/JGAurora/A5/Configuration_adv.h b/config/examples/JGAurora/A5/Configuration_adv.h index 835d812f5..c18c3ab72 100644 --- a/config/examples/JGAurora/A5/Configuration_adv.h +++ b/config/examples/JGAurora/A5/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/JGAurora/A5S/Configuration_adv.h b/config/examples/JGAurora/A5S/Configuration_adv.h index 05a21dc72..c9213cbf0 100644 --- a/config/examples/JGAurora/A5S/Configuration_adv.h +++ b/config/examples/JGAurora/A5S/Configuration_adv.h @@ -1210,6 +1210,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/MakerParts/Configuration_adv.h b/config/examples/MakerParts/Configuration_adv.h index 63394b39d..21bc2c665 100644 --- a/config/examples/MakerParts/Configuration_adv.h +++ b/config/examples/MakerParts/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Malyan/M150/Configuration_adv.h b/config/examples/Malyan/M150/Configuration_adv.h index 0fc00b7ca..a012f5946 100644 --- a/config/examples/Malyan/M150/Configuration_adv.h +++ b/config/examples/Malyan/M150/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Malyan/M200/Configuration_adv.h b/config/examples/Malyan/M200/Configuration_adv.h index f87f6e800..f4b110bfc 100644 --- a/config/examples/Malyan/M200/Configuration_adv.h +++ b/config/examples/Malyan/M200/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Micromake/C1/enhanced/Configuration_adv.h b/config/examples/Micromake/C1/enhanced/Configuration_adv.h index ea3b96184..287c827b5 100644 --- a/config/examples/Micromake/C1/enhanced/Configuration_adv.h +++ b/config/examples/Micromake/C1/enhanced/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Mks/Robin/Configuration_adv.h b/config/examples/Mks/Robin/Configuration_adv.h index bf2595505..d6bd8aac5 100644 --- a/config/examples/Mks/Robin/Configuration_adv.h +++ b/config/examples/Mks/Robin/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Mks/Sbase/Configuration_adv.h b/config/examples/Mks/Sbase/Configuration_adv.h index 1a607ac4b..3f795cb07 100644 --- a/config/examples/Mks/Sbase/Configuration_adv.h +++ b/config/examples/Mks/Sbase/Configuration_adv.h @@ -1206,6 +1206,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/RapideLite/RL200/Configuration_adv.h b/config/examples/RapideLite/RL200/Configuration_adv.h index 810613771..11a91529f 100644 --- a/config/examples/RapideLite/RL200/Configuration_adv.h +++ b/config/examples/RapideLite/RL200/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/RigidBot/Configuration_adv.h b/config/examples/RigidBot/Configuration_adv.h index 51c88384a..2d645457b 100644 --- a/config/examples/RigidBot/Configuration_adv.h +++ b/config/examples/RigidBot/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/SCARA/Configuration_adv.h b/config/examples/SCARA/Configuration_adv.h index b22f88e74..95509ab76 100644 --- a/config/examples/SCARA/Configuration_adv.h +++ b/config/examples/SCARA/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/STM32/Black_STM32F407VET6/Configuration_adv.h b/config/examples/STM32/Black_STM32F407VET6/Configuration_adv.h index a96aef970..14f142e65 100644 --- a/config/examples/STM32/Black_STM32F407VET6/Configuration_adv.h +++ b/config/examples/STM32/Black_STM32F407VET6/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Sanguinololu/Configuration_adv.h b/config/examples/Sanguinololu/Configuration_adv.h index 29a2abd7a..cadb58055 100644 --- a/config/examples/Sanguinololu/Configuration_adv.h +++ b/config/examples/Sanguinololu/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Tevo/Michelangelo/Configuration_adv.h b/config/examples/Tevo/Michelangelo/Configuration_adv.h index 4cad2a925..bd76b9957 100644 --- a/config/examples/Tevo/Michelangelo/Configuration_adv.h +++ b/config/examples/Tevo/Michelangelo/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Tevo/Tarantula Pro/Configuration_adv.h b/config/examples/Tevo/Tarantula Pro/Configuration_adv.h index 8d37dee77..fd72823bc 100755 --- a/config/examples/Tevo/Tarantula Pro/Configuration_adv.h +++ b/config/examples/Tevo/Tarantula Pro/Configuration_adv.h @@ -1201,6 +1201,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Tevo/Tornado/V1 (MKS Base)/Configuration_adv.h b/config/examples/Tevo/Tornado/V1 (MKS Base)/Configuration_adv.h index f97f72eb1..1f69b3a01 100755 --- a/config/examples/Tevo/Tornado/V1 (MKS Base)/Configuration_adv.h +++ b/config/examples/Tevo/Tornado/V1 (MKS Base)/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Tevo/Tornado/V2 (MKS GEN-L)/Configuration_adv.h b/config/examples/Tevo/Tornado/V2 (MKS GEN-L)/Configuration_adv.h index f97f72eb1..1f69b3a01 100755 --- a/config/examples/Tevo/Tornado/V2 (MKS GEN-L)/Configuration_adv.h +++ b/config/examples/Tevo/Tornado/V2 (MKS GEN-L)/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/TheBorg/Configuration_adv.h b/config/examples/TheBorg/Configuration_adv.h index 548ba0415..f37061fa6 100644 --- a/config/examples/TheBorg/Configuration_adv.h +++ b/config/examples/TheBorg/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/TinyBoy2/Configuration_adv.h b/config/examples/TinyBoy2/Configuration_adv.h index ed17f88c2..e405d0db7 100644 --- a/config/examples/TinyBoy2/Configuration_adv.h +++ b/config/examples/TinyBoy2/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Tronxy/X3A/Configuration_adv.h b/config/examples/Tronxy/X3A/Configuration_adv.h index 4de9a8195..f97df9423 100644 --- a/config/examples/Tronxy/X3A/Configuration_adv.h +++ b/config/examples/Tronxy/X3A/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Tronxy/X5S-2E/Configuration_adv.h b/config/examples/Tronxy/X5S-2E/Configuration_adv.h index 890f23f58..b97e94ae8 100644 --- a/config/examples/Tronxy/X5S-2E/Configuration_adv.h +++ b/config/examples/Tronxy/X5S-2E/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/UltiMachine/Archim1/Configuration_adv.h b/config/examples/UltiMachine/Archim1/Configuration_adv.h index eeac2772d..354748734 100644 --- a/config/examples/UltiMachine/Archim1/Configuration_adv.h +++ b/config/examples/UltiMachine/Archim1/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/UltiMachine/Archim2/Configuration_adv.h b/config/examples/UltiMachine/Archim2/Configuration_adv.h index 68de71aaf..c59605fb8 100644 --- a/config/examples/UltiMachine/Archim2/Configuration_adv.h +++ b/config/examples/UltiMachine/Archim2/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/VORONDesign/Configuration_adv.h b/config/examples/VORONDesign/Configuration_adv.h index de4e0ae81..cd0f68acf 100644 --- a/config/examples/VORONDesign/Configuration_adv.h +++ b/config/examples/VORONDesign/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Velleman/K8200/Configuration_adv.h b/config/examples/Velleman/K8200/Configuration_adv.h index b06c63457..c0c746e12 100644 --- a/config/examples/Velleman/K8200/Configuration_adv.h +++ b/config/examples/Velleman/K8200/Configuration_adv.h @@ -1218,6 +1218,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Velleman/K8400/Configuration_adv.h b/config/examples/Velleman/K8400/Configuration_adv.h index 9cc8b8ad7..9820b7dab 100644 --- a/config/examples/Velleman/K8400/Configuration_adv.h +++ b/config/examples/Velleman/K8400/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/WASP/PowerWASP/Configuration_adv.h b/config/examples/WASP/PowerWASP/Configuration_adv.h index e33415267..051c3fd7b 100644 --- a/config/examples/WASP/PowerWASP/Configuration_adv.h +++ b/config/examples/WASP/PowerWASP/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Wanhao/Duplicator 6/Configuration_adv.h b/config/examples/Wanhao/Duplicator 6/Configuration_adv.h index d8c20c700..59748b34f 100644 --- a/config/examples/Wanhao/Duplicator 6/Configuration_adv.h +++ b/config/examples/Wanhao/Duplicator 6/Configuration_adv.h @@ -1207,6 +1207,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/Wanhao/Duplicator i3 Mini/Configuration_adv.h b/config/examples/Wanhao/Duplicator i3 Mini/Configuration_adv.h index 3b74b2e52..27ab37cb1 100644 --- a/config/examples/Wanhao/Duplicator i3 Mini/Configuration_adv.h +++ b/config/examples/Wanhao/Duplicator i3 Mini/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/delta/Anycubic/Kossel/Configuration_adv.h b/config/examples/delta/Anycubic/Kossel/Configuration_adv.h index ad6e65b7f..faf56b6eb 100644 --- a/config/examples/delta/Anycubic/Kossel/Configuration_adv.h +++ b/config/examples/delta/Anycubic/Kossel/Configuration_adv.h @@ -1207,6 +1207,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/delta/Dreammaker/Overlord/Configuration_adv.h b/config/examples/delta/Dreammaker/Overlord/Configuration_adv.h index 4fd379f25..a7d512dae 100644 --- a/config/examples/delta/Dreammaker/Overlord/Configuration_adv.h +++ b/config/examples/delta/Dreammaker/Overlord/Configuration_adv.h @@ -1207,6 +1207,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/delta/Dreammaker/Overlord_Pro/Configuration_adv.h b/config/examples/delta/Dreammaker/Overlord_Pro/Configuration_adv.h index 4fd379f25..a7d512dae 100644 --- a/config/examples/delta/Dreammaker/Overlord_Pro/Configuration_adv.h +++ b/config/examples/delta/Dreammaker/Overlord_Pro/Configuration_adv.h @@ -1207,6 +1207,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h b/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h index 17512317d..7d089829d 100644 --- a/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h +++ b/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h @@ -1207,6 +1207,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/delta/FLSUN/kossel/Configuration_adv.h b/config/examples/delta/FLSUN/kossel/Configuration_adv.h index 17512317d..7d089829d 100644 --- a/config/examples/delta/FLSUN/kossel/Configuration_adv.h +++ b/config/examples/delta/FLSUN/kossel/Configuration_adv.h @@ -1207,6 +1207,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h b/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h index 3c644e1b7..20423cd99 100644 --- a/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h +++ b/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h @@ -1207,6 +1207,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/delta/Geeetech/Rostock 301/Configuration_adv.h b/config/examples/delta/Geeetech/Rostock 301/Configuration_adv.h index e9ceba9bf..2c461a62e 100644 --- a/config/examples/delta/Geeetech/Rostock 301/Configuration_adv.h +++ b/config/examples/delta/Geeetech/Rostock 301/Configuration_adv.h @@ -1207,6 +1207,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/delta/MKS/SBASE/Configuration_adv.h b/config/examples/delta/MKS/SBASE/Configuration_adv.h index 4ca71cc92..a52ec2cb1 100644 --- a/config/examples/delta/MKS/SBASE/Configuration_adv.h +++ b/config/examples/delta/MKS/SBASE/Configuration_adv.h @@ -1207,6 +1207,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/delta/Tevo Little Monster/Configuration_adv.h b/config/examples/delta/Tevo Little Monster/Configuration_adv.h index ab8ce275b..17c94c06c 100644 --- a/config/examples/delta/Tevo Little Monster/Configuration_adv.h +++ b/config/examples/delta/Tevo Little Monster/Configuration_adv.h @@ -1207,6 +1207,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/delta/generic/Configuration_adv.h b/config/examples/delta/generic/Configuration_adv.h index 3c644e1b7..20423cd99 100644 --- a/config/examples/delta/generic/Configuration_adv.h +++ b/config/examples/delta/generic/Configuration_adv.h @@ -1207,6 +1207,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/delta/kossel_mini/Configuration_adv.h b/config/examples/delta/kossel_mini/Configuration_adv.h index 3c644e1b7..20423cd99 100644 --- a/config/examples/delta/kossel_mini/Configuration_adv.h +++ b/config/examples/delta/kossel_mini/Configuration_adv.h @@ -1207,6 +1207,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/delta/kossel_xl/Configuration_adv.h b/config/examples/delta/kossel_xl/Configuration_adv.h index ff4856232..f74602336 100644 --- a/config/examples/delta/kossel_xl/Configuration_adv.h +++ b/config/examples/delta/kossel_xl/Configuration_adv.h @@ -1207,6 +1207,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/gCreate/gMax1.5+/Configuration_adv.h b/config/examples/gCreate/gMax1.5+/Configuration_adv.h index 2dbbd149c..dc7a8af38 100644 --- a/config/examples/gCreate/gMax1.5+/Configuration_adv.h +++ b/config/examples/gCreate/gMax1.5+/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/makibox/Configuration_adv.h b/config/examples/makibox/Configuration_adv.h index ccf17b5f9..f3941d65b 100644 --- a/config/examples/makibox/Configuration_adv.h +++ b/config/examples/makibox/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/tvrrug/Round2/Configuration_adv.h b/config/examples/tvrrug/Round2/Configuration_adv.h index 31ca42a10..c38546fd7 100644 --- a/config/examples/tvrrug/Round2/Configuration_adv.h +++ b/config/examples/tvrrug/Round2/Configuration_adv.h @@ -1205,6 +1205,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE diff --git a/config/examples/wt150/Configuration_adv.h b/config/examples/wt150/Configuration_adv.h index 19e912d9c..d2d8e9575 100644 --- a/config/examples/wt150/Configuration_adv.h +++ b/config/examples/wt150/Configuration_adv.h @@ -1206,6 +1206,12 @@ //#define TOUCH_UI_PORTRAIT //#define TOUCH_UI_MIRRORED + // Enable UTF8 rendering capabilities. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #endif + // Use a numeric passcode for "Screen lock" keypad. // (recommended for smaller displays) //#define TOUCH_UI_PASSCODE