From cba6eadc1397198892691dfa60f2143c75f275c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cle=CC=81ment=20Grennerat?= Date: Wed, 17 Sep 2025 01:47:49 +0200 Subject: [PATCH] Anti aliasing + per-character speed text refreshing --- Core/Inc/font.h | 39 +- Core/Inc/monomaniacone27pt.h | 675 +++++++++++++++++++++++++++++++++++ Core/Inc/monomaniacone39pt.h | 251 +++++++++++++ Core/Src/dashboard.c | 124 ++++--- Core/Src/font.c | 249 ++++++++++++- 5 files changed, 1264 insertions(+), 74 deletions(-) create mode 100644 Core/Inc/monomaniacone27pt.h create mode 100644 Core/Inc/monomaniacone39pt.h diff --git a/Core/Inc/font.h b/Core/Inc/font.h index 9cb9092..38bc800 100644 --- a/Core/Inc/font.h +++ b/Core/Inc/font.h @@ -30,7 +30,7 @@ typedef struct { uint8_t yAdvance;// Vertical distance to advance for newline } GFXfont; -void GFX_DrawChar( +uint16_t GFX_DrawChar( uint16_t x, uint16_t y, char c, @@ -38,8 +38,33 @@ void GFX_DrawChar( uint16_t fg_color, uint16_t bg_color); +uint16_t GFX_DrawCharScaled( + uint16_t x, + uint16_t y, + char c, + const GFXfont *font, + uint16_t fg_color, + uint16_t bg_color, + uint8_t scale); + uint16_t GFX_GetTextWidth(const char *text, const GFXfont *font, int8_t letter_spacing); +uint16_t GFX_ClearText( + uint16_t x, + uint16_t y, + const char *text, + const GFXfont *font, + uint16_t bg_color, + uint8_t alignment, + int8_t letter_spacing); + +uint16_t GFX_ClearChar( + uint16_t x, + uint16_t y, + char c, + const GFXfont *font, + uint16_t bg_color); + // Alignment: 0 => Left, 1 => Center, 2 => Right uint16_t GFX_DrawText( uint16_t x, @@ -51,4 +76,16 @@ uint16_t GFX_DrawText( uint8_t alignment, int8_t letter_spacing); +uint16_t GFX_DrawTextScaled( + uint16_t x, + uint16_t y, + const char *text, + const GFXfont *font, + uint16_t fg_color, + uint16_t bg_color, + uint8_t alignment, + int8_t letter_spacing, + uint8_t scale); + + #endif diff --git a/Core/Inc/monomaniacone27pt.h b/Core/Inc/monomaniacone27pt.h new file mode 100644 index 0000000..4019bb2 --- /dev/null +++ b/Core/Inc/monomaniacone27pt.h @@ -0,0 +1,675 @@ +// Created by ttf2gfx utility +const uint8_t monomaniacone27ptBitmaps[] = { + // Bitmap Data: + 0x00 // ' ' + ,0x08,0x1E,0x0F,0x8F,0xC7,0xE3,0xF1,0xF8,0xFC,0x7E,0x3F,0x1F,0x8F,0xC7,0xE3 + ,0xF1,0xF8,0xFC,0x7E,0x3F,0x1F,0x8F,0xC7,0xE3,0xF1,0xF8,0xFC,0x3E,0x1E,0x00 + ,0x00,0x00,0x00,0x40,0xF0,0xFC,0x7F,0x3F,0x9F,0x87,0x80,0x00 // '!' + ,0x10,0x21,0xF1,0xE7,0xCF,0x9F,0x3E,0x7C,0xF9,0xF3,0xE7,0xCF,0x9E,0x1E,0x00 + ,0x00 // '"' + ,0x00,0x10,0x00,0x00,0x1F,0x0F,0x00,0x07,0xC7,0xE0,0x01,0xF1,0xF8,0x00,0x7C + ,0x7C,0x00,0x1F,0x1F,0x00,0x0F,0xC7,0xC0,0x03,0xE1,0xF0,0x00,0xF8,0xFC,0x00 + ,0x3E,0x3E,0x00,0x0F,0x8F,0x80,0x07,0xE3,0xE0,0x07,0xFF,0xFE,0x07,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xF8,0xFF,0xFF,0xFE,0x3F,0xFF,0xFF,0x87,0xFF,0xFF,0xC0,0x3F + ,0x3F,0x00,0x0F,0x8F,0xC0,0x1F,0xFF,0xF8,0x1F,0xFF,0xFF,0x87,0xFF,0xFF,0xF1 + ,0xFF,0xFF,0xF8,0x7F,0xFF,0xFE,0x0F,0xFF,0xFF,0x00,0xFC,0x7C,0x00,0x3F,0x1F + ,0x00,0x0F,0xC7,0xC0,0x03,0xE3,0xF0,0x00,0xF8,0xFC,0x00,0x3E,0x3E,0x00,0x1F + ,0x8F,0x80,0x07,0xE3,0xE0,0x01,0xF0,0xF8,0x00,0x3C,0x3C,0x00,0x04,0x02,0x00 + ,0x00 // '#' + ,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x0F,0x80,0x00,0x3F,0xF0,0x00,0xFF,0xFF + ,0x80,0xFF,0xFF,0xE0,0xFF,0xFF,0xF8,0xFF,0xFF,0xFC,0x7F,0xFF,0xFF,0x3E,0x1F + ,0x1F,0x9F,0x0F,0x87,0xCF,0x87,0xC3,0xE7,0xC3,0xE1,0xF3,0xE1,0xF0,0x71,0xF0 + ,0xF8,0x00,0xF8,0x7C,0x00,0x7E,0x7E,0x00,0x3F,0xFF,0x00,0x0F,0xFF,0x80,0x07 + ,0xFF,0xC0,0x01,0xFF,0xF8,0x00,0x3F,0xFF,0x80,0x07,0xFF,0xE0,0x00,0xFF,0xF8 + ,0x00,0x3F,0xFE,0x00,0x1F,0xFF,0x00,0x0F,0x8F,0xC0,0x07,0xC3,0xE0,0x03,0xE1 + ,0xF1,0xC1,0xF0,0xF9,0xF0,0xF8,0x7C,0xF8,0x7C,0x3E,0x7C,0x3E,0x1F,0x3E,0x1F + ,0x1F,0x9F,0xFF,0xFF,0xCF,0xFF,0xFF,0xC3,0xFF,0xFF,0xE0,0xFF,0xFF,0xE0,0x3F + ,0xFF,0xE0,0x03,0xFF,0x00,0x00,0x3E,0x00,0x00,0x1F,0x00,0x00,0x02,0x00,0x00 // '$' + ,0x03,0x00,0x00,0x40,0x07,0xF8,0x00,0x7C,0x03,0xFF,0x00,0x3F,0x01,0xFF,0xE0 + ,0x0F,0xC0,0x7F,0xFC,0x07,0xE0,0x1F,0xFF,0x01,0xF0,0x07,0xC7,0xC0,0xFC,0x01 + ,0xF1,0xF0,0x3E,0x00,0x7C,0x7C,0x1F,0x80,0x1F,0x1F,0x07,0xC0,0x07,0xC7,0xC3 + ,0xF0,0x01,0xF1,0xF0,0xF8,0x00,0x7F,0xFC,0x7E,0x00,0x1F,0xFF,0x1F,0x00,0x07 + ,0xFF,0x8F,0xC0,0x00,0xFF,0xE3,0xE0,0x00,0x1F,0xF1,0xF8,0x00,0x03,0xF0,0x7C + ,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x0F,0x80,0xC0,0x00,0x07,0xE3,0xFE,0x00 + ,0x03,0xF1,0xFF,0xC0,0x00,0xFC,0x7F,0xF0,0x00,0x7E,0x3F,0xFE,0x00,0x1F,0x8F + ,0xFF,0x80,0x0F,0xC3,0xE3,0xE0,0x03,0xF0,0xF8,0xF8,0x01,0xF8,0x3E,0x3E,0x00 + ,0x7E,0x0F,0x8F,0x80,0x3F,0x03,0xE3,0xE0,0x0F,0xC0,0xF8,0xF8,0x07,0xE0,0x3F + ,0xFE,0x01,0xF8,0x0F,0xFF,0x80,0xFC,0x01,0xFF,0xC0,0x3E,0x00,0x7F,0xF0,0x0F + ,0x80,0x0F,0xF8,0x00,0x80,0x00,0x30,0x00 // '%' + ,0x01,0xC0,0x00,0x07,0xFE,0x00,0x07,0xFF,0x80,0x07,0xFF,0xE0,0x07,0xFF,0xF0 + ,0x03,0xFF,0xFC,0x01,0xF0,0x3E,0x00,0xF8,0x1F,0x00,0x7C,0x0F,0x80,0x3E,0x07 + ,0xC0,0x1F,0x03,0xE0,0x0F,0x81,0xF0,0x07,0xE3,0xF8,0x01,0xFB,0xF8,0x00,0xFF + ,0xFC,0x00,0x3F,0xFC,0x00,0x1F,0xFC,0x78,0x07,0xFC,0x7E,0x07,0xFC,0x3F,0x07 + ,0xFE,0x1F,0x03,0xFF,0x9F,0x83,0xFF,0xEF,0x81,0xFF,0xFF,0xC0,0xF8,0xFF,0xE0 + ,0x7C,0x7F,0xE0,0x3E,0x1F,0xF0,0x1F,0x07,0xF8,0x0F,0x81,0xFC,0x07,0xC0,0xFE + ,0x03,0xE0,0x7F,0x81,0xF0,0x3F,0xC0,0xFF,0xFF,0xF0,0x7F,0xFF,0xFC,0x1F,0xFF + ,0xFF,0x07,0xFF,0x9F,0x81,0xFF,0x87,0xC0,0x1C,0x00,0x80 // '&' + ,0x10,0xF9,0xF3,0xE7,0xCF,0x9F,0x3C,0x00 // ''' + ,0x01,0x80,0xFE,0x1F,0xE3,0xFE,0x7F,0xE7,0xFC,0x7C,0x07,0xC0,0x7C,0x07,0xC0 + ,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0 + ,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0 + ,0x7C,0x07,0xFC,0x7F,0xE3,0xFE,0x1F,0xE0,0xFE,0x01,0x80 // '(' + ,0x10,0x07,0xF0,0x7F,0x87,0xFC,0x7F,0xC3,0xFE,0x03,0xE0,0x3E,0x03,0xE0,0x3E + ,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E + ,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E + ,0x03,0xE3,0xFE,0x7F,0xC7,0xFC,0x7F,0x87,0xF0,0x10,0x00 // ')' + ,0x02,0x02,0x00,0x78,0x3C,0x07,0xE3,0xF0,0x1F,0xBF,0x00,0xFF,0xF8,0x03,0xFF + ,0x80,0x1F,0xFC,0x03,0xFF,0xF8,0x7F,0xFF,0xF3,0xFF,0xFF,0x9F,0xFF,0xFC,0xFF + ,0xFF,0xE3,0xFF,0xFE,0x03,0xFF,0x80,0x1F,0xFC,0x00,0xFF,0xE0,0x0F,0xFF,0x80 + ,0x7C,0x7E,0x03,0xE3,0xF0,0x1E,0x0F,0x00,0x00,0x00,0x00 // '*' + ,0x00,0x00,0x00,0x70,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x01,0xFF + ,0xC1,0xFF,0xFC,0x7F,0xFF,0x1F,0xFF,0xE7,0xFF,0xF0,0xFF,0xF8,0x03,0xE0,0x00 + ,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0x20,0x00 // '+' + ,0x00,0x1E,0x1F,0x8F,0xC7,0xF3,0xF1,0xF8,0xFC,0x7C,0x3E,0x1E,0x02,0x00 // ',' + ,0x00,0x00,0x0F,0xFF,0x87,0xFF,0xF1,0xFF,0xFE,0x7F,0xFF,0x1F,0xFF,0xC1,0xFF + ,0xC0 // '-' + ,0x00,0x04,0x0F,0x0F,0xC7,0xE3,0xF1,0xF8,0x78,0x00,0x00 // '.' + ,0x00,0x00,0x08,0x00,0x00,0x0F,0x00,0x00,0x0F,0xC0,0x00,0x07,0xC0,0x00,0x07 + ,0xE0,0x00,0x07,0xE0,0x00,0x03,0xF0,0x00,0x03,0xF0,0x00,0x01,0xF8,0x00,0x01 + ,0xF8,0x00,0x00,0xFC,0x00,0x00,0xFC,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00 + ,0x3F,0x00,0x00,0x3F,0x00,0x00,0x1F,0x00,0x00,0x1F,0x80,0x00,0x0F,0x80,0x00 + ,0x0F,0xC0,0x00,0x07,0xC0,0x00,0x07,0xE0,0x00,0x03,0xE0,0x00,0x03,0xF0,0x00 + ,0x01,0xF0,0x00,0x01,0xF8,0x00,0x00,0xF8,0x00,0x00,0xFC,0x00,0x00,0x7C,0x00 + ,0x00,0x7E,0x00,0x00,0x3E,0x00,0x00,0x3F,0x00,0x00,0x3F,0x00,0x00,0x1F,0x80 + ,0x00,0x0F,0x80,0x00,0x07,0xC0,0x00,0x00,0x80,0x00,0x00 // '/' + ,0x01,0xFF,0x80,0x07,0xFF,0xF8,0x07,0xFF,0xFF,0x07,0xFF,0xFF,0xC7,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xF9,0xF0,0x07,0xFC,0xF8,0x03,0xFE,0x7C,0x03,0xFF,0x3E,0x01 + ,0xFF,0x9F,0x01,0xFF,0xCF,0x80,0xFF,0xE7,0xC0,0xFF,0xF3,0xE0,0x7F,0xF9,0xF0 + ,0x7E,0xFC,0xF8,0x3F,0x3E,0x7C,0x3F,0x1F,0x3E,0x1F,0x8F,0x9F,0x1F,0x87,0xCF + ,0x8F,0xC3,0xE7,0xCF,0xC1,0xF3,0xE7,0xE0,0xF9,0xFF,0xE0,0x7C,0xFF,0xF0,0x3E + ,0x7F,0xF0,0x1F,0x3F,0xF0,0x0F,0x9F,0xF8,0x07,0xCF,0xF8,0x03,0xE7,0xFC,0x01 + ,0xF3,0xFC,0x00,0xF9,0xFE,0x00,0xFC,0xFF,0xFF,0xFE,0x7F,0xFF,0xFE,0x1F,0xFF + ,0xFF,0x07,0xFF,0xFF,0x01,0xFF,0xFF,0x00,0x1F,0xF8,0x00 // '0' + ,0x01,0x80,0x3F,0x03,0xFC,0x3F,0xE3,0xFF,0x3F,0xF9,0xFF,0xCF,0xFE,0x7F,0xF3 + ,0x9F,0x80,0xFC,0x07,0xE0,0x3F,0x01,0xF8,0x0F,0xC0,0x7E,0x03,0xF0,0x1F,0x80 + ,0xFC,0x07,0xE0,0x3F,0x01,0xF8,0x0F,0xC0,0x7E,0x03,0xF0,0x1F,0x80,0xFC,0x07 + ,0xE0,0x3F,0x01,0xF8,0x0F,0xC0,0x7E,0x03,0xF0,0x1F,0x80,0xFC,0x03,0xC0,0x00 + ,0x00 // '1' + ,0x01,0xFF,0x80,0x07,0xFF,0xFC,0x07,0xFF,0xFF,0x07,0xFF,0xFF,0xC7,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xF9,0xF0,0x00,0xFC,0xF8,0x00,0x3E,0x7C,0x00,0x1F,0x3E,0x00 + ,0x0F,0x8E,0x00,0x07,0xC0,0x00,0x03,0xE0,0x00,0x01,0xF0,0x00,0x01,0xF8,0x00 + ,0x07,0xF8,0x00,0x0F,0xFC,0x00,0x3F,0xFC,0x00,0x7F,0xFC,0x01,0xFF,0xFC,0x03 + ,0xFF,0xF0,0x03,0xFF,0xE0,0x01,0xFF,0x80,0x01,0xFE,0x00,0x00,0xFC,0x00,0x00 + ,0x7C,0x00,0x00,0x3E,0x00,0x00,0x1F,0x00,0x00,0x0F,0x80,0x00,0x07,0xC0,0x00 + ,0x03,0xE0,0x00,0x01,0xF0,0x00,0x00,0xFF,0xFF,0xFC,0x7F,0xFF,0xFF,0x1F,0xFF + ,0xFF,0x87,0xFF,0xFF,0xC1,0xFF,0xFF,0xC0,0x1F,0xFF,0xC0 // '2' + ,0x01,0xFF,0x80,0x07,0xFF,0xFC,0x07,0xFF,0xFF,0x07,0xFF,0xFF,0xC7,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xF9,0xF0,0x00,0xFC,0xF8,0x00,0x3E,0x7C,0x00,0x1F,0x3E,0x00 + ,0x0F,0x8E,0x00,0x07,0xC0,0x00,0x03,0xE0,0x00,0x01,0xF0,0x00,0x00,0xF8,0x00 + ,0x00,0x7C,0x00,0x00,0x7E,0x03,0xFF,0xFE,0x03,0xFF,0xFF,0x01,0xFF,0xFF,0x80 + ,0xFF,0xFF,0xC0,0x3F,0xFF,0xE0,0x07,0xFF,0xF8,0x00,0x00,0x7C,0x00,0x00,0x3E + ,0x00,0x00,0x1F,0x00,0x00,0x0F,0x8E,0x00,0x07,0xCF,0x80,0x03,0xE7,0xC0,0x01 + ,0xF3,0xE0,0x00,0xF9,0xF0,0x00,0xFC,0xFF,0xFF,0xFE,0x7F,0xFF,0xFE,0x1F,0xFF + ,0xFF,0x07,0xFF,0xFF,0x01,0xFF,0xFF,0x00,0x1F,0xF8,0x00 // '3' + ,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xF8,0x00,0x00,0x7E,0x00,0x00,0x3F + ,0x00,0x00,0x1F,0x80,0x07,0x0F,0xC0,0x07,0xC7,0xE0,0x03,0xE3,0xF0,0x03,0xF1 + ,0xF8,0x01,0xF0,0xFC,0x01,0xF8,0x7E,0x00,0xF8,0x3F,0x00,0xFC,0x1F,0x80,0x7C + ,0x0F,0xC0,0x7E,0x07,0xE0,0x3E,0x03,0xF0,0x3F,0x01,0xF8,0x1F,0x00,0xFC,0x0F + ,0x80,0x7E,0x07,0xC0,0x3F,0x03,0xE0,0x1F,0x81,0xF0,0x0F,0xC0,0xF8,0x07,0xE0 + ,0x7F,0xFF,0xFE,0x3F,0xFF,0xFF,0x9F,0xFF,0xFF,0xCF,0xFF,0xFF,0xE7,0xFF,0xFF + ,0xE0,0xFF,0xFF,0xE0,0x00,0x0F,0xC0,0x00,0x07,0xE0,0x00,0x03,0xF0,0x00,0x01 + ,0xF8,0x00,0x00,0xFC,0x00,0x00,0x3C,0x00,0x00,0x00,0x00 // '4' + ,0x1F,0xFF,0xFC,0x3F,0xFF,0xFF,0x1F,0xFF,0xFF,0xCF,0xFF,0xFF,0xE7,0xFF,0xFF + ,0xF3,0xFF,0xFF,0xF1,0xF0,0x00,0x00,0xF8,0x00,0x00,0x7C,0x00,0x00,0x3E,0x00 + ,0x00,0x1F,0x00,0x00,0x0F,0x80,0x00,0x07,0xC0,0x00,0x03,0xE0,0x00,0x01,0xFF + ,0xFE,0x00,0xFF,0xFF,0xF0,0x7F,0xFF,0xFC,0x3F,0xFF,0xFF,0x1F,0xFF,0xFF,0x87 + ,0xFF,0xFF,0xE0,0x00,0x03,0xF0,0x00,0x00,0xF8,0x00,0x00,0x7C,0x00,0x00,0x3E + ,0x38,0x00,0x1F,0x3E,0x00,0x0F,0x9F,0x00,0x07,0xCF,0x80,0x03,0xE7,0xC0,0x01 + ,0xF3,0xE0,0x00,0xF9,0xF0,0x00,0xFC,0xFF,0xFF,0xFE,0x7F,0xFF,0xFE,0x1F,0xFF + ,0xFF,0x07,0xFF,0xFF,0x01,0xFF,0xFF,0x00,0x1F,0xF8,0x00 // '5' + ,0x01,0xFF,0x80,0x07,0xFF,0xF8,0x07,0xFF,0xFF,0x07,0xFF,0xFF,0xC7,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xF9,0xF0,0x00,0xFC,0xF8,0x00,0x3E,0x7C,0x00,0x1F,0x3E,0x00 + ,0x0F,0x9F,0x00,0x03,0x8F,0x80,0x00,0x07,0xC0,0x00,0x03,0xE0,0x00,0x01,0xFF + ,0xFE,0x00,0xFF,0xFF,0xF0,0x7F,0xFF,0xFC,0x3F,0xFF,0xFF,0x1F,0xFF,0xFF,0x8F + ,0xFF,0xFF,0xE7,0xC0,0x03,0xF3,0xE0,0x00,0xF9,0xF0,0x00,0x7C,0xF8,0x00,0x3E + ,0x7C,0x00,0x1F,0x3E,0x00,0x0F,0x9F,0x00,0x07,0xCF,0x80,0x03,0xE7,0xC0,0x01 + ,0xF3,0xE0,0x00,0xF9,0xF0,0x00,0xFC,0xFF,0xFF,0xFE,0x7F,0xFF,0xFE,0x1F,0xFF + ,0xFF,0x07,0xFF,0xFF,0x01,0xFF,0xFF,0x00,0x1F,0xF8,0x00 // '6' + ,0x1F,0xFF,0xFC,0x3F,0xFF,0xFF,0x1F,0xFF,0xFF,0xCF,0xFF,0xFF,0xE7,0xFF,0xFF + ,0xF3,0xFF,0xFF,0xF9,0xF0,0x00,0xFC,0xF8,0x00,0x3E,0x7C,0x00,0x1F,0x3E,0x00 + ,0x0F,0x8E,0x00,0x07,0xC0,0x00,0x07,0xE0,0x00,0x03,0xE0,0x00,0x01,0xF0,0x00 + ,0x01,0xF8,0x00,0x00,0xF8,0x00,0x00,0xFC,0x00,0x00,0x7E,0x00,0x00,0x3E,0x00 + ,0x00,0x3F,0x00,0x00,0x1F,0x00,0x00,0x0F,0x80,0x00,0x0F,0xC0,0x00,0x07,0xC0 + ,0x00,0x07,0xE0,0x00,0x03,0xE0,0x00,0x01,0xF0,0x00,0x01,0xF8,0x00,0x00,0xF8 + ,0x00,0x00,0xFC,0x00,0x00,0x7E,0x00,0x00,0x3E,0x00,0x00,0x3F,0x00,0x00,0x1F + ,0x00,0x00,0x0F,0x80,0x00,0x07,0xC0,0x00,0x00,0x80,0x00 // '7' + ,0x01,0xFF,0x80,0x07,0xFF,0xFC,0x07,0xFF,0xFF,0x07,0xFF,0xFF,0xC7,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xF9,0xF0,0x00,0xFC,0xF8,0x00,0x3E,0x7C,0x00,0x1F,0x3E,0x00 + ,0x0F,0x9F,0x00,0x07,0xCF,0x80,0x03,0xE7,0xC0,0x01,0xF3,0xE0,0x00,0xF9,0xF0 + ,0x00,0x7C,0xFF,0xFF,0xFE,0x7F,0xFF,0xFE,0x1F,0xFF,0xFF,0x0F,0xFF,0xFF,0x8F + ,0xFF,0xFF,0xC7,0xFF,0xFF,0xF3,0xE0,0x01,0xF9,0xF0,0x00,0x7C,0xF8,0x00,0x3E + ,0x7C,0x00,0x1F,0x3E,0x00,0x0F,0x9F,0x00,0x07,0xCF,0x80,0x03,0xE7,0xC0,0x01 + ,0xF3,0xE0,0x00,0xF9,0xF0,0x00,0xFC,0xFF,0xFF,0xFE,0x7F,0xFF,0xFE,0x1F,0xFF + ,0xFF,0x07,0xFF,0xFF,0x01,0xFF,0xFF,0x00,0x1F,0xF8,0x00 // '8' + ,0x01,0xFF,0x80,0x07,0xFF,0xFC,0x07,0xFF,0xFF,0x07,0xFF,0xFF,0xC7,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xF9,0xF0,0x00,0xFC,0xF8,0x00,0x3E,0x7C,0x00,0x1F,0x3E,0x00 + ,0x0F,0x9F,0x00,0x07,0xCF,0x80,0x03,0xE7,0xC0,0x01,0xF3,0xE0,0x00,0xF9,0xF0 + ,0x00,0x7C,0xF8,0x00,0x3E,0x7C,0x00,0x1F,0x3F,0xFF,0xFF,0x9F,0xFF,0xFF,0xC7 + ,0xFF,0xFF,0xE3,0xFF,0xFF,0xF0,0x7F,0xFF,0xF8,0x1F,0xFF,0xFC,0x00,0x00,0x3E + ,0x00,0x00,0x1F,0x00,0x00,0x0F,0x8E,0x00,0x07,0xCF,0x80,0x03,0xE7,0xC0,0x01 + ,0xF3,0xE0,0x00,0xF9,0xF0,0x00,0xFC,0xFF,0xFF,0xFE,0x7F,0xFF,0xFE,0x1F,0xFF + ,0xFF,0x07,0xFF,0xFF,0x01,0xFF,0xFF,0x00,0x1F,0xF8,0x00 // '9' + ,0x00,0x04,0x0F,0x0F,0xC7,0xE3,0xF1,0xF8,0x78,0x00,0x00,0x00,0x00,0x01,0x81 + ,0xE1,0xF8,0xFE,0x7E,0x3F,0x0F,0x00,0x00 // ':' + ,0x00,0x1E,0x1F,0x8F,0xC7,0xF3,0xF1,0xF8,0xFC,0x7C,0x3E,0x1E,0x02,0x00 // ',' + ,0x00,0x00,0x08,0x00,0x00,0x0F,0x00,0x00,0x0F,0xC0,0x00,0x07,0xC0,0x00,0x07 + ,0xE0,0x00,0x07,0xE0,0x00,0x03,0xF0,0x00,0x03,0xF0,0x00,0x01,0xF8,0x00,0x01 + ,0xF8,0x00,0x00,0xFC,0x00,0x00,0xFC,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00 + ,0x3F,0x00,0x00,0x3F,0x00,0x00,0x1F,0x00,0x00,0x1F,0x80,0x00,0x0F,0x80,0x00 + ,0x0F,0xC0,0x00,0x07,0xC0,0x00,0x07,0xE0,0x00,0x03,0xE0,0x00,0x03,0xF0,0x00 + ,0x01,0xF0,0x00,0x01,0xF8,0x00,0x00,0xF8,0x00,0x00,0xFC,0x00,0x00,0x7C,0x00 + ,0x00,0x7E,0x00,0x00,0x3E,0x00,0x00,0x3F,0x00,0x00,0x3F,0x00,0x00,0x1F,0x80 + ,0x00,0x0F,0x80,0x00,0x07,0xC0,0x00,0x00,0x80,0x00,0x00 // '/' + ,0x03,0x00,0x00,0x40,0x07,0xF8,0x00,0x7C,0x03,0xFF,0x00,0x3F,0x01,0xFF,0xE0 + ,0x0F,0xC0,0x7F,0xFC,0x07,0xE0,0x1F,0xFF,0x01,0xF0,0x07,0xC7,0xC0,0xFC,0x01 + ,0xF1,0xF0,0x3E,0x00,0x7C,0x7C,0x1F,0x80,0x1F,0x1F,0x07,0xC0,0x07,0xC7,0xC3 + ,0xF0,0x01,0xF1,0xF0,0xF8,0x00,0x7F,0xFC,0x7E,0x00,0x1F,0xFF,0x1F,0x00,0x07 + ,0xFF,0x8F,0xC0,0x00,0xFF,0xE3,0xE0,0x00,0x1F,0xF1,0xF8,0x00,0x03,0xF0,0x7C + ,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x0F,0x80,0xC0,0x00,0x07,0xE3,0xFE,0x00 + ,0x03,0xF1,0xFF,0xC0,0x00,0xFC,0x7F,0xF0,0x00,0x7E,0x3F,0xFE,0x00,0x1F,0x8F + ,0xFF,0x80,0x0F,0xC3,0xE3,0xE0,0x03,0xF0,0xF8,0xF8,0x01,0xF8,0x3E,0x3E,0x00 + ,0x7E,0x0F,0x8F,0x80,0x3F,0x03,0xE3,0xE0,0x0F,0xC0,0xF8,0xF8,0x07,0xE0,0x3F + ,0xFE,0x01,0xF8,0x0F,0xFF,0x80,0xFC,0x01,0xFF,0xC0,0x3E,0x00,0x7F,0xF0,0x0F + ,0x80,0x0F,0xF8,0x00,0x80,0x00,0x30,0x00 // '%' + ,0x07,0xE0,0x3F,0xF8,0x7F,0xFC,0x7F,0xFC,0x7F,0xFE,0x7F,0xFE,0x7C,0x7E,0x7C + ,0x7E,0x7C,0x7E,0x7C,0x7E,0x7C,0x7E,0x7C,0x7E,0x7C,0x7E,0x7C,0x7E,0x7C,0x7E + ,0x7C,0x7E,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC,0x7F,0xFC,0x3F,0xF8,0x07,0xE0 // 'º' + ,0x01,0xFF,0x80,0x07,0xFF,0xF8,0x07,0xFF,0xFF,0x07,0xFF,0xFF,0xC7,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xF9,0xF0,0x00,0xFC,0xF8,0x00,0x3E,0x7C,0x00,0x1F,0x3E,0x00 + ,0x0F,0x9F,0x00,0x07,0xCF,0x80,0x03,0xE7,0x80,0x01,0xF0,0x00,0x01,0xF8,0x00 + ,0x07,0xF8,0x00,0x0F,0xFC,0x00,0x0F,0xFC,0x00,0x0F,0xFC,0x00,0x0F,0xFC,0x00 + ,0x07,0xF0,0x00,0x03,0xE0,0x00,0x01,0xF0,0x00,0x00,0xF8,0x00,0x00,0x7C,0x00 + ,0x00,0x3E,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x40,0x00,0x00,0xF8,0x00,0x00,0xFC,0x00,0x00,0x7F,0x00,0x00,0x3F + ,0x80,0x00,0x1F,0x80,0x00,0x07,0x80,0x00,0x00,0x00,0x00 // '?' + ,0x01,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF + ,0xFC,0x7F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFE,0x7C,0x00,0x00,0x3E,0x7C,0x00 + ,0x00,0x3E,0x7C,0x00,0x00,0x3E,0x7C,0x03,0x00,0x3E,0x7C,0x1F,0xFE,0x3E,0x7C + ,0x3F,0xFF,0x3E,0x7C,0x7F,0xFF,0x3E,0x7C,0x7F,0xFF,0x3E,0x7C,0x7F,0xFE,0x3E + ,0x7C,0x7C,0xFC,0x3E,0x7C,0x7C,0xFC,0x3E,0x7C,0x7C,0xFC,0x3E,0x7C,0x7C,0xFC + ,0x3E,0x7C,0x7C,0xFC,0x3E,0x7C,0x7C,0xFC,0x3E,0x7C,0x7C,0xFC,0x3E,0x7C,0x7F + ,0xFF,0xFE,0x7C,0x7F,0xFF,0xFE,0x7C,0x7F,0xFF,0xFE,0x7C,0x3F,0xFF,0xFC,0x7C + ,0x1F,0xFF,0xF8,0x7C,0x0F,0xFF,0xF0,0x7C,0x00,0x00,0x00,0x7C,0x00,0x00,0x00 + ,0x7C,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xE0,0x3F,0xFF,0xFF + ,0xE0,0x1F,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0x80 // '@' + ,0x00,0x03,0x00,0x00,0x00,0x7C,0x00,0x00,0x03,0xF0,0x00,0x00,0x1F,0x80,0x00 + ,0x01,0xFC,0x00,0x00,0x0F,0xF0,0x00,0x00,0x7F,0x80,0x00,0x07,0xFC,0x00,0x00 + ,0x3F,0xF0,0x00,0x01,0xFF,0x80,0x00,0x1F,0xFC,0x00,0x00,0xFF,0xF0,0x00,0x07 + ,0xFF,0x80,0x00,0x7E,0x7C,0x00,0x03,0xF3,0xF0,0x00,0x1F,0x0F,0x80,0x01,0xF8 + ,0x7C,0x00,0x0F,0xC3,0xF0,0x00,0x7C,0x0F,0x80,0x07,0xE0,0x7C,0x00,0x3F,0x03 + ,0xF0,0x01,0xF0,0x1F,0x80,0x1F,0xFF,0xFC,0x00,0xFF,0xFF,0xF0,0x07,0xFF,0xFF + ,0x80,0x3F,0xFF,0xFC,0x03,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0x80,0xF8,0x00,0x7C + ,0x0F,0xC0,0x03,0xF0,0x7C,0x00,0x1F,0x83,0xE0,0x00,0x7C,0x3F,0x00,0x03,0xF1 + ,0xF0,0x00,0x1F,0x8F,0x80,0x00,0x7C,0x7C,0x00,0x03,0xE0,0x80,0x00,0x04,0x00 // 'A' + ,0x1F,0xFF,0x00,0x7F,0xFF,0xE0,0x7F,0xFF,0xF0,0x7F,0xFF,0xF8,0x7F,0xFF,0xFC + ,0x7F,0xFF,0xFC,0x7C,0x00,0x7C,0x7C,0x00,0x7C,0x7C,0x00,0x7C,0x7C,0x00,0x7C + ,0x7C,0x00,0x7C,0x7C,0x00,0x7C,0x7C,0x00,0x7C,0x7C,0x00,0x7C,0x7C,0x00,0x7C + ,0x7F,0xFF,0xFC,0x7F,0xFF,0xFC,0x7F,0xFF,0xFC,0x7F,0xFF,0xFC,0x7F,0xFF,0xFE + ,0x7F,0xFF,0xFE,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7F,0xFF,0xFE,0x7F,0xFF,0xFC,0x7F,0xFF,0xFC,0x7F,0xFF,0xF8 + ,0x7F,0xFF,0xF0,0x1F,0xFF,0x00 // 'B' + ,0x01,0xFF,0x00,0x0F,0xFF,0xF0,0x1F,0xFF,0xF8,0x3F,0xFF,0xFC,0x7F,0xFF,0xFC + ,0x7F,0xFF,0xFE,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x1C,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7C,0x00,0x1C,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7F,0xFF,0xFE,0x7F,0xFF,0xFC,0x3F,0xFF,0xFC,0x1F,0xFF,0xF8 + ,0x0F,0xFF,0xF0,0x01,0xFF,0x00 // 'C' + ,0x1F,0xFF,0x00,0x7F,0xFF,0xF0,0x7F,0xFF,0xF8,0x7F,0xFF,0xFC,0x7F,0xFF,0xFC + ,0x7F,0xFF,0xFE,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7F,0xFF,0xFE,0x7F,0xFF,0xFC,0x7F,0xFF,0xFC,0x7F,0xFF,0xF8 + ,0x7F,0xFF,0xF0,0x1F,0xFF,0x00 // 'D' + ,0x1F,0xFF,0xF0,0x7F,0xFF,0xFC,0x7F,0xFF,0xFE,0x7F,0xFF,0xFE,0x7F,0xFF,0xFC + ,0x7F,0xFF,0xFC,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7F,0xFF,0xF0,0x7F,0xFF,0xF8,0x7F,0xFF,0xF8,0x7F,0xFF,0xF8 + ,0x7F,0xFF,0xF0,0x7F,0xFF,0xE0,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7F,0xFF,0xFC,0x7F,0xFF,0xFC,0x7F,0xFF,0xFE,0x7F,0xFF,0xFE + ,0x7F,0xFF,0xFC,0x1F,0xFF,0xF0 // 'E' + ,0x1F,0xFF,0xF0,0x7F,0xFF,0xFC,0x7F,0xFF,0xFE,0x7F,0xFF,0xFE,0x7F,0xFF,0xFC + ,0x7F,0xFF,0xFC,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7F,0xFF,0xF0,0x7F,0xFF,0xF8,0x7F,0xFF,0xF8,0x7F,0xFF,0xF8 + ,0x7F,0xFF,0xF0,0x7F,0xFF,0xE0,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x78,0x00,0x00,0x10,0x00,0x00 // 'F' + ,0x01,0xFF,0x80,0x07,0xFF,0xF8,0x07,0xFF,0xFF,0x07,0xFF,0xFF,0xC7,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xF9,0xF0,0x00,0xFC,0xF8,0x00,0x3E,0x7C,0x00,0x1F,0x3E,0x00 + ,0x0F,0x9F,0x00,0x03,0x8F,0x80,0x00,0x07,0xC0,0x00,0x03,0xE0,0x00,0x01,0xF0 + ,0x00,0x00,0xF8,0x00,0x00,0x7C,0x07,0xFE,0x3E,0x07,0xFF,0x9F,0x03,0xFF,0xCF + ,0x81,0xFF,0xE7,0xC0,0xFF,0xF3,0xE0,0x1F,0xF9,0xF0,0x00,0x7C,0xF8,0x00,0x3E + ,0x7C,0x00,0x1F,0x3E,0x00,0x0F,0x9F,0x00,0x07,0xCF,0x80,0x03,0xE7,0xC0,0x01 + ,0xF3,0xE0,0x00,0xF9,0xF0,0x00,0xFC,0xFF,0xFF,0xFE,0x7F,0xFF,0xFE,0x1F,0xFF + ,0xFF,0x07,0xFF,0xFF,0x01,0xFF,0xFF,0x00,0x1F,0xF8,0x00 // 'G' + ,0x10,0x00,0x08,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7F,0xFF,0xFE,0x7F,0xFF,0xFE,0x7F,0xFF,0xFE,0x7F,0xFF,0xFE + ,0x7F,0xFF,0xFE,0x7F,0xFF,0xFE,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x10,0x00,0x08 // 'H' + ,0x10,0xF9,0xF3,0xE7,0xCF,0x9F,0x3E,0x7C,0xF9,0xF3,0xE7,0xCF,0x9F,0x3E,0x7C + ,0xF9,0xF3,0xE7,0xCF,0x9F,0x3E,0x7C,0xF9,0xF3,0xE7,0xCF,0x9F,0x3E,0x7C,0xF9 + ,0xF3,0xE1,0x00 // 'I' + ,0x00,0x00,0x08,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E + ,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E + ,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E + ,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E + ,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x3E,0x78,0x00,0x3E + ,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7F,0xFF,0xFE,0x7F,0xFF,0xFC,0x3F,0xFF,0xFC,0x1F,0xFF,0xF8 + ,0x0F,0xFF,0xF0,0x01,0xFF,0x00 // 'J' + ,0x10,0x00,0x10,0x7C,0x00,0x7C,0x7C,0x00,0xFE,0x7C,0x00,0xFC,0x7C,0x01,0xF8 + ,0x7C,0x03,0xF0,0x7C,0x07,0xF0,0x7C,0x0F,0xE0,0x7C,0x1F,0xC0,0x7C,0x3F,0x80 + ,0x7C,0x7F,0x00,0x7C,0x7E,0x00,0x7C,0xFC,0x00,0x7F,0xF8,0x00,0x7F,0xF8,0x00 + ,0x7F,0xF0,0x00,0x7F,0xE0,0x00,0x7F,0xC0,0x00,0x7F,0xC0,0x00,0x7F,0xC0,0x00 + ,0x7F,0xE0,0x00,0x7F,0xF0,0x00,0x7F,0xF8,0x00,0x7F,0xF8,0x00,0x7C,0xFC,0x00 + ,0x7C,0xFE,0x00,0x7C,0x7F,0x00,0x7C,0x3F,0x80,0x7C,0x1F,0xC0,0x7C,0x0F,0xE0 + ,0x7C,0x07,0xF0,0x7C,0x03,0xF0,0x7C,0x01,0xF8,0x7C,0x01,0xFC,0x7C,0x00,0xFE + ,0x7C,0x00,0x7C,0x10,0x00,0x10 // 'K' + ,0x10,0x00,0x00,0x78,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7F,0xFF,0xFC,0x7F,0xFF,0xFC,0x7F,0xFF,0xFE,0x7F,0xFF,0xFE + ,0x7F,0xFF,0xFC,0x1F,0xFF,0xF0 // 'L' + ,0x10,0x00,0x00,0x03,0xE0,0x00,0x0F,0x1F,0x00,0x00,0xFC,0xFC,0x00,0x07,0xE7 + ,0xE0,0x00,0x7F,0x3F,0x80,0x03,0xF9,0xFC,0x00,0x3F,0xCF,0xF0,0x01,0xFE,0x7F + ,0x80,0x1F,0xF3,0xFE,0x00,0xFF,0x9F,0xF0,0x0F,0xFC,0xFF,0x80,0x7F,0xE7,0xFE + ,0x07,0xFF,0x3F,0xF0,0x3F,0xF9,0xFF,0xC3,0xFF,0xCF,0xFE,0x1F,0xFE,0x7F,0xF9 + ,0xFF,0xF3,0xFF,0xCF,0xDF,0x9F,0x3F,0xFE,0xFC,0xF9,0xFF,0xE7,0xE7,0xC7,0xFF + ,0x3F,0x3E,0x3F,0xF1,0xF9,0xF0,0xFF,0x8F,0xCF,0x87,0xF8,0x7E,0x7C,0x1F,0xC3 + ,0xF3,0xE0,0xFC,0x1F,0x9F,0x03,0xE0,0xFC,0xF8,0x1E,0x07,0xE7,0xC0,0x70,0x3F + ,0x3E,0x00,0x01,0xF9,0xF0,0x00,0x0F,0xCF,0x80,0x00,0x7E,0x7C,0x00,0x03,0xF3 + ,0xE0,0x00,0x1F,0x9F,0x00,0x00,0xFC,0xF8,0x00,0x03,0xC1,0x00,0x00,0x00,0x00 // 'M' + ,0x10,0x00,0x04,0x3E,0x00,0x0F,0x1F,0x00,0x07,0xCF,0xC0,0x03,0xE7,0xE0,0x01 + ,0xF3,0xF8,0x00,0xF9,0xFE,0x00,0x7C,0xFF,0x00,0x3E,0x7F,0xC0,0x1F,0x3F,0xE0 + ,0x0F,0x9F,0xF8,0x07,0xCF,0xFC,0x03,0xE7,0xFF,0x01,0xF3,0xFF,0xC0,0xF9,0xFF + ,0xE0,0x7C,0xFF,0xF8,0x3E,0x7C,0xFC,0x1F,0x3E,0x7F,0x0F,0x9F,0x1F,0xC7,0xCF + ,0x87,0xE3,0xE7,0xC3,0xF9,0xF3,0xE0,0xFF,0xF9,0xF0,0x7F,0xFC,0xF8,0x1F,0xFE + ,0x7C,0x07,0xFF,0x3E,0x03,0xFF,0x9F,0x00,0xFF,0xCF,0x80,0x7F,0xE7,0xC0,0x1F + ,0xF3,0xE0,0x0F,0xF9,0xF0,0x03,0xFC,0xF8,0x00,0xFE,0x7C,0x00,0x7F,0x3E,0x00 + ,0x1F,0x9F,0x00,0x0F,0xCF,0x80,0x03,0xC1,0x00,0x00,0x40 // 'N' + ,0x01,0xFF,0x80,0x07,0xFF,0xFC,0x07,0xFF,0xFF,0x07,0xFF,0xFF,0xC7,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xF9,0xF0,0x00,0xFC,0xF8,0x00,0x3E,0x7C,0x00,0x1F,0x3E,0x00 + ,0x0F,0x9F,0x00,0x07,0xCF,0x80,0x03,0xE7,0xC0,0x01,0xF3,0xE0,0x00,0xF9,0xF0 + ,0x00,0x7C,0xF8,0x00,0x3E,0x7C,0x00,0x1F,0x3E,0x00,0x0F,0x9F,0x00,0x07,0xCF + ,0x80,0x03,0xE7,0xC0,0x01,0xF3,0xE0,0x00,0xF9,0xF0,0x00,0x7C,0xF8,0x00,0x3E + ,0x7C,0x00,0x1F,0x3E,0x00,0x0F,0x9F,0x00,0x07,0xCF,0x80,0x03,0xE7,0xC0,0x01 + ,0xF3,0xE0,0x00,0xF9,0xF0,0x00,0xFC,0xFF,0xFF,0xFE,0x7F,0xFF,0xFE,0x1F,0xFF + ,0xFF,0x07,0xFF,0xFF,0x01,0xFF,0xFF,0x00,0x1F,0xF8,0x00 // 'O' + ,0x1F,0xFF,0x80,0x7F,0xFF,0xF0,0x7F,0xFF,0xF8,0x7F,0xFF,0xFC,0x7F,0xFF,0xFE + ,0x7F,0xFF,0xFE,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7F,0xFF,0xFE,0x7F,0xFF,0xFE,0x7F,0xFF,0xFC,0x7F,0xFF,0xFC + ,0x7F,0xFF,0xF0,0x7F,0xFF,0xE0,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00 + ,0x78,0x00,0x00,0x10,0x00,0x00 // 'P' + ,0x01,0xFF,0x80,0x07,0xFF,0xFC,0x07,0xFF,0xFF,0x07,0xFF,0xFF,0xC7,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xF9,0xF0,0x00,0xFC,0xF8,0x00,0x3E,0x7C,0x00,0x1F,0x3E,0x00 + ,0x0F,0x9F,0x00,0x07,0xCF,0x80,0x03,0xE7,0xC0,0x01,0xF3,0xE0,0x00,0xF9,0xF0 + ,0x00,0x7C,0xF8,0x00,0x3E,0x7C,0x00,0x1F,0x3E,0x00,0x0F,0x9F,0x00,0x07,0xCF + ,0x80,0x03,0xE7,0xC0,0x01,0xF3,0xE0,0x00,0xF9,0xF0,0x70,0x7C,0xF8,0x7C,0x3E + ,0x7C,0x3F,0x1F,0x3E,0x1F,0xCF,0x9F,0x07,0xFF,0xCF,0x81,0xFF,0xE7,0xC0,0x7F + ,0xF3,0xE0,0x3F,0xF9,0xF0,0x0F,0xFC,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0x1F,0xFF + ,0xFF,0x87,0xFF,0xFF,0xC1,0xFF,0xFF,0xC0,0x1F,0xFF,0xC0 // 'Q' + ,0x1F,0xFF,0x80,0x3F,0xFF,0xF8,0x1F,0xFF,0xFE,0x0F,0xFF,0xFF,0x87,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xF1,0xF0,0x00,0xF8,0xF8,0x00,0x7C,0x7C,0x00,0x3E,0x3E,0x00 + ,0x1F,0x1F,0x00,0x0F,0x8F,0x80,0x07,0xC7,0xC0,0x03,0xE3,0xE0,0x01,0xF1,0xF0 + ,0x00,0xF8,0xF8,0x00,0x7C,0x7F,0xFF,0xFE,0x3F,0xFF,0xFF,0x1F,0xFF,0xFF,0x8F + ,0xFF,0xFF,0x87,0xFF,0xFF,0x83,0xFF,0xFF,0x01,0xF0,0x1F,0x80,0xF8,0x07,0xC0 + ,0x7C,0x03,0xF0,0x3E,0x00,0xF8,0x1F,0x00,0x7E,0x0F,0x80,0x1F,0x07,0xC0,0x0F + ,0x83,0xE0,0x07,0xE1,0xF0,0x01,0xF0,0xF8,0x00,0xFC,0x7C,0x00,0x3E,0x3E,0x00 + ,0x1F,0x1F,0x00,0x0F,0xCF,0x80,0x03,0xC1,0x00,0x00,0x40 // 'R' + ,0x01,0xFF,0x80,0x07,0xFF,0xFC,0x07,0xFF,0xFF,0x07,0xFF,0xFF,0xC7,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xF9,0xF0,0x00,0xFC,0xF8,0x00,0x3E,0x7C,0x00,0x1F,0x3E,0x00 + ,0x0F,0x9F,0x00,0x03,0x0F,0x80,0x00,0x07,0xC0,0x00,0x03,0xF0,0x00,0x01,0xFE + ,0x00,0x00,0x7F,0xE0,0x00,0x3F,0xFC,0x00,0x0F,0xFF,0xC0,0x01,0xFF,0xFC,0x00 + ,0x3F,0xFF,0x00,0x03,0xFF,0xC0,0x00,0x7F,0xF0,0x00,0x07,0xF8,0x00,0x00,0x7E + ,0x00,0x00,0x1F,0x00,0x00,0x0F,0x8E,0x00,0x07,0xCF,0x80,0x03,0xE7,0xC0,0x01 + ,0xF3,0xE0,0x00,0xF9,0xF0,0x00,0xFC,0xFF,0xFF,0xFE,0x7F,0xFF,0xFE,0x1F,0xFF + ,0xFF,0x07,0xFF,0xFF,0x01,0xFF,0xFF,0x00,0x1F,0xF8,0x00 // 'S' + ,0x1F,0xFF,0xF8,0x7F,0xFF,0xFE,0x7F,0xFF,0xFE,0x7F,0xFF,0xFE,0x7F,0xFF,0xFE + ,0x3F,0xFF,0xFC,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00 + ,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00 + ,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00 + ,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00 + ,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00 + ,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00 + ,0x00,0x3C,0x00,0x00,0x00,0x00 // 'T' + ,0x10,0x00,0x08,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x3E + ,0x7C,0x00,0x3E,0x7F,0xFF,0xFE,0x7F,0xFF,0xFC,0x3F,0xFF,0xFC,0x1F,0xFF,0xF8 + ,0x0F,0xFF,0xF0,0x01,0xFF,0x00 // 'U' + ,0x08,0x00,0x00,0x41,0xF0,0x00,0x0F,0x8F,0x80,0x00,0x7C,0x7C,0x00,0x07,0xE3 + ,0xF0,0x00,0x3F,0x0F,0x80,0x01,0xF0,0x7C,0x00,0x1F,0x83,0xF0,0x00,0xFC,0x0F + ,0x80,0x07,0xC0,0x7C,0x00,0x7E,0x03,0xF0,0x03,0xF0,0x0F,0x80,0x1F,0x00,0x7C + ,0x01,0xF8,0x03,0xF0,0x0F,0xC0,0x1F,0x80,0x7C,0x00,0x7C,0x07,0xE0,0x03,0xF0 + ,0x3F,0x00,0x1F,0x81,0xF0,0x00,0x7C,0x1F,0x80,0x03,0xF0,0xFC,0x00,0x1F,0x87 + ,0xC0,0x00,0x7C,0x7E,0x00,0x03,0xF3,0xF0,0x00,0x1F,0x9F,0x00,0x00,0x7F,0xF8 + ,0x00,0x03,0xFF,0xC0,0x00,0x1F,0xFC,0x00,0x00,0x7F,0xE0,0x00,0x03,0xFF,0x00 + ,0x00,0x1F,0xF0,0x00,0x00,0x7F,0x80,0x00,0x03,0xFC,0x00,0x00,0x1F,0xE0,0x00 + ,0x00,0x7E,0x00,0x00,0x03,0xF0,0x00,0x00,0x1F,0x00,0x00,0x00,0x30,0x00,0x00 // 'V' + ,0x08,0x00,0x00,0x00,0x41,0xF0,0x00,0x00,0x0F,0x0F,0x80,0x00,0x00,0xFC,0x7C + ,0x00,0x00,0x07,0xE3,0xE0,0x00,0x00,0x3E,0x1F,0x80,0x00,0x01,0xF0,0xFC,0x00 + ,0x00,0x0F,0x83,0xE0,0x0E,0x00,0xFC,0x1F,0x00,0x78,0x07,0xC0,0xFC,0x07,0xC0 + ,0x3E,0x07,0xE0,0x3E,0x01,0xF0,0x1F,0x01,0xF8,0x1F,0x80,0xF8,0x0F,0xC0,0xFC + ,0x07,0xC0,0xFE,0x07,0xC0,0x3F,0x07,0xF0,0x3E,0x01,0xF8,0x3F,0xC3,0xF0,0x07 + ,0xC3,0xFE,0x1F,0x80,0x3E,0x1F,0xF0,0xF8,0x01,0xF8,0xFF,0xC7,0xC0,0x0F,0xCF + ,0xFE,0x3E,0x00,0x3E,0x7F,0xF3,0xF0,0x01,0xF3,0xFF,0xDF,0x80,0x0F,0xFF,0xFF + ,0xF8,0x00,0x7F,0xFB,0xFF,0xC0,0x03,0xFF,0xCF,0xFE,0x00,0x0F,0xFC,0x7F,0xF0 + ,0x00,0x7F,0xE3,0xFF,0x00,0x03,0xFF,0x0F,0xF8,0x00,0x1F,0xF0,0x7F,0xC0,0x00 + ,0x7F,0x83,0xFE,0x00,0x03,0xFC,0x0F,0xF0,0x00,0x1F,0xC0,0x7F,0x00,0x00,0xFE + ,0x03,0xF8,0x00,0x07,0xF0,0x0F,0xC0,0x00,0x1F,0x00,0x7E,0x00,0x00,0xF8,0x03 + ,0xE0,0x00,0x01,0x00,0x04,0x00,0x00 // 'W' + ,0x08,0x00,0x08,0x1F,0x00,0x0F,0x0F,0x80,0x0F,0xC7,0xE0,0x0F,0xC3,0xF0,0x07 + ,0xE0,0xFC,0x07,0xE0,0x3E,0x03,0xF0,0x1F,0x83,0xF0,0x07,0xC1,0xF8,0x03,0xF1 + ,0xF8,0x00,0xFC,0xFC,0x00,0x7F,0xFC,0x00,0x1F,0xFE,0x00,0x0F,0xFE,0x00,0x03 + ,0xFF,0x00,0x01,0xFF,0x00,0x00,0x7F,0x00,0x00,0x3F,0x80,0x00,0x1F,0xC0,0x00 + ,0x0F,0xE0,0x00,0x07,0xF8,0x00,0x07,0xFC,0x00,0x03,0xFF,0x00,0x03,0xFF,0x80 + ,0x01,0xFF,0xE0,0x01,0xFF,0xF0,0x00,0xFC,0xFC,0x00,0xFC,0x7E,0x00,0x7C,0x1F + ,0x80,0x7E,0x0F,0xC0,0x3E,0x03,0xF0,0x3F,0x01,0xF8,0x1F,0x00,0x7E,0x1F,0x80 + ,0x3F,0x0F,0x80,0x0F,0xC7,0xC0,0x03,0xC0,0x80,0x00,0x80 // 'X' + ,0x08,0x00,0x00,0x41,0xF0,0x00,0x0F,0x8F,0x80,0x00,0xFC,0x7E,0x00,0x07,0xE1 + ,0xF8,0x00,0x7E,0x0F,0xC0,0x07,0xE0,0x3F,0x00,0x3F,0x01,0xF8,0x03,0xF0,0x07 + ,0xE0,0x3F,0x80,0x1F,0x81,0xF8,0x00,0xFC,0x1F,0x80,0x03,0xF0,0xFC,0x00,0x1F + ,0xCF,0xC0,0x00,0x7F,0xFE,0x00,0x01,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0x3F + ,0xF0,0x00,0x01,0xFF,0x00,0x00,0x07,0xF8,0x00,0x00,0x3F,0x80,0x00,0x00,0xFC + ,0x00,0x00,0x07,0xC0,0x00,0x00,0x3E,0x00,0x00,0x01,0xF0,0x00,0x00,0x0F,0x80 + ,0x00,0x00,0x7C,0x00,0x00,0x03,0xE0,0x00,0x00,0x1F,0x00,0x00,0x00,0xF8,0x00 + ,0x00,0x07,0xC0,0x00,0x00,0x3E,0x00,0x00,0x01,0xF0,0x00,0x00,0x0F,0x80,0x00 + ,0x00,0x7C,0x00,0x00,0x03,0xE0,0x00,0x00,0x0F,0x00,0x00,0x00,0x20,0x00,0x00 // 'Y' + ,0x0F,0xFF,0xFC,0x0F,0xFF,0xFF,0xC3,0xFF,0xFF,0xF0,0xFF,0xFF,0xFC,0x3F,0xFF + ,0xFE,0x07,0xFF,0xFF,0x80,0x00,0x0F,0xC0,0x00,0x03,0xF0,0x00,0x01,0xF8,0x00 + ,0x00,0x7E,0x00,0x00,0x3F,0x00,0x00,0x0F,0xC0,0x00,0x07,0xE0,0x00,0x01,0xF8 + ,0x00,0x00,0xFC,0x00,0x00,0x3E,0x00,0x00,0x1F,0x80,0x00,0x07,0xC0,0x00,0x03 + ,0xF0,0x00,0x01,0xF8,0x00,0x00,0x7E,0x00,0x00,0x3F,0x00,0x00,0x0F,0xC0,0x00 + ,0x07,0xE0,0x00,0x01,0xF8,0x00,0x00,0xFC,0x00,0x00,0x3F,0x00,0x00,0x1F,0x80 + ,0x00,0x07,0xC0,0x00,0x03,0xF0,0x00,0x00,0xFC,0x00,0x00,0x7F,0xFF,0xF8,0x1F + ,0xFF,0xFF,0x0F,0xFF,0xFF,0xC3,0xFF,0xFF,0xF0,0xFF,0xFF,0xF8,0x0F,0xFF,0xFC + ,0x00 // 'Z' + ,0x1F,0x87,0xFE,0x7F,0xE7,0xFE,0x7F,0xE7,0xFC,0x7C,0x07,0xC0,0x7C,0x07,0xC0 + ,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0 + ,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0 + ,0x7C,0x07,0xFC,0x7F,0xE7,0xFE,0x7F,0xE7,0xFE,0x1F,0x80 // '[' + ,0x08,0x00,0x00,0x1F,0x00,0x00,0x0F,0x80,0x00,0x07,0xE0,0x00,0x01,0xF0,0x00 + ,0x00,0xFC,0x00,0x00,0x3E,0x00,0x00,0x1F,0x80,0x00,0x07,0xC0,0x00,0x03,0xF0 + ,0x00,0x00,0xF8,0x00,0x00,0x7E,0x00,0x00,0x1F,0x00,0x00,0x0F,0xC0,0x00,0x03 + ,0xE0,0x00,0x01,0xF8,0x00,0x00,0x7C,0x00,0x00,0x3F,0x00,0x00,0x0F,0x80,0x00 + ,0x07,0xE0,0x00,0x01,0xF8,0x00,0x00,0xFC,0x00,0x00,0x3F,0x00,0x00,0x1F,0x80 + ,0x00,0x07,0xE0,0x00,0x03,0xF0,0x00,0x00,0xFC,0x00,0x00,0x7E,0x00,0x00,0x1F + ,0x80,0x00,0x0F,0xC0,0x00,0x03,0xF0,0x00,0x01,0xF8,0x00,0x00,0x7E,0x00,0x00 + ,0x1F,0x00,0x00,0x0F,0xC0,0x00,0x03,0xC0,0x00,0x00,0xC0 // '\' + ,0x1F,0x87,0xFE,0x7F,0xE7,0xFE,0x7F,0xE3,0xFE,0x03,0xE0,0x3E,0x03,0xE0,0x3E + ,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E + ,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E + ,0x03,0xE3,0xFE,0x7F,0xE7,0xFE,0x7F,0xE7,0xFE,0x1F,0x80 // ']' + ,0x00,0x00,0x07,0x00,0x1F,0x00,0x7F,0x01,0xFF,0x07,0xFF,0x1F,0xFF,0x3F,0xFE + ,0x7C,0x7C,0xF0,0x79,0xC0,0x70,0x00,0x00 // '^' + ,0x00,0x00,0x01,0xFF,0xFF,0x1F,0xFF,0xFC,0xFF,0xFF,0xE7,0xFF,0xFF,0x3F,0xFF + ,0xF8,0x7F,0xFF,0x00 // '_' + ,0x00,0x0F,0x03,0xE0,0xF8,0x3F,0x07,0xC1,0xF0,0x7C,0x04,0x00 // '`' + ,0x03,0xF8,0x00,0x7F,0xF0,0x0F,0xFF,0x80,0xFF,0xFC,0x0F,0xFF,0xC0,0x7F,0xFE + ,0x00,0x07,0xE0,0x00,0x3E,0x00,0x03,0xE0,0x00,0x3E,0x03,0xFF,0xE1,0xFF,0xFE + ,0x3F,0xFF,0xE7,0xFF,0xFE,0x7F,0xFF,0xE7,0xFF,0xFE,0x7C,0x07,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x7E,0x7F,0xFF,0xE7,0xFF,0xFE + ,0x7F,0xFF,0xC3,0xFF,0xF8,0x1F,0xFF,0x00,0x3F,0x80 // 'a' + ,0x10,0x00,0x07,0x80,0x00,0x7C,0x00,0x07,0xC0,0x00,0x7C,0x00,0x07,0xC0,0x00 + ,0x7C,0x00,0x07,0xC0,0x00,0x7C,0x00,0x07,0xFF,0x80,0x7F,0xFF,0x07,0xFF,0xF8 + ,0x7F,0xFF,0xC7,0xFF,0xFC,0x7F,0xFF,0xE7,0xC0,0x7E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x07,0xE7,0xFF,0xFE,0x7F,0xFF,0xE7,0xFF,0xFC,0x3F,0xFF,0x81,0xFF,0xF0 + ,0x03,0xF8,0x00 // 'b' + ,0x03,0xF8,0x01,0xFF,0xF0,0x3F,0xFF,0x87,0xFF,0xFC,0x7F,0xFF,0xC7,0xFF,0xFE + ,0x7C,0x07,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x01,0xC7,0xC0,0x00 + ,0x7C,0x00,0x07,0xC0,0x00,0x7C,0x00,0x07,0xC0,0x00,0x7C,0x00,0x07,0xC0,0x1C + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x7E,0x7F,0xFF,0xE7,0xFF,0xFE + ,0x7F,0xFF,0xC3,0xFF,0xF8,0x1F,0xFF,0x00,0x3F,0x80 // 'c' + ,0x00,0x00,0x80,0x00,0x3C,0x00,0x03,0xE0,0x00,0x3E,0x00,0x03,0xE0,0x00,0x3E + ,0x00,0x03,0xE0,0x00,0x3E,0x00,0x03,0xE0,0x3F,0xFE,0x1F,0xFF,0xE3,0xFF,0xFE + ,0x7F,0xFF,0xE7,0xFF,0xFE,0x7F,0xFF,0xE7,0xC0,0x7E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x07,0xE7,0xFF,0xFE,0x7F,0xFF,0xC7,0xFF,0xFC,0x3F,0xFF,0x81,0xFF,0xF0 + ,0x03,0xF8,0x00 // 'd' + ,0x03,0xF8,0x01,0xFF,0xF0,0x3F,0xFF,0x87,0xFF,0xFC,0x7F,0xFF,0xC7,0xFF,0xFE + ,0x7C,0x07,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x7E + ,0x7F,0xFF,0xE7,0xFF,0xFC,0x7F,0xFF,0xC7,0xFF,0xF8,0x7F,0xFF,0x07,0xFF,0x80 + ,0x7C,0x00,0x07,0xC0,0x00,0x7C,0x00,0x07,0xC0,0x00,0x7F,0xFC,0x07,0xFF,0xE0 + ,0x7F,0xFE,0x03,0xFF,0xE0,0x1F,0xFE,0x00,0x3F,0x80 // 'e' + ,0x03,0xF0,0x1F,0xFC,0x3F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC,0x7C,0x00,0x7C + ,0x00,0x7C,0x00,0x7F,0xF0,0x7F,0xFC,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC + ,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C + ,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00 + ,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x10,0x00 // 'f' + ,0x03,0xF8,0x01,0xFF,0xF0,0x3F,0xFF,0x87,0xFF,0xFC,0x7F,0xFF,0xC7,0xFF,0xFE + ,0x7C,0x07,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x7E,0x7F,0xFF,0xE7,0xFF,0xFE + ,0x7F,0xFF,0xE3,0xFF,0xFE,0x1F,0xFF,0xE0,0x3F,0xFE,0x00,0x03,0xE0,0x00,0x3E + ,0x00,0x07,0xE0,0x7F,0xFE,0x0F,0xFF,0xC0,0xFF,0xFC,0x0F,0xFF,0x80,0x7F,0xF0 + ,0x03,0xF8,0x00 // 'g' + ,0x10,0x00,0x07,0x80,0x00,0x7C,0x00,0x07,0xC0,0x00,0x7C,0x00,0x07,0xC0,0x00 + ,0x7C,0x00,0x07,0xC0,0x00,0x7C,0x00,0x07,0xFF,0x80,0x7F,0xFF,0x07,0xFF,0xF8 + ,0x7F,0xFF,0xC7,0xFF,0xFC,0x7F,0xFF,0xE7,0xC0,0x7E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0x80,0x3C + ,0x10,0x00,0x80 // 'h' + ,0x00,0x0C,0x0F,0x0F,0xC7,0xF3,0xF9,0xF8,0x78,0x00,0x00,0x00,0x03,0x83,0xE3 + ,0xF1,0xF8,0xFC,0x7E,0x3F,0x1F,0x8F,0xC7,0xE3,0xF1,0xF8,0xFC,0x7E,0x3F,0x1F + ,0x8F,0xC7,0xE3,0xF1,0xF8,0xFC,0x7E,0x3F,0x1F,0x87,0xC3,0xC0,0x40 // 'i' + ,0x00,0x00,0x7C,0x07,0xE0,0xFE,0x0F,0xE0,0x7E,0x07,0xC0,0x10,0x00,0x00,0x00 + ,0x03,0x80,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C + ,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C + ,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C,0x07,0xC0,0x7C + ,0x3F,0xC7,0xFC,0x7F,0x87,0xF8,0x7F,0x01,0x80 // 'j' + ,0x10,0x00,0x07,0xC0,0x00,0x7C,0x00,0x07,0xC0,0x00,0x7C,0x00,0x07,0xC0,0x00 + ,0x7C,0x00,0x07,0xC0,0x00,0x7C,0x00,0x07,0xC0,0x00,0x7C,0x03,0x87,0xC0,0x7C + ,0x7C,0x0F,0xC7,0xC1,0xF8,0x7C,0x3F,0x87,0xC7,0xF0,0x7C,0xFE,0x07,0xFF,0xC0 + ,0x7F,0xF8,0x07,0xFF,0x00,0x7F,0xE0,0x07,0xFC,0x00,0x7F,0xC0,0x07,0xFC,0x00 + ,0x7F,0xC0,0x07,0xFE,0x00,0x7F,0xF0,0x07,0xFF,0x80,0x7F,0xFC,0x07,0xCF,0xE0 + ,0x7C,0x7F,0x07,0xC3,0xF8,0x7C,0x1F,0xC7,0xC0,0xFC,0x7C,0x0F,0xE7,0xC0,0x7C + ,0x10,0x01,0x80 // 'k' + ,0x10,0x1E,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xC1,0xF0 + ,0x7C,0x1F,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xC1,0xF0 + ,0x7C,0x1F,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xC1,0xFC,0x7F,0x9F,0xE3,0xF8,0x7E + ,0x02,0x00 // 'l' + ,0x03,0xC0,0xF0,0x07,0xFF,0xFF,0x83,0xFF,0xFF,0xF1,0xFF,0xFF,0xFE,0x7F,0xFF + ,0xFF,0x9F,0xFF,0xFF,0xE7,0xC3,0xF0,0xF9,0xF0,0xFC,0x3E,0x7C,0x3F,0x0F,0x9F + ,0x0F,0xC3,0xE7,0xC3,0xF0,0xF9,0xF0,0xFC,0x3E,0x7C,0x3F,0x0F,0x9F,0x0F,0xC3 + ,0xE7,0xC3,0xF0,0xF9,0xF0,0xFC,0x3E,0x7C,0x3F,0x0F,0x9F,0x0F,0xC3,0xE7,0xC3 + ,0xF0,0xF9,0xF0,0xFC,0x3E,0x7C,0x3F,0x0F,0x9F,0x0F,0xC3,0xE7,0xC3,0xF0,0xF9 + ,0xF0,0xFC,0x3E,0x7C,0x3F,0x0F,0x9F,0x0F,0xC3,0xE7,0xC1,0xE0,0x78,0x40,0x00 + ,0x08 // 'm' + ,0x03,0xF8,0x01,0xFF,0xF0,0x3F,0xFF,0x87,0xFF,0xFC,0x7F,0xFF,0xC7,0xFF,0xFE + ,0x7C,0x07,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x78,0x03,0xC1,0x00,0x08 // 'n' + ,0x03,0xF8,0x01,0xFF,0xF0,0x3F,0xFF,0x87,0xFF,0xFC,0x7F,0xFF,0xC7,0xFF,0xFE + ,0x7C,0x07,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x7E,0x7F,0xFF,0xE7,0xFF,0xFE + ,0x7F,0xFF,0xC3,0xFF,0xF8,0x1F,0xFF,0x00,0x3F,0x80 // 'o' + ,0x03,0xF8,0x01,0xFF,0xF0,0x3F,0xFF,0x87,0xFF,0xFC,0x7F,0xFF,0xC7,0xFF,0xFE + ,0x7C,0x07,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x7E,0x7F,0xFF,0xE7,0xFF,0xFE + ,0x7F,0xFF,0xC7,0xFF,0xF8,0x7F,0xFF,0x07,0xFF,0x80,0x7C,0x00,0x07,0xC0,0x00 + ,0x7C,0x00,0x07,0xC0,0x00,0x7C,0x00,0x07,0xC0,0x00,0x7C,0x00,0x07,0x80,0x00 + ,0x10,0x00,0x00 // 'p' + ,0x03,0xF8,0x01,0xFF,0xF0,0x3F,0xFF,0x87,0xFF,0xFC,0x7F,0xFF,0xC7,0xFF,0xFE + ,0x7C,0x07,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x7E,0x7F,0xFF,0xE7,0xFF,0xFE + ,0x7F,0xFF,0xE3,0xFF,0xFE,0x1F,0xFF,0xE0,0x3F,0xFE,0x00,0x03,0xE0,0x00,0x3E + ,0x00,0x03,0xE0,0x00,0x3E,0x00,0x03,0xE0,0x00,0x3E,0x00,0x03,0xE0,0x00,0x3C + ,0x00,0x00,0x80 // 'q' + ,0x03,0xF8,0x1F,0xFE,0x3F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC,0x7C,0x00,0x7C + ,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00 + ,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C + ,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x10,0x00 // 'r' + ,0x03,0xF8,0x01,0xFF,0xF0,0x3F,0xFF,0x87,0xFF,0xFC,0x7F,0xFF,0xC7,0xFF,0xFE + ,0x7C,0x07,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3C,0x7E,0x00,0x07,0xFC,0x00 + ,0x3F,0xFC,0x01,0xFF,0xF0,0x0F,0xFF,0x80,0x3F,0xFC,0x00,0x7F,0xC0,0x00,0xFE + ,0x78,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x7E,0x7F,0xFF,0xE7,0xFF,0xFE + ,0x7F,0xFF,0xC3,0xFF,0xF8,0x1F,0xFF,0x00,0x3F,0x80 // 's' + ,0x10,0x00,0x78,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C + ,0x00,0x7C,0x00,0x7F,0xF8,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC + ,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C + ,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00,0x7C,0x00 + ,0x7C,0x00,0x7F,0xFC,0x7F,0xFE,0x7F,0xFE,0x3F,0xFE,0x1F,0xFE,0x03,0xF8 // 't' + ,0x10,0x00,0x87,0x80,0x3C,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x3E + ,0x7C,0x03,0xE7,0xC0,0x3E,0x7C,0x03,0xE7,0xC0,0x7E,0x7F,0xFF,0xE7,0xFF,0xFE + ,0x7F,0xFF,0xC3,0xFF,0xF8,0x1F,0xFF,0x00,0x3F,0x80 // 'u' + ,0x08,0x00,0x41,0xF0,0x0F,0x8F,0x80,0x7C,0x7C,0x03,0xE3,0xF0,0x3F,0x0F,0x81 + ,0xF0,0x7C,0x0F,0x83,0xF0,0xFC,0x1F,0x87,0xE0,0x7C,0x3E,0x03,0xE1,0xF0,0x1F + ,0x9F,0x80,0x7C,0xF8,0x03,0xE7,0xC0,0x1F,0xFE,0x00,0xFF,0xF0,0x03,0xFF,0x00 + ,0x1F,0xF8,0x00,0xFF,0xC0,0x03,0xFC,0x00,0x1F,0xE0,0x00,0xFF,0x00,0x07,0xF8 + ,0x00,0x1F,0x80,0x00,0xFC,0x00,0x07,0xE0,0x00,0x1E,0x00,0x00,0x00,0x00 // 'v' + ,0x08,0x04,0x01,0x03,0xE0,0xF0,0x7C,0x3E,0x1F,0x87,0xC3,0xE1,0xF8,0x7C,0x3E + ,0x1F,0x87,0xC3,0xF1,0xF8,0xFC,0x3F,0x3F,0x8F,0x81,0xF3,0xFC,0xF8,0x1F,0x3F + ,0xCF,0x81,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0x80,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF + ,0x00,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0x00,0xFF,0xFF,0xF0,0x07,0xFF,0xFE,0x00 + ,0x7F,0xFF,0xE0,0x07,0xFF,0xFE,0x00,0x7F,0x9F,0xE0,0x07,0xF9,0xFC,0x00,0x3F + ,0x9F,0xC0,0x03,0xF1,0xFC,0x00,0x3F,0x0F,0xC0,0x03,0xF0,0xFC,0x00,0x3F,0x0F + ,0x80,0x01,0xE0,0x78,0x00,0x04,0x02,0x00 // 'w' + ,0x08,0x01,0x03,0xE0,0x7C,0x3E,0x07,0xC3,0xF0,0xFC,0x1F,0x0F,0xC1,0xF9,0xF8 + ,0x1F,0x9F,0x80,0xFF,0xF0,0x0F,0xFF,0x00,0x7F,0xE0,0x07,0xFE,0x00,0x3F,0xC0 + ,0x03,0xFC,0x00,0x1F,0x80,0x01,0xF8,0x00,0x3F,0xC0,0x03,0xFC,0x00,0x3F,0xE0 + ,0x07,0xFE,0x00,0x7F,0xF0,0x0F,0xFF,0x00,0xF9,0xF8,0x1F,0x9F,0x81,0xF0,0xF8 + ,0x3F,0x0F,0xC3,0xE0,0x7C,0x3E,0x07,0xC0,0x80,0x10 // 'x' + ,0x08,0x01,0x03,0xE0,0x3C,0x3E,0x07,0xC3,0xE0,0x7C,0x3F,0x07,0xC3,0xF0,0xFC + ,0x1F,0x0F,0x81,0xF0,0xF8,0x1F,0x8F,0x81,0xF9,0xF8,0x0F,0x9F,0x00,0xFD,0xF0 + ,0x0F,0xFF,0x00,0xFF,0xF0,0x07,0xFE,0x00,0x7F,0xE0,0x07,0xFE,0x00,0x7F,0xE0 + ,0x03,0xFC,0x00,0x3F,0xC0,0x03,0xFC,0x00,0x3F,0xC0,0x01,0xF8,0x00,0x1F,0x80 + ,0x01,0xF8,0x00,0x1F,0x80,0x01,0xF0,0x00,0x1F,0x00,0x01,0xF0,0x00,0x3F,0x00 + ,0x03,0xE0,0x01,0xFE,0x00,0x3F,0xE0,0x03,0xFC,0x00,0x3F,0x80,0x03,0xF0,0x00 + ,0x08,0x00,0x00 // 'y' + ,0x0F,0xFF,0x01,0xFF,0xFC,0x3F,0xFF,0xC3,0xFF,0xFC,0x3F,0xFF,0xC1,0xFF,0xF8 + ,0x00,0x3F,0x80,0x03,0xF0,0x00,0x3F,0x00,0x07,0xE0,0x00,0x7E,0x00,0x0F,0xC0 + ,0x00,0xFC,0x00,0x1F,0x80,0x01,0xF8,0x00,0x3F,0x00,0x03,0xF0,0x00,0x3E,0x00 + ,0x07,0xE0,0x00,0x7C,0x00,0x0F,0xC0,0x00,0xFC,0x00,0x1F,0xFF,0x81,0xFF,0xFC + ,0x3F,0xFF,0xC3,0xFF,0xFC,0x3F,0xFF,0xC0,0xFF,0xF0 // 'z' +}; +const GFXglyph monomaniacone27ptGlyphs[] = { +// bitmapOffset, width, height, xAdvance, xOffset, yOffset + { 0, 1, 1, 13, 0, 0 }, // ' + { 1, 9, 37, 13, 2, -37 }, // '! + { 43, 14, 9, 19, 2, -37 }, // '" + { 59, 26, 37, 31, 2, -37 }, // '# + { 180, 25, 43, 30, 2, -40 }, // '$ + { 315, 34, 37, 39, 2, -37 }, // '% + { 473, 25, 37, 29, 2, -37 }, // '& + { 589, 7, 9, 12, 2, -37 }, // '' + { 597, 12, 37, 17, 2, -37 }, // '( + { 653, 12, 37, 17, 2, -37 }, // ') + { 709, 21, 21, 26, 2, -37 }, // '* + { 765, 18, 18, 22, 2, -23 }, // '+ + { 806, 9, 12, 13, 2, -8 }, // ', + { 820, 18, 7, 22, 2, -18 }, // '- + { 836, 9, 9, 13, 2, -9 }, // '. + { 847, 25, 37, 28, 1, -37 }, // '/ + { 963, 25, 37, 30, 2, -37 }, // '0 + { 1079, 13, 37, 30, 8, -37 }, // '1 + { 1140, 25, 37, 30, 2, -37 }, // '2 + { 1256, 25, 37, 30, 2, -37 }, // '3 + { 1372, 25, 37, 30, 2, -37 }, // '4 + { 1488, 25, 37, 30, 2, -37 }, // '5 + { 1604, 25, 37, 30, 2, -37 }, // '6 + { 1720, 25, 37, 30, 2, -37 }, // '7 + { 1836, 25, 37, 30, 2, -37 }, // '8 + { 1952, 25, 37, 30, 2, -37 }, // '9 + { 2068, 9, 20, 13, 2, -24 }, // ': + { 2091, 9, 12, 13, 2, -8 }, // ', + { 2105, 25, 37, 28, 1, -37 }, // '/ + { 2221, 34, 37, 39, 2, -37 }, // '% + { 2379, 16, 22, 20, 2, -36 }, // 'º + { 2423, 25, 37, 30, 2, -37 }, // '? + { 2539, 32, 37, 37, 2, -37 }, // '@ + { 2687, 29, 37, 33, 1, -37 }, // 'A + { 2822, 24, 37, 29, 2, -37 }, // 'B + { 2933, 24, 37, 29, 2, -37 }, // 'C + { 3044, 24, 37, 29, 2, -37 }, // 'D + { 3155, 24, 37, 28, 2, -37 }, // 'E + { 3266, 24, 37, 28, 2, -37 }, // 'F + { 3377, 25, 37, 30, 2, -37 }, // 'G + { 3493, 24, 37, 29, 2, -37 }, // 'H + { 3604, 7, 37, 12, 2, -37 }, // 'I + { 3637, 24, 37, 29, 2, -37 }, // 'J + { 3748, 24, 37, 28, 2, -37 }, // 'K + { 3859, 24, 37, 28, 2, -37 }, // 'L + { 3970, 29, 37, 33, 2, -37 }, // 'M + { 4105, 25, 37, 30, 2, -37 }, // 'N + { 4221, 25, 37, 30, 2, -37 }, // 'O + { 4337, 24, 37, 29, 2, -37 }, // 'P + { 4448, 25, 37, 30, 2, -37 }, // 'Q + { 4564, 25, 37, 30, 2, -37 }, // 'R + { 4680, 25, 37, 30, 2, -37 }, // 'S + { 4796, 24, 37, 29, 2, -37 }, // 'T + { 4907, 24, 37, 29, 2, -37 }, // 'U + { 5018, 29, 37, 33, 1, -37 }, // 'V + { 5153, 37, 37, 40, 1, -37 }, // 'W + { 5325, 25, 37, 28, 1, -37 }, // 'X + { 5441, 29, 37, 33, 1, -37 }, // 'Y + { 5576, 26, 37, 29, 1, -37 }, // 'Z + { 5697, 12, 37, 17, 2, -37 }, // '[ + { 5753, 25, 37, 28, 1, -37 }, // '\' + { 5869, 12, 37, 16, 2, -37 }, // '] + { 5925, 15, 12, 20, 2, -37 }, // '^ + { 5948, 21, 7, 26, 2, -7 }, // '_ + { 5967, 10, 9, 13, 1, -37 }, // '` + { 5979, 20, 28, 24, 2, -28 }, // 'a + { 6049, 20, 37, 24, 2, -37 }, // 'b + { 6142, 20, 28, 24, 2, -28 }, // 'c + { 6212, 20, 37, 24, 2, -37 }, // 'd + { 6305, 20, 28, 24, 2, -28 }, // 'e + { 6375, 16, 37, 20, 2, -37 }, // 'f + { 6449, 20, 37, 24, 2, -28 }, // 'g + { 6542, 20, 37, 24, 2, -37 }, // 'h + { 6635, 9, 38, 13, 2, -38 }, // 'i + { 6678, 12, 46, 17, 2, -37 }, // 'j + { 6747, 20, 37, 24, 2, -37 }, // 'k + { 6840, 10, 37, 15, 2, -37 }, // 'l + { 6887, 26, 28, 31, 2, -28 }, // 'm + { 6978, 20, 28, 24, 2, -28 }, // 'n + { 7048, 20, 28, 24, 2, -28 }, // 'o + { 7118, 20, 37, 24, 2, -28 }, // 'p + { 7211, 20, 37, 24, 2, -28 }, // 'q + { 7304, 16, 28, 21, 2, -28 }, // 'r + { 7360, 20, 28, 24, 2, -28 }, // 's + { 7430, 16, 37, 21, 2, -37 }, // 't + { 7504, 20, 28, 24, 2, -28 }, // 'u + { 7574, 21, 28, 25, 1, -28 }, // 'v + { 7648, 28, 28, 31, 1, -28 }, // 'w + { 7746, 20, 28, 23, 1, -28 }, // 'x + { 7816, 20, 37, 23, 1, -28 }, // 'y + { 7909, 20, 28, 23, 1, -28 } // 'z +}; +const GFXfont monomaniacone27pt = { + (uint8_t *)monomaniacone27ptBitmaps, + (GFXglyph *)monomaniacone27ptGlyphs, + 0x20, + 0x7A, + 78 +}; diff --git a/Core/Inc/monomaniacone39pt.h b/Core/Inc/monomaniacone39pt.h new file mode 100644 index 0000000..5871ea2 --- /dev/null +++ b/Core/Inc/monomaniacone39pt.h @@ -0,0 +1,251 @@ +// , -> % +// . -> A +// / -> W +// - -> - + +// Created by ttf2gfx utility +const uint8_t monomaniacone39ptBitmaps[] = { + // Bitmap Data: + 0x00,0x70,0x00,0x00,0x18,0x00,0x03,0xFF,0x80,0x00,0x3F,0x00,0x03,0xFF,0xE0 + ,0x00,0x3F,0xC0,0x03,0xFF,0xF8,0x00,0x1F,0xE0,0x03,0xFF,0xFE,0x00,0x1F,0xF0 + ,0x03,0xFF,0xFF,0x00,0x0F,0xF0,0x01,0xFF,0xFF,0xC0,0x0F,0xF8,0x00,0xFF,0xFF + ,0xE0,0x07,0xF8,0x00,0x7F,0xFF,0xF0,0x07,0xFC,0x00,0x3F,0xC7,0xF8,0x07,0xFC + ,0x00,0x1F,0xE3,0xFC,0x03,0xFE,0x00,0x0F,0xF1,0xFE,0x03,0xFE,0x00,0x07,0xF8 + ,0xFF,0x01,0xFF,0x00,0x03,0xFC,0x7F,0x81,0xFF,0x00,0x01,0xFE,0x3F,0xC0,0xFF + ,0x80,0x00,0xFF,0x1F,0xE0,0xFF,0x80,0x00,0x7F,0xFF,0xF0,0x7F,0xC0,0x00,0x3F + ,0xFF,0xF8,0x7F,0xC0,0x00,0x1F,0xFF,0xFC,0x3F,0xC0,0x00,0x0F,0xFF,0xFC,0x3F + ,0xE0,0x00,0x03,0xFF,0xFE,0x1F,0xE0,0x00,0x01,0xFF,0xFE,0x1F,0xF0,0x00,0x00 + ,0x7F,0xFE,0x0F,0xF0,0x00,0x00,0x0F,0xFE,0x0F,0xF8,0x00,0x00,0x01,0xFC,0x07 + ,0xF8,0x00,0x00,0x00,0x00,0x07,0xFC,0x00,0x00,0x00,0x00,0x07,0xFC,0x00,0x00 + ,0x00,0x00,0x03,0xFE,0x03,0xF0,0x00,0x00,0x03,0xFE,0x0F,0xFF,0x00,0x00,0x01 + ,0xFF,0x0F,0xFF,0xC0,0x00,0x01,0xFF,0x0F,0xFF,0xF0,0x00,0x00,0xFF,0x8F,0xFF + ,0xFC,0x00,0x00,0xFF,0x87,0xFF,0xFE,0x00,0x00,0x7F,0xC3,0xFF,0xFF,0x00,0x00 + ,0x7F,0xC3,0xFF,0xFF,0xC0,0x00,0x3F,0xC1,0xFF,0xFF,0xE0,0x00,0x3F,0xE0,0xFF + ,0x0F,0xF0,0x00,0x1F,0xE0,0x7F,0x87,0xF8,0x00,0x1F,0xF0,0x3F,0xC3,0xFC,0x00 + ,0x0F,0xF0,0x1F,0xE1,0xFE,0x00,0x0F,0xF8,0x0F,0xF0,0xFF,0x00,0x07,0xF8,0x07 + ,0xF8,0x7F,0x80,0x07,0xFC,0x03,0xFC,0x3F,0xC0,0x07,0xFC,0x01,0xFF,0xFF,0xE0 + ,0x03,0xFE,0x00,0xFF,0xFF,0xF0,0x03,0xFE,0x00,0x3F,0xFF,0xF0,0x01,0xFF,0x00 + ,0x1F,0xFF,0xF8,0x01,0xFF,0x00,0x0F,0xFF,0xF8,0x00,0xFF,0x80,0x03,0xFF,0xFC + ,0x00,0x7F,0x80,0x00,0xFF,0xFC,0x00,0x1F,0x80,0x00,0x1F,0xF8,0x00,0x03,0x00 + ,0x00,0x01,0xE0,0x00 // '%' + ,0x00,0x00,0x00,0x0F,0xFF,0xFC,0x1F,0xFF,0xFF,0x8F,0xFF,0xFF,0xE7,0xFF,0xFF + ,0xF3,0xFF,0xFF,0xF9,0xFF,0xFF,0xFC,0xFF,0xFF,0xFC,0x3F,0xFF,0xFE,0x07,0xFF + ,0xFC,0x00 // '-' + ,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x1F,0xE0,0x00 + ,0x00,0x00,0x1F,0xF0,0x00,0x00,0x00,0x0F,0xFC,0x00,0x00,0x00,0x07,0xFE,0x00 + ,0x00,0x00,0x07,0xFF,0x00,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x01,0xFF,0xE0 + ,0x00,0x00,0x01,0xFF,0xF0,0x00,0x00,0x00,0xFF,0xFC,0x00,0x00,0x00,0x7F,0xFE + ,0x00,0x00,0x00,0x7F,0xFF,0x00,0x00,0x00,0x3F,0xFF,0xC0,0x00,0x00,0x1F,0xFF + ,0xE0,0x00,0x00,0x1F,0xFF,0xF0,0x00,0x00,0x0F,0xFF,0xFC,0x00,0x00,0x07,0xFF + ,0xFE,0x00,0x00,0x07,0xFC,0xFF,0x00,0x00,0x03,0xFC,0x7F,0xC0,0x00,0x01,0xFE + ,0x1F,0xE0,0x00,0x01,0xFF,0x0F,0xF0,0x00,0x00,0xFF,0x07,0xFC,0x00,0x00,0x7F + ,0x81,0xFE,0x00,0x00,0x7F,0xC0,0xFF,0x00,0x00,0x3F,0xC0,0x7F,0xC0,0x00,0x1F + ,0xE0,0x3F,0xE0,0x00,0x1F,0xF0,0x0F,0xF0,0x00,0x0F,0xF0,0x07,0xF8,0x00,0x07 + ,0xF8,0x03,0xFE,0x00,0x07,0xFC,0x00,0xFF,0x00,0x03,0xFF,0xFF,0xFF,0x80,0x01 + ,0xFF,0xFF,0xFF,0xE0,0x01,0xFF,0xFF,0xFF,0xF0,0x00,0xFF,0xFF,0xFF,0xF8,0x00 + ,0x7F,0xFF,0xFF,0xFE,0x00,0x7F,0xFF,0xFF,0xFF,0x00,0x3F,0xFF,0xFF,0xFF,0x80 + ,0x1F,0xFF,0xFF,0xFF,0xE0,0x1F,0xFF,0xFF,0xFF,0xF0,0x0F,0xF8,0x00,0x07,0xF8 + ,0x07,0xF8,0x00,0x03,0xFE,0x07,0xFC,0x00,0x00,0xFF,0x03,0xFE,0x00,0x00,0x7F + ,0x81,0xFE,0x00,0x00,0x3F,0xE1,0xFF,0x00,0x00,0x0F,0xF0,0xFF,0x80,0x00,0x07 + ,0xF8,0x7F,0x80,0x00,0x03,0xFE,0x3F,0xC0,0x00,0x00,0xFF,0x1F,0xC0,0x00,0x00 + ,0x7F,0x8F,0xE0,0x00,0x00,0x1F,0x80,0x80,0x00,0x00,0x03,0x00 // 'A' + ,0x04,0x00,0x00,0x00,0x00,0x03,0x03,0xF8,0x00,0x00,0x00,0x00,0xFC,0x3F,0x80 + ,0x00,0x00,0x00,0x1F,0xE3,0xFC,0x00,0x00,0x00,0x01,0xFE,0x3F,0xC0,0x00,0x00 + ,0x00,0x1F,0xE3,0xFC,0x00,0x00,0x00,0x03,0xFE,0x3F,0xC0,0x00,0x00,0x00,0x3F + ,0xC3,0xFE,0x00,0x00,0x00,0x03,0xFC,0x1F,0xE0,0x00,0x00,0x00,0x3F,0xC1,0xFE + ,0x00,0x07,0x00,0x07,0xFC,0x1F,0xE0,0x00,0xF8,0x00,0x7F,0x81,0xFE,0x00,0x1F + ,0x80,0x07,0xF8,0x0F,0xF0,0x01,0xF8,0x00,0x7F,0x80,0xFF,0x00,0x1F,0xC0,0x07 + ,0xF8,0x0F,0xF0,0x03,0xFC,0x00,0xFF,0x00,0xFF,0x00,0x3F,0xC0,0x0F,0xF0,0x0F + ,0xF8,0x03,0xFE,0x00,0xFF,0x00,0x7F,0x80,0x3F,0xE0,0x0F,0xF0,0x07,0xF8,0x07 + ,0xFE,0x01,0xFF,0x00,0x7F,0x80,0x7F,0xF0,0x1F,0xE0,0x07,0xF8,0x07,0xFF,0x01 + ,0xFE,0x00,0x3F,0xC0,0xFF,0xF0,0x1F,0xE0,0x03,0xFC,0x0F,0xFF,0x01,0xFE,0x00 + ,0x3F,0xC0,0xFF,0xF8,0x3F,0xC0,0x03,0xFC,0x1F,0xFF,0x83,0xFC,0x00,0x3F,0xE1 + ,0xFF,0xF8,0x3F,0xC0,0x01,0xFE,0x1F,0xFF,0xC3,0xFC,0x00,0x1F,0xE3,0xFF,0xFC + ,0x7F,0xC0,0x01,0xFE,0x3F,0xFF,0xC7,0xF8,0x00,0x1F,0xE3,0xFF,0xFE,0x7F,0x80 + ,0x00,0xFF,0x3F,0xFF,0xE7,0xF8,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0xFF + ,0xFF,0x9F,0xFF,0xF0,0x00,0x0F,0xFF,0xF9,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x8F + ,0xFF,0xF0,0x00,0x07,0xFF,0xF0,0xFF,0xFF,0x00,0x00,0x7F,0xFF,0x0F,0xFF,0xF0 + ,0x00,0x07,0xFF,0xF0,0x7F,0xFE,0x00,0x00,0x7F,0xFF,0x07,0xFF,0xE0,0x00,0x03 + ,0xFF,0xE0,0x7F,0xFE,0x00,0x00,0x3F,0xFE,0x03,0xFF,0xE0,0x00,0x03,0xFF,0xE0 + ,0x3F,0xFC,0x00,0x00,0x3F,0xFC,0x03,0xFF,0xC0,0x00,0x03,0xFF,0xC0,0x3F,0xFC + ,0x00,0x00,0x1F,0xFC,0x01,0xFF,0xC0,0x00,0x01,0xFF,0x80,0x1F,0xFC,0x00,0x00 + ,0x1F,0xF8,0x01,0xFF,0x80,0x00,0x01,0xFF,0x80,0x0F,0xF8,0x00,0x00,0x0F,0xF0 + ,0x00,0xFF,0x80,0x00,0x00,0xFF,0x00,0x0F,0xF0,0x00,0x00,0x07,0xE0,0x00,0x7F + ,0x00,0x00,0x00,0x18,0x00,0x01,0xC0,0x00 // 'W' + ,0x00,0x3F,0xFF,0x80,0x00,0x7F,0xFF,0xFF,0x00,0x1F,0xFF,0xFF,0xF0,0x07,0xFF + ,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xF0,0x7F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF + ,0xF3,0xFF,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFF,0xCF,0xF0,0x00,0xFF,0xF9,0xFE + ,0x00,0x1F,0xFF,0x3F,0xC0,0x03,0xFF,0xE7,0xF8,0x00,0xFF,0xFC,0xFF,0x00,0x1F + ,0xFF,0x9F,0xE0,0x07,0xFF,0xF3,0xFC,0x00,0xFF,0xFE,0x7F,0x80,0x3F,0xFF,0xCF + ,0xF0,0x07,0xFF,0xF9,0xFE,0x01,0xFF,0xFF,0x3F,0xC0,0x7F,0xFF,0xE7,0xF8,0x0F + ,0xFF,0xFC,0xFF,0x03,0xFE,0x7F,0x9F,0xE0,0x7F,0xCF,0xF3,0xFC,0x1F,0xF1,0xFE + ,0x7F,0x83,0xFE,0x3F,0xCF,0xF0,0xFF,0x87,0xF9,0xFE,0x1F,0xF0,0xFF,0x3F,0xC7 + ,0xFC,0x1F,0xE7,0xF8,0xFF,0x83,0xFC,0xFF,0x3F,0xE0,0x7F,0x9F,0xE7,0xF8,0x0F + ,0xF3,0xFF,0xFF,0x01,0xFE,0x7F,0xFF,0xC0,0x3F,0xCF,0xFF,0xF8,0x07,0xF9,0xFF + ,0xFE,0x00,0xFF,0x3F,0xFF,0xC0,0x1F,0xE7,0xFF,0xF0,0x03,0xFC,0xFF,0xFE,0x00 + ,0x7F,0x9F,0xFF,0x80,0x0F,0xF3,0xFF,0xF0,0x01,0xFE,0x7F,0xFC,0x00,0x3F,0xCF + ,0xFF,0x80,0x07,0xF9,0xFF,0xF0,0x00,0xFF,0x3F,0xFF,0xFF,0xFF,0xE7,0xFF,0xFF + ,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xF8 + ,0x0F,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xE0,0x00,0x1F + ,0xFF,0xC0,0x00 // '0' + ,0x00,0x78,0x00,0xFF,0x00,0xFF,0xC0,0xFF,0xE0,0xFF,0xF0,0xFF,0xF8,0xFF,0xFC + ,0xFF,0xFE,0x7F,0xFF,0x3F,0xFF,0x9F,0xFF,0xCF,0xFF,0xE7,0xFF,0xF3,0xE7,0xF8 + ,0x63,0xFC,0x01,0xFE,0x00,0xFF,0x00,0x7F,0x80,0x3F,0xC0,0x1F,0xE0,0x0F,0xF0 + ,0x07,0xF8,0x03,0xFC,0x01,0xFE,0x00,0xFF,0x00,0x7F,0x80,0x3F,0xC0,0x1F,0xE0 + ,0x0F,0xF0,0x07,0xF8,0x03,0xFC,0x01,0xFE,0x00,0xFF,0x00,0x7F,0x80,0x3F,0xC0 + ,0x1F,0xE0,0x0F,0xF0,0x07,0xF8,0x03,0xFC,0x01,0xFE,0x00,0xFF,0x00,0x7F,0x80 + ,0x3F,0xC0,0x1F,0xE0,0x0F,0xF0,0x07,0xF8,0x03,0xFC,0x01,0xFE,0x00,0xFF,0x00 + ,0x3F,0x80,0x1F,0x80,0x01,0x00 // '1' + ,0x00,0x3F,0xFF,0x80,0x00,0x7F,0xFF,0xFF,0x00,0x1F,0xFF,0xFF,0xF0,0x07,0xFF + ,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xF0,0x7F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFF,0xCF,0xF0,0x00,0x07,0xF9,0xFE + ,0x00,0x00,0xFF,0x3F,0xC0,0x00,0x1F,0xE7,0xF8,0x00,0x03,0xFC,0xFE,0x00,0x00 + ,0x7F,0x8F,0x80,0x00,0x0F,0xF0,0x00,0x00,0x01,0xFE,0x00,0x00,0x00,0x3F,0xC0 + ,0x00,0x00,0x07,0xF8,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x7F,0xE0,0x00,0x00 + ,0x7F,0xFC,0x00,0x00,0x7F,0xFF,0x00,0x00,0x3F,0xFF,0xE0,0x00,0x3F,0xFF,0xF8 + ,0x00,0x3F,0xFF,0xFE,0x00,0x1F,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0x80,0x07,0xFF + ,0xFF,0xC0,0x01,0xFF,0xFF,0xC0,0x00,0x7F,0xFF,0xC0,0x00,0x0F,0xFF,0xE0,0x00 + ,0x03,0xFF,0xE0,0x00,0x00,0x7F,0xF0,0x00,0x00,0x0F,0xF0,0x00,0x00,0x01,0xFE + ,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x07,0xF8,0x00,0x00,0x00,0xFF,0x00,0x00 + ,0x00,0x1F,0xE0,0x00,0x00,0x03,0xFC,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x0F + ,0xF0,0x00,0x00,0x01,0xFE,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0x87,0xFF,0xFF + ,0xFF,0xF8,0xFF,0xFF,0xFF,0xFF,0x8F,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xFE + ,0x0F,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xFE,0x00,0x1F + ,0xFF,0xFF,0x00 // '2' + ,0x00,0x3F,0xFF,0x80,0x00,0x7F,0xFF,0xFF,0x00,0x1F,0xFF,0xFF,0xF0,0x0F,0xFF + ,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xF0,0x7F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFF,0xCF,0xF0,0x00,0x07,0xF9,0xFE + ,0x00,0x00,0xFF,0x3F,0xC0,0x00,0x1F,0xE7,0xF8,0x00,0x03,0xFC,0xFE,0x00,0x00 + ,0x7F,0x8F,0x80,0x00,0x0F,0xF0,0x00,0x00,0x01,0xFE,0x00,0x00,0x00,0x3F,0xC0 + ,0x00,0x00,0x07,0xF8,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x1F,0xE0,0x00,0x00 + ,0x03,0xFC,0x00,0x3F,0xFF,0xFF,0x80,0x3F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xFE + ,0x01,0xFF,0xFF,0xFF,0x80,0x3F,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xFE,0x00,0xFF + ,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x0F + ,0xF0,0x00,0x00,0x01,0xFE,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x07,0xF8,0x00 + ,0x00,0x00,0xFF,0x00,0x00,0x00,0x1F,0xE1,0xE0,0x00,0x03,0xFC,0xFE,0x00,0x00 + ,0x7F,0x9F,0xC0,0x00,0x0F,0xF3,0xFC,0x00,0x01,0xFE,0x7F,0x80,0x00,0x3F,0xCF + ,0xF0,0x00,0x07,0xF9,0xFE,0x00,0x00,0xFF,0x3F,0xFF,0xFF,0xFF,0xE7,0xFF,0xFF + ,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xF8 + ,0x0F,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xE0,0x00,0x1F + ,0xFF,0xC0,0x00 // '3' + ,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00 + ,0x07,0xF8,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x1F,0xE0,0x00,0x00,0x03,0xFC + ,0x00,0x00,0x00,0x7F,0x80,0x00,0x18,0x0F,0xF0,0x00,0x0F,0xC1,0xFE,0x00,0x03 + ,0xFC,0x3F,0xC0,0x00,0x7F,0x87,0xF8,0x00,0x1F,0xF0,0xFF,0x00,0x03,0xFE,0x1F + ,0xE0,0x00,0xFF,0x83,0xFC,0x00,0x1F,0xE0,0x7F,0x80,0x07,0xFC,0x0F,0xF0,0x00 + ,0xFF,0x01,0xFE,0x00,0x3F,0xE0,0x3F,0xC0,0x07,0xF8,0x07,0xF8,0x01,0xFF,0x00 + ,0xFF,0x00,0x3F,0xC0,0x1F,0xE0,0x0F,0xF8,0x03,0xFC,0x01,0xFE,0x00,0x7F,0x80 + ,0x7F,0xC0,0x0F,0xF0,0x0F,0xF0,0x01,0xFE,0x01,0xFE,0x00,0x3F,0xC0,0x3F,0xC0 + ,0x07,0xF8,0x07,0xF8,0x00,0xFF,0x00,0xFF,0x00,0x1F,0xE0,0x1F,0xE0,0x03,0xFC + ,0x03,0xFC,0x00,0x7F,0x80,0x7F,0x80,0x0F,0xF0,0x0F,0xFF,0xFF,0xFF,0xE1,0xFF + ,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0xE7,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF + ,0xFF,0x9F,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0xFF,0xFE,0x3F,0xFF,0xFF,0xFF,0x81 + ,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x00,0x07,0xF8,0x00,0x00,0x00 + ,0xFF,0x00,0x00,0x00,0x1F,0xE0,0x00,0x00,0x03,0xFC,0x00,0x00,0x00,0x7F,0x80 + ,0x00,0x00,0x0F,0xF0,0x00,0x00,0x01,0xFE,0x00,0x00,0x00,0x1F,0x80,0x00,0x00 + ,0x00,0xC0,0x00 // '4' + ,0x0F,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xFF,0xF1,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF + ,0xFF,0xFF,0xE7,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0x9F,0xFF,0xFF,0xFF + ,0xF3,0xFF,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFF,0x0F,0xF0,0x00,0x00,0x01,0xFE + ,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x07,0xF8,0x00,0x00,0x00,0xFF,0x00,0x00 + ,0x00,0x1F,0xE0,0x00,0x00,0x03,0xFC,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x0F + ,0xF0,0x00,0x00,0x01,0xFE,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xC0,0x07,0xFF,0xFF + ,0xFF,0x80,0xFF,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0xF8 + ,0x7F,0xFF,0xFF,0xFF,0x8F,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF + ,0xFF,0xFF,0xE0,0x00,0x00,0x03,0xFC,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x0F + ,0xF0,0x00,0x00,0x01,0xFE,0x00,0x00,0x00,0x3F,0xC7,0xC0,0x00,0x07,0xF9,0xFC + ,0x00,0x00,0xFF,0x3F,0xC0,0x00,0x1F,0xE7,0xF8,0x00,0x03,0xFC,0xFF,0x00,0x00 + ,0x7F,0x9F,0xE0,0x00,0x0F,0xF3,0xFC,0x00,0x01,0xFE,0x7F,0x80,0x00,0x3F,0xCF + ,0xF0,0x00,0x07,0xF9,0xFE,0x00,0x00,0xFF,0x3F,0xFF,0xFF,0xFF,0xE7,0xFF,0xFF + ,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xF8 + ,0x0F,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xE0,0x00,0x1F + ,0xFF,0xC0,0x00 // '5' + ,0x00,0x3F,0xFF,0x80,0x00,0x7F,0xFF,0xFF,0x00,0x1F,0xFF,0xFF,0xF0,0x07,0xFF + ,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xF0,0x7F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF + ,0xF3,0xFF,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFF,0xCF,0xF0,0x00,0x07,0xF9,0xFE + ,0x00,0x00,0xFF,0x3F,0xC0,0x00,0x1F,0xE7,0xF8,0x00,0x03,0xFC,0xFF,0x00,0x00 + ,0x3F,0x9F,0xE0,0x00,0x03,0xE3,0xFC,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x0F + ,0xF0,0x00,0x00,0x01,0xFE,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xC0,0x07,0xFF,0xFF + ,0xFF,0x80,0xFF,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0xF8 + ,0x7F,0xFF,0xFF,0xFF,0x8F,0xFF,0xFF,0xFF,0xF9,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF + ,0xFF,0xFF,0xE7,0xF8,0x00,0x03,0xFC,0xFF,0x00,0x00,0x7F,0x9F,0xE0,0x00,0x0F + ,0xF3,0xFC,0x00,0x01,0xFE,0x7F,0x80,0x00,0x3F,0xCF,0xF0,0x00,0x07,0xF9,0xFE + ,0x00,0x00,0xFF,0x3F,0xC0,0x00,0x1F,0xE7,0xF8,0x00,0x03,0xFC,0xFF,0x00,0x00 + ,0x7F,0x9F,0xE0,0x00,0x0F,0xF3,0xFC,0x00,0x01,0xFE,0x7F,0x80,0x00,0x3F,0xCF + ,0xF0,0x00,0x07,0xF9,0xFE,0x00,0x00,0xFF,0x3F,0xFF,0xFF,0xFF,0xE7,0xFF,0xFF + ,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xF8 + ,0x0F,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xE0,0x00,0x1F + ,0xFF,0xC0,0x00 // '6' + ,0x0F,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xFF,0xF1,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF + ,0xFF,0xFF,0xE7,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0x9F,0xFF,0xFF,0xFF + ,0xF3,0xFF,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFF,0xCF,0xF0,0x00,0x07,0xF9,0xFE + ,0x00,0x00,0xFF,0x3F,0xC0,0x00,0x1F,0xE7,0xF8,0x00,0x03,0xFC,0xFE,0x00,0x00 + ,0x7F,0x8F,0x80,0x00,0x0F,0xF0,0x00,0x00,0x01,0xFE,0x00,0x00,0x00,0x3F,0xC0 + ,0x00,0x00,0x0F,0xF8,0x00,0x00,0x01,0xFE,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00 + ,0x0F,0xF8,0x00,0x00,0x01,0xFE,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x0F,0xF0 + ,0x00,0x00,0x01,0xFE,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x0F,0xF0,0x00,0x00 + ,0x03,0xFE,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x0F,0xF0,0x00,0x00,0x03,0xFE + ,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x0F,0xF0,0x00,0x00,0x03,0xFE,0x00,0x00 + ,0x00,0x7F,0x80,0x00,0x00,0x1F,0xF0,0x00,0x00,0x03,0xFC,0x00,0x00,0x00,0x7F + ,0x80,0x00,0x00,0x1F,0xF0,0x00,0x00,0x03,0xFC,0x00,0x00,0x00,0xFF,0x80,0x00 + ,0x00,0x1F,0xE0,0x00,0x00,0x03,0xFC,0x00,0x00,0x00,0xFF,0x80,0x00,0x00,0x1F + ,0xE0,0x00,0x00,0x07,0xFC,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x1F,0xE0,0x00 + ,0x00,0x07,0xFC,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x0F,0xE0,0x00,0x00,0x00 + ,0x20,0x00,0x00 // '7' + ,0x00,0x3F,0xFF,0x80,0x00,0x7F,0xFF,0xFF,0x00,0x1F,0xFF,0xFF,0xF0,0x07,0xFF + ,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xF0,0x7F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFF,0xCF,0xF0,0x00,0x07,0xF9,0xFE + ,0x00,0x00,0xFF,0x3F,0xC0,0x00,0x1F,0xE7,0xF8,0x00,0x03,0xFC,0xFF,0x00,0x00 + ,0x7F,0x9F,0xE0,0x00,0x0F,0xF3,0xFC,0x00,0x01,0xFE,0x7F,0x80,0x00,0x3F,0xCF + ,0xF0,0x00,0x07,0xF9,0xFE,0x00,0x00,0xFF,0x3F,0xC0,0x00,0x1F,0xE7,0xFF,0xFF + ,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0x9F,0xFF,0xFF,0xFF,0xF1,0xFF,0xFF,0xFF,0xFC + ,0x3F,0xFF,0xFF,0xFF,0x87,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xFE,0x3F,0xFF + ,0xFF,0xFF,0xE7,0xFF,0xFF,0xFF,0xFC,0xFF,0x00,0x00,0x7F,0x9F,0xE0,0x00,0x0F + ,0xF3,0xFC,0x00,0x01,0xFE,0x7F,0x80,0x00,0x3F,0xCF,0xF0,0x00,0x07,0xF9,0xFE + ,0x00,0x00,0xFF,0x3F,0xC0,0x00,0x1F,0xE7,0xF8,0x00,0x03,0xFC,0xFF,0x00,0x00 + ,0x7F,0x9F,0xE0,0x00,0x0F,0xF3,0xFC,0x00,0x01,0xFE,0x7F,0x80,0x00,0x3F,0xCF + ,0xF0,0x00,0x07,0xF9,0xFE,0x00,0x00,0xFF,0x3F,0xFF,0xFF,0xFF,0xE7,0xFF,0xFF + ,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xF8 + ,0x0F,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xE0,0x00,0x1F + ,0xFF,0xC0,0x00 // '8' + ,0x00,0x3F,0xFF,0x80,0x00,0x7F,0xFF,0xFF,0x00,0x1F,0xFF,0xFF,0xF0,0x07,0xFF + ,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xF0,0x7F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF + ,0xE3,0xFF,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFF,0xCF,0xF0,0x00,0x07,0xF9,0xFE + ,0x00,0x00,0xFF,0x3F,0xC0,0x00,0x1F,0xE7,0xF8,0x00,0x03,0xFC,0xFF,0x00,0x00 + ,0x7F,0x9F,0xE0,0x00,0x0F,0xF3,0xFC,0x00,0x01,0xFE,0x7F,0x80,0x00,0x3F,0xCF + ,0xF0,0x00,0x07,0xF9,0xFE,0x00,0x00,0xFF,0x3F,0xC0,0x00,0x1F,0xE7,0xF8,0x00 + ,0x03,0xFC,0xFF,0x00,0x00,0x7F,0x9F,0xE0,0x00,0x0F,0xF3,0xFC,0x00,0x01,0xFE + ,0x7F,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xF8,0xFF,0xFF,0xFF,0xFF,0x1F,0xFF + ,0xFF,0xFF,0xE1,0xFF,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFF,0x81,0xFF,0xFF,0xFF + ,0xF0,0x1F,0xFF,0xFF,0xFE,0x00,0x3F,0xFF,0xFF,0xC0,0x00,0x00,0x07,0xF8,0x00 + ,0x00,0x00,0xFF,0x00,0x00,0x00,0x1F,0xE0,0x00,0x00,0x03,0xFC,0x7C,0x00,0x00 + ,0x7F,0x9F,0xC0,0x00,0x0F,0xF3,0xFC,0x00,0x01,0xFE,0x7F,0x80,0x00,0x3F,0xCF + ,0xF0,0x00,0x07,0xF9,0xFE,0x00,0x00,0xFF,0x3F,0xFF,0xFF,0xFF,0xE7,0xFF,0xFF + ,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xF8 + ,0x1F,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xE0,0x00,0x1F + ,0xFF,0xC0,0x00 // '9' +}; +const GFXglyph monomaniacone39ptGlyphs[] = { +// bitmapOffset, width, height, xAdvance, xOffset, yOffset + { 0, 49, 52, 55, 3, -52 }, // '% + { 319, 25, 10, 31, 3, -25 }, // '- + { 351, 41, 52, 47, 2, -52 }, // 'A + { 618, 52, 52, 57, 2, -52 }, // 'W + { 956, 35, 52, 42, 3, -52 }, // '0 + { 1184, 17, 52, 42, 12, -52 }, // '1 + { 1295, 35, 52, 42, 3, -52 }, // '2 + { 1523, 35, 52, 42, 3, -52 }, // '3 + { 1751, 35, 52, 42, 3, -52 }, // '4 + { 1979, 35, 52, 42, 3, -52 }, // '5 + { 2207, 35, 52, 42, 3, -52 }, // '6 + { 2435, 35, 52, 42, 3, -52 }, // '7 + { 2663, 35, 52, 42, 3, -52 }, // '8 + { 2891, 35, 52, 42, 3, -52 } // '9 +}; +const GFXfont monomaniacone39pt = { + (uint8_t *)monomaniacone39ptBitmaps, + (GFXglyph *)monomaniacone39ptGlyphs, + 0x2C, + 0x39, + 111 +}; diff --git a/Core/Src/dashboard.c b/Core/Src/dashboard.c index c986ea2..d42ebd1 100644 --- a/Core/Src/dashboard.c +++ b/Core/Src/dashboard.c @@ -1,14 +1,15 @@ #include "dashboard.h" #include "font.h" #include "icons.h" -//#include "monomaniacone12pt.h" -#include "monomaniacone14pt.h" -#include "monomaniacone20pt.h" -#include "monomaniacone72pt.h" #include "usart.h" #include "crc.h" #include "float16.h" #include "math.h" +//#include "monomaniacone14pt.h" +#include "monomaniacone27pt.h" // 2x antialiased version of 14pt +//#include "monomaniacone20pt.h" +#include "monomaniacone39pt.h" // 2x antialiased version of 20pt +#include "monomaniacone72pt.h" #include const char *fault_code_strings[] = { "none", "over voltage", "under voltage", @@ -29,8 +30,8 @@ void run_dashboard_loop_test() { uint32_t i = 0; while (1) { - draw_battery(654, i * 100 / 4, 1321, 343); - draw_speed(i * 1000 / 4, i % 30); + draw_battery(654, i * 10 / 4, 13210000, 343000); + draw_speed((((i/2) % 34)) * 1000, 0); int16_t duty = 1000 - (int16_t) i * 1000 / 200; draw_power_bars(duty); draw_power(100 * i / 20 * (duty < 0 ? -1 : 1), duty, 60 * 10); @@ -52,7 +53,7 @@ void run_dashboard_loop_test() { uint8_t initialized = 0; void run_dashboard_loop() { - + //run_dashboard_loop_test(); LCD_Init(); LCD_Fill_Screen(COLOR_OFF, 1); LCD_Fill_Screen(COLOR_BG, 0); @@ -130,9 +131,9 @@ void update_values(uint8_t refresh_slow, uint8_t refresh_mid) { refresh_mid = 1; } - //speed = (int32_t) (((float) speed) / 1.609344); - //float wheel_diameter = 0.246; // in meter - //speed = ((float) rpm) * 3.14159265359 * wheel_diameter * 60 / 1000; +//speed = (int32_t) (((float) speed) / 1.609344); +//float wheel_diameter = 0.246; // in meter +//speed = ((float) rpm) * 3.14159265359 * wheel_diameter * 60 / 1000; draw_power_bars(duty_cycle); if (refresh_mid) { @@ -141,7 +142,7 @@ void update_values(uint8_t refresh_slow, uint8_t refresh_mid) { } if (refresh_slow) { draw_battery(input_voltage_filtered, battery_level, distance_abs, - distance_life); + distance_life); draw_temps(temp_fet, temp_motor); } } @@ -333,35 +334,35 @@ void draw_battery( if (percent > 20 * 10) { // Drawing the voltage to the left left_x = 10 - + GFX_DrawText(left_x, text_y_14, voltage_text, &monomaniacone14pt, - COLOR_BG, COLOR_SUCCESS, 0, -2); + + GFX_DrawTextScaled(left_x, text_y_14, voltage_text, + &monomaniacone27pt, + COLOR_BG, COLOR_SUCCESS, 0, -2, 2); } else { // Drawing the voltage to the right right_x = -10 - + GFX_DrawText(right_x, text_y_14, voltage_text, &monomaniacone14pt, - COLOR_FG, COLOR_BG, 2, -2); + + GFX_DrawTextScaled(right_x, text_y_14, voltage_text, + &monomaniacone27pt, + COLOR_FG, COLOR_BG, 2, -2, 2); } if (percent > 50 * 10) { // Drawing the distances on the left - GFX_DrawText(left_x, text_y_14, distances_text, &monomaniacone14pt, - COLOR_BG, COLOR_SUCCESS, 0, -3); + GFX_DrawTextScaled(left_x, text_y_14, distances_text, &monomaniacone27pt, + COLOR_BG, COLOR_SUCCESS, 0, -2, 2); } else { // Drawing the distances on the right - GFX_DrawText(right_x, text_y_14, distances_text, &monomaniacone14pt, - COLOR_FG, COLOR_BG, 2, -3); + GFX_DrawTextScaled(right_x, text_y_14, distances_text, &monomaniacone27pt, + COLOR_FG, COLOR_BG, 2, -2, 2); } if (percent > 80 * 10) { // Drawing the distances on the left - GFX_DrawText(filled_bar_end_x - 4, text_y_14, percent_text, - &monomaniacone14pt, - COLOR_BG, COLOR_SUCCESS, 2, 0); + GFX_DrawTextScaled(filled_bar_end_x - 4, text_y_14, percent_text, + &monomaniacone27pt, COLOR_BG, COLOR_SUCCESS, 2, 0, 2); } else { // Drawing the distances on the right - GFX_DrawText(filled_bar_end_x + 4, text_y_14, percent_text, - &monomaniacone14pt, - COLOR_FG, COLOR_BG, 0, 0); + GFX_DrawTextScaled(filled_bar_end_x + 4, text_y_14, percent_text, + &monomaniacone27pt, COLOR_FG, COLOR_BG, 0, 0, 2); } } @@ -416,6 +417,8 @@ uint32_t last_avg_speed = 30; uint32_t avg_speed_tot = 0;// You need to ride super fast for a super long time for it to overflow ;) uint32_t avg_speed_count = 0; uint8_t last_fault_code = 0; +uint16_t last_speed_cursor_x = 0; +char speed_text[4]; void draw_speed(int32_t speedd, uint8_t fault_code) { uint32_t speed = speedd < 0 ? -speedd / 1000 : speedd / 1000; @@ -440,14 +443,26 @@ void draw_speed(int32_t speedd, uint8_t fault_code) { // Draw if (last_speed != speed) { + //uint16_t erase_width = 85;// width to erase from center + + if (last_speed >= 10 && speed >= 10 && last_speed / 10 == speed / 10) { + uint16_t old_glyphIndex = speed_text[0] - monomaniacone72pt.firstChar; + const GFXglyph *old_glyph = &monomaniacone72pt.glyphs[old_glyphIndex]; + GFX_ClearChar(last_speed_cursor_x - old_glyph->advance, 32 + 95, speed_text[1], &monomaniacone72pt, COLOR_BG); + sprintf(speed_text, "%lu", speed); + last_speed_cursor_x = GFX_DrawChar(last_speed_cursor_x - old_glyph->advance, 32 + 95, speed_text[1], + &monomaniacone72pt, COLOR_FG, COLOR_BG); + } else { + GFX_ClearText(LCD_WIDTH / 2, 32 + 95, speed_text, + &monomaniacone72pt, COLOR_BG, 1, -5); + sprintf(speed_text, "%lu", speed); +// LCD_Draw_Rectangle(LCD_WIDTH / 2 - erase_width, 22, 2 * erase_width, 110, +// COLOR_BG); + last_speed_cursor_x = 5 + GFX_DrawText(LCD_WIDTH / 2, 32 + 95, speed_text, + &monomaniacone72pt, + COLOR_FG, COLOR_BG, 1, -5); + } last_speed = speed; - uint16_t erase_width = 85;// width to erase from center - char speed_text[4]; - sprintf(speed_text, "%lu", speed); - LCD_Draw_Rectangle(LCD_WIDTH / 2 - erase_width, 22, 2 * erase_width, 110, - COLOR_BG); - GFX_DrawText(LCD_WIDTH / 2, 32 + 95, speed_text, &monomaniacone72pt, - COLOR_FG, COLOR_BG, 1, -5); } uint16_t erase_width = 90;// width to erase from center @@ -469,8 +484,8 @@ void draw_speed(int32_t speedd, uint8_t fault_code) { LCD_Draw_Rectangle(LCD_WIDTH / 2 - erase_width, 140, 2 * erase_width, 25, COLOR_BG); - GFX_DrawText(LCD_WIDTH / 2, 159, fault_text, &monomaniacone14pt, - COLOR_ERROR, COLOR_BG, 1, -3); + GFX_DrawTextScaled(LCD_WIDTH / 2, 159, fault_text, &monomaniacone27pt, + COLOR_ERROR, COLOR_BG, 1, -3, 2); } } if (update_stats) { @@ -478,8 +493,8 @@ void draw_speed(int32_t speedd, uint8_t fault_code) { sprintf(stats_text, "avg: %lu max: %lu", avg_speed, max_speed); LCD_Draw_Rectangle(LCD_WIDTH / 2 - erase_width, 140, 2 * erase_width, 25, COLOR_BG); - GFX_DrawText(LCD_WIDTH / 2, 159, stats_text, &monomaniacone14pt, - COLOR_SECONDARY, COLOR_BG, 1, -3); + GFX_DrawTextScaled(LCD_WIDTH / 2, 159, stats_text, &monomaniacone27pt, + COLOR_SECONDARY, COLOR_BG, 1, -1, 2); } } @@ -492,7 +507,7 @@ int32_t last_power = 1000; // Input voltage from COMM_GET_VALUES, scale 10 void draw_power(int32_t current_i, int16_t duty_i, int16_t voltage_i) { if (duty_i < 0 && current_i > 0) { - current_i = -current_i; + current_i = -current_i; } int16_t current = current_i / 100; uint16_t duty = duty_i < 0 ? -duty_i / 10 : duty_i / 10; @@ -513,10 +528,10 @@ void draw_power(int32_t current_i, int16_t duty_i, int16_t voltage_i) { } char text[8]; - sprintf(text, "%dA", current); + sprintf(text, "%d.", current); LCD_Draw_Rectangle(LEFT_CENTER_COL1 - 38, 30, 2 * 39, 35, COLOR_BG); - GFX_DrawText(LEFT_CENTER_COL1, 60, text, &monomaniacone20pt, - COLOR_PRIMARY, COLOR_BG, 1, -2); + GFX_DrawTextScaled(LEFT_CENTER_COL1, 60, text, &monomaniacone39pt, + COLOR_PRIMARY, COLOR_BG, 1, -2, 2); } if (duty != last_duty) { last_duty = duty; @@ -525,10 +540,10 @@ void draw_power(int32_t current_i, int16_t duty_i, int16_t voltage_i) { } char text[8]; - sprintf(text, "%u%%", duty); + sprintf(text, "%u,", duty); LCD_Draw_Rectangle(LEFT_CENTER_COL2 - 39, 30, 2 * 39, 35, COLOR_BG); - GFX_DrawText(LEFT_CENTER_COL2, 60, text, &monomaniacone20pt, - COLOR_PRIMARY, COLOR_BG, 1, -2); + GFX_DrawTextScaled(LEFT_CENTER_COL2, 60, text, &monomaniacone39pt, + COLOR_PRIMARY, COLOR_BG, 1, -2, 2); } if (power != last_power) { last_power = power; @@ -539,10 +554,10 @@ void draw_power(int32_t current_i, int16_t duty_i, int16_t voltage_i) { } char text[10]; - sprintf(text, "%ldW", power); + sprintf(text, "%ld/", power); LCD_Draw_Rectangle(RIGHT_CENTER - 70, 30, 2 * 70, 35, COLOR_BG); - GFX_DrawText(RIGHT_CENTER, 60, text, &monomaniacone20pt, - COLOR_PRIMARY, COLOR_BG, 1, -2); + GFX_DrawTextScaled(RIGHT_CENTER, 60, text, &monomaniacone39pt, + COLOR_PRIMARY, COLOR_BG, 1, -2, 2); } } @@ -584,8 +599,8 @@ void draw_adc( // Draw the text char text[8]; sprintf(text, "%.1fV", ((float) adc1) / 10); - GFX_DrawText(RIGHT_CENTER - 3 - 27, 76 + free_height - 2, text, - &monomaniacone14pt, color, COLOR_BG, 1, -2); + GFX_DrawTextScaled(RIGHT_CENTER - 3 - 27, 76 + free_height - 2, text, + &monomaniacone27pt, color, COLOR_BG, 1, -1, 2); last_adc1 = adc1; last_adc1_en = adc1_en; @@ -608,8 +623,8 @@ void draw_adc( // Draw the text char text[8]; sprintf(text, "%.1fV", ((float) adc2) / 10); - GFX_DrawText(RIGHT_CENTER + 3 + 27, 76 + free_height - 2, text, - &monomaniacone14pt, color, COLOR_BG, 1, -2); + GFX_DrawTextScaled(RIGHT_CENTER + 3 + 27, 76 + free_height - 2, text, + &monomaniacone27pt, color, COLOR_BG, 1, -1, 2); last_adc2 = adc2; last_adc2_en = adc2_en; @@ -637,8 +652,8 @@ void draw_temps(int16_t temp_fet_scaled, int16_t temp_motor_scaled) { char text[8]; sprintf(text, "%u>C", temp_mot); LCD_Draw_Rectangle(LEFT_CENTER_COL1 - 38, 138, 2 * 39, 25, COLOR_BG); - GFX_DrawText(LEFT_CENTER_COL1, 159, text, &monomaniacone14pt, - COLOR_SECONDARY, COLOR_BG, 1, -1); + GFX_DrawTextScaled(LEFT_CENTER_COL1, 159, text, &monomaniacone27pt, + COLOR_SECONDARY, COLOR_BG, 1, -1, 2); } if (temp_fet != last_temp_fet) { last_temp_fet = temp_fet; @@ -646,7 +661,8 @@ void draw_temps(int16_t temp_fet_scaled, int16_t temp_motor_scaled) { char text[8]; sprintf(text, "%u>C", temp_fet); LCD_Draw_Rectangle(LEFT_CENTER_COL2 - 39, 138, 2 * 39, 25, COLOR_BG); - GFX_DrawText(LEFT_CENTER_COL2, 159, text, &monomaniacone14pt, COLOR_PRIMARY, - COLOR_BG, 1, -1); + GFX_DrawTextScaled(LEFT_CENTER_COL2, 159, text, &monomaniacone27pt, + COLOR_PRIMARY, + COLOR_BG, 1, -1, 2); } } diff --git a/Core/Src/font.c b/Core/Src/font.c index 1f72928..4df540a 100644 --- a/Core/Src/font.c +++ b/Core/Src/font.c @@ -1,7 +1,7 @@ #include "font.h" #include "LCD_driver.h" -void GFX_DrawChar( +uint16_t GFX_DrawChar( uint16_t x, uint16_t y, char c, @@ -10,7 +10,7 @@ void GFX_DrawChar( uint16_t bg_color) { if (c < font->firstChar || c > font->lastChar) { - return; + return x; } uint16_t glyphIndex = c - font->firstChar; @@ -19,8 +19,8 @@ void GFX_DrawChar( int16_t startX = x + glyph->xOffset; int16_t startY = y + glyph->yOffset; - if (startX + glyph->width <= 0 || startX >= LCD_WIDTH) return; - if (startY + glyph->height <= 0 || startY >= LCD_HEIGHT) return; + if (startX + glyph->width <= 0 || startX >= LCD_WIDTH) return x; + if (startY + glyph->height <= 0 || startY >= LCD_HEIGHT) return x; LCD_Set_Address(startX, startY, startX + glyph->width - 1, startY + glyph->height - 1); @@ -32,7 +32,8 @@ void GFX_DrawChar( for (uint8_t col = 0; col < glyph->width; col++) { uint16_t byteIndex = glyph->bitmapOffset + (bitPos / 8); uint8_t bitIndex = bitPos % 8; - uint8_t pixelBit = (font->bitmaps[byteIndex] & (0x80 >> bitIndex)) ? 1 : 0; + uint8_t pixelBit = + (font->bitmaps[byteIndex] & (0x80 >> bitIndex)) ? 1 : 0; if (pixelBit == pendingPixelBit) { pendingPixelCount++; @@ -62,9 +63,153 @@ void GFX_DrawChar( LCD_Draw_Colour_Burst(pendingPixelBit ? fg_color : bg_color, pendingPixelCount); } + + return x + glyph->advance; } -uint16_t GFX_GetTextWidth(const char *text, const GFXfont *font, int8_t letter_spacing) { +uint16_t GFX_ClearChar( + uint16_t x, + uint16_t y, + char c, + const GFXfont *font, + uint16_t bg_color) { + + if (c < font->firstChar || c > font->lastChar) { + return x; + } + + uint16_t glyphIndex = c - font->firstChar; + const GFXglyph *glyph = &font->glyphs[glyphIndex]; + + int16_t startX = x + glyph->xOffset; + int16_t startY = y + glyph->yOffset; + + if (startX + glyph->width <= 0 || startX >= LCD_WIDTH) return x; + if (startY + glyph->height <= 0 || startY >= LCD_HEIGHT) return x; + + LCD_Set_Address(startX, startY, startX + glyph->width - 1, + startY + glyph->height - 1); + LCD_Draw_Colour_Burst(bg_color, glyph->height * glyph->width); + + return x + glyph->advance; +} + +uint16_t GFX_DrawCharScaled( + uint16_t x, + uint16_t y, + char c, + const GFXfont *font, + uint16_t fg_color, + uint16_t bg_color, + uint8_t scale) { + + if (c < font->firstChar || c > font->lastChar || scale == 0) { + return x; + } + + uint16_t glyphIndex = c - font->firstChar; + const GFXglyph *glyph = &font->glyphs[glyphIndex]; + +// Calcul des dimensions cibles après mise à l'échelle + uint16_t target_width = (glyph->width + scale - 1) / scale; + uint16_t target_height = (glyph->height + scale - 1) / scale; + + int16_t startX = x + (glyph->xOffset / scale); + int16_t startY = y + (glyph->yOffset / scale); + +// Vérification des limites avec les dimensions cibles + if (startX + target_width <= 0 || startX >= LCD_WIDTH) return x; + if (startY + target_height <= 0 || startY >= LCD_HEIGHT) return x; + +// Mode standard (sans anti-crénelage) + if (scale == 1) { + LCD_Set_Address(startX, startY, startX + glyph->width - 1, + startY + glyph->height - 1); + uint16_t pendingPixelCount = 0; + uint8_t pendingPixelBit = 0; + uint16_t bitPos = 0; + + for (uint8_t row = 0; row < glyph->height; row++) { + for (uint8_t col = 0; col < glyph->width; col++) { + uint16_t byteIndex = glyph->bitmapOffset + (bitPos / 8); + uint8_t bitIndex = bitPos % 8; + uint8_t pixelBit = + (font->bitmaps[byteIndex] & (0x80 >> bitIndex)) ? 1 : 0; + + if (pixelBit == pendingPixelBit) { + pendingPixelCount++; + } else { + if (pendingPixelCount != 0) { + LCD_Draw_Colour_Burst(pendingPixelBit ? fg_color : bg_color, + pendingPixelCount); + pendingPixelCount = 1; + } + pendingPixelBit = pixelBit; + } + bitPos++; + } + } + if (pendingPixelCount != 0) { + LCD_Draw_Colour_Burst(pendingPixelBit ? fg_color : bg_color, + pendingPixelCount); + } + return x + glyph->advance; + } + +// Mode anti-crénelage (scale > 1) + const uint16_t scale_sq = scale * scale; + const uint8_t bg_R = (bg_color >> 11) & 0x1F; + const uint8_t bg_G = (bg_color >> 5) & 0x3F; + const uint8_t bg_B = bg_color & 0x1F; + const uint8_t fg_R = (fg_color >> 11) & 0x1F; + const uint8_t fg_G = (fg_color >> 5) & 0x3F; + const uint8_t fg_B = fg_color & 0x1F; + + for (uint16_t tr = 0; tr < target_height; tr++) { + for (uint16_t tc = 0; tc < target_width; tc++) { + uint16_t count = 0; + const uint16_t src_row_start = tr * scale; + const uint16_t src_col_start = tc * scale; + +// Comptage des pixels actifs dans le bloc source + for (uint8_t sr = 0; sr < scale; sr++) { + for (uint8_t sc = 0; sc < scale; sc++) { + const uint16_t src_row = src_row_start + sr; + const uint16_t src_col = src_col_start + sc; + + if (src_row >= glyph->height || src_col >= glyph->width) continue; + + const uint32_t bitPos = (src_row * glyph->width) + src_col; + const uint16_t byteIndex = glyph->bitmapOffset + (bitPos / 8); + const uint8_t bitIndex = bitPos % 8; + if (font->bitmaps[byteIndex] & (0x80 >> bitIndex)) { + count++; + } + } + } + +// Calcul de la couleur interpolée (RGB565) + const uint8_t coverage = (count * 100) / scale_sq;// Pour éviter la division flottante + const uint8_t R = (bg_R * (100 - coverage) + fg_R * coverage) / 100; + const uint8_t G = (bg_G * (100 - coverage) + fg_G * coverage) / 100; + const uint8_t B = (bg_B * (100 - coverage) + fg_B * coverage) / 100; + const uint16_t blended_color = (R << 11) | (G << 5) | B; + +// Dessin du pixel cible si dans les limites + const int16_t absX = startX + tc; + const int16_t absY = startY + tr; + if (absX >= 0 && absX < LCD_WIDTH && absY >= 0 && absY < LCD_HEIGHT) { + LCD_Draw_Pixel(absX, absY, blended_color); + } + } + } + return x + (glyph->advance / scale); +} + +uint16_t GFX_GetTextWidth( + const char *text, + const GFXfont *font, + int8_t letter_spacing) { uint16_t width = 0; while (*text != '\0') { @@ -108,21 +253,87 @@ uint16_t GFX_DrawText( uint16_t cursorY = y; while (*text != '\0') { - GFX_DrawChar(cursorX, cursorY, *text, font, fg_color, bg_color); - -// Move cursor by the glyph's advance width - if (*text >= font->firstChar && *text <= font->lastChar) { - uint16_t glyphIndex = *text - font->firstChar; - cursorX += font->glyphs[glyphIndex].advance; - cursorX += letter_spacing; - } else { -// Default advance for unsupported characters - cursorX += 10 + letter_spacing; - } - + cursorX = GFX_DrawChar(cursorX, cursorY, *text, font, fg_color, bg_color); + cursorX += letter_spacing; text++; } - if(alignment == 2) { + if (alignment == 2) { + return x; + } + return cursorX; +} +uint16_t GFX_ClearText( + uint16_t x, + uint16_t y, + const char *text, + const GFXfont *font, + uint16_t bg_color, + uint8_t alignment, + int8_t letter_spacing) { + +// Adjust x position based on alignment + switch (alignment) { + case 1:// Center + x -= GFX_GetTextWidth(text, font, letter_spacing) / 2; + break; + case 2:// Right + x -= GFX_GetTextWidth(text, font, letter_spacing); + break; +// Default: Left alignment (no adjustment) + } + +// Draw each character + uint16_t cursorX = x; + uint16_t cursorY = y; + + while (*text != '\0') { + cursorX = GFX_ClearChar(cursorX, cursorY, *text, font, bg_color); + cursorX += letter_spacing; + text++; + } + if (alignment == 2) { + return x; + } + return cursorX; +} +uint16_t GFX_DrawTextScaled( + uint16_t x, + uint16_t y, + const char *text, + const GFXfont *font, + uint16_t fg_color, + uint16_t bg_color, + uint8_t alignment, + int8_t letter_spacing, + uint8_t scale) { + + uint16_t text_width = GFX_GetTextWidth(text, font, letter_spacing * scale); + + if (scale != 1) { + text_width /= scale; + } +// Adjust x position based on alignment + switch (alignment) { + case 1:// Center + x -= text_width / 2; + break; + case 2:// Right + x -= text_width; + break; +// Default: Left alignment (no adjustment) + } + +// Draw each character + uint16_t cursorX = x; + uint16_t cursorY = y; + + while (*text != '\0') { + cursorX = GFX_DrawCharScaled(cursorX, cursorY, *text, font, fg_color, bg_color, + scale); + cursorX += letter_spacing; + text++; + } + if (alignment == 2) { return x; } return cursorX;