Lulzbot ExtUI Western language support (#15208)

Fix #15134
This commit is contained in:
Marcio Teixeira 2019-09-10 19:07:03 -06:00 committed by Scott Lahteine
parent c590e8ac05
commit 47d19bab40
130 changed files with 2853 additions and 69 deletions

View file

@ -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

View file

@ -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

View file

@ -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);

View file

@ -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<typename T>
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<typename T> 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);
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);
#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;
}

View file

@ -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"

View file

@ -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);
}

View file

@ -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);
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;
}
// 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;
if (c == '\0' || c == '\n') break;
}
lw += fm.get_char_width(c);
}
return width;
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;
#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;
}

View file

@ -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.

View file

@ -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: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#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

View file

@ -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: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#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);
}

View file

@ -0,0 +1,343 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="38"
height="1225"
viewBox="0 0 10.054166 324.11458"
version="1.1"
id="svg8"
inkscape:version="0.92.1 r15371"
sodipodi:docname="western_european_bitmap_31.svg"
inkscape:export-filename="/home/aleph/git-repos/marlin-devel/tests/ftdi-eve-lib-examples/unicode_demo/src/ftdi_eve_lib/extended/unicode/font_bitmaps/western_european_bitmap_31.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="3.6948106"
inkscape:cx="25.324413"
inkscape:cy="265.38829"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1382"
inkscape:window-height="815"
inkscape:window-x="2126"
inkscape:window-y="131"
inkscape:window-maximized="0">
<inkscape:grid
type="xygrid"
id="grid4838"
spacingx="10.583333"
spacingy="12.964583"
originy="0"
empspacing="1"
color="#000000"
opacity="0"
originx="0"
empcolor="#3fff69"
empopacity="0.25098039" />
<inkscape:grid
type="xygrid"
id="grid4528"
spacingx="10.583333"
spacingy="12.964583"
originx="0"
originy="2.6987499"
color="#c93f24"
opacity="0.1254902"
dotted="false"
empspacing="1"
visible="true" />
<inkscape:grid
type="xygrid"
id="grid4530"
spacingx="10.583333"
spacingy="12.964583"
color="#3f5fff"
opacity="0.69019608"
originy="8.8106248"
empcolor="#593fff"
empopacity="0.25098039"
empspacing="1"
visible="true"
enabled="true" />
<inkscape:grid
type="xygrid"
id="grid4532"
spacingx="10.583333"
spacingy="12.964583"
empspacing="1"
color="#ffa03f"
opacity="0.1254902"
originy="10.689166"
visible="true" />
<inkscape:grid
type="xygrid"
id="grid4653"
empcolor="#ff663f"
empopacity="0.25098039"
spacingx="10.583333"
spacingy="12.964583"
originy="6.6145831"
visible="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,27.114583)">
<image
y="-947.59998"
x="-1.7763568e-15"
id="image4606"
xlink:href="data:image/png;base64,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 9WNCyv1Edu3wHGNUV90K1R74jGWZL2fMuApD8zqmJ5qccVUmalleR2+RrV66shZaf95Cuqf9cJLA tqyFVQzfGKNP8O5o0Cy6umxmXDbs9WNJrvTdk3zWbHJTl5HE1AIANR8+47HyjBvj6LcMXYPW80q6 9OFae7Coe9MPoeg78tBynYjRw5ZX2FZaW8kAHqEQoRChEKEQoRChEKEQoRCRTug0A6+U2MhQcwDv EQUio8ZoYQUie5hej3H0AOH1GFtYVv4wZYiTmF5tkA44k/CY67QQJx346t9GCV2Tv3x+aHuyUkt2 3baY69n+QZGEvA9tL103k+EWSlUpbkbLpXunVohQiFCIUIhQiLCEJqEQoRChEKEQoRChEKEQoRCR Tug2A2+UJYVIZpNO6LvLRkcUqXbnigwiT+myJQlvV2zJ67giOt5fSnCXbV0tvC34UiMTyTODL+/M LDBaytMiisTW4Mvsrjp4xkKCd2bcje9oPoe2VorbXiLhndVddTCcXxbNlPyyEULyyyIJyy+L4ja/ bEce021+2Y5zCaNBI1IOpWcQNpSOIl0LKUQoRChEKEQoRChEpBP68ca4oooXka6F0gndvuRvHQZl QSFCIUIhQiFCIUIhQiFCIUIhQiFCIUIhQiFCIUIhQiEindDtlN6OlQ7pWiid0I8uyxC7T9dCChEK EQoRChEKEaclNHc+09K10P9KmbuHSys5W6iUHO9CpTQugV9B3i4rJUe3PSeNYhe/hHbfk/K3UCkP eJalSudazaXQrm7rTgmcxXO6rJQ996RntVApm7Onapjdbc/rslKSZeCdkT7fPpLutNJZrfTcFirl AaGF5Rtd72A4vT1VqZYZNFU9PUhVkWA2ChEKEQoRChEKEZf7l72TftQxk3RC/0rZP/P6TroWUohQ iFCIUIhQiFCIUIhQiFCIUIhQiFCIUIhQiFCIUIhIJ1Q1C7uSdC2UTuh0FnYn6VpIIUIhQiFCIUIh oroAwNbtMc7YvgT+EelcLoE/SB0mXx3T/yWUfs+XM7atON9e7Pjum2+/U5PA9CXwNQdwxfnBzpHs 1yvTOLo85Vm2E4UIhQiFCIUIhQiFCIUIhQiFCIUIhQiFCIUIhQiFCIUIhQiFCIUIhQiFCIUIhQiF CIUIhQiFCIUIhQiFiHRC4dlTo8uR0rVQOiGzpwiFCIUIhQiFCIUIhYjTrIUUqTifMtvTuV6vV4ra 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 D0RLvqLfhwzgEQoRChEKEQoRChEKEQoRChEKEQoRChEKEZcZeLUzaltygygDL3J65nJ+qCeIty2A dwjMkDIDj8gbwItke7zsquRqD3+zhSJRiFCICBGKfHxMaaF096ER0kUUqwN4pdQF8aa/D71DrRHx 5O+Ol82QQaGag7VGH4nud+pZPOuy34FChEKEQoSbgxIKEQoRChEKEQoRChEKEemEmmY/3rmLDo28 6HXHy2Zk310KjSQIjPJLqKeLpgqRyOe/Tw3g7Vz6fjAcwIsm3X3oMiVw16AxbwtlQSFCIeJSaFdm 8GVK4C6e02Wl1L2kLU8JPDvoDJGDX+9Dr9ereVvmSC4z8GqIjpVdCtUcbNZV2f0KO4tnXfY7UIhQ iFCIaFqMcsWy5O0dKEQoRChEKEQoRChEKESkE6reA2/VxPpwBl40KLR6rnF4CXw0VS/5K2dAsMtS TccYwCsKMQoRChEKEQoRChEKEemETDQhFCIUIhQiFCIUIhQiFCIUIhQiFCIUIhQiwjLwokiXgXfa ZTsz8H4JnR3gWMp81RrTyo5dyZzJzZLqjpdtjUqvZGhh5YxWSheV7srrmEn3zkqzTurbfYNqWyZS rnojoxVl65qEfvzRxAdu131o5t266ll2xdT70PvlvXOj0L+VozhDGh8dZ9l3VzIR5xTuCVzLtIqV PVl1SypW1tRkWL7z9qyD3pHujVEhQiFCIUIhQiFCIUIhQiFCIeJ24nz7lN47u6Se0WU7UYj4V0p9 bOxg5mg2XQulE/pXCpfHTJXwthqFCIUIhQiFCIUIhQiFiOqaDSkrVq4Qe06XXUUWZ7/OGsAjFCIU IhQiFCIUIhQiFCIUIhQiFCIUIhQiqkto3hEZPUrXQgoRChEKEQoRChEKEQoRuYV6drWdXgCghRmh quoiEncV4SM5TXg74wjezV591RRR7P29FpoDeGc/25K8vYrc96EMKEQoRChEKEQoRChEKEQoRChE KEQoRKQTOs3AaxnMRk8+/O/sQ1LWsNpF6AxaaGG2LN0W1mXTaljVMqsFh6eFownpsu2bpaeYFl4F ttCqSpUHzV22JfNlZ7dVJyudsXwm/5MV96XnPu1TbFL8mP1cLSLxTvr8su0ZeCsk3nneObQahQiF CIUIhQiFCIUIhQiFCIUIhQiFiHRC3QG81r+p3XDktIVWTN1dfYHTiCKxdCa/lyVbzs3irkcuI4qR tLTeZQtdfcj7vy/fcq6VKZthtRK9pc9tiPOTnhZo/ZvbFloh8El3l/WkUdT8XnesYxZdMdfac63n SwzHXKNZttSi9jyrirmubKVpsY7eLxH66Ji6sWPkg7Pls5paaEVUKPwFLWSV3kya39fNwAMUIhQi FCIUIhQiFCIUIhQiFCIUIhQiFCIu98DrCeLV/t0dl/Gy1o36ImS+hSI+bEk6V01EKJqmWMcVU7On aAZ2Sw2rK7YlmtTOU29NxUmRaLKDrswXE012kvtO3XLQJZnAd6yaX69aP3TIrAjs/RJqPcjyEpqf rTK7634I1X7bmV2XN0ex9eE5q5X+F/lhEZ9jAI9QiFCIUIhQiFCIUIhQiFCIUIhQiFCIUIjIWUKT DrKSrgy8gyVTeiNMXQK/i8uYa/p5amJ7Tc9Z3AaBa2Md20toziS/0KPC5CuoCpOvpKqFrlL80mcC R7AknauF7rRSVzaUYk3PUsrTuqyUzUHgMx6bmhzFs9JKU1WBT7+TwKqb5Heh2rsW+U8Xqr0t5bvj WfYtlGWBQ7ouU4hQiFCIUIhQiFCIUIhIJ1T1Tl3L344GZaH7nXrWFF9XC6UqMjore/Ng+Bz6b6YE njG7qw66u2zrxPmqWfxSnjbpueq8eec5k56p5hh3dNVBVZdtnWNceYmf0ZXwNpPL/LJSNk96ntHT YukrVraSTsh5akIhQiFCIUIhQiFCIUIhomsGbeZgoGqT4kNkBSi0emhU3UIHW2c/doxin3OV7Rrj P6eFdqEQoRChEPEMoe1ppcTKyawfrx8ZpoUvawsfbJk431Eq84rbOmg7uvBXHbTdM/qYo7iaqpTA 1Du8zUYhQiFCIUIhYmhB0wyem5q8iqZM4BSL4s6kti+sTJmB93q9LgtnbxE6SLUGbQUKEQoRChEK EemEbmfQHlOIZCYKEQoRChEKEQoRChEKEQoRChEKEQoRChEKEQoRChEKEQoRP+YYdy9mKiVhCylE KEQoRChEfC/OzbCWupSTuh+7xXKuyX9faHKQorpOBqmcV9k7u1spfwvtRiFCIUIh4plC2zNf0u/O Vcq6l7fmFedbly/vyMxrKpFA/x7BZRGJXZl4TQu8V1A16ki5BH4VChEKEQoRChG/hFJOWL2ztZRv Bn7NMb6zrZTv7ioE7+Qcdbxn1u2OKn630G6Rg9xXWQYUIhQiFCIUIhQiFCIUIhQiFCIUIhQimmId pcwfUJ4K3U1aHT+rEXv/nNov0j2DNmumDWucv3+zT4m71uoV/lGxsnbCis6vkYmvripfLfHY1ovg dg3aHbOutl9FRrs+JHBKsLlw/xmpdiuNRiFCIUIhQiFCIUIhQiFCIUIhQiFCIUIhQiFCIUIhQiFC IUIhQiFCIUIhQiFCIUIhQiFCIUIhQiFCIUIhQiFCISKd0P8DU3MdyMKZsxcAAAAASUVORK5CYII= "
preserveAspectRatio="none"
height="1244.6"
width="9.5249996"
style="display:none" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#fd0000;fill-opacity:0.6350711;stroke:none;stroke-width:0.26458332;stroke-opacity:1"
x="-2.5308407e-06"
y="-873.23492"
id="text4630"><tspan
sodipodi:role="line"
x="-2.5308407e-06"
y="-863.87115"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.58194447px;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#fd0000;fill-opacity:0.6350711;stroke:none;stroke-width:0.26458332;stroke-opacity:1"
id="tspan4634" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.26181126px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.20578496"
x="-3.5527137e-15"
y="-38.800373"
id="text4642"
inkscape:export-xdpi="91.400002"
inkscape:export-ydpi="91.400002"><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="-29.721075"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.3770504px;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4614" /><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="-16.761999"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4658"> ̀</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="-3.8029218"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4553"> ́</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="9.1561546"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4555"> ̂</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="22.115232"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4557"> ̃</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="35.07431"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4559"> ̈</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="48.033386"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4561"> ̊</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="60.992462"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4609"> ̧</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="73.951538"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan8898">ı</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="86.910614"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4565">ß</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="99.86969"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4742">Ø</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="112.82877"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4750">ø</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="125.78785"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4626">Æ</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="138.74692"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4788">æ</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="151.70599"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4792">Ð</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="164.66507"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4796">ð</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="177.62415"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4798">Þ</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="190.58324"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4637">þ</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="203.54231"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4767">«</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="216.50139"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4771">»</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="229.46046"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4643">¡</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="242.41954"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4720">¿</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="255.37862"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4775">¢</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="268.33768"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4724">£</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="281.29675"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4726">¤</tspan><tspan
sodipodi:role="line"
x="-3.5527137e-15"
y="294.25583"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.93611145px;line-height:1.16499996;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#000000;fill-opacity:1;stroke-width:0.20578496"
id="tspan4654">¥</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="0"
y="-1286.5312"
id="text5550"><tspan
sodipodi:role="line"
id="tspan5548"
x="0"
y="-1277.1675"
style="stroke-width:0.26458332" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="0"
y="-1286.5312"
id="text8872"><tspan
sodipodi:role="line"
id="tspan8870"
x="0"
y="-1277.1675"
style="stroke-width:0.26458332" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="0"
y="-1269.8625"
id="text8876"><tspan
sodipodi:role="line"
id="tspan8874"
x="0"
y="-1260.4988"
style="stroke-width:0.26458332" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="0"
y="196.98749"
id="text4641"><tspan
sodipodi:role="line"
id="tspan4639"
x="0"
y="206.35126"
style="stroke-width:0.26458332" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="0"
y="230.325"
id="text4649"><tspan
sodipodi:role="line"
id="tspan4647"
x="0"
y="239.68877"
style="stroke-width:0.26458332" /></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="0"
y="10.456248"
id="text4532"><tspan
sodipodi:role="line"
id="tspan4530"
x="0"
y="19.820017"
style="stroke-width:0.26458332" /></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 33 KiB

View file

@ -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: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#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

View file

@ -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: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#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<typename T> T scale(T val) const {return (int32_t(val) * 256 / coefficient);}
uint8_t get_height() const;
uint16_t get_coefficient() const {return coefficient;}
};
}

View file

@ -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: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#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

View file

@ -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: <http://www.gnu.org/licenses/>. *
****************************************************************************/
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);
};
}

View file

@ -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: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#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

View file

@ -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: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#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);
}
};
}

View file

@ -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: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#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

View file

@ -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: <http://www.gnu.org/licenses/>. *
****************************************************************************/
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);
};
}

View file

@ -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: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#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
};

View file

@ -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: <http://www.gnu.org/licenses/>.
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()

View file

@ -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
}

View file

@ -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
}

View file

@ -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();
}

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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