From 38b5a69c2459ed5d5f1d4cb43f1fa613038b8d9b Mon Sep 17 00:00:00 2001 From: Niklas Dusenlund Date: Wed, 13 May 2026 20:57:06 +0200 Subject: [PATCH 1/9] tools: add ttf2lvgl converter Add the FreeType-based LVGL font conversion tool and document how BB02 fonts are generated from it. --- src/ui/fonts/README.md | 32 +- tools/ttf2lvgl/.gitignore | 2 + tools/ttf2lvgl/Makefile | 36 ++ tools/ttf2lvgl/README.md | 49 ++ tools/ttf2lvgl/ttf2lvgl.c | 1122 +++++++++++++++++++++++++++++++++++++ 5 files changed, 1228 insertions(+), 13 deletions(-) create mode 100644 tools/ttf2lvgl/.gitignore create mode 100644 tools/ttf2lvgl/Makefile create mode 100644 tools/ttf2lvgl/README.md create mode 100644 tools/ttf2lvgl/ttf2lvgl.c diff --git a/src/ui/fonts/README.md b/src/ui/fonts/README.md index 8b90d8446c..17849c5731 100644 --- a/src/ui/fonts/README.md +++ b/src/ui/fonts/README.md @@ -1,27 +1,33 @@ -# ttf2ugui +# ttf2lvgl -We have converted the fonts in this directory with the ttf2ugui tool provided in `tools` directory. +We convert LVGL fonts in this directory with the ttf2lvgl tool provided in the `tools` directory. Example execution: ``` -./ttf2ugui --dump --font --size +./ttf2lvgl --dump --font --size --range \ + --name --output .c ``` +`` is a comma-separated list of individual code points and ranges, for example +`32-127,160,U+0100-U+017F`. +Code points in the requested ranges that are not present in the font are omitted from the generated +LVGL cmaps. + To check the conversion of the font to bitmap you can use the `--show ` parameter. The tool -will then print out the `` with asterixes in the terminal: +decodes `` as UTF-8 and prints it with asterixes in the terminal: ``` -./ttf2ugui --show ABCDEF --font --size +./ttf2lvgl --show ABCDEF --font --size --range ``` -Once you have `dump`ed the font there will be a `.c` and `.h` file in the current directory named -somthing like `FontName_X`. Move this file to this directory and make some small -adjustments to it so that it compiles. +Once you have `dump`ed the font there will be a `.c` and `.h` file in the current directory. Move +these files to this directory and add the small `UG_FONT` compatibility wrapper when the font must +also be used through uGUI. ## libfreetype note -Since `ttf2ugui` uses `libfreetype` it actually supports the following font types: +Since `ttf2lvgl` uses `libfreetype` it actually supports the following font types: * TrueType fonts (TTF) and TrueType collections (TTC) * CFF fonts @@ -36,11 +42,11 @@ Since `ttf2ugui` uses `libfreetype` it actually supports the following font type * PFR fonts * Type 42 fonts (limited support) -# ugui font format +# LVGL font format -The bitmaps are layed out line by line and every line uses `ceil(width/8)` bytes. A 9 pixel wide -font will use 16 bits per line (7 bits per line are not used). See for example underscore `_` and -exclamation mark `!` to get a good understanding of the layout. +The tool emits LVGL's uncompressed `lv_font_fmt_txt` format with tight glyph bounding boxes. For +1bpp fonts, pixels are packed in LVGL bit order over the tight glyph bitmap. For 8bpp fonts, each +pixel stores the same 16x16 downsampled coverage value that the old `ttf2ugui` tool produced. Each item in the array is suffixed with a comment that shows which character the bytes correspond to. diff --git a/tools/ttf2lvgl/.gitignore b/tools/ttf2lvgl/.gitignore new file mode 100644 index 0000000000..75c8b5460e --- /dev/null +++ b/tools/ttf2lvgl/.gitignore @@ -0,0 +1,2 @@ +*.o +ttf2lvgl diff --git a/tools/ttf2lvgl/Makefile b/tools/ttf2lvgl/Makefile new file mode 100644 index 0000000000..1aeb1e784e --- /dev/null +++ b/tools/ttf2lvgl/Makefile @@ -0,0 +1,36 @@ +PKG_CONFIG ?= pkg-config + +FREETYPE_CFLAGS := $(shell $(PKG_CONFIG) --cflags freetype2 2>/dev/null) +FREETYPE_LIBS := $(shell $(PKG_CONFIG) --libs freetype2 2>/dev/null) +ICU_CFLAGS := $(shell $(PKG_CONFIG) --cflags icu-uc 2>/dev/null) +ICU_LIBS := $(shell $(PKG_CONFIG) --libs icu-uc 2>/dev/null) + +ifeq ($(FREETYPE_CFLAGS),) +FREETYPE_CFLAGS := -I/usr/local/include/freetype2 -I/usr/include/freetype2 \ + -I/opt/homebrew/include/freetype2 +endif + +ifeq ($(FREETYPE_LIBS),) +FREETYPE_LIBS := -L/usr/local/lib -L/opt/homebrew/lib -lfreetype +endif + +ifeq ($(ICU_LIBS),) +ICU_LIBS := -licuuc -licudata +endif + +CFLAGS ?= -Wall -Wextra -g +CPPFLAGS += $(FREETYPE_CFLAGS) $(ICU_CFLAGS) +LDLIBS += $(FREETYPE_LIBS) $(ICU_LIBS) + +OBJS = ttf2lvgl.o + +.PHONY: all clean + +all: ttf2lvgl + +ttf2lvgl: $(OBJS) + $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS) + +clean: + rm -f $(OBJS) + rm -f ttf2lvgl diff --git a/tools/ttf2lvgl/README.md b/tools/ttf2lvgl/README.md new file mode 100644 index 0000000000..ecac8427eb --- /dev/null +++ b/tools/ttf2lvgl/README.md @@ -0,0 +1,49 @@ +ttf2lvgl +======== + +`ttf2lvgl` converts fonts supported by FreeType into LVGL's uncompressed +`lv_font_fmt_txt` C format. + +The rasterizer intentionally matches the old `ttf2ugui` tool: + +* `--bpp=1` uses `FT_LOAD_RENDER | FT_LOAD_TARGET_MONO` and stores the same + monochrome glyph pixels in LVGL bit order. +* `--bpp=8` renders the font at 16x size with the same monochrome target, + downsamples every 16x16 block, and stores the same 0..255 coverage values. + +Glyphs are emitted with tight bounding boxes. LVGL metrics (`ofs_x`, `ofs_y`, +`adv_w`, `line_height`, and `base_line`) preserve the FreeType placement. +Requested code points that are not present in the font's charmap are omitted +from the generated glyph descriptors and cmaps. +The `--show` preview decodes its input as UTF-8 with ICU before rendering. + +Examples: + +``` +./ttf2lvgl --font Luna.ttf --dpi 140 --size 14 --range 32-127 --dump +./ttf2lvgl --font Luna.ttf --dpi 140 --size 14 --range 32-127 --show "aString" +./ttf2lvgl --font Luna.ttf --dpi 140 --size 14 --range 32-127 --dump --bpp=8 +./ttf2lvgl --font Luna.ttf --size 14 --range 32-127,160,U+0100-U+017F \ + --dump --name luna_14 --output luna_14.c +``` + +If `--range` is omitted, the legacy `--minchar`/`--maxchar` range is used, +defaulting to `32-126`. +If `--name` is omitted, the generated symbol uses the lowercased font file +basename and requested font size. If `--name` is given, it must be a valid C +identifier and is used unchanged. If `--output` is omitted, the file name +follows the symbol. + +Compiling +--------- + +FreeType and ICU development headers are required. On systems with +`pkg-config`, run: + +``` +make +``` + +The Makefile falls back to the common FreeType include and library paths if +`pkg-config freetype2` is unavailable, and to `-licuuc -licudata` if +`pkg-config icu-uc` is unavailable. diff --git a/tools/ttf2lvgl/ttf2lvgl.c b/tools/ttf2lvgl/ttf2lvgl.c new file mode 100644 index 0000000000..167d1cedeb --- /dev/null +++ b/tools/ttf2lvgl/ttf2lvgl.c @@ -0,0 +1,1122 @@ +/* + * Copyright (c) 2015, Ari Suutari . + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * 19.10.2017 jkpublic@kartech.biz - Added support for 8BPP fonts (anti aliased) + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include FT_FREETYPE_H +#include + +#define SCREEN_WIDTH 132 +#define SCREEN_HEIGHT 40 + +typedef struct { + int codepoint; + int adv_w; + int box_w; + int box_h; + int ofs_x; + int ofs_y; + size_t bitmap_index; + size_t bitmap_size; + uint8_t* bitmap; +} Glyph; + +typedef struct { + int bpp; + int line_height; + int baseline; + Glyph* glyphs; + size_t glyph_count; + size_t bitmap_size; + UChar32* codepoints; + size_t codepoint_count; + struct { + uint32_t range_start; + uint16_t range_length; + uint16_t glyph_id_start; + }* cmaps; + size_t cmap_count; +} LvglFont; + +typedef struct { + UChar32* codepoints; + size_t count; + size_t capacity; +} Codepoints; + +static float font_size = 0; +static int dpi = 0; +static int bpp = 1; +static int min_char = 32; +static int max_char = 126; +static bool minmax_used = false; +static bool range_used = false; +static int dump = 0; +static char* font_file = NULL; +static char* show_text = NULL; +static char* font_name_arg = NULL; +static char* output_file_arg = NULL; +static Codepoints range_codepoints = {0}; + +static void usage(void); + +static int max_int(int a, int b) +{ + return a > b ? a : b; +} + +static void* xmalloc(size_t size) +{ + void* ptr = malloc(size == 0 ? 1 : size); + if (ptr == NULL) { + perror("malloc"); + exit(2); + } + return ptr; +} + +static void* xcalloc(size_t count, size_t size) +{ + void* ptr = calloc(count == 0 ? 1 : count, size == 0 ? 1 : size); + if (ptr == NULL) { + perror("calloc"); + exit(2); + } + return ptr; +} + +static char* xstrdup(const char* str) +{ + char* out = strdup(str); + if (out == NULL) { + perror("strdup"); + exit(2); + } + return out; +} + +static char* path_basename_no_ext(const char* path) +{ + const char* base_name = strrchr(path, '/'); + base_name = base_name == NULL ? path : base_name + 1; + + char* out = xstrdup(base_name); + char* dot = strrchr(out, '.'); + if (dot != NULL) { + *dot = '\0'; + } + return out; +} + +static char* sanitize_identifier(const char* name, bool uppercase) +{ + size_t len = strlen(name); + char* out = xmalloc(len + 2); + size_t pos = 0; + + if (len == 0 || isdigit((unsigned char)name[0])) { + out[pos++] = '_'; + } + + for (size_t i = 0; i < len; i++) { + unsigned char ch = (unsigned char)name[i]; + if (isalnum(ch)) { + out[pos++] = (char)(uppercase ? toupper(ch) : ch); + } else { + out[pos++] = '_'; + } + } + + out[pos] = '\0'; + return out; +} + +static void lowercase_identifier(char* text) +{ + for (size_t i = 0; text[i] != '\0'; i++) { + text[i] = (char)tolower((unsigned char)text[i]); + } +} + +static bool is_valid_c_identifier(const char* name) +{ + if (name[0] == '\0' || !(isalpha((unsigned char)name[0]) || name[0] == '_')) { + return false; + } + for (size_t i = 1; name[i] != '\0'; i++) { + if (!(isalnum((unsigned char)name[i]) || name[i] == '_')) { + return false; + } + } + return true; +} + +static char* font_size_suffix(float requested_size) +{ + char text[64]; + snprintf(text, sizeof(text), "%g", requested_size); + + char* out = xstrdup(text); + for (size_t i = 0; out[i] != '\0'; i++) { + if (!isalnum((unsigned char)out[i])) { + out[i] = '_'; + } + } + return out; +} + +static char* default_font_name(const char* font_file, float requested_size) +{ + char* base_name = path_basename_no_ext(font_file); + char* sanitized_base = sanitize_identifier(base_name, false); + lowercase_identifier(sanitized_base); + free(base_name); + + char* size_suffix = font_size_suffix(requested_size); + size_t len = strlen(sanitized_base) + strlen(size_suffix) + 2; + char* out = xmalloc(len); + snprintf(out, len, "%s_%s", sanitized_base, size_suffix); + free(size_suffix); + free(sanitized_base); + return out; +} + +static char* output_header_name(const char* output_file, const char* font_name) +{ + if (output_file == NULL) { + size_t len = strlen(font_name) + 3; + char* out = xmalloc(len); + snprintf(out, len, "%s.h", font_name); + return out; + } + + char* out = xstrdup(output_file); + char* slash = strrchr(out, '/'); + char* base = slash == NULL ? out : slash + 1; + char* dot = strrchr(base, '.'); + if (dot != NULL) { + strcpy(dot, ".h"); + } else { + size_t len = strlen(out) + 3; + out = realloc(out, len); + if (out == NULL) { + perror("realloc"); + exit(2); + } + strcat(out, ".h"); + } + return out; +} + +static void codepoints_append(Codepoints* codepoints, UChar32 codepoint) +{ + if (codepoint < 0 || codepoint > 0x10FFFF) { + fprintf(stderr, "invalid Unicode code point: U+%X\n", (unsigned int)codepoint); + exit(1); + } + + if (codepoints->count == codepoints->capacity) { + size_t new_capacity = codepoints->capacity == 0 ? 32 : codepoints->capacity * 2; + UChar32* new_codepoints = + realloc(codepoints->codepoints, new_capacity * sizeof(*new_codepoints)); + if (new_codepoints == NULL) { + perror("realloc"); + exit(2); + } + codepoints->codepoints = new_codepoints; + codepoints->capacity = new_capacity; + } + codepoints->codepoints[codepoints->count++] = codepoint; +} + +static int compare_codepoints(const void* a, const void* b) +{ + UChar32 left = *(const UChar32*)a; + UChar32 right = *(const UChar32*)b; + return (left > right) - (left < right); +} + +static void codepoints_sort_dedup(Codepoints* codepoints) +{ + if (codepoints->count == 0) { + return; + } + + qsort( + codepoints->codepoints, + codepoints->count, + sizeof(*codepoints->codepoints), + compare_codepoints); + + size_t out = 1; + for (size_t i = 1; i < codepoints->count; i++) { + if (codepoints->codepoints[i] != codepoints->codepoints[out - 1]) { + codepoints->codepoints[out++] = codepoints->codepoints[i]; + } + } + codepoints->count = out; +} + +static void parse_codepoint(const char* text, UChar32* out) +{ + while (isspace((unsigned char)*text)) { + text++; + } + + int base = 10; + if (text[0] == 'U' || text[0] == 'u') { + if (text[1] != '+') { + fprintf(stderr, "invalid code point: %s\n", text); + exit(1); + } + text += 2; + base = 16; + } else if (text[0] == '0' && (text[1] == 'x' || text[1] == 'X')) { + text += 2; + base = 16; + } + + char* end = NULL; + unsigned long value = strtoul(text, &end, base); + while (end != NULL && isspace((unsigned char)*end)) { + end++; + } + if (end == text || (end != NULL && *end != '\0') || value > 0x10FFFF) { + fprintf(stderr, "invalid code point: %s\n", text); + exit(1); + } + *out = (UChar32)value; +} + +static void parse_codepoint_range_item(char* item, Codepoints* codepoints) +{ + while (isspace((unsigned char)*item)) { + item++; + } + if (*item == '\0') { + return; + } + + char* dash = strchr(item, '-'); + if (dash == NULL) { + UChar32 codepoint; + parse_codepoint(item, &codepoint); + codepoints_append(codepoints, codepoint); + return; + } + + *dash = '\0'; + UChar32 first; + UChar32 last; + parse_codepoint(item, &first); + parse_codepoint(dash + 1, &last); + if (last < first) { + fprintf( + stderr, + "invalid descending code point range: U+%04X-U+%04X\n", + (unsigned int)first, + (unsigned int)last); + exit(1); + } + for (UChar32 codepoint = first; codepoint <= last; codepoint++) { + codepoints_append(codepoints, codepoint); + } +} + +static void parse_codepoint_ranges(const char* text, Codepoints* codepoints) +{ + char* copy = xstrdup(text); + char* saveptr = NULL; + for (char* item = strtok_r(copy, ",", &saveptr); item != NULL; + item = strtok_r(NULL, ",", &saveptr)) { + parse_codepoint_range_item(item, codepoints); + } + free(copy); +} + +static void append_legacy_codepoint_range(Codepoints* codepoints) +{ + if (min_char < 0 || max_char < min_char || max_char > 0x10FFFF) { + usage(); + exit(1); + } + for (int ch = min_char; ch <= max_char; ch++) { + codepoints_append(codepoints, (UChar32)ch); + } +} + +static Codepoints utf8_to_codepoints(const char* text) +{ + size_t text_len = strlen(text); + if (text_len > INT32_MAX) { + fprintf(stderr, "preview text is too long\n"); + exit(1); + } + + const uint8_t* utf8 = (const uint8_t*)text; + int32_t utf8_len = (int32_t)text_len; + int32_t offset = 0; + Codepoints out = { + .codepoints = xmalloc((text_len == 0 ? 1 : text_len) * sizeof(*out.codepoints)), + .count = 0, + .capacity = text_len == 0 ? 1 : text_len, + }; + + while (offset < utf8_len) { + int32_t previous_offset = offset; + UChar32 codepoint; + U8_NEXT(utf8, offset, utf8_len, codepoint); + if (codepoint < 0) { + fprintf(stderr, "invalid UTF-8 sequence at byte offset %d\n", previous_offset); + exit(1); + } + codepoints_append(&out, codepoint); + } + + return out; +} + +static size_t lvgl_bitmap_size(int width, int height, int bits_per_pixel) +{ + if (width <= 0 || height <= 0) { + return 0; + } + if (bits_per_pixel == 8) { + return (size_t)width * (size_t)height; + } + return ((size_t)width * (size_t)height + 7) / 8; +} + +static bool ft_mono_pixel(const FT_Bitmap* bitmap, int x, int y) +{ + if (x < 0 || y < 0 || x >= (int)bitmap->width || y >= (int)bitmap->rows) { + return false; + } + + int pitch = bitmap->pitch; + const uint8_t* row = pitch >= 0 ? bitmap->buffer + y * pitch + : bitmap->buffer + ((int)bitmap->rows - 1 - y) * (-pitch); + uint8_t byte = row[x / 8]; + return (byte & (1 << (7 - (x % 8)))) != 0; +} + +static void set_lvgl_pixel(Glyph* glyph, int x, int y, int bits_per_pixel, uint8_t value) +{ + if (x < 0 || y < 0 || x >= glyph->box_w || y >= glyph->box_h) { + return; + } + + if (bits_per_pixel == 8) { + glyph->bitmap[(size_t)y * (size_t)glyph->box_w + (size_t)x] = value; + return; + } + + if (value == 0) { + return; + } + size_t bit_index = (size_t)y * (size_t)glyph->box_w + (size_t)x; + glyph->bitmap[bit_index / 8] |= (uint8_t)(1 << (7 - (bit_index % 8))); +} + +static void check_lvgl_small_glyph_limits(const Glyph* glyph) +{ + if (glyph->bitmap_index > 0xFFFFF) { + fprintf(stderr, "bitmap too large for default LVGL glyph descriptor\n"); + exit(1); + } + if (glyph->adv_w < 0 || glyph->adv_w > 255) { + fprintf( + stderr, + "advance width too large for default LVGL glyph descriptor: U+%04X\n", + glyph->codepoint); + exit(1); + } + if (glyph->box_w > 255 || glyph->box_h > 255 || glyph->ofs_x < -128 || glyph->ofs_x > 127 || + glyph->ofs_y < -128 || glyph->ofs_y > 127) { + fprintf( + stderr, + "glyph metrics too large for default LVGL glyph descriptor: U+%04X\n", + glyph->codepoint); + exit(1); + } +} + +static void build_cmaps(LvglFont* font) +{ + if (font->codepoint_count == 0) { + return; + } + + font->cmaps = xcalloc(font->codepoint_count, sizeof(*font->cmaps)); + size_t cmap_count = 0; + size_t range_start_index = 0; + + while (range_start_index < font->codepoint_count) { + size_t range_end_index = range_start_index + 1; + while (range_end_index < font->codepoint_count && + font->codepoints[range_end_index] == font->codepoints[range_end_index - 1] + 1 && + range_end_index - range_start_index < UINT16_MAX) { + range_end_index++; + } + + font->cmaps[cmap_count].range_start = (uint32_t)font->codepoints[range_start_index]; + font->cmaps[cmap_count].range_length = (uint16_t)(range_end_index - range_start_index); + font->cmaps[cmap_count].glyph_id_start = (uint16_t)(range_start_index + 1); + cmap_count++; + if (cmap_count > 511) { + fprintf(stderr, "too many LVGL cmaps; combine adjacent code point ranges\n"); + exit(1); + } + range_start_index = range_end_index; + } + + font->cmap_count = cmap_count; +} + +static Codepoints filter_present_codepoints(FT_Face face, const Codepoints* codepoints) +{ + Codepoints present_codepoints = {0}; + + for (size_t i = 0; i < codepoints->count; i++) { + UChar32 codepoint = codepoints->codepoints[i]; + if (FT_Get_Char_Index(face, (FT_ULong)codepoint) != 0) { + codepoints_append(&present_codepoints, codepoint); + } + } + + return present_codepoints; +} + +static LvglFont* convert_font( + const char* font, + int display_dpi, + float requested_size, + int bits_per_pixel, + const Codepoints* codepoints) +{ + int bpp_mul; + switch (bits_per_pixel) { + case 1: + bpp_mul = 1; + break; + case 8: + bpp_mul = 16; + break; + default: + fprintf(stderr, "Bits per pixel must be 1 or 8, not %d\n", bits_per_pixel); + exit(1); + } + + FT_Library library; + int error = FT_Init_FreeType(&library); + if (error) { + fprintf(stderr, "ft init err %d\n", error); + exit(1); + } + + FT_Face face; + error = FT_New_Face(library, font, 0, &face); + if (error) { + fprintf(stderr, "new face err %d\n", error); + exit(1); + } + + if (display_dpi > 0) { + error = FT_Set_Char_Size( + face, 0, (FT_F26Dot6)(requested_size * 64 * bpp_mul), display_dpi, display_dpi); + } else { + error = FT_Set_Pixel_Sizes(face, 0, (FT_UInt)(requested_size * bpp_mul)); + } + if (error) { + fprintf(stderr, "set pixel sizes err %d\n", error); + exit(1); + } + + Codepoints present_codepoints = filter_present_codepoints(face, codepoints); + if (present_codepoints.count == 0) { + fprintf(stderr, "none of the requested code points are present in the font\n"); + exit(1); + } + if (present_codepoints.count > UINT16_MAX) { + fprintf(stderr, "too many glyphs present for LVGL cmap glyph ids\n"); + exit(1); + } + + int max_ascent = 0; + int max_descent = 0; + + for (size_t i = 0; i < present_codepoints.count; i++) { + UChar32 codepoint = present_codepoints.codepoints[i]; + error = FT_Load_Char(face, (FT_ULong)codepoint, FT_LOAD_RENDER | FT_LOAD_TARGET_MONO); + if (error) { + fprintf(stderr, "load char U+%04X err %d\n", (unsigned int)codepoint, error); + exit(1); + } + + int descent = max_int(0, (int)face->glyph->bitmap.rows - face->glyph->bitmap_top); + int ascent = + max_int(0, max_int(face->glyph->bitmap_top, (int)face->glyph->bitmap.rows) - descent); + + max_descent = max_int(max_descent, descent); + max_ascent = max_int(max_ascent, ascent); + } + + LvglFont* out = xcalloc(1, sizeof(*out)); + out->bpp = bits_per_pixel; + out->line_height = (max_ascent + max_descent) / bpp_mul; + out->baseline = max_ascent / bpp_mul; + out->glyph_count = present_codepoints.count; + out->glyphs = xcalloc(out->glyph_count, sizeof(*out->glyphs)); + out->codepoint_count = present_codepoints.count; + out->codepoints = xmalloc(out->codepoint_count * sizeof(*out->codepoints)); + memcpy( + out->codepoints, + present_codepoints.codepoints, + out->codepoint_count * sizeof(*out->codepoints)); + build_cmaps(out); + + for (size_t glyph_index = 0; glyph_index < present_codepoints.count; glyph_index++) { + UChar32 codepoint = present_codepoints.codepoints[glyph_index]; + error = FT_Load_Char(face, (FT_ULong)codepoint, FT_LOAD_RENDER | FT_LOAD_TARGET_MONO); + if (error) { + fprintf(stderr, "load char U+%04X err %d\n", (unsigned int)codepoint, error); + exit(1); + } + + Glyph* glyph = &out->glyphs[glyph_index]; + glyph->codepoint = codepoint; + glyph->adv_w = (int)((face->glyph->advance.x >> 6) / bpp_mul); + glyph->box_w = (int)face->glyph->bitmap.width / bpp_mul; + glyph->box_h = (int)face->glyph->bitmap.rows / bpp_mul; + glyph->ofs_x = face->glyph->bitmap_left / bpp_mul; + glyph->ofs_y = (face->glyph->bitmap_top / bpp_mul) - glyph->box_h; + glyph->bitmap_index = out->bitmap_size; + glyph->bitmap_size = lvgl_bitmap_size(glyph->box_w, glyph->box_h, bits_per_pixel); + glyph->bitmap = xcalloc(glyph->bitmap_size, 1); + + for (int y = 0; y < glyph->box_h; y++) { + for (int x = 0; x < glyph->box_w; x++) { + int coverage = 0; + for (int y_idx = 0; y_idx < bpp_mul; y_idx++) { + for (int x_idx = 0; x_idx < bpp_mul; x_idx++) { + if (ft_mono_pixel( + &face->glyph->bitmap, x * bpp_mul + x_idx, y * bpp_mul + y_idx)) { + coverage++; + } + } + } + + if (bits_per_pixel == 1) { + set_lvgl_pixel(glyph, x, y, bits_per_pixel, coverage != 0 ? 1 : 0); + } else { + set_lvgl_pixel(glyph, x, y, bits_per_pixel, (uint8_t)((255 * coverage) / 256)); + } + } + } + + check_lvgl_small_glyph_limits(glyph); + out->bitmap_size += glyph->bitmap_size; + } + + FT_Done_Face(face); + FT_Done_FreeType(library); + free(present_codepoints.codepoints); + return out; +} + +static void print_bytes(FILE* out, const uint8_t* bytes, size_t len) +{ + for (size_t i = 0; i < len; i++) { + if (i % 12 == 0) { + fprintf(out, " "); + } + fprintf(out, "0x%02X,", bytes[i]); + if (i + 1 < len) { + fprintf(out, " "); + } + if (i % 12 == 11 || i + 1 == len) { + fprintf(out, "\n"); + } + } +} + +static void print_utf8_codepoint(FILE* out, UChar32 codepoint) +{ + if (codepoint <= 0x7F) { + fputc((char)codepoint, out); + } else if (codepoint <= 0x7FF) { + fputc((char)(0xC0 | (codepoint >> 6)), out); + fputc((char)(0x80 | (codepoint & 0x3F)), out); + } else if (codepoint <= 0xFFFF) { + fputc((char)(0xE0 | (codepoint >> 12)), out); + fputc((char)(0x80 | ((codepoint >> 6) & 0x3F)), out); + fputc((char)(0x80 | (codepoint & 0x3F)), out); + } else { + fputc((char)(0xF0 | (codepoint >> 18)), out); + fputc((char)(0x80 | ((codepoint >> 12) & 0x3F)), out); + fputc((char)(0x80 | ((codepoint >> 6) & 0x3F)), out); + fputc((char)(0x80 | (codepoint & 0x3F)), out); + } +} + +static void print_glyph_comment(FILE* out, UChar32 codepoint) +{ + fprintf(out, " /* U+%04X \"", (unsigned int)codepoint); + switch (codepoint) { + case '\0': + fprintf(out, "\\0"); + break; + case '\b': + fprintf(out, "\\b"); + break; + case '\t': + fprintf(out, "\\t"); + break; + case '\n': + fprintf(out, "\\n"); + break; + case '\f': + fprintf(out, "\\f"); + break; + case '\r': + fprintf(out, "\\r"); + break; + case '"': + fprintf(out, "\\\""); + break; + case '\\': + fprintf(out, "\\\\"); + break; + default: + if ((codepoint < 0x20) || (codepoint >= 0x7F && codepoint <= 0x9F) || + (codepoint >= 0xD800 && codepoint <= 0xDFFF)) { + fprintf(out, "\\u%04X", (unsigned int)codepoint); + } else { + print_utf8_codepoint(out, codepoint); + } + break; + } + fprintf(out, "\" */\n"); +} + +static void print_codepoint_ranges(FILE* out, const LvglFont* font) +{ + for (size_t i = 0; i < font->cmap_count; i++) { + const uint32_t range_start = font->cmaps[i].range_start; + const uint32_t range_end = range_start + font->cmaps[i].range_length - 1; + if (i > 0) { + fprintf(out, ","); + } + if (range_start == range_end) { + fprintf(out, "%u", range_start); + } else { + fprintf(out, "%u-%u", range_start, range_end); + } + } +} + +static void dump_font(const LvglFont* font, const char* font_file_path, const char* font_name) +{ + char* symbol = NULL; + if (font_name == NULL) { + symbol = default_font_name(font_file_path, font_size); + } else { + if (!is_valid_c_identifier(font_name)) { + fprintf(stderr, "invalid --name: must be a valid C identifier\n"); + exit(1); + } + symbol = xstrdup(font_name); + } + char* symbol_upper = sanitize_identifier(symbol, true); + + char* out_file = output_file_arg == NULL ? NULL : xstrdup(output_file_arg); + if (out_file == NULL) { + size_t len = strlen(symbol) + 3; + out_file = xmalloc(len); + snprintf(out_file, len, "%s.c", symbol); + } + + char* header_file = output_header_name(out_file, symbol); + char* header_basename = strrchr(header_file, '/'); + header_basename = header_basename == NULL ? header_file : header_basename + 1; + + FILE* out = fopen(out_file, "w"); + if (out == NULL) { + perror(out_file); + exit(2); + } + + fprintf( + out, "/*******************************************************************************\n"); + fprintf(out, " * Size: %g px\n", font_size); + fprintf(out, " * Bpp: %d\n", font->bpp); + fprintf(out, " * Opts: --bpp %d --size %g", font->bpp, font_size); + if (dpi > 0) { + fprintf(out, " --dpi %d", dpi); + } + fprintf(out, " --font %s --range ", font_file_path); + print_codepoint_ranges(out, font); + fprintf(out, " --format lvgl -o %s\n", out_file); + fprintf( + out, + " ******************************************************************************/\n\n"); + + fprintf(out, "#ifdef __has_include\n"); + fprintf(out, " #if __has_include(\"lvgl.h\")\n"); + fprintf(out, " #ifndef LV_LVGL_H_INCLUDE_SIMPLE\n"); + fprintf(out, " #define LV_LVGL_H_INCLUDE_SIMPLE\n"); + fprintf(out, " #endif\n"); + fprintf(out, " #endif\n"); + fprintf(out, "#endif\n\n"); + fprintf(out, "#ifdef LV_LVGL_H_INCLUDE_SIMPLE\n"); + fprintf(out, " #include \"lvgl.h\"\n"); + fprintf(out, "#else\n"); + fprintf(out, " #include \"lvgl/lvgl.h\"\n"); + fprintf(out, "#endif\n\n"); + fprintf(out, "#include \"%s\"\n\n", header_basename); + + fprintf(out, "#ifndef %s\n", symbol_upper); + fprintf(out, "#define %s 1\n", symbol_upper); + fprintf(out, "#endif\n\n"); + fprintf(out, "#if %s\n\n", symbol_upper); + + fprintf(out, "static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {\n"); + if (font->bitmap_size == 0) { + fprintf(out, " 0x00\n"); + } else { + for (size_t i = 0; i < font->glyph_count; i++) { + const Glyph* glyph = &font->glyphs[i]; + print_glyph_comment(out, glyph->codepoint); + if (glyph->bitmap_size > 0) { + print_bytes(out, glyph->bitmap, glyph->bitmap_size); + } + if (i + 1 < font->glyph_count && glyph->bitmap_size > 0) { + fprintf(out, "\n"); + } + } + } + fprintf(out, "};\n\n"); + + fprintf(out, "static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {\n"); + fprintf( + out, + " {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, " + ".ofs_y = 0} /* id = 0 reserved */,\n"); + for (size_t i = 0; i < font->glyph_count; i++) { + const Glyph* glyph = &font->glyphs[i]; + fprintf( + out, + " {.bitmap_index = %zu, .adv_w = %d, .box_w = %d, .box_h = %d, " + ".ofs_x = %d, .ofs_y = %d} /* U+%04X */%s\n", + glyph->bitmap_index, + glyph->adv_w << 4, + glyph->box_w, + glyph->box_h, + glyph->ofs_x, + glyph->ofs_y, + glyph->codepoint, + i + 1 < font->glyph_count ? "," : ""); + } + fprintf(out, "};\n\n"); + + fprintf(out, "static const lv_font_fmt_txt_cmap_t cmaps[] = {\n"); + for (size_t i = 0; i < font->cmap_count; i++) { + fprintf( + out, + " {.range_start = %u, .range_length = %u, .glyph_id_start = %u,\n" + " .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0,\n" + " .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}%s\n", + font->cmaps[i].range_start, + font->cmaps[i].range_length, + font->cmaps[i].glyph_id_start, + i + 1 < font->cmap_count ? "," : ""); + } + fprintf(out, "};\n\n"); + + fprintf(out, "static const lv_font_fmt_txt_dsc_t font_dsc = {\n"); + fprintf(out, " .glyph_bitmap = glyph_bitmap,\n"); + fprintf(out, " .glyph_dsc = glyph_dsc,\n"); + fprintf(out, " .cmaps = cmaps,\n"); + fprintf(out, " .kern_dsc = NULL,\n"); + fprintf(out, " .kern_scale = 0,\n"); + fprintf(out, " .cmap_num = %zu,\n", font->cmap_count); + fprintf(out, " .bpp = %d,\n", font->bpp); + fprintf(out, " .kern_classes = 0,\n"); + fprintf(out, " .bitmap_format = 0,\n"); + fprintf(out, " .stride = 0,\n"); + fprintf(out, "};\n\n"); + + fprintf(out, "const lv_font_t %s = {\n", symbol); + fprintf(out, " .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt,\n"); + fprintf(out, " .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt,\n"); + fprintf(out, " .line_height = %d,\n", font->line_height); + fprintf(out, " .base_line = %d,\n", font->line_height - font->baseline); + fprintf(out, " .subpx = LV_FONT_SUBPX_NONE,\n"); + fprintf(out, " .underline_position = -1,\n"); + fprintf(out, " .underline_thickness = 0,\n"); + fprintf(out, " .static_bitmap = 0,\n"); + fprintf(out, " .dsc = &font_dsc,\n"); + fprintf(out, " .fallback = NULL,\n"); + fprintf(out, " .user_data = NULL,\n"); + fprintf(out, "};\n\n"); + fprintf(out, "#endif /* %s */\n", symbol_upper); + fclose(out); + + out = fopen(header_file, "w"); + if (out == NULL) { + perror(header_file); + exit(2); + } + fprintf(out, "#ifndef _%s_H_\n", symbol_upper); + fprintf(out, "#define _%s_H_\n\n", symbol_upper); + fprintf(out, "typedef struct _lv_font_t lv_font_t;\n\n"); + fprintf(out, "extern const lv_font_t %s;\n\n", symbol); + fprintf(out, "#endif\n"); + fclose(out); + + free(symbol); + free(symbol_upper); + free(out_file); + free(header_file); +} + +static const Glyph* glyph_for_codepoint(const LvglFont* font, UChar32 codepoint) +{ + size_t left = 0; + size_t right = font->codepoint_count; + while (left < right) { + size_t mid = left + (right - left) / 2; + if (font->codepoints[mid] == codepoint) { + return &font->glyphs[mid]; + } + if (font->codepoints[mid] < codepoint) { + left = mid + 1; + } else { + right = mid; + } + } + return NULL; +} + +static uint8_t lvgl_opacity(const Glyph* glyph, int bits_per_pixel, int x, int y) +{ + if (x < 0 || y < 0 || x >= glyph->box_w || y >= glyph->box_h || glyph->bitmap_size == 0) { + return 0; + } + if (bits_per_pixel == 8) { + return glyph->bitmap[(size_t)y * (size_t)glyph->box_w + (size_t)x]; + } + + size_t bit_index = (size_t)y * (size_t)glyph->box_w + (size_t)x; + return (glyph->bitmap[bit_index / 8] & (1 << (7 - (bit_index % 8)))) != 0 ? 255 : 0; +} + +static void show_font(const LvglFont* font, const Codepoints* text) +{ + uint8_t screen[SCREEN_HEIGHT][SCREEN_WIDTH]; + memset(screen, 0, sizeof(screen)); + + for (int x = 0; x < SCREEN_WIDTH; x++) { + screen[0][x] = 255; + screen[SCREEN_HEIGHT - 1][x] = 255; + } + for (int y = 0; y < SCREEN_HEIGHT; y++) { + screen[y][0] = 255; + screen[y][SCREEN_WIDTH - 1] = 255; + } + + int pen_x = 2; + int pen_y = 2; + int baseline_y = font->baseline; + + for (size_t i = 0; i < text->count; i++) { + const Glyph* glyph = glyph_for_codepoint(font, text->codepoints[i]); + if (glyph == NULL) { + continue; + } + + int glyph_x = pen_x + glyph->ofs_x; + int glyph_y = pen_y + baseline_y - glyph->box_h - glyph->ofs_y; + for (int y = 0; y < glyph->box_h; y++) { + for (int x = 0; x < glyph->box_w; x++) { + uint8_t opacity = lvgl_opacity(glyph, font->bpp, x, y); + int out_x = glyph_x + x; + int out_y = glyph_y + y; + if (opacity == 0 || out_x < 0 || out_y < 0 || out_x >= SCREEN_WIDTH || + out_y >= SCREEN_HEIGHT) { + continue; + } + screen[out_y][out_x] = opacity; + } + } + pen_x += glyph->adv_w; + } + + for (int y = 0; y < SCREEN_HEIGHT; y++) { + for (int x = 0; x < SCREEN_WIDTH; x++) { + if (screen[y][x] == 0) { + putchar(' '); + } else if (screen[y][x] == 255) { + putchar('*'); + } else { + putchar('+'); + } + } + putchar('\n'); + } +} + +static void usage(void) +{ + fprintf( + stderr, + "ttf2lvgl {--show text|--dump} --font=fontfile [--dpi=displaydpi] " + "--size=fontsize [--bpp=bitsperpixel] [--range=RANGES] " + "[--name=symbol] [--output=file.c]\n"); + fprintf( + stderr, + "Ranges are comma-separated code points or ranges, e.g. 32-127,160,U+0100-U+017F.\n"); + fprintf(stderr, "If --dpi is not given, font size is assumed to be pixels.\n"); + fprintf(stderr, "Bits per pixel must be 1 or 8. Default is 1.\n"); +} + +static struct option longopts[] = { + {"show", required_argument, NULL, 'a'}, + {"dump", no_argument, &dump, 1}, + {"dpi", required_argument, NULL, 'd'}, + {"minchar", required_argument, NULL, 'z'}, + {"maxchar", required_argument, NULL, 'e'}, + {"size", required_argument, NULL, 's'}, + {"font", required_argument, NULL, 'f'}, + {"bpp", required_argument, NULL, 'b'}, + {"range", required_argument, NULL, 'r'}, + {"name", required_argument, NULL, 'n'}, + {"output", required_argument, NULL, 'o'}, + {NULL, 0, NULL, 0}, +}; + +int main(int argc, char** argv) +{ + int ch; + while ((ch = getopt_long(argc, argv, "", longopts, NULL)) != -1) { + switch (ch) { + case 'f': + font_file = optarg; + break; + case 'a': + show_text = optarg; + break; + case 's': + sscanf(optarg, "%f", &font_size); + break; + case 'd': + dpi = atoi(optarg); + break; + case 'b': + bpp = atoi(optarg); + if (bpp != 1 && bpp != 8) { + fprintf(stderr, "Bits per pixel must be 1 or 8. Default is 1.\n"); + exit(1); + } + break; + case 'z': + min_char = atoi(optarg); + minmax_used = true; + break; + case 'e': + max_char = atoi(optarg); + minmax_used = true; + break; + case 'r': + range_used = true; + parse_codepoint_ranges(optarg, &range_codepoints); + break; + case 'n': + font_name_arg = optarg; + break; + case 'o': + output_file_arg = optarg; + break; + case 0: + break; + default: + usage(); + exit(1); + } + } + + if (range_used && minmax_used) { + fprintf(stderr, "--range cannot be combined with --minchar or --maxchar\n"); + exit(1); + } + if (!range_used) { + append_legacy_codepoint_range(&range_codepoints); + } + codepoints_sort_dedup(&range_codepoints); + + if ((!dump && show_text == NULL) || font_file == NULL || font_size == 0 || + range_codepoints.count == 0) { + usage(); + exit(1); + } + + LvglFont* font = convert_font(font_file, dpi, font_size, bpp, &range_codepoints); + + if (show_text != NULL) { + Codepoints show_codepoints = utf8_to_codepoints(show_text); + show_font(font, &show_codepoints); + free(show_codepoints.codepoints); + } + + if (dump) { + dump_font(font, font_file, font_name_arg); + } + + for (size_t i = 0; i < font->glyph_count; i++) { + free(font->glyphs[i].bitmap); + } + free(font->glyphs); + free(font->codepoints); + free(font->cmaps); + free(font); + free(range_codepoints.codepoints); +} From 53fc572d02d207c884e34fd84a2d4993cefa0671 Mon Sep 17 00:00:00 2001 From: Niklas Dusenlund Date: Wed, 13 May 2026 21:05:15 +0200 Subject: [PATCH 2/9] ui: add LVGL BB02 font assets Add the generated LVGL font data and small uGUI compatibility wrappers used by the BB02 UI migration. --- src/ui/fonts/arial_11.c | 1480 ++++++++++++++++++++++++++++++ src/ui/fonts/arial_11.h | 8 + src/ui/fonts/arial_11_ugui.c | 8 + src/ui/fonts/arial_11_ugui.h | 8 + src/ui/fonts/arial_12.c | 1483 +++++++++++++++++++++++++++++++ src/ui/fonts/arial_12.h | 8 + src/ui/fonts/arial_12_ugui.c | 8 + src/ui/fonts/arial_12_ugui.h | 8 + src/ui/fonts/arial_9.c | 1477 ++++++++++++++++++++++++++++++ src/ui/fonts/arial_9.h | 8 + src/ui/fonts/arial_9_ugui.c | 8 + src/ui/fonts/arial_9_ugui.h | 8 + src/ui/fonts/lvgl.h | 15 + src/ui/fonts/lvgl_font_compat.c | 146 +++ src/ui/fonts/monogram_16.c | 448 ++++++++++ src/ui/fonts/monogram_16.h | 8 + src/ui/fonts/monogram_16_ugui.c | 8 + src/ui/fonts/monogram_16_ugui.h | 8 + src/ui/fonts/password_12.c | 56 ++ src/ui/fonts/password_12.h | 5 + src/ui/fonts/password_9.c | 56 ++ src/ui/fonts/password_9.h | 3 + 22 files changed, 5265 insertions(+) create mode 100644 src/ui/fonts/arial_11.c create mode 100644 src/ui/fonts/arial_11.h create mode 100644 src/ui/fonts/arial_11_ugui.c create mode 100644 src/ui/fonts/arial_11_ugui.h create mode 100644 src/ui/fonts/arial_12.c create mode 100644 src/ui/fonts/arial_12.h create mode 100644 src/ui/fonts/arial_12_ugui.c create mode 100644 src/ui/fonts/arial_12_ugui.h create mode 100644 src/ui/fonts/arial_9.c create mode 100644 src/ui/fonts/arial_9.h create mode 100644 src/ui/fonts/arial_9_ugui.c create mode 100644 src/ui/fonts/arial_9_ugui.h create mode 100644 src/ui/fonts/lvgl.h create mode 100644 src/ui/fonts/lvgl_font_compat.c create mode 100644 src/ui/fonts/monogram_16.c create mode 100644 src/ui/fonts/monogram_16.h create mode 100644 src/ui/fonts/monogram_16_ugui.c create mode 100644 src/ui/fonts/monogram_16_ugui.h create mode 100644 src/ui/fonts/password_12.c create mode 100644 src/ui/fonts/password_12.h create mode 100644 src/ui/fonts/password_9.c create mode 100644 src/ui/fonts/password_9.h diff --git a/src/ui/fonts/arial_11.c b/src/ui/fonts/arial_11.c new file mode 100644 index 0000000000..86a67eabd6 --- /dev/null +++ b/src/ui/fonts/arial_11.c @@ -0,0 +1,1480 @@ +/******************************************************************************* + * Size: 11 px + * Bpp: 1 + * Opts: --bpp 1 --size 11 --dpi 72 --font /usr/share/fonts/truetype/msttcorefonts/Arial.ttf --range 32-126,160-383,399,402,416-417,431-432,461-476,506-511 --format lvgl -o arial_11.c + ******************************************************************************/ + +#ifdef __has_include + #if __has_include("lvgl.h") + #ifndef LV_LVGL_H_INCLUDE_SIMPLE + #define LV_LVGL_H_INCLUDE_SIMPLE + #endif + #endif +#endif + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "lvgl/lvgl.h" +#endif + +#include "arial_11.h" + +#ifndef ARIAL_11 +#define ARIAL_11 1 +#endif + +#if ARIAL_11 + +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + 0x00, + + /* U+0021 "!" */ + 0xFD, + + /* U+0022 "\"" */ + 0xB6, 0x80, + + /* U+0023 "#" */ + 0x29, 0x7E, 0xA5, 0x7E, 0x94, + + /* U+0024 "$" */ + 0x75, 0x68, 0xE2, 0x96, 0xAE, 0x20, + + /* U+0025 "%" */ + 0x62, 0x4A, 0x25, 0x0D, 0x00, 0xB0, 0xA4, 0x52, 0x46, + + /* U+0026 "&" */ + 0x31, 0x24, 0x8C, 0x52, 0x38, 0x9D, + + /* U+0027 "'" */ + 0xE0, + + /* U+0028 "(" */ + 0x2A, 0x49, 0x24, 0x44, + + /* U+0029 ")" */ + 0x88, 0x92, 0x49, 0x50, + + /* U+002A "*" */ + 0x5D, 0x50, + + /* U+002B "+" */ + 0x21, 0x3E, 0x42, 0x00, + + /* U+002C "," */ + 0xE0, + + /* U+002D "-" */ + 0xE0, + + /* U+002E "." */ + 0x80, + + /* U+002F "/" */ + 0x25, 0x24, 0xA4, + + /* U+0030 "0" */ + 0x74, 0x63, 0x18, 0xC6, 0x2E, + + /* U+0031 "1" */ + 0x2E, 0x92, 0x49, + + /* U+0032 "2" */ + 0x74, 0x42, 0x11, 0x11, 0x1F, + + /* U+0033 "3" */ + 0x74, 0x42, 0x60, 0x86, 0x2E, + + /* U+0034 "4" */ + 0x11, 0x94, 0xA9, 0x7C, 0x42, + + /* U+0035 "5" */ + 0x7A, 0x21, 0xE0, 0x86, 0x2E, + + /* U+0036 "6" */ + 0x74, 0x61, 0xE8, 0xC6, 0x2E, + + /* U+0037 "7" */ + 0xF8, 0x84, 0x42, 0x21, 0x08, + + /* U+0038 "8" */ + 0x74, 0x62, 0xE8, 0xC6, 0x2E, + + /* U+0039 "9" */ + 0x74, 0x63, 0x17, 0x86, 0x2E, + + /* U+003A ":" */ + 0x84, + + /* U+003B ";" */ + 0x87, + + /* U+003C "<" */ + 0x0B, 0xA0, 0xE0, 0x80, + + /* U+003D "=" */ + 0xF8, 0x3E, + + /* U+003E ">" */ + 0x83, 0x82, 0xE8, 0x00, + + /* U+003F "?" */ + 0x74, 0x42, 0x22, 0x10, 0x04, + + /* U+0040 "@" */ + 0x1F, 0x18, 0x24, 0xD6, 0x4D, 0xA2, 0x68, 0x9A, 0x6A, 0x6C, 0x40, 0x4F, + 0xE0, + + /* U+0041 "A" */ + 0x10, 0x50, 0xA1, 0x44, 0x4F, 0xA0, 0xC1, + + /* U+0042 "B" */ + 0xFA, 0x18, 0x7F, 0x86, 0x18, 0x7E, + + /* U+0043 "C" */ + 0x39, 0x18, 0x20, 0x82, 0x04, 0x4E, + + /* U+0044 "D" */ + 0xF2, 0x28, 0x61, 0x86, 0x18, 0xBC, + + /* U+0045 "E" */ + 0xFC, 0x21, 0xF8, 0x42, 0x1F, + + /* U+0046 "F" */ + 0xFC, 0x21, 0xE8, 0x42, 0x10, + + /* U+0047 "G" */ + 0x38, 0x8A, 0x0C, 0x08, 0xF0, 0x51, 0x1C, + + /* U+0048 "H" */ + 0x86, 0x18, 0x7F, 0x86, 0x18, 0x61, + + /* U+0049 "I" */ + 0xFF, + + /* U+004A "J" */ + 0x11, 0x11, 0x19, 0x96, + + /* U+004B "K" */ + 0x86, 0x29, 0x2C, 0xD2, 0x28, 0xA1, + + /* U+004C "L" */ + 0x84, 0x21, 0x08, 0x42, 0x1F, + + /* U+004D "M" */ + 0x83, 0x8F, 0x1D, 0x5A, 0xB5, 0x64, 0xC9, + + /* U+004E "N" */ + 0x87, 0x1A, 0x69, 0x96, 0x58, 0xE1, + + /* U+004F "O" */ + 0x38, 0x8A, 0x0C, 0x18, 0x30, 0x51, 0x1C, + + /* U+0050 "P" */ + 0xF4, 0x63, 0x1F, 0x42, 0x10, + + /* U+0051 "Q" */ + 0x38, 0x8A, 0x0C, 0x18, 0x33, 0x51, 0x1F, + + /* U+0052 "R" */ + 0xFA, 0x18, 0x7E, 0x92, 0x28, 0xA1, + + /* U+0053 "S" */ + 0x7A, 0x18, 0x18, 0x18, 0x18, 0x5E, + + /* U+0054 "T" */ + 0xF9, 0x08, 0x42, 0x10, 0x84, + + /* U+0055 "U" */ + 0x86, 0x18, 0x61, 0x86, 0x18, 0x5E, + + /* U+0056 "V" */ + 0x83, 0x05, 0x12, 0x22, 0x85, 0x04, 0x08, + + /* U+0057 "W" */ + 0x84, 0x31, 0x45, 0x29, 0x25, 0x25, 0x14, 0xA2, 0x88, 0x21, 0x04, + + /* U+0058 "X" */ + 0x85, 0x24, 0x8C, 0x31, 0x24, 0xA1, + + /* U+0059 "Y" */ + 0x82, 0x89, 0x11, 0x41, 0x02, 0x04, 0x08, + + /* U+005A "Z" */ + 0x7C, 0x21, 0x04, 0x20, 0x84, 0x3F, + + /* U+005B "[" */ + 0xEA, 0xAA, 0xB0, + + /* U+005C "\\" */ + 0x91, 0x24, 0x89, + + /* U+005D "]" */ + 0xD5, 0x55, 0x70, + + /* U+005E "^" */ + 0x22, 0x95, 0x10, + + /* U+005F "_" */ + 0xFC, + + /* U+0060 "`" */ + 0x90, + + /* U+0061 "a" */ + 0x74, 0x5F, 0x19, 0xF4, + + /* U+0062 "b" */ + 0x84, 0x2D, 0x98, 0xC7, 0x36, + + /* U+0063 "c" */ + 0x74, 0x61, 0x08, 0xB8, + + /* U+0064 "d" */ + 0x08, 0x5B, 0x38, 0xC6, 0x6D, + + /* U+0065 "e" */ + 0x74, 0x7F, 0x08, 0xB8, + + /* U+0066 "f" */ + 0x24, 0xE4, 0x44, 0x44, + + /* U+0067 "g" */ + 0x6C, 0xE3, 0x19, 0xB4, 0x3E, + + /* U+0068 "h" */ + 0x84, 0x2D, 0x98, 0xC6, 0x31, + + /* U+0069 "i" */ + 0xBF, + + /* U+006A "j" */ + 0x45, 0x55, 0x60, + + /* U+006B "k" */ + 0x88, 0x9A, 0xCE, 0xA9, + + /* U+006C "l" */ + 0xFF, + + /* U+006D "m" */ + 0xBD, 0xA6, 0x4C, 0x99, 0x32, 0x40, + + /* U+006E "n" */ + 0xF4, 0x63, 0x18, 0xC4, + + /* U+006F "o" */ + 0x74, 0x63, 0x18, 0xB8, + + /* U+0070 "p" */ + 0xB6, 0x63, 0x1C, 0xDA, 0x10, + + /* U+0071 "q" */ + 0x6C, 0xE3, 0x19, 0xB4, 0x21, + + /* U+0072 "r" */ + 0xBA, 0x49, 0x00, + + /* U+0073 "s" */ + 0x74, 0x58, 0x28, 0xB8, + + /* U+0074 "t" */ + 0x4B, 0xA4, 0x93, + + /* U+0075 "u" */ + 0x8C, 0x63, 0x19, 0xB4, + + /* U+0076 "v" */ + 0x8C, 0x54, 0xA2, 0x10, + + /* U+0077 "w" */ + 0x88, 0xCA, 0x55, 0x4A, 0xA2, 0x21, 0x10, + + /* U+0078 "x" */ + 0x8A, 0x88, 0x45, 0x44, + + /* U+0079 "y" */ + 0x8C, 0x54, 0xA2, 0x10, 0x88, + + /* U+007A "z" */ + 0xF8, 0x88, 0x44, 0x7C, + + /* U+007B "{" */ + 0x29, 0x28, 0x92, 0x44, + + /* U+007C "|" */ + 0xFF, 0xC0, + + /* U+007D "}" */ + 0x89, 0x22, 0x92, 0x50, + + /* U+007E "~" */ + 0x07, 0x6C, 0x00, + + /* U+00A0 " " */ + 0x00, + + /* U+00A1 "¡" */ + 0xBF, + + /* U+00A2 "¢" */ + 0x10, 0x9D, 0x5A, 0x52, 0xAE, 0x42, 0x00, + + /* U+00A3 "£" */ + 0x32, 0x50, 0x8E, 0x21, 0x93, + + /* U+00A4 "¤" */ + 0x85, 0xE4, 0x92, 0x7A, 0x10, + + /* U+00A5 "¥" */ + 0x8C, 0x54, 0xAF, 0x93, 0xE4, + + /* U+00A6 "¦" */ + 0xF3, 0xC0, + + /* U+00A7 "§" */ + 0x74, 0x51, 0xC9, 0x24, 0xA2, 0x8B, 0x80, + + /* U+00A8 "¨" */ + 0xA0, + + /* U+00A9 "©" */ + 0x3C, 0x42, 0x9D, 0xA1, 0xA5, 0x99, 0x42, 0x3C, + + /* U+00AA "ª" */ + 0xE7, 0xF0, + + /* U+00AB "«" */ + 0x2A, 0xA8, 0xA2, 0x80, + + /* U+00AC "¬" */ + 0xF8, 0x42, + + /* U+00AD "­" */ + 0xE0, + + /* U+00AE "®" */ + 0x3C, 0x42, 0xB9, 0xA5, 0xB9, 0xA5, 0x42, 0x3C, + + /* U+00AF "¯" */ + 0xFC, + + /* U+00B0 "°" */ + 0xF7, 0x80, + + /* U+00B1 "±" */ + 0x21, 0x3E, 0x42, 0x03, 0xE0, + + /* U+00B2 "²" */ + 0xE5, 0x70, + + /* U+00B3 "³" */ + 0xE8, 0xF0, + + /* U+00B4 "´" */ + 0x60, + + /* U+00B5 "µ" */ + 0x8C, 0x63, 0x18, 0xFE, 0x10, + + /* U+00B6 "¶" */ + 0x7F, 0xAE, 0x9A, 0x28, 0xA2, 0x8A, 0x28, 0xA0, + + /* U+00B7 "·" */ + 0x80, + + /* U+00B8 "¸" */ + 0x9C, + + /* U+00B9 "¹" */ + 0x75, + + /* U+00BA "º" */ + 0x69, 0x96, + + /* U+00BB "»" */ + 0xA2, 0x8A, 0xAA, 0x00, + + /* U+00BC "¼" */ + 0x42, 0xC4, 0x48, 0x48, 0x12, 0x16, 0x2F, 0x42, + + /* U+00BD "½" */ + 0x42, 0xC4, 0x48, 0x50, 0x17, 0x21, 0x42, 0x47, + + /* U+00BE "¾" */ + 0xE1, 0x21, 0x09, 0x1C, 0x80, 0x90, 0x98, 0x9E, 0x42, + + /* U+00BF "¿" */ + 0x20, 0x08, 0x44, 0x42, 0x2E, + + /* U+00C0 "À" */ + 0x20, 0x20, 0x00, 0x82, 0x85, 0x0A, 0x22, 0x7D, 0x06, 0x08, + + /* U+00C1 "Á" */ + 0x08, 0x20, 0x00, 0x82, 0x85, 0x0A, 0x22, 0x7D, 0x06, 0x08, + + /* U+00C2 "Â" */ + 0x30, 0x50, 0x00, 0x82, 0x85, 0x0A, 0x22, 0x7D, 0x06, 0x08, + + /* U+00C3 "Ã" */ + 0x14, 0x50, 0x00, 0x82, 0x85, 0x0A, 0x22, 0x7D, 0x06, 0x08, + + /* U+00C4 "Ä" */ + 0x28, 0x00, 0x41, 0x42, 0x85, 0x11, 0x3E, 0x83, 0x04, + + /* U+00C5 "Å" */ + 0x38, 0x50, 0xE1, 0x42, 0x85, 0x11, 0x3E, 0x83, 0x04, + + /* U+00C6 "Æ" */ + 0x0F, 0xE1, 0x40, 0x48, 0x09, 0xF2, 0x20, 0x7C, 0x10, 0x82, 0x1F, + + /* U+00C7 "Ç" */ + 0x39, 0x18, 0x20, 0x82, 0x04, 0x4E, 0x10, 0x21, 0x80, + + /* U+00C8 "È" */ + 0x41, 0x01, 0xF8, 0x43, 0xF0, 0x84, 0x3E, + + /* U+00C9 "É" */ + 0x11, 0x01, 0xF8, 0x43, 0xF0, 0x84, 0x3E, + + /* U+00CA "Ê" */ + 0x22, 0x81, 0xF8, 0x43, 0xF0, 0x84, 0x3E, + + /* U+00CB "Ë" */ + 0x50, 0x3F, 0x08, 0x7E, 0x10, 0x87, 0xC0, + + /* U+00CC "Ì" */ + 0x91, 0x55, 0x54, + + /* U+00CD "Í" */ + 0x62, 0xAA, 0xA8, + + /* U+00CE "Î" */ + 0x22, 0x80, 0x42, 0x10, 0x84, 0x21, 0x08, + + /* U+00CF "Ï" */ + 0xA1, 0x24, 0x92, 0x48, + + /* U+00D0 "Ð" */ + 0x78, 0x89, 0x0F, 0x94, 0x28, 0x51, 0x3C, + + /* U+00D1 "Ñ" */ + 0x29, 0x40, 0x21, 0xC6, 0x9A, 0x65, 0x96, 0x38, 0x40, + + /* U+00D2 "Ò" */ + 0x20, 0x20, 0x01, 0xC4, 0x50, 0x60, 0xC1, 0x82, 0x88, 0xE0, + + /* U+00D3 "Ó" */ + 0x08, 0x20, 0x01, 0xC4, 0x50, 0x60, 0xC1, 0x82, 0x88, 0xE0, + + /* U+00D4 "Ô" */ + 0x18, 0x68, 0x01, 0xC4, 0x50, 0x60, 0xC1, 0x82, 0x88, 0xE0, + + /* U+00D5 "Õ" */ + 0x14, 0x50, 0x01, 0xC4, 0x50, 0x60, 0xC1, 0x82, 0x88, 0xE0, + + /* U+00D6 "Ö" */ + 0x28, 0x00, 0xE2, 0x28, 0x30, 0x60, 0xC1, 0x44, 0x70, + + /* U+00D7 "×" */ + 0x8A, 0x88, 0xA8, 0x80, + + /* U+00D8 "Ø" */ + 0x3A, 0x8E, 0x2C, 0x99, 0x34, 0x51, 0x5C, + + /* U+00D9 "Ù" */ + 0x20, 0x40, 0x21, 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, + + /* U+00DA "Ú" */ + 0x10, 0x80, 0x21, 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, + + /* U+00DB "Û" */ + 0x21, 0x40, 0x21, 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, + + /* U+00DC "Ü" */ + 0x28, 0x08, 0x61, 0x86, 0x18, 0x61, 0x85, 0xE0, + + /* U+00DD "Ý" */ + 0x08, 0x20, 0x04, 0x14, 0x48, 0x8A, 0x08, 0x10, 0x20, 0x40, + + /* U+00DE "Þ" */ + 0x82, 0x0F, 0xA1, 0x87, 0xE8, 0x20, + + /* U+00DF "ß" */ + 0x72, 0x28, 0xA4, 0x9A, 0x1A, 0x66, + + /* U+00E0 "à" */ + 0x20, 0x80, 0xE8, 0xBE, 0x33, 0xE8, + + /* U+00E1 "á" */ + 0x11, 0x00, 0xE8, 0xBE, 0x33, 0xE8, + + /* U+00E2 "â" */ + 0x32, 0x80, 0xE8, 0xBE, 0x33, 0xE8, + + /* U+00E3 "ã" */ + 0x2A, 0x80, 0xE8, 0xBE, 0x33, 0xE8, + + /* U+00E4 "ä" */ + 0x50, 0x1D, 0x17, 0xC6, 0x7D, + + /* U+00E5 "å" */ + 0x72, 0x9C, 0x07, 0x45, 0xF1, 0x9F, 0x40, + + /* U+00E6 "æ" */ + 0x77, 0x44, 0x5F, 0xF1, 0x08, 0x8B, 0xB8, + + /* U+00E7 "ç" */ + 0x74, 0x61, 0x08, 0xB8, 0x82, 0x30, + + /* U+00E8 "è" */ + 0x41, 0x00, 0xE8, 0xFE, 0x11, 0x70, + + /* U+00E9 "é" */ + 0x11, 0x00, 0xE8, 0xFE, 0x11, 0x70, + + /* U+00EA "ê" */ + 0x32, 0x80, 0xE8, 0xFE, 0x11, 0x70, + + /* U+00EB "ë" */ + 0x50, 0x1D, 0x1F, 0xC2, 0x2E, + + /* U+00EC "ì" */ + 0x91, 0x55, 0x40, + + /* U+00ED "í" */ + 0x62, 0xAA, 0x80, + + /* U+00EE "î" */ + 0x65, 0x04, 0x44, 0x44, 0x40, + + /* U+00EF "ï" */ + 0xA1, 0x24, 0x92, + + /* U+00F0 "ð" */ + 0x3A, 0x84, 0xF8, 0xC6, 0x2E, + + /* U+00F1 "ñ" */ + 0x2A, 0x81, 0xE8, 0xC6, 0x31, 0x88, + + /* U+00F2 "ò" */ + 0x41, 0x00, 0xE8, 0xC6, 0x31, 0x70, + + /* U+00F3 "ó" */ + 0x11, 0x00, 0xE8, 0xC6, 0x31, 0x70, + + /* U+00F4 "ô" */ + 0x32, 0x80, 0xE8, 0xC6, 0x31, 0x70, + + /* U+00F5 "õ" */ + 0x2A, 0x80, 0xE8, 0xC6, 0x31, 0x70, + + /* U+00F6 "ö" */ + 0x50, 0x1D, 0x18, 0xC6, 0x2E, + + /* U+00F7 "÷" */ + 0x20, 0x3E, 0x02, 0x00, + + /* U+00F8 "ø" */ + 0x6C, 0xEB, 0x5C, 0xD8, + + /* U+00F9 "ù" */ + 0x41, 0x01, 0x18, 0xC6, 0x33, 0x68, + + /* U+00FA "ú" */ + 0x11, 0x01, 0x18, 0xC6, 0x33, 0x68, + + /* U+00FB "û" */ + 0x22, 0x81, 0x18, 0xC6, 0x33, 0x68, + + /* U+00FC "ü" */ + 0x50, 0x23, 0x18, 0xC6, 0x6D, + + /* U+00FD "ý" */ + 0x11, 0x01, 0x18, 0xA9, 0x44, 0x21, 0x10, + + /* U+00FE "þ" */ + 0x84, 0x3D, 0x18, 0xC6, 0x3E, 0x84, 0x00, + + /* U+00FF "ÿ" */ + 0x50, 0x23, 0x15, 0x28, 0x84, 0x22, 0x00, + + /* U+0100 "Ā" */ + 0x78, 0x00, 0x41, 0x42, 0x85, 0x11, 0x3E, 0x83, 0x04, + + /* U+0101 "ā" */ + 0xF0, 0x1D, 0x17, 0xC6, 0x7D, + + /* U+0102 "Ă" */ + 0x28, 0x70, 0x00, 0x82, 0x85, 0x0A, 0x22, 0x7D, 0x06, 0x08, + + /* U+0103 "ă" */ + 0x53, 0x80, 0xE8, 0xBE, 0x33, 0xE8, + + /* U+0104 "Ą" */ + 0x10, 0x28, 0x28, 0x28, 0x44, 0x7C, 0x82, 0x82, 0x02, 0x03, + + /* U+0105 "ą" */ + 0x72, 0x27, 0xA2, 0x9B, 0xA0, 0x83, + + /* U+0106 "Ć" */ + 0x08, 0x40, 0x0E, 0x46, 0x08, 0x20, 0x81, 0x13, 0x80, + + /* U+0107 "ć" */ + 0x11, 0x00, 0xE8, 0xC2, 0x11, 0x70, + + /* U+0108 "Ĉ" */ + 0x18, 0xE0, 0x0E, 0x46, 0x08, 0x20, 0x81, 0x13, 0x80, + + /* U+0109 "ĉ" */ + 0x33, 0x80, 0xE8, 0xC2, 0x11, 0x70, + + /* U+010A "Ċ" */ + 0x10, 0x03, 0x91, 0x82, 0x08, 0x20, 0x44, 0xE0, + + /* U+010B "ċ" */ + 0x20, 0x1D, 0x18, 0x42, 0x2E, + + /* U+010C "Č" */ + 0x38, 0x60, 0x0E, 0x46, 0x08, 0x20, 0x81, 0x13, 0x80, + + /* U+010D "č" */ + 0x51, 0x00, 0xE8, 0xC2, 0x11, 0x70, + + /* U+010E "Ď" */ + 0x50, 0x40, 0x03, 0xC4, 0x48, 0x50, 0xA1, 0x42, 0x89, 0xE0, + + /* U+010F "ď" */ + 0x0A, 0x11, 0xA4, 0xC8, 0x91, 0x26, 0x34, + + /* U+0110 "Đ" */ + 0x78, 0x89, 0x0F, 0x94, 0x28, 0x51, 0x3C, + + /* U+0111 "đ" */ + 0x3C, 0x26, 0xA6, 0x8A, 0x29, 0x9A, + + /* U+0112 "Ē" */ + 0x78, 0x3F, 0x08, 0x7E, 0x10, 0x87, 0xC0, + + /* U+0113 "ē" */ + 0x78, 0x1D, 0x1F, 0xC2, 0x2E, + + /* U+0114 "Ĕ" */ + 0x53, 0x81, 0xF8, 0x43, 0xF0, 0x84, 0x3E, + + /* U+0115 "ĕ" */ + 0x53, 0x80, 0xE8, 0xFE, 0x11, 0x70, + + /* U+0116 "Ė" */ + 0x20, 0x3F, 0x08, 0x7E, 0x10, 0x87, 0xC0, + + /* U+0117 "ė" */ + 0x20, 0x1D, 0x1F, 0xC2, 0x2E, + + /* U+0118 "Ę" */ + 0xFC, 0x21, 0xF8, 0x42, 0x1F, 0x10, 0xC0, + + /* U+0119 "ę" */ + 0x74, 0x7F, 0x08, 0xB8, 0x86, + + /* U+011A "Ě" */ + 0x51, 0x01, 0xF8, 0x43, 0xF0, 0x84, 0x3E, + + /* U+011B "ě" */ + 0x51, 0x00, 0xE8, 0xFE, 0x11, 0x70, + + /* U+011C "Ĝ" */ + 0x10, 0x50, 0x01, 0xC4, 0x50, 0x60, 0x47, 0x82, 0x88, 0xE0, + + /* U+011D "ĝ" */ + 0x22, 0x80, 0xD9, 0xC6, 0x33, 0x68, 0x7C, + + /* U+011E "Ğ" */ + 0x28, 0x70, 0x01, 0xC4, 0x50, 0x60, 0x47, 0x82, 0x88, 0xE0, + + /* U+011F "ğ" */ + 0x53, 0x80, 0xD9, 0xC6, 0x33, 0x68, 0x7C, + + /* U+0120 "Ġ" */ + 0x10, 0x00, 0xE2, 0x28, 0x30, 0x23, 0xC1, 0x44, 0x70, + + /* U+0121 "ġ" */ + 0x20, 0x1B, 0x38, 0xC6, 0x6D, 0x0F, 0x80, + + /* U+0122 "Ģ" */ + 0x38, 0x8A, 0x0C, 0x08, 0xF0, 0x51, 0x1C, 0x10, 0x10, 0x60, + + /* U+0123 "ģ" */ + 0x11, 0x08, 0x06, 0xCE, 0x31, 0x9B, 0x43, 0xE0, + + /* U+0124 "Ĥ" */ + 0x18, 0xE0, 0x21, 0x86, 0x1F, 0xE1, 0x86, 0x18, 0x40, + + /* U+0125 "ĥ" */ + 0x22, 0x81, 0x08, 0x5B, 0x31, 0x8C, 0x62, + + /* U+0126 "Ħ" */ + 0x42, 0xFF, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, + + /* U+0127 "ħ" */ + 0xF9, 0x05, 0x99, 0x45, 0x14, 0x51, + + /* U+0128 "Ĩ" */ + 0xFA, 0x04, 0x44, 0x44, 0x44, 0x40, + + /* U+0129 "ĩ" */ + 0xFA, 0x04, 0x44, 0x44, 0x40, + + /* U+012A "Ī" */ + 0xF0, 0x44, 0x44, 0x44, 0x44, + + /* U+012B "ī" */ + 0xF0, 0x44, 0x44, 0x44, + + /* U+012C "Ĭ" */ + 0xB8, 0x24, 0x92, 0x49, 0x00, + + /* U+012D "ĭ" */ + 0xB8, 0x49, 0x24, 0x80, + + /* U+012E "Į" */ + 0x92, 0x49, 0x24, 0x9C, + + /* U+012F "į" */ + 0x8A, 0xAA, 0xB0, + + /* U+0130 "İ" */ + 0xBF, 0xC0, + + /* U+0131 "ı" */ + 0xFC, + + /* U+0132 "IJ" */ + 0x86, 0x18, 0x61, 0x86, 0x9A, 0x66, + + /* U+0133 "ij" */ + 0x90, 0x99, 0x99, 0x99, 0x12, + + /* U+0134 "Ĵ" */ + 0x18, 0xD0, 0x04, 0x10, 0x41, 0x04, 0x92, 0x46, 0x00, + + /* U+0135 "ĵ" */ + 0x22, 0x80, 0x42, 0x10, 0x84, 0x21, 0x10, + + /* U+0136 "Ķ" */ + 0x86, 0x29, 0x2C, 0xD2, 0x28, 0xA1, 0x60, 0x8E, 0x00, + + /* U+0137 "ķ" */ + 0x88, 0x9A, 0xCE, 0xA9, 0x42, 0xC0, + + /* U+0138 "ĸ" */ + 0x92, 0x8C, 0x28, 0x92, 0x20, + + /* U+0139 "Ĺ" */ + 0x22, 0x01, 0x08, 0x42, 0x10, 0x84, 0x3E, + + /* U+013A "ĺ" */ + 0x62, 0xAA, 0xA8, + + /* U+013B "Ļ" */ + 0x84, 0x21, 0x08, 0x42, 0x1F, 0x20, 0x98, + + /* U+013C "ļ" */ + 0x92, 0x49, 0x24, 0x67, 0x80, + + /* U+013D "Ľ" */ + 0x94, 0xA5, 0x08, 0x42, 0x1F, + + /* U+013E "ľ" */ + 0xB6, 0x49, 0x24, + + /* U+013F "Ŀ" */ + 0x84, 0x21, 0x28, 0x42, 0x1F, + + /* U+0140 "ŀ" */ + 0x92, 0x4B, 0x24, + + /* U+0141 "Ł" */ + 0x41, 0x05, 0x18, 0xC1, 0x04, 0x1F, + + /* U+0142 "ł" */ + 0x49, 0x3C, 0x92, + + /* U+0143 "Ń" */ + 0x10, 0x80, 0x21, 0xC6, 0x9A, 0x65, 0x96, 0x38, 0x40, + + /* U+0144 "ń" */ + 0x11, 0x01, 0xE8, 0xC6, 0x31, 0x88, + + /* U+0145 "Ņ" */ + 0x87, 0x1A, 0x69, 0x96, 0x58, 0xE1, 0x20, 0x46, 0x00, + + /* U+0146 "ņ" */ + 0xF4, 0x63, 0x18, 0xC4, 0xC2, 0x70, + + /* U+0147 "Ň" */ + 0x28, 0x40, 0x21, 0xC6, 0x9A, 0x65, 0x96, 0x38, 0x40, + + /* U+0148 "ň" */ + 0x51, 0x81, 0xE8, 0xC6, 0x31, 0x88, + + /* U+0149 "ʼn" */ + 0x82, 0x0F, 0x91, 0x45, 0x14, 0x51, + + /* U+014A "Ŋ" */ + 0xBB, 0x18, 0x61, 0x86, 0x18, 0x66, + + /* U+014B "ŋ" */ + 0xB6, 0x63, 0x18, 0xC4, 0x23, + + /* U+014C "Ō" */ + 0x78, 0x00, 0xE2, 0x28, 0x30, 0x60, 0xC1, 0x44, 0x70, + + /* U+014D "ō" */ + 0x78, 0x1D, 0x18, 0xC6, 0x2E, + + /* U+014E "Ŏ" */ + 0x28, 0x70, 0x01, 0xC4, 0x50, 0x60, 0xC1, 0x82, 0x88, 0xE0, + + /* U+014F "ŏ" */ + 0x51, 0x80, 0xE8, 0xC6, 0x31, 0x70, + + /* U+0150 "Ő" */ + 0x14, 0x50, 0x01, 0xC4, 0x50, 0x60, 0xC1, 0x82, 0x88, 0xE0, + + /* U+0151 "ő" */ + 0x2A, 0x80, 0xE8, 0xC6, 0x31, 0x70, + + /* U+0152 "Œ" */ + 0x77, 0xE3, 0x08, 0x42, 0x1F, 0x84, 0x21, 0x08, 0xC1, 0xDF, + + /* U+0153 "œ" */ + 0x77, 0x44, 0x63, 0xF1, 0x08, 0x8B, 0xB8, + + /* U+0154 "Ŕ" */ + 0x10, 0x80, 0x3E, 0x86, 0x1F, 0xA4, 0x8A, 0x28, 0x40, + + /* U+0155 "ŕ" */ + 0x28, 0x5D, 0x24, 0x80, + + /* U+0156 "Ŗ" */ + 0xFA, 0x18, 0x7E, 0x92, 0x28, 0xA1, 0x20, 0x46, 0x00, + + /* U+0157 "ŗ" */ + 0xBA, 0x49, 0x19, 0xE0, + + /* U+0158 "Ř" */ + 0x50, 0x80, 0x3E, 0x86, 0x1F, 0xA4, 0x8A, 0x28, 0x40, + + /* U+0159 "ř" */ + 0x51, 0x00, 0xA6, 0x21, 0x08, 0x40, + + /* U+015A "Ś" */ + 0x10, 0x80, 0x1E, 0x86, 0x06, 0x06, 0x06, 0x17, 0x80, + + /* U+015B "ś" */ + 0x11, 0x00, 0xE8, 0xB0, 0x51, 0x70, + + /* U+015C "Ŝ" */ + 0x30, 0xA0, 0x1E, 0x86, 0x06, 0x06, 0x06, 0x17, 0x80, + + /* U+015D "ŝ" */ + 0x22, 0x80, 0xE8, 0xB0, 0x51, 0x70, + + /* U+015E "Ş" */ + 0x7A, 0x18, 0x18, 0x18, 0x18, 0x5E, 0x20, 0x43, 0x00, + + /* U+015F "ş" */ + 0x74, 0x58, 0x28, 0xB8, 0x82, 0x30, + + /* U+0160 "Š" */ + 0x50, 0x80, 0x1E, 0x86, 0x06, 0x06, 0x06, 0x17, 0x80, + + /* U+0161 "š" */ + 0x51, 0x00, 0xE8, 0xB0, 0x51, 0x70, + + /* U+0162 "Ţ" */ + 0xF9, 0x08, 0x42, 0x10, 0x84, 0x01, 0x08, + + /* U+0163 "ţ" */ + 0x4B, 0xA4, 0x93, 0x04, 0x00, + + /* U+0164 "Ť" */ + 0x51, 0x01, 0xF2, 0x10, 0x84, 0x21, 0x08, + + /* U+0165 "ť" */ + 0x54, 0xE4, 0x44, 0x46, + + /* U+0166 "Ŧ" */ + 0xF9, 0x08, 0x47, 0x10, 0x84, + + /* U+0167 "ŧ" */ + 0x0B, 0xAE, 0x93, + + /* U+0168 "Ũ" */ + 0x29, 0xE0, 0x21, 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, + + /* U+0169 "ũ" */ + 0x57, 0x81, 0x18, 0xC6, 0x33, 0x68, + + /* U+016A "Ū" */ + 0x78, 0x08, 0x61, 0x86, 0x18, 0x61, 0x85, 0xE0, + + /* U+016B "ū" */ + 0xF0, 0x23, 0x18, 0xC6, 0x6D, + + /* U+016C "Ŭ" */ + 0x28, 0x60, 0x21, 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, + + /* U+016D "ŭ" */ + 0x53, 0x81, 0x18, 0xC6, 0x33, 0x68, + + /* U+016E "Ů" */ + 0x38, 0xA3, 0x80, 0x86, 0x18, 0x61, 0x86, 0x18, 0x5E, + + /* U+016F "ů" */ + 0x32, 0x8C, 0x08, 0xC6, 0x31, 0x9B, 0x40, + + /* U+0170 "Ű" */ + 0x29, 0x40, 0x21, 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, + + /* U+0171 "ű" */ + 0x2A, 0x81, 0x18, 0xC6, 0x33, 0x68, + + /* U+0172 "Ų" */ + 0x8C, 0x63, 0x18, 0xC6, 0x2E, 0x21, 0x80, + + /* U+0173 "ų" */ + 0x8A, 0x28, 0xA2, 0x99, 0xA0, 0x83, + + /* U+0174 "Ŵ" */ + 0x04, 0x01, 0x40, 0x00, 0x42, 0x18, 0xA2, 0x94, 0x92, 0x92, 0x8A, 0x51, + 0x44, 0x10, 0x82, 0x00, + + /* U+0175 "ŵ" */ + 0x08, 0x0A, 0x00, 0x11, 0x19, 0x4A, 0xA9, 0x54, 0x44, 0x22, 0x00, + + /* U+0176 "Ŷ" */ + 0x20, 0xA0, 0x04, 0x14, 0x48, 0x8A, 0x08, 0x10, 0x20, 0x40, + + /* U+0177 "ŷ" */ + 0x21, 0x40, 0x11, 0x44, 0xA2, 0x84, 0x10, 0x42, 0x00, + + /* U+0178 "Ÿ" */ + 0x28, 0x02, 0x0A, 0x24, 0x45, 0x04, 0x08, 0x10, 0x20, + + /* U+0179 "Ź" */ + 0x08, 0x40, 0x1F, 0x08, 0x41, 0x08, 0x21, 0x0F, 0xC0, + + /* U+017A "ź" */ + 0x11, 0x01, 0xF1, 0x10, 0x88, 0xF8, + + /* U+017B "Ż" */ + 0x10, 0x07, 0xC2, 0x10, 0x42, 0x08, 0x43, 0xF0, + + /* U+017C "ż" */ + 0x20, 0x3E, 0x22, 0x11, 0x1F, + + /* U+017D "Ž" */ + 0x34, 0x60, 0x1F, 0x08, 0x41, 0x08, 0x21, 0x0F, 0xC0, + + /* U+017E "ž" */ + 0x51, 0x01, 0xF1, 0x10, 0x88, 0xF8, + + /* U+017F "ſ" */ + 0xEA, 0xAA, + + /* U+018F "Ə" */ + 0x79, 0x08, 0x0F, 0xF8, 0x30, 0x51, 0x1C, + + /* U+0192 "ƒ" */ + 0x19, 0x1C, 0x42, 0x11, 0x08, 0x46, 0x00, + + /* U+01A0 "Ơ" */ + 0x39, 0x45, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, + + /* U+01A1 "ơ" */ + 0x76, 0x38, 0xE2, 0x89, 0xC0, + + /* U+01AF "Ư" */ + 0x85, 0x85, 0x86, 0x84, 0x84, 0x84, 0x84, 0x78, + + /* U+01B0 "ư" */ + 0x8B, 0x16, 0x34, 0x49, 0x8D, 0x00, + + /* U+01CD "Ǎ" */ + 0x14, 0x30, 0x00, 0x82, 0x85, 0x0A, 0x22, 0x7D, 0x06, 0x08, + + /* U+01CE "ǎ" */ + 0x71, 0x80, 0xE8, 0xBE, 0x33, 0xE8, + + /* U+01CF "Ǐ" */ + 0xD6, 0x02, 0x22, 0x22, 0x22, 0x20, + + /* U+01D0 "ǐ" */ + 0xE6, 0x04, 0x44, 0x44, 0x40, + + /* U+01D1 "Ǒ" */ + 0x34, 0x30, 0x01, 0xC4, 0x50, 0x60, 0xC1, 0x82, 0x88, 0xE0, + + /* U+01D2 "ǒ" */ + 0x51, 0x80, 0xE8, 0xC6, 0x31, 0x70, + + /* U+01D3 "Ǔ" */ + 0x28, 0x60, 0x21, 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, + + /* U+01D4 "ǔ" */ + 0x51, 0x81, 0x18, 0xC6, 0x33, 0x68, + + /* U+01D5 "Ǖ" */ + 0x38, 0x02, 0xA1, 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, + + /* U+01D6 "ǖ" */ + 0x78, 0x14, 0x08, 0xC6, 0x31, 0x9B, 0x40, + + /* U+01D7 "Ǘ" */ + 0x08, 0x44, 0xA1, 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, + + /* U+01D8 "ǘ" */ + 0x11, 0x00, 0xA0, 0x46, 0x31, 0x8C, 0xDA, + + /* U+01D9 "Ǚ" */ + 0x28, 0x44, 0xA1, 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, + + /* U+01DA "ǚ" */ + 0x51, 0x80, 0xA0, 0x46, 0x31, 0x8C, 0xDA, + + /* U+01DB "Ǜ" */ + 0x40, 0x84, 0xA1, 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, + + /* U+01DC "ǜ" */ + 0x41, 0x00, 0xA0, 0x46, 0x31, 0x8C, 0xDA, + + /* U+01FA "Ǻ" */ + 0x08, 0x20, 0x01, 0xC2, 0x87, 0x0A, 0x14, 0x28, 0x89, 0xF4, 0x18, 0x20, + + /* U+01FB "ǻ" */ + 0x11, 0x00, 0xE5, 0x38, 0x0E, 0x8B, 0xE3, 0x3E, 0x80, + + /* U+01FC "Ǽ" */ + 0x04, 0x00, 0x80, 0x00, 0x07, 0xF0, 0xA0, 0x24, 0x04, 0xF9, 0x10, 0x3E, + 0x08, 0x41, 0x0F, 0x80, + + /* U+01FD "ǽ" */ + 0x04, 0x04, 0x00, 0x0E, 0xE8, 0x8B, 0xFE, 0x21, 0x11, 0x77, 0x00, + + /* U+01FE "Ǿ" */ + 0x08, 0x20, 0x01, 0xD4, 0x71, 0x64, 0xC9, 0xA2, 0x8A, 0xE0, + + /* U+01FF "ǿ" */ + 0x11, 0x00, 0xD9, 0xD6, 0xB9, 0xB0, +}; + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 48, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 0} /* U+0020 */, + {.bitmap_index = 1, .adv_w = 32, .box_w = 1, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0021 */, + {.bitmap_index = 2, .adv_w = 64, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 5} /* U+0022 */, + {.bitmap_index = 4, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0023 */, + {.bitmap_index = 9, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = -1} /* U+0024 */, + {.bitmap_index = 15, .adv_w = 160, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0025 */, + {.bitmap_index = 24, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0026 */, + {.bitmap_index = 30, .adv_w = 32, .box_w = 1, .box_h = 3, .ofs_x = 0, .ofs_y = 5} /* U+0027 */, + {.bitmap_index = 31, .adv_w = 64, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+0028 */, + {.bitmap_index = 35, .adv_w = 64, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+0029 */, + {.bitmap_index = 39, .adv_w = 64, .box_w = 3, .box_h = 4, .ofs_x = 0, .ofs_y = 4} /* U+002A */, + {.bitmap_index = 41, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 1} /* U+002B */, + {.bitmap_index = 45, .adv_w = 48, .box_w = 1, .box_h = 3, .ofs_x = 1, .ofs_y = -2} /* U+002C */, + {.bitmap_index = 46, .adv_w = 64, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 2} /* U+002D */, + {.bitmap_index = 47, .adv_w = 48, .box_w = 1, .box_h = 1, .ofs_x = 1, .ofs_y = 0} /* U+002E */, + {.bitmap_index = 48, .adv_w = 48, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+002F */, + {.bitmap_index = 51, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0030 */, + {.bitmap_index = 56, .adv_w = 96, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0031 */, + {.bitmap_index = 59, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0032 */, + {.bitmap_index = 64, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0033 */, + {.bitmap_index = 69, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0034 */, + {.bitmap_index = 74, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0035 */, + {.bitmap_index = 79, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0036 */, + {.bitmap_index = 84, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0037 */, + {.bitmap_index = 89, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0038 */, + {.bitmap_index = 94, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0039 */, + {.bitmap_index = 99, .adv_w = 48, .box_w = 1, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+003A */, + {.bitmap_index = 100, .adv_w = 48, .box_w = 1, .box_h = 8, .ofs_x = 0, .ofs_y = -2} /* U+003B */, + {.bitmap_index = 101, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 1} /* U+003C */, + {.bitmap_index = 105, .adv_w = 96, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 2} /* U+003D */, + {.bitmap_index = 107, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 1} /* U+003E */, + {.bitmap_index = 111, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+003F */, + {.bitmap_index = 116, .adv_w = 176, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+0040 */, + {.bitmap_index = 129, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0041 */, + {.bitmap_index = 136, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0042 */, + {.bitmap_index = 142, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0043 */, + {.bitmap_index = 148, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0044 */, + {.bitmap_index = 154, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0045 */, + {.bitmap_index = 159, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0046 */, + {.bitmap_index = 164, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0047 */, + {.bitmap_index = 171, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0048 */, + {.bitmap_index = 177, .adv_w = 32, .box_w = 1, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0049 */, + {.bitmap_index = 178, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+004A */, + {.bitmap_index = 182, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+004B */, + {.bitmap_index = 188, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+004C */, + {.bitmap_index = 193, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+004D */, + {.bitmap_index = 200, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+004E */, + {.bitmap_index = 206, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+004F */, + {.bitmap_index = 213, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0050 */, + {.bitmap_index = 218, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0051 */, + {.bitmap_index = 225, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0052 */, + {.bitmap_index = 231, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0053 */, + {.bitmap_index = 237, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0054 */, + {.bitmap_index = 242, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0055 */, + {.bitmap_index = 248, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0056 */, + {.bitmap_index = 255, .adv_w = 160, .box_w = 11, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+0057 */, + {.bitmap_index = 266, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0058 */, + {.bitmap_index = 272, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0059 */, + {.bitmap_index = 279, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+005A */, + {.bitmap_index = 285, .adv_w = 48, .box_w = 2, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+005B */, + {.bitmap_index = 288, .adv_w = 48, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+005C */, + {.bitmap_index = 291, .adv_w = 48, .box_w = 2, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+005D */, + {.bitmap_index = 294, .adv_w = 80, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 4} /* U+005E */, + {.bitmap_index = 297, .adv_w = 96, .box_w = 6, .box_h = 1, .ofs_x = 0, .ofs_y = -2} /* U+005F */, + {.bitmap_index = 298, .adv_w = 64, .box_w = 2, .box_h = 2, .ofs_x = 0, .ofs_y = 6} /* U+0060 */, + {.bitmap_index = 299, .adv_w = 96, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+0061 */, + {.bitmap_index = 303, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0062 */, + {.bitmap_index = 308, .adv_w = 96, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+0063 */, + {.bitmap_index = 312, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0064 */, + {.bitmap_index = 317, .adv_w = 96, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+0065 */, + {.bitmap_index = 321, .adv_w = 64, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0066 */, + {.bitmap_index = 325, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -2} /* U+0067 */, + {.bitmap_index = 330, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0068 */, + {.bitmap_index = 335, .adv_w = 32, .box_w = 1, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0069 */, + {.bitmap_index = 336, .adv_w = 32, .box_w = 2, .box_h = 10, .ofs_x = -1, .ofs_y = -2} /* U+006A */, + {.bitmap_index = 339, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+006B */, + {.bitmap_index = 343, .adv_w = 32, .box_w = 1, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+006C */, + {.bitmap_index = 344, .adv_w = 128, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+006D */, + {.bitmap_index = 350, .adv_w = 96, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+006E */, + {.bitmap_index = 354, .adv_w = 96, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+006F */, + {.bitmap_index = 358, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -2} /* U+0070 */, + {.bitmap_index = 363, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -2} /* U+0071 */, + {.bitmap_index = 368, .adv_w = 64, .box_w = 3, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+0072 */, + {.bitmap_index = 371, .adv_w = 96, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+0073 */, + {.bitmap_index = 375, .adv_w = 48, .box_w = 3, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+0074 */, + {.bitmap_index = 378, .adv_w = 96, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+0075 */, + {.bitmap_index = 382, .adv_w = 96, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+0076 */, + {.bitmap_index = 386, .adv_w = 160, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+0077 */, + {.bitmap_index = 393, .adv_w = 96, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+0078 */, + {.bitmap_index = 397, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -2} /* U+0079 */, + {.bitmap_index = 402, .adv_w = 96, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+007A */, + {.bitmap_index = 406, .adv_w = 64, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+007B */, + {.bitmap_index = 410, .adv_w = 32, .box_w = 1, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+007C */, + {.bitmap_index = 412, .adv_w = 64, .box_w = 3, .box_h = 10, .ofs_x = 1, .ofs_y = -2} /* U+007D */, + {.bitmap_index = 416, .adv_w = 96, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 2} /* U+007E */, + {.bitmap_index = 419, .adv_w = 48, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 0} /* U+00A0 */, + {.bitmap_index = 420, .adv_w = 32, .box_w = 1, .box_h = 8, .ofs_x = 0, .ofs_y = -2} /* U+00A1 */, + {.bitmap_index = 421, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+00A2 */, + {.bitmap_index = 428, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00A3 */, + {.bitmap_index = 433, .adv_w = 112, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 1} /* U+00A4 */, + {.bitmap_index = 438, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00A5 */, + {.bitmap_index = 443, .adv_w = 32, .box_w = 1, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+00A6 */, + {.bitmap_index = 445, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+00A7 */, + {.bitmap_index = 452, .adv_w = 64, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 7} /* U+00A8 */, + {.bitmap_index = 453, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00A9 */, + {.bitmap_index = 461, .adv_w = 64, .box_w = 3, .box_h = 4, .ofs_x = 0, .ofs_y = 4} /* U+00AA */, + {.bitmap_index = 463, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+00AB */, + {.bitmap_index = 467, .adv_w = 96, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 2} /* U+00AC */, + {.bitmap_index = 469, .adv_w = 64, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 2} /* U+00AD */, + {.bitmap_index = 470, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00AE */, + {.bitmap_index = 478, .adv_w = 96, .box_w = 6, .box_h = 1, .ofs_x = 0, .ofs_y = 8} /* U+00AF */, + {.bitmap_index = 479, .adv_w = 64, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 5} /* U+00B0 */, + {.bitmap_index = 481, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+00B1 */, + {.bitmap_index = 486, .adv_w = 64, .box_w = 3, .box_h = 4, .ofs_x = 0, .ofs_y = 4} /* U+00B2 */, + {.bitmap_index = 488, .adv_w = 64, .box_w = 3, .box_h = 4, .ofs_x = 0, .ofs_y = 4} /* U+00B3 */, + {.bitmap_index = 490, .adv_w = 64, .box_w = 2, .box_h = 2, .ofs_x = 1, .ofs_y = 6} /* U+00B4 */, + {.bitmap_index = 491, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -2} /* U+00B5 */, + {.bitmap_index = 496, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+00B6 */, + {.bitmap_index = 504, .adv_w = 48, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 3} /* U+00B7 */, + {.bitmap_index = 505, .adv_w = 64, .box_w = 2, .box_h = 3, .ofs_x = 1, .ofs_y = -3} /* U+00B8 */, + {.bitmap_index = 506, .adv_w = 64, .box_w = 2, .box_h = 4, .ofs_x = 1, .ofs_y = 4} /* U+00B9 */, + {.bitmap_index = 507, .adv_w = 80, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 4} /* U+00BA */, + {.bitmap_index = 509, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+00BB */, + {.bitmap_index = 513, .adv_w = 144, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00BC */, + {.bitmap_index = 521, .adv_w = 160, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+00BD */, + {.bitmap_index = 529, .adv_w = 160, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00BE */, + {.bitmap_index = 538, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -2} /* U+00BF */, + {.bitmap_index = 543, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00C0 */, + {.bitmap_index = 553, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00C1 */, + {.bitmap_index = 563, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00C2 */, + {.bitmap_index = 573, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00C3 */, + {.bitmap_index = 583, .adv_w = 128, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+00C4 */, + {.bitmap_index = 592, .adv_w = 128, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+00C5 */, + {.bitmap_index = 601, .adv_w = 176, .box_w = 11, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+00C6 */, + {.bitmap_index = 612, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = -3} /* U+00C7 */, + {.bitmap_index = 621, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00C8 */, + {.bitmap_index = 628, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00C9 */, + {.bitmap_index = 635, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00CA */, + {.bitmap_index = 642, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+00CB */, + {.bitmap_index = 649, .adv_w = 32, .box_w = 2, .box_h = 11, .ofs_x = -1, .ofs_y = 0} /* U+00CC */, + {.bitmap_index = 652, .adv_w = 32, .box_w = 2, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00CD */, + {.bitmap_index = 655, .adv_w = 32, .box_w = 5, .box_h = 11, .ofs_x = -2, .ofs_y = 0} /* U+00CE */, + {.bitmap_index = 662, .adv_w = 32, .box_w = 3, .box_h = 10, .ofs_x = -1, .ofs_y = 0} /* U+00CF */, + {.bitmap_index = 666, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00D0 */, + {.bitmap_index = 673, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00D1 */, + {.bitmap_index = 682, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00D2 */, + {.bitmap_index = 692, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00D3 */, + {.bitmap_index = 702, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00D4 */, + {.bitmap_index = 712, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00D5 */, + {.bitmap_index = 722, .adv_w = 128, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+00D6 */, + {.bitmap_index = 731, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 1} /* U+00D7 */, + {.bitmap_index = 735, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00D8 */, + {.bitmap_index = 742, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00D9 */, + {.bitmap_index = 751, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00DA */, + {.bitmap_index = 760, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00DB */, + {.bitmap_index = 769, .adv_w = 112, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+00DC */, + {.bitmap_index = 777, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00DD */, + {.bitmap_index = 787, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00DE */, + {.bitmap_index = 793, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00DF */, + {.bitmap_index = 799, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00E0 */, + {.bitmap_index = 805, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00E1 */, + {.bitmap_index = 811, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00E2 */, + {.bitmap_index = 817, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00E3 */, + {.bitmap_index = 823, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00E4 */, + {.bitmap_index = 828, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+00E5 */, + {.bitmap_index = 835, .adv_w = 160, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+00E6 */, + {.bitmap_index = 842, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = -3} /* U+00E7 */, + {.bitmap_index = 848, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00E8 */, + {.bitmap_index = 854, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00E9 */, + {.bitmap_index = 860, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00EA */, + {.bitmap_index = 866, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00EB */, + {.bitmap_index = 871, .adv_w = 32, .box_w = 2, .box_h = 9, .ofs_x = -1, .ofs_y = 0} /* U+00EC */, + {.bitmap_index = 874, .adv_w = 32, .box_w = 2, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00ED */, + {.bitmap_index = 877, .adv_w = 32, .box_w = 4, .box_h = 9, .ofs_x = -1, .ofs_y = 0} /* U+00EE */, + {.bitmap_index = 882, .adv_w = 32, .box_w = 3, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+00EF */, + {.bitmap_index = 885, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00F0 */, + {.bitmap_index = 890, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00F1 */, + {.bitmap_index = 896, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00F2 */, + {.bitmap_index = 902, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00F3 */, + {.bitmap_index = 908, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00F4 */, + {.bitmap_index = 914, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00F5 */, + {.bitmap_index = 920, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00F6 */, + {.bitmap_index = 925, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 1} /* U+00F7 */, + {.bitmap_index = 929, .adv_w = 96, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+00F8 */, + {.bitmap_index = 933, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00F9 */, + {.bitmap_index = 939, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00FA */, + {.bitmap_index = 945, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00FB */, + {.bitmap_index = 951, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00FC */, + {.bitmap_index = 956, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = -2} /* U+00FD */, + {.bitmap_index = 963, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+00FE */, + {.bitmap_index = 970, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+00FF */, + {.bitmap_index = 977, .adv_w = 128, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+0100 */, + {.bitmap_index = 986, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0101 */, + {.bitmap_index = 991, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0102 */, + {.bitmap_index = 1001, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0103 */, + {.bitmap_index = 1007, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+0104 */, + {.bitmap_index = 1017, .adv_w = 96, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = -2} /* U+0105 */, + {.bitmap_index = 1023, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0106 */, + {.bitmap_index = 1032, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0107 */, + {.bitmap_index = 1038, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0108 */, + {.bitmap_index = 1047, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0109 */, + {.bitmap_index = 1053, .adv_w = 112, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+010A */, + {.bitmap_index = 1061, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+010B */, + {.bitmap_index = 1066, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+010C */, + {.bitmap_index = 1075, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+010D */, + {.bitmap_index = 1081, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = -1, .ofs_y = 0} /* U+010E */, + {.bitmap_index = 1091, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+010F */, + {.bitmap_index = 1098, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0110 */, + {.bitmap_index = 1105, .adv_w = 96, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0111 */, + {.bitmap_index = 1111, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+0112 */, + {.bitmap_index = 1118, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0113 */, + {.bitmap_index = 1123, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0114 */, + {.bitmap_index = 1130, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0115 */, + {.bitmap_index = 1136, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+0116 */, + {.bitmap_index = 1143, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0117 */, + {.bitmap_index = 1148, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+0118 */, + {.bitmap_index = 1155, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -2} /* U+0119 */, + {.bitmap_index = 1160, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+011A */, + {.bitmap_index = 1167, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+011B */, + {.bitmap_index = 1173, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+011C */, + {.bitmap_index = 1183, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = -2} /* U+011D */, + {.bitmap_index = 1190, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+011E */, + {.bitmap_index = 1200, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = -2} /* U+011F */, + {.bitmap_index = 1207, .adv_w = 128, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+0120 */, + {.bitmap_index = 1216, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+0121 */, + {.bitmap_index = 1223, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -3} /* U+0122 */, + {.bitmap_index = 1233, .adv_w = 96, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = -2} /* U+0123 */, + {.bitmap_index = 1241, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0124 */, + {.bitmap_index = 1250, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0125 */, + {.bitmap_index = 1257, .adv_w = 144, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0126 */, + {.bitmap_index = 1265, .adv_w = 96, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+0127 */, + {.bitmap_index = 1271, .adv_w = 32, .box_w = 4, .box_h = 11, .ofs_x = -1, .ofs_y = 0} /* U+0128 */, + {.bitmap_index = 1277, .adv_w = 32, .box_w = 4, .box_h = 9, .ofs_x = -1, .ofs_y = 0} /* U+0129 */, + {.bitmap_index = 1282, .adv_w = 32, .box_w = 4, .box_h = 10, .ofs_x = -1, .ofs_y = 0} /* U+012A */, + {.bitmap_index = 1287, .adv_w = 32, .box_w = 4, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+012B */, + {.bitmap_index = 1291, .adv_w = 32, .box_w = 3, .box_h = 11, .ofs_x = -1, .ofs_y = 0} /* U+012C */, + {.bitmap_index = 1296, .adv_w = 32, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+012D */, + {.bitmap_index = 1300, .adv_w = 32, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+012E */, + {.bitmap_index = 1304, .adv_w = 32, .box_w = 2, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+012F */, + {.bitmap_index = 1307, .adv_w = 32, .box_w = 1, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+0130 */, + {.bitmap_index = 1309, .adv_w = 32, .box_w = 1, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+0131 */, + {.bitmap_index = 1310, .adv_w = 128, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+0132 */, + {.bitmap_index = 1316, .adv_w = 80, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+0133 */, + {.bitmap_index = 1321, .adv_w = 80, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0134 */, + {.bitmap_index = 1330, .adv_w = 32, .box_w = 5, .box_h = 11, .ofs_x = -2, .ofs_y = -2} /* U+0135 */, + {.bitmap_index = 1337, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = -3} /* U+0136 */, + {.bitmap_index = 1346, .adv_w = 80, .box_w = 4, .box_h = 11, .ofs_x = 0, .ofs_y = -3} /* U+0137 */, + {.bitmap_index = 1352, .adv_w = 96, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+0138 */, + {.bitmap_index = 1357, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0139 */, + {.bitmap_index = 1364, .adv_w = 32, .box_w = 2, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+013A */, + {.bitmap_index = 1367, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = -3} /* U+013B */, + {.bitmap_index = 1374, .adv_w = 32, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = -3} /* U+013C */, + {.bitmap_index = 1379, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+013D */, + {.bitmap_index = 1384, .adv_w = 64, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+013E */, + {.bitmap_index = 1387, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+013F */, + {.bitmap_index = 1392, .adv_w = 64, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0140 */, + {.bitmap_index = 1395, .adv_w = 96, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+0141 */, + {.bitmap_index = 1401, .adv_w = 32, .box_w = 3, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+0142 */, + {.bitmap_index = 1404, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0143 */, + {.bitmap_index = 1413, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0144 */, + {.bitmap_index = 1419, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = -3} /* U+0145 */, + {.bitmap_index = 1428, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = -3} /* U+0146 */, + {.bitmap_index = 1434, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0147 */, + {.bitmap_index = 1443, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0148 */, + {.bitmap_index = 1449, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0149 */, + {.bitmap_index = 1455, .adv_w = 128, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+014A */, + {.bitmap_index = 1461, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -2} /* U+014B */, + {.bitmap_index = 1466, .adv_w = 128, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+014C */, + {.bitmap_index = 1475, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+014D */, + {.bitmap_index = 1480, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+014E */, + {.bitmap_index = 1490, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+014F */, + {.bitmap_index = 1496, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0150 */, + {.bitmap_index = 1506, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0151 */, + {.bitmap_index = 1512, .adv_w = 176, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0152 */, + {.bitmap_index = 1522, .adv_w = 160, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+0153 */, + {.bitmap_index = 1529, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0154 */, + {.bitmap_index = 1538, .adv_w = 64, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0155 */, + {.bitmap_index = 1542, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = -3} /* U+0156 */, + {.bitmap_index = 1551, .adv_w = 64, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -3} /* U+0157 */, + {.bitmap_index = 1555, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0158 */, + {.bitmap_index = 1564, .adv_w = 64, .box_w = 5, .box_h = 9, .ofs_x = -1, .ofs_y = 0} /* U+0159 */, + {.bitmap_index = 1570, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+015A */, + {.bitmap_index = 1579, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+015B */, + {.bitmap_index = 1585, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+015C */, + {.bitmap_index = 1594, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+015D */, + {.bitmap_index = 1600, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = -3} /* U+015E */, + {.bitmap_index = 1609, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = -3} /* U+015F */, + {.bitmap_index = 1615, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0160 */, + {.bitmap_index = 1624, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0161 */, + {.bitmap_index = 1630, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = -3} /* U+0162 */, + {.bitmap_index = 1637, .adv_w = 48, .box_w = 3, .box_h = 11, .ofs_x = -1, .ofs_y = -3} /* U+0163 */, + {.bitmap_index = 1642, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0164 */, + {.bitmap_index = 1649, .adv_w = 64, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0165 */, + {.bitmap_index = 1653, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0166 */, + {.bitmap_index = 1658, .adv_w = 64, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0167 */, + {.bitmap_index = 1661, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0168 */, + {.bitmap_index = 1670, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0169 */, + {.bitmap_index = 1676, .adv_w = 112, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+016A */, + {.bitmap_index = 1684, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+016B */, + {.bitmap_index = 1689, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+016C */, + {.bitmap_index = 1698, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+016D */, + {.bitmap_index = 1704, .adv_w = 112, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+016E */, + {.bitmap_index = 1713, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+016F */, + {.bitmap_index = 1720, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0170 */, + {.bitmap_index = 1729, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0171 */, + {.bitmap_index = 1735, .adv_w = 128, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = -2} /* U+0172 */, + {.bitmap_index = 1742, .adv_w = 96, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = -2} /* U+0173 */, + {.bitmap_index = 1748, .adv_w = 160, .box_w = 11, .box_h = 11, .ofs_x = -1, .ofs_y = 0} /* U+0174 */, + {.bitmap_index = 1764, .adv_w = 160, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0175 */, + {.bitmap_index = 1775, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0176 */, + {.bitmap_index = 1785, .adv_w = 96, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = -2} /* U+0177 */, + {.bitmap_index = 1794, .adv_w = 128, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+0178 */, + {.bitmap_index = 1803, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0179 */, + {.bitmap_index = 1812, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+017A */, + {.bitmap_index = 1818, .adv_w = 112, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+017B */, + {.bitmap_index = 1826, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+017C */, + {.bitmap_index = 1831, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+017D */, + {.bitmap_index = 1840, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+017E */, + {.bitmap_index = 1846, .adv_w = 32, .box_w = 2, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+017F */, + {.bitmap_index = 1848, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+018F */, + {.bitmap_index = 1855, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+0192 */, + {.bitmap_index = 1862, .adv_w = 144, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+01A0 */, + {.bitmap_index = 1870, .adv_w = 112, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+01A1 */, + {.bitmap_index = 1875, .adv_w = 144, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+01AF */, + {.bitmap_index = 1883, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+01B0 */, + {.bitmap_index = 1889, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01CD */, + {.bitmap_index = 1899, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01CE */, + {.bitmap_index = 1905, .adv_w = 32, .box_w = 4, .box_h = 11, .ofs_x = -2, .ofs_y = 0} /* U+01CF */, + {.bitmap_index = 1911, .adv_w = 32, .box_w = 4, .box_h = 9, .ofs_x = -1, .ofs_y = 0} /* U+01D0 */, + {.bitmap_index = 1916, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01D1 */, + {.bitmap_index = 1926, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01D2 */, + {.bitmap_index = 1932, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01D3 */, + {.bitmap_index = 1941, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01D4 */, + {.bitmap_index = 1947, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01D5 */, + {.bitmap_index = 1956, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+01D6 */, + {.bitmap_index = 1963, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01D7 */, + {.bitmap_index = 1972, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01D8 */, + {.bitmap_index = 1979, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01D9 */, + {.bitmap_index = 1988, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01DA */, + {.bitmap_index = 1995, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01DB */, + {.bitmap_index = 2004, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01DC */, + {.bitmap_index = 2011, .adv_w = 128, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = 0} /* U+01FA */, + {.bitmap_index = 2023, .adv_w = 96, .box_w = 5, .box_h = 13, .ofs_x = 0, .ofs_y = 0} /* U+01FB */, + {.bitmap_index = 2032, .adv_w = 176, .box_w = 11, .box_h = 11, .ofs_x = -1, .ofs_y = 0} /* U+01FC */, + {.bitmap_index = 2048, .adv_w = 160, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01FD */, + {.bitmap_index = 2059, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01FE */, + {.bitmap_index = 2069, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01FF */ +}; + +static const lv_font_fmt_txt_cmap_t cmaps[] = { + {.range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 160, .range_length = 224, .glyph_id_start = 96, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 399, .range_length = 1, .glyph_id_start = 320, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 402, .range_length = 1, .glyph_id_start = 321, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 416, .range_length = 2, .glyph_id_start = 322, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 431, .range_length = 2, .glyph_id_start = 324, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 461, .range_length = 16, .glyph_id_start = 326, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 506, .range_length = 6, .glyph_id_start = 342, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY} +}; + +static const lv_font_fmt_txt_dsc_t font_dsc = { + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 8, + .bpp = 1, + .kern_classes = 0, + .bitmap_format = 0, + .stride = 0, +}; + +const lv_font_t arial_11 = { + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, + .line_height = 16, + .base_line = 2, + .subpx = LV_FONT_SUBPX_NONE, + .underline_position = -1, + .underline_thickness = 0, + .static_bitmap = 0, + .dsc = &font_dsc, + .fallback = NULL, + .user_data = NULL, +}; + +#endif /* ARIAL_11 */ diff --git a/src/ui/fonts/arial_11.h b/src/ui/fonts/arial_11.h new file mode 100644 index 0000000000..13ab2ab574 --- /dev/null +++ b/src/ui/fonts/arial_11.h @@ -0,0 +1,8 @@ +#ifndef _ARIAL_11_H_ +#define _ARIAL_11_H_ + +typedef struct _lv_font_t lv_font_t; + +extern const lv_font_t arial_11; + +#endif diff --git a/src/ui/fonts/arial_11_ugui.c b/src/ui/fonts/arial_11_ugui.c new file mode 100644 index 0000000000..593c36073f --- /dev/null +++ b/src/ui/fonts/arial_11_ugui.c @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include "arial_11.h" +#include "arial_11_ugui.h" + +#include + +const UG_FONT font_arial_11 = {&arial_11, FONT_TYPE_LVGL, 11, 10, 0, UINT16_MAX, NULL}; diff --git a/src/ui/fonts/arial_11_ugui.h b/src/ui/fonts/arial_11_ugui.h new file mode 100644 index 0000000000..8bf046bea2 --- /dev/null +++ b/src/ui/fonts/arial_11_ugui.h @@ -0,0 +1,8 @@ +#ifndef _ARIAL_11_UGUI_H_ +#define _ARIAL_11_UGUI_H_ + +#include + +extern const UG_FONT font_arial_11; + +#endif diff --git a/src/ui/fonts/arial_12.c b/src/ui/fonts/arial_12.c new file mode 100644 index 0000000000..7079f1ddef --- /dev/null +++ b/src/ui/fonts/arial_12.c @@ -0,0 +1,1483 @@ +/******************************************************************************* + * Size: 12 px + * Bpp: 1 + * Opts: --bpp 1 --size 12 --dpi 72 --font /usr/share/fonts/truetype/msttcorefonts/Arial.ttf --range 32-126,160-383,399,402,416-417,431-432,461-476,506-511 --format lvgl -o arial_12.c + ******************************************************************************/ + +#ifdef __has_include + #if __has_include("lvgl.h") + #ifndef LV_LVGL_H_INCLUDE_SIMPLE + #define LV_LVGL_H_INCLUDE_SIMPLE + #endif + #endif +#endif + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "lvgl/lvgl.h" +#endif + +#include "arial_12.h" + +#ifndef ARIAL_12 +#define ARIAL_12 1 +#endif + +#if ARIAL_12 + +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + 0x00, + + /* U+0021 "!" */ + 0xFE, 0x80, + + /* U+0022 "\"" */ + 0xB6, 0x80, + + /* U+0023 "#" */ + 0x14, 0x2B, 0xF9, 0x42, 0x9F, 0xCA, 0x28, 0x50, + + /* U+0024 "$" */ + 0x75, 0x69, 0x47, 0x16, 0xB5, 0x71, 0x00, + + /* U+0025 "%" */ + 0x62, 0x4A, 0x25, 0x13, 0x06, 0xB0, 0x64, 0x52, 0x29, 0x23, 0x00, + + /* U+0026 "&" */ + 0x30, 0x91, 0x22, 0x86, 0x12, 0xA2, 0x46, 0x72, + + /* U+0027 "'" */ + 0xE0, + + /* U+0028 "(" */ + 0x29, 0x49, 0x24, 0x48, 0x80, + + /* U+0029 ")" */ + 0x89, 0x12, 0x49, 0x4A, 0x00, + + /* U+002A "*" */ + 0x27, 0xC8, 0xA0, + + /* U+002B "+" */ + 0x21, 0x3E, 0x42, 0x00, + + /* U+002C "," */ + 0xE0, + + /* U+002D "-" */ + 0xE0, + + /* U+002E "." */ + 0x80, + + /* U+002F "/" */ + 0x25, 0x24, 0x94, 0x80, + + /* U+0030 "0" */ + 0x74, 0x63, 0x18, 0xC6, 0x31, 0x70, + + /* U+0031 "1" */ + 0x2E, 0x92, 0x49, 0x20, + + /* U+0032 "2" */ + 0x74, 0x42, 0x11, 0x08, 0x88, 0xF8, + + /* U+0033 "3" */ + 0x74, 0x42, 0x13, 0x04, 0x31, 0x70, + + /* U+0034 "4" */ + 0x11, 0x8C, 0xA5, 0x4B, 0xE2, 0x10, + + /* U+0035 "5" */ + 0x7A, 0x21, 0xE8, 0x84, 0x31, 0x70, + + /* U+0036 "6" */ + 0x74, 0x61, 0x6C, 0xC6, 0x31, 0x70, + + /* U+0037 "7" */ + 0xF8, 0x84, 0x42, 0x11, 0x08, 0x40, + + /* U+0038 "8" */ + 0x74, 0x63, 0x17, 0x46, 0x31, 0x70, + + /* U+0039 "9" */ + 0x74, 0x63, 0x19, 0xB4, 0x31, 0x70, + + /* U+003A ":" */ + 0x82, + + /* U+003B ";" */ + 0x83, 0x80, + + /* U+003C "<" */ + 0x0B, 0xA0, 0xE0, 0x80, + + /* U+003D "=" */ + 0xFC, 0x00, 0x3F, + + /* U+003E ">" */ + 0x83, 0x82, 0xE8, 0x00, + + /* U+003F "?" */ + 0x74, 0x62, 0x11, 0x10, 0x80, 0x20, + + /* U+0040 "@" */ + 0x0F, 0x06, 0x19, 0x01, 0x26, 0x99, 0x33, 0x44, 0x68, 0x8D, 0x12, 0x9F, + 0x88, 0x04, 0x83, 0x0F, 0x80, + + /* U+0041 "A" */ + 0x10, 0x50, 0xA1, 0x44, 0x4F, 0x91, 0x41, 0x82, + + /* U+0042 "B" */ + 0xFA, 0x18, 0x61, 0xFE, 0x18, 0x61, 0xF8, + + /* U+0043 "C" */ + 0x38, 0x8A, 0x0C, 0x08, 0x10, 0x20, 0xA2, 0x38, + + /* U+0044 "D" */ + 0xF9, 0x0A, 0x0C, 0x18, 0x30, 0x60, 0xC2, 0xF8, + + /* U+0045 "E" */ + 0xFE, 0x08, 0x20, 0xFE, 0x08, 0x20, 0xFC, + + /* U+0046 "F" */ + 0xFC, 0x21, 0x0F, 0x42, 0x10, 0x80, + + /* U+0047 "G" */ + 0x38, 0x8A, 0x0C, 0x08, 0xF0, 0x60, 0xA2, 0x38, + + /* U+0048 "H" */ + 0x83, 0x06, 0x0C, 0x1F, 0xF0, 0x60, 0xC1, 0x82, + + /* U+0049 "I" */ + 0xFF, 0x80, + + /* U+004A "J" */ + 0x08, 0x42, 0x10, 0x86, 0x31, 0x70, + + /* U+004B "K" */ + 0x83, 0x0A, 0x24, 0x8A, 0x1A, 0x22, 0x42, 0x82, + + /* U+004C "L" */ + 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0xFC, + + /* U+004D "M" */ + 0x83, 0x8F, 0x1D, 0x5A, 0xB5, 0x6A, 0xC9, 0x92, + + /* U+004E "N" */ + 0x83, 0x86, 0x8D, 0x19, 0x31, 0x62, 0xC3, 0x82, + + /* U+004F "O" */ + 0x38, 0x8A, 0x0C, 0x18, 0x30, 0x60, 0xA2, 0x38, + + /* U+0050 "P" */ + 0xFA, 0x18, 0x61, 0xFA, 0x08, 0x20, 0x80, + + /* U+0051 "Q" */ + 0x38, 0x8A, 0x0C, 0x18, 0x30, 0x66, 0xA2, 0x3A, 0x00, + + /* U+0052 "R" */ + 0xFD, 0x06, 0x0C, 0x1F, 0xD1, 0x21, 0x42, 0x82, + + /* U+0053 "S" */ + 0x7A, 0x18, 0x60, 0x78, 0x18, 0x61, 0x78, + + /* U+0054 "T" */ + 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, + + /* U+0055 "U" */ + 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xA2, 0x38, + + /* U+0056 "V" */ + 0x83, 0x05, 0x12, 0x24, 0x45, 0x0A, 0x08, 0x10, + + /* U+0057 "W" */ + 0x84, 0x31, 0x46, 0x29, 0x25, 0x25, 0x14, 0xA2, 0x94, 0x51, 0x04, 0x20, + 0x80, + + /* U+0058 "X" */ + 0x82, 0x89, 0x11, 0x41, 0x05, 0x11, 0x22, 0x82, + + /* U+0059 "Y" */ + 0x82, 0x89, 0x11, 0x41, 0x02, 0x04, 0x08, 0x10, + + /* U+005A "Z" */ + 0x7E, 0x08, 0x20, 0x41, 0x04, 0x08, 0x20, 0xFE, + + /* U+005B "[" */ + 0xEA, 0xAA, 0xAC, + + /* U+005C "\\" */ + 0x91, 0x24, 0x91, 0x20, + + /* U+005D "]" */ + 0xD5, 0x55, 0x5C, + + /* U+005E "^" */ + 0x22, 0x94, 0xA8, 0x80, + + /* U+005F "_" */ + 0xFE, + + /* U+0060 "`" */ + 0x90, + + /* U+0061 "a" */ + 0x74, 0x42, 0xF8, 0xCD, 0xA0, + + /* U+0062 "b" */ + 0x84, 0x2D, 0x98, 0xC6, 0x39, 0xB0, + + /* U+0063 "c" */ + 0x69, 0x88, 0x89, 0x60, + + /* U+0064 "d" */ + 0x08, 0x5B, 0x38, 0xC6, 0x33, 0x68, + + /* U+0065 "e" */ + 0x74, 0x63, 0xF8, 0x45, 0xC0, + + /* U+0066 "f" */ + 0x34, 0xE4, 0x44, 0x44, 0x40, + + /* U+0067 "g" */ + 0x6C, 0xE3, 0x18, 0xCD, 0xA1, 0xF0, + + /* U+0068 "h" */ + 0x84, 0x2D, 0x98, 0xC6, 0x31, 0x88, + + /* U+0069 "i" */ + 0xBF, 0x80, + + /* U+006A "j" */ + 0x20, 0x92, 0x49, 0x25, 0x00, + + /* U+006B "k" */ + 0x84, 0x23, 0x2A, 0x72, 0x52, 0x88, + + /* U+006C "l" */ + 0xFF, 0x80, + + /* U+006D "m" */ + 0xB3, 0x66, 0x62, 0x31, 0x18, 0x8C, 0x46, 0x22, + + /* U+006E "n" */ + 0xB6, 0x63, 0x18, 0xC6, 0x20, + + /* U+006F "o" */ + 0x74, 0x63, 0x18, 0xC5, 0xC0, + + /* U+0070 "p" */ + 0xB6, 0x63, 0x18, 0xE6, 0xD0, 0x80, + + /* U+0071 "q" */ + 0x6C, 0xE3, 0x18, 0xCD, 0xA1, 0x08, + + /* U+0072 "r" */ + 0xBA, 0x49, 0x20, + + /* U+0073 "s" */ + 0x74, 0x60, 0xE0, 0xC5, 0xC0, + + /* U+0074 "t" */ + 0x4B, 0xA4, 0x92, 0x60, + + /* U+0075 "u" */ + 0x8C, 0x63, 0x18, 0xC5, 0xE0, + + /* U+0076 "v" */ + 0x8C, 0x54, 0xA5, 0x10, 0x80, + + /* U+0077 "w" */ + 0x88, 0xC4, 0x55, 0x4A, 0xA5, 0x51, 0x10, 0x88, + + /* U+0078 "x" */ + 0x8A, 0x94, 0x45, 0x2A, 0x20, + + /* U+0079 "y" */ + 0x8C, 0x54, 0xA5, 0x10, 0x84, 0x40, + + /* U+007A "z" */ + 0xF8, 0x84, 0x44, 0x23, 0xE0, + + /* U+007B "{" */ + 0x29, 0x25, 0x12, 0x48, 0x80, + + /* U+007C "|" */ + 0xFF, 0xE0, + + /* U+007D "}" */ + 0x89, 0x24, 0x52, 0x4A, 0x00, + + /* U+007E "~" */ + 0x01, 0x99, 0x80, + + /* U+00A0 " " */ + 0x00, + + /* U+00A1 "¡" */ + 0xBF, 0x80, + + /* U+00A2 "¢" */ + 0x10, 0x9D, 0x3A, 0x52, 0xB9, 0x72, 0x10, 0x00, + + /* U+00A3 "£" */ + 0x32, 0x50, 0x8F, 0x90, 0x8E, 0x98, + + /* U+00A4 "¤" */ + 0xAA, 0xA2, 0xAA, 0x80, + + /* U+00A5 "¥" */ + 0x82, 0x89, 0xA1, 0x4F, 0xE2, 0x3F, 0x88, 0x10, + + /* U+00A6 "¦" */ + 0xF3, 0xE0, + + /* U+00A7 "§" */ + 0x31, 0x24, 0x1C, 0x9A, 0x16, 0x4E, 0x0A, 0x27, 0x00, + + /* U+00A8 "¨" */ + 0xA0, + + /* U+00A9 "©" */ + 0x3E, 0x20, 0xA7, 0x34, 0x5A, 0x0D, 0x16, 0x72, 0x82, 0x3E, 0x00, + + /* U+00AA "ª" */ + 0x71, 0xFF, + + /* U+00AB "«" */ + 0x2A, 0xA8, 0xA2, 0x80, + + /* U+00AC "¬" */ + 0xFC, 0x10, 0x41, + + /* U+00AD "­" */ + 0xE0, + + /* U+00AE "®" */ + 0x3E, 0x20, 0xAF, 0x34, 0x5B, 0xCD, 0x26, 0x8A, 0x82, 0x3E, 0x00, + + /* U+00AF "¯" */ + 0xFE, + + /* U+00B0 "°" */ + 0xF7, 0x80, + + /* U+00B1 "±" */ + 0x21, 0x3E, 0x42, 0x03, 0xE0, + + /* U+00B2 "²" */ + 0xF1, 0x6F, + + /* U+00B3 "³" */ + 0xF2, 0x1F, + + /* U+00B4 "´" */ + 0x60, + + /* U+00B5 "µ" */ + 0x8C, 0x63, 0x18, 0xC7, 0xF0, 0x80, + + /* U+00B6 "¶" */ + 0x7F, 0xAE, 0xBA, 0x68, 0xA2, 0x8A, 0x28, 0xA2, 0x80, + + /* U+00B7 "·" */ + 0x80, + + /* U+00B8 "¸" */ + 0x47, 0x80, + + /* U+00B9 "¹" */ + 0x75, + + /* U+00BA "º" */ + 0x69, 0x96, + + /* U+00BB "»" */ + 0xA2, 0x8A, 0xAA, 0x00, + + /* U+00BC "¼" */ + 0x42, 0x61, 0x11, 0x09, 0x00, 0x80, 0x88, 0x8C, 0x8F, 0x41, 0x00, + + /* U+00BD "½" */ + 0x42, 0x61, 0x11, 0x09, 0x00, 0x80, 0x98, 0x92, 0x82, 0x47, 0x80, + + /* U+00BE "¾" */ + 0xE0, 0x90, 0x42, 0x23, 0x90, 0x04, 0x02, 0x21, 0x18, 0x4F, 0x20, 0x80, + + /* U+00BF "¿" */ + 0x20, 0x08, 0x44, 0x42, 0x31, 0x70, + + /* U+00C0 "À" */ + 0x20, 0x20, 0x00, 0x82, 0x85, 0x0A, 0x22, 0x7C, 0x8A, 0x0C, 0x10, + + /* U+00C1 "Á" */ + 0x08, 0x20, 0x00, 0x82, 0x85, 0x0A, 0x22, 0x7C, 0x8A, 0x0C, 0x10, + + /* U+00C2 "Â" */ + 0x30, 0x50, 0x00, 0x82, 0x85, 0x0A, 0x22, 0x7C, 0x8A, 0x0C, 0x10, + + /* U+00C3 "Ã" */ + 0x14, 0x50, 0x00, 0x82, 0x85, 0x0A, 0x22, 0x7C, 0x8A, 0x0C, 0x10, + + /* U+00C4 "Ä" */ + 0x28, 0x00, 0x41, 0x42, 0x85, 0x11, 0x3E, 0x45, 0x06, 0x08, + + /* U+00C5 "Å" */ + 0x38, 0x50, 0xE1, 0x42, 0x85, 0x11, 0x3E, 0x45, 0x06, 0x08, + + /* U+00C6 "Æ" */ + 0x07, 0xF0, 0x90, 0x09, 0x01, 0x10, 0x11, 0xF3, 0xF0, 0x21, 0x04, 0x10, + 0x41, 0xF0, + + /* U+00C7 "Ç" */ + 0x38, 0x8A, 0x0C, 0x08, 0x10, 0x20, 0xA2, 0x38, 0x20, 0x21, 0xC0, + + /* U+00C8 "È" */ + 0x20, 0x40, 0x3F, 0x82, 0x08, 0x3F, 0x82, 0x08, 0x3F, + + /* U+00C9 "É" */ + 0x10, 0x80, 0x3F, 0x82, 0x08, 0x3F, 0x82, 0x08, 0x3F, + + /* U+00CA "Ê" */ + 0x21, 0x40, 0x3F, 0x82, 0x08, 0x3F, 0x82, 0x08, 0x3F, + + /* U+00CB "Ë" */ + 0x28, 0x0F, 0xE0, 0x82, 0x0F, 0xE0, 0x82, 0x0F, 0xC0, + + /* U+00CC "Ì" */ + 0x91, 0x55, 0x55, + + /* U+00CD "Í" */ + 0x62, 0xAA, 0xAA, + + /* U+00CE "Î" */ + 0x22, 0x80, 0x42, 0x10, 0x84, 0x21, 0x08, 0x40, + + /* U+00CF "Ï" */ + 0xA1, 0x24, 0x92, 0x49, 0x00, + + /* U+00D0 "Ð" */ + 0x7C, 0x42, 0x41, 0x41, 0xF9, 0x41, 0x41, 0x42, 0x7C, + + /* U+00D1 "Ñ" */ + 0x14, 0x50, 0x04, 0x1C, 0x34, 0x68, 0xC9, 0x8B, 0x16, 0x1C, 0x10, + + /* U+00D2 "Ò" */ + 0x20, 0x20, 0x01, 0xC4, 0x50, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+00D3 "Ó" */ + 0x08, 0x20, 0x01, 0xC4, 0x50, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+00D4 "Ô" */ + 0x18, 0x28, 0x01, 0xC4, 0x50, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+00D5 "Õ" */ + 0x14, 0x50, 0x01, 0xC4, 0x50, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+00D6 "Ö" */ + 0x28, 0x00, 0xE2, 0x28, 0x30, 0x60, 0xC1, 0x82, 0x88, 0xE0, + + /* U+00D7 "×" */ + 0x8B, 0x88, 0xE8, 0x80, + + /* U+00D8 "Ø" */ + 0x3A, 0x8A, 0x2C, 0x59, 0x34, 0x68, 0xA2, 0xB8, + + /* U+00D9 "Ù" */ + 0x20, 0x20, 0x04, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+00DA "Ú" */ + 0x08, 0x20, 0x04, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+00DB "Û" */ + 0x10, 0x50, 0x04, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+00DC "Ü" */ + 0x28, 0x02, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x82, 0x88, 0xE0, + + /* U+00DD "Ý" */ + 0x08, 0x20, 0x04, 0x14, 0x48, 0x8A, 0x08, 0x10, 0x20, 0x40, 0x80, + + /* U+00DE "Þ" */ + 0x82, 0x0F, 0xA1, 0x86, 0x1F, 0xA0, 0x80, + + /* U+00DF "ß" */ + 0x72, 0x28, 0xA4, 0x92, 0x28, 0x69, 0x98, + + /* U+00E0 "à" */ + 0x20, 0x80, 0xE8, 0x85, 0xF1, 0x9B, 0x40, + + /* U+00E1 "á" */ + 0x11, 0x00, 0xE8, 0x85, 0xF1, 0x9B, 0x40, + + /* U+00E2 "â" */ + 0x33, 0x80, 0xE8, 0x85, 0xF1, 0x9B, 0x40, + + /* U+00E3 "ã" */ + 0x2A, 0x80, 0xE8, 0x85, 0xF1, 0x9B, 0x40, + + /* U+00E4 "ä" */ + 0x50, 0x1D, 0x10, 0xBE, 0x33, 0x68, + + /* U+00E5 "å" */ + 0x72, 0x9C, 0x07, 0x44, 0x2F, 0x8C, 0xDA, + + /* U+00E6 "æ" */ + 0x77, 0x44, 0x4E, 0x39, 0xF8, 0x84, 0x45, 0xDC, + + /* U+00E7 "ç" */ + 0x69, 0x88, 0x89, 0x64, 0x2E, + + /* U+00E8 "è" */ + 0x41, 0x00, 0xE8, 0xC7, 0xF0, 0x8B, 0x80, + + /* U+00E9 "é" */ + 0x11, 0x00, 0xE8, 0xC7, 0xF0, 0x8B, 0x80, + + /* U+00EA "ê" */ + 0x33, 0x80, 0xE8, 0xC7, 0xF0, 0x8B, 0x80, + + /* U+00EB "ë" */ + 0x50, 0x1D, 0x18, 0xFE, 0x11, 0x70, + + /* U+00EC "ì" */ + 0x91, 0x55, 0x50, + + /* U+00ED "í" */ + 0x62, 0xAA, 0xA0, + + /* U+00EE "î" */ + 0x65, 0x02, 0x22, 0x22, 0x22, + + /* U+00EF "ï" */ + 0xA1, 0x24, 0x92, 0x40, + + /* U+00F0 "ð" */ + 0x29, 0xE0, 0x9F, 0x86, 0x18, 0x61, 0x78, + + /* U+00F1 "ñ" */ + 0x2A, 0x81, 0x6C, 0xC6, 0x31, 0x8C, 0x40, + + /* U+00F2 "ò" */ + 0x41, 0x00, 0xE8, 0xC6, 0x31, 0x8B, 0x80, + + /* U+00F3 "ó" */ + 0x11, 0x00, 0xE8, 0xC6, 0x31, 0x8B, 0x80, + + /* U+00F4 "ô" */ + 0x33, 0x80, 0xE8, 0xC6, 0x31, 0x8B, 0x80, + + /* U+00F5 "õ" */ + 0x2A, 0x80, 0xE8, 0xC6, 0x31, 0x8B, 0x80, + + /* U+00F6 "ö" */ + 0x50, 0x1D, 0x18, 0xC6, 0x31, 0x70, + + /* U+00F7 "÷" */ + 0x20, 0x3E, 0x02, 0x00, + + /* U+00F8 "ø" */ + 0x7C, 0xA7, 0x5C, 0xA7, 0xC0, + + /* U+00F9 "ù" */ + 0x41, 0x01, 0x18, 0xC6, 0x31, 0x8B, 0xC0, + + /* U+00FA "ú" */ + 0x11, 0x01, 0x18, 0xC6, 0x31, 0x8B, 0xC0, + + /* U+00FB "û" */ + 0x22, 0x81, 0x18, 0xC6, 0x31, 0x8B, 0xC0, + + /* U+00FC "ü" */ + 0x50, 0x23, 0x18, 0xC6, 0x31, 0x78, + + /* U+00FD "ý" */ + 0x11, 0x01, 0x18, 0xA9, 0x4A, 0x21, 0x08, 0x80, + + /* U+00FE "þ" */ + 0x84, 0x3D, 0x18, 0xC6, 0x31, 0xF4, 0x20, + + /* U+00FF "ÿ" */ + 0x50, 0x23, 0x15, 0x29, 0x44, 0x21, 0x10, + + /* U+0100 "Ā" */ + 0x78, 0x00, 0x41, 0x42, 0x85, 0x11, 0x3E, 0x45, 0x06, 0x08, + + /* U+0101 "ā" */ + 0xF0, 0x1D, 0x10, 0xBE, 0x33, 0x68, + + /* U+0102 "Ă" */ + 0x28, 0x70, 0x00, 0x82, 0x85, 0x0A, 0x22, 0x7C, 0x8A, 0x0C, 0x10, + + /* U+0103 "ă" */ + 0x53, 0x80, 0xE8, 0x85, 0xF1, 0x9B, 0x40, + + /* U+0104 "Ą" */ + 0x10, 0x28, 0x28, 0x28, 0x44, 0x7C, 0x44, 0x82, 0x82, 0x02, 0x03, + + /* U+0105 "ą" */ + 0x72, 0x20, 0x9E, 0x8A, 0x66, 0x82, 0x0C, + + /* U+0106 "Ć" */ + 0x08, 0x20, 0x01, 0xC4, 0x50, 0x60, 0x40, 0x81, 0x05, 0x11, 0xC0, + + /* U+0107 "ć" */ + 0x24, 0x06, 0x98, 0x88, 0x96, + + /* U+0108 "Ĉ" */ + 0x18, 0x68, 0x01, 0xC4, 0x50, 0x60, 0x40, 0x81, 0x05, 0x11, 0xC0, + + /* U+0109 "ĉ" */ + 0x6D, 0x06, 0x98, 0x88, 0x96, + + /* U+010A "Ċ" */ + 0x10, 0x00, 0xE2, 0x28, 0x30, 0x20, 0x40, 0x82, 0x88, 0xE0, + + /* U+010B "ċ" */ + 0x20, 0x69, 0x88, 0x89, 0x60, + + /* U+010C "Č" */ + 0x34, 0x30, 0x01, 0xC4, 0x50, 0x60, 0x40, 0x81, 0x05, 0x11, 0xC0, + + /* U+010D "č" */ + 0x51, 0x80, 0xC9, 0x42, 0x10, 0x93, 0x00, + + /* U+010E "Ď" */ + 0x50, 0x40, 0x07, 0xC8, 0x50, 0x60, 0xC1, 0x83, 0x06, 0x17, 0xC0, + + /* U+010F "ď" */ + 0x0A, 0x15, 0xAC, 0xC8, 0x91, 0x22, 0x4C, 0x68, + + /* U+0110 "Đ" */ + 0x7C, 0x42, 0x41, 0x41, 0xF9, 0x41, 0x41, 0x42, 0x7C, + + /* U+0111 "đ" */ + 0x3C, 0x26, 0xA6, 0x8A, 0x28, 0xA6, 0x68, + + /* U+0112 "Ē" */ + 0x78, 0x0F, 0xE0, 0x82, 0x0F, 0xE0, 0x82, 0x0F, 0xC0, + + /* U+0113 "ē" */ + 0xF0, 0x1D, 0x18, 0xFE, 0x11, 0x70, + + /* U+0114 "Ĕ" */ + 0x51, 0xC0, 0x3F, 0x82, 0x08, 0x3F, 0x82, 0x08, 0x3F, + + /* U+0115 "ĕ" */ + 0x53, 0x80, 0xE8, 0xC7, 0xF0, 0x8B, 0x80, + + /* U+0116 "Ė" */ + 0x10, 0x0F, 0xE0, 0x82, 0x0F, 0xE0, 0x82, 0x0F, 0xC0, + + /* U+0117 "ė" */ + 0x20, 0x1D, 0x18, 0xFE, 0x11, 0x70, + + /* U+0118 "Ę" */ + 0xFE, 0x08, 0x20, 0xFE, 0x08, 0x20, 0xFC, 0x20, 0xC0, + + /* U+0119 "ę" */ + 0x74, 0x63, 0xF8, 0x45, 0xC4, 0x30, + + /* U+011A "Ě" */ + 0x50, 0x80, 0x3F, 0x82, 0x08, 0x3F, 0x82, 0x08, 0x3F, + + /* U+011B "ě" */ + 0x51, 0x00, 0xE8, 0xC7, 0xF0, 0x8B, 0x80, + + /* U+011C "Ĝ" */ + 0x10, 0x50, 0x01, 0xC4, 0x50, 0x60, 0x47, 0x83, 0x05, 0x11, 0xC0, + + /* U+011D "ĝ" */ + 0x32, 0x80, 0xD9, 0xC6, 0x31, 0x9B, 0x43, 0xE0, + + /* U+011E "Ğ" */ + 0x28, 0x70, 0x01, 0xC4, 0x50, 0x60, 0x47, 0x83, 0x05, 0x11, 0xC0, + + /* U+011F "ğ" */ + 0x53, 0x80, 0xD9, 0xC6, 0x31, 0x9B, 0x43, 0xE0, + + /* U+0120 "Ġ" */ + 0x10, 0x00, 0xE2, 0x28, 0x30, 0x23, 0xC1, 0x82, 0x88, 0xE0, + + /* U+0121 "ġ" */ + 0x20, 0x1B, 0x38, 0xC6, 0x33, 0x68, 0x7C, + + /* U+0122 "Ģ" */ + 0x38, 0x8A, 0x0C, 0x08, 0xF0, 0x60, 0xA2, 0x38, 0x20, 0x21, 0xC0, + + /* U+0123 "ģ" */ + 0x11, 0x08, 0x06, 0xCE, 0x31, 0x8C, 0xDA, 0x1F, 0x00, + + /* U+0124 "Ĥ" */ + 0x18, 0x68, 0x04, 0x18, 0x30, 0x60, 0xFF, 0x83, 0x06, 0x0C, 0x10, + + /* U+0125 "ĥ" */ + 0x22, 0x81, 0x08, 0x5B, 0x31, 0x8C, 0x63, 0x10, + + /* U+0126 "Ħ" */ + 0x41, 0x7F, 0xD0, 0x48, 0x27, 0xF2, 0x09, 0x04, 0x82, 0x41, 0x00, + + /* U+0127 "ħ" */ + 0xF1, 0x05, 0x99, 0x45, 0x14, 0x51, 0x44, + + /* U+0128 "Ĩ" */ + 0xFA, 0x04, 0x44, 0x44, 0x44, 0x44, + + /* U+0129 "ĩ" */ + 0xFA, 0x04, 0x44, 0x44, 0x44, + + /* U+012A "Ī" */ + 0xF0, 0x44, 0x44, 0x44, 0x44, 0x40, + + /* U+012B "ī" */ + 0xF0, 0x44, 0x44, 0x44, 0x40, + + /* U+012C "Ĭ" */ + 0xB8, 0x49, 0x24, 0x92, 0x40, + + /* U+012D "ĭ" */ + 0xB8, 0x49, 0x24, 0x90, + + /* U+012E "Į" */ + 0x92, 0x49, 0x24, 0x93, 0x80, + + /* U+012F "į" */ + 0x8A, 0xAA, 0xAC, + + /* U+0130 "İ" */ + 0xBF, 0xE0, + + /* U+0131 "ı" */ + 0xFE, + + /* U+0132 "IJ" */ + 0x83, 0x06, 0x0C, 0x18, 0x30, 0x68, 0xD1, 0x9C, + + /* U+0133 "ij" */ + 0xA2, 0xDB, 0x6D, 0xA5, 0x00, + + /* U+0134 "Ĵ" */ + 0x0C, 0x14, 0x00, 0x40, 0x81, 0x02, 0x04, 0x09, 0x12, 0x23, 0x80, + + /* U+0135 "ĵ" */ + 0x22, 0x80, 0x42, 0x10, 0x84, 0x21, 0x08, 0x80, + + /* U+0136 "Ķ" */ + 0x83, 0x0A, 0x24, 0x8A, 0x1A, 0x22, 0x42, 0x82, 0x00, 0x20, 0x21, 0x80, + + /* U+0137 "ķ" */ + 0x84, 0x23, 0x2A, 0x72, 0x52, 0x88, 0x04, 0x13, 0x00, + + /* U+0138 "ĸ" */ + 0x95, 0x31, 0x4A, 0x4A, 0x40, + + /* U+0139 "Ĺ" */ + 0x21, 0x00, 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, 0x3F, + + /* U+013A "ĺ" */ + 0x62, 0xAA, 0xAA, + + /* U+013B "Ļ" */ + 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0xFC, 0x01, 0x82, 0x38, + + /* U+013C "ļ" */ + 0x49, 0x24, 0x92, 0x41, 0x9E, + + /* U+013D "Ľ" */ + 0x94, 0xA5, 0x08, 0x42, 0x10, 0xF8, + + /* U+013E "ľ" */ + 0xB6, 0xC9, 0x24, 0x80, + + /* U+013F "Ŀ" */ + 0x82, 0x08, 0x20, 0x92, 0x08, 0x20, 0xFC, + + /* U+0140 "ŀ" */ + 0x92, 0x4B, 0x24, 0x80, + + /* U+0141 "Ł" */ + 0x40, 0x81, 0x43, 0x04, 0x18, 0x10, 0x20, 0x7E, + + /* U+0142 "ł" */ + 0x49, 0x35, 0x92, 0x40, + + /* U+0143 "Ń" */ + 0x08, 0x20, 0x04, 0x1C, 0x34, 0x68, 0xC9, 0x8B, 0x16, 0x1C, 0x10, + + /* U+0144 "ń" */ + 0x11, 0x01, 0x6C, 0xC6, 0x31, 0x8C, 0x40, + + /* U+0145 "Ņ" */ + 0x83, 0x86, 0x8D, 0x19, 0x31, 0x62, 0xC3, 0x82, 0x00, 0x60, 0x43, 0x00, + + /* U+0146 "ņ" */ + 0xB6, 0x63, 0x18, 0xC6, 0x20, 0x30, 0x9C, + + /* U+0147 "Ň" */ + 0x28, 0x30, 0x04, 0x1C, 0x34, 0x68, 0xC9, 0x8B, 0x16, 0x1C, 0x10, + + /* U+0148 "ň" */ + 0x71, 0x81, 0x6C, 0xC6, 0x31, 0x8C, 0x40, + + /* U+0149 "ʼn" */ + 0x82, 0x0D, 0x99, 0x45, 0x14, 0x51, 0x44, + + /* U+014A "Ŋ" */ + 0xBD, 0x86, 0x0C, 0x18, 0x30, 0x60, 0xC2, 0x98, + + /* U+014B "ŋ" */ + 0xB6, 0x63, 0x18, 0xC6, 0x21, 0x18, + + /* U+014C "Ō" */ + 0x3C, 0x00, 0xE2, 0x28, 0x30, 0x60, 0xC1, 0x82, 0x88, 0xE0, + + /* U+014D "ō" */ + 0x78, 0x1D, 0x18, 0xC6, 0x31, 0x70, + + /* U+014E "Ŏ" */ + 0x28, 0x70, 0x01, 0xC4, 0x50, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+014F "ŏ" */ + 0x51, 0x80, 0xE8, 0xC6, 0x31, 0x8B, 0x80, + + /* U+0150 "Ő" */ + 0x14, 0x50, 0x01, 0xC4, 0x50, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+0151 "ő" */ + 0x2A, 0x80, 0xE8, 0xC6, 0x31, 0x8B, 0x80, + + /* U+0152 "Œ" */ + 0x77, 0xE3, 0x08, 0x42, 0x10, 0x87, 0xE1, 0x08, 0x42, 0x30, 0x77, 0xC0, + + /* U+0153 "œ" */ + 0x77, 0x44, 0x62, 0x31, 0xF8, 0x84, 0x45, 0xDC, + + /* U+0154 "Ŕ" */ + 0x08, 0x20, 0x07, 0xE8, 0x30, 0x60, 0xFE, 0x89, 0x0A, 0x14, 0x10, + + /* U+0155 "ŕ" */ + 0x28, 0x5D, 0x24, 0x90, + + /* U+0156 "Ŗ" */ + 0xFD, 0x06, 0x0C, 0x1F, 0xD1, 0x21, 0x42, 0x82, 0x00, 0x60, 0x43, 0x00, + + /* U+0157 "ŗ" */ + 0x56, 0x44, 0x44, 0x40, 0x62, 0xE0, + + /* U+0158 "Ř" */ + 0x50, 0x40, 0x07, 0xE8, 0x30, 0x60, 0xFE, 0x89, 0x0A, 0x14, 0x10, + + /* U+0159 "ř" */ + 0x51, 0x00, 0xA6, 0x21, 0x08, 0x42, 0x00, + + /* U+015A "Ś" */ + 0x10, 0x80, 0x1E, 0x86, 0x18, 0x1E, 0x06, 0x18, 0x5E, + + /* U+015B "ś" */ + 0x22, 0x00, 0xE8, 0xC1, 0xC1, 0x8B, 0x80, + + /* U+015C "Ŝ" */ + 0x10, 0xA0, 0x1E, 0x86, 0x18, 0x1E, 0x06, 0x18, 0x5E, + + /* U+015D "ŝ" */ + 0x22, 0x80, 0xE8, 0xC1, 0xC1, 0x8B, 0x80, + + /* U+015E "Ş" */ + 0x7A, 0x18, 0x60, 0x78, 0x18, 0x61, 0x78, 0x81, 0x1C, + + /* U+015F "ş" */ + 0x74, 0x60, 0xE0, 0xC5, 0xC4, 0x13, 0x80, + + /* U+0160 "Š" */ + 0x50, 0x80, 0x1E, 0x86, 0x18, 0x1E, 0x06, 0x18, 0x5E, + + /* U+0161 "š" */ + 0x51, 0x00, 0xE8, 0xC1, 0xC1, 0x8B, 0x80, + + /* U+0162 "Ţ" */ + 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x00, 0x40, 0x80, + + /* U+0163 "ţ" */ + 0x4B, 0xA4, 0x92, 0x60, 0x80, + + /* U+0164 "Ť" */ + 0x28, 0x20, 0x07, 0xF1, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, + + /* U+0165 "ť" */ + 0x4A, 0x38, 0x84, 0x21, 0x08, 0x60, + + /* U+0166 "Ŧ" */ + 0xFE, 0x20, 0x40, 0x87, 0xC2, 0x04, 0x08, 0x10, + + /* U+0167 "ŧ" */ + 0x5D, 0x2E, 0x93, + + /* U+0168 "Ũ" */ + 0x38, 0xD0, 0x04, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+0169 "ũ" */ + 0x57, 0x81, 0x18, 0xC6, 0x31, 0x8B, 0xC0, + + /* U+016A "Ū" */ + 0x78, 0x02, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x82, 0x88, 0xE0, + + /* U+016B "ū" */ + 0xF0, 0x23, 0x18, 0xC6, 0x31, 0x78, + + /* U+016C "Ŭ" */ + 0x28, 0x30, 0x04, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+016D "ŭ" */ + 0x53, 0x81, 0x18, 0xC6, 0x31, 0x8B, 0xC0, + + /* U+016E "Ů" */ + 0x38, 0x50, 0xE0, 0x08, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0A, 0x23, 0x80, + + /* U+016F "ů" */ + 0x32, 0x8C, 0x08, 0xC6, 0x31, 0x8C, 0x5E, + + /* U+0170 "Ű" */ + 0x14, 0x50, 0x04, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+0171 "ű" */ + 0x2A, 0x81, 0x18, 0xC6, 0x31, 0x8B, 0xC0, + + /* U+0172 "Ų" */ + 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xA2, 0x38, 0x20, 0x60, + + /* U+0173 "ų" */ + 0x8A, 0x28, 0xA2, 0x8A, 0x27, 0x82, 0x0C, + + /* U+0174 "Ŵ" */ + 0x04, 0x01, 0x40, 0x00, 0x42, 0x18, 0xA3, 0x14, 0x92, 0x92, 0x8A, 0x51, + 0x4A, 0x28, 0x82, 0x10, 0x40, + + /* U+0175 "ŵ" */ + 0x08, 0x0A, 0x00, 0x11, 0x18, 0x8A, 0xA9, 0x54, 0xAA, 0x22, 0x11, 0x00, + + /* U+0176 "Ŷ" */ + 0x20, 0xA0, 0x04, 0x14, 0x48, 0x8A, 0x08, 0x10, 0x20, 0x40, 0x80, + + /* U+0177 "ŷ" */ + 0x22, 0x81, 0x18, 0xA9, 0x4A, 0x21, 0x08, 0x80, + + /* U+0178 "Ÿ" */ + 0x28, 0x02, 0x0A, 0x24, 0x45, 0x04, 0x08, 0x10, 0x20, 0x40, + + /* U+0179 "Ź" */ + 0x08, 0x20, 0x03, 0xF0, 0x41, 0x02, 0x08, 0x20, 0x41, 0x07, 0xF0, + + /* U+017A "ź" */ + 0x11, 0x01, 0xF1, 0x08, 0x88, 0x47, 0xC0, + + /* U+017B "Ż" */ + 0x10, 0x01, 0xF8, 0x20, 0x81, 0x04, 0x10, 0x20, 0x83, 0xF8, + + /* U+017C "ż" */ + 0x20, 0x3E, 0x21, 0x11, 0x08, 0xF8, + + /* U+017D "Ž" */ + 0x34, 0x30, 0x03, 0xF0, 0x41, 0x02, 0x08, 0x20, 0x41, 0x07, 0xF0, + + /* U+017E "ž" */ + 0x51, 0x01, 0xF1, 0x08, 0x88, 0x47, 0xC0, + + /* U+017F "ſ" */ + 0xEA, 0xAA, 0x80, + + /* U+018F "Ə" */ + 0x38, 0x8A, 0x08, 0x1F, 0xF0, 0x60, 0xA2, 0x38, + + /* U+0192 "ƒ" */ + 0x0E, 0x10, 0xF0, 0x81, 0x02, 0x04, 0x10, 0x20, 0x43, 0x80, + + /* U+01A0 "Ơ" */ + 0x39, 0x45, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, + + /* U+01A1 "ơ" */ + 0x76, 0x38, 0xE2, 0x8A, 0x27, 0x00, + + /* U+01AF "Ư" */ + 0x82, 0xC1, 0x60, 0xD0, 0x48, 0x24, 0x12, 0x08, 0x88, 0x38, 0x00, + + /* U+01B0 "ư" */ + 0x8B, 0x16, 0x34, 0x48, 0x93, 0x1A, 0x00, + + /* U+01CD "Ǎ" */ + 0x28, 0x60, 0x00, 0x82, 0x85, 0x0A, 0x22, 0x7C, 0x8A, 0x0C, 0x10, + + /* U+01CE "ǎ" */ + 0x69, 0x80, 0xE8, 0x85, 0xF1, 0x9B, 0x40, + + /* U+01CF "Ǐ" */ + 0xD6, 0x04, 0x44, 0x44, 0x44, 0x44, + + /* U+01D0 "ǐ" */ + 0xE6, 0x04, 0x44, 0x44, 0x44, + + /* U+01D1 "Ǒ" */ + 0x14, 0x30, 0x01, 0xC4, 0x50, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+01D2 "ǒ" */ + 0x51, 0x80, 0xE8, 0xC6, 0x31, 0x8B, 0x80, + + /* U+01D3 "Ǔ" */ + 0x38, 0x30, 0x04, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+01D4 "ǔ" */ + 0x71, 0x81, 0x18, 0xC6, 0x31, 0x8B, 0xC0, + + /* U+01D5 "Ǖ" */ + 0x38, 0x00, 0xA4, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+01D6 "ǖ" */ + 0x78, 0x14, 0x08, 0xC6, 0x31, 0x8C, 0x5E, + + /* U+01D7 "Ǘ" */ + 0x08, 0x21, 0x14, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+01D8 "ǘ" */ + 0x10, 0x80, 0xA0, 0x46, 0x31, 0x8C, 0x62, 0xF0, + + /* U+01D9 "Ǚ" */ + 0x18, 0x31, 0x14, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+01DA "ǚ" */ + 0x71, 0x80, 0xA0, 0x46, 0x31, 0x8C, 0x62, 0xF0, + + /* U+01DB "Ǜ" */ + 0x10, 0x21, 0x14, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, + + /* U+01DC "ǜ" */ + 0x41, 0x00, 0xA0, 0x46, 0x31, 0x8C, 0x62, 0xF0, + + /* U+01FA "Ǻ" */ + 0x08, 0x20, 0x01, 0xC2, 0x87, 0x0A, 0x14, 0x28, 0x89, 0xF2, 0x28, 0x30, + 0x40, + + /* U+01FB "ǻ" */ + 0x11, 0x00, 0xE5, 0x38, 0x0E, 0x88, 0x5F, 0x19, 0xB4, + + /* U+01FC "Ǽ" */ + 0x01, 0x00, 0x20, 0x00, 0x00, 0x7F, 0x09, 0x00, 0x90, 0x11, 0x01, 0x1F, + 0x3F, 0x02, 0x10, 0x41, 0x04, 0x1F, + + /* U+01FD "ǽ" */ + 0x04, 0x04, 0x00, 0x0E, 0xE8, 0x89, 0xC7, 0x3F, 0x10, 0x88, 0xBB, 0x80, + + /* U+01FE "Ǿ" */ + 0x08, 0x20, 0x01, 0xD4, 0x51, 0x62, 0xC9, 0xA3, 0x45, 0x15, 0xC0, + + /* U+01FF "ǿ" */ + 0x11, 0x00, 0xF9, 0x4E, 0xB9, 0x4F, 0x80, +}; + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 48, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 0} /* U+0020 */, + {.bitmap_index = 1, .adv_w = 48, .box_w = 1, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0021 */, + {.bitmap_index = 3, .adv_w = 64, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 6} /* U+0022 */, + {.bitmap_index = 5, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0023 */, + {.bitmap_index = 13, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = -1} /* U+0024 */, + {.bitmap_index = 20, .adv_w = 176, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0025 */, + {.bitmap_index = 31, .adv_w = 128, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0026 */, + {.bitmap_index = 39, .adv_w = 32, .box_w = 1, .box_h = 3, .ofs_x = 1, .ofs_y = 6} /* U+0027 */, + {.bitmap_index = 40, .adv_w = 64, .box_w = 3, .box_h = 11, .ofs_x = 1, .ofs_y = -2} /* U+0028 */, + {.bitmap_index = 45, .adv_w = 64, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = -2} /* U+0029 */, + {.bitmap_index = 50, .adv_w = 80, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 5} /* U+002A */, + {.bitmap_index = 53, .adv_w = 112, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 2} /* U+002B */, + {.bitmap_index = 57, .adv_w = 48, .box_w = 1, .box_h = 3, .ofs_x = 1, .ofs_y = -2} /* U+002C */, + {.bitmap_index = 58, .adv_w = 64, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 3} /* U+002D */, + {.bitmap_index = 59, .adv_w = 48, .box_w = 1, .box_h = 1, .ofs_x = 1, .ofs_y = 0} /* U+002E */, + {.bitmap_index = 60, .adv_w = 48, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+002F */, + {.bitmap_index = 64, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0030 */, + {.bitmap_index = 70, .adv_w = 112, .box_w = 3, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0031 */, + {.bitmap_index = 74, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0032 */, + {.bitmap_index = 80, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0033 */, + {.bitmap_index = 86, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0034 */, + {.bitmap_index = 92, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0035 */, + {.bitmap_index = 98, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0036 */, + {.bitmap_index = 104, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0037 */, + {.bitmap_index = 110, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0038 */, + {.bitmap_index = 116, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0039 */, + {.bitmap_index = 122, .adv_w = 48, .box_w = 1, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+003A */, + {.bitmap_index = 123, .adv_w = 48, .box_w = 1, .box_h = 9, .ofs_x = 1, .ofs_y = -2} /* U+003B */, + {.bitmap_index = 125, .adv_w = 112, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 2} /* U+003C */, + {.bitmap_index = 129, .adv_w = 112, .box_w = 6, .box_h = 4, .ofs_x = 0, .ofs_y = 2} /* U+003D */, + {.bitmap_index = 132, .adv_w = 112, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 2} /* U+003E */, + {.bitmap_index = 136, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+003F */, + {.bitmap_index = 142, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -3} /* U+0040 */, + {.bitmap_index = 159, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0041 */, + {.bitmap_index = 167, .adv_w = 128, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0042 */, + {.bitmap_index = 174, .adv_w = 144, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0043 */, + {.bitmap_index = 182, .adv_w = 144, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0044 */, + {.bitmap_index = 190, .adv_w = 128, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0045 */, + {.bitmap_index = 197, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0046 */, + {.bitmap_index = 203, .adv_w = 144, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0047 */, + {.bitmap_index = 211, .adv_w = 144, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0048 */, + {.bitmap_index = 219, .adv_w = 48, .box_w = 1, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0049 */, + {.bitmap_index = 221, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+004A */, + {.bitmap_index = 227, .adv_w = 128, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+004B */, + {.bitmap_index = 235, .adv_w = 112, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+004C */, + {.bitmap_index = 242, .adv_w = 144, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+004D */, + {.bitmap_index = 250, .adv_w = 144, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+004E */, + {.bitmap_index = 258, .adv_w = 144, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+004F */, + {.bitmap_index = 266, .adv_w = 128, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0050 */, + {.bitmap_index = 273, .adv_w = 144, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = -1} /* U+0051 */, + {.bitmap_index = 282, .adv_w = 144, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0052 */, + {.bitmap_index = 290, .adv_w = 128, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0053 */, + {.bitmap_index = 297, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0054 */, + {.bitmap_index = 305, .adv_w = 144, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0055 */, + {.bitmap_index = 313, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0056 */, + {.bitmap_index = 321, .adv_w = 176, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0057 */, + {.bitmap_index = 334, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0058 */, + {.bitmap_index = 342, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0059 */, + {.bitmap_index = 350, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+005A */, + {.bitmap_index = 358, .adv_w = 48, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = -2} /* U+005B */, + {.bitmap_index = 361, .adv_w = 48, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+005C */, + {.bitmap_index = 365, .adv_w = 48, .box_w = 2, .box_h = 11, .ofs_x = 0, .ofs_y = -2} /* U+005D */, + {.bitmap_index = 368, .adv_w = 80, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 4} /* U+005E */, + {.bitmap_index = 372, .adv_w = 112, .box_w = 7, .box_h = 1, .ofs_x = 0, .ofs_y = -2} /* U+005F */, + {.bitmap_index = 373, .adv_w = 64, .box_w = 2, .box_h = 2, .ofs_x = 1, .ofs_y = 7} /* U+0060 */, + {.bitmap_index = 374, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0061 */, + {.bitmap_index = 379, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0062 */, + {.bitmap_index = 385, .adv_w = 96, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0063 */, + {.bitmap_index = 389, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0064 */, + {.bitmap_index = 395, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0065 */, + {.bitmap_index = 400, .adv_w = 48, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0066 */, + {.bitmap_index = 405, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -2} /* U+0067 */, + {.bitmap_index = 411, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0068 */, + {.bitmap_index = 417, .adv_w = 48, .box_w = 1, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0069 */, + {.bitmap_index = 419, .adv_w = 48, .box_w = 3, .box_h = 11, .ofs_x = -1, .ofs_y = -2} /* U+006A */, + {.bitmap_index = 424, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+006B */, + {.bitmap_index = 430, .adv_w = 48, .box_w = 1, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+006C */, + {.bitmap_index = 432, .adv_w = 176, .box_w = 9, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+006D */, + {.bitmap_index = 440, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+006E */, + {.bitmap_index = 445, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+006F */, + {.bitmap_index = 450, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -2} /* U+0070 */, + {.bitmap_index = 456, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -2} /* U+0071 */, + {.bitmap_index = 462, .adv_w = 64, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0072 */, + {.bitmap_index = 465, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0073 */, + {.bitmap_index = 470, .adv_w = 48, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0074 */, + {.bitmap_index = 474, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0075 */, + {.bitmap_index = 479, .adv_w = 80, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0076 */, + {.bitmap_index = 484, .adv_w = 144, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0077 */, + {.bitmap_index = 492, .adv_w = 80, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0078 */, + {.bitmap_index = 497, .adv_w = 80, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+0079 */, + {.bitmap_index = 503, .adv_w = 80, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+007A */, + {.bitmap_index = 508, .adv_w = 64, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = -2} /* U+007B */, + {.bitmap_index = 513, .adv_w = 48, .box_w = 1, .box_h = 11, .ofs_x = 1, .ofs_y = -2} /* U+007C */, + {.bitmap_index = 515, .adv_w = 64, .box_w = 3, .box_h = 11, .ofs_x = 1, .ofs_y = -2} /* U+007D */, + {.bitmap_index = 520, .adv_w = 112, .box_w = 6, .box_h = 4, .ofs_x = 1, .ofs_y = 2} /* U+007E */, + {.bitmap_index = 523, .adv_w = 48, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 0} /* U+00A0 */, + {.bitmap_index = 524, .adv_w = 48, .box_w = 1, .box_h = 9, .ofs_x = 1, .ofs_y = -2} /* U+00A1 */, + {.bitmap_index = 526, .adv_w = 112, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = -3} /* U+00A2 */, + {.bitmap_index = 534, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00A3 */, + {.bitmap_index = 540, .adv_w = 112, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 2} /* U+00A4 */, + {.bitmap_index = 544, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00A5 */, + {.bitmap_index = 552, .adv_w = 48, .box_w = 1, .box_h = 11, .ofs_x = 1, .ofs_y = -2} /* U+00A6 */, + {.bitmap_index = 554, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = -2} /* U+00A7 */, + {.bitmap_index = 563, .adv_w = 64, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 8} /* U+00A8 */, + {.bitmap_index = 564, .adv_w = 144, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00A9 */, + {.bitmap_index = 575, .adv_w = 64, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 5} /* U+00AA */, + {.bitmap_index = 577, .adv_w = 112, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 0} /* U+00AB */, + {.bitmap_index = 581, .adv_w = 112, .box_w = 6, .box_h = 4, .ofs_x = 0, .ofs_y = 2} /* U+00AC */, + {.bitmap_index = 584, .adv_w = 64, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 3} /* U+00AD */, + {.bitmap_index = 585, .adv_w = 144, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00AE */, + {.bitmap_index = 596, .adv_w = 112, .box_w = 7, .box_h = 1, .ofs_x = 0, .ofs_y = 9} /* U+00AF */, + {.bitmap_index = 597, .adv_w = 80, .box_w = 3, .box_h = 3, .ofs_x = 1, .ofs_y = 6} /* U+00B0 */, + {.bitmap_index = 599, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+00B1 */, + {.bitmap_index = 604, .adv_w = 64, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 5} /* U+00B2 */, + {.bitmap_index = 606, .adv_w = 64, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 5} /* U+00B3 */, + {.bitmap_index = 608, .adv_w = 64, .box_w = 2, .box_h = 2, .ofs_x = 1, .ofs_y = 7} /* U+00B4 */, + {.bitmap_index = 609, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -2} /* U+00B5 */, + {.bitmap_index = 615, .adv_w = 96, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = -2} /* U+00B6 */, + {.bitmap_index = 624, .adv_w = 48, .box_w = 1, .box_h = 1, .ofs_x = 1, .ofs_y = 4} /* U+00B7 */, + {.bitmap_index = 625, .adv_w = 64, .box_w = 3, .box_h = 3, .ofs_x = 1, .ofs_y = -3} /* U+00B8 */, + {.bitmap_index = 627, .adv_w = 64, .box_w = 2, .box_h = 4, .ofs_x = 1, .ofs_y = 5} /* U+00B9 */, + {.bitmap_index = 628, .adv_w = 64, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 5} /* U+00BA */, + {.bitmap_index = 630, .adv_w = 112, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 0} /* U+00BB */, + {.bitmap_index = 634, .adv_w = 160, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00BC */, + {.bitmap_index = 645, .adv_w = 160, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00BD */, + {.bitmap_index = 656, .adv_w = 160, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00BE */, + {.bitmap_index = 668, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -2} /* U+00BF */, + {.bitmap_index = 674, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+00C0 */, + {.bitmap_index = 685, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+00C1 */, + {.bitmap_index = 696, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+00C2 */, + {.bitmap_index = 707, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+00C3 */, + {.bitmap_index = 718, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00C4 */, + {.bitmap_index = 728, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00C5 */, + {.bitmap_index = 738, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = -1, .ofs_y = 0} /* U+00C6 */, + {.bitmap_index = 752, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = -3} /* U+00C7 */, + {.bitmap_index = 763, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+00C8 */, + {.bitmap_index = 772, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+00C9 */, + {.bitmap_index = 781, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+00CA */, + {.bitmap_index = 790, .adv_w = 128, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0} /* U+00CB */, + {.bitmap_index = 799, .adv_w = 48, .box_w = 2, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+00CC */, + {.bitmap_index = 802, .adv_w = 48, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+00CD */, + {.bitmap_index = 805, .adv_w = 48, .box_w = 5, .box_h = 12, .ofs_x = -1, .ofs_y = 0} /* U+00CE */, + {.bitmap_index = 813, .adv_w = 48, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+00CF */, + {.bitmap_index = 818, .adv_w = 144, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00D0 */, + {.bitmap_index = 827, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+00D1 */, + {.bitmap_index = 838, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+00D2 */, + {.bitmap_index = 849, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+00D3 */, + {.bitmap_index = 860, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+00D4 */, + {.bitmap_index = 871, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+00D5 */, + {.bitmap_index = 882, .adv_w = 144, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0} /* U+00D6 */, + {.bitmap_index = 892, .adv_w = 112, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 2} /* U+00D7 */, + {.bitmap_index = 896, .adv_w = 144, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00D8 */, + {.bitmap_index = 904, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+00D9 */, + {.bitmap_index = 915, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+00DA */, + {.bitmap_index = 926, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+00DB */, + {.bitmap_index = 937, .adv_w = 144, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0} /* U+00DC */, + {.bitmap_index = 947, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+00DD */, + {.bitmap_index = 958, .adv_w = 128, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00DE */, + {.bitmap_index = 965, .adv_w = 128, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00DF */, + {.bitmap_index = 972, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+00E0 */, + {.bitmap_index = 979, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+00E1 */, + {.bitmap_index = 986, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+00E2 */, + {.bitmap_index = 993, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+00E3 */, + {.bitmap_index = 1000, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00E4 */, + {.bitmap_index = 1006, .adv_w = 112, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = 0} /* U+00E5 */, + {.bitmap_index = 1013, .adv_w = 176, .box_w = 9, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+00E6 */, + {.bitmap_index = 1021, .adv_w = 96, .box_w = 4, .box_h = 10, .ofs_x = 1, .ofs_y = -3} /* U+00E7 */, + {.bitmap_index = 1026, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+00E8 */, + {.bitmap_index = 1033, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+00E9 */, + {.bitmap_index = 1040, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+00EA */, + {.bitmap_index = 1047, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00EB */, + {.bitmap_index = 1053, .adv_w = 48, .box_w = 2, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+00EC */, + {.bitmap_index = 1056, .adv_w = 48, .box_w = 2, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+00ED */, + {.bitmap_index = 1059, .adv_w = 48, .box_w = 4, .box_h = 10, .ofs_x = -1, .ofs_y = 0} /* U+00EE */, + {.bitmap_index = 1064, .adv_w = 48, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00EF */, + {.bitmap_index = 1068, .adv_w = 112, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00F0 */, + {.bitmap_index = 1075, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+00F1 */, + {.bitmap_index = 1082, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+00F2 */, + {.bitmap_index = 1089, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+00F3 */, + {.bitmap_index = 1096, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+00F4 */, + {.bitmap_index = 1103, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+00F5 */, + {.bitmap_index = 1110, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00F6 */, + {.bitmap_index = 1116, .adv_w = 112, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 2} /* U+00F7 */, + {.bitmap_index = 1120, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+00F8 */, + {.bitmap_index = 1125, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+00F9 */, + {.bitmap_index = 1132, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+00FA */, + {.bitmap_index = 1139, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+00FB */, + {.bitmap_index = 1146, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00FC */, + {.bitmap_index = 1152, .adv_w = 80, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = -2} /* U+00FD */, + {.bitmap_index = 1160, .adv_w = 112, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = -2} /* U+00FE */, + {.bitmap_index = 1167, .adv_w = 80, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = -2} /* U+00FF */, + {.bitmap_index = 1174, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0100 */, + {.bitmap_index = 1184, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0101 */, + {.bitmap_index = 1190, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+0102 */, + {.bitmap_index = 1201, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+0103 */, + {.bitmap_index = 1208, .adv_w = 112, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -2} /* U+0104 */, + {.bitmap_index = 1219, .adv_w = 112, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = -2} /* U+0105 */, + {.bitmap_index = 1226, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+0106 */, + {.bitmap_index = 1237, .adv_w = 96, .box_w = 4, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+0107 */, + {.bitmap_index = 1242, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+0108 */, + {.bitmap_index = 1253, .adv_w = 96, .box_w = 4, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+0109 */, + {.bitmap_index = 1258, .adv_w = 144, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0} /* U+010A */, + {.bitmap_index = 1268, .adv_w = 96, .box_w = 4, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+010B */, + {.bitmap_index = 1273, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+010C */, + {.bitmap_index = 1284, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+010D */, + {.bitmap_index = 1291, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+010E */, + {.bitmap_index = 1302, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+010F */, + {.bitmap_index = 1310, .adv_w = 144, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0110 */, + {.bitmap_index = 1319, .adv_w = 112, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0111 */, + {.bitmap_index = 1326, .adv_w = 128, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0} /* U+0112 */, + {.bitmap_index = 1335, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0113 */, + {.bitmap_index = 1341, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+0114 */, + {.bitmap_index = 1350, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+0115 */, + {.bitmap_index = 1357, .adv_w = 128, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0} /* U+0116 */, + {.bitmap_index = 1366, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0117 */, + {.bitmap_index = 1372, .adv_w = 128, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = -2} /* U+0118 */, + {.bitmap_index = 1381, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -2} /* U+0119 */, + {.bitmap_index = 1387, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+011A */, + {.bitmap_index = 1396, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+011B */, + {.bitmap_index = 1403, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+011C */, + {.bitmap_index = 1414, .adv_w = 112, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = -2} /* U+011D */, + {.bitmap_index = 1422, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+011E */, + {.bitmap_index = 1433, .adv_w = 112, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = -2} /* U+011F */, + {.bitmap_index = 1441, .adv_w = 144, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0} /* U+0120 */, + {.bitmap_index = 1451, .adv_w = 112, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = -2} /* U+0121 */, + {.bitmap_index = 1458, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = -3} /* U+0122 */, + {.bitmap_index = 1469, .adv_w = 112, .box_w = 5, .box_h = 13, .ofs_x = 1, .ofs_y = -2} /* U+0123 */, + {.bitmap_index = 1478, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+0124 */, + {.bitmap_index = 1489, .adv_w = 112, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+0125 */, + {.bitmap_index = 1497, .adv_w = 144, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0126 */, + {.bitmap_index = 1508, .adv_w = 112, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0127 */, + {.bitmap_index = 1515, .adv_w = 48, .box_w = 4, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+0128 */, + {.bitmap_index = 1521, .adv_w = 48, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+0129 */, + {.bitmap_index = 1526, .adv_w = 48, .box_w = 4, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+012A */, + {.bitmap_index = 1532, .adv_w = 48, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+012B */, + {.bitmap_index = 1537, .adv_w = 48, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+012C */, + {.bitmap_index = 1542, .adv_w = 48, .box_w = 3, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+012D */, + {.bitmap_index = 1546, .adv_w = 48, .box_w = 3, .box_h = 11, .ofs_x = 1, .ofs_y = -2} /* U+012E */, + {.bitmap_index = 1551, .adv_w = 48, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = -2} /* U+012F */, + {.bitmap_index = 1554, .adv_w = 48, .box_w = 1, .box_h = 11, .ofs_x = 1, .ofs_y = 0} /* U+0130 */, + {.bitmap_index = 1556, .adv_w = 48, .box_w = 1, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0131 */, + {.bitmap_index = 1557, .adv_w = 144, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0132 */, + {.bitmap_index = 1565, .adv_w = 80, .box_w = 3, .box_h = 11, .ofs_x = 1, .ofs_y = -2} /* U+0133 */, + {.bitmap_index = 1570, .adv_w = 96, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+0134 */, + {.bitmap_index = 1581, .adv_w = 48, .box_w = 5, .box_h = 12, .ofs_x = -1, .ofs_y = -2} /* U+0135 */, + {.bitmap_index = 1589, .adv_w = 128, .box_w = 7, .box_h = 13, .ofs_x = 1, .ofs_y = -4} /* U+0136 */, + {.bitmap_index = 1601, .adv_w = 96, .box_w = 5, .box_h = 13, .ofs_x = 1, .ofs_y = -4} /* U+0137 */, + {.bitmap_index = 1610, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0138 */, + {.bitmap_index = 1615, .adv_w = 112, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+0139 */, + {.bitmap_index = 1624, .adv_w = 48, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+013A */, + {.bitmap_index = 1627, .adv_w = 112, .box_w = 6, .box_h = 13, .ofs_x = 1, .ofs_y = -4} /* U+013B */, + {.bitmap_index = 1637, .adv_w = 48, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = -4} /* U+013C */, + {.bitmap_index = 1642, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+013D */, + {.bitmap_index = 1648, .adv_w = 64, .box_w = 3, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+013E */, + {.bitmap_index = 1652, .adv_w = 112, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+013F */, + {.bitmap_index = 1659, .adv_w = 64, .box_w = 3, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0140 */, + {.bitmap_index = 1663, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0141 */, + {.bitmap_index = 1671, .adv_w = 48, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0142 */, + {.bitmap_index = 1675, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+0143 */, + {.bitmap_index = 1686, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+0144 */, + {.bitmap_index = 1693, .adv_w = 144, .box_w = 7, .box_h = 13, .ofs_x = 1, .ofs_y = -4} /* U+0145 */, + {.bitmap_index = 1705, .adv_w = 112, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = -4} /* U+0146 */, + {.bitmap_index = 1712, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+0147 */, + {.bitmap_index = 1723, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+0148 */, + {.bitmap_index = 1730, .adv_w = 112, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0149 */, + {.bitmap_index = 1737, .adv_w = 144, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+014A */, + {.bitmap_index = 1745, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -2} /* U+014B */, + {.bitmap_index = 1751, .adv_w = 144, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0} /* U+014C */, + {.bitmap_index = 1761, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+014D */, + {.bitmap_index = 1767, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+014E */, + {.bitmap_index = 1778, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+014F */, + {.bitmap_index = 1785, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+0150 */, + {.bitmap_index = 1796, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+0151 */, + {.bitmap_index = 1803, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0152 */, + {.bitmap_index = 1815, .adv_w = 176, .box_w = 9, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0153 */, + {.bitmap_index = 1823, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+0154 */, + {.bitmap_index = 1834, .adv_w = 64, .box_w = 3, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+0155 */, + {.bitmap_index = 1838, .adv_w = 144, .box_w = 7, .box_h = 13, .ofs_x = 1, .ofs_y = -4} /* U+0156 */, + {.bitmap_index = 1850, .adv_w = 64, .box_w = 4, .box_h = 11, .ofs_x = 0, .ofs_y = -4} /* U+0157 */, + {.bitmap_index = 1856, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+0158 */, + {.bitmap_index = 1867, .adv_w = 64, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+0159 */, + {.bitmap_index = 1874, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+015A */, + {.bitmap_index = 1883, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+015B */, + {.bitmap_index = 1890, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+015C */, + {.bitmap_index = 1899, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+015D */, + {.bitmap_index = 1906, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = -3} /* U+015E */, + {.bitmap_index = 1915, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = -3} /* U+015F */, + {.bitmap_index = 1922, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+0160 */, + {.bitmap_index = 1931, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+0161 */, + {.bitmap_index = 1938, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -3} /* U+0162 */, + {.bitmap_index = 1949, .adv_w = 48, .box_w = 3, .box_h = 12, .ofs_x = 0, .ofs_y = -3} /* U+0163 */, + {.bitmap_index = 1954, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+0164 */, + {.bitmap_index = 1965, .adv_w = 80, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0165 */, + {.bitmap_index = 1971, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0166 */, + {.bitmap_index = 1979, .adv_w = 48, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0167 */, + {.bitmap_index = 1982, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+0168 */, + {.bitmap_index = 1993, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+0169 */, + {.bitmap_index = 2000, .adv_w = 144, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0} /* U+016A */, + {.bitmap_index = 2010, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+016B */, + {.bitmap_index = 2016, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+016C */, + {.bitmap_index = 2027, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+016D */, + {.bitmap_index = 2034, .adv_w = 144, .box_w = 7, .box_h = 13, .ofs_x = 1, .ofs_y = 0} /* U+016E */, + {.bitmap_index = 2046, .adv_w = 112, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = 0} /* U+016F */, + {.bitmap_index = 2053, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+0170 */, + {.bitmap_index = 2064, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+0171 */, + {.bitmap_index = 2071, .adv_w = 144, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = -2} /* U+0172 */, + {.bitmap_index = 2081, .adv_w = 112, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = -2} /* U+0173 */, + {.bitmap_index = 2088, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+0174 */, + {.bitmap_index = 2105, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+0175 */, + {.bitmap_index = 2117, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+0176 */, + {.bitmap_index = 2128, .adv_w = 80, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = -2} /* U+0177 */, + {.bitmap_index = 2136, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+0178 */, + {.bitmap_index = 2146, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+0179 */, + {.bitmap_index = 2157, .adv_w = 80, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+017A */, + {.bitmap_index = 2164, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+017B */, + {.bitmap_index = 2174, .adv_w = 80, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+017C */, + {.bitmap_index = 2180, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+017D */, + {.bitmap_index = 2191, .adv_w = 80, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+017E */, + {.bitmap_index = 2198, .adv_w = 48, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+017F */, + {.bitmap_index = 2201, .adv_w = 144, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+018F */, + {.bitmap_index = 2209, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -2} /* U+0192 */, + {.bitmap_index = 2219, .adv_w = 160, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01A0 */, + {.bitmap_index = 2228, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+01A1 */, + {.bitmap_index = 2234, .adv_w = 160, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01AF */, + {.bitmap_index = 2245, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+01B0 */, + {.bitmap_index = 2252, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+01CD */, + {.bitmap_index = 2263, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+01CE */, + {.bitmap_index = 2270, .adv_w = 48, .box_w = 4, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+01CF */, + {.bitmap_index = 2276, .adv_w = 48, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+01D0 */, + {.bitmap_index = 2281, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01D1 */, + {.bitmap_index = 2292, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+01D2 */, + {.bitmap_index = 2299, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01D3 */, + {.bitmap_index = 2310, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+01D4 */, + {.bitmap_index = 2317, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01D5 */, + {.bitmap_index = 2328, .adv_w = 112, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = 0} /* U+01D6 */, + {.bitmap_index = 2335, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01D7 */, + {.bitmap_index = 2346, .adv_w = 112, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01D8 */, + {.bitmap_index = 2354, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01D9 */, + {.bitmap_index = 2365, .adv_w = 112, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01DA */, + {.bitmap_index = 2373, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01DB */, + {.bitmap_index = 2384, .adv_w = 112, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01DC */, + {.bitmap_index = 2392, .adv_w = 112, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0} /* U+01FA */, + {.bitmap_index = 2405, .adv_w = 112, .box_w = 5, .box_h = 14, .ofs_x = 1, .ofs_y = 0} /* U+01FB */, + {.bitmap_index = 2414, .adv_w = 192, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = 0} /* U+01FC */, + {.bitmap_index = 2432, .adv_w = 176, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+01FD */, + {.bitmap_index = 2444, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01FE */, + {.bitmap_index = 2455, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+01FF */ +}; + +static const lv_font_fmt_txt_cmap_t cmaps[] = { + {.range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 160, .range_length = 224, .glyph_id_start = 96, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 399, .range_length = 1, .glyph_id_start = 320, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 402, .range_length = 1, .glyph_id_start = 321, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 416, .range_length = 2, .glyph_id_start = 322, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 431, .range_length = 2, .glyph_id_start = 324, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 461, .range_length = 16, .glyph_id_start = 326, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 506, .range_length = 6, .glyph_id_start = 342, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY} +}; + +static const lv_font_fmt_txt_dsc_t font_dsc = { + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 8, + .bpp = 1, + .kern_classes = 0, + .bitmap_format = 0, + .stride = 0, +}; + +const lv_font_t arial_12 = { + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, + .line_height = 18, + .base_line = 2, + .subpx = LV_FONT_SUBPX_NONE, + .underline_position = -1, + .underline_thickness = 0, + .static_bitmap = 0, + .dsc = &font_dsc, + .fallback = NULL, + .user_data = NULL, +}; + +#endif /* ARIAL_12 */ diff --git a/src/ui/fonts/arial_12.h b/src/ui/fonts/arial_12.h new file mode 100644 index 0000000000..ff4168dcb6 --- /dev/null +++ b/src/ui/fonts/arial_12.h @@ -0,0 +1,8 @@ +#ifndef _ARIAL_12_H_ +#define _ARIAL_12_H_ + +typedef struct _lv_font_t lv_font_t; + +extern const lv_font_t arial_12; + +#endif diff --git a/src/ui/fonts/arial_12_ugui.c b/src/ui/fonts/arial_12_ugui.c new file mode 100644 index 0000000000..2b74361032 --- /dev/null +++ b/src/ui/fonts/arial_12_ugui.c @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include "arial_12.h" +#include "arial_12_ugui.h" + +#include + +const UG_FONT font_arial_12 = {&arial_12, FONT_TYPE_LVGL, 11, 12, 0, UINT16_MAX, NULL}; diff --git a/src/ui/fonts/arial_12_ugui.h b/src/ui/fonts/arial_12_ugui.h new file mode 100644 index 0000000000..2e9eed780c --- /dev/null +++ b/src/ui/fonts/arial_12_ugui.h @@ -0,0 +1,8 @@ +#ifndef _ARIAL_12_UGUI_H_ +#define _ARIAL_12_UGUI_H_ + +#include + +extern const UG_FONT font_arial_12; + +#endif diff --git a/src/ui/fonts/arial_9.c b/src/ui/fonts/arial_9.c new file mode 100644 index 0000000000..980ac55cd5 --- /dev/null +++ b/src/ui/fonts/arial_9.c @@ -0,0 +1,1477 @@ +/******************************************************************************* + * Size: 9 px + * Bpp: 1 + * Opts: --bpp 1 --size 9 --dpi 72 --font /usr/share/fonts/truetype/msttcorefonts/Arial.ttf --range 32-126,160-383,399,402,416-417,431-432,461-476,506-511 --format lvgl -o arial_9.c + ******************************************************************************/ + +#ifdef __has_include + #if __has_include("lvgl.h") + #ifndef LV_LVGL_H_INCLUDE_SIMPLE + #define LV_LVGL_H_INCLUDE_SIMPLE + #endif + #endif +#endif + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "lvgl/lvgl.h" +#endif + +#include "arial_9.h" + +#ifndef ARIAL_9 +#define ARIAL_9 1 +#endif + +#if ARIAL_9 + +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + 0x00, + + /* U+0021 "!" */ + 0xFA, + + /* U+0022 "\"" */ + 0xB4, + + /* U+0023 "#" */ + 0x55, 0xF5, 0xFA, 0xA0, + + /* U+0024 "$" */ + 0x75, 0x68, 0xE2, 0xD5, 0xC4, + + /* U+0025 "%" */ + 0x4A, 0xC5, 0x04, 0x28, 0xD2, 0x80, + + /* U+0026 "&" */ + 0x31, 0x24, 0x9C, 0x96, 0x27, 0x40, + + /* U+0027 "'" */ + 0xC0, + + /* U+0028 "(" */ + 0x2A, 0x49, 0x22, 0x20, + + /* U+0029 ")" */ + 0x88, 0x92, 0x4A, 0x80, + + /* U+002A "*" */ + 0xEA, 0x80, + + /* U+002B "+" */ + 0x21, 0x3E, 0x42, 0x00, + + /* U+002C "," */ + 0xC0, + + /* U+002D "-" */ + 0xC0, + + /* U+002E "." */ + 0x80, + + /* U+002F "/" */ + 0x25, 0x25, 0x20, + + /* U+0030 "0" */ + 0x69, 0x99, 0x99, 0x60, + + /* U+0031 "1" */ + 0x75, 0x54, + + /* U+0032 "2" */ + 0x69, 0x12, 0x24, 0xF0, + + /* U+0033 "3" */ + 0x69, 0x12, 0x19, 0x60, + + /* U+0034 "4" */ + 0x11, 0x95, 0x2F, 0x88, 0x40, + + /* U+0035 "5" */ + 0x74, 0xE9, 0x19, 0x60, + + /* U+0036 "6" */ + 0x69, 0xE9, 0x99, 0x60, + + /* U+0037 "7" */ + 0xF1, 0x22, 0x44, 0x40, + + /* U+0038 "8" */ + 0x69, 0x96, 0x99, 0x60, + + /* U+0039 "9" */ + 0x69, 0x99, 0x79, 0x60, + + /* U+003A ":" */ + 0x88, + + /* U+003B ";" */ + 0x8C, + + /* U+003C "<" */ + 0x2A, 0x22, + + /* U+003D "=" */ + 0xF0, 0xF0, + + /* U+003E ">" */ + 0x88, 0xA8, + + /* U+003F "?" */ + 0x74, 0x42, 0x62, 0x00, 0x80, + + /* U+0040 "@" */ + 0x3C, 0x42, 0x95, 0xAD, 0xA9, 0xAA, 0xBC, 0x43, 0x3C, + + /* U+0041 "A" */ + 0x10, 0x51, 0x12, 0x27, 0xC8, 0x91, 0x00, + + /* U+0042 "B" */ + 0xE9, 0x9F, 0x99, 0xE0, + + /* U+0043 "C" */ + 0x74, 0x61, 0x08, 0x45, 0xC0, + + /* U+0044 "D" */ + 0xF4, 0x63, 0x18, 0xC7, 0xC0, + + /* U+0045 "E" */ + 0xFC, 0x21, 0xF8, 0x43, 0xE0, + + /* U+0046 "F" */ + 0xF8, 0x8E, 0x88, 0x80, + + /* U+0047 "G" */ + 0x74, 0x61, 0x38, 0xC5, 0xC0, + + /* U+0048 "H" */ + 0x8C, 0x63, 0xF8, 0xC6, 0x20, + + /* U+0049 "I" */ + 0xFE, + + /* U+004A "J" */ + 0x11, 0x11, 0x19, 0xE0, + + /* U+004B "K" */ + 0x8C, 0xA9, 0x8A, 0x4A, 0x20, + + /* U+004C "L" */ + 0x88, 0x88, 0x88, 0xF0, + + /* U+004D "M" */ + 0x83, 0x8F, 0x1D, 0x5A, 0xB5, 0x64, 0x80, + + /* U+004E "N" */ + 0x8E, 0x73, 0x59, 0xCE, 0x20, + + /* U+004F "O" */ + 0x74, 0x63, 0x18, 0xC5, 0xC0, + + /* U+0050 "P" */ + 0xF9, 0x9F, 0x88, 0x80, + + /* U+0051 "Q" */ + 0x74, 0x63, 0x18, 0xC9, 0xE0, + + /* U+0052 "R" */ + 0xF4, 0x63, 0xE9, 0x46, 0x20, + + /* U+0053 "S" */ + 0x69, 0x86, 0x19, 0x60, + + /* U+0054 "T" */ + 0xF9, 0x08, 0x42, 0x10, 0x80, + + /* U+0055 "U" */ + 0x8C, 0x63, 0x18, 0xC5, 0xC0, + + /* U+0056 "V" */ + 0x44, 0x89, 0x12, 0x22, 0x85, 0x04, 0x00, + + /* U+0057 "W" */ + 0x88, 0xCA, 0x55, 0x4A, 0xA5, 0x52, 0xA8, 0x88, + + /* U+0058 "X" */ + 0x8A, 0x94, 0x45, 0x2A, 0x20, + + /* U+0059 "Y" */ + 0x8A, 0x94, 0x42, 0x10, 0x80, + + /* U+005A "Z" */ + 0xFC, 0x21, 0x08, 0x42, 0x0F, 0xC0, + + /* U+005B "[" */ + 0xEA, 0xAA, 0xC0, + + /* U+005C "\\" */ + 0x91, 0x24, 0x48, + + /* U+005D "]" */ + 0xD5, 0x55, 0xC0, + + /* U+005E "^" */ + 0x56, 0x80, + + /* U+005F "_" */ + 0xF8, + + /* U+0060 "`" */ + 0x90, + + /* U+0061 "a" */ + 0xF1, 0x79, 0xF0, + + /* U+0062 "b" */ + 0x88, 0xE9, 0x99, 0xE0, + + /* U+0063 "c" */ + 0x69, 0x89, 0x60, + + /* U+0064 "d" */ + 0x11, 0x79, 0x99, 0x70, + + /* U+0065 "e" */ + 0x69, 0xF8, 0x70, + + /* U+0066 "f" */ + 0x2B, 0xA4, 0x90, + + /* U+0067 "g" */ + 0x79, 0x99, 0x79, 0x60, + + /* U+0068 "h" */ + 0x88, 0xE9, 0x99, 0x90, + + /* U+0069 "i" */ + 0xBE, + + /* U+006A "j" */ + 0x45, 0x55, 0x80, + + /* U+006B "k" */ + 0x88, 0x9A, 0xEA, 0x90, + + /* U+006C "l" */ + 0xFE, + + /* U+006D "m" */ + 0xFD, 0x26, 0x4C, 0x99, 0x20, + + /* U+006E "n" */ + 0xE9, 0x99, 0x90, + + /* U+006F "o" */ + 0x69, 0x99, 0x60, + + /* U+0070 "p" */ + 0xE9, 0x99, 0xE8, 0x80, + + /* U+0071 "q" */ + 0x79, 0x99, 0x71, 0x10, + + /* U+0072 "r" */ + 0xF2, 0x48, + + /* U+0073 "s" */ + 0x78, 0x61, 0xE0, + + /* U+0074 "t" */ + 0x09, 0xA4, 0x98, + + /* U+0075 "u" */ + 0x99, 0x99, 0x70, + + /* U+0076 "v" */ + 0x8A, 0x94, 0xA2, 0x00, + + /* U+0077 "w" */ + 0xAD, 0x6B, 0x55, 0x00, + + /* U+0078 "x" */ + 0x96, 0x46, 0x90, + + /* U+0079 "y" */ + 0x8A, 0x94, 0xA2, 0x11, 0x00, + + /* U+007A "z" */ + 0xE5, 0x4E, + + /* U+007B "{" */ + 0x69, 0x28, 0x92, 0x60, + + /* U+007C "|" */ + 0xFF, + + /* U+007D "}" */ + 0xC9, 0x22, 0x92, 0xC0, + + /* U+007E "~" */ + 0xDB, + + /* U+00A0 " " */ + 0x00, + + /* U+00A1 "¡" */ + 0xBE, + + /* U+00A2 "¢" */ + 0x22, 0x6B, 0xAD, 0x64, 0x40, + + /* U+00A3 "£" */ + 0x32, 0x51, 0xC4, 0x23, 0xE0, + + /* U+00A4 "¤" */ + 0xF9, 0x9F, + + /* U+00A5 "¥" */ + 0x8A, 0x95, 0xF2, 0x7C, 0x80, + + /* U+00A6 "¦" */ + 0xE7, + + /* U+00A7 "§" */ + 0xE9, 0x4A, 0x95, 0x29, 0x70, + + /* U+00A8 "¨" */ + 0xA0, + + /* U+00A9 "©" */ + 0x7D, 0x06, 0x6D, 0x19, 0xB0, 0x5F, 0x00, + + /* U+00AA "ª" */ + 0xEF, 0x80, + + /* U+00AB "«" */ + 0x2A, 0x94, 0x50, + + /* U+00AC "¬" */ + 0xF1, 0x10, + + /* U+00AD "­" */ + 0xC0, + + /* U+00AE "®" */ + 0x7D, 0x06, 0xCD, 0xDA, 0xB0, 0x5F, 0x00, + + /* U+00AF "¯" */ + 0xF8, + + /* U+00B0 "°" */ + 0xF7, 0x80, + + /* U+00B1 "±" */ + 0x21, 0x3E, 0x42, 0x7C, + + /* U+00B2 "²" */ + 0xEB, 0x80, + + /* U+00B3 "³" */ + 0xEB, 0x80, + + /* U+00B4 "´" */ + 0x60, + + /* U+00B5 "µ" */ + 0x99, 0x99, 0xF8, 0x80, + + /* U+00B6 "¶" */ + 0x7E, 0xB5, 0xA5, 0x29, 0x4A, + + /* U+00B7 "·" */ + 0x80, + + /* U+00B8 "¸" */ + 0x5C, + + /* U+00B9 "¹" */ + 0x74, + + /* U+00BA "º" */ + 0xF7, 0x80, + + /* U+00BB "»" */ + 0xA2, 0x95, 0x40, + + /* U+00BC "¼" */ + 0x47, 0x25, 0x04, 0x25, 0x38, 0x40, + + /* U+00BD "½" */ + 0x45, 0x91, 0x40, 0x82, 0xE8, 0xA3, 0x80, + + /* U+00BE "¾" */ + 0xE2, 0x8B, 0xA0, 0x41, 0x24, 0xC8, 0x80, + + /* U+00BF "¿" */ + 0x20, 0x26, 0x89, 0x60, + + /* U+00C0 "À" */ + 0x10, 0x10, 0x41, 0x42, 0x88, 0x9F, 0x22, 0x82, + + /* U+00C1 "Á" */ + 0x08, 0x20, 0x41, 0x42, 0x88, 0x9F, 0x22, 0x82, + + /* U+00C2 "Â" */ + 0x18, 0x68, 0x41, 0x42, 0x88, 0x9F, 0x22, 0x82, + + /* U+00C3 "Ã" */ + 0x28, 0xA0, 0x41, 0x42, 0x88, 0x9F, 0x22, 0x82, + + /* U+00C4 "Ä" */ + 0x28, 0x20, 0xA1, 0x44, 0x4F, 0x91, 0x41, + + /* U+00C5 "Å" */ + 0x38, 0x50, 0xE1, 0x42, 0x88, 0x9F, 0x22, 0x82, + + /* U+00C6 "Æ" */ + 0x0F, 0xC5, 0x01, 0x40, 0x9F, 0x3C, 0x11, 0x04, 0x7C, + + /* U+00C7 "Ç" */ + 0x74, 0x61, 0x08, 0x45, 0xC2, 0x11, 0x80, + + /* U+00C8 "È" */ + 0x20, 0xBF, 0x08, 0x7E, 0x10, 0xF8, + + /* U+00C9 "É" */ + 0x11, 0x3F, 0x08, 0x7E, 0x10, 0xF8, + + /* U+00CA "Ê" */ + 0x22, 0xBF, 0x08, 0x7E, 0x10, 0xF8, + + /* U+00CB "Ë" */ + 0x57, 0xE1, 0x0F, 0xC2, 0x1F, + + /* U+00CC "Ì" */ + 0x9A, 0xAA, 0x80, + + /* U+00CD "Í" */ + 0x65, 0x55, 0x40, + + /* U+00CE "Î" */ + 0x22, 0x84, 0x21, 0x08, 0x42, 0x10, + + /* U+00CF "Ï" */ + 0xA9, 0x24, 0x92, + + /* U+00D0 "Ð" */ + 0x79, 0x14, 0x7D, 0x45, 0x17, 0x80, + + /* U+00D1 "Ñ" */ + 0x55, 0x23, 0x9C, 0xD6, 0x73, 0x88, + + /* U+00D2 "Ò" */ + 0x20, 0x9D, 0x18, 0xC6, 0x31, 0x70, + + /* U+00D3 "Ó" */ + 0x11, 0x1D, 0x18, 0xC6, 0x31, 0x70, + + /* U+00D4 "Ô" */ + 0x22, 0x9D, 0x18, 0xC6, 0x31, 0x70, + + /* U+00D5 "Õ" */ + 0x55, 0x1D, 0x18, 0xC6, 0x31, 0x70, + + /* U+00D6 "Ö" */ + 0x53, 0xA3, 0x18, 0xC6, 0x2E, + + /* U+00D7 "×" */ + 0x8B, 0x88, 0xE8, 0x80, + + /* U+00D8 "Ø" */ + 0x7C, 0xA7, 0x5C, 0xA7, 0xC0, + + /* U+00D9 "Ù" */ + 0x41, 0x23, 0x18, 0xC6, 0x31, 0x70, + + /* U+00DA "Ú" */ + 0x22, 0x23, 0x18, 0xC6, 0x31, 0x70, + + /* U+00DB "Û" */ + 0x22, 0xA3, 0x18, 0xC6, 0x31, 0x70, + + /* U+00DC "Ü" */ + 0x54, 0x63, 0x18, 0xC6, 0x2E, + + /* U+00DD "Ý" */ + 0x11, 0x22, 0xA5, 0x10, 0x84, 0x20, + + /* U+00DE "Þ" */ + 0x87, 0xA3, 0x18, 0xFA, 0x00, + + /* U+00DF "ß" */ + 0x4A, 0xAC, 0xBD, 0xA0, + + /* U+00E0 "à" */ + 0x42, 0x0F, 0x17, 0x9F, + + /* U+00E1 "á" */ + 0x24, 0x0F, 0x17, 0x9F, + + /* U+00E2 "â" */ + 0x25, 0x0F, 0x17, 0x9F, + + /* U+00E3 "ã" */ + 0x5A, 0x0F, 0x17, 0x9F, + + /* U+00E4 "ä" */ + 0x50, 0xF1, 0x79, 0xF0, + + /* U+00E5 "å" */ + 0x75, 0x70, 0xF1, 0x79, 0xF0, + + /* U+00E6 "æ" */ + 0xEC, 0x25, 0xFC, 0x8E, 0xE0, + + /* U+00E7 "ç" */ + 0x69, 0x89, 0x62, 0x26, + + /* U+00E8 "è" */ + 0x42, 0x06, 0x9F, 0x87, + + /* U+00E9 "é" */ + 0x24, 0x06, 0x9F, 0x87, + + /* U+00EA "ê" */ + 0x25, 0x06, 0x9F, 0x87, + + /* U+00EB "ë" */ + 0xA0, 0x69, 0xF8, 0x70, + + /* U+00EC "ì" */ + 0x92, 0xAA, + + /* U+00ED "í" */ + 0x61, 0x55, + + /* U+00EE "î" */ + 0x65, 0x04, 0x44, 0x44, + + /* U+00EF "ï" */ + 0xA1, 0x24, 0x90, + + /* U+00F0 "ð" */ + 0x62, 0x79, 0x99, 0x60, + + /* U+00F1 "ñ" */ + 0x5A, 0x0E, 0x99, 0x99, + + /* U+00F2 "ò" */ + 0x42, 0x06, 0x99, 0x96, + + /* U+00F3 "ó" */ + 0x24, 0x06, 0x99, 0x96, + + /* U+00F4 "ô" */ + 0x25, 0x06, 0x99, 0x96, + + /* U+00F5 "õ" */ + 0x5A, 0x06, 0x99, 0x96, + + /* U+00F6 "ö" */ + 0xA0, 0x69, 0x99, 0x60, + + /* U+00F7 "÷" */ + 0x20, 0x3E, 0x02, 0x00, + + /* U+00F8 "ø" */ + 0x7B, 0xDD, 0xE0, + + /* U+00F9 "ù" */ + 0x42, 0x09, 0x99, 0x97, + + /* U+00FA "ú" */ + 0x24, 0x09, 0x99, 0x97, + + /* U+00FB "û" */ + 0x22, 0x80, 0x94, 0xA5, 0x27, + + /* U+00FC "ü" */ + 0x50, 0x99, 0x99, 0x70, + + /* U+00FD "ý" */ + 0x11, 0x01, 0x15, 0x29, 0x44, 0x22, 0x00, + + /* U+00FE "þ" */ + 0x88, 0xE9, 0x99, 0xE8, 0x80, + + /* U+00FF "ÿ" */ + 0x50, 0x22, 0xA5, 0x28, 0x84, 0x40, + + /* U+0100 "Ā" */ + 0x38, 0x20, 0xA1, 0x44, 0x4F, 0x91, 0x41, + + /* U+0101 "ā" */ + 0x70, 0xF1, 0x79, 0xF0, + + /* U+0102 "Ă" */ + 0x28, 0x70, 0x41, 0x42, 0x88, 0x9F, 0x22, 0x82, + + /* U+0103 "ă" */ + 0x57, 0x0F, 0x17, 0x9F, + + /* U+0104 "Ą" */ + 0x10, 0x28, 0x28, 0x44, 0x7C, 0x44, 0x82, 0x02, 0x03, + + /* U+0105 "ą" */ + 0xF0, 0x9D, 0x2F, 0x08, 0x60, + + /* U+0106 "Ć" */ + 0x11, 0x1D, 0x18, 0x42, 0x11, 0x70, + + /* U+0107 "ć" */ + 0x24, 0x06, 0x98, 0x96, + + /* U+0108 "Ĉ" */ + 0x22, 0x9D, 0x18, 0x42, 0x11, 0x70, + + /* U+0109 "ĉ" */ + 0x22, 0x80, 0xC9, 0x42, 0x4C, + + /* U+010A "Ċ" */ + 0x23, 0xA3, 0x08, 0x42, 0x2E, + + /* U+010B "ċ" */ + 0x20, 0x69, 0x89, 0x60, + + /* U+010C "Č" */ + 0x51, 0x1D, 0x18, 0x42, 0x11, 0x70, + + /* U+010D "č" */ + 0x52, 0x06, 0x98, 0x96, + + /* U+010E "Ď" */ + 0x50, 0x87, 0x91, 0x45, 0x14, 0x51, 0x78, + + /* U+010F "ď" */ + 0x14, 0x57, 0x24, 0x92, 0x47, 0x00, + + /* U+0110 "Đ" */ + 0x79, 0x14, 0x7D, 0x45, 0x17, 0x80, + + /* U+0111 "đ" */ + 0x38, 0x9D, 0x29, 0x49, 0xC0, + + /* U+0112 "Ē" */ + 0x3F, 0xE1, 0x0F, 0xC2, 0x1F, + + /* U+0113 "ē" */ + 0x70, 0x69, 0xF8, 0x70, + + /* U+0114 "Ĕ" */ + 0x53, 0xBF, 0x08, 0x7E, 0x10, 0xF8, + + /* U+0115 "ĕ" */ + 0x57, 0x06, 0x9F, 0x87, + + /* U+0116 "Ė" */ + 0x17, 0xE1, 0x0F, 0xC2, 0x1F, + + /* U+0117 "ė" */ + 0x20, 0x69, 0xF8, 0x70, + + /* U+0118 "Ę" */ + 0xFC, 0x21, 0xF8, 0x43, 0xE2, 0x18, + + /* U+0119 "ę" */ + 0x69, 0xF8, 0x72, 0x30, + + /* U+011A "Ě" */ + 0x51, 0x3F, 0x08, 0x7E, 0x10, 0xF8, + + /* U+011B "ě" */ + 0x51, 0x00, 0x64, 0xBD, 0x07, + + /* U+011C "Ĝ" */ + 0x22, 0x9D, 0x18, 0x4E, 0x31, 0x70, + + /* U+011D "ĝ" */ + 0x65, 0x07, 0x99, 0x97, 0x96, + + /* U+011E "Ğ" */ + 0x53, 0x9D, 0x18, 0x4E, 0x31, 0x70, + + /* U+011F "ğ" */ + 0xAE, 0x07, 0x99, 0x97, 0x96, + + /* U+0120 "Ġ" */ + 0x23, 0xA3, 0x09, 0xC6, 0x2E, + + /* U+0121 "ġ" */ + 0x20, 0x79, 0x99, 0x79, 0x60, + + /* U+0122 "Ģ" */ + 0x74, 0x61, 0x38, 0xC5, 0xC4, 0x23, 0x00, + + /* U+0123 "ģ" */ + 0x22, 0x20, 0x79, 0x99, 0x79, 0x60, + + /* U+0124 "Ĥ" */ + 0x22, 0xA3, 0x18, 0xFE, 0x31, 0x88, + + /* U+0125 "ĥ" */ + 0x22, 0x90, 0x87, 0x25, 0x29, 0x48, + + /* U+0126 "Ħ" */ + 0x45, 0xFD, 0x13, 0xE4, 0x48, 0x91, 0x00, + + /* U+0127 "ħ" */ + 0xE8, 0xE9, 0x99, 0x90, + + /* U+0128 "Ĩ" */ + 0xFA, 0x44, 0x44, 0x44, 0x40, + + /* U+0129 "ĩ" */ + 0xFA, 0x04, 0x44, 0x44, + + /* U+012A "Ī" */ + 0xF2, 0x49, 0x24, + + /* U+012B "ī" */ + 0xE1, 0x24, 0x90, + + /* U+012C "Ĭ" */ + 0xB9, 0x24, 0x92, 0x40, + + /* U+012D "ĭ" */ + 0xB8, 0x24, 0x92, + + /* U+012E "Į" */ + 0xAA, 0xAA, 0xC0, + + /* U+012F "į" */ + 0x8A, 0xAA, 0xC0, + + /* U+0130 "İ" */ + 0xFF, + + /* U+0131 "ı" */ + 0xF8, + + /* U+0132 "IJ" */ + 0x86, 0x18, 0x61, 0x86, 0x9B, 0x80, + + /* U+0133 "ij" */ + 0xA2, 0xDB, 0x69, 0x40, + + /* U+0134 "Ĵ" */ + 0x11, 0x44, 0x21, 0x08, 0x52, 0xE0, + + /* U+0135 "ĵ" */ + 0x22, 0x80, 0x42, 0x10, 0x84, 0x22, 0x00, + + /* U+0136 "Ķ" */ + 0x8C, 0xA9, 0x8A, 0x4A, 0x26, 0x11, 0x80, + + /* U+0137 "ķ" */ + 0x88, 0x9A, 0xEA, 0x96, 0x26, + + /* U+0138 "ĸ" */ + 0x95, 0x31, 0x49, 0x00, + + /* U+0139 "Ĺ" */ + 0x24, 0x88, 0x88, 0x88, 0xF0, + + /* U+013A "ĺ" */ + 0x65, 0x55, 0x40, + + /* U+013B "Ļ" */ + 0x88, 0x88, 0x88, 0xF6, 0x26, + + /* U+013C "ļ" */ + 0x92, 0x49, 0x22, 0x28, + + /* U+013D "Ľ" */ + 0xB6, 0x49, 0x38, + + /* U+013E "ľ" */ + 0xB6, 0x49, 0x20, + + /* U+013F "Ŀ" */ + 0x88, 0x8A, 0x88, 0xF0, + + /* U+0140 "ŀ" */ + 0x92, 0x59, 0x20, + + /* U+0141 "Ł" */ + 0x42, 0x1D, 0x84, 0x21, 0xE0, + + /* U+0142 "ł" */ + 0x49, 0xE4, 0x90, + + /* U+0143 "Ń" */ + 0x22, 0x23, 0x9C, 0xD6, 0x73, 0x88, + + /* U+0144 "ń" */ + 0x24, 0x0E, 0x99, 0x99, + + /* U+0145 "Ņ" */ + 0x8E, 0x73, 0x59, 0xCE, 0x26, 0x11, 0x80, + + /* U+0146 "ņ" */ + 0xE9, 0x99, 0x96, 0x26, + + /* U+0147 "Ň" */ + 0x29, 0xA3, 0x9C, 0xD6, 0x73, 0x88, + + /* U+0148 "ň" */ + 0x51, 0x01, 0xC9, 0x4A, 0x52, + + /* U+0149 "ʼn" */ + 0x84, 0x1C, 0x94, 0xA5, 0x20, + + /* U+014A "Ŋ" */ + 0xB6, 0x63, 0x18, 0xC6, 0xC0, + + /* U+014B "ŋ" */ + 0xE9, 0x99, 0x91, 0x30, + + /* U+014C "Ō" */ + 0x73, 0xA3, 0x18, 0xC6, 0x2E, + + /* U+014D "ō" */ + 0x70, 0x69, 0x99, 0x60, + + /* U+014E "Ŏ" */ + 0x53, 0x9D, 0x18, 0xC6, 0x31, 0x70, + + /* U+014F "ŏ" */ + 0x53, 0x06, 0x99, 0x96, + + /* U+0150 "Ő" */ + 0x2A, 0x9D, 0x18, 0xC6, 0x31, 0x70, + + /* U+0151 "ő" */ + 0x5A, 0x06, 0x99, 0x96, + + /* U+0152 "Œ" */ + 0x7F, 0x88, 0x88, 0x8F, 0x88, 0x88, 0x7F, + + /* U+0153 "œ" */ + 0x76, 0x89, 0x8F, 0x88, 0x77, + + /* U+0154 "Ŕ" */ + 0x22, 0x3D, 0x18, 0xFA, 0x51, 0x88, + + /* U+0155 "ŕ" */ + 0x28, 0x79, 0x24, + + /* U+0156 "Ŗ" */ + 0xF4, 0x63, 0xE9, 0x46, 0x26, 0x11, 0x80, + + /* U+0157 "ŗ" */ + 0xF2, 0x49, 0x96, + + /* U+0158 "Ř" */ + 0x50, 0x87, 0x91, 0x45, 0xE4, 0x91, 0x44, + + /* U+0159 "ř" */ + 0x51, 0x00, 0xE4, 0x21, 0x08, + + /* U+015A "Ś" */ + 0x24, 0x69, 0x86, 0x19, 0x60, + + /* U+015B "ś" */ + 0x24, 0x07, 0x86, 0x1E, + + /* U+015C "Ŝ" */ + 0x6D, 0x69, 0x86, 0x19, 0x60, + + /* U+015D "ŝ" */ + 0x65, 0x07, 0x86, 0x1E, + + /* U+015E "Ş" */ + 0x69, 0x86, 0x19, 0x64, 0x4C, + + /* U+015F "ş" */ + 0x78, 0x61, 0xE4, 0x4C, + + /* U+0160 "Š" */ + 0x51, 0x0C, 0x94, 0x18, 0x29, 0x30, + + /* U+0161 "š" */ + 0x51, 0x00, 0x74, 0x18, 0x2E, + + /* U+0162 "Ţ" */ + 0xF9, 0x08, 0x42, 0x10, 0x80, 0x21, 0x00, + + /* U+0163 "ţ" */ + 0x0B, 0xA4, 0x98, 0x24, + + /* U+0164 "Ť" */ + 0x51, 0x3E, 0x42, 0x10, 0x84, 0x20, + + /* U+0165 "ť" */ + 0x15, 0xE4, 0x44, 0x60, + + /* U+0166 "Ŧ" */ + 0xF9, 0x08, 0xE2, 0x10, 0x80, + + /* U+0167 "ŧ" */ + 0x5D, 0x74, 0xC0, + + /* U+0168 "Ũ" */ + 0x2A, 0xA3, 0x18, 0xC6, 0x31, 0x70, + + /* U+0169 "ũ" */ + 0x5A, 0x09, 0x99, 0x97, + + /* U+016A "Ū" */ + 0x74, 0x63, 0x18, 0xC6, 0x2E, + + /* U+016B "ū" */ + 0x70, 0x99, 0x99, 0x70, + + /* U+016C "Ŭ" */ + 0x53, 0x23, 0x18, 0xC6, 0x31, 0x70, + + /* U+016D "ŭ" */ + 0x57, 0x09, 0x99, 0x97, + + /* U+016E "Ů" */ + 0x72, 0x9D, 0x18, 0xC6, 0x31, 0x8B, 0x80, + + /* U+016F "ů" */ + 0x75, 0x70, 0x99, 0x99, 0x70, + + /* U+0170 "Ű" */ + 0x2A, 0xA3, 0x18, 0xC6, 0x31, 0x70, + + /* U+0171 "ű" */ + 0x5A, 0x09, 0x99, 0x97, + + /* U+0172 "Ų" */ + 0x8C, 0x63, 0x18, 0xC5, 0xC4, 0x30, + + /* U+0173 "ų" */ + 0x94, 0xA5, 0x27, 0x08, 0x60, + + /* U+0174 "Ŵ" */ + 0x08, 0x0A, 0x22, 0x32, 0x95, 0x52, 0xA9, 0x54, 0xAA, 0x22, 0x00, + + /* U+0175 "ŵ" */ + 0x22, 0x81, 0x5A, 0xD6, 0xAA, + + /* U+0176 "Ŷ" */ + 0x21, 0x44, 0x4A, 0x28, 0x41, 0x04, 0x10, + + /* U+0177 "ŷ" */ + 0x22, 0x81, 0x15, 0x29, 0x44, 0x22, 0x00, + + /* U+0178 "Ÿ" */ + 0x54, 0x54, 0xA2, 0x10, 0x84, + + /* U+0179 "Ź" */ + 0x10, 0x8F, 0xC2, 0x10, 0x84, 0x20, 0xFC, + + /* U+017A "ź" */ + 0x50, 0x72, 0xA7, + + /* U+017B "Ż" */ + 0x13, 0xF0, 0x84, 0x21, 0x08, 0x3F, + + /* U+017C "ż" */ + 0x43, 0x95, 0x38, + + /* U+017D "Ž" */ + 0x28, 0x6F, 0xC2, 0x10, 0x84, 0x20, 0xFC, + + /* U+017E "ž" */ + 0x56, 0x0E, 0x24, 0x8E, + + /* U+017F "ſ" */ + 0xEA, 0xA8, + + /* U+018F "Ə" */ + 0x74, 0x43, 0xF8, 0xC5, 0xC0, + + /* U+0192 "ƒ" */ + 0x19, 0x1C, 0x42, 0x21, 0x08, 0xC0, + + /* U+01A0 "Ơ" */ + 0x76, 0x38, 0xA2, 0x8A, 0x27, 0x00, + + /* U+01A1 "ơ" */ + 0x6C, 0xE5, 0x26, 0x00, + + /* U+01AF "Ư" */ + 0x8B, 0x16, 0x34, 0x48, 0x91, 0x1C, 0x00, + + /* U+01B0 "ư" */ + 0x96, 0x59, 0xA4, 0x70, + + /* U+01CD "Ǎ" */ + 0x38, 0x30, 0x41, 0x42, 0x88, 0x9F, 0x22, 0x82, + + /* U+01CE "ǎ" */ + 0x51, 0x01, 0xE1, 0x3A, 0x5E, + + /* U+01CF "Ǐ" */ + 0x56, 0x44, 0x44, 0x44, 0x40, + + /* U+01D0 "ǐ" */ + 0xD6, 0x04, 0x44, 0x44, + + /* U+01D1 "Ǒ" */ + 0x51, 0x1D, 0x18, 0xC6, 0x31, 0x70, + + /* U+01D2 "ǒ" */ + 0x52, 0x06, 0x99, 0x96, + + /* U+01D3 "Ǔ" */ + 0x53, 0x23, 0x18, 0xC6, 0x31, 0x70, + + /* U+01D4 "ǔ" */ + 0x52, 0x09, 0x99, 0x97, + + /* U+01D5 "Ǖ" */ + 0x72, 0xA3, 0x18, 0xC6, 0x31, 0x70, + + /* U+01D6 "ǖ" */ + 0x70, 0x50, 0x99, 0x99, 0x70, + + /* U+01D7 "Ǘ" */ + 0x12, 0xA3, 0x18, 0xC6, 0x31, 0x70, + + /* U+01D8 "ǘ" */ + 0x12, 0x50, 0x99, 0x99, 0x70, + + /* U+01D9 "Ǚ" */ + 0x31, 0xB7, 0x18, 0xC6, 0x31, 0x70, + + /* U+01DA "ǚ" */ + 0x52, 0x50, 0x99, 0x99, 0x70, + + /* U+01DB "Ǜ" */ + 0x22, 0xA3, 0x18, 0xC6, 0x31, 0x70, + + /* U+01DC "ǜ" */ + 0x42, 0x50, 0x99, 0x99, 0x70, + + /* U+01FA "Ǻ" */ + 0x08, 0x20, 0x01, 0xC2, 0x87, 0x0A, 0x14, 0x44, 0xF9, 0x14, 0x10, + + /* U+01FB "ǻ" */ + 0x12, 0x07, 0x57, 0x0F, 0x17, 0x9F, + + /* U+01FC "Ǽ" */ + 0x04, 0x02, 0x00, 0xFC, 0x50, 0x14, 0x09, 0xF3, 0xC1, 0x10, 0x47, 0xC0, + + /* U+01FD "ǽ" */ + 0x08, 0x20, 0x07, 0x61, 0x2F, 0xE4, 0x77, + + /* U+01FE "Ǿ" */ + 0x11, 0x1F, 0x29, 0xD7, 0x29, 0xF0, + + /* U+01FF "ǿ" */ + 0x12, 0x07, 0xBD, 0xDE, +}; + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 48, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 0} /* U+0020 */, + {.bitmap_index = 1, .adv_w = 48, .box_w = 1, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0021 */, + {.bitmap_index = 2, .adv_w = 48, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 5} /* U+0022 */, + {.bitmap_index = 3, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0023 */, + {.bitmap_index = 7, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -1} /* U+0024 */, + {.bitmap_index = 12, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0025 */, + {.bitmap_index = 18, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0026 */, + {.bitmap_index = 24, .adv_w = 32, .box_w = 1, .box_h = 2, .ofs_x = 0, .ofs_y = 5} /* U+0027 */, + {.bitmap_index = 25, .adv_w = 48, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+0028 */, + {.bitmap_index = 29, .adv_w = 48, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+0029 */, + {.bitmap_index = 33, .adv_w = 64, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 4} /* U+002A */, + {.bitmap_index = 35, .adv_w = 80, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+002B */, + {.bitmap_index = 39, .adv_w = 48, .box_w = 1, .box_h = 2, .ofs_x = 1, .ofs_y = -1} /* U+002C */, + {.bitmap_index = 40, .adv_w = 48, .box_w = 2, .box_h = 1, .ofs_x = 0, .ofs_y = 2} /* U+002D */, + {.bitmap_index = 41, .adv_w = 48, .box_w = 1, .box_h = 1, .ofs_x = 1, .ofs_y = 0} /* U+002E */, + {.bitmap_index = 42, .adv_w = 48, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+002F */, + {.bitmap_index = 45, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0030 */, + {.bitmap_index = 49, .adv_w = 80, .box_w = 2, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0031 */, + {.bitmap_index = 51, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0032 */, + {.bitmap_index = 55, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0033 */, + {.bitmap_index = 59, .adv_w = 80, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0034 */, + {.bitmap_index = 64, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0035 */, + {.bitmap_index = 68, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0036 */, + {.bitmap_index = 72, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0037 */, + {.bitmap_index = 76, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0038 */, + {.bitmap_index = 80, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0039 */, + {.bitmap_index = 84, .adv_w = 48, .box_w = 1, .box_h = 5, .ofs_x = 1, .ofs_y = 0} /* U+003A */, + {.bitmap_index = 85, .adv_w = 48, .box_w = 1, .box_h = 6, .ofs_x = 1, .ofs_y = -1} /* U+003B */, + {.bitmap_index = 86, .adv_w = 80, .box_w = 3, .box_h = 5, .ofs_x = 1, .ofs_y = 1} /* U+003C */, + {.bitmap_index = 88, .adv_w = 80, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 2} /* U+003D */, + {.bitmap_index = 90, .adv_w = 80, .box_w = 3, .box_h = 5, .ofs_x = 1, .ofs_y = 1} /* U+003E */, + {.bitmap_index = 92, .adv_w = 80, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+003F */, + {.bitmap_index = 97, .adv_w = 144, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = -2} /* U+0040 */, + {.bitmap_index = 106, .adv_w = 96, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0041 */, + {.bitmap_index = 113, .adv_w = 96, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0042 */, + {.bitmap_index = 117, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0043 */, + {.bitmap_index = 122, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0044 */, + {.bitmap_index = 127, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0045 */, + {.bitmap_index = 132, .adv_w = 96, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0046 */, + {.bitmap_index = 136, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0047 */, + {.bitmap_index = 141, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0048 */, + {.bitmap_index = 146, .adv_w = 48, .box_w = 1, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0049 */, + {.bitmap_index = 147, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+004A */, + {.bitmap_index = 151, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+004B */, + {.bitmap_index = 156, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+004C */, + {.bitmap_index = 160, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+004D */, + {.bitmap_index = 167, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+004E */, + {.bitmap_index = 172, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+004F */, + {.bitmap_index = 177, .adv_w = 96, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0050 */, + {.bitmap_index = 181, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0051 */, + {.bitmap_index = 186, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0052 */, + {.bitmap_index = 191, .adv_w = 96, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0053 */, + {.bitmap_index = 195, .adv_w = 80, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0054 */, + {.bitmap_index = 200, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0055 */, + {.bitmap_index = 205, .adv_w = 96, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0056 */, + {.bitmap_index = 212, .adv_w = 144, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0057 */, + {.bitmap_index = 220, .adv_w = 80, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0058 */, + {.bitmap_index = 225, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0059 */, + {.bitmap_index = 230, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+005A */, + {.bitmap_index = 236, .adv_w = 48, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = -2} /* U+005B */, + {.bitmap_index = 239, .adv_w = 48, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+005C */, + {.bitmap_index = 242, .adv_w = 48, .box_w = 2, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+005D */, + {.bitmap_index = 245, .adv_w = 48, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 4} /* U+005E */, + {.bitmap_index = 247, .adv_w = 80, .box_w = 5, .box_h = 1, .ofs_x = 0, .ofs_y = -2} /* U+005F */, + {.bitmap_index = 248, .adv_w = 48, .box_w = 2, .box_h = 2, .ofs_x = 0, .ofs_y = 5} /* U+0060 */, + {.bitmap_index = 249, .adv_w = 80, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0061 */, + {.bitmap_index = 252, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0062 */, + {.bitmap_index = 256, .adv_w = 80, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0063 */, + {.bitmap_index = 259, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0064 */, + {.bitmap_index = 263, .adv_w = 80, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0065 */, + {.bitmap_index = 266, .adv_w = 64, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0066 */, + {.bitmap_index = 269, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = -2} /* U+0067 */, + {.bitmap_index = 273, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0068 */, + {.bitmap_index = 277, .adv_w = 32, .box_w = 1, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0069 */, + {.bitmap_index = 278, .adv_w = 32, .box_w = 2, .box_h = 9, .ofs_x = -1, .ofs_y = -2} /* U+006A */, + {.bitmap_index = 281, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+006B */, + {.bitmap_index = 285, .adv_w = 32, .box_w = 1, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+006C */, + {.bitmap_index = 286, .adv_w = 128, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+006D */, + {.bitmap_index = 291, .adv_w = 80, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+006E */, + {.bitmap_index = 294, .adv_w = 80, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+006F */, + {.bitmap_index = 297, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = -2} /* U+0070 */, + {.bitmap_index = 301, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = -2} /* U+0071 */, + {.bitmap_index = 305, .adv_w = 48, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0072 */, + {.bitmap_index = 307, .adv_w = 80, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0073 */, + {.bitmap_index = 310, .adv_w = 48, .box_w = 3, .box_h = 7, .ofs_x = -1, .ofs_y = 0} /* U+0074 */, + {.bitmap_index = 313, .adv_w = 80, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0075 */, + {.bitmap_index = 316, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0076 */, + {.bitmap_index = 320, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0077 */, + {.bitmap_index = 324, .adv_w = 80, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0078 */, + {.bitmap_index = 327, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = -2} /* U+0079 */, + {.bitmap_index = 332, .adv_w = 64, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+007A */, + {.bitmap_index = 334, .adv_w = 48, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+007B */, + {.bitmap_index = 338, .adv_w = 48, .box_w = 1, .box_h = 8, .ofs_x = 1, .ofs_y = -1} /* U+007C */, + {.bitmap_index = 339, .adv_w = 48, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+007D */, + {.bitmap_index = 343, .adv_w = 80, .box_w = 4, .box_h = 2, .ofs_x = 0, .ofs_y = 2} /* U+007E */, + {.bitmap_index = 344, .adv_w = 48, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 0} /* U+00A0 */, + {.bitmap_index = 345, .adv_w = 48, .box_w = 1, .box_h = 7, .ofs_x = 1, .ofs_y = -2} /* U+00A1 */, + {.bitmap_index = 346, .adv_w = 80, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+00A2 */, + {.bitmap_index = 351, .adv_w = 80, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+00A3 */, + {.bitmap_index = 356, .adv_w = 80, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 1} /* U+00A4 */, + {.bitmap_index = 358, .adv_w = 80, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+00A5 */, + {.bitmap_index = 363, .adv_w = 48, .box_w = 1, .box_h = 8, .ofs_x = 1, .ofs_y = -1} /* U+00A6 */, + {.bitmap_index = 364, .adv_w = 80, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+00A7 */, + {.bitmap_index = 369, .adv_w = 48, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 6} /* U+00A8 */, + {.bitmap_index = 370, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+00A9 */, + {.bitmap_index = 377, .adv_w = 48, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 4} /* U+00AA */, + {.bitmap_index = 379, .adv_w = 80, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0} /* U+00AB */, + {.bitmap_index = 382, .adv_w = 80, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 2} /* U+00AC */, + {.bitmap_index = 384, .adv_w = 48, .box_w = 2, .box_h = 1, .ofs_x = 0, .ofs_y = 2} /* U+00AD */, + {.bitmap_index = 385, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+00AE */, + {.bitmap_index = 392, .adv_w = 80, .box_w = 5, .box_h = 1, .ofs_x = 0, .ofs_y = 7} /* U+00AF */, + {.bitmap_index = 393, .adv_w = 64, .box_w = 3, .box_h = 3, .ofs_x = 1, .ofs_y = 4} /* U+00B0 */, + {.bitmap_index = 395, .adv_w = 80, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+00B1 */, + {.bitmap_index = 399, .adv_w = 48, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 4} /* U+00B2 */, + {.bitmap_index = 401, .adv_w = 48, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 4} /* U+00B3 */, + {.bitmap_index = 403, .adv_w = 48, .box_w = 2, .box_h = 2, .ofs_x = 1, .ofs_y = 5} /* U+00B4 */, + {.bitmap_index = 404, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = -2} /* U+00B5 */, + {.bitmap_index = 408, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -1} /* U+00B6 */, + {.bitmap_index = 413, .adv_w = 48, .box_w = 1, .box_h = 1, .ofs_x = 1, .ofs_y = 3} /* U+00B7 */, + {.bitmap_index = 414, .adv_w = 48, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = -3} /* U+00B8 */, + {.bitmap_index = 415, .adv_w = 48, .box_w = 2, .box_h = 3, .ofs_x = 1, .ofs_y = 4} /* U+00B9 */, + {.bitmap_index = 416, .adv_w = 48, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 4} /* U+00BA */, + {.bitmap_index = 418, .adv_w = 80, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0} /* U+00BB */, + {.bitmap_index = 421, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+00BC */, + {.bitmap_index = 427, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+00BD */, + {.bitmap_index = 434, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+00BE */, + {.bitmap_index = 441, .adv_w = 96, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = -2} /* U+00BF */, + {.bitmap_index = 445, .adv_w = 96, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00C0 */, + {.bitmap_index = 453, .adv_w = 96, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00C1 */, + {.bitmap_index = 461, .adv_w = 96, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00C2 */, + {.bitmap_index = 469, .adv_w = 96, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00C3 */, + {.bitmap_index = 477, .adv_w = 96, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00C4 */, + {.bitmap_index = 484, .adv_w = 96, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00C5 */, + {.bitmap_index = 492, .adv_w = 144, .box_w = 10, .box_h = 7, .ofs_x = -1, .ofs_y = 0} /* U+00C6 */, + {.bitmap_index = 501, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = -3} /* U+00C7 */, + {.bitmap_index = 508, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00C8 */, + {.bitmap_index = 514, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00C9 */, + {.bitmap_index = 520, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00CA */, + {.bitmap_index = 526, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+00CB */, + {.bitmap_index = 531, .adv_w = 48, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00CC */, + {.bitmap_index = 534, .adv_w = 48, .box_w = 2, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00CD */, + {.bitmap_index = 537, .adv_w = 48, .box_w = 5, .box_h = 9, .ofs_x = -2, .ofs_y = 0} /* U+00CE */, + {.bitmap_index = 543, .adv_w = 48, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00CF */, + {.bitmap_index = 546, .adv_w = 112, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+00D0 */, + {.bitmap_index = 552, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00D1 */, + {.bitmap_index = 558, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00D2 */, + {.bitmap_index = 564, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00D3 */, + {.bitmap_index = 570, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00D4 */, + {.bitmap_index = 576, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00D5 */, + {.bitmap_index = 582, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+00D6 */, + {.bitmap_index = 587, .adv_w = 80, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 1} /* U+00D7 */, + {.bitmap_index = 591, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+00D8 */, + {.bitmap_index = 596, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00D9 */, + {.bitmap_index = 602, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00DA */, + {.bitmap_index = 608, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00DB */, + {.bitmap_index = 614, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+00DC */, + {.bitmap_index = 619, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+00DD */, + {.bitmap_index = 625, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+00DE */, + {.bitmap_index = 630, .adv_w = 96, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+00DF */, + {.bitmap_index = 634, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00E0 */, + {.bitmap_index = 638, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00E1 */, + {.bitmap_index = 642, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00E2 */, + {.bitmap_index = 646, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00E3 */, + {.bitmap_index = 650, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+00E4 */, + {.bitmap_index = 654, .adv_w = 80, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+00E5 */, + {.bitmap_index = 659, .adv_w = 128, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+00E6 */, + {.bitmap_index = 664, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = -3} /* U+00E7 */, + {.bitmap_index = 668, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00E8 */, + {.bitmap_index = 672, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00E9 */, + {.bitmap_index = 676, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00EA */, + {.bitmap_index = 680, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+00EB */, + {.bitmap_index = 684, .adv_w = 32, .box_w = 2, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00EC */, + {.bitmap_index = 686, .adv_w = 32, .box_w = 2, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+00ED */, + {.bitmap_index = 688, .adv_w = 32, .box_w = 4, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+00EE */, + {.bitmap_index = 692, .adv_w = 32, .box_w = 3, .box_h = 7, .ofs_x = -1, .ofs_y = 0} /* U+00EF */, + {.bitmap_index = 695, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+00F0 */, + {.bitmap_index = 699, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00F1 */, + {.bitmap_index = 703, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00F2 */, + {.bitmap_index = 707, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00F3 */, + {.bitmap_index = 711, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00F4 */, + {.bitmap_index = 715, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00F5 */, + {.bitmap_index = 719, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+00F6 */, + {.bitmap_index = 723, .adv_w = 80, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+00F7 */, + {.bitmap_index = 727, .adv_w = 80, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+00F8 */, + {.bitmap_index = 730, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00F9 */, + {.bitmap_index = 734, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+00FA */, + {.bitmap_index = 738, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+00FB */, + {.bitmap_index = 743, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+00FC */, + {.bitmap_index = 747, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+00FD */, + {.bitmap_index = 754, .adv_w = 80, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+00FE */, + {.bitmap_index = 759, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+00FF */, + {.bitmap_index = 765, .adv_w = 96, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0100 */, + {.bitmap_index = 772, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0101 */, + {.bitmap_index = 776, .adv_w = 96, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0102 */, + {.bitmap_index = 784, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0103 */, + {.bitmap_index = 788, .adv_w = 96, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+0104 */, + {.bitmap_index = 797, .adv_w = 80, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = -2} /* U+0105 */, + {.bitmap_index = 802, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0106 */, + {.bitmap_index = 808, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0107 */, + {.bitmap_index = 812, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0108 */, + {.bitmap_index = 818, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0109 */, + {.bitmap_index = 823, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+010A */, + {.bitmap_index = 828, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+010B */, + {.bitmap_index = 832, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+010C */, + {.bitmap_index = 838, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+010D */, + {.bitmap_index = 842, .adv_w = 112, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+010E */, + {.bitmap_index = 849, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+010F */, + {.bitmap_index = 855, .adv_w = 112, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0110 */, + {.bitmap_index = 861, .adv_w = 80, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0111 */, + {.bitmap_index = 866, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+0112 */, + {.bitmap_index = 871, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0113 */, + {.bitmap_index = 875, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0114 */, + {.bitmap_index = 881, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0115 */, + {.bitmap_index = 885, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+0116 */, + {.bitmap_index = 890, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0117 */, + {.bitmap_index = 894, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -2} /* U+0118 */, + {.bitmap_index = 900, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = -2} /* U+0119 */, + {.bitmap_index = 904, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+011A */, + {.bitmap_index = 910, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+011B */, + {.bitmap_index = 915, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+011C */, + {.bitmap_index = 921, .adv_w = 80, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+011D */, + {.bitmap_index = 926, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+011E */, + {.bitmap_index = 932, .adv_w = 80, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+011F */, + {.bitmap_index = 937, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+0120 */, + {.bitmap_index = 942, .adv_w = 80, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+0121 */, + {.bitmap_index = 947, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = -3} /* U+0122 */, + {.bitmap_index = 954, .adv_w = 80, .box_w = 4, .box_h = 11, .ofs_x = 0, .ofs_y = -2} /* U+0123 */, + {.bitmap_index = 960, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0124 */, + {.bitmap_index = 966, .adv_w = 80, .box_w = 5, .box_h = 9, .ofs_x = -1, .ofs_y = 0} /* U+0125 */, + {.bitmap_index = 972, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0126 */, + {.bitmap_index = 979, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0127 */, + {.bitmap_index = 983, .adv_w = 48, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0128 */, + {.bitmap_index = 988, .adv_w = 32, .box_w = 4, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+0129 */, + {.bitmap_index = 992, .adv_w = 48, .box_w = 3, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+012A */, + {.bitmap_index = 995, .adv_w = 32, .box_w = 3, .box_h = 7, .ofs_x = -1, .ofs_y = 0} /* U+012B */, + {.bitmap_index = 998, .adv_w = 48, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+012C */, + {.bitmap_index = 1002, .adv_w = 32, .box_w = 3, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+012D */, + {.bitmap_index = 1005, .adv_w = 48, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = -2} /* U+012E */, + {.bitmap_index = 1008, .adv_w = 32, .box_w = 2, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+012F */, + {.bitmap_index = 1011, .adv_w = 48, .box_w = 1, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+0130 */, + {.bitmap_index = 1012, .adv_w = 32, .box_w = 1, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0131 */, + {.bitmap_index = 1013, .adv_w = 112, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0132 */, + {.bitmap_index = 1019, .adv_w = 64, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+0133 */, + {.bitmap_index = 1023, .adv_w = 80, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0134 */, + {.bitmap_index = 1029, .adv_w = 32, .box_w = 5, .box_h = 10, .ofs_x = -2, .ofs_y = -2} /* U+0135 */, + {.bitmap_index = 1036, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = -3} /* U+0136 */, + {.bitmap_index = 1043, .adv_w = 80, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = -3} /* U+0137 */, + {.bitmap_index = 1048, .adv_w = 80, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0138 */, + {.bitmap_index = 1052, .adv_w = 80, .box_w = 4, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0139 */, + {.bitmap_index = 1057, .adv_w = 32, .box_w = 2, .box_h = 9, .ofs_x = -1, .ofs_y = 0} /* U+013A */, + {.bitmap_index = 1060, .adv_w = 80, .box_w = 4, .box_h = 10, .ofs_x = 1, .ofs_y = -3} /* U+013B */, + {.bitmap_index = 1065, .adv_w = 32, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = -3} /* U+013C */, + {.bitmap_index = 1069, .adv_w = 80, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+013D */, + {.bitmap_index = 1072, .adv_w = 48, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+013E */, + {.bitmap_index = 1075, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+013F */, + {.bitmap_index = 1079, .adv_w = 48, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0140 */, + {.bitmap_index = 1082, .adv_w = 80, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0141 */, + {.bitmap_index = 1087, .adv_w = 32, .box_w = 3, .box_h = 7, .ofs_x = -1, .ofs_y = 0} /* U+0142 */, + {.bitmap_index = 1090, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0143 */, + {.bitmap_index = 1096, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0144 */, + {.bitmap_index = 1100, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = -3} /* U+0145 */, + {.bitmap_index = 1107, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = -3} /* U+0146 */, + {.bitmap_index = 1111, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0147 */, + {.bitmap_index = 1117, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0148 */, + {.bitmap_index = 1122, .adv_w = 80, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0149 */, + {.bitmap_index = 1127, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+014A */, + {.bitmap_index = 1132, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = -2} /* U+014B */, + {.bitmap_index = 1136, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+014C */, + {.bitmap_index = 1141, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+014D */, + {.bitmap_index = 1145, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+014E */, + {.bitmap_index = 1151, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+014F */, + {.bitmap_index = 1155, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0150 */, + {.bitmap_index = 1161, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0151 */, + {.bitmap_index = 1165, .adv_w = 144, .box_w = 8, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0152 */, + {.bitmap_index = 1172, .adv_w = 144, .box_w = 8, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0153 */, + {.bitmap_index = 1177, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0154 */, + {.bitmap_index = 1183, .adv_w = 48, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0155 */, + {.bitmap_index = 1186, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = -3} /* U+0156 */, + {.bitmap_index = 1193, .adv_w = 48, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = -3} /* U+0157 */, + {.bitmap_index = 1196, .adv_w = 112, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0158 */, + {.bitmap_index = 1203, .adv_w = 48, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+0159 */, + {.bitmap_index = 1208, .adv_w = 96, .box_w = 4, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+015A */, + {.bitmap_index = 1213, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+015B */, + {.bitmap_index = 1217, .adv_w = 96, .box_w = 4, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+015C */, + {.bitmap_index = 1222, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+015D */, + {.bitmap_index = 1226, .adv_w = 96, .box_w = 4, .box_h = 10, .ofs_x = 1, .ofs_y = -3} /* U+015E */, + {.bitmap_index = 1231, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = -3} /* U+015F */, + {.bitmap_index = 1235, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0160 */, + {.bitmap_index = 1241, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+0161 */, + {.bitmap_index = 1246, .adv_w = 80, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -3} /* U+0162 */, + {.bitmap_index = 1253, .adv_w = 32, .box_w = 3, .box_h = 10, .ofs_x = -1, .ofs_y = -3} /* U+0163 */, + {.bitmap_index = 1257, .adv_w = 80, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0164 */, + {.bitmap_index = 1263, .adv_w = 48, .box_w = 4, .box_h = 7, .ofs_x = -1, .ofs_y = 0} /* U+0165 */, + {.bitmap_index = 1267, .adv_w = 80, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0166 */, + {.bitmap_index = 1272, .adv_w = 48, .box_w = 3, .box_h = 6, .ofs_x = -1, .ofs_y = 0} /* U+0167 */, + {.bitmap_index = 1275, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0168 */, + {.bitmap_index = 1281, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0169 */, + {.bitmap_index = 1285, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+016A */, + {.bitmap_index = 1290, .adv_w = 80, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+016B */, + {.bitmap_index = 1294, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+016C */, + {.bitmap_index = 1300, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+016D */, + {.bitmap_index = 1304, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+016E */, + {.bitmap_index = 1311, .adv_w = 80, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+016F */, + {.bitmap_index = 1316, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+0170 */, + {.bitmap_index = 1322, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0171 */, + {.bitmap_index = 1326, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -2} /* U+0172 */, + {.bitmap_index = 1332, .adv_w = 80, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = -2} /* U+0173 */, + {.bitmap_index = 1337, .adv_w = 144, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0174 */, + {.bitmap_index = 1348, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+0175 */, + {.bitmap_index = 1353, .adv_w = 112, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0176 */, + {.bitmap_index = 1360, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+0177 */, + {.bitmap_index = 1367, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+0178 */, + {.bitmap_index = 1372, .adv_w = 96, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+0179 */, + {.bitmap_index = 1379, .adv_w = 64, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+017A */, + {.bitmap_index = 1382, .adv_w = 96, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+017B */, + {.bitmap_index = 1388, .adv_w = 64, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+017C */, + {.bitmap_index = 1391, .adv_w = 96, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+017D */, + {.bitmap_index = 1398, .adv_w = 64, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+017E */, + {.bitmap_index = 1402, .adv_w = 32, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+017F */, + {.bitmap_index = 1404, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+018F */, + {.bitmap_index = 1409, .adv_w = 80, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+0192 */, + {.bitmap_index = 1415, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+01A0 */, + {.bitmap_index = 1421, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+01A1 */, + {.bitmap_index = 1425, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+01AF */, + {.bitmap_index = 1432, .adv_w = 96, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+01B0 */, + {.bitmap_index = 1436, .adv_w = 96, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01CD */, + {.bitmap_index = 1444, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+01CE */, + {.bitmap_index = 1449, .adv_w = 48, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01CF */, + {.bitmap_index = 1454, .adv_w = 32, .box_w = 4, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+01D0 */, + {.bitmap_index = 1458, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01D1 */, + {.bitmap_index = 1464, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+01D2 */, + {.bitmap_index = 1468, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01D3 */, + {.bitmap_index = 1474, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+01D4 */, + {.bitmap_index = 1478, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01D5 */, + {.bitmap_index = 1484, .adv_w = 80, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01D6 */, + {.bitmap_index = 1489, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01D7 */, + {.bitmap_index = 1495, .adv_w = 80, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01D8 */, + {.bitmap_index = 1500, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01D9 */, + {.bitmap_index = 1506, .adv_w = 80, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01DA */, + {.bitmap_index = 1511, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01DB */, + {.bitmap_index = 1517, .adv_w = 80, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01DC */, + {.bitmap_index = 1522, .adv_w = 96, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+01FA */, + {.bitmap_index = 1533, .adv_w = 80, .box_w = 4, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+01FB */, + {.bitmap_index = 1539, .adv_w = 144, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0} /* U+01FC */, + {.bitmap_index = 1551, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+01FD */, + {.bitmap_index = 1558, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01FE */, + {.bitmap_index = 1564, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+01FF */ +}; + +static const lv_font_fmt_txt_cmap_t cmaps[] = { + {.range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 160, .range_length = 224, .glyph_id_start = 96, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 399, .range_length = 1, .glyph_id_start = 320, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 402, .range_length = 1, .glyph_id_start = 321, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 416, .range_length = 2, .glyph_id_start = 322, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 431, .range_length = 2, .glyph_id_start = 324, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 461, .range_length = 16, .glyph_id_start = 326, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, + {.range_start = 506, .range_length = 6, .glyph_id_start = 342, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY} +}; + +static const lv_font_fmt_txt_dsc_t font_dsc = { + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 8, + .bpp = 1, + .kern_classes = 0, + .bitmap_format = 0, + .stride = 0, +}; + +const lv_font_t arial_9 = { + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, + .line_height = 15, + .base_line = 2, + .subpx = LV_FONT_SUBPX_NONE, + .underline_position = -1, + .underline_thickness = 0, + .static_bitmap = 0, + .dsc = &font_dsc, + .fallback = NULL, + .user_data = NULL, +}; + +#endif /* ARIAL_9 */ diff --git a/src/ui/fonts/arial_9.h b/src/ui/fonts/arial_9.h new file mode 100644 index 0000000000..569c3bb4be --- /dev/null +++ b/src/ui/fonts/arial_9.h @@ -0,0 +1,8 @@ +#ifndef _ARIAL_9_H_ +#define _ARIAL_9_H_ + +typedef struct _lv_font_t lv_font_t; + +extern const lv_font_t arial_9; + +#endif diff --git a/src/ui/fonts/arial_9_ugui.c b/src/ui/fonts/arial_9_ugui.c new file mode 100644 index 0000000000..6b598ace20 --- /dev/null +++ b/src/ui/fonts/arial_9_ugui.c @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include "arial_9.h" +#include "arial_9_ugui.h" + +#include + +const UG_FONT font_arial_9 = {&arial_9, FONT_TYPE_LVGL, 9, 9, 0, UINT16_MAX, NULL}; diff --git a/src/ui/fonts/arial_9_ugui.h b/src/ui/fonts/arial_9_ugui.h new file mode 100644 index 0000000000..45c8b45084 --- /dev/null +++ b/src/ui/fonts/arial_9_ugui.h @@ -0,0 +1,8 @@ +#ifndef _ARIAL_9_UGUI_H_ +#define _ARIAL_9_UGUI_H_ + +#include + +extern const UG_FONT font_arial_9; + +#endif diff --git a/src/ui/fonts/lvgl.h b/src/ui/fonts/lvgl.h new file mode 100644 index 0000000000..db291994de --- /dev/null +++ b/src/ui/fonts/lvgl.h @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: Apache-2.0 + +#ifndef _UI_FONTS_LVGL_H_ +#define _UI_FONTS_LVGL_H_ + +#include +#include +#include + +#ifndef LV_VERSION_CHECK +#define LV_VERSION_CHECK(x, y, z) \ + (x == LVGL_VERSION_MAJOR && (y < LVGL_VERSION_MINOR || (y == LVGL_VERSION_MINOR && z <= LVGL_VERSION_PATCH))) +#endif + +#endif diff --git a/src/ui/fonts/lvgl_font_compat.c b/src/ui/fonts/lvgl_font_compat.c new file mode 100644 index 0000000000..c3d1931f81 --- /dev/null +++ b/src/ui/fonts/lvgl_font_compat.c @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include +#include + +#include +#include + +static uint32_t _get_glyph_dsc_id(const lv_font_t* font, uint32_t letter) +{ + if (letter == '\0') { + return 0; + } + + const lv_font_fmt_txt_dsc_t* font_dsc = (const lv_font_fmt_txt_dsc_t*)font->dsc; + for (uint16_t i = 0; i < font_dsc->cmap_num; i++) { + const lv_font_fmt_txt_cmap_t* cmap = &font_dsc->cmaps[i]; + uint32_t relative_codepoint = letter - cmap->range_start; + if (relative_codepoint >= cmap->range_length) { + continue; + } + + switch (cmap->type) { + case LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY: + return cmap->glyph_id_start + relative_codepoint; + case LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL: { + const uint8_t* glyph_id_offsets = (const uint8_t*)cmap->glyph_id_ofs_list; + if (glyph_id_offsets[relative_codepoint] == 0 && relative_codepoint != 0) { + return 0; + } + return cmap->glyph_id_start + glyph_id_offsets[relative_codepoint]; + } + case LV_FONT_FMT_TXT_CMAP_SPARSE_TINY: + for (uint16_t j = 0; j < cmap->list_length; j++) { + if (cmap->unicode_list[j] == relative_codepoint) { + return cmap->glyph_id_start + j; + } + } + return 0; + case LV_FONT_FMT_TXT_CMAP_SPARSE_FULL: + for (uint16_t j = 0; j < cmap->list_length; j++) { + if (cmap->unicode_list[j] == relative_codepoint) { + const uint16_t* glyph_id_offsets = (const uint16_t*)cmap->glyph_id_ofs_list; + return cmap->glyph_id_start + glyph_id_offsets[j]; + } + } + return 0; + default: + return 0; + } + } + return 0; +} + +__attribute__((weak)) bool lv_font_get_glyph_dsc( + const lv_font_t* font, + lv_font_glyph_dsc_t* dsc_out, + uint32_t letter, + uint32_t letter_next) +{ + if (font == NULL || dsc_out == NULL) { + return false; + } + + memset(dsc_out, 0, sizeof(*dsc_out)); + for (const lv_font_t* f = font; f != NULL; f = f->fallback) { + if (f->get_glyph_dsc == NULL) { + continue; + } + if (f->get_glyph_dsc(f, dsc_out, letter, letter_next)) { + dsc_out->resolved_font = f; + return true; + } + } + return false; +} + +__attribute__((weak)) bool lv_font_get_glyph_dsc_fmt_txt( + const lv_font_t* font, + lv_font_glyph_dsc_t* dsc_out, + uint32_t unicode_letter, + uint32_t unicode_letter_next) +{ + (void)unicode_letter_next; + if (font == NULL || dsc_out == NULL) { + return false; + } + + bool is_tab = unicode_letter == '\t'; + if (is_tab) { + unicode_letter = ' '; + } + + memset(dsc_out, 0, sizeof(*dsc_out)); + + const lv_font_fmt_txt_dsc_t* font_dsc = (const lv_font_fmt_txt_dsc_t*)font->dsc; + uint32_t glyph_id = _get_glyph_dsc_id(font, unicode_letter); + if (glyph_id == 0) { + return false; + } + + const lv_font_fmt_txt_glyph_dsc_t* glyph_dsc = &font_dsc->glyph_dsc[glyph_id]; + uint32_t advance_width = (glyph_dsc->adv_w + (1 << 3)) >> 4; + if (is_tab) { + advance_width *= 2; + } + + dsc_out->resolved_font = font; + dsc_out->adv_w = advance_width; + dsc_out->box_w = glyph_dsc->box_w; + dsc_out->box_h = glyph_dsc->box_h; + dsc_out->ofs_x = glyph_dsc->ofs_x; + dsc_out->ofs_y = glyph_dsc->ofs_y; + dsc_out->format = (lv_font_glyph_format_t)font_dsc->bpp; + dsc_out->is_placeholder = false; + dsc_out->gid.index = glyph_id; + + if (font_dsc->stride == 0) { + dsc_out->stride = 0; + } else { + uint32_t width_in_bytes = (dsc_out->box_w * font_dsc->bpp + 7) >> 3; + dsc_out->stride = ((width_in_bytes + font_dsc->stride - 1) / font_dsc->stride) * + font_dsc->stride; + } + + if (is_tab) { + dsc_out->box_w *= 2; + } + + return true; +} + +__attribute__((weak)) const void* lv_font_get_bitmap_fmt_txt( + lv_font_glyph_dsc_t* glyph_dsc, + lv_draw_buf_t* draw_buf) +{ + (void)draw_buf; + if (glyph_dsc == NULL || glyph_dsc->resolved_font == NULL) { + return NULL; + } + const lv_font_fmt_txt_dsc_t* font_dsc = + (const lv_font_fmt_txt_dsc_t*)glyph_dsc->resolved_font->dsc; + const lv_font_fmt_txt_glyph_dsc_t* font_glyph_dsc = + &font_dsc->glyph_dsc[glyph_dsc->gid.index]; + return &font_dsc->glyph_bitmap[font_glyph_dsc->bitmap_index]; +} diff --git a/src/ui/fonts/monogram_16.c b/src/ui/fonts/monogram_16.c new file mode 100644 index 0000000000..64aa5e887b --- /dev/null +++ b/src/ui/fonts/monogram_16.c @@ -0,0 +1,448 @@ +/******************************************************************************* + * Size: 16 px + * Bpp: 1 + * Opts: --bpp 1 --size 16 --font monogram.ttf --range 32-126 --format lvgl -o monogram_16.c + ******************************************************************************/ + +#ifdef __has_include + #if __has_include("lvgl.h") + #ifndef LV_LVGL_H_INCLUDE_SIMPLE + #define LV_LVGL_H_INCLUDE_SIMPLE + #endif + #endif +#endif + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "lvgl/lvgl.h" +#endif + +#include "monogram_16.h" + +#ifndef MONOGRAM_16 +#define MONOGRAM_16 1 +#endif + +#if MONOGRAM_16 + +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + 0x00, + + /* U+0021 "!" */ + 0xFA, + + /* U+0022 "\"" */ + 0xB6, 0x80, + + /* U+0023 "#" */ + 0x57, 0xD4, 0xAF, 0xA8, + + /* U+0024 "$" */ + 0x23, 0xE8, 0xE2, 0xF8, 0x80, + + /* U+0025 "%" */ + 0x8C, 0x44, 0x44, 0x46, 0x20, + + /* U+0026 "&" */ + 0x64, 0xA4, 0xF9, 0x49, 0xA0, + + /* U+0027 "'" */ + 0xE0, + + /* U+0028 "(" */ + 0x6A, 0xA4, + + /* U+0029 ")" */ + 0x95, 0x58, + + /* U+002A "*" */ + 0x25, 0x5D, 0x52, 0x00, + + /* U+002B "+" */ + 0x21, 0x3E, 0x42, 0x00, + + /* U+002C "," */ + 0x58, + + /* U+002D "-" */ + 0xF8, + + /* U+002E "." */ + 0xC0, + + /* U+002F "/" */ + 0x08, 0x44, 0x44, 0x42, 0x00, + + /* U+0030 "0" */ + 0x74, 0x67, 0x5C, 0xC5, 0xC0, + + /* U+0031 "1" */ + 0x23, 0x08, 0x42, 0x13, 0xE0, + + /* U+0032 "2" */ + 0x74, 0x42, 0x22, 0x23, 0xE0, + + /* U+0033 "3" */ + 0x74, 0x42, 0x60, 0xC5, 0xC0, + + /* U+0034 "4" */ + 0x4A, 0x63, 0xF0, 0x84, 0x20, + + /* U+0035 "5" */ + 0xFC, 0x3C, 0x10, 0xC5, 0xC0, + + /* U+0036 "6" */ + 0x74, 0x21, 0xE8, 0xC5, 0xC0, + + /* U+0037 "7" */ + 0xF8, 0x42, 0x22, 0x10, 0x80, + + /* U+0038 "8" */ + 0x74, 0x62, 0xE8, 0xC5, 0xC0, + + /* U+0039 "9" */ + 0x74, 0x62, 0xF0, 0xC5, 0xC0, + + /* U+003A ":" */ + 0xCC, + + /* U+003B ";" */ + 0x50, 0x58, + + /* U+003C "<" */ + 0x1B, 0x20, 0xC1, 0x80, + + /* U+003D "=" */ + 0xF8, 0x3E, + + /* U+003E ">" */ + 0xC1, 0x82, 0x6C, 0x00, + + /* U+003F "?" */ + 0x74, 0x42, 0x22, 0x00, 0x80, + + /* U+0040 "@" */ + 0x74, 0xEB, 0x59, 0xC1, 0xC0, + + /* U+0041 "A" */ + 0x74, 0x63, 0x1F, 0xC6, 0x20, + + /* U+0042 "B" */ + 0xF4, 0x63, 0xE8, 0xC7, 0xC0, + + /* U+0043 "C" */ + 0x74, 0x61, 0x08, 0x45, 0xC0, + + /* U+0044 "D" */ + 0xF4, 0x63, 0x18, 0xC7, 0xC0, + + /* U+0045 "E" */ + 0xFC, 0x21, 0xE8, 0x43, 0xE0, + + /* U+0046 "F" */ + 0xFC, 0x21, 0xE8, 0x42, 0x00, + + /* U+0047 "G" */ + 0x74, 0x61, 0x78, 0xC5, 0xC0, + + /* U+0048 "H" */ + 0x8C, 0x63, 0xF8, 0xC6, 0x20, + + /* U+0049 "I" */ + 0xF9, 0x08, 0x42, 0x13, 0xE0, + + /* U+004A "J" */ + 0x08, 0x42, 0x18, 0xC5, 0xC0, + + /* U+004B "K" */ + 0x8C, 0xA9, 0x8A, 0x4A, 0x20, + + /* U+004C "L" */ + 0x84, 0x21, 0x08, 0x43, 0xE0, + + /* U+004D "M" */ + 0x8E, 0xEB, 0x18, 0xC6, 0x20, + + /* U+004E "N" */ + 0x8C, 0x73, 0x59, 0xC6, 0x20, + + /* U+004F "O" */ + 0x74, 0x63, 0x18, 0xC5, 0xC0, + + /* U+0050 "P" */ + 0xF4, 0x63, 0xE8, 0x42, 0x00, + + /* U+0051 "Q" */ + 0x74, 0x63, 0x18, 0xC5, 0xC3, + + /* U+0052 "R" */ + 0xF4, 0x63, 0xE8, 0xC6, 0x20, + + /* U+0053 "S" */ + 0x74, 0x60, 0xE0, 0xC5, 0xC0, + + /* U+0054 "T" */ + 0xF9, 0x08, 0x42, 0x10, 0x80, + + /* U+0055 "U" */ + 0x8C, 0x63, 0x18, 0xC5, 0xC0, + + /* U+0056 "V" */ + 0x8C, 0x63, 0x15, 0x28, 0x80, + + /* U+0057 "W" */ + 0x8C, 0x63, 0x1A, 0xEE, 0x20, + + /* U+0058 "X" */ + 0x8C, 0x54, 0x45, 0x46, 0x20, + + /* U+0059 "Y" */ + 0x8C, 0x54, 0x42, 0x10, 0x80, + + /* U+005A "Z" */ + 0xF8, 0x44, 0x44, 0x43, 0xE0, + + /* U+005B "[" */ + 0xEA, 0xAC, + + /* U+005C "\\" */ + 0x84, 0x10, 0x41, 0x04, 0x20, + + /* U+005D "]" */ + 0xD5, 0x5C, + + /* U+005E "^" */ + 0x22, 0xA2, + + /* U+005F "_" */ + 0xF8, + + /* U+0060 "`" */ + 0x90, + + /* U+0061 "a" */ + 0x7C, 0x63, 0x17, 0x80, + + /* U+0062 "b" */ + 0x84, 0x3D, 0x18, 0xC7, 0xC0, + + /* U+0063 "c" */ + 0x74, 0x61, 0x17, 0x00, + + /* U+0064 "d" */ + 0x08, 0x5F, 0x18, 0xC5, 0xE0, + + /* U+0065 "e" */ + 0x74, 0x7F, 0x07, 0x00, + + /* U+0066 "f" */ + 0x32, 0x51, 0xE4, 0x21, 0x00, + + /* U+0067 "g" */ + 0x7C, 0x63, 0x17, 0x85, 0xC0, + + /* U+0068 "h" */ + 0x84, 0x3D, 0x18, 0xC6, 0x20, + + /* U+0069 "i" */ + 0x20, 0x18, 0x42, 0x13, 0xE0, + + /* U+006A "j" */ + 0x08, 0x06, 0x10, 0x84, 0x31, 0x70, + + /* U+006B "k" */ + 0x84, 0x23, 0x2E, 0x4A, 0x20, + + /* U+006C "l" */ + 0xC2, 0x10, 0x84, 0x20, 0xE0, + + /* U+006D "m" */ + 0xF5, 0x6B, 0x5A, 0x80, + + /* U+006E "n" */ + 0xF4, 0x63, 0x18, 0x80, + + /* U+006F "o" */ + 0x74, 0x63, 0x17, 0x00, + + /* U+0070 "p" */ + 0xF4, 0x63, 0x1F, 0x42, 0x00, + + /* U+0071 "q" */ + 0x7C, 0x63, 0x17, 0x84, 0x20, + + /* U+0072 "r" */ + 0xB6, 0x61, 0x08, 0x00, + + /* U+0073 "s" */ + 0x7C, 0x1C, 0x1F, 0x00, + + /* U+0074 "t" */ + 0x42, 0x3C, 0x84, 0x20, 0xE0, + + /* U+0075 "u" */ + 0x8C, 0x63, 0x17, 0x80, + + /* U+0076 "v" */ + 0x8C, 0x62, 0xA2, 0x00, + + /* U+0077 "w" */ + 0x8C, 0x6B, 0x55, 0x00, + + /* U+0078 "x" */ + 0x8A, 0x88, 0xA8, 0x80, + + /* U+0079 "y" */ + 0x8C, 0x63, 0x17, 0x85, 0xC0, + + /* U+007A "z" */ + 0xF8, 0x88, 0x8F, 0x80, + + /* U+007B "{" */ + 0x29, 0x44, 0x88, + + /* U+007C "|" */ + 0xFE, + + /* U+007D "}" */ + 0x89, 0x14, 0xA0, + + /* U+007E "~" */ + 0x4D, 0x80, +}; + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 96, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 0} /* U+0020 */, + {.bitmap_index = 1, .adv_w = 96, .box_w = 1, .box_h = 7, .ofs_x = 2, .ofs_y = 0} /* U+0021 */, + {.bitmap_index = 2, .adv_w = 96, .box_w = 3, .box_h = 3, .ofs_x = 1, .ofs_y = 4} /* U+0022 */, + {.bitmap_index = 4, .adv_w = 96, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+0023 */, + {.bitmap_index = 8, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0024 */, + {.bitmap_index = 13, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0025 */, + {.bitmap_index = 18, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0026 */, + {.bitmap_index = 23, .adv_w = 96, .box_w = 1, .box_h = 3, .ofs_x = 2, .ofs_y = 4} /* U+0027 */, + {.bitmap_index = 24, .adv_w = 96, .box_w = 2, .box_h = 7, .ofs_x = 2, .ofs_y = 0} /* U+0028 */, + {.bitmap_index = 26, .adv_w = 96, .box_w = 2, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+0029 */, + {.bitmap_index = 28, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 1} /* U+002A */, + {.bitmap_index = 32, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 1} /* U+002B */, + {.bitmap_index = 36, .adv_w = 96, .box_w = 2, .box_h = 3, .ofs_x = 1, .ofs_y = -1} /* U+002C */, + {.bitmap_index = 37, .adv_w = 96, .box_w = 5, .box_h = 1, .ofs_x = 0, .ofs_y = 3} /* U+002D */, + {.bitmap_index = 38, .adv_w = 96, .box_w = 1, .box_h = 2, .ofs_x = 2, .ofs_y = 0} /* U+002E */, + {.bitmap_index = 39, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+002F */, + {.bitmap_index = 44, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0030 */, + {.bitmap_index = 49, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0031 */, + {.bitmap_index = 54, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0032 */, + {.bitmap_index = 59, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0033 */, + {.bitmap_index = 64, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0034 */, + {.bitmap_index = 69, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0035 */, + {.bitmap_index = 74, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0036 */, + {.bitmap_index = 79, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0037 */, + {.bitmap_index = 84, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0038 */, + {.bitmap_index = 89, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0039 */, + {.bitmap_index = 94, .adv_w = 96, .box_w = 1, .box_h = 6, .ofs_x = 2, .ofs_y = 0} /* U+003A */, + {.bitmap_index = 95, .adv_w = 96, .box_w = 2, .box_h = 7, .ofs_x = 1, .ofs_y = -1} /* U+003B */, + {.bitmap_index = 97, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 1} /* U+003C */, + {.bitmap_index = 101, .adv_w = 96, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 2} /* U+003D */, + {.bitmap_index = 103, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 1} /* U+003E */, + {.bitmap_index = 107, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+003F */, + {.bitmap_index = 112, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0040 */, + {.bitmap_index = 117, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0041 */, + {.bitmap_index = 122, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0042 */, + {.bitmap_index = 127, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0043 */, + {.bitmap_index = 132, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0044 */, + {.bitmap_index = 137, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0045 */, + {.bitmap_index = 142, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0046 */, + {.bitmap_index = 147, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0047 */, + {.bitmap_index = 152, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0048 */, + {.bitmap_index = 157, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0049 */, + {.bitmap_index = 162, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+004A */, + {.bitmap_index = 167, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+004B */, + {.bitmap_index = 172, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+004C */, + {.bitmap_index = 177, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+004D */, + {.bitmap_index = 182, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+004E */, + {.bitmap_index = 187, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+004F */, + {.bitmap_index = 192, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0050 */, + {.bitmap_index = 197, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -1} /* U+0051 */, + {.bitmap_index = 202, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0052 */, + {.bitmap_index = 207, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0053 */, + {.bitmap_index = 212, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0054 */, + {.bitmap_index = 217, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0055 */, + {.bitmap_index = 222, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0056 */, + {.bitmap_index = 227, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0057 */, + {.bitmap_index = 232, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0058 */, + {.bitmap_index = 237, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0059 */, + {.bitmap_index = 242, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+005A */, + {.bitmap_index = 247, .adv_w = 96, .box_w = 2, .box_h = 7, .ofs_x = 2, .ofs_y = 0} /* U+005B */, + {.bitmap_index = 249, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+005C */, + {.bitmap_index = 254, .adv_w = 96, .box_w = 2, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+005D */, + {.bitmap_index = 256, .adv_w = 96, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 4} /* U+005E */, + {.bitmap_index = 258, .adv_w = 96, .box_w = 5, .box_h = 1, .ofs_x = 0, .ofs_y = 0} /* U+005F */, + {.bitmap_index = 259, .adv_w = 96, .box_w = 2, .box_h = 2, .ofs_x = 1, .ofs_y = 5} /* U+0060 */, + {.bitmap_index = 260, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0061 */, + {.bitmap_index = 264, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0062 */, + {.bitmap_index = 269, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0063 */, + {.bitmap_index = 273, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0064 */, + {.bitmap_index = 278, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0065 */, + {.bitmap_index = 282, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0066 */, + {.bitmap_index = 287, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = -2} /* U+0067 */, + {.bitmap_index = 292, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0068 */, + {.bitmap_index = 297, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0069 */, + {.bitmap_index = 302, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+006A */, + {.bitmap_index = 308, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+006B */, + {.bitmap_index = 313, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+006C */, + {.bitmap_index = 318, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+006D */, + {.bitmap_index = 322, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+006E */, + {.bitmap_index = 326, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+006F */, + {.bitmap_index = 330, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = -2} /* U+0070 */, + {.bitmap_index = 335, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = -2} /* U+0071 */, + {.bitmap_index = 340, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0072 */, + {.bitmap_index = 344, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0073 */, + {.bitmap_index = 348, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+0074 */, + {.bitmap_index = 353, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0075 */, + {.bitmap_index = 357, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0076 */, + {.bitmap_index = 361, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0077 */, + {.bitmap_index = 365, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+0078 */, + {.bitmap_index = 369, .adv_w = 96, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = -2} /* U+0079 */, + {.bitmap_index = 374, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+007A */, + {.bitmap_index = 378, .adv_w = 96, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+007B */, + {.bitmap_index = 381, .adv_w = 96, .box_w = 1, .box_h = 7, .ofs_x = 2, .ofs_y = 0} /* U+007C */, + {.bitmap_index = 382, .adv_w = 96, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+007D */, + {.bitmap_index = 385, .adv_w = 96, .box_w = 5, .box_h = 2, .ofs_x = 0, .ofs_y = 5} /* U+007E */ +}; + +static const lv_font_fmt_txt_cmap_t cmaps[] = { + {.range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY} +}; + +static const lv_font_fmt_txt_dsc_t font_dsc = { + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 1, + .bpp = 1, + .kern_classes = 0, + .bitmap_format = 0, + .stride = 0, +}; + +const lv_font_t monogram_16 = { + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, + .line_height = 9, + .base_line = 2, + .subpx = LV_FONT_SUBPX_NONE, + .underline_position = -1, + .underline_thickness = 0, + .static_bitmap = 0, + .dsc = &font_dsc, + .fallback = NULL, + .user_data = NULL, +}; + +#endif /* MONOGRAM_16 */ diff --git a/src/ui/fonts/monogram_16.h b/src/ui/fonts/monogram_16.h new file mode 100644 index 0000000000..a54a2bb6e6 --- /dev/null +++ b/src/ui/fonts/monogram_16.h @@ -0,0 +1,8 @@ +#ifndef _MONOGRAM_16_H_ +#define _MONOGRAM_16_H_ + +typedef struct _lv_font_t lv_font_t; + +extern const lv_font_t monogram_16; + +#endif diff --git a/src/ui/fonts/monogram_16_ugui.c b/src/ui/fonts/monogram_16_ugui.c new file mode 100644 index 0000000000..43f22c042f --- /dev/null +++ b/src/ui/fonts/monogram_16_ugui.c @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include "monogram_16.h" +#include "monogram_16_ugui.h" + +#include + +const UG_FONT font_monogram_16 = {&monogram_16, FONT_TYPE_LVGL, 6, 9, 0, UINT16_MAX, NULL}; diff --git a/src/ui/fonts/monogram_16_ugui.h b/src/ui/fonts/monogram_16_ugui.h new file mode 100644 index 0000000000..20f6223f21 --- /dev/null +++ b/src/ui/fonts/monogram_16_ugui.h @@ -0,0 +1,8 @@ +#ifndef _MONOGRAM_16_UGUI_H_ +#define _MONOGRAM_16_UGUI_H_ + +#include + +extern const UG_FONT font_monogram_16; + +#endif diff --git a/src/ui/fonts/password_12.c b/src/ui/fonts/password_12.c new file mode 100644 index 0000000000..8b3e6cedc4 --- /dev/null +++ b/src/ui/fonts/password_12.c @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include "arial_12.h" +#include "lvgl.h" +#include "password_12.h" + +#include + +static const uint8_t glyph_bitmap[] = { + /* U+0020 " " rendered as a visible U-shaped space */ + 0x86, 0x1F, 0xC0, +}; + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 96, .box_w = 6, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, +}; + +static const lv_font_fmt_txt_cmap_t cmaps[] = { + {.range_start = 32, + .range_length = 1, + .glyph_id_start = 1, + .unicode_list = NULL, + .glyph_id_ofs_list = NULL, + .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, +}; + +static const lv_font_fmt_txt_dsc_t font_dsc = { + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 1, + .bpp = 1, + .kern_classes = 0, + .bitmap_format = 0, + .stride = 0, +}; + +static const lv_font_t password_12 = { + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, + .line_height = 18, + .base_line = 2, + .subpx = LV_FONT_SUBPX_NONE, + .underline_position = -1, + .underline_thickness = 0, + .static_bitmap = 0, + .dsc = &font_dsc, + .fallback = &arial_12, + .user_data = NULL, +}; + +const UG_FONT font_password_12 = {&password_12, FONT_TYPE_LVGL, 11, 12, 0, UINT16_MAX, NULL}; diff --git a/src/ui/fonts/password_12.h b/src/ui/fonts/password_12.h new file mode 100644 index 0000000000..27fe59d3a7 --- /dev/null +++ b/src/ui/fonts/password_12.h @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include + +extern const UG_FONT font_password_12; diff --git a/src/ui/fonts/password_9.c b/src/ui/fonts/password_9.c new file mode 100644 index 0000000000..17ce1f7e04 --- /dev/null +++ b/src/ui/fonts/password_9.c @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include "arial_9.h" +#include "lvgl.h" +#include "password_9.h" + +#include + +static const uint8_t glyph_bitmap[] = { + /* U+0020 " " rendered as a visible U-shaped space */ + 0x8C, 0x7E, +}; + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 80, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, +}; + +static const lv_font_fmt_txt_cmap_t cmaps[] = { + {.range_start = 32, + .range_length = 1, + .glyph_id_start = 1, + .unicode_list = NULL, + .glyph_id_ofs_list = NULL, + .list_length = 0, + .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, +}; + +static const lv_font_fmt_txt_dsc_t font_dsc = { + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 1, + .bpp = 1, + .kern_classes = 0, + .bitmap_format = 0, + .stride = 0, +}; + +static const lv_font_t password_9 = { + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, + .line_height = 15, + .base_line = 2, + .subpx = LV_FONT_SUBPX_NONE, + .underline_position = -1, + .underline_thickness = 0, + .static_bitmap = 0, + .dsc = &font_dsc, + .fallback = &arial_9, + .user_data = NULL, +}; + +const UG_FONT font_password_9 = {&password_9, FONT_TYPE_LVGL, 9, 9, 0, UINT16_MAX, NULL}; diff --git a/src/ui/fonts/password_9.h b/src/ui/fonts/password_9.h new file mode 100644 index 0000000000..497f1ad467 --- /dev/null +++ b/src/ui/fonts/password_9.h @@ -0,0 +1,3 @@ +#include + +extern const UG_FONT font_password_9; From 30b5bae15d2bdaedd4778d3611b0e30e0c4ecbf3 Mon Sep 17 00:00:00 2001 From: Niklas Dusenlund Date: Wed, 13 May 2026 21:05:22 +0200 Subject: [PATCH 3/9] ui: switch BB02 to LVGL fonts Wire the new LVGL font assets into the firmware, bootloader, simulator bindings, and Rust UI font types, then remove the old uGUI font files. --- src/CMakeLists.txt | 42 ++- src/bootloader/bootloader.c | 10 +- src/da14531/da14531_handler.c | 4 +- src/rust/bitbox-hal/src/ui.rs | 4 +- .../bitbox02-rust/src/workflow/pairing.rs | 2 +- src/rust/bitbox02-rust/src/workflow/unlock.rs | 2 +- src/rust/bitbox02-sys/build.rs | 67 +++-- src/rust/bitbox02-sys/wrapper.h | 12 +- src/rust/bitbox02/src/hal/ui.rs | 12 +- src/rust/bitbox02/src/lib.rs | 4 +- src/rust/bitbox02/src/ui/types.rs | 8 +- src/screen.c | 4 +- src/ui/components/button.c | 4 +- src/ui/components/confirm.c | 2 +- src/ui/components/confirm_swap.c | 6 +- src/ui/components/confirm_transaction.c | 6 +- src/ui/components/keyboard_switch.c | 2 +- src/ui/components/label.c | 2 +- src/ui/components/lockscreen.c | 2 +- src/ui/components/trinary_input_char.c | 22 +- src/ui/components/trinary_input_string.c | 21 +- src/ui/fonts/arial_fonts.h | 14 +- src/ui/fonts/font_a_11X10.c | 107 ------- src/ui/fonts/font_a_11X10.h | 5 - src/ui/fonts/font_a_11X12.c | 109 -------- src/ui/fonts/font_a_11X12.h | 5 - src/ui/fonts/font_a_13X14.c | 108 -------- src/ui/fonts/font_a_13X14.h | 5 - src/ui/fonts/font_a_15X16.c | 109 -------- src/ui/fonts/font_a_15X16.h | 5 - src/ui/fonts/font_a_17X18.c | 109 -------- src/ui/fonts/font_a_17X18.h | 5 - src/ui/fonts/font_a_9X9.c | 108 -------- src/ui/fonts/font_a_9X9.h | 5 - src/ui/fonts/monogram_5X9.c | 107 ------- src/ui/fonts/monogram_5X9.h | 3 - src/ui/fonts/password_11X12.c | 105 ------- src/ui/fonts/password_11X12.h | 5 - src/ui/fonts/password_9X9.c | 104 ------- src/ui/fonts/password_9X9.h | 3 - src/ui/ugui/ugui.c | 262 ++++++++++++++---- src/ui/ugui/ugui.h | 8 +- test/unit-test/test_ugui.c | 120 +++++++- test/unit-test/test_ui_components.c | 5 +- test/unit-test/test_ui_util.c | 2 +- 45 files changed, 480 insertions(+), 1176 deletions(-) delete mode 100644 src/ui/fonts/font_a_11X10.c delete mode 100644 src/ui/fonts/font_a_11X10.h delete mode 100644 src/ui/fonts/font_a_11X12.c delete mode 100644 src/ui/fonts/font_a_11X12.h delete mode 100644 src/ui/fonts/font_a_13X14.c delete mode 100644 src/ui/fonts/font_a_13X14.h delete mode 100644 src/ui/fonts/font_a_15X16.c delete mode 100644 src/ui/fonts/font_a_15X16.h delete mode 100644 src/ui/fonts/font_a_17X18.c delete mode 100644 src/ui/fonts/font_a_17X18.h delete mode 100644 src/ui/fonts/font_a_9X9.c delete mode 100644 src/ui/fonts/font_a_9X9.h delete mode 100644 src/ui/fonts/monogram_5X9.c delete mode 100644 src/ui/fonts/monogram_5X9.h delete mode 100644 src/ui/fonts/password_11X12.c delete mode 100644 src/ui/fonts/password_11X12.h delete mode 100644 src/ui/fonts/password_9X9.c delete mode 100644 src/ui/fonts/password_9X9.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9f2867e680..63aab773e2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -37,15 +37,17 @@ set(DBB-FIRMWARE-UI-SOURCES ${CMAKE_SOURCE_DIR}/src/screen.c ${CMAKE_SOURCE_DIR}/src/ui/graphics/graphics.c ${CMAKE_SOURCE_DIR}/src/ui/ugui/ugui.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/font_a_9X9.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/font_a_11X10.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/font_a_11X12.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/font_a_13X14.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/font_a_15X16.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/font_a_17X18.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/monogram_5X9.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/password_9X9.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/password_11X12.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_11.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_11_ugui.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_12.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_12_ugui.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_9.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_9_ugui.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/lvgl_font_compat.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/monogram_16.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/monogram_16_ugui.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/password_9.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/password_12.c ${CMAKE_SOURCE_DIR}/src/ui/screen_saver.c ${CMAKE_SOURCE_DIR}/src/ui/screen_stack.c ${CMAKE_SOURCE_DIR}/src/ui/screen_process.c @@ -96,9 +98,15 @@ set(DBB-BOOTLOADER-SOURCES ${CMAKE_SOURCE_DIR}/src/memory/memory_spi.c ${CMAKE_SOURCE_DIR}/src/usb/usb_processing.c ${CMAKE_SOURCE_DIR}/src/ui/ugui/ugui.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/font_a_9X9.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/font_a_11X10.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/monogram_5X9.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_11.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_11_ugui.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_12.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_12_ugui.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_9.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_9_ugui.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/lvgl_font_compat.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/monogram_16.c + ${CMAKE_SOURCE_DIR}/src/ui/fonts/monogram_16_ugui.c ${CMAKE_SOURCE_DIR}/src/ui/graphics/graphics.c ${CMAKE_SOURCE_DIR}/src/screen.c ${CMAKE_SOURCE_DIR}/src/hardfault.c @@ -179,9 +187,17 @@ set(INCLUDES ${CMAKE_SOURCE_DIR}/src/usb/class/hid ${CMAKE_SOURCE_DIR}/src/usb/class/hid/hww ${CMAKE_SOURCE_DIR}/src/usb/class/hid/u2f + ${CMAKE_SOURCE_DIR}/external/lvgl ) set(INCLUDES ${INCLUDES} PARENT_SCOPE) +set(LVGL_DEFINITIONS + LV_KCONFIG_IGNORE + LV_LVGL_H_INCLUDE_SIMPLE + LV_CONF_PATH="${CMAKE_SOURCE_DIR}/src/rust/bitbox-lvgl-sys/lv_conf.h" + LV_CONF_INCLUDE_SIMPLE +) + #----------------------------------------------------------------------------- # Build embedded firmware @@ -420,6 +436,7 @@ if(CMAKE_CROSSCOMPILING) target_link_libraries(${elf} PRIVATE c asf4-drivers-min samd51a-ds -Wl,-u,exception_table) target_include_directories(${elf} PRIVATE ${INCLUDES}) target_compile_definitions(${elf} PRIVATE BOOTLOADER "APP_U2F=0") + target_compile_definitions(${elf} PRIVATE ${LVGL_DEFINITIONS}) # needed to find version.h target_include_directories(${elf} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) # needed to find bootloader_version.h @@ -505,6 +522,7 @@ if(CMAKE_CROSSCOMPILING) asf4-drivers -Wl,-u,exception_table) target_include_directories(${elf} PRIVATE ${INCLUDES}) + target_compile_definitions(${elf} PRIVATE ${LVGL_DEFINITIONS}) # needed to find version.h target_include_directories(${elf} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/src/bootloader/bootloader.c b/src/bootloader/bootloader.c index 48d101995d..653a4699ed 100644 --- a/src/bootloader/bootloader.c +++ b/src/bootloader/bootloader.c @@ -366,9 +366,9 @@ void bootloader_render_ble_confirm_screen(bool confirmed) image_cross(SCREEN_WIDTH / 16, 0, IMAGE_DEFAULT_CROSS_HEIGHT); image_checkmark(SCREEN_WIDTH * 15 / 16 - check_width, 0, IMAGE_DEFAULT_CHECKMARK_HEIGHT); } - UG_FontSelect(&font_monogram_5X9); + UG_FontSelect(&font_monogram_16); UG_PutString(45, SCREEN_HEIGHT / 2 - 9, code_str); - UG_FontSelect(&font_font_a_9X9); + UG_FontSelect(&font_arial_9); UG_SendBuffer(); } #endif @@ -398,8 +398,8 @@ static void _render_hash(const char* title, const uint8_t* hash) // If you change this, check the timer_buf size below. const uint8_t seconds = 10; // how many seconds to show screen const UG_S16 title_margin = 7; // Margin between title and hash - const UG_FONT* f_mono = &font_monogram_5X9; // monospaced font - const UG_FONT* f_regular = &font_font_a_9X9; // regular font + const UG_FONT* f_mono = &font_monogram_16; // monospaced font + const UG_FONT* f_regular = &font_arial_9; // regular font // Convert hash to ascii hex char hash_hex[2 * SHA256_DIGEST_LENGTH + 1]; @@ -1062,7 +1062,7 @@ void bootloader_jump(void) screen_rotate(); } - UG_FontSelect(&font_font_a_9X9); + UG_FontSelect(&font_arial_9); if (shared_data.fields.auto_enter != sectrue_u8) { #ifdef BOOTLOADER_DEVDEVICE diff --git a/src/da14531/da14531_handler.c b/src/da14531/da14531_handler.c index 7c72262c20..886c794ac8 100644 --- a/src/da14531/da14531_handler.c +++ b/src/da14531/da14531_handler.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include const uint8_t* da14531_handler_current_product = NULL; @@ -155,7 +155,7 @@ static void _ctrl_handler(const struct da14531_ctrl_frame* frame, struct RustByt const confirm_params_t confirm_params = { .title = "Pairing code", .body = pairing_code, - .font = &font_monogram_5X9, + .font = &font_monogram_16, }; _ble_pairing_component = confirm_create( &confirm_params, _ble_pairing_callback, (void*)&_ble_pairing_callback_data); diff --git a/src/rust/bitbox-hal/src/ui.rs b/src/rust/bitbox-hal/src/ui.rs index 1c300b0ecd..dff4bfd468 100644 --- a/src/rust/bitbox-hal/src/ui.rs +++ b/src/rust/bitbox-hal/src/ui.rs @@ -9,8 +9,8 @@ pub struct UserAbort; pub enum Font { #[default] Default, - Password11X12, - Monogram5X9, + Password12, + Monogram16, } #[derive(Default)] diff --git a/src/rust/bitbox02-rust/src/workflow/pairing.rs b/src/rust/bitbox02-rust/src/workflow/pairing.rs index ad4d7dafa4..b1cbf0bd48 100644 --- a/src/rust/bitbox02-rust/src/workflow/pairing.rs +++ b/src/rust/bitbox02-rust/src/workflow/pairing.rs @@ -24,7 +24,7 @@ pub async fn confirm(hal: &mut impl crate::hal::Hal, hash: &[u8; 32]) -> Result< let params = ConfirmParams { title: "Pairing code", body: &format_hash(hash), - font: Font::Monogram5X9, + font: Font::Monogram16, ..Default::default() }; diff --git a/src/rust/bitbox02-rust/src/workflow/unlock.rs b/src/rust/bitbox02-rust/src/workflow/unlock.rs index 18d4e1b020..2c51657ca5 100644 --- a/src/rust/bitbox02-rust/src/workflow/unlock.rs +++ b/src/rust/bitbox02-rust/src/workflow/unlock.rs @@ -31,7 +31,7 @@ async fn confirm_mnemonic_passphrase( let params = ConfirmParams { title: "Confirm", body: passphrase, - font: crate::hal::ui::Font::Password11X12, + font: crate::hal::ui::Font::Password12, scrollable: true, longtouch: true, ..Default::default() diff --git a/src/rust/bitbox02-sys/build.rs b/src/rust/bitbox02-sys/build.rs index 67998c8494..af95532339 100644 --- a/src/rust/bitbox02-sys/build.rs +++ b/src/rust/bitbox02-sys/build.rs @@ -13,10 +13,11 @@ const ALLOWLIST_VARS: &[&str] = &[ "da14531_handler_current_product_len", "BITBOX02_FLASH_BOOT_LEN", "BITBOX02_FLASH_BOOT_START", - "font_font_a_11X10", - "font_font_a_9X9", - "font_monogram_5X9", - "font_password_11X12", + "font_arial_11", + "font_arial_12", + "font_arial_9", + "font_monogram_16", + "font_password_12", "INPUT_STRING_MAX_SIZE", "MAX_LABEL_SIZE", "MAX_PK_SCRIPT_SIZE", @@ -256,15 +257,17 @@ const BITBOX02_SOURCES: &[&str] = &[ "src/ui/components/ui_images.c", "src/ui/components/waiting.c", "src/ui/event_handler.c", - "src/ui/fonts/font_a_11X10.c", - "src/ui/fonts/font_a_11X12.c", - "src/ui/fonts/font_a_13X14.c", - "src/ui/fonts/font_a_15X16.c", - "src/ui/fonts/font_a_17X18.c", - "src/ui/fonts/font_a_9X9.c", - "src/ui/fonts/monogram_5X9.c", - "src/ui/fonts/password_11X12.c", - "src/ui/fonts/password_9X9.c", + "src/ui/fonts/arial_11.c", + "src/ui/fonts/arial_11_ugui.c", + "src/ui/fonts/arial_12.c", + "src/ui/fonts/arial_12_ugui.c", + "src/ui/fonts/arial_9.c", + "src/ui/fonts/arial_9_ugui.c", + "src/ui/fonts/monogram_16.c", + "src/ui/fonts/monogram_16_ugui.c", + "src/ui/fonts/lvgl_font_compat.c", + "src/ui/fonts/password_12.c", + "src/ui/fonts/password_9.c", "src/ui/graphics/graphics.c", "src/ui/oled/sh1107.c", "src/ui/oled/ssd1312.c", @@ -316,11 +319,15 @@ pub fn main() -> BuildResult<()> { emit_rerun_if_changed("../bitbox-framed-serial-link/src"); emit_rerun_if_changed("../bitbox-bytequeue/Cargo.toml"); emit_rerun_if_changed("../bitbox-bytequeue/src"); + emit_rerun_if_changed("../../../src/ui/fonts/arial_11_ugui.h"); + emit_rerun_if_changed("../../../src/ui/fonts/arial_12_ugui.h"); + emit_rerun_if_changed("../../../src/ui/fonts/arial_9_ugui.h"); emit_rerun_if_changed("../../../versions.json"); emit_rerun_if_changed("../../../src/version.h.tmpl"); emit_rerun_if_changed("../../../src/bootloader/bootloader_version.h.tmpl"); emit_rerun_if_changed("../../../scripts/generate_version_headers.py"); emit_rerun_if_changed("../../../scripts/generate_rust_header.sh"); + emit_rerun_if_changed("../bitbox-lvgl-sys/lv_conf.h"); // Generating version.h/bootloader_version.h depends on the current state of the git repo emit_git_rerun_if_changed(&repo_root); @@ -332,26 +339,37 @@ pub fn main() -> BuildResult<()> { let arm_sysroot = env::var("CMAKE_SYSROOT").unwrap_or("/usr/local/arm-none-eabi".to_string()); let arm_sysroot = format!("--sysroot={arm_sysroot}"); + let lv_conf = repo_root.join("src/rust/bitbox-lvgl-sys/lv_conf.h"); let mut extra_flags = if cross_compiling { vec![ - "-D__SAMD51J20A__", - "--target=thumbv7em-none-eabi", - "-mcpu=cortex-m4", - "-mthumb", - "-mfloat-abi=soft", - &arm_sysroot, - "-fshort-enums", + "-D__SAMD51J20A__".to_owned(), + "--target=thumbv7em-none-eabi".to_owned(), + "-mcpu=cortex-m4".to_owned(), + "-mthumb".to_owned(), + "-mfloat-abi=soft".to_owned(), + arm_sysroot, + "-fshort-enums".to_owned(), ] } else { - vec!["-DTESTING", "-D_UNIT_TEST_", "-DPRODUCT_BITBOX_MULTI=1"] + vec![ + "-DTESTING".to_owned(), + "-D_UNIT_TEST_".to_owned(), + "-DPRODUCT_BITBOX_MULTI=1".to_owned(), + ] }; + extra_flags.extend([ + "-DLV_KCONFIG_IGNORE".to_owned(), + "-DLV_LVGL_H_INCLUDE_SIMPLE".to_owned(), + format!("-DLV_CONF_PATH=\"{}\"", lv_conf.display()), + "-DLV_CONF_INCLUDE_SIMPLE".to_owned(), + ]); // If user enables -Dwarnings for rust we also want to enable -Werror for C. if let Ok(rustflags) = std::env::var("CARGO_ENCODED_RUSTFLAGS") { for flag in rustflags.split('\x1f') { if flag == "-Dwarnings" { - extra_flags.push("-Werror"); + extra_flags.push("-Werror".to_owned()); } } } @@ -362,6 +380,7 @@ pub fn main() -> BuildResult<()> { // $INCLUDES "../..".to_owned(), "../../ui/ugui".to_owned(), + "../../../external/lvgl".to_owned(), "../../platform".to_owned(), "../../qtouch".to_owned(), "../../usb/class".to_owned(), @@ -424,8 +443,8 @@ pub fn main() -> BuildResult<()> { // Needs to match the definitions in `CMakeList.txt' files (unit tests, hardware fakes and // simulator) - let mut definitions = vec!["-DAPP_U2F=1"]; - definitions.extend(&extra_flags); + let mut definitions = vec!["-DAPP_U2F=1".to_owned()]; + definitions.extend(extra_flags); run_command( Command::new("bindgen") diff --git a/src/rust/bitbox02-sys/wrapper.h b/src/rust/bitbox02-sys/wrapper.h index 6d87fb27fe..19b1e82ebf 100644 --- a/src/rust/bitbox02-sys/wrapper.h +++ b/src/rust/bitbox02-sys/wrapper.h @@ -38,10 +38,14 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include diff --git a/src/rust/bitbox02/src/hal/ui.rs b/src/rust/bitbox02/src/hal/ui.rs index 0b8414baf5..8b35e9ef57 100644 --- a/src/rust/bitbox02/src/hal/ui.rs +++ b/src/rust/bitbox02/src/hal/ui.rs @@ -33,8 +33,8 @@ impl HalEmpty for BitBox02Empty {} fn to_bitbox02_font(font: Font) -> crate::ui::Font { match font { Font::Default => crate::ui::Font::Default, - Font::Password11X12 => crate::ui::Font::Password11X12, - Font::Monogram5X9 => crate::ui::Font::Monogram5X9, + Font::Password12 => crate::ui::Font::Password12, + Font::Monogram16 => crate::ui::Font::Monogram16, } } @@ -276,8 +276,8 @@ mod tests { fn test_to_bitbox02_font() { let cases = [ (Font::Default, crate::ui::Font::Default), - (Font::Password11X12, crate::ui::Font::Password11X12), - (Font::Monogram5X9, crate::ui::Font::Monogram5X9), + (Font::Password12, crate::ui::Font::Password12), + (Font::Monogram16, crate::ui::Font::Monogram16), ]; for (input, expected) in cases { assert_eq!(to_bitbox02_font(input) as i32, expected as i32); @@ -288,8 +288,8 @@ mod tests { fn test_to_bitbox02_confirm_params() { let fonts = [ (Font::Default, crate::ui::Font::Default), - (Font::Password11X12, crate::ui::Font::Password11X12), - (Font::Monogram5X9, crate::ui::Font::Monogram5X9), + (Font::Password12, crate::ui::Font::Password12), + (Font::Monogram16, crate::ui::Font::Monogram16), ]; for (font, expected_font) in fonts { let input = ConfirmParams { diff --git a/src/rust/bitbox02/src/lib.rs b/src/rust/bitbox02/src/lib.rs index 23184d58ad..1ae4b39880 100644 --- a/src/rust/bitbox02/src/lib.rs +++ b/src/rust/bitbox02/src/lib.rs @@ -71,11 +71,11 @@ pub fn ug_send_buffer() { } pub fn ug_font_select_9x9() { - unsafe { bitbox02_sys::UG_FontSelect(&bitbox02_sys::font_font_a_9X9) } + unsafe { bitbox02_sys::UG_FontSelect(&bitbox02_sys::font_arial_9) } } pub fn ug_font_select_11x10() { - unsafe { bitbox02_sys::UG_FontSelect(&bitbox02_sys::font_font_a_11X10) } + unsafe { bitbox02_sys::UG_FontSelect(&bitbox02_sys::font_arial_11) } } pub fn screen_rotate() { diff --git a/src/rust/bitbox02/src/ui/types.rs b/src/rust/bitbox02/src/ui/types.rs index a65530b9b8..96bd6a5920 100644 --- a/src/rust/bitbox02/src/ui/types.rs +++ b/src/rust/bitbox02/src/ui/types.rs @@ -13,8 +13,8 @@ pub(crate) const MAX_LABEL_SIZE: usize = bitbox02_sys::MAX_LABEL_SIZE as _; pub enum Font { #[default] Default, - Password11X12, - Monogram5X9, + Password12, + Monogram16, } impl Font { @@ -22,8 +22,8 @@ impl Font { pub(crate) fn as_ptr(&self) -> *const bitbox02_sys::UG_FONT { match self { Font::Default => core::ptr::null() as *const _, - Font::Password11X12 => unsafe { &bitbox02_sys::font_password_11X12 }, - Font::Monogram5X9 => unsafe { &bitbox02_sys::font_monogram_5X9 }, + Font::Password12 => unsafe { &bitbox02_sys::font_password_12 }, + Font::Monogram16 => unsafe { &bitbox02_sys::font_monogram_16 }, } } } diff --git a/src/screen.c b/src/screen.c index 0f7756609e..b5894bcd44 100644 --- a/src/screen.c +++ b/src/screen.c @@ -34,7 +34,7 @@ void screen_print_debug(const char* message, int duration) char print[100]; snprintf(print, sizeof(print), "%s", message); screen_clear(); - UG_FontSelect(&font_font_a_9X9); + UG_FontSelect(&font_arial_9); UG_PutString(0, 0, print); UG_SendBuffer(); #ifndef TESTING @@ -102,7 +102,7 @@ void screen_init( { _mirror_fn = mirror_fn; _clear_fn = clear_fn; - UG_Init(&guioled, pixel_fn, &font_font_a_11X10, SCREEN_WIDTH, SCREEN_HEIGHT); + UG_Init(&guioled, pixel_fn, &font_arial_9, SCREEN_WIDTH, SCREEN_HEIGHT); } void screen_clear(void) diff --git a/src/ui/components/button.c b/src/ui/components/button.c index 85a640f497..2d22b3bb8b 100644 --- a/src/ui/components/button.c +++ b/src/ui/components/button.c @@ -31,7 +31,7 @@ typedef struct { static void _render(component_t* component) { button_data_t* data = (button_data_t*)component->data; - UG_FontSelect(&font_font_a_11X10); + UG_FontSelect(&font_arial_11); UG_FontSetHSpace(0); UG_PutStringCentered( component->position.left, @@ -163,7 +163,7 @@ void button_update(component_t* button, const char* text, void (*callback)(compo button_data_t* data = (button_data_t*)button->data; data->callback = callback; snprintf(data->text, sizeof(data->text), "%s", text); - UG_FontSelect(&font_font_a_11X10); + UG_FontSelect(&font_arial_11); UG_FontSetHSpace(0); UG_MeasureString(&(button->dimension.width), &(button->dimension.height), text); if (button->dimension.width < MIN_BUTTON_WIDTH) { diff --git a/src/ui/components/confirm.c b/src/ui/components/confirm.c index 9eb1caf2b3..5eecd96710 100644 --- a/src/ui/components/confirm.c +++ b/src/ui/components/confirm.c @@ -96,7 +96,7 @@ component_t* confirm_create( // Create labels. We nest them in a body component that covers the screen minus the title bar, // so that the CENTER positioning starts below the title bar. - const UG_FONT* font = &font_font_a_11X10; + const UG_FONT* font = &font_arial_11; const char* title = params->title; // Arbitrary size big enough to fit all wrapped titles. Increase if needed. char wrapped_title[128] = {0}; diff --git a/src/ui/components/confirm_swap.c b/src/ui/components/confirm_swap.c index 3c0ccec48d..2893302364 100644 --- a/src/ui/components/confirm_swap.c +++ b/src/ui/components/confirm_swap.c @@ -97,16 +97,16 @@ component_t* confirm_swap_create( ui_util_add_sub_component( confirm, icon_button_create(top_slider, ICON_BUTTON_NEXT, _confirm_cb, confirm)); - component_t* title_component = label_create(title, &font_font_a_11X10, CENTER_TOP, confirm); + component_t* title_component = label_create(title, &font_arial_11, CENTER_TOP, confirm); ui_util_add_sub_component(confirm, title_component); const UG_FONT* from_font = NULL; if (strlen(from) > BIG_FONT_MAX_CHARS) { - from_font = &font_font_a_9X9; + from_font = &font_arial_9; } const UG_FONT* to_font = NULL; if (strlen(to) > BIG_FONT_MAX_CHARS) { - to_font = &font_font_a_9X9; + to_font = &font_arial_9; } ui_util_add_sub_component( diff --git a/src/ui/components/confirm_transaction.c b/src/ui/components/confirm_transaction.c index a5598f89b7..802ba8e7b0 100644 --- a/src/ui/components/confirm_transaction.c +++ b/src/ui/components/confirm_transaction.c @@ -121,14 +121,14 @@ static component_t* _confirm_transaction_create( } if (strlens(fee)) { ui_util_add_sub_component( - confirm, label_create_offset("Fee", &font_font_a_9X9, CENTER_TOP, 0, 38, confirm)); + confirm, label_create_offset("Fee", &font_arial_9, CENTER_TOP, 0, 38, confirm)); ui_util_add_sub_component( - confirm, label_create_offset(fee, &font_font_a_9X9, CENTER_TOP, 0, 50, confirm)); + confirm, label_create_offset(fee, &font_arial_9, CENTER_TOP, 0, 50, confirm)); } const UG_FONT* amount_font = NULL; if (strlen(amount) > BIG_FONT_MAX_CHARS) { - amount_font = &font_font_a_9X9; + amount_font = &font_arial_9; } if (verify_total) { ui_util_add_sub_component( diff --git a/src/ui/components/keyboard_switch.c b/src/ui/components/keyboard_switch.c index 392224a423..13a5afdeff 100644 --- a/src/ui/components/keyboard_switch.c +++ b/src/ui/components/keyboard_switch.c @@ -32,7 +32,7 @@ typedef struct { static void _render(component_t* component) { keyboard_switch_data_t* ks_data = (keyboard_switch_data_t*)component->data; - UG_FontSelect(&font_font_a_11X10); + UG_FontSelect(&font_arial_11); UG_S16 w = 0, h = 0; switch (ks_data->mode) { case LOWER_CASE: diff --git a/src/ui/components/label.c b/src/ui/components/label.c index d57173261f..3c2665ae78 100644 --- a/src/ui/components/label.c +++ b/src/ui/components/label.c @@ -215,7 +215,7 @@ static component_t* _label_create( memset(data, 0, sizeof(data_t)); memset(label, 0, sizeof(component_t)); - data->font = font != NULL ? font : &font_font_a_11X10; + data->font = font != NULL ? font : &font_arial_11; data->scrollable = scrollable; data->position = position; data->xoffset = xoffset; diff --git a/src/ui/components/lockscreen.c b/src/ui/components/lockscreen.c index bb11b502e2..03583ca039 100644 --- a/src/ui/components/lockscreen.c +++ b/src/ui/components/lockscreen.c @@ -74,7 +74,7 @@ component_t* lockscreen_create(void) component->dimension.width = SCREEN_WIDTH; component->dimension.height = SCREEN_HEIGHT; - const UG_FONT* device_name_font = &font_font_a_9X9; + const UG_FONT* device_name_font = &font_arial_9; char device_name[MEMORY_DEVICE_MAX_LEN_WITH_NULL] = {0}; memory_get_device_name(device_name); diff --git a/src/ui/components/trinary_input_char.c b/src/ui/components/trinary_input_char.c index 6e5bfbfa5d..87865c2e1d 100644 --- a/src/ui/components/trinary_input_char.c +++ b/src/ui/components/trinary_input_char.c @@ -6,8 +6,8 @@ #include #include -#include -#include +#include +#include #include #include @@ -34,6 +34,13 @@ typedef struct { // Each of the three groups can occupy roughly a third of the width. static const UG_S16 _group_width = SCREEN_WIDTH / 3; +static UG_U16 _char_width(const UG_FONT* font, char chr) +{ + UG_U16 width = 0; + UG_GetCharWidth(font, (uint8_t)chr, &width); + return width; +} + // Stack entry for navigation history typedef struct { char alphabet[MAX_CHARS + 1]; @@ -256,7 +263,7 @@ static void _put_string( UG_S16 total_width = 0; for (size_t idx = 0; idx < elements_size; idx++) { char c = elements[idx]->character; - total_width += font->widths[c - font->start_char]; + total_width += _char_width(font, c); total_width += horiz_space; } @@ -275,8 +282,7 @@ static void _put_string( char c = elements[idx]->character; bool update_position = !element->newly_born; element->target_x = x; - x += c == ' ' ? UI_UTIL_VISIBLE_SPACE_WIDTH - : font->widths[element->character - font->start_char]; + x += c == ' ' ? UI_UTIL_VISIBLE_SPACE_WIDTH : _char_width(font, element->character); x += horiz_space; element->target_y = y_offset; if (!update_position) { @@ -301,9 +307,9 @@ static void _set_alphabet_internal( // Switch to larger font for fewer characters if (len < 12) { - data->font = &font_password_11X12; + data->font = &font_password_12; } else { - data->font = &font_password_9X9; + data->font = &font_password_9; } size_t a = 0; @@ -425,7 +431,7 @@ component_t* trinary_input_char_create( } memset(component, 0, sizeof(component_t)); - data->font = &font_password_9X9; + data->font = &font_password_9; component->data = data; component->parent = parent; component->f = &_component_functions; diff --git a/src/ui/components/trinary_input_string.c b/src/ui/components/trinary_input_string.c index 43514f539f..2f82519e58 100644 --- a/src/ui/components/trinary_input_string.c +++ b/src/ui/components/trinary_input_string.c @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include #include @@ -47,7 +47,14 @@ static char _digits[] = "0123456789"; // after tuning the font. static char _special_chars[] = " !\"#$%&'()*+,-./:;<=>?^[\\]@_{|}"; -static const UG_FONT* _font = &font_password_11X12; +static const UG_FONT* _font = &font_password_12; + +static UG_U16 _char_width(char chr) +{ + UG_U16 width = 0; + UG_GetCharWidth(_font, (uint8_t)chr, &width); + return width; +} static void _get_bip39_word_stack(uint16_t idx, char* word_out, size_t word_out_size) { @@ -124,10 +131,10 @@ static UG_S16 _constant_string_width(const component_t* component) for (size_t i = 0; i <= data->string_index; i++) { if (i == data->string_index) { char chr = EMPTY_CHAR; - width += _font->widths[chr - _font->start_char]; + width += _char_width(chr); } else if (!data->hide) { char chr = data->string[i]; - width += _font->widths[chr - _font->start_char]; + width += _char_width(chr); } else { width += MASK_CHAR_WIDTH; } @@ -177,14 +184,14 @@ static void _render(component_t* component) } char chr; - uint8_t width; + UG_U16 width; if (i == data->string_index) { chr = EMPTY_CHAR; - width = _font->widths[chr - _font->start_char]; + width = _char_width(chr); } else if ((data->show_last_character && i == data->string_index - 1) || !data->hide) { // Show character (or only last entered character in if input is hidden). chr = data->string[i]; - width = _font->widths[chr - _font->start_char]; + width = _char_width(chr); } else { // ad-hoc encoding of the masked char, which will be drawn as a filled circle below. chr = '\0'; diff --git a/src/ui/fonts/arial_fonts.h b/src/ui/fonts/arial_fonts.h index e20ce06f2b..96ed04b1b2 100644 --- a/src/ui/fonts/arial_fonts.h +++ b/src/ui/fonts/arial_fonts.h @@ -3,12 +3,12 @@ #ifndef _ARIAL_FONTS_H_ #define _ARIAL_FONTS_H_ -#include "font_a_11X10.h" -#include "font_a_11X12.h" -#include "font_a_13X14.h" -#include "font_a_15X16.h" -#include "font_a_17X18.h" -#include "font_a_9X9.h" -#include "monogram_5X9.h" +#include "arial_11.h" +#include "arial_11_ugui.h" +#include "arial_12.h" +#include "arial_12_ugui.h" +#include "arial_9.h" +#include "arial_9_ugui.h" +#include "monogram_16_ugui.h" #endif diff --git a/src/ui/fonts/font_a_11X10.c b/src/ui/fonts/font_a_11X10.c deleted file mode 100644 index b64d465473..0000000000 --- a/src/ui/fonts/font_a_11X10.c +++ /dev/null @@ -1,107 +0,0 @@ -// Converted from font_a.ttf -// --size 11 -// --bpp 1 -// For copyright, see original font file. - -#include - -static UG_FONT_DATA unsigned char fontBits_font_a_11X10[95][20] = { - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x20 ' ' - {0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x21 '!' - {0x05,0x00,0x05,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x22 '"' - {0x14,0x00,0x14,0x00,0x1F,0x00,0x0A,0x00,0x0A,0x00,0x1F,0x00,0x05,0x00,0x05,0x00,0x00,0x00,0x00,0x00 }, // 0x23 '#' - {0x0E,0x00,0x15,0x00,0x05,0x00,0x0E,0x00,0x14,0x00,0x14,0x00,0x15,0x00,0x0E,0x00,0x04,0x00,0x00,0x00 }, // 0x24 '$' - {0x46,0x00,0x29,0x00,0x29,0x00,0x16,0x00,0xD0,0x00,0x28,0x01,0x28,0x01,0xC4,0x00,0x00,0x00,0x00,0x00 }, // 0x25 '%' - {0x0C,0x00,0x12,0x00,0x12,0x00,0x0C,0x00,0x0A,0x00,0x31,0x00,0x11,0x00,0x2E,0x00,0x00,0x00,0x00,0x00 }, // 0x26 '&' - {0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x27 ''' - {0x04,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x04,0x00 }, // 0x28 '(' - {0x01,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x01,0x00 }, // 0x29 ')' - {0x02,0x00,0x07,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x2A '*' - {0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x1F,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x2B '+' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00 }, // 0x2C ',' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x2D '-' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x2E '.' - {0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x2F '/' - {0x0E,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x30 '0' - {0x04,0x00,0x06,0x00,0x05,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x31 '1' - {0x0E,0x00,0x11,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x1F,0x00,0x00,0x00,0x00,0x00 }, // 0x32 '2' - {0x0E,0x00,0x11,0x00,0x10,0x00,0x0C,0x00,0x10,0x00,0x10,0x00,0x11,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x33 '3' - {0x08,0x00,0x0C,0x00,0x0A,0x00,0x0A,0x00,0x09,0x00,0x1F,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00 }, // 0x34 '4' - {0x1E,0x00,0x02,0x00,0x01,0x00,0x0F,0x00,0x10,0x00,0x10,0x00,0x11,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x35 '5' - {0x0E,0x00,0x11,0x00,0x01,0x00,0x0F,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x36 '6' - {0x1F,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x37 '7' - {0x0E,0x00,0x11,0x00,0x11,0x00,0x0E,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x38 '8' - {0x0E,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x1E,0x00,0x10,0x00,0x11,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x39 '9' - {0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x3A ':' - {0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00 }, // 0x3B ';' - {0x00,0x00,0x00,0x00,0x10,0x00,0x0E,0x00,0x01,0x00,0x0E,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x3C '<' - {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x3D '=' - {0x00,0x00,0x00,0x00,0x01,0x00,0x0E,0x00,0x10,0x00,0x0E,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x3E '>' - {0x0E,0x00,0x11,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x3F '?' - {0xF8,0x00,0x06,0x01,0xB2,0x02,0xC9,0x02,0x45,0x02,0x45,0x02,0x65,0x01,0xD9,0x00,0x02,0x02,0xFC,0x01 }, // 0x40 '@' - {0x08,0x00,0x14,0x00,0x14,0x00,0x14,0x00,0x22,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00 }, // 0x41 'A' - {0x1F,0x00,0x21,0x00,0x21,0x00,0x1F,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x1F,0x00,0x00,0x00,0x00,0x00 }, // 0x42 'B' - {0x1C,0x00,0x22,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00 }, // 0x43 'C' - {0x0F,0x00,0x11,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x11,0x00,0x0F,0x00,0x00,0x00,0x00,0x00 }, // 0x44 'D' - {0x1F,0x00,0x01,0x00,0x01,0x00,0x1F,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x1F,0x00,0x00,0x00,0x00,0x00 }, // 0x45 'E' - {0x1F,0x00,0x01,0x00,0x01,0x00,0x0F,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x46 'F' - {0x1C,0x00,0x22,0x00,0x41,0x00,0x01,0x00,0x71,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00 }, // 0x47 'G' - {0x21,0x00,0x21,0x00,0x21,0x00,0x3F,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x00,0x00,0x00,0x00 }, // 0x48 'H' - {0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x49 'I' - {0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x09,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x4A 'J' - {0x21,0x00,0x11,0x00,0x09,0x00,0x0D,0x00,0x0B,0x00,0x11,0x00,0x11,0x00,0x21,0x00,0x00,0x00,0x00,0x00 }, // 0x4B 'K' - {0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x1F,0x00,0x00,0x00,0x00,0x00 }, // 0x4C 'L' - {0x41,0x00,0x63,0x00,0x63,0x00,0x55,0x00,0x55,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x00,0x00,0x00,0x00 }, // 0x4D 'M' - {0x21,0x00,0x23,0x00,0x25,0x00,0x25,0x00,0x29,0x00,0x29,0x00,0x31,0x00,0x21,0x00,0x00,0x00,0x00,0x00 }, // 0x4E 'N' - {0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00 }, // 0x4F 'O' - {0x0F,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x0F,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x50 'P' - {0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x59,0x00,0x22,0x00,0x7C,0x00,0x00,0x00,0x00,0x00 }, // 0x51 'Q' - {0x1F,0x00,0x21,0x00,0x21,0x00,0x1F,0x00,0x09,0x00,0x11,0x00,0x11,0x00,0x21,0x00,0x00,0x00,0x00,0x00 }, // 0x52 'R' - {0x1E,0x00,0x21,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x20,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00 }, // 0x53 'S' - {0x1F,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x54 'T' - {0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00 }, // 0x55 'U' - {0x41,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00 }, // 0x56 'V' - {0x21,0x04,0x51,0x04,0x52,0x02,0x52,0x02,0x8a,0x02,0x8a,0x02,0x04,0x01,0x04,0x01,0x00,0x00,0x00,0x00 }, // 0x57 'W' - {0x21,0x00,0x12,0x00,0x12,0x00,0x0C,0x00,0x0C,0x00,0x12,0x00,0x12,0x00,0x21,0x00,0x00,0x00,0x00,0x00 }, // 0x58 'X' - {0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00 }, // 0x59 'Y' - {0x3E,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x3F,0x00,0x00,0x00,0x00,0x00 }, // 0x5A 'Z' - {0x03,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x03,0x00 }, // 0x5B '[' - {0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x5C '\' - {0x03,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x03,0x00 }, // 0x5D ']' - {0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x5E '^' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00 }, // 0x5F '_' - {0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x60 '`' - {0x00,0x00,0x00,0x00,0x0E,0x00,0x11,0x00,0x1E,0x00,0x11,0x00,0x19,0x00,0x17,0x00,0x00,0x00,0x00,0x00 }, // 0x61 'a' - {0x01,0x00,0x01,0x00,0x0D,0x00,0x13,0x00,0x11,0x00,0x11,0x00,0x13,0x00,0x0D,0x00,0x00,0x00,0x00,0x00 }, // 0x62 'b' - {0x00,0x00,0x00,0x00,0x0E,0x00,0x11,0x00,0x01,0x00,0x01,0x00,0x11,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x63 'c' - {0x10,0x00,0x10,0x00,0x16,0x00,0x19,0x00,0x11,0x00,0x11,0x00,0x19,0x00,0x16,0x00,0x00,0x00,0x00,0x00 }, // 0x64 'd' - {0x00,0x00,0x00,0x00,0x0E,0x00,0x11,0x00,0x1F,0x00,0x01,0x00,0x11,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x65 'e' - {0x04,0x00,0x02,0x00,0x07,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x66 'f' - {0x00,0x00,0x00,0x00,0x16,0x00,0x19,0x00,0x11,0x00,0x11,0x00,0x19,0x00,0x16,0x00,0x10,0x00,0x0F,0x00 }, // 0x67 'g' - {0x01,0x00,0x01,0x00,0x0D,0x00,0x13,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00 }, // 0x68 'h' - {0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x69 'i' - {0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x03,0x00,0x00,0x00 }, // 0x6A 'j' - {0x01,0x00,0x01,0x00,0x09,0x00,0x05,0x00,0x03,0x00,0x07,0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00 }, // 0x6B 'k' - {0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x6C 'l' - {0x00,0x00,0x00,0x00,0x3D,0x00,0x4B,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x00,0x00,0x00,0x00 }, // 0x6D 'm' - {0x00,0x00,0x00,0x00,0x0F,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00 }, // 0x6E 'n' - {0x00,0x00,0x00,0x00,0x0E,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x6F 'o' - {0x00,0x00,0x00,0x00,0x0D,0x00,0x13,0x00,0x11,0x00,0x11,0x00,0x13,0x00,0x0D,0x00,0x01,0x00,0x01,0x00 }, // 0x70 'p' - {0x00,0x00,0x00,0x00,0x16,0x00,0x19,0x00,0x11,0x00,0x11,0x00,0x19,0x00,0x16,0x00,0x10,0x00,0x10,0x00 }, // 0x71 'q' - {0x00,0x00,0x00,0x00,0x05,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x72 'r' - {0x00,0x00,0x00,0x00,0x0E,0x00,0x11,0x00,0x06,0x00,0x08,0x00,0x11,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x73 's' - {0x02,0x00,0x02,0x00,0x07,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x74 't' - {0x00,0x00,0x00,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x19,0x00,0x16,0x00,0x00,0x00,0x00,0x00 }, // 0x75 'u' - {0x00,0x00,0x00,0x00,0x11,0x00,0x11,0x00,0x0A,0x00,0x0A,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x76 'v' - {0x00,0x00,0x00,0x00,0x11,0x01,0x29,0x01,0xAA,0x00,0xAA,0x00,0x44,0x00,0x44,0x00,0x00,0x00,0x00,0x00 }, // 0x77 'w' - {0x00,0x00,0x00,0x00,0x11,0x00,0x0A,0x00,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x00,0x00,0x00,0x00 }, // 0x78 'x' - {0x00,0x00,0x00,0x00,0x11,0x00,0x11,0x00,0x0A,0x00,0x0A,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00 }, // 0x79 'y' - {0x00,0x00,0x00,0x00,0x1F,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x1F,0x00,0x00,0x00,0x00,0x00 }, // 0x7A 'z' - {0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00 }, // 0x7B '{' - {0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00 }, // 0x7C '|' - {0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00 }, // 0x7D '}' - {0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x0D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } // 0x7E '~' -}; -static UG_U8 fontWidths_font_a_11X10[] = { -3,2,4,6,6,10,7,2,4,4,4,6,3,4,3,3,6,6,6,6,6,6,6,6,6,6,3,3,6,6,6,6,11,8,7,7,7,6,6,8,7,2,5,7,6,8,7,8,6,8,7,7,6,7,8,11,7,8,7,3,3,3,5,6,4,6,6,6,6,6,4,6,6,2,3,5,2,8,6,6,6,6,4,6,4,6,6,10,6,6,6,4,2,4,6}; -const UG_FONT font_font_a_11X10 = { (unsigned char*)fontBits_font_a_11X10, FONT_TYPE_1BPP, 11, 10, 32, 126, fontWidths_font_a_11X10 }; diff --git a/src/ui/fonts/font_a_11X10.h b/src/ui/fonts/font_a_11X10.h deleted file mode 100644 index 2aeb83cf01..0000000000 --- a/src/ui/fonts/font_a_11X10.h +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#include - -extern const UG_FONT font_font_a_11X10; diff --git a/src/ui/fonts/font_a_11X12.c b/src/ui/fonts/font_a_11X12.c deleted file mode 100644 index eb17febcf6..0000000000 --- a/src/ui/fonts/font_a_11X12.c +++ /dev/null @@ -1,109 +0,0 @@ -// Converted from font_a.ttf -// --size 12 -// --dpi 72 -// --bpp 1 -// For copyright, see original font file. - -#include - -static UG_FONT_DATA unsigned char fontBits_font_a_11X12[95][24] = { - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x20 ' ' - {0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x21 '!' - {0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x22 '"' - {0x28, 0x00, 0x28, 0x00, 0x7F, 0x00, 0x14, 0x00, 0x14, 0x00, 0x7F, 0x00, 0x14, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x23 '#' - {0x1C, 0x00, 0x2A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x1C, 0x00, 0x28, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x24 '$' - {0x8C, 0x00, 0x52, 0x00, 0x52, 0x00, 0x32, 0x00, 0xAC, 0x01, 0x60, 0x02, 0x50, 0x02, 0x50, 0x02, 0x88, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x25 '%' - {0x18, 0x00, 0x24, 0x00, 0x24, 0x00, 0x14, 0x00, 0x0C, 0x00, 0x52, 0x00, 0x22, 0x00, 0x62, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x26 '&' - {0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x27 ''' - {0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00 }, // 0x28 '(' - {0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00 }, // 0x29 ')' - {0x04, 0x00, 0x1F, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2A '*' - {0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2B '+' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00 }, // 0x2C ',' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2D '-' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2E '.' - {0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2F '/' - {0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x30 '0' - {0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x31 '1' - {0x1C, 0x00, 0x22, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x32 '2' - {0x1C, 0x00, 0x22, 0x00, 0x20, 0x00, 0x20, 0x00, 0x18, 0x00, 0x20, 0x00, 0x20, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x33 '3' - {0x10, 0x00, 0x18, 0x00, 0x18, 0x00, 0x14, 0x00, 0x14, 0x00, 0x12, 0x00, 0x3E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x34 '4' - {0x3C, 0x00, 0x04, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x22, 0x00, 0x20, 0x00, 0x20, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x35 '5' - {0x1C, 0x00, 0x22, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x26, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x36 '6' - {0x3E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x37 '7' - {0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x38 '8' - {0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x39 '9' - {0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3A ':' - {0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00 }, // 0x3B ';' - {0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3C '<' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3D '=' - {0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3E '>' - {0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3F '?' - {0xE0, 0x01, 0x18, 0x06, 0x04, 0x04, 0x64, 0x09, 0x92, 0x09, 0x8A, 0x08, 0x8A, 0x08, 0x8A, 0x04, 0xF2, 0x03, 0x04, 0x08, 0x08, 0x06, 0xF0, 0x01 }, // 0x40 '@' - {0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x41 'A' - {0x3E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x42 'B' - {0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x43 'C' - {0x3E, 0x00, 0x42, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x42, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x44 'D' - {0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x45 'E' - {0x3E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x46 'F' - {0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x02, 0x00, 0xE2, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x47 'G' - {0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0xFE, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x48 'H' - {0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x49 'I' - {0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4A 'J' - {0x82, 0x00, 0x42, 0x00, 0x22, 0x00, 0x12, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x22, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4B 'K' - {0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4C 'L' - {0x82, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0x92, 0x00, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4D 'M' - {0x82, 0x00, 0x86, 0x00, 0x8A, 0x00, 0x8A, 0x00, 0x92, 0x00, 0xA2, 0x00, 0xA2, 0x00, 0xC2, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4E 'N' - {0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4F 'O' - {0x3E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x50 'P' - {0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0xB2, 0x00, 0x44, 0x00, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x51 'Q' - {0x7E, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x7E, 0x00, 0x22, 0x00, 0x42, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x52 'R' - {0x3C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x02, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x53 'S' - {0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x54 'T' - {0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x55 'U' - {0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x56 'V' - {0x21, 0x04, 0x51, 0x04, 0x51, 0x02, 0x52, 0x02, 0x8A, 0x02, 0x8A, 0x02, 0x8A, 0x02, 0x04, 0x01, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x57 'W' - {0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x58 'X' - {0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x59 'Y' - {0x7E, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x5A 'Z' - {0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00 }, // 0x5B '[' - {0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x5C '\' - {0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00 }, // 0x5D ']' - {0x04, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x5E '^' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00 }, // 0x5F '_' - {0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x60 '`' - {0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x20, 0x00, 0x3C, 0x00, 0x22, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x61 'a' - {0x02, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x26, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x26, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x62 'b' - {0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x63 'c' - {0x20, 0x00, 0x20, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x64 'd' - {0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x02, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x65 'e' - {0x0C, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x66 'f' - {0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x1E, 0x00, 0x00, 0x00 }, // 0x67 'g' - {0x02, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x26, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x68 'h' - {0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x69 'i' - {0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00 }, // 0x6A 'j' - {0x02, 0x00, 0x02, 0x00, 0x22, 0x00, 0x12, 0x00, 0x0A, 0x00, 0x0E, 0x00, 0x12, 0x00, 0x12, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6B 'k' - {0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6C 'l' - {0x00, 0x00, 0x00, 0x00, 0x9A, 0x01, 0x66, 0x02, 0x22, 0x02, 0x22, 0x02, 0x22, 0x02, 0x22, 0x02, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6D 'm' - {0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x26, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6E 'n' - {0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6F 'o' - {0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x26, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x26, 0x00, 0x1A, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00 }, // 0x70 'p' - {0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00 }, // 0x71 'q' - {0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x72 'r' - {0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x73 's' - {0x02, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x74 't' - {0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x75 'u' - {0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x76 'v' - {0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0x11, 0x01, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0x44, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x77 'w' - {0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x78 'x' - {0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00 }, // 0x79 'y' - {0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x7A 'z' - {0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00 }, // 0x7B '{' - {0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00 }, // 0x7C '|' - {0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00 }, // 0x7D '}' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } // 0x7E '~' -}; -static UG_U8 fontWidths_font_a_11X12[] = { - 3, 3, 4, 7, 7, 11, 8, 2, 4, 4, 5, 7, 3, 4, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 7, 7, 7, 7, 12, 7, 8, 9, 9, 8, 7, 9, 9, 3, 6, 8, 7, 9, 9, 9, 8, 9, 9, 8, 7, 9, 7, 11, 7, 7, 7, 3, 3, 3, 5, 7, 4, 7, 7, 6, 7, 7, 3, 7, 7, 3, 3, 6, 3, 11, 7, 7, 7, 7, 4, 7, 3, 7, 5, 9, 5, 5, 5, 4, 3, 4, 7 -}; -const UG_FONT font_font_a_11X12 = { (unsigned char *)fontBits_font_a_11X12, FONT_TYPE_1BPP, 11, 12, 32, 126, fontWidths_font_a_11X12 }; diff --git a/src/ui/fonts/font_a_11X12.h b/src/ui/fonts/font_a_11X12.h deleted file mode 100644 index cf5d959881..0000000000 --- a/src/ui/fonts/font_a_11X12.h +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#include - -extern const UG_FONT font_font_a_11X12; diff --git a/src/ui/fonts/font_a_13X14.c b/src/ui/fonts/font_a_13X14.c deleted file mode 100644 index 6925b311c3..0000000000 --- a/src/ui/fonts/font_a_13X14.c +++ /dev/null @@ -1,108 +0,0 @@ -// Converted from font_a.ttf -// --size 14 -// --dpi 72 -// --bpp 1 -// For copyright, see original font file. - -#include - -static UG_FONT_DATA unsigned char fontBits_font_a_13X14[95][28] = { - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x20 ' ' - {0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x21 '!' - {0x00,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x22 '"' - {0x00,0x00,0x48,0x00,0x48,0x00,0x24,0x00,0xFF,0x00,0x24,0x00,0x24,0x00,0xFF,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x23 '#' - {0x08,0x00,0x3C,0x00,0x4A,0x00,0x09,0x00,0x09,0x00,0x0E,0x00,0x38,0x00,0x48,0x00,0x48,0x00,0x29,0x00,0x1E,0x00,0x08,0x00,0x00,0x00,0x00,0x00 }, // 0x24 '$' - {0x00,0x00,0x0C,0x01,0x92,0x00,0x92,0x00,0x52,0x00,0x4C,0x00,0x20,0x03,0xA0,0x04,0x90,0x04,0x90,0x04,0x08,0x03,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x25 '%' - {0x00,0x00,0x38,0x00,0x44,0x00,0x44,0x00,0x24,0x00,0x18,0x00,0x14,0x00,0xA2,0x00,0x42,0x00,0xC2,0x00,0x3C,0x01,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x26 '&' - {0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x27 ''' - {0x00,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x08,0x00 }, // 0x28 '(' - {0x00,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x02,0x00 }, // 0x29 ')' - {0x00,0x00,0x04,0x00,0x1F,0x00,0x04,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x2A '*' - {0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0xFE,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x2B '+' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00 }, // 0x2C ',' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x2D '-' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x2E '.' - {0x00,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x2F '/' - {0x00,0x00,0x3C,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x30 '0' - {0x00,0x00,0x10,0x00,0x18,0x00,0x14,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x31 '1' - {0x00,0x00,0x3C,0x00,0x42,0x00,0x42,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x32 '2' - {0x00,0x00,0x3C,0x00,0x42,0x00,0x42,0x00,0x40,0x00,0x38,0x00,0x40,0x00,0x40,0x00,0x42,0x00,0x42,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x33 '3' - {0x00,0x00,0x20,0x00,0x30,0x00,0x28,0x00,0x24,0x00,0x24,0x00,0x22,0x00,0x21,0x00,0x7F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x34 '4' - {0x00,0x00,0x7C,0x00,0x04,0x00,0x02,0x00,0x3E,0x00,0x42,0x00,0x40,0x00,0x40,0x00,0x42,0x00,0x22,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x35 '5' - {0x00,0x00,0x38,0x00,0x44,0x00,0x02,0x00,0x02,0x00,0x3A,0x00,0x46,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x36 '6' - {0x00,0x00,0x7E,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x37 '7' - {0x00,0x00,0x3C,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3C,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x38 '8' - {0x00,0x00,0x3C,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x62,0x00,0x5C,0x00,0x40,0x00,0x40,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x39 '9' - {0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x3A ':' - {0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00 }, // 0x3B ';' - {0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x02,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x3C '<' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x3D '=' - {0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x3E '>' - {0x00,0x00,0x3C,0x00,0x42,0x00,0x42,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x3F '?' - {0x00,0x00,0xF0,0x03,0x0C,0x04,0x02,0x08,0xE2,0x12,0x11,0x13,0x09,0x12,0x09,0x11,0x09,0x09,0x89,0x09,0x72,0x07,0x02,0x10,0x0C,0x0C,0xF0,0x03 }, // 0x40 '@' - {0x00,0x00,0x10,0x00,0x28,0x00,0x28,0x00,0x28,0x00,0x44,0x00,0x44,0x00,0xFE,0x00,0x82,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x41 'A' - {0x00,0x00,0x7E,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7E,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x42 'B' - {0x00,0x00,0x78,0x00,0x84,0x00,0x02,0x01,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x01,0x84,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x43 'C' - {0x00,0x00,0x7E,0x00,0x82,0x00,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x82,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x44 'D' - {0x00,0x00,0xFE,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xFE,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x45 'E' - {0x00,0x00,0xFE,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x7E,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x46 'F' - {0x00,0x00,0xF8,0x00,0x04,0x01,0x02,0x02,0x02,0x00,0x02,0x00,0xC2,0x03,0x02,0x02,0x02,0x02,0x04,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x47 'G' - {0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xFE,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x48 'H' - {0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x49 'I' - {0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x11,0x00,0x11,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x4A 'J' - {0x00,0x00,0x02,0x01,0x82,0x00,0x42,0x00,0x22,0x00,0x12,0x00,0x2A,0x00,0x46,0x00,0x42,0x00,0x82,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x4B 'K' - {0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x4C 'L' - {0x00,0x00,0x02,0x02,0x06,0x03,0x06,0x03,0x8A,0x02,0x8A,0x02,0x52,0x02,0x52,0x02,0x52,0x02,0x22,0x02,0x22,0x02,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x4D 'M' - {0x00,0x00,0x82,0x00,0x86,0x00,0x8A,0x00,0x8A,0x00,0x92,0x00,0x92,0x00,0xA2,0x00,0xA2,0x00,0xC2,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x4E 'N' - {0x00,0x00,0xF8,0x00,0x04,0x01,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x04,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x4F 'O' - {0x00,0x00,0x7E,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7E,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x50 'P' - {0x00,0x00,0xF8,0x00,0x04,0x01,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x01,0x84,0x01,0x78,0x03,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x51 'Q' - {0x00,0x00,0xFE,0x00,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0xFE,0x00,0x22,0x00,0x42,0x00,0x82,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x52 'R' - {0x00,0x00,0x7C,0x00,0x82,0x00,0x82,0x00,0x02,0x00,0x1C,0x00,0xE0,0x00,0x80,0x00,0x82,0x00,0x82,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x53 'S' - {0x00,0x00,0xFE,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x54 'T' - {0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x44,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x55 'U' - {0x00,0x00,0x01,0x01,0x01,0x01,0x82,0x00,0x82,0x00,0x44,0x00,0x44,0x00,0x28,0x00,0x28,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x56 'V' - {0x00,0x00,0x41,0x10,0xA1,0x10,0xA2,0x08,0xA2,0x08,0xA2,0x08,0x14,0x05,0x14,0x05,0x14,0x05,0x08,0x02,0x08,0x02,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x57 'W' - {0x00,0x00,0x81,0x00,0x42,0x00,0x42,0x00,0x24,0x00,0x18,0x00,0x18,0x00,0x24,0x00,0x42,0x00,0x42,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x58 'X' - {0x00,0x00,0x01,0x01,0x82,0x00,0x44,0x00,0x44,0x00,0x28,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x59 'Y' - {0x00,0x00,0xFE,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x5A 'Z' - {0x00,0x00,0x06,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x06,0x00 }, // 0x5B '[' - {0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x5C '\' - {0x00,0x00,0x06,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x06,0x00 }, // 0x5D ']' - {0x00,0x00,0x04,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x5E '^' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00 }, // 0x5F '_' - {0x00,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x60 '`' - {0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x42,0x00,0x40,0x00,0x78,0x00,0x44,0x00,0x42,0x00,0x62,0x00,0x5C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x61 'a' - {0x00,0x00,0x02,0x00,0x02,0x00,0x3A,0x00,0x46,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x46,0x00,0x3A,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x62 'b' - {0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x63 'c' - {0x00,0x00,0x40,0x00,0x40,0x00,0x5C,0x00,0x62,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x62,0x00,0x5C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x64 'd' - {0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x42,0x00,0x42,0x00,0x7E,0x00,0x02,0x00,0x02,0x00,0x42,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x65 'e' - {0x00,0x00,0x0C,0x00,0x02,0x00,0x0F,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x66 'f' - {0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x62,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x62,0x00,0x5C,0x00,0x40,0x00,0x42,0x00,0x3C,0x00 }, // 0x67 'g' - {0x00,0x00,0x02,0x00,0x02,0x00,0x3A,0x00,0x46,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x68 'h' - {0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x69 'i' - {0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x01,0x00 }, // 0x6A 'j' - {0x00,0x00,0x02,0x00,0x02,0x00,0x42,0x00,0x22,0x00,0x12,0x00,0x0A,0x00,0x16,0x00,0x22,0x00,0x22,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x6B 'k' - {0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x6C 'l' - {0x00,0x00,0x00,0x00,0x00,0x00,0xDA,0x01,0x66,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x6D 'm' - {0x00,0x00,0x00,0x00,0x00,0x00,0x3A,0x00,0x46,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x6E 'n' - {0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x6F 'o' - {0x00,0x00,0x00,0x00,0x00,0x00,0x3A,0x00,0x46,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x46,0x00,0x3A,0x00,0x02,0x00,0x02,0x00,0x02,0x00 }, // 0x70 'p' - {0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x62,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x62,0x00,0x5C,0x00,0x40,0x00,0x40,0x00,0x40,0x00 }, // 0x71 'q' - {0x00,0x00,0x00,0x00,0x00,0x00,0x1A,0x00,0x06,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x72 'r' - {0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x02,0x00,0x1C,0x00,0x20,0x00,0x20,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x73 's' - {0x00,0x00,0x02,0x00,0x02,0x00,0x0F,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x74 't' - {0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x62,0x00,0x5C,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x75 'u' - {0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x76 'v' - {0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x01,0x11,0x01,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0x44,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x77 'w' - {0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x12,0x00,0x12,0x00,0x0C,0x00,0x0C,0x00,0x12,0x00,0x12,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x78 'x' - {0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x06,0x00 }, // 0x79 'y' - {0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x7A 'z' - {0x00,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x08,0x00 }, // 0x7B '{' - {0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00 }, // 0x7C '|' - {0x00,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00 }, // 0x7D '}' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4E,0x00,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } // 0x7E '~' -}; -static UG_U8 fontWidths_font_a_13X14[] = { -4,5,5,8,8,12,9,3,5,5,5,8,4,5,4,4,8,8,8,8,8,8,8,8,8,8,4,4,8,8,8,8,14,9,9,10,10,9,9,11,9,3,6,9,8,11,9,11,9,11,10,9,9,9,9,13,8,9,8,4,4,4,5,8,5,8,8,7,8,8,4,8,8,3,3,7,3,11,8,8,8,8,5,7,4,8,7,9,6,7,6,5,3,5,8}; -const UG_FONT font_font_a_13X14 = { (unsigned char*)fontBits_font_a_13X14, FONT_TYPE_1BPP, 13, 14, 32, 126, fontWidths_font_a_13X14 }; diff --git a/src/ui/fonts/font_a_13X14.h b/src/ui/fonts/font_a_13X14.h deleted file mode 100644 index 7e3d78e990..0000000000 --- a/src/ui/fonts/font_a_13X14.h +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#include - -extern const UG_FONT font_font_a_13X14; diff --git a/src/ui/fonts/font_a_15X16.c b/src/ui/fonts/font_a_15X16.c deleted file mode 100644 index 1f8bea3f70..0000000000 --- a/src/ui/fonts/font_a_15X16.c +++ /dev/null @@ -1,109 +0,0 @@ -// Converted from font_a.ttf -// --size 16 -// --dpi 72 -// --bpp 1 -// For copyright, see original font file. - -#include - -static UG_FONT_DATA unsigned char fontBits_font_a_15X16[95][32] = { - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x20 ' ' - {0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x21 '!' - {0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x22 '"' - {0x00, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x44, 0x00, 0xFF, 0x01, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0xFF, 0x01, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x23 '#' - {0x10, 0x00, 0x78, 0x00, 0x94, 0x00, 0x92, 0x00, 0x12, 0x00, 0x12, 0x00, 0x1C, 0x00, 0x70, 0x00, 0x90, 0x00, 0x90, 0x00, 0x92, 0x00, 0x54, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x24 '$' - {0x00, 0x00, 0x1C, 0x02, 0x22, 0x01, 0x22, 0x01, 0xA2, 0x00, 0xA2, 0x00, 0x9C, 0x00, 0x40, 0x0E, 0x40, 0x11, 0x20, 0x11, 0x20, 0x11, 0x10, 0x11, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x25 '%' - {0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, 0x18, 0x00, 0x14, 0x00, 0x22, 0x02, 0x42, 0x01, 0x82, 0x00, 0x44, 0x01, 0x38, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x26 '&' - {0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x27 ''' - {0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00 }, // 0x28 '(' - {0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00 }, // 0x29 ')' - {0x00, 0x00, 0x04, 0x00, 0x1F, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2A '*' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xFE, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2B '+' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00 }, // 0x2C ',' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2D '-' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2E '.' - {0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2F '/' - {0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x30 '0' - {0x00, 0x00, 0x20, 0x00, 0x30, 0x00, 0x28, 0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x31 '1' - {0x00, 0x00, 0x78, 0x00, 0x44, 0x00, 0x82, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x32 '2' - {0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x42, 0x00, 0x40, 0x00, 0x60, 0x00, 0x38, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x82, 0x00, 0x46, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x33 '3' - {0x00, 0x00, 0x40, 0x00, 0x60, 0x00, 0x50, 0x00, 0x48, 0x00, 0x48, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0xFF, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x34 '4' - {0x00, 0x00, 0xFC, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x3E, 0x00, 0x42, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x35 '5' - {0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x02, 0x00, 0x3A, 0x00, 0x46, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x36 '6' - {0x00, 0x00, 0xFC, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x37 '7' - {0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x38 '8' - {0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0xC4, 0x00, 0xB8, 0x00, 0x80, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x39 '9' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3A ':' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00 }, // 0x3B ';' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x70, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x70, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3C '<' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3D '=' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x80, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3E '>' - {0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3F '?' - {0x00, 0x00, 0xC0, 0x0F, 0x30, 0x30, 0x08, 0x40, 0x84, 0x4B, 0x44, 0x8C, 0x22, 0x88, 0x12, 0x88, 0x12, 0x84, 0x12, 0x84, 0x12, 0x44, 0x22, 0x26, 0xC4, 0x1D, 0x08, 0x80, 0x30, 0x60, 0xC0, 0x1F }, // 0x40 '@' - {0x00, 0x00, 0x20, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0xFC, 0x01, 0x04, 0x01, 0x04, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x41 'A' - {0x00, 0x00, 0xFE, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0xFE, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x42 'B' - {0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x04, 0x04, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x04, 0x08, 0x02, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x43 'C' - {0x00, 0x00, 0xFE, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x02, 0x02, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x44 'D' - {0x00, 0x00, 0xFE, 0x03, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xFE, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x45 'E' - {0x00, 0x00, 0xFE, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xFE, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x46 'F' - {0x00, 0x00, 0xF0, 0x00, 0x08, 0x01, 0x04, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xC2, 0x07, 0x02, 0x04, 0x02, 0x04, 0x04, 0x02, 0x08, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x47 'G' - {0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0xFE, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x48 'H' - {0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x49 'I' - {0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4A 'J' - {0x00, 0x00, 0x02, 0x02, 0x02, 0x01, 0x82, 0x00, 0x42, 0x00, 0x22, 0x00, 0x32, 0x00, 0x2A, 0x00, 0x46, 0x00, 0x82, 0x00, 0x82, 0x00, 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4B 'K' - {0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4C 'L' - {0x00, 0x00, 0x02, 0x08, 0x06, 0x0C, 0x06, 0x0C, 0x0A, 0x0A, 0x0A, 0x0A, 0x12, 0x09, 0x12, 0x09, 0xA2, 0x08, 0xA2, 0x08, 0xA2, 0x08, 0x42, 0x08, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4D 'M' - {0x00, 0x00, 0x02, 0x02, 0x06, 0x02, 0x0A, 0x02, 0x0A, 0x02, 0x12, 0x02, 0x22, 0x02, 0x22, 0x02, 0x42, 0x02, 0x82, 0x02, 0x82, 0x02, 0x02, 0x03, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4E 'N' - {0x00, 0x00, 0xF0, 0x00, 0x08, 0x01, 0x04, 0x02, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x04, 0x02, 0x08, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4F 'O' - {0x00, 0x00, 0xFE, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0xFE, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x50 'P' - {0x00, 0x00, 0xF0, 0x00, 0x08, 0x01, 0x04, 0x02, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0xC4, 0x06, 0x08, 0x03, 0xF0, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x51 'Q' - {0x00, 0x00, 0xFE, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0xFE, 0x00, 0x42, 0x00, 0x82, 0x00, 0x82, 0x00, 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x52 'R' - {0x00, 0x00, 0xF8, 0x00, 0x04, 0x01, 0x02, 0x02, 0x02, 0x00, 0x04, 0x00, 0x38, 0x00, 0xC0, 0x01, 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x04, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x53 'S' - {0x00, 0x00, 0xFF, 0x01, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x54 'T' - {0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x55 'U' - {0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x50, 0x00, 0x50, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x56 'V' - {0x00, 0x00, 0x81, 0x40, 0x41, 0x41, 0x42, 0x21, 0x42, 0x21, 0x22, 0x22, 0x22, 0x22, 0x24, 0x12, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x57 'W' - {0x00, 0x00, 0x02, 0x02, 0x04, 0x01, 0x88, 0x00, 0x88, 0x00, 0x50, 0x00, 0x20, 0x00, 0x50, 0x00, 0x88, 0x00, 0x88, 0x00, 0x04, 0x01, 0x02, 0x02, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x58 'X' - {0x00, 0x00, 0x01, 0x01, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x59 'Y' - {0x00, 0x00, 0xFE, 0x01, 0x80, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x5A 'Z' - {0x00, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0E, 0x00 }, // 0x5B '[' - {0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x5C '\' - {0x00, 0x00, 0x07, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x07, 0x00 }, // 0x5D ']' - {0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x5E '^' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01 }, // 0x5F '_' - {0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x60 '`' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0x82, 0x00, 0xE0, 0x00, 0x9C, 0x00, 0x82, 0x00, 0x82, 0x00, 0xC2, 0x00, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x61 'a' - {0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3A, 0x00, 0x46, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x46, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x62 'b' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x63 'c' - {0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xB8, 0x00, 0xC4, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0xC4, 0x00, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x64 'd' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0xFE, 0x00, 0x02, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x65 'e' - {0x00, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0F, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x66 'f' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x00, 0xC4, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0xC4, 0x00, 0xB8, 0x00, 0x80, 0x00, 0x42, 0x00, 0x3C, 0x00 }, // 0x67 'g' - {0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3A, 0x00, 0x46, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x68 'h' - {0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x69 'i' - {0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00 }, // 0x6A 'j' - {0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x82, 0x00, 0x42, 0x00, 0x22, 0x00, 0x12, 0x00, 0x1A, 0x00, 0x26, 0x00, 0x22, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6B 'k' - {0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6C 'l' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x07, 0xC6, 0x08, 0x42, 0x08, 0x42, 0x08, 0x42, 0x08, 0x42, 0x08, 0x42, 0x08, 0x42, 0x08, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6D 'm' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x46, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6E 'n' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6F 'o' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x46, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x46, 0x00, 0x3A, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00 }, // 0x70 'p' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x00, 0xC4, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0xC4, 0x00, 0xB8, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00 }, // 0x71 'q' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x72 'r' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x73 's' - {0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0F, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x74 't' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x62, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x75 'u' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x76 'v' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x04, 0x21, 0x04, 0x52, 0x02, 0x52, 0x02, 0x8A, 0x02, 0x8A, 0x02, 0x8A, 0x02, 0x04, 0x01, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x77 'w' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x78 'x' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x21, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x00, 0x06, 0x00 }, // 0x79 'y' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x7A 'z' - {0x00, 0x00, 0x18, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x18, 0x00 }, // 0x7B '{' - {0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00 }, // 0x7C '|' - {0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x18, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00 }, // 0x7D '}' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } // 0x7E '~' -}; -static UG_U8 fontWidths_font_a_15X16[] = { - 4, 5, 6, 9, 9, 14, 11, 3, 5, 5, 6, 9, 4, 5, 4, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 4, 9, 9, 9, 9, 16, 11, 11, 12, 12, 11, 10, 12, 11, 3, 8, 11, 9, 13, 11, 12, 11, 12, 11, 11, 9, 11, 11, 15, 11, 9, 9, 4, 4, 4, 7, 9, 5, 9, 9, 8, 9, 9, 4, 9, 8, 4, 3, 8, 3, 13, 8, 9, 9, 9, 5, 8, 4, 8, 7, 11, 7, 7, 7, 5, 3, 5, 9 -}; -const UG_FONT font_font_a_15X16 = { (unsigned char *)fontBits_font_a_15X16, FONT_TYPE_1BPP, 15, 16, 32, 126, fontWidths_font_a_15X16 }; diff --git a/src/ui/fonts/font_a_15X16.h b/src/ui/fonts/font_a_15X16.h deleted file mode 100644 index 53e44d309b..0000000000 --- a/src/ui/fonts/font_a_15X16.h +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#include - -extern const UG_FONT font_font_a_15X16; diff --git a/src/ui/fonts/font_a_17X18.c b/src/ui/fonts/font_a_17X18.c deleted file mode 100644 index 1e9f150454..0000000000 --- a/src/ui/fonts/font_a_17X18.c +++ /dev/null @@ -1,109 +0,0 @@ -// Converted from font_a.ttf -// --size 18 -// --dpi 72 -// --bpp 1 -// For copyright, see original font file. - -#include - -static UG_FONT_DATA unsigned char fontBits_font_a_17X18[95][54] = { - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x20 ' ' - {0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x21 '!' - {0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x22 '"' - {0x00, 0x00, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x98, 0x01, 0x00, 0xFF, 0x07, 0x00, 0xFF, 0x07, 0x00, 0x98, 0x01, 0x00, 0xDC, 0x01, 0x00, 0xCC, 0x00, 0x00, 0xFF, 0x07, 0x00, 0xFF, 0x07, 0x00, 0xCC, 0x00, 0x00, 0x66, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x23 '#' - {0x20, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x26, 0x03, 0x00, 0x26, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x01, 0x00, 0xE0, 0x03, 0x00, 0x20, 0x03, 0x00, 0x26, 0x03, 0x00, 0xAE, 0x03, 0x00, 0xFC, 0x01, 0x00, 0xF8, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x24 '$' - {0x00, 0x00, 0x00, 0x3C, 0x0C, 0x00, 0x66, 0x06, 0x00, 0x66, 0x06, 0x00, 0x66, 0x03, 0x00, 0x66, 0x03, 0x00, 0xE6, 0x03, 0x00, 0xBC, 0x3D, 0x00, 0x80, 0x67, 0x00, 0xC0, 0x66, 0x00, 0xC0, 0x66, 0x00, 0x60, 0x66, 0x00, 0x60, 0x66, 0x00, 0x30, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x25 '%' - {0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x98, 0x01, 0x00, 0x98, 0x01, 0x00, 0xD8, 0x00, 0x00, 0x70, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x6C, 0x06, 0x00, 0xC6, 0x06, 0x00, 0x86, 0x03, 0x00, 0x8E, 0x03, 0x00, 0xFC, 0x07, 0x00, 0x78, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x26 '&' - {0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x27 ''' - {0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00 }, // 0x28 '(' - {0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00 }, // 0x29 ')' - {0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2A '*' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0xFE, 0x07, 0x00, 0xFE, 0x07, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2B '+' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2C ',' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2D '-' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2E '.' - {0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2F '/' - {0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xCE, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0xCE, 0x01, 0x00, 0xFC, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x30 '0' - {0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70, 0x00, 0x00, 0x78, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x64, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x31 '1' - {0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xCE, 0x01, 0x00, 0x86, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xFE, 0x01, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x32 '2' - {0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xC6, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x70, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0xFC, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x33 '3' - {0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x00, 0x00, 0x78, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x66, 0x00, 0x00, 0x63, 0x00, 0x00, 0xFF, 0x01, 0x00, 0xFF, 0x01, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x34 '4' - {0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x76, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x86, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0xFC, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x35 '5' - {0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x76, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x8E, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x8C, 0x01, 0x00, 0xFC, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x36 '6' - {0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0xFE, 0x01, 0x00, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x38, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x37 '7' - {0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0xFC, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x38 '8' - {0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0xC6, 0x01, 0x00, 0xFC, 0x01, 0x00, 0xB8, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0xC6, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x39 '9' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3A ':' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3B ';' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x03, 0x00, 0xF0, 0x01, 0x00, 0x3C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x80, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3C '<' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3D '=' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x03, 0x00, 0xE0, 0x01, 0x00, 0x7C, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3E '>' - {0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xCE, 0x01, 0x00, 0x86, 0x01, 0x00, 0x80, 0x01, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3F '?' - {0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0xE0, 0x7F, 0x00, 0x70, 0xE0, 0x00, 0x18, 0xF7, 0x01, 0x8C, 0xBF, 0x03, 0xCC, 0x1C, 0x03, 0xE6, 0x18, 0x03, 0x66, 0x18, 0x03, 0x66, 0x08, 0x03, 0x66, 0x8C, 0x01, 0xE6, 0xCC, 0x01, 0xC6, 0xFF, 0x00, 0xCC, 0x3D, 0x00, 0x1C, 0x80, 0x03, 0x78, 0xC0, 0x01, 0xF0, 0xFF, 0x00, 0xC0, 0x3F, 0x00 }, // 0x40 '@' - {0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x00, 0x00, 0xD8, 0x00, 0x00, 0xD8, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x8C, 0x01, 0x00, 0xFC, 0x01, 0x00, 0xFE, 0x03, 0x00, 0x06, 0x03, 0x00, 0x06, 0x03, 0x00, 0x03, 0x06, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x41 'A' - {0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0xFE, 0x03, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0xFE, 0x03, 0x00, 0xFE, 0x03, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x06, 0x07, 0x00, 0xFE, 0x03, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x42 'B' - {0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0xF8, 0x07, 0x00, 0x1C, 0x0E, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x06, 0x00, 0xF8, 0x07, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x43 'C' - {0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0xFE, 0x03, 0x00, 0x06, 0x07, 0x00, 0x06, 0x0E, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x06, 0x00, 0x06, 0x07, 0x00, 0xFE, 0x03, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x44 'D' - {0x00, 0x00, 0x00, 0xFE, 0x07, 0x00, 0xFE, 0x07, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0xFE, 0x03, 0x00, 0xFE, 0x03, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0xFE, 0x07, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x45 'E' - {0x00, 0x00, 0x00, 0xFE, 0x03, 0x00, 0xFE, 0x03, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0xFE, 0x01, 0x00, 0xFE, 0x01, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x46 'F' - {0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0xF8, 0x0F, 0x00, 0x1C, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x86, 0x1F, 0x00, 0x86, 0x1F, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x1C, 0x1C, 0x00, 0xF8, 0x0F, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x47 'G' - {0x00, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0xFE, 0x0F, 0x00, 0xFE, 0x0F, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x48 'H' - {0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x49 'I' - {0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC6, 0x00, 0x00, 0xC6, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4A 'J' - {0x00, 0x00, 0x00, 0x06, 0x07, 0x00, 0x86, 0x03, 0x00, 0xC6, 0x01, 0x00, 0xE6, 0x00, 0x00, 0x76, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xEE, 0x00, 0x00, 0xC6, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x03, 0x00, 0x06, 0x07, 0x00, 0x06, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4B 'K' - {0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0xFE, 0x01, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4C 'L' - {0x00, 0x00, 0x00, 0x0E, 0x38, 0x00, 0x1E, 0x3C, 0x00, 0x1E, 0x3C, 0x00, 0x1E, 0x3C, 0x00, 0x36, 0x36, 0x00, 0x36, 0x36, 0x00, 0x36, 0x36, 0x00, 0x26, 0x32, 0x00, 0x66, 0x33, 0x00, 0x66, 0x33, 0x00, 0x66, 0x33, 0x00, 0xC6, 0x31, 0x00, 0xC6, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4D 'M' - {0x00, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x0E, 0x0C, 0x00, 0x1E, 0x0C, 0x00, 0x1E, 0x0C, 0x00, 0x36, 0x0C, 0x00, 0x66, 0x0C, 0x00, 0xE6, 0x0C, 0x00, 0xC6, 0x0C, 0x00, 0x86, 0x0D, 0x00, 0x06, 0x0F, 0x00, 0x06, 0x0F, 0x00, 0x06, 0x0E, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4E 'N' - {0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0xF8, 0x07, 0x00, 0x1C, 0x0E, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x0E, 0x00, 0xF8, 0x07, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4F 'O' - {0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0xFE, 0x03, 0x00, 0x06, 0x07, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x06, 0x07, 0x00, 0xFE, 0x03, 0x00, 0xFE, 0x01, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x50 'P' - {0x00, 0x00, 0x00, 0xF0, 0x03, 0x00, 0xF8, 0x07, 0x00, 0x1C, 0x0E, 0x00, 0x0C, 0x1C, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x8C, 0x0D, 0x00, 0x1C, 0x07, 0x00, 0xF8, 0x07, 0x00, 0xF0, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x51 'Q' - {0x00, 0x00, 0x00, 0xFE, 0x03, 0x00, 0xFE, 0x07, 0x00, 0x06, 0x0E, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0E, 0x00, 0xFE, 0x07, 0x00, 0xFE, 0x03, 0x00, 0x86, 0x01, 0x00, 0x86, 0x03, 0x00, 0x06, 0x07, 0x00, 0x06, 0x06, 0x00, 0x06, 0x0E, 0x00, 0x06, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x52 'R' - {0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0xFC, 0x03, 0x00, 0x0E, 0x07, 0x00, 0x06, 0x06, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF8, 0x01, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x06, 0x00, 0x06, 0x06, 0x00, 0x0E, 0x07, 0x00, 0xFC, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x53 'S' - {0x00, 0x00, 0x00, 0xFE, 0x07, 0x00, 0xFE, 0x07, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x54 'T' - {0x00, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x0E, 0x06, 0x00, 0xFC, 0x07, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x55 'U' - {0x00, 0x00, 0x00, 0x03, 0x06, 0x00, 0x03, 0x06, 0x00, 0x06, 0x03, 0x00, 0x06, 0x03, 0x00, 0x06, 0x03, 0x00, 0x8C, 0x01, 0x00, 0x8C, 0x01, 0x00, 0x8C, 0x01, 0x00, 0xD8, 0x00, 0x00, 0xD8, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x56 'V' - {0x00, 0x00, 0x00, 0x83, 0x83, 0x01, 0x83, 0x83, 0x01, 0xC6, 0xC6, 0x00, 0xC6, 0xC6, 0x00, 0xC6, 0xC6, 0x00, 0xC6, 0xC6, 0x00, 0x46, 0xC4, 0x00, 0x6C, 0x6C, 0x00, 0x6C, 0x6C, 0x00, 0x6C, 0x6C, 0x00, 0x6C, 0x6C, 0x00, 0x38, 0x38, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x57 'W' - {0x00, 0x00, 0x00, 0x8E, 0x03, 0x00, 0x8C, 0x01, 0x00, 0xD8, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x00, 0x00, 0xD8, 0x00, 0x00, 0xD8, 0x00, 0x00, 0xDC, 0x01, 0x00, 0x8C, 0x01, 0x00, 0x06, 0x03, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x58 'X' - {0x00, 0x00, 0x00, 0x07, 0x0E, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x03, 0x00, 0x9C, 0x03, 0x00, 0x98, 0x01, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x59 'Y' - {0x00, 0x00, 0x00, 0xFE, 0x03, 0x00, 0xFE, 0x03, 0x00, 0x80, 0x01, 0x00, 0xC0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0xFF, 0x03, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x5A 'Z' - {0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00 }, // 0x5B '[' - {0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x5C '\' - {0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x00, 0x00 }, // 0x5D ']' - {0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x14, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x22, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x5E '^' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0xFF, 0x03, 0x00 }, // 0x5F '_' - {0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x60 '`' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x86, 0x01, 0x00, 0xE0, 0x01, 0x00, 0xFC, 0x01, 0x00, 0x9E, 0x01, 0x00, 0x86, 0x01, 0x00, 0xC6, 0x01, 0x00, 0xFE, 0x01, 0x00, 0xBC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x61 'a' - {0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x76, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xCE, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0xCE, 0x01, 0x00, 0xFE, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x62 'b' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0xCE, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x63 'c' - {0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0xB8, 0x01, 0x00, 0xFC, 0x01, 0x00, 0xCE, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0xCE, 0x01, 0x00, 0xFC, 0x01, 0x00, 0xB8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x64 'd' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x86, 0x01, 0x00, 0xFE, 0x01, 0x00, 0xFE, 0x01, 0x00, 0x06, 0x00, 0x00, 0x8E, 0x01, 0x00, 0xFC, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x65 'e' - {0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x66 'f' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x01, 0x00, 0xFC, 0x01, 0x00, 0xCE, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0xCE, 0x01, 0x00, 0xFC, 0x01, 0x00, 0xB8, 0x01, 0x00, 0x80, 0x01, 0x00, 0xC6, 0x01, 0x00, 0xFE, 0x00, 0x00, 0x7C, 0x00, 0x00 }, // 0x67 'g' - {0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0xF6, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x8E, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x68 'h' - {0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x69 'i' - {0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0x00, 0x00 }, // 0x6A 'j' - {0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0xC6, 0x01, 0x00, 0xE6, 0x00, 0x00, 0x76, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x36, 0x00, 0x00, 0x66, 0x00, 0x00, 0x66, 0x00, 0x00, 0xC6, 0x00, 0x00, 0xC6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6B 'k' - {0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6C 'l' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x0E, 0x00, 0x7E, 0x1F, 0x00, 0xCE, 0x19, 0x00, 0xC6, 0x18, 0x00, 0xC6, 0x18, 0x00, 0xC6, 0x18, 0x00, 0xC6, 0x18, 0x00, 0xC6, 0x18, 0x00, 0xC6, 0x18, 0x00, 0xC6, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6D 'm' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x8E, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6E 'n' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xCE, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0xCE, 0x01, 0x00, 0xFC, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6F 'o' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xCE, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0xCE, 0x01, 0x00, 0xFE, 0x00, 0x00, 0x76, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00 }, // 0x70 'p' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x01, 0x00, 0xFC, 0x01, 0x00, 0xCE, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0xCE, 0x01, 0x00, 0xFC, 0x01, 0x00, 0xB8, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00 }, // 0x71 'q' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x72 'r' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xC6, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xC6, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x73 's' - {0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x74 't' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0x86, 0x01, 0x00, 0xC6, 0x01, 0x00, 0xFE, 0x01, 0x00, 0xBC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x75 'u' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x01, 0x00, 0x83, 0x01, 0x00, 0xC6, 0x00, 0x00, 0xC6, 0x00, 0x00, 0xC6, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x76 'v' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x18, 0x00, 0xE3, 0x18, 0x00, 0xE3, 0x18, 0x00, 0xA6, 0x0C, 0x00, 0xB6, 0x0D, 0x00, 0xB6, 0x0D, 0x00, 0x14, 0x05, 0x00, 0x1C, 0x07, 0x00, 0x1C, 0x07, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x77 'w' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x00, 0x00, 0x66, 0x00, 0x00, 0x66, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x66, 0x00, 0x00, 0x66, 0x00, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x78 'x' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x01, 0x00, 0x83, 0x01, 0x00, 0xC6, 0x00, 0x00, 0xC6, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0E, 0x00, 0x00 }, // 0x79 'y' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x38, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x7A 'z' - {0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x38, 0x00, 0x00 }, // 0x7B '{' - {0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00 }, // 0x7C '|' - {0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x00, 0x00 }, // 0x7D '}' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x3F, 0x02, 0x00, 0xF1, 0x03, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } // 0x7E '~' -}; -static UG_U8 fontWidths_font_a_17X18[] = { - 5, 6, 6, 10, 10, 16, 12, 3, 6, 6, 7, 11, 5, 6, 5, 5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 11, 11, 11, 10, 18, 11, 12, 13, 13, 12, 11, 14, 13, 4, 9, 12, 10, 15, 13, 14, 12, 14, 13, 12, 12, 13, 11, 17, 11, 12, 11, 5, 5, 5, 7, 10, 6, 10, 10, 9, 10, 10, 5, 10, 10, 4, 4, 9, 4, 14, 10, 10, 10, 10, 6, 9, 5, 10, 9, 13, 8, 9, 8, 6, 6, 6, 11 -}; -const UG_FONT font_font_a_17X18 = { (unsigned char *)fontBits_font_a_17X18, FONT_TYPE_1BPP, 17, 18, 32, 126, fontWidths_font_a_17X18 }; diff --git a/src/ui/fonts/font_a_17X18.h b/src/ui/fonts/font_a_17X18.h deleted file mode 100644 index 902423ec41..0000000000 --- a/src/ui/fonts/font_a_17X18.h +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#include - -extern const UG_FONT font_font_a_17X18; diff --git a/src/ui/fonts/font_a_9X9.c b/src/ui/fonts/font_a_9X9.c deleted file mode 100644 index feff3cc332..0000000000 --- a/src/ui/fonts/font_a_9X9.c +++ /dev/null @@ -1,108 +0,0 @@ -// Converted from font_a.ttf -// --size 9 -// --dpi 72 -// --bpp 1 -// For copyright, see original font file. - -#include - -static UG_FONT_DATA unsigned char fontBits_font_a_9X9[95][18] = { - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x20 ' ' - {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x21 '!' - {0x05,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x22 '"' - {0x0A,0x00,0x0A,0x00,0x0F,0x00,0x0A,0x00,0x0F,0x00,0x05,0x00,0x05,0x00,0x00,0x00,0x00,0x00 }, // 0x23 '#' - {0x0E,0x00,0x15,0x00,0x05,0x00,0x0E,0x00,0x14,0x00,0x15,0x00,0x0E,0x00,0x04,0x00,0x00,0x00 }, // 0x24 '$' - {0x24,0x00,0x1A,0x00,0x14,0x00,0x10,0x00,0x28,0x00,0x58,0x00,0x28,0x00,0x00,0x00,0x00,0x00 }, // 0x25 '%' - {0x0C,0x00,0x12,0x00,0x12,0x00,0x0E,0x00,0x29,0x00,0x11,0x00,0x2E,0x00,0x00,0x00,0x00,0x00 }, // 0x26 '&' - {0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x27 ''' - {0x04,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x04,0x00 }, // 0x28 '(' - {0x01,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x01,0x00 }, // 0x29 ')' - {0x07,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x2A '*' - {0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x1F,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x2B '+' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00 }, // 0x2C ',' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x2D '-' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x2E '.' - {0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x2F '/' - {0x06,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x30 '0' - {0x04,0x00,0x06,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x31 '1' - {0x06,0x00,0x09,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x0F,0x00,0x00,0x00,0x00,0x00 }, // 0x32 '2' - {0x06,0x00,0x09,0x00,0x08,0x00,0x04,0x00,0x08,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x33 '3' - {0x08,0x00,0x0C,0x00,0x0A,0x00,0x09,0x00,0x1F,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00 }, // 0x34 '4' - {0x0E,0x00,0x02,0x00,0x07,0x00,0x09,0x00,0x08,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x35 '5' - {0x06,0x00,0x09,0x00,0x07,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x36 '6' - {0x0F,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x37 '7' - {0x06,0x00,0x09,0x00,0x09,0x00,0x06,0x00,0x09,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x38 '8' - {0x06,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x0E,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x39 '9' - {0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x3A ':' - {0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00 }, // 0x3B ';' - {0x00,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x3C '<' - {0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x3D '=' - {0x00,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x3E '>' - {0x0E,0x00,0x11,0x00,0x10,0x00,0x0C,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x3F '?' - {0x78,0x00,0x84,0x00,0x52,0x01,0x6A,0x01,0x2A,0x01,0xAA,0x00,0x7A,0x00,0x84,0x01,0x78,0x00 }, // 0x40 '@' - {0x08,0x00,0x14,0x00,0x22,0x00,0x22,0x00,0x3E,0x00,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00 }, // 0x41 'A' - {0x0E,0x00,0x12,0x00,0x12,0x00,0x1E,0x00,0x12,0x00,0x12,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x42 'B' - {0x1C,0x00,0x22,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00 }, // 0x43 'C' - {0x1E,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x1E,0x00,0x00,0x00,0x00,0x00 }, // 0x44 'D' - {0x3E,0x00,0x02,0x00,0x02,0x00,0x3E,0x00,0x02,0x00,0x02,0x00,0x3E,0x00,0x00,0x00,0x00,0x00 }, // 0x45 'E' - {0x1E,0x00,0x02,0x00,0x02,0x00,0x0E,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x46 'F' - {0x1C,0x00,0x22,0x00,0x02,0x00,0x32,0x00,0x22,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00 }, // 0x47 'G' - {0x22,0x00,0x22,0x00,0x22,0x00,0x3E,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00 }, // 0x48 'H' - {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x49 'I' - {0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x09,0x00,0x07,0x00,0x00,0x00,0x00,0x00 }, // 0x4A 'J' - {0x22,0x00,0x12,0x00,0x0A,0x00,0x06,0x00,0x0A,0x00,0x12,0x00,0x22,0x00,0x00,0x00,0x00,0x00 }, // 0x4B 'K' - {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x1E,0x00,0x00,0x00,0x00,0x00 }, // 0x4C 'L' - {0x41,0x00,0x63,0x00,0x63,0x00,0x55,0x00,0x55,0x00,0x55,0x00,0x49,0x00,0x00,0x00,0x00,0x00 }, // 0x4D 'M' - {0x22,0x00,0x26,0x00,0x26,0x00,0x2A,0x00,0x32,0x00,0x32,0x00,0x22,0x00,0x00,0x00,0x00,0x00 }, // 0x4E 'N' - {0x1C,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00 }, // 0x4F 'O' - {0x1E,0x00,0x12,0x00,0x12,0x00,0x1E,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x50 'P' - {0x1C,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x12,0x00,0x3C,0x00,0x00,0x00,0x00,0x00 }, // 0x51 'Q' - {0x1E,0x00,0x22,0x00,0x22,0x00,0x1E,0x00,0x12,0x00,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00 }, // 0x52 'R' - {0x0C,0x00,0x12,0x00,0x02,0x00,0x0C,0x00,0x10,0x00,0x12,0x00,0x0C,0x00,0x00,0x00,0x00,0x00 }, // 0x53 'S' - {0x1F,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x54 'T' - {0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00 }, // 0x55 'U' - {0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x00,0x00,0x00,0x00 }, // 0x56 'V' - {0x11,0x01,0x29,0x01,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0x44,0x00,0x00,0x00,0x00,0x00 }, // 0x57 'W' - {0x11,0x00,0x0A,0x00,0x0A,0x00,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x00,0x00,0x00,0x00 }, // 0x58 'X' - {0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00 }, // 0x59 'Y' - {0x3F,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x3F,0x00,0x00,0x00,0x00,0x00 }, // 0x5A 'Z' - {0x06,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x06,0x00 }, // 0x5B '[' - {0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x5C '\' - {0x03,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x03,0x00 }, // 0x5D ']' - {0x02,0x00,0x05,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x5E '^' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00 }, // 0x5F '_' - {0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x60 '`' - {0x00,0x00,0x00,0x00,0x0F,0x00,0x08,0x00,0x0E,0x00,0x09,0x00,0x0F,0x00,0x00,0x00,0x00,0x00 }, // 0x61 'a' - {0x01,0x00,0x01,0x00,0x07,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x07,0x00,0x00,0x00,0x00,0x00 }, // 0x62 'b' - {0x00,0x00,0x00,0x00,0x06,0x00,0x09,0x00,0x01,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x63 'c' - {0x08,0x00,0x08,0x00,0x0E,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x64 'd' - {0x00,0x00,0x00,0x00,0x06,0x00,0x09,0x00,0x0F,0x00,0x01,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x65 'e' - {0x04,0x00,0x02,0x00,0x07,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x66 'f' - {0x00,0x00,0x00,0x00,0x0E,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x0E,0x00,0x09,0x00,0x06,0x00 }, // 0x67 'g' - {0x01,0x00,0x01,0x00,0x07,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x00,0x00,0x00,0x00 }, // 0x68 'h' - {0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x69 'i' - {0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x01,0x00 }, // 0x6A 'j' - {0x01,0x00,0x01,0x00,0x09,0x00,0x05,0x00,0x07,0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00 }, // 0x6B 'k' - {0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x6C 'l' - {0x00,0x00,0x00,0x00,0x3F,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x00,0x00,0x00,0x00 }, // 0x6D 'm' - {0x00,0x00,0x00,0x00,0x07,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x00,0x00,0x00,0x00 }, // 0x6E 'n' - {0x00,0x00,0x00,0x00,0x06,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x6F 'o' - {0x00,0x00,0x00,0x00,0x07,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x07,0x00,0x01,0x00,0x01,0x00 }, // 0x70 'p' - {0x00,0x00,0x00,0x00,0x0E,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x0E,0x00,0x08,0x00,0x08,0x00 }, // 0x71 'q' - {0x00,0x00,0x00,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x72 'r' - {0x00,0x00,0x00,0x00,0x0E,0x00,0x01,0x00,0x06,0x00,0x08,0x00,0x07,0x00,0x00,0x00,0x00,0x00 }, // 0x73 's' - {0x00,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x00 }, // 0x74 't' - {0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x75 'u' - {0x00,0x00,0x00,0x00,0x11,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x76 'v' - {0x00,0x00,0x00,0x00,0x15,0x00,0x15,0x00,0x15,0x00,0x15,0x00,0x0A,0x00,0x00,0x00,0x00,0x00 }, // 0x77 'w' - {0x00,0x00,0x00,0x00,0x09,0x00,0x06,0x00,0x02,0x00,0x06,0x00,0x09,0x00,0x00,0x00,0x00,0x00 }, // 0x78 'x' - {0x00,0x00,0x00,0x00,0x11,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x04,0x00,0x04,0x00,0x02,0x00 }, // 0x79 'y' - {0x00,0x00,0x00,0x00,0x07,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x07,0x00,0x00,0x00,0x00,0x00 }, // 0x7A 'z' - {0x06,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x06,0x00 }, // 0x7B '{' - {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00 }, // 0x7C '|' - {0x03,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x03,0x00 }, // 0x7D '}' - {0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,0x0D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } // 0x7E '~' -}; -static UG_U8 fontWidths_font_a_9X9[] = { -3,3,3,5,5,8,6,2,3,3,4,5,3,3,3,3,5,5,5,5,5,5,5,5,5,5,3,3,5,5,5,5,9,6,6,7,7,6,6,7,7,3,5,6,5,7,7,7,6,7,7,6,5,7,6,9,5,7,6,3,3,3,3,5,3,5,5,5,5,5,4,5,5,2,3,5,2,8,5,5,5,5,3,5,3,5,6,6,5,6,4,3,3,3,5}; -UG_FONT font_font_a_9X9 = { (unsigned char*)fontBits_font_a_9X9, FONT_TYPE_1BPP, 9, 9, 32, 126, fontWidths_font_a_9X9 }; diff --git a/src/ui/fonts/font_a_9X9.h b/src/ui/fonts/font_a_9X9.h deleted file mode 100644 index a3703abdd7..0000000000 --- a/src/ui/fonts/font_a_9X9.h +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#include - -extern const UG_FONT font_font_a_9X9; diff --git a/src/ui/fonts/monogram_5X9.c b/src/ui/fonts/monogram_5X9.c deleted file mode 100644 index b1909bdbd5..0000000000 --- a/src/ui/fonts/monogram_5X9.c +++ /dev/null @@ -1,107 +0,0 @@ -// Converted from /home/niklas/.local/share/fonts/monogram.ttf -// --size 16 -// --bpp 1 -// For copyright, see original font file. - -#include - -static UG_FONT_DATA unsigned char fontBits_monogram_5X9[95][9] = { - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x20 ' ' - {0x04,0x04,0x04,0x04,0x04,0x00,0x04,0x00,0x00 }, // 0x21 '!' - {0x0A,0x0A,0x0A,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x22 '"' - {0x00,0x0A,0x1F,0x0A,0x0A,0x1F,0x0A,0x00,0x00 }, // 0x23 '#' - {0x04,0x1E,0x05,0x0E,0x14,0x0F,0x04,0x00,0x00 }, // 0x24 '$' - {0x11,0x11,0x08,0x04,0x02,0x11,0x11,0x00,0x00 }, // 0x25 '%' - {0x06,0x09,0x09,0x1E,0x09,0x09,0x16,0x00,0x00 }, // 0x26 '&' - {0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x27 ''' - {0x08,0x04,0x04,0x04,0x04,0x04,0x08,0x00,0x00 }, // 0x28 '(' - {0x02,0x04,0x04,0x04,0x04,0x04,0x02,0x00,0x00 }, // 0x29 ')' - {0x00,0x08,0x2A,0x1C,0x2A,0x08,0x00,0x00,0x00 }, // 0x2A '*' - {0x00,0x04,0x04,0x1F,0x04,0x04,0x00,0x00,0x00 }, // 0x2B '+' - {0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x02,0x00 }, // 0x2C ',' - {0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00 }, // 0x2D '-' - {0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x00,0x00 }, // 0x2E '.' - {0x10,0x10,0x08,0x04,0x02,0x01,0x01,0x00,0x00 }, // 0x2F '/' - {0x0E,0x11,0x19,0x15,0x13,0x11,0x0E,0x00,0x00 }, // 0x30 '0' - {0x04,0x06,0x04,0x04,0x04,0x04,0x1F,0x00,0x00 }, // 0x31 '1' - {0x0E,0x11,0x10,0x08,0x04,0x02,0x1F,0x00,0x00 }, // 0x32 '2' - {0x0E,0x11,0x10,0x0C,0x10,0x11,0x0E,0x00,0x00 }, // 0x33 '3' - {0x12,0x12,0x11,0x1F,0x10,0x10,0x10,0x00,0x00 }, // 0x34 '4' - {0x1F,0x01,0x0F,0x10,0x10,0x11,0x0E,0x00,0x00 }, // 0x35 '5' - {0x0E,0x01,0x01,0x0F,0x11,0x11,0x0E,0x00,0x00 }, // 0x36 '6' - {0x1F,0x10,0x10,0x08,0x04,0x04,0x04,0x00,0x00 }, // 0x37 '7' - {0x0E,0x11,0x11,0x0E,0x11,0x11,0x0E,0x00,0x00 }, // 0x38 '8' - {0x0E,0x11,0x11,0x1E,0x10,0x11,0x0E,0x00,0x00 }, // 0x39 '9' - {0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00 }, // 0x3A ':' - {0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x02,0x00 }, // 0x3B ';' - {0x00,0x18,0x06,0x01,0x06,0x18,0x00,0x00,0x00 }, // 0x3C '<' - {0x00,0x00,0x1F,0x00,0x1F,0x00,0x00,0x00,0x00 }, // 0x3D '=' - {0x00,0x03,0x0C,0x10,0x0C,0x03,0x00,0x00,0x00 }, // 0x3E '>' - {0x0E,0x11,0x10,0x08,0x04,0x00,0x04,0x00,0x00 }, // 0x3F '?' - {0x0E,0x19,0x15,0x15,0x19,0x01,0x0E,0x00,0x00 }, // 0x40 '@' - {0x0E,0x11,0x11,0x11,0x1F,0x11,0x11,0x00,0x00 }, // 0x41 'A' - {0x0F,0x11,0x11,0x0F,0x11,0x11,0x0F,0x00,0x00 }, // 0x42 'B' - {0x0E,0x11,0x01,0x01,0x01,0x11,0x0E,0x00,0x00 }, // 0x43 'C' - {0x0F,0x11,0x11,0x11,0x11,0x11,0x0F,0x00,0x00 }, // 0x44 'D' - {0x1F,0x01,0x01,0x0F,0x01,0x01,0x1F,0x00,0x00 }, // 0x45 'E' - {0x1F,0x01,0x01,0x0F,0x01,0x01,0x01,0x00,0x00 }, // 0x46 'F' - {0x0E,0x11,0x01,0x1D,0x11,0x11,0x0E,0x00,0x00 }, // 0x47 'G' - {0x11,0x11,0x11,0x1F,0x11,0x11,0x11,0x00,0x00 }, // 0x48 'H' - {0x1F,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00 }, // 0x49 'I' - {0x10,0x10,0x10,0x10,0x11,0x11,0x0E,0x00,0x00 }, // 0x4A 'J' - {0x11,0x09,0x05,0x03,0x05,0x09,0x11,0x00,0x00 }, // 0x4B 'K' - {0x01,0x01,0x01,0x01,0x01,0x01,0x1F,0x00,0x00 }, // 0x4C 'L' - {0x11,0x1B,0x15,0x11,0x11,0x11,0x11,0x00,0x00 }, // 0x4D 'M' - {0x11,0x11,0x13,0x15,0x19,0x11,0x11,0x00,0x00 }, // 0x4E 'N' - {0x0E,0x11,0x11,0x11,0x11,0x11,0x0E,0x00,0x00 }, // 0x4F 'O' - {0x0F,0x11,0x11,0x0F,0x01,0x01,0x01,0x00,0x00 }, // 0x50 'P' - {0x0E,0x11,0x11,0x11,0x11,0x11,0x0E,0x18,0x00 }, // 0x51 'Q' - {0x0F,0x11,0x11,0x0F,0x11,0x11,0x11,0x00,0x00 }, // 0x52 'R' - {0x0E,0x11,0x01,0x0E,0x10,0x11,0x0E,0x00,0x00 }, // 0x53 'S' - {0x1F,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00 }, // 0x54 'T' - {0x11,0x11,0x11,0x11,0x11,0x11,0x0E,0x00,0x00 }, // 0x55 'U' - {0x11,0x11,0x11,0x11,0x0A,0x0A,0x04,0x00,0x00 }, // 0x56 'V' - {0x11,0x11,0x11,0x11,0x15,0x1B,0x11,0x00,0x00 }, // 0x57 'W' - {0x11,0x11,0x0A,0x04,0x0A,0x11,0x11,0x00,0x00 }, // 0x58 'X' - {0x11,0x11,0x0A,0x04,0x04,0x04,0x04,0x00,0x00 }, // 0x59 'Y' - {0x1F,0x10,0x08,0x04,0x02,0x01,0x1F,0x00,0x00 }, // 0x5A 'Z' - {0x0C,0x04,0x04,0x04,0x04,0x04,0x0C,0x00,0x00 }, // 0x5B '[' - {0x01,0x01,0x02,0x04,0x08,0x10,0x10,0x00,0x00 }, // 0x5C '\' - {0x06,0x04,0x04,0x04,0x04,0x04,0x06,0x00,0x00 }, // 0x5D ']' - {0x04,0x0A,0x11,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x5E '^' - {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00 }, // 0x5F '_' - {0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x60 '`' - {0x00,0x00,0x1E,0x11,0x11,0x11,0x1E,0x00,0x00 }, // 0x61 'a' - {0x01,0x01,0x0F,0x11,0x11,0x11,0x0F,0x00,0x00 }, // 0x62 'b' - {0x00,0x00,0x0E,0x11,0x01,0x11,0x0E,0x00,0x00 }, // 0x63 'c' - {0x10,0x10,0x1E,0x11,0x11,0x11,0x1E,0x00,0x00 }, // 0x64 'd' - {0x00,0x00,0x0E,0x11,0x1F,0x01,0x0E,0x00,0x00 }, // 0x65 'e' - {0x0C,0x12,0x02,0x0F,0x02,0x02,0x02,0x00,0x00 }, // 0x66 'f' - {0x00,0x00,0x1E,0x11,0x11,0x11,0x1E,0x10,0x0E }, // 0x67 'g' - {0x01,0x01,0x0F,0x11,0x11,0x11,0x11,0x00,0x00 }, // 0x68 'h' - {0x04,0x00,0x06,0x04,0x04,0x04,0x1F,0x00,0x00 }, // 0x69 'i' - {0x10,0x00,0x18,0x10,0x10,0x10,0x10,0x11,0x0E }, // 0x6A 'j' - {0x01,0x01,0x11,0x09,0x07,0x09,0x11,0x00,0x00 }, // 0x6B 'k' - {0x03,0x02,0x02,0x02,0x02,0x02,0x1C,0x00,0x00 }, // 0x6C 'l' - {0x00,0x00,0x0F,0x15,0x15,0x15,0x15,0x00,0x00 }, // 0x6D 'm' - {0x00,0x00,0x0F,0x11,0x11,0x11,0x11,0x00,0x00 }, // 0x6E 'n' - {0x00,0x00,0x0E,0x11,0x11,0x11,0x0E,0x00,0x00 }, // 0x6F 'o' - {0x00,0x00,0x0F,0x11,0x11,0x11,0x0F,0x01,0x01 }, // 0x70 'p' - {0x00,0x00,0x1E,0x11,0x11,0x11,0x1E,0x10,0x10 }, // 0x71 'q' - {0x00,0x00,0x0D,0x13,0x01,0x01,0x01,0x00,0x00 }, // 0x72 'r' - {0x00,0x00,0x1E,0x01,0x0E,0x10,0x0F,0x00,0x00 }, // 0x73 's' - {0x02,0x02,0x0F,0x02,0x02,0x02,0x1C,0x00,0x00 }, // 0x74 't' - {0x00,0x00,0x11,0x11,0x11,0x11,0x1E,0x00,0x00 }, // 0x75 'u' - {0x00,0x00,0x11,0x11,0x11,0x0A,0x04,0x00,0x00 }, // 0x76 'v' - {0x00,0x00,0x11,0x11,0x15,0x15,0x0A,0x00,0x00 }, // 0x77 'w' - {0x00,0x00,0x11,0x0A,0x04,0x0A,0x11,0x00,0x00 }, // 0x78 'x' - {0x00,0x00,0x11,0x11,0x11,0x11,0x1E,0x10,0x0E }, // 0x79 'y' - {0x00,0x00,0x1F,0x08,0x04,0x02,0x1F,0x00,0x00 }, // 0x7A 'z' - {0x08,0x04,0x04,0x02,0x04,0x04,0x08,0x00,0x00 }, // 0x7B '{' - {0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00 }, // 0x7C '|' - {0x02,0x04,0x04,0x08,0x04,0x04,0x02,0x00,0x00 }, // 0x7D '}' - {0x12,0x0D,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } // 0x7E '~' -}; -static UG_U8 fontWidths_monogram_5X9[] = { -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6}; -const UG_FONT font_monogram_5X9 = { (unsigned char*)fontBits_monogram_5X9, FONT_TYPE_1BPP, 5, 9, 32, 126, fontWidths_monogram_5X9 }; diff --git a/src/ui/fonts/monogram_5X9.h b/src/ui/fonts/monogram_5X9.h deleted file mode 100644 index 65638f1e45..0000000000 --- a/src/ui/fonts/monogram_5X9.h +++ /dev/null @@ -1,3 +0,0 @@ -#include - -extern const UG_FONT font_monogram_5X9; diff --git a/src/ui/fonts/password_11X12.c b/src/ui/fonts/password_11X12.c deleted file mode 100644 index a8f65a82fa..0000000000 --- a/src/ui/fonts/password_11X12.c +++ /dev/null @@ -1,105 +0,0 @@ -// This is a copy of font_a_11X12.c with a modified space character - -#include - -static UG_FONT_DATA unsigned char fontBits_password_11X12[95][24] = { - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00 }, // 0x20 (0x2423) '#' - {0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x21 '!' - {0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x22 '"' - {0x28, 0x00, 0x28, 0x00, 0x7F, 0x00, 0x14, 0x00, 0x14, 0x00, 0x7F, 0x00, 0x14, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x23 '#' - {0x1C, 0x00, 0x2A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x1C, 0x00, 0x28, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x24 '$' - {0x8C, 0x00, 0x52, 0x00, 0x52, 0x00, 0x32, 0x00, 0xAC, 0x01, 0x60, 0x02, 0x50, 0x02, 0x50, 0x02, 0x88, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x25 '%' - {0x18, 0x00, 0x24, 0x00, 0x24, 0x00, 0x14, 0x00, 0x0C, 0x00, 0x52, 0x00, 0x22, 0x00, 0x62, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x26 '&' - {0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x27 ''' - {0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00 }, // 0x28 '(' - {0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00 }, // 0x29 ')' - {0x04, 0x00, 0x1F, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2A '*' - {0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2B '+' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00 }, // 0x2C ',' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2D '-' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2E '.' - {0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x2F '/' - {0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x30 '0' - {0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x31 '1' - {0x1C, 0x00, 0x22, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x32 '2' - {0x1C, 0x00, 0x22, 0x00, 0x20, 0x00, 0x20, 0x00, 0x18, 0x00, 0x20, 0x00, 0x20, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x33 '3' - {0x10, 0x00, 0x18, 0x00, 0x18, 0x00, 0x14, 0x00, 0x14, 0x00, 0x12, 0x00, 0x3E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x34 '4' - {0x3C, 0x00, 0x04, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x22, 0x00, 0x20, 0x00, 0x20, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x35 '5' - {0x1C, 0x00, 0x22, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x26, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x36 '6' - {0x3E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x37 '7' - {0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x38 '8' - {0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x39 '9' - {0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3A ':' - {0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00 }, // 0x3B ';' - {0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3C '<' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3D '=' - {0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3E '>' - {0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x3F '?' - {0xE0, 0x01, 0x18, 0x06, 0x04, 0x04, 0x64, 0x09, 0x92, 0x09, 0x8A, 0x08, 0x8A, 0x08, 0x8A, 0x04, 0xF2, 0x03, 0x04, 0x08, 0x08, 0x06, 0xF0, 0x01 }, // 0x40 '@' - {0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x41 'A' - {0x3E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x42 'B' - {0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x43 'C' - {0x3E, 0x00, 0x42, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x42, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x44 'D' - {0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x45 'E' - {0x3E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x46 'F' - {0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x02, 0x00, 0xE2, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x47 'G' - {0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0xFE, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x48 'H' - {0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x49 'I' - {0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4A 'J' - {0x82, 0x00, 0x42, 0x00, 0x22, 0x00, 0x12, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x22, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4B 'K' - {0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4C 'L' - {0x82, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0x92, 0x00, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4D 'M' - {0x82, 0x00, 0x86, 0x00, 0x8A, 0x00, 0x8A, 0x00, 0x92, 0x00, 0xA2, 0x00, 0xA2, 0x00, 0xC2, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4E 'N' - {0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x4F 'O' - {0x3E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x50 'P' - {0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0xB2, 0x00, 0x44, 0x00, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x51 'Q' - {0x7E, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x7E, 0x00, 0x22, 0x00, 0x42, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x52 'R' - {0x3C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x02, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x53 'S' - {0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x54 'T' - {0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x55 'U' - {0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x56 'V' - {0x21, 0x04, 0x51, 0x04, 0x51, 0x02, 0x52, 0x02, 0x8A, 0x02, 0x8A, 0x02, 0x8A, 0x02, 0x04, 0x01, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x57 'W' - {0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x58 'X' - {0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x59 'Y' - {0x7E, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x5A 'Z' - {0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00 }, // 0x5B '[' - {0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x5C '\' - {0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00 }, // 0x5D ']' - {0x04, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x5E '^' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00 }, // 0x5F '_' - {0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x60 '`' - {0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x20, 0x00, 0x3C, 0x00, 0x22, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x61 'a' - {0x02, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x26, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x26, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x62 'b' - {0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x63 'c' - {0x20, 0x00, 0x20, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x64 'd' - {0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x02, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x65 'e' - {0x0C, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x66 'f' - {0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x1E, 0x00, 0x00, 0x00 }, // 0x67 'g' - {0x02, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x26, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x68 'h' - {0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x69 'i' - {0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00 }, // 0x6A 'j' - {0x02, 0x00, 0x02, 0x00, 0x22, 0x00, 0x12, 0x00, 0x0A, 0x00, 0x0E, 0x00, 0x12, 0x00, 0x12, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6B 'k' - {0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6C 'l' - {0x00, 0x00, 0x00, 0x00, 0x9A, 0x01, 0x66, 0x02, 0x22, 0x02, 0x22, 0x02, 0x22, 0x02, 0x22, 0x02, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6D 'm' - {0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x26, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6E 'n' - {0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x6F 'o' - {0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x26, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x26, 0x00, 0x1A, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00 }, // 0x70 'p' - {0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00 }, // 0x71 'q' - {0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x72 'r' - {0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x73 's' - {0x02, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x74 't' - {0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x75 'u' - {0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x76 'v' - {0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0x11, 0x01, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0x44, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x77 'w' - {0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x78 'x' - {0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00 }, // 0x79 'y' - {0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // 0x7A 'z' - {0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00 }, // 0x7B '{' - {0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00 }, // 0x7C '|' - {0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00 }, // 0x7D '}' - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } // 0x7E '~' -}; -static UG_U8 fontWidths_password_11X12[] = { - 7, 3, 4, 7, 7, 11, 8, 2, 4, 4, 5, 7, 3, 4, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 7, 7, 7, 7, 12, 7, 8, 9, 9, 8, 7, 9, 9, 3, 6, 8, 7, 9, 9, 9, 8, 9, 9, 8, 7, 9, 7, 11, 7, 7, 7, 3, 3, 3, 5, 7, 4, 7, 7, 6, 7, 7, 3, 7, 7, 3, 3, 6, 3, 11, 7, 7, 7, 7, 4, 7, 3, 7, 5, 9, 5, 5, 5, 4, 3, 4, 7 -}; -const UG_FONT font_password_11X12 = { (unsigned char *)fontBits_password_11X12, FONT_TYPE_1BPP, 11, 12, 32, 126, fontWidths_password_11X12 }; diff --git a/src/ui/fonts/password_11X12.h b/src/ui/fonts/password_11X12.h deleted file mode 100644 index 18d344d75a..0000000000 --- a/src/ui/fonts/password_11X12.h +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#include - -extern const UG_FONT font_password_11X12; diff --git a/src/ui/fonts/password_9X9.c b/src/ui/fonts/password_9X9.c deleted file mode 100644 index e568dad247..0000000000 --- a/src/ui/fonts/password_9X9.c +++ /dev/null @@ -1,104 +0,0 @@ -// This is a copy of font_a_9X9.c with a modified space character - -#include - -static UG_FONT_DATA unsigned char fontBits_password_9X9[95][18] = { - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x22,0x00,0x3E,0x00 }, // 0x20 (0x2423) '#' - {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x21 '!' - {0x05,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x22 '"' - {0x0A,0x00,0x0A,0x00,0x0F,0x00,0x0A,0x00,0x0F,0x00,0x05,0x00,0x05,0x00,0x00,0x00,0x00,0x00 }, // 0x23 '#' - {0x0E,0x00,0x15,0x00,0x05,0x00,0x0E,0x00,0x14,0x00,0x15,0x00,0x0E,0x00,0x04,0x00,0x00,0x00 }, // 0x24 '$' - {0x24,0x00,0x1A,0x00,0x14,0x00,0x10,0x00,0x28,0x00,0x58,0x00,0x28,0x00,0x00,0x00,0x00,0x00 }, // 0x25 '%' - {0x0C,0x00,0x12,0x00,0x12,0x00,0x0E,0x00,0x29,0x00,0x11,0x00,0x2E,0x00,0x00,0x00,0x00,0x00 }, // 0x26 '&' - {0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x27 ''' - {0x04,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x04,0x00 }, // 0x28 '(' - {0x01,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x01,0x00 }, // 0x29 ')' - {0x07,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x2A '*' - {0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x1F,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x2B '+' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00 }, // 0x2C ',' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x2D '-' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x2E '.' - {0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x2F '/' - {0x06,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x30 '0' - {0x04,0x00,0x06,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x31 '1' - {0x06,0x00,0x09,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x0F,0x00,0x00,0x00,0x00,0x00 }, // 0x32 '2' - {0x06,0x00,0x09,0x00,0x08,0x00,0x04,0x00,0x08,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x33 '3' - {0x08,0x00,0x0C,0x00,0x0A,0x00,0x09,0x00,0x1F,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00 }, // 0x34 '4' - {0x0E,0x00,0x02,0x00,0x07,0x00,0x09,0x00,0x08,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x35 '5' - {0x06,0x00,0x09,0x00,0x07,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x36 '6' - {0x0F,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x37 '7' - {0x06,0x00,0x09,0x00,0x09,0x00,0x06,0x00,0x09,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x38 '8' - {0x06,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x0E,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x39 '9' - {0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x3A ':' - {0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00 }, // 0x3B ';' - {0x00,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x3C '<' - {0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x3D '=' - {0x00,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x3E '>' - {0x0E,0x00,0x11,0x00,0x10,0x00,0x0C,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x3F '?' - {0x78,0x00,0x84,0x00,0x52,0x01,0x6A,0x01,0x2A,0x01,0xAA,0x00,0x7A,0x00,0x84,0x01,0x78,0x00 }, // 0x40 '@' - {0x08,0x00,0x14,0x00,0x22,0x00,0x22,0x00,0x3E,0x00,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00 }, // 0x41 'A' - {0x0E,0x00,0x12,0x00,0x12,0x00,0x1E,0x00,0x12,0x00,0x12,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x42 'B' - {0x1C,0x00,0x22,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00 }, // 0x43 'C' - {0x1E,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x1E,0x00,0x00,0x00,0x00,0x00 }, // 0x44 'D' - {0x3E,0x00,0x02,0x00,0x02,0x00,0x3E,0x00,0x02,0x00,0x02,0x00,0x3E,0x00,0x00,0x00,0x00,0x00 }, // 0x45 'E' - {0x1E,0x00,0x02,0x00,0x02,0x00,0x0E,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x46 'F' - {0x1C,0x00,0x22,0x00,0x02,0x00,0x32,0x00,0x22,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00 }, // 0x47 'G' - {0x22,0x00,0x22,0x00,0x22,0x00,0x3E,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00 }, // 0x48 'H' - {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x49 'I' - {0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x09,0x00,0x07,0x00,0x00,0x00,0x00,0x00 }, // 0x4A 'J' - {0x22,0x00,0x12,0x00,0x0A,0x00,0x06,0x00,0x0A,0x00,0x12,0x00,0x22,0x00,0x00,0x00,0x00,0x00 }, // 0x4B 'K' - {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x1E,0x00,0x00,0x00,0x00,0x00 }, // 0x4C 'L' - {0x41,0x00,0x63,0x00,0x63,0x00,0x55,0x00,0x55,0x00,0x55,0x00,0x49,0x00,0x00,0x00,0x00,0x00 }, // 0x4D 'M' - {0x22,0x00,0x26,0x00,0x26,0x00,0x2A,0x00,0x32,0x00,0x32,0x00,0x22,0x00,0x00,0x00,0x00,0x00 }, // 0x4E 'N' - {0x1C,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00 }, // 0x4F 'O' - {0x1E,0x00,0x12,0x00,0x12,0x00,0x1E,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x50 'P' - {0x1C,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x12,0x00,0x3C,0x00,0x00,0x00,0x00,0x00 }, // 0x51 'Q' - {0x1E,0x00,0x22,0x00,0x22,0x00,0x1E,0x00,0x12,0x00,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00 }, // 0x52 'R' - {0x0C,0x00,0x12,0x00,0x02,0x00,0x0C,0x00,0x10,0x00,0x12,0x00,0x0C,0x00,0x00,0x00,0x00,0x00 }, // 0x53 'S' - {0x1F,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x54 'T' - {0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00 }, // 0x55 'U' - {0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x00,0x00,0x00,0x00 }, // 0x56 'V' - {0x11,0x01,0x29,0x01,0xAA,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0x44,0x00,0x00,0x00,0x00,0x00 }, // 0x57 'W' - {0x11,0x00,0x0A,0x00,0x0A,0x00,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x00,0x00,0x00,0x00 }, // 0x58 'X' - {0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00 }, // 0x59 'Y' - {0x3F,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x3F,0x00,0x00,0x00,0x00,0x00 }, // 0x5A 'Z' - {0x06,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x06,0x00 }, // 0x5B '[' - {0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x5C '\' - {0x03,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x03,0x00 }, // 0x5D ']' - {0x02,0x00,0x05,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x5E '^' - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00 }, // 0x5F '_' - {0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // 0x60 '`' - {0x00,0x00,0x00,0x00,0x0F,0x00,0x08,0x00,0x0E,0x00,0x09,0x00,0x0F,0x00,0x00,0x00,0x00,0x00 }, // 0x61 'a' - {0x01,0x00,0x01,0x00,0x07,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x07,0x00,0x00,0x00,0x00,0x00 }, // 0x62 'b' - {0x00,0x00,0x00,0x00,0x06,0x00,0x09,0x00,0x01,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x63 'c' - {0x08,0x00,0x08,0x00,0x0E,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x64 'd' - {0x00,0x00,0x00,0x00,0x06,0x00,0x09,0x00,0x0F,0x00,0x01,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x65 'e' - {0x04,0x00,0x02,0x00,0x07,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00 }, // 0x66 'f' - {0x00,0x00,0x00,0x00,0x0E,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x0E,0x00,0x09,0x00,0x06,0x00 }, // 0x67 'g' - {0x01,0x00,0x01,0x00,0x07,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x00,0x00,0x00,0x00 }, // 0x68 'h' - {0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x69 'i' - {0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x01,0x00 }, // 0x6A 'j' - {0x01,0x00,0x01,0x00,0x09,0x00,0x05,0x00,0x07,0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00 }, // 0x6B 'k' - {0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x6C 'l' - {0x00,0x00,0x00,0x00,0x3F,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x00,0x00,0x00,0x00 }, // 0x6D 'm' - {0x00,0x00,0x00,0x00,0x07,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x00,0x00,0x00,0x00 }, // 0x6E 'n' - {0x00,0x00,0x00,0x00,0x06,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00 }, // 0x6F 'o' - {0x00,0x00,0x00,0x00,0x07,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x07,0x00,0x01,0x00,0x01,0x00 }, // 0x70 'p' - {0x00,0x00,0x00,0x00,0x0E,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x0E,0x00,0x08,0x00,0x08,0x00 }, // 0x71 'q' - {0x00,0x00,0x00,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00 }, // 0x72 'r' - {0x00,0x00,0x00,0x00,0x0E,0x00,0x01,0x00,0x06,0x00,0x08,0x00,0x07,0x00,0x00,0x00,0x00,0x00 }, // 0x73 's' - {0x00,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x00 }, // 0x74 't' - {0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x0E,0x00,0x00,0x00,0x00,0x00 }, // 0x75 'u' - {0x00,0x00,0x00,0x00,0x11,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x04,0x00,0x00,0x00,0x00,0x00 }, // 0x76 'v' - {0x00,0x00,0x00,0x00,0x15,0x00,0x15,0x00,0x15,0x00,0x15,0x00,0x0A,0x00,0x00,0x00,0x00,0x00 }, // 0x77 'w' - {0x00,0x00,0x00,0x00,0x09,0x00,0x06,0x00,0x02,0x00,0x06,0x00,0x09,0x00,0x00,0x00,0x00,0x00 }, // 0x78 'x' - {0x00,0x00,0x00,0x00,0x11,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x04,0x00,0x04,0x00,0x02,0x00 }, // 0x79 'y' - {0x00,0x00,0x00,0x00,0x07,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x07,0x00,0x00,0x00,0x00,0x00 }, // 0x7A 'z' - {0x06,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x06,0x00 }, // 0x7B '{' - {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00 }, // 0x7C '|' - {0x03,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x03,0x00 }, // 0x7D '}' - {0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,0x0D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 } // 0x7E '~' -}; -static UG_U8 fontWidths_password_9X9[] = { -7,3,3,5,5,8,6,2,3,3,4,5,3,3,3,3,5,5,5,5,5,5,5,5,5,5,3,3,5,5,5,5,9,6,6,7,7,6,6,7,7,3,5,6,5,7,7,7,6,7,7,6,5,7,6,9,5,7,6,3,3,3,3,5,3,5,5,5,5,5,4,5,5,2,3,5,2,8,5,5,5,5,3,5,3,5,6,6,5,6,4,3,3,3,5}; -UG_FONT font_password_9X9 = { (unsigned char*)fontBits_password_9X9, FONT_TYPE_1BPP, 9, 9, 32, 126, fontWidths_password_9X9 }; diff --git a/src/ui/fonts/password_9X9.h b/src/ui/fonts/password_9X9.h deleted file mode 100644 index 278edf5d5f..0000000000 --- a/src/ui/fonts/password_9X9.h +++ /dev/null @@ -1,3 +0,0 @@ -#include - -extern const UG_FONT font_password_9X9; diff --git a/src/ui/ugui/ugui.c b/src/ui/ugui/ugui.c index d8a9647b80..9e1758def9 100644 --- a/src/ui/ugui/ugui.c +++ b/src/ui/ugui/ugui.c @@ -50,6 +50,9 @@ // SPDX-License-Identifier: Apache-2.0 #include +#include +#include +#include #include #include #include @@ -79,48 +82,173 @@ static void _UG_PSet(UG_S16 x, UG_S16 y, UG_COLOR c) gui->pset(x, y, c); } -static void _UG_PutChar( char chr, UG_S16 x, UG_S16 y, UG_COLOR fc, UG_COLOR bc, - const UG_FONT *font) +static bool _UG_IsUtf8Continuation(uint8_t byte) +{ + return (byte & 0xC0) == 0x80; +} + +/** + * Decodes the next UTF-8 codepoint and returns the byte after it. + * + * The leading byte determines the sequence length. ASCII bytes are returned + * directly, valid 2-, 3-, and 4-byte sequences are assembled from their payload + * bits, and malformed sequences fall back to returning the leading byte so + * iteration always advances. + */ +static const char* _UG_NextCodepoint(const char* str, uint32_t* codepoint) +{ + const uint8_t* bytes = (const uint8_t*)str; + if (bytes[0] == '\0') { + *codepoint = '\0'; + return str; + } + if (bytes[0] < 0x80) { + *codepoint = bytes[0]; + return str + 1; + } + if (bytes[0] >= 0xC2 && bytes[0] <= 0xDF && _UG_IsUtf8Continuation(bytes[1])) { + *codepoint = ((uint32_t)(bytes[0] & 0x1F) << 6) | (uint32_t)(bytes[1] & 0x3F); + return str + 2; + } + if (bytes[0] >= 0xE0 && bytes[0] <= 0xEF && _UG_IsUtf8Continuation(bytes[1]) && + _UG_IsUtf8Continuation(bytes[2])) { + *codepoint = ((uint32_t)(bytes[0] & 0x0F) << 12) | + ((uint32_t)(bytes[1] & 0x3F) << 6) | (uint32_t)(bytes[2] & 0x3F); + return str + 3; + } + if (bytes[0] >= 0xF0 && bytes[0] <= 0xF4 && _UG_IsUtf8Continuation(bytes[1]) && + _UG_IsUtf8Continuation(bytes[2]) && _UG_IsUtf8Continuation(bytes[3])) { + *codepoint = ((uint32_t)(bytes[0] & 0x07) << 18) | + ((uint32_t)(bytes[1] & 0x3F) << 12) | + ((uint32_t)(bytes[2] & 0x3F) << 6) | (uint32_t)(bytes[3] & 0x3F); + return str + 4; + } + *codepoint = bytes[0]; + return str + 1; +} + +static bool _UG_GetLvglGlyphDsc( + const UG_FONT* font, + uint32_t codepoint, + lv_font_glyph_dsc_t* glyph_dsc) +{ + const lv_font_t* lv_font = (const lv_font_t*)font->p; + if (lv_font == NULL || lv_font->get_glyph_dsc == NULL) { + return false; + } + memset(glyph_dsc, 0, sizeof(*glyph_dsc)); + return lv_font_get_glyph_dsc(lv_font, glyph_dsc, codepoint, 0); +} + +bool UG_GetCharWidth(const UG_FONT* font, uint32_t codepoint, UG_U16* width) +{ + if (font->font_type == FONT_TYPE_LVGL) { + lv_font_glyph_dsc_t glyph_dsc; + if (!_UG_GetLvglGlyphDsc(font, codepoint, &glyph_dsc)) { + return false; + } + *width = glyph_dsc.adv_w; + return true; + } + + if (codepoint > UINT16_MAX || codepoint < font->start_char || codepoint > font->end_char) { + return false; + } + *width = font->widths ? font->widths[codepoint - font->start_char] : font->char_width; + return true; +} + +static bool _UG_LvglGlyphPixelSet( + const uint8_t* bitmap, + const lv_font_glyph_dsc_t* glyph_dsc, + UG_U16 x, + UG_U16 y) +{ + uint32_t bit_index = glyph_dsc->stride != 0 + ? ((uint32_t)y * glyph_dsc->stride * 8 + (uint32_t)x) + : ((uint32_t)y * glyph_dsc->box_w + x); + return ((bitmap[bit_index / 8] >> (7 - (bit_index % 8))) & 0x01) != 0; +} + +static void _UG_PutLvglCodepoint( + uint32_t codepoint, + UG_S16 x, + UG_S16 y, + UG_COLOR fc, + UG_COLOR bc, + const UG_FONT* font, + bool inverted, + bool transparent) +{ + lv_font_glyph_dsc_t glyph_dsc; + if (!_UG_GetLvglGlyphDsc(font, codepoint, &glyph_dsc)) { + return; + } + const lv_font_t* resolved_font = glyph_dsc.resolved_font; + if (resolved_font == NULL) { + return; + } + UG_U16 actual_char_width = glyph_dsc.adv_w; + if (x + actual_char_width < 0 || x > gui->x_dim) { + return; + } + if (glyph_dsc.format != LV_FONT_GLYPH_FORMAT_A1) { + return; + } + if (!transparent) { + for (UG_U16 row = 0; row < font->char_height; row++) { + for (UG_U16 col = 0; col < actual_char_width; col++) { + _UG_PSet(x + col, y + row, bc); + } + } + } + if (glyph_dsc.box_w == 0 || glyph_dsc.box_h == 0 || + resolved_font->get_glyph_bitmap == NULL) { + return; + } + + glyph_dsc.req_raw_bitmap = 1; + const uint8_t* bitmap = (const uint8_t*)resolved_font->get_glyph_bitmap(&glyph_dsc, NULL); + if (bitmap == NULL) { + return; + } + + UG_S16 glyph_y = + font->char_height - resolved_font->base_line - glyph_dsc.box_h - glyph_dsc.ofs_y; + for (UG_U16 row = 0; row < glyph_dsc.box_h; row++) { + for (UG_U16 col = 0; col < glyph_dsc.box_w; col++) { + UG_S16 xo = x + glyph_dsc.ofs_x + col; + UG_S16 yo = y + glyph_y + row; + if (inverted) { + xo = x + actual_char_width - 1 - (glyph_dsc.ofs_x + col); + yo = y + font->char_height - 1 - (glyph_y + row); + } + if (_UG_LvglGlyphPixelSet(bitmap, &glyph_dsc, col, row)) { + _UG_PSet(xo, yo, fc); + } + } + } +} + +static void _UG_PutCodepoint( uint32_t codepoint, UG_S16 x, UG_S16 y, UG_COLOR fc, UG_COLOR bc, + const UG_FONT *font, bool inverted, bool transparent) { UG_U16 i, j, k, xo, yo, c, bn, actual_char_width; - UG_U8 b, bt; + UG_U8 b; + UG_U16 bt; UG_U32 index; UG_COLOR color; + const unsigned char* font_data = (const unsigned char*)font->p; - bt = (UG_U8)chr; - - switch (bt ) { - case 0xF6: - bt = 0x94; - break; // ö - case 0xD6: - bt = 0x99; - break; // Ö - case 0xFC: - bt = 0x81; - break; // ü - case 0xDC: - bt = 0x9A; - break; // Ü - case 0xE4: - bt = 0x84; - break; // ä - case 0xC4: - bt = 0x8E; - break; // Ä - case 0xB5: - bt = 0xE6; - break; // µ - case 0xB0: - bt = 0xF8; - break; // ° - default: - break; + if (font->font_type == FONT_TYPE_LVGL) { + _UG_PutLvglCodepoint(codepoint, x, y, fc, bc, font, inverted, transparent); + return; } - if (bt < font->start_char || bt > font->end_char) { + if (codepoint > UINT16_MAX || codepoint < font->start_char || codepoint > font->end_char) { return; } + bt = (UG_U16)codepoint; yo = y; bn = font->char_width; @@ -144,7 +272,7 @@ static void _UG_PutChar( char chr, UG_S16 x, UG_S16 y, UG_COLOR fc, UG_COLOR bc, xo = x; c = actual_char_width; for ( i = 0; i < bn; i++ ) { - b = font->p[index++]; + b = font_data[index++]; for ( k = 0; (k < 8) && c; k++ ) { if ( b & 0x01 ) { _UG_PSet(xo, yo, fc); @@ -163,7 +291,7 @@ static void _UG_PutChar( char chr, UG_S16 x, UG_S16 y, UG_COLOR fc, UG_COLOR bc, for ( j = 0; j < font->char_height; j++ ) { xo = x; for ( i = 0; i < actual_char_width; i++ ) { - b = font->p[index++]; + b = font_data[index++]; color = ((((fc & 0xFF) * b + (bc & 0xFF) * (256 - b)) >> 8) & 0xFF) |//Blue component ((((fc & 0xFF00) * b + (bc & 0xFF00) * (256 - b)) >> 8) & 0xFF00) |//Green component ((((fc & 0xFF0000) * b + (bc & 0xFF0000) * (256 - b)) >> 8) & 0xFF0000); //Red component @@ -182,21 +310,21 @@ static void _UG_PutString( UG_S16 x, UG_S16 y, UG_S16 *xout, UG_S16 *yout, const ASSERT(gui != NULL); UG_S16 xp, yp; - UG_U8 cw; - char chr; + UG_U16 cw; + uint32_t codepoint; UG_S16 max_x = x; xp = x; yp = y; - const int str_length = strlens(str); + const char* cursor = str; - for (int i = 0; i < str_length; i++) { - chr = str[i]; - if (chr != '\n' && (chr < gui->font.start_char || chr > gui->font.end_char)) { + while (*cursor != '\0') { + cursor = _UG_NextCodepoint(cursor, &codepoint); + if (codepoint != '\n' && !UG_GetCharWidth(&gui->font, codepoint, &cw)) { continue; } - if ( chr == '\n' ) { + if ( codepoint == '\n' ) { if (autobreak == 1) { xp = gui->x_dim; } else { @@ -205,8 +333,6 @@ static void _UG_PutString( UG_S16 x, UG_S16 y, UG_S16 *xout, UG_S16 *yout, const } continue; } - cw = gui->font.widths ? gui->font.widths[chr - gui->font.start_char] : - gui->font.char_width; if ( autobreak == 1 && xp + cw > gui->x_dim - 1 ) { xp = x; @@ -214,7 +340,8 @@ static void _UG_PutString( UG_S16 x, UG_S16 y, UG_S16 *xout, UG_S16 *yout, const } if (!calconly) { - UG_PutChar(chr, xp, yp, gui->fore_color, gui->back_color); + _UG_PutCodepoint( + codepoint, xp, yp, gui->fore_color, gui->back_color, &gui->font, false, false); } xp += cw + gui->char_h_space; @@ -628,12 +755,33 @@ static UG_S16 _word_width(const char* p) { const UG_FONT* font = &gui->font; UG_S16 x = 0; while(!_is_whitespace(*p)) { - x += font->widths[(UG_U8)*p - font->start_char]; - p += 1; + uint32_t codepoint = 0; + p = _UG_NextCodepoint(p, &codepoint); + UG_U16 char_width = 0; + if (UG_GetCharWidth(font, codepoint, &char_width)) { + x += char_width; + } } return x; } +static void _copy_codepoint(const char** str, char** str_out, UG_S16* x) +{ + const UG_FONT* font = &gui->font; + const char* next; + uint32_t codepoint = 0; + UG_U16 char_width = 0; + next = _UG_NextCodepoint(*str, &codepoint); + while (*str < next) { + **str_out = **str; + *str_out += 1; + *str += 1; + } + if (UG_GetCharWidth(font, codepoint, &char_width)) { + *x += char_width; + } +} + // Try to wrap string at spaces if it is longer than `width` pixels. // Since the purpose of this function is to wrap title text, only wrap a single time. The rest of // the title may span/overflow the whole screen. @@ -660,7 +808,9 @@ void UG_WrapTitleString(const char* str, char* str_out, UG_S16 width) { } if (*str == ' ') { UG_S16 wwidth = _word_width(str+1); - if (x + font->widths[(UG_U8)' ' - font->start_char] + wwidth > width) { + UG_U16 space_width = 0; + UG_GetCharWidth(font, ' ', &space_width); + if (x + space_width + wwidth > width) { *str_out = '\n'; str_out += 1; str += 1; @@ -670,12 +820,7 @@ void UG_WrapTitleString(const char* str, char* str_out, UG_S16 width) { str_out += 1; str += 1; while (!_is_whitespace(*str)) { - *str_out = *str; - if (*str >= font->start_char){ - x += font->widths[(UG_U8)*str - font->start_char]; - } - str_out += 1; - str += 1; + _copy_codepoint(&str, &str_out, &x); } continue; } @@ -688,12 +833,7 @@ void UG_WrapTitleString(const char* str, char* str_out, UG_S16 width) { break; } } - *str_out = *str; - if (*str >= font->start_char && *str < font->end_char){ - x += font->widths[(UG_U8)*str - font->start_char]; - } - str_out += 1; - str += 1; + _copy_codepoint(&str, &str_out, &x); } // Copy any bytes that are left @@ -806,7 +946,7 @@ void UG_PutChar( char chr, UG_S16 x, UG_S16 y, UG_COLOR fc, UG_COLOR bc ) { ASSERT(gui != NULL); - _UG_PutChar(chr, x, y, fc, bc, &gui->font); + _UG_PutCodepoint((UG_U8)chr, x, y, fc, bc, &gui->font, false, false); } void UG_SetForecolor( UG_COLOR c ) diff --git a/src/ui/ugui/ugui.h b/src/ui/ugui/ugui.h index fafd4e24b3..7bc1ad7fa7 100644 --- a/src/ui/ugui/ugui.h +++ b/src/ui/ugui/ugui.h @@ -42,17 +42,18 @@ typedef UG_U8 UG_COLOR; /* -------------------------------------------------------------------------------- */ typedef enum { FONT_TYPE_1BPP, - FONT_TYPE_8BPP + FONT_TYPE_8BPP, + FONT_TYPE_LVGL, } FONT_TYPE; typedef struct { - unsigned char *p; + const void *p; FONT_TYPE font_type; UG_S16 char_width; UG_S16 char_height; UG_U16 start_char; UG_U16 end_char; - UG_U8 *widths; + const UG_U8 *widths; } UG_FONT; #define UG_FONT_DATA const @@ -120,6 +121,7 @@ void UG_PutStringNoBreak( UG_S16 x, UG_S16 y, const char *str); void UG_MeasureString( UG_S16 *xout, UG_S16 *yout, const char *str); void UG_MeasureStringNoBreak(UG_S16 *xout, UG_S16 *yout, const char *str); void UG_MeasureStringCentered( UG_S16 *xout, UG_S16 *yout, const char *str); +bool UG_GetCharWidth(const UG_FONT* font, uint32_t codepoint, UG_U16* width); void UG_PutStringNoBreakCenter( UG_S16 x, UG_S16 y, UG_S16 width, const char *str); void UG_PutStringCentered( UG_S16 x, UG_S16 y, UG_S16 width, UG_S16 height, const char *str); void UG_PutChar( char chr, UG_S16 x, UG_S16 y, UG_COLOR fc, UG_COLOR bc ); diff --git a/test/unit-test/test_ugui.c b/test/unit-test/test_ugui.c index aadcaca4ab..57867bc37d 100644 --- a/test/unit-test/test_ugui.c +++ b/test/unit-test/test_ugui.c @@ -6,9 +6,14 @@ #include #include "ui/fonts/arial_fonts.h" +#include "ui/fonts/password_12.h" #include "ui/ugui/ugui.h" #include +#define LV_KCONFIG_IGNORE +#define LV_CONF_SKIP +#include + const char* data[][2] = { {"Bitcoin ", "Bitcoin "}, {"Bitcoin", "Bitcoin"}, @@ -25,6 +30,49 @@ static UG_S16 last_x; static UG_S16 last_y; static UG_COLOR last_color; static uint8_t pixels_set; +static size_t set_pixel_count = 0; +static size_t black_pixel_count = 0; + +static bool _fake_8bpp_get_glyph_dsc( + const lv_font_t* font, + lv_font_glyph_dsc_t* dsc_out, + uint32_t letter, + uint32_t letter_next) +{ + (void)font; + (void)letter; + (void)letter_next; + memset(dsc_out, 0, sizeof(*dsc_out)); + dsc_out->adv_w = 1; + dsc_out->box_w = 1; + dsc_out->box_h = 1; + dsc_out->format = LV_FONT_GLYPH_FORMAT_A8; + return true; +} + +static const void* _fake_get_glyph_bitmap(lv_font_glyph_dsc_t* glyph_dsc, lv_draw_buf_t* draw_buf) +{ + (void)glyph_dsc; + (void)draw_buf; + static const uint8_t bitmap[] = {0xFF}; + return bitmap; +} + +static const lv_font_t _fake_8bpp_lvgl_font = { + .get_glyph_dsc = _fake_8bpp_get_glyph_dsc, + .get_glyph_bitmap = _fake_get_glyph_bitmap, + .line_height = 1, +}; + +static const UG_FONT _fake_8bpp_ugui_font = { + &_fake_8bpp_lvgl_font, + FONT_TYPE_LVGL, + 1, + 1, + 0, + UINT16_MAX, + NULL, +}; static void _set_pixel(UG_S16 x, UG_S16 y, UG_COLOR color) { @@ -32,6 +80,10 @@ static void _set_pixel(UG_S16 x, UG_S16 y, UG_COLOR color) last_y = y; last_color = color; pixels_set++; + set_pixel_count++; + if (color == C_BLACK) { + black_pixel_count++; + } } static void _reset_pixel_capture(void) @@ -45,7 +97,7 @@ static void _reset_pixel_capture(void) static void _test_ugui_word_wrap(void** state) { (void)state; /* unused */ - UG_Init(&gui, _set_pixel, &font_font_a_11X10, 128, 64); + UG_Init(&gui, _set_pixel, &font_arial_9, 128, 64); for (size_t i = 0; i < sizeof(data) / sizeof(*data); ++i) { char buf[1024] = {0}; printf("test:\n%s\n", data[i][0]); @@ -64,7 +116,7 @@ static void _draw_pixel(void* ctx) static void _test_ugui_render_rotated_180(void** state) { (void)state; /* unused */ - UG_Init(&gui, _set_pixel, &font_font_a_11X10, 128, 64); + UG_Init(&gui, _set_pixel, &font_arial_11, 128, 64); _reset_pixel_capture(); UG_RenderRotated180(10, 20, 30, 10, _draw_pixel, NULL); @@ -80,11 +132,75 @@ static void _test_ugui_render_rotated_180(void** state) assert_int_equal(last_y, 24); } +static void _test_ugui_lvgl_font(void** state) +{ + (void)state; /* unused */ + UG_Init(&gui, _set_pixel, &font_arial_9, 128, 64); + + UG_S16 width = 0; + UG_S16 height = 0; + UG_MeasureStringNoBreak( + &width, + &height, + "A" + "\xc3" + "\xa4"); + assert_true(width > 0); + assert_int_equal(height, font_arial_9.char_height); + + set_pixel_count = 0; + black_pixel_count = 0; + UG_PutString(0, 0, " "); + assert_true(set_pixel_count >= (size_t)font_arial_9.char_height); + assert_int_equal(set_pixel_count, black_pixel_count); +} + +static void _test_ugui_lvgl_font_fallback(void** state) +{ + (void)state; /* unused */ + UG_Init(&gui, _set_pixel, &font_password_12, 128, 64); + + UG_U16 width = 0; + assert_true(UG_GetCharWidth(&font_password_12, ' ', &width)); + assert_true(width > 0); + assert_true(UG_GetCharWidth(&font_password_12, 'A', &width)); + assert_true(width > 0); + + set_pixel_count = 0; + black_pixel_count = 0; + UG_PutString(0, 0, " "); + assert_true(set_pixel_count > black_pixel_count); + + set_pixel_count = 0; + black_pixel_count = 0; + UG_PutString(0, 0, "A"); + assert_true(set_pixel_count > black_pixel_count); +} + +static void _test_ugui_lvgl_font_rejects_non_1bpp(void** state) +{ + (void)state; /* unused */ + UG_Init(&gui, _set_pixel, &_fake_8bpp_ugui_font, 128, 64); + + UG_U16 width = 0; + assert_true(UG_GetCharWidth(&_fake_8bpp_ugui_font, 'A', &width)); + assert_int_equal(width, 1); + + set_pixel_count = 0; + black_pixel_count = 0; + UG_PutString(0, 0, "A"); + assert_int_equal(set_pixel_count, 0); + assert_int_equal(black_pixel_count, 0); +} + int main(void) { const struct CMUnitTest tests[] = { cmocka_unit_test(_test_ugui_word_wrap), cmocka_unit_test(_test_ugui_render_rotated_180), + cmocka_unit_test(_test_ugui_lvgl_font), + cmocka_unit_test(_test_ugui_lvgl_font_fallback), + cmocka_unit_test(_test_ugui_lvgl_font_rejects_non_1bpp), }; return cmocka_run_group_tests(tests, NULL, NULL); } diff --git a/test/unit-test/test_ui_components.c b/test/unit-test/test_ui_components.c index 008490fac0..cda591b9f0 100644 --- a/test/unit-test/test_ui_components.c +++ b/test/unit-test/test_ui_components.c @@ -16,7 +16,6 @@ #include #include #include -#include #include #include @@ -35,7 +34,7 @@ static void _set_pixel(UG_S16 x, UG_S16 y, UG_COLOR color) static int _setup(void** state) { (void)state; - UG_Init(&gui, _set_pixel, &font_font_a_11X10, 128, 64); + UG_Init(&gui, _set_pixel, &font_arial_11, 128, 64); return 0; } @@ -127,7 +126,7 @@ static void test_ui_components_confirm(void** state) const confirm_params_t params = { .title = "Is the Code correct?", .body = "CODE", - .font = &font_monogram_5X9, + .font = &font_monogram_16, }; component_t* confirm = confirm_create(¶ms, confirm_callback, NULL); assert_non_null(confirm); diff --git a/test/unit-test/test_ui_util.c b/test/unit-test/test_ui_util.c index f8f77e4602..f5fd159b5f 100644 --- a/test/unit-test/test_ui_util.c +++ b/test/unit-test/test_ui_util.c @@ -213,7 +213,7 @@ static void test_ui_util_position_right_top(void** state) static void test_ui_util_component_render_rotated_180(void** state) { (void)state; - UG_Init(&gui, _set_pixel, &font_font_a_11X10, 128, 64); + UG_Init(&gui, _set_pixel, &font_arial_11, 128, 64); component_t component = { .f = &_pixel_component_functions, .dimension = {.width = 10, .height = 8}, From 5a361e30284eb08f33d425fcfffc986044344096 Mon Sep 17 00:00:00 2001 From: Niklas Dusenlund Date: Wed, 13 May 2026 21:05:25 +0200 Subject: [PATCH 4/9] workflow: allow displayable UTF-8 messages Use the BB02 default font coverage to decide whether signed messages can be shown as text, and add tests for UTF-8 display and hex fallback. --- src/rust/bitbox-hal/src/ui.rs | 8 +- src/rust/bitbox02-rust/src/hal/testing/ui.rs | 16 ++- .../src/workflow/verify_message.rs | 134 +++++++++++++++++- src/rust/bitbox02-sys/build.rs | 1 + src/rust/bitbox02/src/hal/ui.rs | 12 ++ src/rust/bitbox02/src/ui/types.rs | 15 ++ src/rust/bitbox03/src/ui.rs | 4 + 7 files changed, 181 insertions(+), 9 deletions(-) diff --git a/src/rust/bitbox-hal/src/ui.rs b/src/rust/bitbox-hal/src/ui.rs index dff4bfd468..96295b7a3c 100644 --- a/src/rust/bitbox-hal/src/ui.rs +++ b/src/rust/bitbox-hal/src/ui.rs @@ -5,7 +5,7 @@ use core::time::Duration; pub struct UserAbort; -#[derive(Copy, Clone, Default)] +#[derive(Copy, Clone, Default, Eq, PartialEq)] pub enum Font { #[default] Default, @@ -77,6 +77,12 @@ pub trait Ui { /// Returns `Ok(())` if the user accepts, `Err(UserAbort)` if the user rejects. async fn confirm(&mut self, params: &ConfirmParams<'_>) -> Result<(), UserAbort>; + /// Returns true if `font` can render `c`. + /// + /// Control characters such as newlines are workflow-specific layout markers and are not + /// considered font glyphs here. + fn has_glyph(&self, font: Font, c: char) -> bool; + /// Returns `Ok(())` if the user accepts the swap, `Err(UserAbort)` if the user rejects it. async fn confirm_swap(&mut self, title: &str, from: &str, to: &str) -> Result<(), UserAbort>; diff --git a/src/rust/bitbox02-rust/src/hal/testing/ui.rs b/src/rust/bitbox02-rust/src/hal/testing/ui.rs index 6437fe459a..cdbbf89429 100644 --- a/src/rust/bitbox02-rust/src/hal/testing/ui.rs +++ b/src/rust/bitbox02-rust/src/hal/testing/ui.rs @@ -2,7 +2,7 @@ use crate::hal::Ui; use crate::hal::ui::{ - CanCancel, ConfirmParams, Empty, EnterStringParams, Progress, TrinaryChoice, UserAbort, + CanCancel, ConfirmParams, Empty, EnterStringParams, Font, Progress, TrinaryChoice, UserAbort, }; use alloc::boxed::Box; @@ -54,6 +54,7 @@ pub enum Screen { } type EnterStringCb<'a> = Box) -> Result + 'a>; +type HasGlyphCb<'a> = Box bool + 'a>; type MenuCb<'a> = Box) -> Result + 'a>; type TrinaryChoiceCb<'a> = Box, Option<&str>, Option<&str>) -> TrinaryChoice + 'a>; @@ -65,6 +66,7 @@ pub struct TestingUi<'a> { pub screens: Vec, pub confirm_display_sizes: Vec, _enter_string: Option>, + _has_glyph: Option>, _menu: Option>, _trinary_choice: Option>, _quiz_choices: VecDeque, @@ -121,6 +123,13 @@ impl Ui for TestingUi<'_> { Ok(()) } + fn has_glyph(&self, font: Font, c: char) -> bool { + if let Some(has_glyph) = self._has_glyph.as_ref() { + return has_glyph(font, c); + } + matches!(c, ' '..='~' | 'µ' | 'ä' | 'ö' | 'ü' | 'Ä' | 'Ö' | 'Ü') + } + async fn confirm_swap(&mut self, title: &str, from: &str, to: &str) -> Result<(), UserAbort> { self.screens.push(Screen::Swap { title: title.into(), @@ -276,6 +285,7 @@ impl<'a> TestingUi<'a> { confirm_display_sizes: vec![], _abort_nth: None, _enter_string: None, + _has_glyph: None, _menu: None, _trinary_choice: None, _quiz_choices: VecDeque::new(), @@ -303,6 +313,10 @@ impl<'a> TestingUi<'a> { self._enter_string = None; } + pub fn set_has_glyph(&mut self, cb: Box bool + 'a>) { + self._has_glyph = Some(cb); + } + pub fn set_menu(&mut self, cb: MenuCb<'a>) { self._menu = Some(cb); } diff --git a/src/rust/bitbox02-rust/src/workflow/verify_message.rs b/src/rust/bitbox02-rust/src/workflow/verify_message.rs index c9d3e6dbeb..1368ab69b6 100644 --- a/src/rust/bitbox02-rust/src/workflow/verify_message.rs +++ b/src/rust/bitbox02-rust/src/workflow/verify_message.rs @@ -1,12 +1,10 @@ // SPDX-License-Identifier: Apache-2.0 -use crate::hal::ui::ConfirmParams; +use crate::hal::ui::{ConfirmParams, Font}; use alloc::vec::Vec; use crate::hal::Ui; -use util::ascii; - pub enum Error { InvalidInput, UserAbort, @@ -18,10 +16,18 @@ impl core::convert::From for Error { } } +fn is_displayable_with_default_font(ui: &impl Ui, bytes: &[u8]) -> bool { + let Ok(msg) = core::str::from_utf8(bytes) else { + return false; + }; + msg.chars() + .all(|c| c == '\n' || (!c.is_control() && ui.has_glyph(Font::Default, c))) +} + /// Verify a message. /// -/// If the bytes are all printable ascii chars, the message is -/// confirmed one line at a time (the str is split into lines). +/// If the bytes are valid UTF-8 and all codepoints are covered by the default display font, the +/// message is confirmed one line at a time (the str is split into lines). /// /// Otherwise, it is displayed as hex. /// @@ -36,8 +42,12 @@ pub async fn verify( msg: &[u8], is_final: bool, ) -> Result<(), Error> { - if ascii::is_printable_ascii(msg, ascii::Charset::AllNewline) { - // The message is all ascii and printable. + let is_displayable = { + let ui = hal.ui(); + is_displayable_with_default_font(&*ui, msg) + }; + + if is_displayable { let msg = core::str::from_utf8(msg).unwrap(); let pages: Vec<&str> = msg.split('\n').filter(|line| !line.is_empty()).collect(); @@ -76,3 +86,113 @@ pub async fn verify( Ok(()) } } + +#[cfg(test)] +mod tests { + use super::*; + + use alloc::boxed::Box; + + use crate::hal::testing::TestingHal; + use crate::hal::testing::ui::Screen; + + #[test] + fn test_is_displayable_with_default_font() { + let mock_hal = TestingHal::new(); + assert!(is_displayable_with_default_font( + &mock_hal.ui, + "Zürich".as_bytes() + )); + assert!(is_displayable_with_default_font( + &mock_hal.ui, + "µ\nA".as_bytes() + )); + assert!(!is_displayable_with_default_font( + &mock_hal.ui, + "Aȑ".as_bytes() + )); + assert!(!is_displayable_with_default_font( + &mock_hal.ui, + "東京".as_bytes() + )); + assert!(!is_displayable_with_default_font( + &mock_hal.ui, + "tab\t".as_bytes() + )); + assert!(!is_displayable_with_default_font(&mock_hal.ui, &[0xff])); + } + + #[async_test::test] + async fn test_verify_displayable_with_default_font() { + let mut mock_hal = TestingHal::new(); + let result = verify( + &mut mock_hal, + "Sign message", + "Sign", + "Zürich\nµ".as_bytes(), + true, + ) + .await; + assert!(matches!(result, Ok(()))); + + assert_eq!( + mock_hal.ui.screens, + vec![ + Screen::Confirm { + title: "Sign 1/2".into(), + body: "Zürich".into(), + longtouch: false, + }, + Screen::Confirm { + title: "Sign 2/2".into(), + body: "µ".into(), + longtouch: true, + }, + ] + ); + assert_eq!(mock_hal.ui.confirm_display_sizes, vec![0, 0]); + } + + #[async_test::test] + async fn test_verify_hex_if_not_displayable_with_default_font() { + let mut mock_hal = TestingHal::new(); + let result = verify( + &mut mock_hal, + "Sign message", + "Sign", + "東京".as_bytes(), + true, + ) + .await; + assert!(matches!(result, Ok(()))); + + assert_eq!( + mock_hal.ui.screens, + vec![Screen::Confirm { + title: "Sign message\ndata (hex)".into(), + body: "e69db1e4baac".into(), + longtouch: true, + }] + ); + assert_eq!(mock_hal.ui.confirm_display_sizes, vec![6]); + } + + #[async_test::test] + async fn test_verify_hex_if_glyph_missing_from_default_font() { + let mut mock_hal = TestingHal::new(); + mock_hal.ui.set_has_glyph(Box::new(|_font, c| c != 'ȑ')); + + let result = verify(&mut mock_hal, "Sign message", "Sign", "Aȑ".as_bytes(), true).await; + assert!(matches!(result, Ok(()))); + + assert_eq!( + mock_hal.ui.screens, + vec![Screen::Confirm { + title: "Sign message\ndata (hex)".into(), + body: "41c891".into(), + longtouch: true, + }] + ); + assert_eq!(mock_hal.ui.confirm_display_sizes, vec![3]); + } +} diff --git a/src/rust/bitbox02-sys/build.rs b/src/rust/bitbox02-sys/build.rs index af95532339..9e15c63034 100644 --- a/src/rust/bitbox02-sys/build.rs +++ b/src/rust/bitbox02-sys/build.rs @@ -176,6 +176,7 @@ const ALLOWLIST_FNS: &[&str] = &[ "uart_poll", "UG_ClearBuffer", "UG_FontSelect", + "UG_GetCharWidth", "UG_PutString", "UG_SendBuffer", "ui_screen_stack_pop_all", diff --git a/src/rust/bitbox02/src/hal/ui.rs b/src/rust/bitbox02/src/hal/ui.rs index 8b35e9ef57..2791fa83d5 100644 --- a/src/rust/bitbox02/src/hal/ui.rs +++ b/src/rust/bitbox02/src/hal/ui.rs @@ -126,6 +126,10 @@ impl Ui for BitBox02Ui { } } + fn has_glyph(&self, font: Font, c: char) -> bool { + to_bitbox02_font(font).has_glyph(c) + } + #[inline(always)] async fn confirm_swap(&mut self, title: &str, from: &str, to: &str) -> Result<(), UserAbort> { match crate::ui::confirm_swap(title, from, to).await { @@ -284,6 +288,14 @@ mod tests { } } + #[test] + fn test_has_glyph_uses_actual_bitbox02_font() { + assert!(to_bitbox02_font(Font::Default).has_glyph('A')); + assert!(to_bitbox02_font(Font::Default).has_glyph('ü')); + assert!(!to_bitbox02_font(Font::Default).has_glyph('ȑ')); + assert!(!to_bitbox02_font(Font::Default).has_glyph('\t')); + } + #[test] fn test_to_bitbox02_confirm_params() { let fonts = [ diff --git a/src/rust/bitbox02/src/ui/types.rs b/src/rust/bitbox02/src/ui/types.rs index 96bd6a5920..1bd343e47d 100644 --- a/src/rust/bitbox02/src/ui/types.rs +++ b/src/rust/bitbox02/src/ui/types.rs @@ -26,6 +26,21 @@ impl Font { Font::Monogram16 => unsafe { &bitbox02_sys::font_monogram_16 }, } } + + #[cfg_attr(any(feature = "testing", feature = "c-unit-testing"), allow(dead_code))] + pub(crate) fn has_glyph(&self, c: char) -> bool { + if c.is_control() { + return false; + } + let font = match self { + // This mirrors the default font used by the C label component. + Font::Default => unsafe { &bitbox02_sys::font_arial_11 }, + Font::Password12 => unsafe { &bitbox02_sys::font_password_12 }, + Font::Monogram16 => unsafe { &bitbox02_sys::font_monogram_16 }, + }; + let mut width = 0u16; + unsafe { bitbox02_sys::UG_GetCharWidth(font, c as u32, &mut width) } + } } pub enum SdcardResponse { diff --git a/src/rust/bitbox03/src/ui.rs b/src/rust/bitbox03/src/ui.rs index f6830ee783..61a7ab5aa3 100644 --- a/src/rust/bitbox03/src/ui.rs +++ b/src/rust/bitbox03/src/ui.rs @@ -59,6 +59,10 @@ impl hal::ui::Ui for BitBox03Ui { .await } + fn has_glyph(&self, _font: bitbox_hal::ui::Font, c: char) -> bool { + matches!(c, ' '..='~') + } + async fn confirm_swap( &mut self, title: &str, From 3f03aaacd9bb4e26cbe20c8ed968dda6c61ace58 Mon Sep 17 00:00:00 2001 From: Niklas Dusenlund Date: Fri, 15 May 2026 12:18:48 +0200 Subject: [PATCH 5/9] Fix UTF-8 message label truncation Pre-truncate displayable message signing text in Rust so the C label component receives a body that already fits within MAX_LABEL_SIZE. This keeps truncation on UTF-8 character boundaries and avoids relying on the label's byte-level fallback truncation for this path. --- .../src/workflow/verify_message.rs | 79 ++++++++++++++++++- 1 file changed, 77 insertions(+), 2 deletions(-) diff --git a/src/rust/bitbox02-rust/src/workflow/verify_message.rs b/src/rust/bitbox02-rust/src/workflow/verify_message.rs index 1368ab69b6..d0f295b32e 100644 --- a/src/rust/bitbox02-rust/src/workflow/verify_message.rs +++ b/src/rust/bitbox02-rust/src/workflow/verify_message.rs @@ -1,10 +1,14 @@ // SPDX-License-Identifier: Apache-2.0 use crate::hal::ui::{ConfirmParams, Font}; -use alloc::vec::Vec; +use alloc::{borrow::Cow, string::String, vec::Vec}; use crate::hal::Ui; +// Keep this in sync with src/ui/components/label.h:MAX_LABEL_SIZE. +const MAX_LABEL_SIZE: usize = 640; +const TRUNCATION_SUFFIX: &str = "..."; + pub enum Error { InvalidInput, UserAbort, @@ -24,6 +28,21 @@ fn is_displayable_with_default_font(ui: &impl Ui, bytes: &[u8]) -> bool { .all(|c| c == '\n' || (!c.is_control() && ui.has_glyph(Font::Default, c))) } +fn truncate_message_page(page: &str) -> Cow<'_, str> { + if page.len() <= MAX_LABEL_SIZE { + return Cow::Borrowed(page); + } + + let mut end = MAX_LABEL_SIZE - TRUNCATION_SUFFIX.len(); + while !page.is_char_boundary(end) { + end -= 1; + } + let mut result = String::with_capacity(MAX_LABEL_SIZE); + result.push_str(&page[..end]); + result.push_str(TRUNCATION_SUFFIX); + Cow::Owned(result) +} + /// Verify a message. /// /// If the bytes are valid UTF-8 and all codepoints are covered by the default display font, the @@ -55,6 +74,7 @@ pub async fn verify( return Err(Error::InvalidInput); } for (i, &page) in pages.iter().enumerate() { + let body = truncate_message_page(page); let is_last = i == pages.len() - 1; let title = if pages.len() == 1 { title_long.into() @@ -63,7 +83,7 @@ pub async fn verify( }; let params = ConfirmParams { title: &title, - body: page, + body: body.as_ref(), scrollable: true, accept_is_nextarrow: true, // longtouch takes priority over this if enabled longtouch: is_last && is_final, @@ -122,6 +142,32 @@ mod tests { assert!(!is_displayable_with_default_font(&mock_hal.ui, &[0xff])); } + #[test] + fn test_truncate_message_page() { + assert_eq!(truncate_message_page("short").as_ref(), "short"); + + let ascii = "a".repeat(MAX_LABEL_SIZE + 1); + let ascii_truncated = truncate_message_page(&ascii); + assert_eq!(ascii_truncated.len(), MAX_LABEL_SIZE); + assert_eq!( + ascii_truncated.as_ref(), + format!( + "{}{}", + "a".repeat(MAX_LABEL_SIZE - TRUNCATION_SUFFIX.len()), + TRUNCATION_SUFFIX + ) + ); + + let prefix = "a".repeat(MAX_LABEL_SIZE - TRUNCATION_SUFFIX.len() - 1); + let utf8 = format!("{}übbbb", prefix); + let utf8_truncated = truncate_message_page(&utf8); + assert!(utf8_truncated.len() <= MAX_LABEL_SIZE); + assert_eq!( + utf8_truncated.as_ref(), + format!("{}{}", prefix, TRUNCATION_SUFFIX) + ); + } + #[async_test::test] async fn test_verify_displayable_with_default_font() { let mut mock_hal = TestingHal::new(); @@ -153,6 +199,35 @@ mod tests { assert_eq!(mock_hal.ui.confirm_display_sizes, vec![0, 0]); } + #[async_test::test] + async fn test_verify_truncates_displayable_utf8_on_char_boundary() { + let prefix = "a".repeat(MAX_LABEL_SIZE - TRUNCATION_SUFFIX.len() - 1); + let message = format!("{}übbbb", prefix); + let expected_body = format!("{}{}", prefix, TRUNCATION_SUFFIX); + + let mut mock_hal = TestingHal::new(); + let result = verify( + &mut mock_hal, + "Sign message", + "Sign", + message.as_bytes(), + true, + ) + .await; + assert!(matches!(result, Ok(()))); + + assert!(expected_body.len() <= MAX_LABEL_SIZE); + assert_eq!( + mock_hal.ui.screens, + vec![Screen::Confirm { + title: "Sign message".into(), + body: expected_body, + longtouch: true, + }] + ); + assert_eq!(mock_hal.ui.confirm_display_sizes, vec![0]); + } + #[async_test::test] async fn test_verify_hex_if_not_displayable_with_default_font() { let mut mock_hal = TestingHal::new(); From fa41619f39a14784ae4934a6f9744d7ea3f208e6 Mon Sep 17 00:00:00 2001 From: Niklas Dusenlund Date: Tue, 19 May 2026 12:54:59 +0200 Subject: [PATCH 6/9] Limit BB02 LVGL font callbacks Remove legacy uGUI font wrappers and render BB02 OLED text through constrained LVGL fmt_txt callbacks. The local callback implementation only accepts the generated 1bpp, unstrided, no-kerning FORMAT0_TINY font subset used by the device fonts. Update tests and docs so regenerated BB02 fonts keep that compact supported shape. --- .gitmodules | 3 - src/CMakeLists.txt | 9 +- src/bootloader/bootloader.c | 4 +- src/da14531/da14531_handler.c | 2 +- src/rust/bitbox02-sys/build.rs | 17 +-- src/rust/bitbox02-sys/wrapper.h | 5 +- src/ui/components/trinary_input_char.c | 4 +- src/ui/components/trinary_input_string.c | 2 +- src/ui/fonts/README.md | 10 +- src/ui/fonts/arial_11.c | 4 +- src/ui/fonts/arial_11.h | 4 +- src/ui/fonts/arial_11_ugui.c | 8 -- src/ui/fonts/arial_11_ugui.h | 8 -- src/ui/fonts/arial_12.c | 4 +- src/ui/fonts/arial_12.h | 4 +- src/ui/fonts/arial_12_ugui.c | 8 -- src/ui/fonts/arial_12_ugui.h | 8 -- src/ui/fonts/arial_9.c | 4 +- src/ui/fonts/arial_9.h | 4 +- src/ui/fonts/arial_9_ugui.c | 8 -- src/ui/fonts/arial_9_ugui.h | 8 -- src/ui/fonts/arial_fonts.h | 5 +- src/ui/fonts/lvgl_font_compat.c | 116 ++++++--------- src/ui/fonts/monogram_16.c | 2 +- src/ui/fonts/monogram_16.h | 4 +- src/ui/fonts/monogram_16_ugui.c | 8 -- src/ui/fonts/monogram_16_ugui.h | 8 -- src/ui/fonts/password_12.c | 8 +- src/ui/fonts/password_9.c | 8 +- src/ui/ugui/ugui.c | 176 ++++++----------------- src/ui/ugui/ugui.h | 23 +-- test/unit-test/test_ugui.c | 90 +++++------- tools/ttf2lvgl/README.md | 4 + tools/ttf2ugui | 1 - 34 files changed, 170 insertions(+), 411 deletions(-) delete mode 100644 src/ui/fonts/arial_11_ugui.c delete mode 100644 src/ui/fonts/arial_11_ugui.h delete mode 100644 src/ui/fonts/arial_12_ugui.c delete mode 100644 src/ui/fonts/arial_12_ugui.h delete mode 100644 src/ui/fonts/arial_9_ugui.c delete mode 100644 src/ui/fonts/arial_9_ugui.h delete mode 100644 src/ui/fonts/monogram_16_ugui.c delete mode 100644 src/ui/fonts/monogram_16_ugui.h delete mode 160000 tools/ttf2ugui diff --git a/.gitmodules b/.gitmodules index 5bafc55e34..318789c6b1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,6 @@ [submodule "external/cryptoauthlib"] path = external/cryptoauthlib url = https://github.com/BitBoxSwiss/cryptoauthlib.git -[submodule "tools/ttf2ugui"] - path = tools/ttf2ugui - url = https://github.com/BitBoxSwiss/ttf2ugui [submodule "external/optiga-trust-m"] path = external/optiga-trust-m url = https://github.com/BitBoxSwiss/optiga-trust-m.git diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 63aab773e2..4a9609a40c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -38,14 +38,10 @@ set(DBB-FIRMWARE-UI-SOURCES ${CMAKE_SOURCE_DIR}/src/ui/graphics/graphics.c ${CMAKE_SOURCE_DIR}/src/ui/ugui/ugui.c ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_11.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_11_ugui.c ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_12.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_12_ugui.c ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_9.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_9_ugui.c ${CMAKE_SOURCE_DIR}/src/ui/fonts/lvgl_font_compat.c ${CMAKE_SOURCE_DIR}/src/ui/fonts/monogram_16.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/monogram_16_ugui.c ${CMAKE_SOURCE_DIR}/src/ui/fonts/password_9.c ${CMAKE_SOURCE_DIR}/src/ui/fonts/password_12.c ${CMAKE_SOURCE_DIR}/src/ui/screen_saver.c @@ -99,14 +95,10 @@ set(DBB-BOOTLOADER-SOURCES ${CMAKE_SOURCE_DIR}/src/usb/usb_processing.c ${CMAKE_SOURCE_DIR}/src/ui/ugui/ugui.c ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_11.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_11_ugui.c ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_12.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_12_ugui.c ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_9.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/arial_9_ugui.c ${CMAKE_SOURCE_DIR}/src/ui/fonts/lvgl_font_compat.c ${CMAKE_SOURCE_DIR}/src/ui/fonts/monogram_16.c - ${CMAKE_SOURCE_DIR}/src/ui/fonts/monogram_16_ugui.c ${CMAKE_SOURCE_DIR}/src/ui/graphics/graphics.c ${CMAKE_SOURCE_DIR}/src/screen.c ${CMAKE_SOURCE_DIR}/src/hardfault.c @@ -402,6 +394,7 @@ foreach(type ${RUST_LIBS}) _UNIT_TEST_ PRODUCT_BITBOX_MULTI=1 APP_U2F=1 + ${LVGL_DEFINITIONS} ) # For tests all C-files are built into the rust lib. target_include_directories(${type}_rust_c INTERFACE diff --git a/src/bootloader/bootloader.c b/src/bootloader/bootloader.c index 653a4699ed..641ee3ac12 100644 --- a/src/bootloader/bootloader.c +++ b/src/bootloader/bootloader.c @@ -428,10 +428,10 @@ static void _render_hash(const char* title, const uint8_t* hash) snprintf(timer_buf, sizeof(timer_buf), "%ds", seconds - i); UG_MeasureString(&timer_str_width, NULL, timer_buf); UG_PutString( - SCREEN_WIDTH - timer_str_width, SCREEN_HEIGHT - f_regular->char_height, timer_buf); + SCREEN_WIDTH - timer_str_width, SCREEN_HEIGHT - f_regular->line_height, timer_buf); UG_FontSelect(f_mono); - UG_PutString(0, title_margin + f_regular->char_height, hash_multiline); + UG_PutString(0, title_margin + f_regular->line_height, hash_multiline); UG_FontSelect(f_regular); diff --git a/src/da14531/da14531_handler.c b/src/da14531/da14531_handler.c index 886c794ac8..5c5a698eb6 100644 --- a/src/da14531/da14531_handler.c +++ b/src/da14531/da14531_handler.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include const uint8_t* da14531_handler_current_product = NULL; diff --git a/src/rust/bitbox02-sys/build.rs b/src/rust/bitbox02-sys/build.rs index 9e15c63034..b236511173 100644 --- a/src/rust/bitbox02-sys/build.rs +++ b/src/rust/bitbox02-sys/build.rs @@ -54,6 +54,8 @@ const ALLOWLIST_TYPES: &[&str] = &[ const OPAQUE_TYPES: &[&str] = &[ "da14531_protocol_frame", + "_lv_font_t", + "lv_font_t", "RustByteQueue", "RustUsbReportQueue", ]; @@ -259,14 +261,10 @@ const BITBOX02_SOURCES: &[&str] = &[ "src/ui/components/waiting.c", "src/ui/event_handler.c", "src/ui/fonts/arial_11.c", - "src/ui/fonts/arial_11_ugui.c", "src/ui/fonts/arial_12.c", - "src/ui/fonts/arial_12_ugui.c", "src/ui/fonts/arial_9.c", - "src/ui/fonts/arial_9_ugui.c", - "src/ui/fonts/monogram_16.c", - "src/ui/fonts/monogram_16_ugui.c", "src/ui/fonts/lvgl_font_compat.c", + "src/ui/fonts/monogram_16.c", "src/ui/fonts/password_12.c", "src/ui/fonts/password_9.c", "src/ui/graphics/graphics.c", @@ -320,15 +318,18 @@ pub fn main() -> BuildResult<()> { emit_rerun_if_changed("../bitbox-framed-serial-link/src"); emit_rerun_if_changed("../bitbox-bytequeue/Cargo.toml"); emit_rerun_if_changed("../bitbox-bytequeue/src"); - emit_rerun_if_changed("../../../src/ui/fonts/arial_11_ugui.h"); - emit_rerun_if_changed("../../../src/ui/fonts/arial_12_ugui.h"); - emit_rerun_if_changed("../../../src/ui/fonts/arial_9_ugui.h"); emit_rerun_if_changed("../../../versions.json"); emit_rerun_if_changed("../../../src/version.h.tmpl"); emit_rerun_if_changed("../../../src/bootloader/bootloader_version.h.tmpl"); emit_rerun_if_changed("../../../scripts/generate_version_headers.py"); emit_rerun_if_changed("../../../scripts/generate_rust_header.sh"); emit_rerun_if_changed("../bitbox-lvgl-sys/lv_conf.h"); + emit_rerun_if_changed("../../../src/ui/fonts/arial_11.h"); + emit_rerun_if_changed("../../../src/ui/fonts/arial_12.h"); + emit_rerun_if_changed("../../../src/ui/fonts/arial_9.h"); + emit_rerun_if_changed("../../../src/ui/fonts/monogram_16.h"); + emit_rerun_if_changed("../../../src/ui/fonts/password_12.h"); + emit_rerun_if_changed("../../../src/ui/fonts/password_9.h"); // Generating version.h/bootloader_version.h depends on the current state of the git repo emit_git_rerun_if_changed(&repo_root); diff --git a/src/rust/bitbox02-sys/wrapper.h b/src/rust/bitbox02-sys/wrapper.h index 19b1e82ebf..f5ccd64ef1 100644 --- a/src/rust/bitbox02-sys/wrapper.h +++ b/src/rust/bitbox02-sys/wrapper.h @@ -39,12 +39,9 @@ #include #include #include -#include #include -#include #include -#include -#include +#include #include #include #include diff --git a/src/ui/components/trinary_input_char.c b/src/ui/components/trinary_input_char.c index 87865c2e1d..e2c32363e6 100644 --- a/src/ui/components/trinary_input_char.c +++ b/src/ui/components/trinary_input_char.c @@ -271,7 +271,7 @@ static void _put_string( if (elements_size > 6) { // split in two halfs; size/2 rounded up const size_t half = (elements_size + 1) / 2; - _put_string(font, x_offset, y_offset - font->char_height - 1, horiz_space, elements, half); + _put_string(font, x_offset, y_offset - font->line_height - 1, horiz_space, elements, half); _put_string(font, x_offset, y_offset, horiz_space, elements + half, elements_size - half); return; } @@ -360,7 +360,7 @@ static void _set_alphabet_internal( element->character = alphabet[char_idx]; } - UG_S16 y_offset = SCREEN_HEIGHT - data->font->char_height; + UG_S16 y_offset = SCREEN_HEIGHT - data->font->line_height; { // left _put_string(data->font, 0, y_offset, data->horiz_space, elements_lookup, left_size); } diff --git a/src/ui/components/trinary_input_string.c b/src/ui/components/trinary_input_string.c index 2f82519e58..9679add086 100644 --- a/src/ui/components/trinary_input_string.c +++ b/src/ui/components/trinary_input_string.c @@ -214,7 +214,7 @@ static void _render(component_t* component) // Draw '...' when the left part scrolled out of view. if (data->target_x < STRING_POS_X_START) { // HACK: blank out the chars rendered at this position first. - UG_FillFrame(0, STRING_POS_Y, 11, STRING_POS_Y + _font->char_height, screen_back_color); + UG_FillFrame(0, STRING_POS_Y, 11, STRING_POS_Y + _font->line_height, screen_back_color); UG_PutString(0, STRING_POS_Y, "..."); } diff --git a/src/ui/fonts/README.md b/src/ui/fonts/README.md index 17849c5731..e4889e6ac5 100644 --- a/src/ui/fonts/README.md +++ b/src/ui/fonts/README.md @@ -22,8 +22,14 @@ decodes `` as UTF-8 and prints it with asterixes in the terminal: ``` Once you have `dump`ed the font there will be a `.c` and `.h` file in the current directory. Move -these files to this directory and add the small `UG_FONT` compatibility wrapper when the font must -also be used through uGUI. +these files to this directory. BitBox02 OLED fonts are exported directly as `font_*` LVGL font +objects; `UG_FONT` is an alias for `lv_font_t`, so no separate uGUI wrapper is needed. + +For BitBox02 uGUI use, keep the generated font in the compact subset consumed by `ugui.c`: 1bpp, +`stride = 0`, no kerning, and `LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY` cmaps only. The local +`lv_font_get_glyph_dsc_fmt_txt` and `lv_font_get_bitmap_fmt_txt` callbacks only support this subset. +If the historical uGUI layout height differs from the generated FreeType line height, set +`.line_height` to the uGUI layout height. ## libfreetype note diff --git a/src/ui/fonts/arial_11.c b/src/ui/fonts/arial_11.c index 86a67eabd6..a3b17560ad 100644 --- a/src/ui/fonts/arial_11.c +++ b/src/ui/fonts/arial_11.c @@ -1463,10 +1463,10 @@ static const lv_font_fmt_txt_dsc_t font_dsc = { .stride = 0, }; -const lv_font_t arial_11 = { +const UG_FONT font_arial_11 = { .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, - .line_height = 16, + .line_height = 10, .base_line = 2, .subpx = LV_FONT_SUBPX_NONE, .underline_position = -1, diff --git a/src/ui/fonts/arial_11.h b/src/ui/fonts/arial_11.h index 13ab2ab574..25dabd6810 100644 --- a/src/ui/fonts/arial_11.h +++ b/src/ui/fonts/arial_11.h @@ -1,8 +1,8 @@ #ifndef _ARIAL_11_H_ #define _ARIAL_11_H_ -typedef struct _lv_font_t lv_font_t; +#include -extern const lv_font_t arial_11; +extern const UG_FONT font_arial_11; #endif diff --git a/src/ui/fonts/arial_11_ugui.c b/src/ui/fonts/arial_11_ugui.c deleted file mode 100644 index 593c36073f..0000000000 --- a/src/ui/fonts/arial_11_ugui.c +++ /dev/null @@ -1,8 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#include "arial_11.h" -#include "arial_11_ugui.h" - -#include - -const UG_FONT font_arial_11 = {&arial_11, FONT_TYPE_LVGL, 11, 10, 0, UINT16_MAX, NULL}; diff --git a/src/ui/fonts/arial_11_ugui.h b/src/ui/fonts/arial_11_ugui.h deleted file mode 100644 index 8bf046bea2..0000000000 --- a/src/ui/fonts/arial_11_ugui.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _ARIAL_11_UGUI_H_ -#define _ARIAL_11_UGUI_H_ - -#include - -extern const UG_FONT font_arial_11; - -#endif diff --git a/src/ui/fonts/arial_12.c b/src/ui/fonts/arial_12.c index 7079f1ddef..dd25cb37db 100644 --- a/src/ui/fonts/arial_12.c +++ b/src/ui/fonts/arial_12.c @@ -1466,10 +1466,10 @@ static const lv_font_fmt_txt_dsc_t font_dsc = { .stride = 0, }; -const lv_font_t arial_12 = { +const UG_FONT font_arial_12 = { .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, - .line_height = 18, + .line_height = 12, .base_line = 2, .subpx = LV_FONT_SUBPX_NONE, .underline_position = -1, diff --git a/src/ui/fonts/arial_12.h b/src/ui/fonts/arial_12.h index ff4168dcb6..0fe4db3611 100644 --- a/src/ui/fonts/arial_12.h +++ b/src/ui/fonts/arial_12.h @@ -1,8 +1,8 @@ #ifndef _ARIAL_12_H_ #define _ARIAL_12_H_ -typedef struct _lv_font_t lv_font_t; +#include -extern const lv_font_t arial_12; +extern const UG_FONT font_arial_12; #endif diff --git a/src/ui/fonts/arial_12_ugui.c b/src/ui/fonts/arial_12_ugui.c deleted file mode 100644 index 2b74361032..0000000000 --- a/src/ui/fonts/arial_12_ugui.c +++ /dev/null @@ -1,8 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#include "arial_12.h" -#include "arial_12_ugui.h" - -#include - -const UG_FONT font_arial_12 = {&arial_12, FONT_TYPE_LVGL, 11, 12, 0, UINT16_MAX, NULL}; diff --git a/src/ui/fonts/arial_12_ugui.h b/src/ui/fonts/arial_12_ugui.h deleted file mode 100644 index 2e9eed780c..0000000000 --- a/src/ui/fonts/arial_12_ugui.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _ARIAL_12_UGUI_H_ -#define _ARIAL_12_UGUI_H_ - -#include - -extern const UG_FONT font_arial_12; - -#endif diff --git a/src/ui/fonts/arial_9.c b/src/ui/fonts/arial_9.c index 980ac55cd5..85c024f726 100644 --- a/src/ui/fonts/arial_9.c +++ b/src/ui/fonts/arial_9.c @@ -1460,10 +1460,10 @@ static const lv_font_fmt_txt_dsc_t font_dsc = { .stride = 0, }; -const lv_font_t arial_9 = { +const UG_FONT font_arial_9 = { .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, - .line_height = 15, + .line_height = 9, .base_line = 2, .subpx = LV_FONT_SUBPX_NONE, .underline_position = -1, diff --git a/src/ui/fonts/arial_9.h b/src/ui/fonts/arial_9.h index 569c3bb4be..08107c671a 100644 --- a/src/ui/fonts/arial_9.h +++ b/src/ui/fonts/arial_9.h @@ -1,8 +1,8 @@ #ifndef _ARIAL_9_H_ #define _ARIAL_9_H_ -typedef struct _lv_font_t lv_font_t; +#include -extern const lv_font_t arial_9; +extern const UG_FONT font_arial_9; #endif diff --git a/src/ui/fonts/arial_9_ugui.c b/src/ui/fonts/arial_9_ugui.c deleted file mode 100644 index 6b598ace20..0000000000 --- a/src/ui/fonts/arial_9_ugui.c +++ /dev/null @@ -1,8 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#include "arial_9.h" -#include "arial_9_ugui.h" - -#include - -const UG_FONT font_arial_9 = {&arial_9, FONT_TYPE_LVGL, 9, 9, 0, UINT16_MAX, NULL}; diff --git a/src/ui/fonts/arial_9_ugui.h b/src/ui/fonts/arial_9_ugui.h deleted file mode 100644 index 45c8b45084..0000000000 --- a/src/ui/fonts/arial_9_ugui.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _ARIAL_9_UGUI_H_ -#define _ARIAL_9_UGUI_H_ - -#include - -extern const UG_FONT font_arial_9; - -#endif diff --git a/src/ui/fonts/arial_fonts.h b/src/ui/fonts/arial_fonts.h index 96ed04b1b2..f845abaab9 100644 --- a/src/ui/fonts/arial_fonts.h +++ b/src/ui/fonts/arial_fonts.h @@ -4,11 +4,8 @@ #define _ARIAL_FONTS_H_ #include "arial_11.h" -#include "arial_11_ugui.h" #include "arial_12.h" -#include "arial_12_ugui.h" #include "arial_9.h" -#include "arial_9_ugui.h" -#include "monogram_16_ugui.h" +#include "monogram_16.h" #endif diff --git a/src/ui/fonts/lvgl_font_compat.c b/src/ui/fonts/lvgl_font_compat.c index c3d1931f81..1cd286b0f0 100644 --- a/src/ui/fonts/lvgl_font_compat.c +++ b/src/ui/fonts/lvgl_font_compat.c @@ -1,78 +1,43 @@ // SPDX-License-Identifier: Apache-2.0 +#include "lvgl.h" + #include #include -#include -#include - -static uint32_t _get_glyph_dsc_id(const lv_font_t* font, uint32_t letter) +static bool _font_dsc_supported(const lv_font_fmt_txt_dsc_t* font_dsc) { - if (letter == '\0') { - return 0; + if (font_dsc == NULL || font_dsc->glyph_bitmap == NULL || font_dsc->glyph_dsc == NULL || + (font_dsc->cmap_num != 0 && font_dsc->cmaps == NULL) || font_dsc->bpp != 1 || + font_dsc->stride != 0 || font_dsc->bitmap_format != LV_FONT_FMT_TXT_PLAIN || + font_dsc->kern_dsc != NULL || font_dsc->kern_scale != 0 || font_dsc->kern_classes != 0) { + return false; } - const lv_font_fmt_txt_dsc_t* font_dsc = (const lv_font_fmt_txt_dsc_t*)font->dsc; for (uint16_t i = 0; i < font_dsc->cmap_num; i++) { const lv_font_fmt_txt_cmap_t* cmap = &font_dsc->cmaps[i]; - uint32_t relative_codepoint = letter - cmap->range_start; - if (relative_codepoint >= cmap->range_length) { - continue; - } - - switch (cmap->type) { - case LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY: - return cmap->glyph_id_start + relative_codepoint; - case LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL: { - const uint8_t* glyph_id_offsets = (const uint8_t*)cmap->glyph_id_ofs_list; - if (glyph_id_offsets[relative_codepoint] == 0 && relative_codepoint != 0) { - return 0; - } - return cmap->glyph_id_start + glyph_id_offsets[relative_codepoint]; - } - case LV_FONT_FMT_TXT_CMAP_SPARSE_TINY: - for (uint16_t j = 0; j < cmap->list_length; j++) { - if (cmap->unicode_list[j] == relative_codepoint) { - return cmap->glyph_id_start + j; - } - } - return 0; - case LV_FONT_FMT_TXT_CMAP_SPARSE_FULL: - for (uint16_t j = 0; j < cmap->list_length; j++) { - if (cmap->unicode_list[j] == relative_codepoint) { - const uint16_t* glyph_id_offsets = (const uint16_t*)cmap->glyph_id_ofs_list; - return cmap->glyph_id_start + glyph_id_offsets[j]; - } - } - return 0; - default: - return 0; + if (cmap->type != LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY || cmap->unicode_list != NULL || + cmap->glyph_id_ofs_list != NULL || cmap->list_length != 0) { + return false; } } - return 0; + return true; } -__attribute__((weak)) bool lv_font_get_glyph_dsc( - const lv_font_t* font, - lv_font_glyph_dsc_t* dsc_out, - uint32_t letter, - uint32_t letter_next) +static uint32_t _get_glyph_id(const lv_font_fmt_txt_dsc_t* font_dsc, uint32_t codepoint) { - if (font == NULL || dsc_out == NULL) { - return false; + if (codepoint == '\0') { + return 0; } - memset(dsc_out, 0, sizeof(*dsc_out)); - for (const lv_font_t* f = font; f != NULL; f = f->fallback) { - if (f->get_glyph_dsc == NULL) { - continue; - } - if (f->get_glyph_dsc(f, dsc_out, letter, letter_next)) { - dsc_out->resolved_font = f; - return true; + for (uint16_t i = 0; i < font_dsc->cmap_num; i++) { + const lv_font_fmt_txt_cmap_t* cmap = &font_dsc->cmaps[i]; + uint32_t relative_codepoint = codepoint - cmap->range_start; + if (relative_codepoint < cmap->range_length) { + return cmap->glyph_id_start + relative_codepoint; } } - return false; + return 0; } __attribute__((weak)) bool lv_font_get_glyph_dsc_fmt_txt( @@ -82,7 +47,7 @@ __attribute__((weak)) bool lv_font_get_glyph_dsc_fmt_txt( uint32_t unicode_letter_next) { (void)unicode_letter_next; - if (font == NULL || dsc_out == NULL) { + if (font == NULL || font->dsc == NULL || dsc_out == NULL) { return false; } @@ -91,40 +56,32 @@ __attribute__((weak)) bool lv_font_get_glyph_dsc_fmt_txt( unicode_letter = ' '; } - memset(dsc_out, 0, sizeof(*dsc_out)); - const lv_font_fmt_txt_dsc_t* font_dsc = (const lv_font_fmt_txt_dsc_t*)font->dsc; - uint32_t glyph_id = _get_glyph_dsc_id(font, unicode_letter); + if (!_font_dsc_supported(font_dsc)) { + return false; + } + + uint32_t glyph_id = _get_glyph_id(font_dsc, unicode_letter); if (glyph_id == 0) { return false; } const lv_font_fmt_txt_glyph_dsc_t* glyph_dsc = &font_dsc->glyph_dsc[glyph_id]; - uint32_t advance_width = (glyph_dsc->adv_w + (1 << 3)) >> 4; - if (is_tab) { - advance_width *= 2; - } + memset(dsc_out, 0, sizeof(*dsc_out)); dsc_out->resolved_font = font; - dsc_out->adv_w = advance_width; + dsc_out->adv_w = (glyph_dsc->adv_w + (1 << 3)) >> 4; dsc_out->box_w = glyph_dsc->box_w; dsc_out->box_h = glyph_dsc->box_h; dsc_out->ofs_x = glyph_dsc->ofs_x; dsc_out->ofs_y = glyph_dsc->ofs_y; - dsc_out->format = (lv_font_glyph_format_t)font_dsc->bpp; + dsc_out->stride = 0; + dsc_out->format = LV_FONT_GLYPH_FORMAT_A1; dsc_out->is_placeholder = false; dsc_out->gid.index = glyph_id; - if (font_dsc->stride == 0) { - dsc_out->stride = 0; - } else { - uint32_t width_in_bytes = (dsc_out->box_w * font_dsc->bpp + 7) >> 3; - dsc_out->stride = ((width_in_bytes + font_dsc->stride - 1) / font_dsc->stride) * - font_dsc->stride; - } - if (is_tab) { - dsc_out->box_w *= 2; + dsc_out->adv_w *= 2; } return true; @@ -135,11 +92,18 @@ __attribute__((weak)) const void* lv_font_get_bitmap_fmt_txt( lv_draw_buf_t* draw_buf) { (void)draw_buf; - if (glyph_dsc == NULL || glyph_dsc->resolved_font == NULL) { + if (glyph_dsc == NULL || glyph_dsc->resolved_font == NULL || + glyph_dsc->resolved_font->dsc == NULL || glyph_dsc->gid.index == 0 || + glyph_dsc->format != LV_FONT_GLYPH_FORMAT_A1 || glyph_dsc->stride != 0) { return NULL; } + const lv_font_fmt_txt_dsc_t* font_dsc = (const lv_font_fmt_txt_dsc_t*)glyph_dsc->resolved_font->dsc; + if (!_font_dsc_supported(font_dsc)) { + return NULL; + } + const lv_font_fmt_txt_glyph_dsc_t* font_glyph_dsc = &font_dsc->glyph_dsc[glyph_dsc->gid.index]; return &font_dsc->glyph_bitmap[font_glyph_dsc->bitmap_index]; diff --git a/src/ui/fonts/monogram_16.c b/src/ui/fonts/monogram_16.c index 64aa5e887b..75334cf3b4 100644 --- a/src/ui/fonts/monogram_16.c +++ b/src/ui/fonts/monogram_16.c @@ -431,7 +431,7 @@ static const lv_font_fmt_txt_dsc_t font_dsc = { .stride = 0, }; -const lv_font_t monogram_16 = { +const UG_FONT font_monogram_16 = { .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, .line_height = 9, diff --git a/src/ui/fonts/monogram_16.h b/src/ui/fonts/monogram_16.h index a54a2bb6e6..7f237cbb71 100644 --- a/src/ui/fonts/monogram_16.h +++ b/src/ui/fonts/monogram_16.h @@ -1,8 +1,8 @@ #ifndef _MONOGRAM_16_H_ #define _MONOGRAM_16_H_ -typedef struct _lv_font_t lv_font_t; +#include -extern const lv_font_t monogram_16; +extern const UG_FONT font_monogram_16; #endif diff --git a/src/ui/fonts/monogram_16_ugui.c b/src/ui/fonts/monogram_16_ugui.c deleted file mode 100644 index 43f22c042f..0000000000 --- a/src/ui/fonts/monogram_16_ugui.c +++ /dev/null @@ -1,8 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -#include "monogram_16.h" -#include "monogram_16_ugui.h" - -#include - -const UG_FONT font_monogram_16 = {&monogram_16, FONT_TYPE_LVGL, 6, 9, 0, UINT16_MAX, NULL}; diff --git a/src/ui/fonts/monogram_16_ugui.h b/src/ui/fonts/monogram_16_ugui.h deleted file mode 100644 index 20f6223f21..0000000000 --- a/src/ui/fonts/monogram_16_ugui.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _MONOGRAM_16_UGUI_H_ -#define _MONOGRAM_16_UGUI_H_ - -#include - -extern const UG_FONT font_monogram_16; - -#endif diff --git a/src/ui/fonts/password_12.c b/src/ui/fonts/password_12.c index 8b3e6cedc4..549965e168 100644 --- a/src/ui/fonts/password_12.c +++ b/src/ui/fonts/password_12.c @@ -39,18 +39,16 @@ static const lv_font_fmt_txt_dsc_t font_dsc = { .stride = 0, }; -static const lv_font_t password_12 = { +const UG_FONT font_password_12 = { .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, - .line_height = 18, + .line_height = 12, .base_line = 2, .subpx = LV_FONT_SUBPX_NONE, .underline_position = -1, .underline_thickness = 0, .static_bitmap = 0, .dsc = &font_dsc, - .fallback = &arial_12, + .fallback = &font_arial_12, .user_data = NULL, }; - -const UG_FONT font_password_12 = {&password_12, FONT_TYPE_LVGL, 11, 12, 0, UINT16_MAX, NULL}; diff --git a/src/ui/fonts/password_9.c b/src/ui/fonts/password_9.c index 17ce1f7e04..765d431dc0 100644 --- a/src/ui/fonts/password_9.c +++ b/src/ui/fonts/password_9.c @@ -39,18 +39,16 @@ static const lv_font_fmt_txt_dsc_t font_dsc = { .stride = 0, }; -static const lv_font_t password_9 = { +const UG_FONT font_password_9 = { .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, - .line_height = 15, + .line_height = 9, .base_line = 2, .subpx = LV_FONT_SUBPX_NONE, .underline_position = -1, .underline_thickness = 0, .static_bitmap = 0, .dsc = &font_dsc, - .fallback = &arial_9, + .fallback = &font_arial_9, .user_data = NULL, }; - -const UG_FONT font_password_9 = {&password_9, FONT_TYPE_LVGL, 9, 9, 0, UINT16_MAX, NULL}; diff --git a/src/ui/ugui/ugui.c b/src/ui/ugui/ugui.c index 9e1758def9..496b663917 100644 --- a/src/ui/ugui/ugui.c +++ b/src/ui/ugui/ugui.c @@ -51,8 +51,6 @@ #include #include -#include -#include #include #include #include @@ -127,183 +125,91 @@ static const char* _UG_NextCodepoint(const char* str, uint32_t* codepoint) return str + 1; } -static bool _UG_GetLvglGlyphDsc( - const UG_FONT* font, - uint32_t codepoint, - lv_font_glyph_dsc_t* glyph_dsc) +static bool _UG_GetGlyph(const UG_FONT* font, uint32_t codepoint, lv_font_glyph_dsc_t* glyph_dsc) { - const lv_font_t* lv_font = (const lv_font_t*)font->p; - if (lv_font == NULL || lv_font->get_glyph_dsc == NULL) { - return false; + for (const lv_font_t* f = font; f != NULL; f = f->fallback) { + if (f->get_glyph_dsc == NULL) { + continue; + } + if (f->get_glyph_dsc(f, glyph_dsc, codepoint, 0)) { + glyph_dsc->resolved_font = f; + return true; + } } - memset(glyph_dsc, 0, sizeof(*glyph_dsc)); - return lv_font_get_glyph_dsc(lv_font, glyph_dsc, codepoint, 0); + return false; } bool UG_GetCharWidth(const UG_FONT* font, uint32_t codepoint, UG_U16* width) { - if (font->font_type == FONT_TYPE_LVGL) { - lv_font_glyph_dsc_t glyph_dsc; - if (!_UG_GetLvglGlyphDsc(font, codepoint, &glyph_dsc)) { - return false; - } - *width = glyph_dsc.adv_w; - return true; - } - - if (codepoint > UINT16_MAX || codepoint < font->start_char || codepoint > font->end_char) { + lv_font_glyph_dsc_t glyph_dsc; + if (!_UG_GetGlyph(font, codepoint, &glyph_dsc)) { return false; } - *width = font->widths ? font->widths[codepoint - font->start_char] : font->char_width; + *width = glyph_dsc.adv_w; return true; } -static bool _UG_LvglGlyphPixelSet( +static bool _UG_GlyphPixelSet( const uint8_t* bitmap, const lv_font_glyph_dsc_t* glyph_dsc, UG_U16 x, UG_U16 y) { - uint32_t bit_index = glyph_dsc->stride != 0 - ? ((uint32_t)y * glyph_dsc->stride * 8 + (uint32_t)x) - : ((uint32_t)y * glyph_dsc->box_w + x); + uint32_t bit_index = (uint32_t)y * glyph_dsc->box_w + x; return ((bitmap[bit_index / 8] >> (7 - (bit_index % 8))) & 0x01) != 0; } -static void _UG_PutLvglCodepoint( - uint32_t codepoint, - UG_S16 x, - UG_S16 y, - UG_COLOR fc, - UG_COLOR bc, - const UG_FONT* font, - bool inverted, - bool transparent) +static void _UG_PutCodepoint( uint32_t codepoint, UG_S16 x, UG_S16 y, UG_COLOR fc, UG_COLOR bc, + const UG_FONT *font, bool inverted, bool transparent) { lv_font_glyph_dsc_t glyph_dsc; - if (!_UG_GetLvglGlyphDsc(font, codepoint, &glyph_dsc)) { + if (!_UG_GetGlyph(font, codepoint, &glyph_dsc)) { return; } const lv_font_t* resolved_font = glyph_dsc.resolved_font; - if (resolved_font == NULL) { + if (resolved_font == NULL || glyph_dsc.format != LV_FONT_GLYPH_FORMAT_A1 || + glyph_dsc.stride != 0) { return; } - UG_U16 actual_char_width = glyph_dsc.adv_w; - if (x + actual_char_width < 0 || x > gui->x_dim) { - return; - } - if (glyph_dsc.format != LV_FONT_GLYPH_FORMAT_A1) { + + if (x + glyph_dsc.adv_w < 0 || x > gui->x_dim) { return; } + if (!transparent) { - for (UG_U16 row = 0; row < font->char_height; row++) { - for (UG_U16 col = 0; col < actual_char_width; col++) { + for (UG_S16 row = 0; row < font->line_height; row++) { + for (UG_U16 col = 0; col < glyph_dsc.adv_w; col++) { _UG_PSet(x + col, y + row, bc); } } } - if (glyph_dsc.box_w == 0 || glyph_dsc.box_h == 0 || + if (codepoint == '\t' || glyph_dsc.box_w == 0 || glyph_dsc.box_h == 0 || resolved_font->get_glyph_bitmap == NULL) { return; } - glyph_dsc.req_raw_bitmap = 1; const uint8_t* bitmap = (const uint8_t*)resolved_font->get_glyph_bitmap(&glyph_dsc, NULL); if (bitmap == NULL) { return; } UG_S16 glyph_y = - font->char_height - resolved_font->base_line - glyph_dsc.box_h - glyph_dsc.ofs_y; + font->line_height - resolved_font->base_line - glyph_dsc.box_h - glyph_dsc.ofs_y; for (UG_U16 row = 0; row < glyph_dsc.box_h; row++) { for (UG_U16 col = 0; col < glyph_dsc.box_w; col++) { UG_S16 xo = x + glyph_dsc.ofs_x + col; UG_S16 yo = y + glyph_y + row; if (inverted) { - xo = x + actual_char_width - 1 - (glyph_dsc.ofs_x + col); - yo = y + font->char_height - 1 - (glyph_y + row); + xo = x + glyph_dsc.adv_w - 1 - (glyph_dsc.ofs_x + col); + yo = y + font->line_height - 1 - (glyph_y + row); } - if (_UG_LvglGlyphPixelSet(bitmap, &glyph_dsc, col, row)) { + if (_UG_GlyphPixelSet(bitmap, &glyph_dsc, col, row)) { _UG_PSet(xo, yo, fc); } } } } -static void _UG_PutCodepoint( uint32_t codepoint, UG_S16 x, UG_S16 y, UG_COLOR fc, UG_COLOR bc, - const UG_FONT *font, bool inverted, bool transparent) -{ - UG_U16 i, j, k, xo, yo, c, bn, actual_char_width; - UG_U8 b; - UG_U16 bt; - UG_U32 index; - UG_COLOR color; - const unsigned char* font_data = (const unsigned char*)font->p; - - if (font->font_type == FONT_TYPE_LVGL) { - _UG_PutLvglCodepoint(codepoint, x, y, fc, bc, font, inverted, transparent); - return; - } - - if (codepoint > UINT16_MAX || codepoint < font->start_char || codepoint > font->end_char) { - return; - } - bt = (UG_U16)codepoint; - - yo = y; - bn = font->char_width; - if ( !bn ) { - return; - } - bn >>= 3; - if ( font->char_width % 8 ) { - bn++; - } - actual_char_width = (font->widths ? font->widths[bt - font->start_char] : - font->char_width); - - if (x + actual_char_width < 0 || x > gui->x_dim) { - return; - } - - if (font->font_type == FONT_TYPE_1BPP) { - index = (bt - font->start_char) * font->char_height * bn; - for ( j = 0; j < font->char_height; j++ ) { - xo = x; - c = actual_char_width; - for ( i = 0; i < bn; i++ ) { - b = font_data[index++]; - for ( k = 0; (k < 8) && c; k++ ) { - if ( b & 0x01 ) { - _UG_PSet(xo, yo, fc); - } else { - _UG_PSet(xo, yo, bc); - } - b >>= 1; - xo++; - c--; - } - } - yo++; - } - } else if (font->font_type == FONT_TYPE_8BPP) { - index = (bt - font->start_char) * font->char_height * font->char_width; - for ( j = 0; j < font->char_height; j++ ) { - xo = x; - for ( i = 0; i < actual_char_width; i++ ) { - b = font_data[index++]; - color = ((((fc & 0xFF) * b + (bc & 0xFF) * (256 - b)) >> 8) & 0xFF) |//Blue component - ((((fc & 0xFF00) * b + (bc & 0xFF00) * (256 - b)) >> 8) & 0xFF00) |//Green component - ((((fc & 0xFF0000) * b + (bc & 0xFF0000) * (256 - b)) >> 8) & 0xFF0000); //Red component - _UG_PSet(xo, yo, color); - xo++; - } - index += font->char_width - actual_char_width; - yo++; - } - } -} - static void _UG_PutString( UG_S16 x, UG_S16 y, UG_S16 *xout, UG_S16 *yout, const char *str, int autobreak, int calconly ) { @@ -321,7 +227,7 @@ static void _UG_PutString( UG_S16 x, UG_S16 y, UG_S16 *xout, UG_S16 *yout, const while (*cursor != '\0') { cursor = _UG_NextCodepoint(cursor, &codepoint); - if (codepoint != '\n' && !UG_GetCharWidth(&gui->font, codepoint, &cw)) { + if (codepoint != '\n' && !UG_GetCharWidth(gui->font, codepoint, &cw)) { continue; } if ( codepoint == '\n' ) { @@ -329,19 +235,19 @@ static void _UG_PutString( UG_S16 x, UG_S16 y, UG_S16 *xout, UG_S16 *yout, const xp = gui->x_dim; } else { xp = x; - yp += gui->font.char_height + gui->char_v_space; + yp += gui->font->line_height + gui->char_v_space; } continue; } if ( autobreak == 1 && xp + cw > gui->x_dim - 1 ) { xp = x; - yp += gui->font.char_height + gui->char_v_space; + yp += gui->font->line_height + gui->char_v_space; } if (!calconly) { _UG_PutCodepoint( - codepoint, xp, yp, gui->fore_color, gui->back_color, &gui->font, false, false); + codepoint, xp, yp, gui->fore_color, gui->back_color, gui->font, false, false); } xp += cw + gui->char_h_space; @@ -353,7 +259,7 @@ static void _UG_PutString( UG_S16 x, UG_S16 y, UG_S16 *xout, UG_S16 *yout, const *xout = max_x; } if (yout) { - *yout = yp + gui->font.char_height; + *yout = yp + gui->font->line_height; } } @@ -367,7 +273,7 @@ UG_S16 UG_Init( UG_GUI *g, void (*p)(UG_S16, UG_S16, UG_COLOR), g->pset = p; g->x_dim = x; g->y_dim = y; - g->font = *font; + g->font = font; g->char_h_space = 1; g->char_v_space = 1; g->fore_color = C_WHITE; @@ -383,7 +289,7 @@ void UG_FontSelect( const UG_FONT *font ) ASSERT(gui != NULL); ASSERT(font != NULL); - gui->font = *font; + gui->font = font; } void UG_FillScreen( UG_COLOR c ) @@ -752,7 +658,7 @@ static bool _is_whitespace(char c) { } static UG_S16 _word_width(const char* p) { - const UG_FONT* font = &gui->font; + const UG_FONT* font = gui->font; UG_S16 x = 0; while(!_is_whitespace(*p)) { uint32_t codepoint = 0; @@ -767,7 +673,7 @@ static UG_S16 _word_width(const char* p) { static void _copy_codepoint(const char** str, char** str_out, UG_S16* x) { - const UG_FONT* font = &gui->font; + const UG_FONT* font = gui->font; const char* next; uint32_t codepoint = 0; UG_U16 char_width = 0; @@ -793,7 +699,7 @@ void UG_WrapTitleString(const char* str, char* str_out, UG_S16 width) { ASSERT(str_out != NULL); const char* start = str; - const UG_FONT* font = &gui->font; + const UG_FONT* font = gui->font; UG_S16 x = 0; // This loop will copy bytes until the first newline. @@ -946,7 +852,7 @@ void UG_PutChar( char chr, UG_S16 x, UG_S16 y, UG_COLOR fc, UG_COLOR bc ) { ASSERT(gui != NULL); - _UG_PutCodepoint((UG_U8)chr, x, y, fc, bc, &gui->font, false, false); + _UG_PutCodepoint((UG_U8)chr, x, y, fc, bc, gui->font, false, false); } void UG_SetForecolor( UG_COLOR c ) diff --git a/src/ui/ugui/ugui.h b/src/ui/ugui/ugui.h index 7bc1ad7fa7..4ef03ceaf0 100644 --- a/src/ui/ugui/ugui.h +++ b/src/ui/ugui/ugui.h @@ -23,7 +23,8 @@ #include #include #include -#include + +#include /* -------------------------------------------------------------------------------- */ /* -- TYPEDEFS -- */ @@ -40,23 +41,7 @@ typedef UG_U8 UG_COLOR; /* -------------------------------------------------------------------------------- */ /* -- µGUI FONTS -- */ /* -------------------------------------------------------------------------------- */ -typedef enum { - FONT_TYPE_1BPP, - FONT_TYPE_8BPP, - FONT_TYPE_LVGL, -} FONT_TYPE; - -typedef struct { - const void *p; - FONT_TYPE font_type; - UG_S16 char_width; - UG_S16 char_height; - UG_U16 start_char; - UG_U16 end_char; - const UG_U8 *widths; -} UG_FONT; - -#define UG_FONT_DATA const +typedef lv_font_t UG_FONT; /* -------------------------------------------------------------------------------- */ /* -- µGUI CORE STRUCTURE -- */ @@ -65,7 +50,7 @@ typedef struct { void (*pset)(UG_S16, UG_S16, UG_COLOR); UG_S16 x_dim; UG_S16 y_dim; - UG_FONT font; + const UG_FONT *font; UG_S8 char_h_space; UG_S8 char_v_space; UG_COLOR fore_color; diff --git a/test/unit-test/test_ugui.c b/test/unit-test/test_ugui.c index 57867bc37d..84efb4d599 100644 --- a/test/unit-test/test_ugui.c +++ b/test/unit-test/test_ugui.c @@ -7,13 +7,10 @@ #include "ui/fonts/arial_fonts.h" #include "ui/fonts/password_12.h" +#include "ui/fonts/password_9.h" #include "ui/ugui/ugui.h" #include -#define LV_KCONFIG_IGNORE -#define LV_CONF_SKIP -#include - const char* data[][2] = { {"Bitcoin ", "Bitcoin "}, {"Bitcoin", "Bitcoin"}, @@ -33,47 +30,33 @@ static uint8_t pixels_set; static size_t set_pixel_count = 0; static size_t black_pixel_count = 0; -static bool _fake_8bpp_get_glyph_dsc( - const lv_font_t* font, - lv_font_glyph_dsc_t* dsc_out, - uint32_t letter, - uint32_t letter_next) +static void _assert_supported_font_subset(const UG_FONT* font) { - (void)font; - (void)letter; - (void)letter_next; - memset(dsc_out, 0, sizeof(*dsc_out)); - dsc_out->adv_w = 1; - dsc_out->box_w = 1; - dsc_out->box_h = 1; - dsc_out->format = LV_FONT_GLYPH_FORMAT_A8; - return true; -} + assert_non_null(font); + assert_ptr_equal(font->get_glyph_dsc, lv_font_get_glyph_dsc_fmt_txt); + assert_ptr_equal(font->get_glyph_bitmap, lv_font_get_bitmap_fmt_txt); + assert_non_null(font->dsc); + + const lv_font_fmt_txt_dsc_t* font_dsc = (const lv_font_fmt_txt_dsc_t*)font->dsc; + assert_int_equal(font_dsc->bpp, 1); + assert_int_equal(font_dsc->stride, 0); + assert_int_equal(font_dsc->bitmap_format, LV_FONT_FMT_TXT_PLAIN); + assert_null(font_dsc->kern_dsc); + assert_int_equal(font_dsc->kern_scale, 0); + assert_int_equal(font_dsc->kern_classes, 0); + for (uint16_t i = 0; i < font_dsc->cmap_num; i++) { + const lv_font_fmt_txt_cmap_t* cmap = &font_dsc->cmaps[i]; + assert_int_equal(cmap->type, LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY); + assert_null(cmap->unicode_list); + assert_null(cmap->glyph_id_ofs_list); + assert_int_equal(cmap->list_length, 0); + } -static const void* _fake_get_glyph_bitmap(lv_font_glyph_dsc_t* glyph_dsc, lv_draw_buf_t* draw_buf) -{ - (void)glyph_dsc; - (void)draw_buf; - static const uint8_t bitmap[] = {0xFF}; - return bitmap; + if (font->fallback != NULL) { + _assert_supported_font_subset(font->fallback); + } } -static const lv_font_t _fake_8bpp_lvgl_font = { - .get_glyph_dsc = _fake_8bpp_get_glyph_dsc, - .get_glyph_bitmap = _fake_get_glyph_bitmap, - .line_height = 1, -}; - -static const UG_FONT _fake_8bpp_ugui_font = { - &_fake_8bpp_lvgl_font, - FONT_TYPE_LVGL, - 1, - 1, - 0, - UINT16_MAX, - NULL, -}; - static void _set_pixel(UG_S16 x, UG_S16 y, UG_COLOR color) { last_x = x; @@ -146,12 +129,12 @@ static void _test_ugui_lvgl_font(void** state) "\xc3" "\xa4"); assert_true(width > 0); - assert_int_equal(height, font_arial_9.char_height); + assert_int_equal(height, font_arial_9.line_height); set_pixel_count = 0; black_pixel_count = 0; UG_PutString(0, 0, " "); - assert_true(set_pixel_count >= (size_t)font_arial_9.char_height); + assert_true(set_pixel_count >= (size_t)font_arial_9.line_height); assert_int_equal(set_pixel_count, black_pixel_count); } @@ -177,20 +160,15 @@ static void _test_ugui_lvgl_font_fallback(void** state) assert_true(set_pixel_count > black_pixel_count); } -static void _test_ugui_lvgl_font_rejects_non_1bpp(void** state) +static void _test_ugui_fonts_use_supported_subset(void** state) { (void)state; /* unused */ - UG_Init(&gui, _set_pixel, &_fake_8bpp_ugui_font, 128, 64); - - UG_U16 width = 0; - assert_true(UG_GetCharWidth(&_fake_8bpp_ugui_font, 'A', &width)); - assert_int_equal(width, 1); - - set_pixel_count = 0; - black_pixel_count = 0; - UG_PutString(0, 0, "A"); - assert_int_equal(set_pixel_count, 0); - assert_int_equal(black_pixel_count, 0); + _assert_supported_font_subset(&font_arial_9); + _assert_supported_font_subset(&font_arial_11); + _assert_supported_font_subset(&font_arial_12); + _assert_supported_font_subset(&font_monogram_16); + _assert_supported_font_subset(&font_password_9); + _assert_supported_font_subset(&font_password_12); } int main(void) @@ -200,7 +178,7 @@ int main(void) cmocka_unit_test(_test_ugui_render_rotated_180), cmocka_unit_test(_test_ugui_lvgl_font), cmocka_unit_test(_test_ugui_lvgl_font_fallback), - cmocka_unit_test(_test_ugui_lvgl_font_rejects_non_1bpp), + cmocka_unit_test(_test_ugui_fonts_use_supported_subset), }; return cmocka_run_group_tests(tests, NULL, NULL); } diff --git a/tools/ttf2lvgl/README.md b/tools/ttf2lvgl/README.md index ecac8427eb..065dce107f 100644 --- a/tools/ttf2lvgl/README.md +++ b/tools/ttf2lvgl/README.md @@ -16,6 +16,10 @@ Glyphs are emitted with tight bounding boxes. LVGL metrics (`ofs_x`, `ofs_y`, Requested code points that are not present in the font's charmap are omitted from the generated glyph descriptors and cmaps. The `--show` preview decodes its input as UTF-8 with ICU before rendering. +Generated font objects use the local `lv_font_get_glyph_dsc_fmt_txt` and +`lv_font_get_bitmap_fmt_txt` callbacks. The BitBox02 OLED implementation of +those callbacks only supports 1bpp, unstrided, no-kerning, `FORMAT0_TINY` +fonts. Examples: diff --git a/tools/ttf2ugui b/tools/ttf2ugui deleted file mode 160000 index 1d1a254065..0000000000 --- a/tools/ttf2ugui +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1d1a254065fa0852fb51fdf6efc7b4d70feae391 From 198decf9a5b7edc8acb0b6967a7ecd75649bfddd Mon Sep 17 00:00:00 2001 From: Niklas Dusenlund Date: Tue, 19 May 2026 13:06:09 +0200 Subject: [PATCH 7/9] reduce fonts to blocks 1-3 --- src/ui/fonts/arial_11.c | 137 +-------------------------------------- src/ui/fonts/arial_12.c | 138 +--------------------------------------- src/ui/fonts/arial_9.c | 136 +-------------------------------------- 3 files changed, 9 insertions(+), 402 deletions(-) diff --git a/src/ui/fonts/arial_11.c b/src/ui/fonts/arial_11.c index a3b17560ad..a27781e952 100644 --- a/src/ui/fonts/arial_11.c +++ b/src/ui/fonts/arial_11.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 11 px * Bpp: 1 - * Opts: --bpp 1 --size 11 --dpi 72 --font /usr/share/fonts/truetype/msttcorefonts/Arial.ttf --range 32-126,160-383,399,402,416-417,431-432,461-476,506-511 --format lvgl -o arial_11.c + * Opts: --bpp 1 --size 11 --dpi 72 --font /usr/share/fonts/truetype/msttcorefonts/Arial.ttf --range 32-126,160-383 --format lvgl -o arial_11.c ******************************************************************************/ #ifdef __has_include @@ -985,91 +985,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+017F "ſ" */ 0xEA, 0xAA, - - /* U+018F "Ə" */ - 0x79, 0x08, 0x0F, 0xF8, 0x30, 0x51, 0x1C, - - /* U+0192 "ƒ" */ - 0x19, 0x1C, 0x42, 0x11, 0x08, 0x46, 0x00, - - /* U+01A0 "Ơ" */ - 0x39, 0x45, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, - - /* U+01A1 "ơ" */ - 0x76, 0x38, 0xE2, 0x89, 0xC0, - - /* U+01AF "Ư" */ - 0x85, 0x85, 0x86, 0x84, 0x84, 0x84, 0x84, 0x78, - - /* U+01B0 "ư" */ - 0x8B, 0x16, 0x34, 0x49, 0x8D, 0x00, - - /* U+01CD "Ǎ" */ - 0x14, 0x30, 0x00, 0x82, 0x85, 0x0A, 0x22, 0x7D, 0x06, 0x08, - - /* U+01CE "ǎ" */ - 0x71, 0x80, 0xE8, 0xBE, 0x33, 0xE8, - - /* U+01CF "Ǐ" */ - 0xD6, 0x02, 0x22, 0x22, 0x22, 0x20, - - /* U+01D0 "ǐ" */ - 0xE6, 0x04, 0x44, 0x44, 0x40, - - /* U+01D1 "Ǒ" */ - 0x34, 0x30, 0x01, 0xC4, 0x50, 0x60, 0xC1, 0x82, 0x88, 0xE0, - - /* U+01D2 "ǒ" */ - 0x51, 0x80, 0xE8, 0xC6, 0x31, 0x70, - - /* U+01D3 "Ǔ" */ - 0x28, 0x60, 0x21, 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, - - /* U+01D4 "ǔ" */ - 0x51, 0x81, 0x18, 0xC6, 0x33, 0x68, - - /* U+01D5 "Ǖ" */ - 0x38, 0x02, 0xA1, 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, - - /* U+01D6 "ǖ" */ - 0x78, 0x14, 0x08, 0xC6, 0x31, 0x9B, 0x40, - - /* U+01D7 "Ǘ" */ - 0x08, 0x44, 0xA1, 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, - - /* U+01D8 "ǘ" */ - 0x11, 0x00, 0xA0, 0x46, 0x31, 0x8C, 0xDA, - - /* U+01D9 "Ǚ" */ - 0x28, 0x44, 0xA1, 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, - - /* U+01DA "ǚ" */ - 0x51, 0x80, 0xA0, 0x46, 0x31, 0x8C, 0xDA, - - /* U+01DB "Ǜ" */ - 0x40, 0x84, 0xA1, 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, - - /* U+01DC "ǜ" */ - 0x41, 0x00, 0xA0, 0x46, 0x31, 0x8C, 0xDA, - - /* U+01FA "Ǻ" */ - 0x08, 0x20, 0x01, 0xC2, 0x87, 0x0A, 0x14, 0x28, 0x89, 0xF4, 0x18, 0x20, - - /* U+01FB "ǻ" */ - 0x11, 0x00, 0xE5, 0x38, 0x0E, 0x8B, 0xE3, 0x3E, 0x80, - - /* U+01FC "Ǽ" */ - 0x04, 0x00, 0x80, 0x00, 0x07, 0xF0, 0xA0, 0x24, 0x04, 0xF9, 0x10, 0x3E, - 0x08, 0x41, 0x0F, 0x80, - - /* U+01FD "ǽ" */ - 0x04, 0x04, 0x00, 0x0E, 0xE8, 0x8B, 0xFE, 0x21, 0x11, 0x77, 0x00, - - /* U+01FE "Ǿ" */ - 0x08, 0x20, 0x01, 0xD4, 0x71, 0x64, 0xC9, 0xA2, 0x8A, 0xE0, - - /* U+01FF "ǿ" */ - 0x11, 0x00, 0xD9, 0xD6, 0xB9, 0xB0, }; static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { @@ -1392,35 +1307,7 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 1826, .adv_w = 96, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+017C */, {.bitmap_index = 1831, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+017D */, {.bitmap_index = 1840, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+017E */, - {.bitmap_index = 1846, .adv_w = 32, .box_w = 2, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+017F */, - {.bitmap_index = 1848, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+018F */, - {.bitmap_index = 1855, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -2} /* U+0192 */, - {.bitmap_index = 1862, .adv_w = 144, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+01A0 */, - {.bitmap_index = 1870, .adv_w = 112, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+01A1 */, - {.bitmap_index = 1875, .adv_w = 144, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0} /* U+01AF */, - {.bitmap_index = 1883, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 0} /* U+01B0 */, - {.bitmap_index = 1889, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01CD */, - {.bitmap_index = 1899, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01CE */, - {.bitmap_index = 1905, .adv_w = 32, .box_w = 4, .box_h = 11, .ofs_x = -2, .ofs_y = 0} /* U+01CF */, - {.bitmap_index = 1911, .adv_w = 32, .box_w = 4, .box_h = 9, .ofs_x = -1, .ofs_y = 0} /* U+01D0 */, - {.bitmap_index = 1916, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01D1 */, - {.bitmap_index = 1926, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01D2 */, - {.bitmap_index = 1932, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01D3 */, - {.bitmap_index = 1941, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01D4 */, - {.bitmap_index = 1947, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01D5 */, - {.bitmap_index = 1956, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+01D6 */, - {.bitmap_index = 1963, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01D7 */, - {.bitmap_index = 1972, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01D8 */, - {.bitmap_index = 1979, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01D9 */, - {.bitmap_index = 1988, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01DA */, - {.bitmap_index = 1995, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01DB */, - {.bitmap_index = 2004, .adv_w = 96, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01DC */, - {.bitmap_index = 2011, .adv_w = 128, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = 0} /* U+01FA */, - {.bitmap_index = 2023, .adv_w = 96, .box_w = 5, .box_h = 13, .ofs_x = 0, .ofs_y = 0} /* U+01FB */, - {.bitmap_index = 2032, .adv_w = 176, .box_w = 11, .box_h = 11, .ofs_x = -1, .ofs_y = 0} /* U+01FC */, - {.bitmap_index = 2048, .adv_w = 160, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01FD */, - {.bitmap_index = 2059, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0} /* U+01FE */, - {.bitmap_index = 2069, .adv_w = 96, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01FF */ + {.bitmap_index = 1846, .adv_w = 32, .box_w = 2, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+017F */ }; static const lv_font_fmt_txt_cmap_t cmaps[] = { @@ -1428,24 +1315,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, {.range_start = 160, .range_length = 224, .glyph_id_start = 96, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 399, .range_length = 1, .glyph_id_start = 320, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 402, .range_length = 1, .glyph_id_start = 321, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 416, .range_length = 2, .glyph_id_start = 322, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 431, .range_length = 2, .glyph_id_start = 324, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 461, .range_length = 16, .glyph_id_start = 326, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 506, .range_length = 6, .glyph_id_start = 342, .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY} }; @@ -1456,7 +1325,7 @@ static const lv_font_fmt_txt_dsc_t font_dsc = { .cmaps = cmaps, .kern_dsc = NULL, .kern_scale = 0, - .cmap_num = 8, + .cmap_num = 2, .bpp = 1, .kern_classes = 0, .bitmap_format = 0, diff --git a/src/ui/fonts/arial_12.c b/src/ui/fonts/arial_12.c index dd25cb37db..a26655710e 100644 --- a/src/ui/fonts/arial_12.c +++ b/src/ui/fonts/arial_12.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 12 px * Bpp: 1 - * Opts: --bpp 1 --size 12 --dpi 72 --font /usr/share/fonts/truetype/msttcorefonts/Arial.ttf --range 32-126,160-383,399,402,416-417,431-432,461-476,506-511 --format lvgl -o arial_12.c + * Opts: --bpp 1 --size 12 --dpi 72 --font /usr/share/fonts/truetype/msttcorefonts/Arial.ttf --range 32-126,160-383 --format lvgl -o arial_12.c ******************************************************************************/ #ifdef __has_include @@ -987,92 +987,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+017F "ſ" */ 0xEA, 0xAA, 0x80, - - /* U+018F "Ə" */ - 0x38, 0x8A, 0x08, 0x1F, 0xF0, 0x60, 0xA2, 0x38, - - /* U+0192 "ƒ" */ - 0x0E, 0x10, 0xF0, 0x81, 0x02, 0x04, 0x10, 0x20, 0x43, 0x80, - - /* U+01A0 "Ơ" */ - 0x39, 0x45, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, - - /* U+01A1 "ơ" */ - 0x76, 0x38, 0xE2, 0x8A, 0x27, 0x00, - - /* U+01AF "Ư" */ - 0x82, 0xC1, 0x60, 0xD0, 0x48, 0x24, 0x12, 0x08, 0x88, 0x38, 0x00, - - /* U+01B0 "ư" */ - 0x8B, 0x16, 0x34, 0x48, 0x93, 0x1A, 0x00, - - /* U+01CD "Ǎ" */ - 0x28, 0x60, 0x00, 0x82, 0x85, 0x0A, 0x22, 0x7C, 0x8A, 0x0C, 0x10, - - /* U+01CE "ǎ" */ - 0x69, 0x80, 0xE8, 0x85, 0xF1, 0x9B, 0x40, - - /* U+01CF "Ǐ" */ - 0xD6, 0x04, 0x44, 0x44, 0x44, 0x44, - - /* U+01D0 "ǐ" */ - 0xE6, 0x04, 0x44, 0x44, 0x44, - - /* U+01D1 "Ǒ" */ - 0x14, 0x30, 0x01, 0xC4, 0x50, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, - - /* U+01D2 "ǒ" */ - 0x51, 0x80, 0xE8, 0xC6, 0x31, 0x8B, 0x80, - - /* U+01D3 "Ǔ" */ - 0x38, 0x30, 0x04, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, - - /* U+01D4 "ǔ" */ - 0x71, 0x81, 0x18, 0xC6, 0x31, 0x8B, 0xC0, - - /* U+01D5 "Ǖ" */ - 0x38, 0x00, 0xA4, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, - - /* U+01D6 "ǖ" */ - 0x78, 0x14, 0x08, 0xC6, 0x31, 0x8C, 0x5E, - - /* U+01D7 "Ǘ" */ - 0x08, 0x21, 0x14, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, - - /* U+01D8 "ǘ" */ - 0x10, 0x80, 0xA0, 0x46, 0x31, 0x8C, 0x62, 0xF0, - - /* U+01D9 "Ǚ" */ - 0x18, 0x31, 0x14, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, - - /* U+01DA "ǚ" */ - 0x71, 0x80, 0xA0, 0x46, 0x31, 0x8C, 0x62, 0xF0, - - /* U+01DB "Ǜ" */ - 0x10, 0x21, 0x14, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x05, 0x11, 0xC0, - - /* U+01DC "ǜ" */ - 0x41, 0x00, 0xA0, 0x46, 0x31, 0x8C, 0x62, 0xF0, - - /* U+01FA "Ǻ" */ - 0x08, 0x20, 0x01, 0xC2, 0x87, 0x0A, 0x14, 0x28, 0x89, 0xF2, 0x28, 0x30, - 0x40, - - /* U+01FB "ǻ" */ - 0x11, 0x00, 0xE5, 0x38, 0x0E, 0x88, 0x5F, 0x19, 0xB4, - - /* U+01FC "Ǽ" */ - 0x01, 0x00, 0x20, 0x00, 0x00, 0x7F, 0x09, 0x00, 0x90, 0x11, 0x01, 0x1F, - 0x3F, 0x02, 0x10, 0x41, 0x04, 0x1F, - - /* U+01FD "ǽ" */ - 0x04, 0x04, 0x00, 0x0E, 0xE8, 0x89, 0xC7, 0x3F, 0x10, 0x88, 0xBB, 0x80, - - /* U+01FE "Ǿ" */ - 0x08, 0x20, 0x01, 0xD4, 0x51, 0x62, 0xC9, 0xA3, 0x45, 0x15, 0xC0, - - /* U+01FF "ǿ" */ - 0x11, 0x00, 0xF9, 0x4E, 0xB9, 0x4F, 0x80, }; static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { @@ -1395,35 +1309,7 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 2174, .adv_w = 80, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+017C */, {.bitmap_index = 2180, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+017D */, {.bitmap_index = 2191, .adv_w = 80, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+017E */, - {.bitmap_index = 2198, .adv_w = 48, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+017F */, - {.bitmap_index = 2201, .adv_w = 144, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+018F */, - {.bitmap_index = 2209, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -2} /* U+0192 */, - {.bitmap_index = 2219, .adv_w = 160, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01A0 */, - {.bitmap_index = 2228, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+01A1 */, - {.bitmap_index = 2234, .adv_w = 160, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01AF */, - {.bitmap_index = 2245, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+01B0 */, - {.bitmap_index = 2252, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+01CD */, - {.bitmap_index = 2263, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+01CE */, - {.bitmap_index = 2270, .adv_w = 48, .box_w = 4, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+01CF */, - {.bitmap_index = 2276, .adv_w = 48, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = 0} /* U+01D0 */, - {.bitmap_index = 2281, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01D1 */, - {.bitmap_index = 2292, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+01D2 */, - {.bitmap_index = 2299, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01D3 */, - {.bitmap_index = 2310, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+01D4 */, - {.bitmap_index = 2317, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01D5 */, - {.bitmap_index = 2328, .adv_w = 112, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = 0} /* U+01D6 */, - {.bitmap_index = 2335, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01D7 */, - {.bitmap_index = 2346, .adv_w = 112, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01D8 */, - {.bitmap_index = 2354, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01D9 */, - {.bitmap_index = 2365, .adv_w = 112, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01DA */, - {.bitmap_index = 2373, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01DB */, - {.bitmap_index = 2384, .adv_w = 112, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01DC */, - {.bitmap_index = 2392, .adv_w = 112, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0} /* U+01FA */, - {.bitmap_index = 2405, .adv_w = 112, .box_w = 5, .box_h = 14, .ofs_x = 1, .ofs_y = 0} /* U+01FB */, - {.bitmap_index = 2414, .adv_w = 192, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = 0} /* U+01FC */, - {.bitmap_index = 2432, .adv_w = 176, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+01FD */, - {.bitmap_index = 2444, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0} /* U+01FE */, - {.bitmap_index = 2455, .adv_w = 112, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0} /* U+01FF */ + {.bitmap_index = 2198, .adv_w = 48, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+017F */ }; static const lv_font_fmt_txt_cmap_t cmaps[] = { @@ -1431,24 +1317,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, {.range_start = 160, .range_length = 224, .glyph_id_start = 96, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 399, .range_length = 1, .glyph_id_start = 320, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 402, .range_length = 1, .glyph_id_start = 321, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 416, .range_length = 2, .glyph_id_start = 322, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 431, .range_length = 2, .glyph_id_start = 324, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 461, .range_length = 16, .glyph_id_start = 326, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 506, .range_length = 6, .glyph_id_start = 342, .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY} }; @@ -1459,7 +1327,7 @@ static const lv_font_fmt_txt_dsc_t font_dsc = { .cmaps = cmaps, .kern_dsc = NULL, .kern_scale = 0, - .cmap_num = 8, + .cmap_num = 2, .bpp = 1, .kern_classes = 0, .bitmap_format = 0, diff --git a/src/ui/fonts/arial_9.c b/src/ui/fonts/arial_9.c index 85c024f726..08d3623dcd 100644 --- a/src/ui/fonts/arial_9.c +++ b/src/ui/fonts/arial_9.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 9 px * Bpp: 1 - * Opts: --bpp 1 --size 9 --dpi 72 --font /usr/share/fonts/truetype/msttcorefonts/Arial.ttf --range 32-126,160-383,399,402,416-417,431-432,461-476,506-511 --format lvgl -o arial_9.c + * Opts: --bpp 1 --size 9 --dpi 72 --font /usr/share/fonts/truetype/msttcorefonts/Arial.ttf --range 32-126,160-383 --format lvgl -o arial_9.c ******************************************************************************/ #ifdef __has_include @@ -983,90 +983,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+017F "ſ" */ 0xEA, 0xA8, - - /* U+018F "Ə" */ - 0x74, 0x43, 0xF8, 0xC5, 0xC0, - - /* U+0192 "ƒ" */ - 0x19, 0x1C, 0x42, 0x21, 0x08, 0xC0, - - /* U+01A0 "Ơ" */ - 0x76, 0x38, 0xA2, 0x8A, 0x27, 0x00, - - /* U+01A1 "ơ" */ - 0x6C, 0xE5, 0x26, 0x00, - - /* U+01AF "Ư" */ - 0x8B, 0x16, 0x34, 0x48, 0x91, 0x1C, 0x00, - - /* U+01B0 "ư" */ - 0x96, 0x59, 0xA4, 0x70, - - /* U+01CD "Ǎ" */ - 0x38, 0x30, 0x41, 0x42, 0x88, 0x9F, 0x22, 0x82, - - /* U+01CE "ǎ" */ - 0x51, 0x01, 0xE1, 0x3A, 0x5E, - - /* U+01CF "Ǐ" */ - 0x56, 0x44, 0x44, 0x44, 0x40, - - /* U+01D0 "ǐ" */ - 0xD6, 0x04, 0x44, 0x44, - - /* U+01D1 "Ǒ" */ - 0x51, 0x1D, 0x18, 0xC6, 0x31, 0x70, - - /* U+01D2 "ǒ" */ - 0x52, 0x06, 0x99, 0x96, - - /* U+01D3 "Ǔ" */ - 0x53, 0x23, 0x18, 0xC6, 0x31, 0x70, - - /* U+01D4 "ǔ" */ - 0x52, 0x09, 0x99, 0x97, - - /* U+01D5 "Ǖ" */ - 0x72, 0xA3, 0x18, 0xC6, 0x31, 0x70, - - /* U+01D6 "ǖ" */ - 0x70, 0x50, 0x99, 0x99, 0x70, - - /* U+01D7 "Ǘ" */ - 0x12, 0xA3, 0x18, 0xC6, 0x31, 0x70, - - /* U+01D8 "ǘ" */ - 0x12, 0x50, 0x99, 0x99, 0x70, - - /* U+01D9 "Ǚ" */ - 0x31, 0xB7, 0x18, 0xC6, 0x31, 0x70, - - /* U+01DA "ǚ" */ - 0x52, 0x50, 0x99, 0x99, 0x70, - - /* U+01DB "Ǜ" */ - 0x22, 0xA3, 0x18, 0xC6, 0x31, 0x70, - - /* U+01DC "ǜ" */ - 0x42, 0x50, 0x99, 0x99, 0x70, - - /* U+01FA "Ǻ" */ - 0x08, 0x20, 0x01, 0xC2, 0x87, 0x0A, 0x14, 0x44, 0xF9, 0x14, 0x10, - - /* U+01FB "ǻ" */ - 0x12, 0x07, 0x57, 0x0F, 0x17, 0x9F, - - /* U+01FC "Ǽ" */ - 0x04, 0x02, 0x00, 0xFC, 0x50, 0x14, 0x09, 0xF3, 0xC1, 0x10, 0x47, 0xC0, - - /* U+01FD "ǽ" */ - 0x08, 0x20, 0x07, 0x61, 0x2F, 0xE4, 0x77, - - /* U+01FE "Ǿ" */ - 0x11, 0x1F, 0x29, 0xD7, 0x29, 0xF0, - - /* U+01FF "ǿ" */ - 0x12, 0x07, 0xBD, 0xDE, }; static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { @@ -1389,35 +1305,7 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 1388, .adv_w = 64, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+017C */, {.bitmap_index = 1391, .adv_w = 96, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+017D */, {.bitmap_index = 1398, .adv_w = 64, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+017E */, - {.bitmap_index = 1402, .adv_w = 32, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+017F */, - {.bitmap_index = 1404, .adv_w = 112, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+018F */, - {.bitmap_index = 1409, .adv_w = 80, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = -2} /* U+0192 */, - {.bitmap_index = 1415, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+01A0 */, - {.bitmap_index = 1421, .adv_w = 96, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+01A1 */, - {.bitmap_index = 1425, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0} /* U+01AF */, - {.bitmap_index = 1432, .adv_w = 96, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0} /* U+01B0 */, - {.bitmap_index = 1436, .adv_w = 96, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01CD */, - {.bitmap_index = 1444, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+01CE */, - {.bitmap_index = 1449, .adv_w = 48, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01CF */, - {.bitmap_index = 1454, .adv_w = 32, .box_w = 4, .box_h = 8, .ofs_x = -1, .ofs_y = 0} /* U+01D0 */, - {.bitmap_index = 1458, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01D1 */, - {.bitmap_index = 1464, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+01D2 */, - {.bitmap_index = 1468, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01D3 */, - {.bitmap_index = 1474, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+01D4 */, - {.bitmap_index = 1478, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01D5 */, - {.bitmap_index = 1484, .adv_w = 80, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01D6 */, - {.bitmap_index = 1489, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01D7 */, - {.bitmap_index = 1495, .adv_w = 80, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01D8 */, - {.bitmap_index = 1500, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01D9 */, - {.bitmap_index = 1506, .adv_w = 80, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01DA */, - {.bitmap_index = 1511, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01DB */, - {.bitmap_index = 1517, .adv_w = 80, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0} /* U+01DC */, - {.bitmap_index = 1522, .adv_w = 96, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+01FA */, - {.bitmap_index = 1533, .adv_w = 80, .box_w = 4, .box_h = 12, .ofs_x = 0, .ofs_y = 0} /* U+01FB */, - {.bitmap_index = 1539, .adv_w = 144, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0} /* U+01FC */, - {.bitmap_index = 1551, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+01FD */, - {.bitmap_index = 1558, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0} /* U+01FE */, - {.bitmap_index = 1564, .adv_w = 80, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0} /* U+01FF */ + {.bitmap_index = 1402, .adv_w = 32, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = 0} /* U+017F */ }; static const lv_font_fmt_txt_cmap_t cmaps[] = { @@ -1425,24 +1313,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, {.range_start = 160, .range_length = 224, .glyph_id_start = 96, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 399, .range_length = 1, .glyph_id_start = 320, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 402, .range_length = 1, .glyph_id_start = 321, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 416, .range_length = 2, .glyph_id_start = 322, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 431, .range_length = 2, .glyph_id_start = 324, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 461, .range_length = 16, .glyph_id_start = 326, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, - .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY}, - {.range_start = 506, .range_length = 6, .glyph_id_start = 342, .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY} }; @@ -1453,7 +1323,7 @@ static const lv_font_fmt_txt_dsc_t font_dsc = { .cmaps = cmaps, .kern_dsc = NULL, .kern_scale = 0, - .cmap_num = 8, + .cmap_num = 2, .bpp = 1, .kern_classes = 0, .bitmap_format = 0, From 12ac72ac93c84a923dc6f5c797ca6178055c4e6b Mon Sep 17 00:00:00 2001 From: Niklas Dusenlund Date: Tue, 19 May 2026 13:14:17 +0200 Subject: [PATCH 8/9] Update ttf2lvgl to new format --- src/ui/fonts/README.md | 3 ++- tools/ttf2lvgl/README.md | 12 +++++++----- tools/ttf2lvgl/ttf2lvgl.c | 20 +++++++++++++++++--- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/ui/fonts/README.md b/src/ui/fonts/README.md index e4889e6ac5..e19b978cc7 100644 --- a/src/ui/fonts/README.md +++ b/src/ui/fonts/README.md @@ -23,7 +23,8 @@ decodes `` as UTF-8 and prints it with asterixes in the terminal: Once you have `dump`ed the font there will be a `.c` and `.h` file in the current directory. Move these files to this directory. BitBox02 OLED fonts are exported directly as `font_*` LVGL font -objects; `UG_FONT` is an alias for `lv_font_t`, so no separate uGUI wrapper is needed. +objects and the generated headers include `` and declare `extern const UG_FONT font_*`. +`UG_FONT` is an alias for `lv_font_t`, so no separate uGUI wrapper is needed. For BitBox02 uGUI use, keep the generated font in the compact subset consumed by `ugui.c`: 1bpp, `stride = 0`, no kerning, and `LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY` cmaps only. The local diff --git a/tools/ttf2lvgl/README.md b/tools/ttf2lvgl/README.md index 065dce107f..ae0bbb626c 100644 --- a/tools/ttf2lvgl/README.md +++ b/tools/ttf2lvgl/README.md @@ -19,7 +19,9 @@ The `--show` preview decodes its input as UTF-8 with ICU before rendering. Generated font objects use the local `lv_font_get_glyph_dsc_fmt_txt` and `lv_font_get_bitmap_fmt_txt` callbacks. The BitBox02 OLED implementation of those callbacks only supports 1bpp, unstrided, no-kerning, `FORMAT0_TINY` -fonts. +fonts. Dumped fonts are exported as `const UG_FONT font_` and the +generated header includes `` and declares that `UG_FONT` object. If +`--name` already starts with `font_`, the public symbol is not double-prefixed. Examples: @@ -33,10 +35,10 @@ Examples: If `--range` is omitted, the legacy `--minchar`/`--maxchar` range is used, defaulting to `32-126`. -If `--name` is omitted, the generated symbol uses the lowercased font file -basename and requested font size. If `--name` is given, it must be a valid C -identifier and is used unchanged. If `--output` is omitted, the file name -follows the symbol. +If `--name` is omitted, the base name uses the lowercased font file basename and +requested font size. If `--name` is given, it must be a valid C identifier and +is used as the base name. If `--output` is omitted, the file name follows the +base name. Compiling --------- diff --git a/tools/ttf2lvgl/ttf2lvgl.c b/tools/ttf2lvgl/ttf2lvgl.c index 167d1cedeb..79f90098e8 100644 --- a/tools/ttf2lvgl/ttf2lvgl.c +++ b/tools/ttf2lvgl/ttf2lvgl.c @@ -247,6 +247,18 @@ static char* output_header_name(const char* output_file, const char* font_name) return out; } +static char* public_font_symbol(const char* font_name) +{ + if (strncmp(font_name, "font_", 5) == 0) { + return xstrdup(font_name); + } + + size_t len = strlen("font_") + strlen(font_name) + 1; + char* out = xmalloc(len); + snprintf(out, len, "font_%s", font_name); + return out; +} + static void codepoints_append(Codepoints* codepoints, UChar32 codepoint) { if (codepoint < 0 || codepoint > 0x10FFFF) { @@ -767,6 +779,7 @@ static void dump_font(const LvglFont* font, const char* font_file_path, const ch symbol = xstrdup(font_name); } char* symbol_upper = sanitize_identifier(symbol, true); + char* public_symbol = public_font_symbol(symbol); char* out_file = output_file_arg == NULL ? NULL : xstrdup(output_file_arg); if (out_file == NULL) { @@ -885,7 +898,7 @@ static void dump_font(const LvglFont* font, const char* font_file_path, const ch fprintf(out, " .stride = 0,\n"); fprintf(out, "};\n\n"); - fprintf(out, "const lv_font_t %s = {\n", symbol); + fprintf(out, "const UG_FONT %s = {\n", public_symbol); fprintf(out, " .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt,\n"); fprintf(out, " .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt,\n"); fprintf(out, " .line_height = %d,\n", font->line_height); @@ -908,11 +921,12 @@ static void dump_font(const LvglFont* font, const char* font_file_path, const ch } fprintf(out, "#ifndef _%s_H_\n", symbol_upper); fprintf(out, "#define _%s_H_\n\n", symbol_upper); - fprintf(out, "typedef struct _lv_font_t lv_font_t;\n\n"); - fprintf(out, "extern const lv_font_t %s;\n\n", symbol); + fprintf(out, "#include \n\n"); + fprintf(out, "extern const UG_FONT %s;\n\n", public_symbol); fprintf(out, "#endif\n"); fclose(out); + free(public_symbol); free(symbol); free(symbol_upper); free(out_file); From 637e61b763f8e06c357b07f34420021e570cfefc Mon Sep 17 00:00:00 2001 From: Niklas Dusenlund Date: Tue, 19 May 2026 14:29:31 +0200 Subject: [PATCH 9/9] wip --- .clang-tidy | 1 + src/ui/fonts/lvgl.h | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.clang-tidy b/.clang-tidy index a98cb9aad1..8be1532b6d 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -23,6 +23,7 @@ Checks: >- -clang-analyzer-core.FixedAddressDereference, -clang-diagnostic-cast-qual HeaderFilterRegex: '.*' +ExcludeHeaderFilterRegex: '/external/' ExtraArgs: - -Wno-unknown-warning-option - -Qunused-arguments diff --git a/src/ui/fonts/lvgl.h b/src/ui/fonts/lvgl.h index db291994de..5287657735 100644 --- a/src/ui/fonts/lvgl.h +++ b/src/ui/fonts/lvgl.h @@ -9,7 +9,8 @@ #ifndef LV_VERSION_CHECK #define LV_VERSION_CHECK(x, y, z) \ - (x == LVGL_VERSION_MAJOR && (y < LVGL_VERSION_MINOR || (y == LVGL_VERSION_MINOR && z <= LVGL_VERSION_PATCH))) + ((x) == LVGL_VERSION_MAJOR && \ + ((y) < LVGL_VERSION_MINOR || ((y) == LVGL_VERSION_MINOR && (z) <= LVGL_VERSION_PATCH))) #endif #endif