From 3d03fa4038aea6ef89e1b17c6da0e9732284d912 Mon Sep 17 00:00:00 2001 From: LongHairedHacker Date: Thu, 8 Dec 2016 02:15:02 +0100 Subject: [PATCH] Added additional font and the font converter --- Makefile | 2 +- fonts/free_sans.h | 203 +++++++++++++++++++++++ images/logo_bw.h | 250 ++++++++++++++-------------- images/logo_bw.png | Bin 9035 -> 8749 bytes main.c | 9 +- utils/fontconvert/.gitignore | 1 + utils/fontconvert/Makefile | 12 ++ utils/fontconvert/fontconvert.c | 278 ++++++++++++++++++++++++++++++++ utils/fontconvert/gfxfont.h | 24 +++ 9 files changed, 645 insertions(+), 134 deletions(-) create mode 100644 fonts/free_sans.h create mode 100644 utils/fontconvert/.gitignore create mode 100644 utils/fontconvert/Makefile create mode 100644 utils/fontconvert/fontconvert.c create mode 100644 utils/fontconvert/gfxfont.h diff --git a/Makefile b/Makefile index d51b966..1a09ae0 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ VERSION = 0.1 HEADERS = include/spi.h include/st7735.h include/st7735initcmds.h HEADERS += images/logo_bw.h images/logo.h include/st7735_gfx.h -HEADERS += include/st7735_font.h fonts/tom_thumb.h +HEADERS += include/st7735_font.h fonts/tom_thumb.h fonts/free_sans.h SRC = main.c spi.c st7735.c st7735_gfx.c st7735_font.c TARGET = st7735_test OBJDIR = bin diff --git a/fonts/free_sans.h b/fonts/free_sans.h new file mode 100644 index 0000000..a174f5a --- /dev/null +++ b/fonts/free_sans.h @@ -0,0 +1,203 @@ +#include "st7735_font.h" + +const uint8_t FreeSans_Bitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xF8, 0xC0, 0xDE, 0xF7, 0x20, 0x09, 0x86, 0x41, 0x91, 0xFF, + 0x13, 0x04, 0xC3, 0x20, 0xC8, 0xFF, 0x89, 0x82, 0x61, 0x90, 0x10, 0x1F, + 0x14, 0xDA, 0x3D, 0x1E, 0x83, 0x40, 0x78, 0x17, 0x08, 0xF4, 0x7A, 0x35, + 0x33, 0xF0, 0x40, 0x20, 0x38, 0x10, 0xEC, 0x20, 0xC6, 0x20, 0xC6, 0x40, + 0xC6, 0x40, 0x6C, 0x80, 0x39, 0x00, 0x01, 0x3C, 0x02, 0x77, 0x02, 0x63, + 0x04, 0x63, 0x04, 0x77, 0x08, 0x3C, 0x0E, 0x06, 0x60, 0xCC, 0x19, 0x81, + 0xE0, 0x18, 0x0F, 0x03, 0x36, 0xC2, 0xD8, 0x73, 0x06, 0x31, 0xE3, 0xC4, + 0xFE, 0x13, 0x26, 0x6C, 0xCC, 0xCC, 0xC4, 0x66, 0x23, 0x10, 0x8C, 0x46, + 0x63, 0x33, 0x33, 0x32, 0x66, 0x4C, 0x80, 0x25, 0x7E, 0xA5, 0x00, 0x30, + 0xC3, 0x3F, 0x30, 0xC3, 0x0C, 0xD6, 0xF0, 0xC0, 0x08, 0x44, 0x21, 0x10, + 0x84, 0x42, 0x11, 0x08, 0x00, 0x3C, 0x66, 0x42, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC3, 0x42, 0x66, 0x3C, 0x11, 0x3F, 0x33, 0x33, 0x33, 0x33, + 0x30, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x1C, 0x1C, 0x1C, 0x18, 0x18, + 0x10, 0x08, 0x07, 0xF8, 0x3C, 0x66, 0xC3, 0xC3, 0x03, 0x06, 0x1C, 0x07, + 0x03, 0xC3, 0xC3, 0x66, 0x3C, 0x0C, 0x18, 0x71, 0x62, 0xC9, 0xA3, 0x46, + 0xFE, 0x18, 0x30, 0x60, 0xC0, 0x7F, 0x20, 0x10, 0x08, 0x08, 0x07, 0xF3, + 0x8C, 0x03, 0x01, 0x80, 0xF0, 0x6C, 0x63, 0xE0, 0x1E, 0x31, 0x98, 0x78, + 0x0C, 0x06, 0xF3, 0x8D, 0x83, 0xC1, 0xE0, 0xD0, 0x6C, 0x63, 0xE0, 0xFF, + 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30, + 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1B, 0x18, 0xF8, 0xC6, 0xC1, 0xE0, 0xF0, + 0x6C, 0x63, 0xE0, 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, + 0x03, 0xC2, 0x66, 0x3C, 0xC0, 0x00, 0x30, 0xC0, 0x00, 0x00, 0x64, 0xA0, + 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x07, 0x80, 0x70, 0x0E, 0x01, 0x80, 0xFF, + 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x70, 0x0E, 0x01, 0xC0, 0x18, 0x38, 0x71, + 0xC0, 0x80, 0x00, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x18, 0x38, 0x18, + 0x18, 0x0C, 0x00, 0x00, 0x01, 0x80, 0x03, 0xF0, 0x06, 0x0E, 0x06, 0x01, + 0x86, 0x00, 0x66, 0x1D, 0xBB, 0x31, 0xCF, 0x18, 0xC7, 0x98, 0x63, 0xCC, + 0x31, 0xE6, 0x11, 0xB3, 0x99, 0xCC, 0xF7, 0x86, 0x00, 0x01, 0x80, 0x00, + 0x70, 0x40, 0x0F, 0xE0, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x90, 0x19, 0x81, + 0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, 0x30, + 0xFF, 0x18, 0x33, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x3F, 0xC6, 0x06, 0xC0, + 0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, 0x1F, 0x86, 0x19, 0x81, 0xA0, 0x3C, + 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0x61, 0xF0, + 0xFF, 0x18, 0x33, 0x03, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, + 0x78, 0x0F, 0x03, 0x60, 0xCF, 0xF0, 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06, + 0x03, 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, 0xFF, 0xC0, 0xC0, + 0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0F, 0x83, + 0x0E, 0x60, 0x66, 0x03, 0xC0, 0x0C, 0x00, 0xC1, 0xFC, 0x03, 0xC0, 0x36, + 0x03, 0x60, 0x73, 0x0F, 0x0F, 0x10, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, + 0x07, 0x80, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06, + 0xFF, 0xFF, 0xFF, 0xC0, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07, + 0x8F, 0x1E, 0x27, 0x80, 0xC0, 0xD8, 0x33, 0x0C, 0x63, 0x0C, 0xC1, 0xB8, + 0x3F, 0x07, 0x30, 0xC3, 0x18, 0x63, 0x06, 0x60, 0x6C, 0x0C, 0xC0, 0xC0, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xE0, + 0x3F, 0x01, 0xFC, 0x1F, 0xE0, 0xFD, 0x05, 0xEC, 0x6F, 0x63, 0x79, 0x13, + 0xCD, 0x9E, 0x6C, 0xF1, 0x47, 0x8E, 0x3C, 0x71, 0x80, 0xE0, 0x7C, 0x0F, + 0xC1, 0xE8, 0x3D, 0x87, 0x98, 0xF1, 0x1E, 0x33, 0xC3, 0x78, 0x6F, 0x07, + 0xE0, 0x7C, 0x0E, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0, + 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x0C, 0x60, 0xC0, 0xF8, + 0x00, 0xFF, 0x30, 0x6C, 0x0F, 0x03, 0xC0, 0xF0, 0x6F, 0xF3, 0x00, 0xC0, + 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, + 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x6C, + 0x60, 0xC0, 0xFB, 0x00, 0x08, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, + 0x6C, 0x0C, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, 0xC0, + 0x70, 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0x1E, 0x01, 0xF0, 0x0E, 0x00, + 0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x00, 0xFF, 0x86, 0x03, 0x01, 0x80, 0xC0, + 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x78, 0x0F, + 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, + 0xB0, 0x61, 0xF0, 0xC0, 0x6C, 0x0D, 0x81, 0x10, 0x63, 0x0C, 0x61, 0x04, + 0x60, 0xCC, 0x19, 0x01, 0x60, 0x3C, 0x07, 0x00, 0x60, 0xC1, 0x81, 0x30, + 0xE1, 0x98, 0x70, 0xCC, 0x28, 0x66, 0x26, 0x21, 0x13, 0x30, 0xC8, 0x98, + 0x6C, 0x4C, 0x14, 0x34, 0x0A, 0x1A, 0x07, 0x07, 0x03, 0x03, 0x80, 0x81, + 0x80, 0x60, 0x63, 0x0C, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0xE0, 0x06, 0x00, + 0xF0, 0x19, 0x01, 0x98, 0x30, 0xC6, 0x0E, 0x60, 0x60, 0xC0, 0x36, 0x06, + 0x30, 0xC3, 0x0C, 0x19, 0x81, 0xD8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x06, 0x00, 0xFF, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03, + 0x01, 0xC0, 0x60, 0x30, 0x18, 0x06, 0x03, 0x00, 0xFF, 0xC0, 0xFB, 0x6D, + 0xB6, 0xDB, 0x6D, 0xB6, 0xE0, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84, + 0x10, 0x80, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB, 0xE0, 0x30, 0x60, 0xA2, + 0x44, 0xD8, 0xA1, 0x80, 0xFF, 0xC0, 0xC6, 0x30, 0x7E, 0x71, 0xB0, 0xC0, + 0x60, 0xF3, 0xDB, 0x0D, 0x86, 0xC7, 0x3D, 0xC0, 0xC0, 0x60, 0x30, 0x1B, + 0xCE, 0x36, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0, 0x3C, + 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x03, 0x03, 0x03, + 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x3C, 0x66, + 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x36, 0x6F, 0x66, 0x66, + 0x66, 0x66, 0x60, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, + 0x3B, 0x03, 0x03, 0xC6, 0x7C, 0xC0, 0xC0, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC0, 0x30, 0x03, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, 0xC0, 0x60, 0x30, 0x18, 0x4C, + 0x46, 0x63, 0x61, 0xF0, 0xEC, 0x62, 0x31, 0x98, 0x6C, 0x30, 0xFF, 0xFF, + 0xFF, 0xC0, 0xDE, 0xF7, 0x1C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F, + 0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0x66, 0x3C, 0xDE, 0x71, 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, + 0xE3, 0x6F, 0x30, 0x18, 0x0C, 0x00, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0x03, 0xDF, 0x31, 0x8C, 0x63, 0x18, + 0xC6, 0x00, 0x3E, 0xE3, 0xC0, 0xC0, 0xE0, 0x3C, 0x07, 0xC3, 0xE3, 0x7E, + 0x66, 0xF6, 0x66, 0x66, 0x66, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC7, 0x7B, 0xC1, 0xA0, 0x98, 0xCC, 0x42, 0x21, 0xB0, 0xD0, + 0x28, 0x1C, 0x0C, 0x00, 0xC6, 0x1E, 0x38, 0x91, 0xC4, 0xCA, 0x66, 0xD3, + 0x16, 0xD0, 0xA6, 0x87, 0x1C, 0x38, 0xC0, 0xC6, 0x00, 0x43, 0x62, 0x36, + 0x1C, 0x18, 0x1C, 0x3C, 0x26, 0x62, 0x43, 0xC1, 0x21, 0x98, 0xCC, 0x42, + 0x61, 0xB0, 0xD0, 0x38, 0x1C, 0x0C, 0x06, 0x03, 0x01, 0x03, 0x00, 0xFE, + 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x20, 0xC1, 0xFC, 0x36, 0x66, 0x66, 0x6E, + 0xCE, 0x66, 0x66, 0x66, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC6, 0x66, + 0x66, 0x67, 0x37, 0x66, 0x66, 0x66, 0xC0, 0x61, 0x24, 0x38 }; + +const GFXglyph FreeSans_Glyphs[] PROGMEM = { + { 0, 0, 0, 5, 0, 1 }, // 0x20 ' ' + { 0, 2, 13, 6, 2, -12 }, // 0x21 '!' + { 4, 5, 4, 6, 1, -12 }, // 0x22 '"' + { 7, 10, 12, 10, 0, -11 }, // 0x23 '#' + { 22, 9, 16, 10, 1, -13 }, // 0x24 '$' + { 40, 16, 13, 16, 1, -12 }, // 0x25 '%' + { 66, 11, 13, 12, 1, -12 }, // 0x26 '&' + { 84, 2, 4, 4, 1, -12 }, // 0x27 ''' + { 85, 4, 17, 6, 1, -12 }, // 0x28 '(' + { 94, 4, 17, 6, 1, -12 }, // 0x29 ')' + { 103, 5, 5, 7, 1, -12 }, // 0x2A '*' + { 107, 6, 8, 11, 3, -7 }, // 0x2B '+' + { 113, 2, 4, 5, 2, 0 }, // 0x2C ',' + { 114, 4, 1, 6, 1, -4 }, // 0x2D '-' + { 115, 2, 1, 5, 1, 0 }, // 0x2E '.' + { 116, 5, 13, 5, 0, -12 }, // 0x2F '/' + { 125, 8, 13, 10, 1, -12 }, // 0x30 '0' + { 138, 4, 13, 10, 3, -12 }, // 0x31 '1' + { 145, 9, 13, 10, 1, -12 }, // 0x32 '2' + { 160, 8, 13, 10, 1, -12 }, // 0x33 '3' + { 173, 7, 13, 10, 2, -12 }, // 0x34 '4' + { 185, 9, 13, 10, 1, -12 }, // 0x35 '5' + { 200, 9, 13, 10, 1, -12 }, // 0x36 '6' + { 215, 8, 13, 10, 0, -12 }, // 0x37 '7' + { 228, 9, 13, 10, 1, -12 }, // 0x38 '8' + { 243, 8, 13, 10, 1, -12 }, // 0x39 '9' + { 256, 2, 10, 5, 1, -9 }, // 0x3A ':' + { 259, 3, 12, 5, 1, -8 }, // 0x3B ';' + { 264, 9, 9, 11, 1, -8 }, // 0x3C '<' + { 275, 9, 4, 11, 1, -5 }, // 0x3D '=' + { 280, 9, 9, 11, 1, -8 }, // 0x3E '>' + { 291, 9, 13, 10, 1, -12 }, // 0x3F '?' + { 306, 17, 16, 18, 1, -12 }, // 0x40 '@' + { 340, 12, 13, 12, 0, -12 }, // 0x41 'A' + { 360, 11, 13, 12, 1, -12 }, // 0x42 'B' + { 378, 11, 13, 13, 1, -12 }, // 0x43 'C' + { 396, 11, 13, 13, 1, -12 }, // 0x44 'D' + { 414, 9, 13, 11, 1, -12 }, // 0x45 'E' + { 429, 8, 13, 11, 1, -12 }, // 0x46 'F' + { 442, 12, 13, 14, 1, -12 }, // 0x47 'G' + { 462, 11, 13, 13, 1, -12 }, // 0x48 'H' + { 480, 2, 13, 5, 2, -12 }, // 0x49 'I' + { 484, 7, 13, 10, 1, -12 }, // 0x4A 'J' + { 496, 11, 13, 12, 1, -12 }, // 0x4B 'K' + { 514, 8, 13, 10, 1, -12 }, // 0x4C 'L' + { 527, 13, 13, 15, 1, -12 }, // 0x4D 'M' + { 549, 11, 13, 13, 1, -12 }, // 0x4E 'N' + { 567, 13, 13, 14, 1, -12 }, // 0x4F 'O' + { 589, 10, 13, 12, 1, -12 }, // 0x50 'P' + { 606, 13, 14, 14, 1, -12 }, // 0x51 'Q' + { 629, 12, 13, 13, 1, -12 }, // 0x52 'R' + { 649, 10, 13, 12, 1, -12 }, // 0x53 'S' + { 666, 9, 13, 11, 1, -12 }, // 0x54 'T' + { 681, 11, 13, 13, 1, -12 }, // 0x55 'U' + { 699, 11, 13, 12, 0, -12 }, // 0x56 'V' + { 717, 17, 13, 17, 0, -12 }, // 0x57 'W' + { 745, 12, 13, 12, 0, -12 }, // 0x58 'X' + { 765, 12, 13, 12, 0, -12 }, // 0x59 'Y' + { 785, 10, 13, 11, 1, -12 }, // 0x5A 'Z' + { 802, 3, 17, 5, 1, -12 }, // 0x5B '[' + { 809, 5, 13, 5, 0, -12 }, // 0x5C '\' + { 818, 3, 17, 5, 0, -12 }, // 0x5D ']' + { 825, 7, 7, 8, 1, -12 }, // 0x5E '^' + { 832, 10, 1, 10, 0, 3 }, // 0x5F '_' + { 834, 4, 3, 5, 0, -12 }, // 0x60 '`' + { 836, 9, 10, 10, 1, -9 }, // 0x61 'a' + { 848, 9, 13, 10, 1, -12 }, // 0x62 'b' + { 863, 8, 10, 9, 1, -9 }, // 0x63 'c' + { 873, 8, 13, 10, 1, -12 }, // 0x64 'd' + { 886, 8, 10, 10, 1, -9 }, // 0x65 'e' + { 896, 4, 13, 5, 1, -12 }, // 0x66 'f' + { 903, 8, 14, 10, 1, -9 }, // 0x67 'g' + { 917, 8, 13, 10, 1, -12 }, // 0x68 'h' + { 930, 2, 13, 4, 1, -12 }, // 0x69 'i' + { 934, 4, 17, 4, 0, -12 }, // 0x6A 'j' + { 943, 9, 13, 9, 1, -12 }, // 0x6B 'k' + { 958, 2, 13, 4, 1, -12 }, // 0x6C 'l' + { 962, 13, 10, 15, 1, -9 }, // 0x6D 'm' + { 979, 8, 10, 10, 1, -9 }, // 0x6E 'n' + { 989, 8, 10, 10, 1, -9 }, // 0x6F 'o' + { 999, 9, 13, 10, 1, -9 }, // 0x70 'p' + { 1014, 8, 13, 10, 1, -9 }, // 0x71 'q' + { 1027, 5, 10, 6, 1, -9 }, // 0x72 'r' + { 1034, 8, 10, 9, 1, -9 }, // 0x73 's' + { 1044, 4, 12, 5, 1, -11 }, // 0x74 't' + { 1050, 8, 10, 10, 1, -9 }, // 0x75 'u' + { 1060, 9, 10, 9, 0, -9 }, // 0x76 'v' + { 1072, 13, 10, 13, 0, -9 }, // 0x77 'w' + { 1089, 8, 10, 9, 0, -9 }, // 0x78 'x' + { 1099, 9, 14, 9, 0, -9 }, // 0x79 'y' + { 1115, 7, 10, 9, 1, -9 }, // 0x7A 'z' + { 1124, 4, 17, 6, 1, -12 }, // 0x7B '{' + { 1133, 2, 17, 4, 2, -12 }, // 0x7C '|' + { 1138, 4, 17, 6, 1, -12 }, // 0x7D '}' + { 1147, 7, 3, 9, 1, -7 } }; // 0x7E '~' + +const GFXfont FreeSans PROGMEM = { + (uint8_t *)FreeSans_Bitmaps, + (GFXglyph *)FreeSans_Glyphs, + 0x20, 0x7E, 22 }; + +// Approx. 1822 bytes diff --git a/images/logo_bw.h b/images/logo_bw.h index 022e32e..bff745d 100644 --- a/images/logo_bw.h +++ b/images/logo_bw.h @@ -3,134 +3,126 @@ #ifndef _LOGO_BW_H_ #define _LOGO_BW_H_ static const uint8_t PROGMEM logo_bw[] = { - 0xa0, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0xfe, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0xfe, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xf, 0xfc, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0xfc, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xc7, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xe3, 0xff, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xe3, 0xff, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xfb, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, 0xf9, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0xff, 0xf8, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x7f, 0xf8, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0x3b, 0xf8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0x33, 0xf8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x3, 0xf8, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xff, 0x3, 0xf8, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xff, 0x87, 0xf9, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xff, 0xc7, 0xf1, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xe7, 0xc7, 0xf0, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xe7, 0xc7, 0xf0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xe3, 0xc7, 0xf0, 0xf7, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xc1, 0xf, 0xf0, 0xf7, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc1, 0xf, 0xf0, 0xf7, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc1, 0xf, 0xf0, 0xf3, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x83, 0xf, 0xfc, 0xe3, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x83, 0xf, 0xfe, 0x83, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0x87, 0x1f, 0xff, 0x81, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x7, 0x1f, 0xff, 0x1, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0xf, 0x9f, 0xf7, 0x81, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x7f, 0xcf, 0x9f, 0xf1, 0x80, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7f, 0xde, 0xfe, 0xf0, 0xc0, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7f, 0x1e, 0xfe, 0xf0, 0xc0, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0x3c, 0x7c, 0x70, 0xc0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0x7f, 0xfc, 0x70, 0xe0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xf3, 0x7f, 0xfc, 0x7e, 0xe0, 0xf3, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xe1, 0xff, 0x38, 0x7e, 0xf2, 0xf3, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x81, 0xff, 0x38, 0x3e, 0xf3, 0xfb, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x39, 0x3f, 0xfb, 0xf9, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x0, 0xfc, 0x31, 0x3f, 0x39, 0xdc, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x7f, 0x0, 0xf8, 0x33, 0x1e, 0x3c, 0x86, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x3f, 0x0, 0xe0, 0x3, 0xf, 0x1c, 0xc0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0x0, 0xc0, 0x83, 0xf, 0xc, 0xe0, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1f, 0x0, 0x80, 0x80, 0xf, 0x0, 0xf0, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xf, 0x0, 0x0, 0x81, 0xf, 0x8, 0xf8, 0xfd, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xf, 0x0, 0x80, 0xc7, 0x1f, 0x1e, 0x7c, 0xfc, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0x0, 0xc0, 0xff, 0xff, 0x3f, 0x3e, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x7, 0x0, 0xc0, 0xff, 0xff, 0x3f, 0x8f, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x3, 0x0, 0xc0, 0xff, 0xff, 0x1f, 0xe7, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x3, 0x0, 0x80, 0xff, 0xff, 0x1f, 0xf8, 0xf1, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x1, 0x0, 0x0, 0xff, 0xff, 0xf, 0x1c, 0xe0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x1, 0x0, 0x80, 0xff, 0xff, 0xf, 0x0, 0xf8, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x80, 0xff, 0xf9, 0x1f, 0x0, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x80, 0x7f, 0x0, 0x0, 0x80, 0x7f, 0xe0, 0x1f, 0xf8, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc0, 0x7f, 0x0, 0x0, 0xf8, 0x3f, 0xc0, 0xff, 0xfd, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xc0, 0x3f, 0x0, 0x0, 0xfc, 0x3f, 0xc0, 0xff, 0x1, 0x80, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0x0, 0x0, 0xfc, 0x3f, 0xc0, 0xff, 0x1, 0xfc, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0x0, 0x0, 0xfc, 0x3f, 0xc0, 0xff, 0x1, 0xe0, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0x0, 0x0, 0xf8, 0x3f, 0xc0, 0xff, 0x1, 0x0, 0xfe, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf8, 0xf, 0x0, 0x0, 0xc0, 0x7f, 0xe0, 0x1f, 0xfc, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0x0, 0x0, 0x80, 0xff, 0xf0, 0x1f, 0xc0, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xfc, 0x7, 0x0, 0x0, 0x80, 0xff, 0xf0, 0x1f, 0x0, 0xf8, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xfc, 0x3, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0xf, 0x0, 0x7c, 0xfc, 0xf, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xfe, 0x3, 0x0, 0x0, 0x80, 0x7f, 0xe0, 0x1f, 0x70, 0xfc, 0xf0, 0x1f, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x1, 0x1e, 0x0, 0xc0, 0x7f, 0xe0, 0x1f, 0xff, 0x40, 0xe0, 0x1f, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x3f, 0x0, 0xc0, 0x3f, 0xe0, 0x3f, 0xfc, 0x1f, 0xc0, 0x3f, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x80, 0xff, 0x80, 0x7f, 0x0, 0xc0, 0x3f, 0xc0, 0x3f, 0xc0, 0xff, 0xc7, 0x3f, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x80, 0x7f, 0x80, 0x7f, 0x0, 0x80, 0x3, 0x0, 0x9e, 0x7, 0xfc, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0x7f, 0x80, 0x7f, 0x0, 0x18, 0x1, 0x0, 0x88, 0x7, 0xfc, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc0, 0x3f, 0x80, 0x7f, 0x0, 0x3e, 0x0, 0x0, 0x60, 0x3c, 0xfc, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0x1f, 0x80, 0x7f, 0x0, 0x3f, 0x0, 0x0, 0xc0, 0xf0, 0xf8, 0xe7, 0xff, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe0, 0x1f, 0x0, 0x3f, 0x80, 0x3f, 0x0, 0x0, 0x80, 0xc3, 0xc3, 0x3, 0xfe, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf0, 0xf, 0xe0, 0xe1, 0xff, 0xf, 0x0, 0x0, 0x0, 0x7, 0x1f, 0x0, 0xfc, 0x3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf8, 0xf, 0xf0, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x1c, 0x7c, 0x0, 0xfc, 0x7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf8, 0x7, 0xf8, 0xff, 0xff, 0x3, 0x0, 0x7e, 0x0, 0x38, 0xf0, 0x1, 0xf8, 0x7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xfc, 0x7, 0xfc, 0xff, 0xff, 0x1, 0xf0, 0x7f, 0x0, 0xf0, 0xc0, 0x7, 0xf8, 0xf, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xfc, 0x3, 0xfe, 0xff, 0xff, 0x0, 0xff, 0x7f, 0x0, 0xe0, 0xe1, 0x1f, 0xf0, 0xf, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xfe, 0x1, 0xff, 0xff, 0x3, 0x80, 0xff, 0x7f, 0x0, 0xc0, 0xf7, 0x7f, 0xe0, 0x1f, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0x81, 0xff, 0xff, 0x7, 0xe0, 0xff, 0x3f, 0x0, 0x0, 0xff, 0xf7, 0xe1, 0x3f, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xc0, 0x9f, 0xff, 0xf, 0xf8, 0xff, 0x0, 0x0, 0x0, 0xfe, 0xc7, 0xc7, 0x3f, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x80, 0xff, 0xc0, 0xf, 0xff, 0x1f, 0xfc, 0x7, 0x0, 0x0, 0x0, 0x7c, 0x0, 0xff, 0x7f, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x80, 0x7f, 0xc0, 0x7, 0xfe, 0x3f, 0xff, 0x3, 0x0, 0x0, 0x0, 0xf8, 0x1, 0xfc, 0x7f, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc0, 0x7f, 0xc0, 0x3, 0xfc, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x7, 0xf0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x3f, 0xc0, 0x3, 0xfc, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xf, 0xc0, 0xff, 0x1, 0x0, 0x0, - 0x0, 0x0, 0xe0, 0x3f, 0xc0, 0x3, 0xf8, 0xff, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x1c, 0xff, 0x1, 0x0, 0x0, - 0x0, 0x0, 0xf0, 0x1f, 0xc0, 0x3, 0xf0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x1c, 0xfe, 0x3, 0x0, 0x0, - 0x0, 0x0, 0xf0, 0xf, 0xc0, 0x3, 0xe0, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x1, 0xfc, 0x3, 0x0, 0x0, - 0x0, 0x0, 0xf8, 0xf, 0xc0, 0x3, 0xc0, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0xfc, 0x7, 0x0, 0x0, - 0x0, 0x0, 0xf8, 0x7, 0xc0, 0x3, 0x80, 0xff, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xf, 0xf8, 0x7, 0x0, 0x0, - 0x0, 0x0, 0xfc, 0x7, 0xc0, 0x3, 0x0, 0xfe, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0xf8, 0xf, 0x0, 0x0, - 0x0, 0x0, 0xfe, 0x3, 0x0, 0x0, 0x0, 0xf0, 0xff, 0xff, 0x1, 0x0, 0x0, 0x0, 0xc0, 0x7f, 0xf0, 0x1f, 0x0, 0x0, - 0x0, 0x0, 0xfe, 0x1, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe1, 0x1f, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xf, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xe7, 0x3f, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xcf, 0x3f, 0x0, 0x0, - 0x0, 0x80, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xff, 0x7f, 0x0, 0x0, - 0x0, 0x80, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xff, 0x7f, 0x0, 0x0, - 0x0, 0xc0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xe0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0xff, 0x1, 0x0, - 0x0, 0xe0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x1, 0x0, - 0x0, 0xf0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xff, 0x3, 0x0, - 0x0, 0xf0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0x3, 0x0, - 0x0, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7, 0x0, - 0x0, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7, 0x0, - 0x0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0x0, - 0x0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0x0, - 0x0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0x0, - 0x0, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7, 0x0, - 0x0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8a, 0x78, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xcf, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x7f, 0xf8, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe1, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x3, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0xfc, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0xfe, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0xf8, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xfb, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xe7, 0xe7, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xff, 0x8f, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x1f, 0xfe, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0x3b, 0xf8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xcf, 0xe0, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x3f, 0x80, 0xff, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0x0, 0xfe, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xff, 0x87, 0xf9, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x1f, 0xc7, 0xff, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x7f, 0x7e, 0xc, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, 0x31, 0xfc, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xe3, 0xc7, 0xf0, 0xf7, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0x3f, 0xc0, 0xdf, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0xfc, 0x0, 0x7f, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x7f, 0xf0, 0x3, 0xfc, 0xfc, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x83, 0xf, 0xfc, 0xe3, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0xf, 0x3e, 0xf8, 0xf, 0xfe, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x7f, 0xf8, 0xf1, 0x1f, 0xf8, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xff, 0xc1, 0xc7, 0x7f, 0xc0, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0xf, 0x9f, 0xf7, 0x81, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0x3d, 0x7f, 0xc6, 0x3, 0xfe, 0xf, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0xe7, 0xed, 0xf, 0xf, 0xfc, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x9f, 0x87, 0x3f, 0x3c, 0xf0, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0x3c, 0x7c, 0x70, 0xc0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xff, 0xff, 0xf1, 0xc3, 0x81, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0xff, 0xc7, 0xef, 0x7, 0x3e, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x80, 0x7f, 0xf8, 0x3f, 0x8e, 0x9f, 0xfc, 0xfc, 0x7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x81, 0xff, 0x38, 0x3e, 0xf3, 0xfb, 0x3f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x3, 0xfc, 0xe7, 0xfc, 0xec, 0xe7, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xf, 0xc0, 0x1f, 0xf3, 0x93, 0xc3, 0xfd, 0x7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0x0, 0xfe, 0x8c, 0x7, 0x8f, 0xe1, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc0, 0x3f, 0x0, 0xe0, 0x3, 0xf, 0x1c, 0xc0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0x0, 0x0, 0xf, 0x3e, 0x30, 0x80, 0xff, 0x7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x1, 0x0, 0x8, 0xf8, 0x0, 0x0, 0xff, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xfc, 0x3, 0x0, 0x40, 0xe0, 0x3, 0x2, 0x7e, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf0, 0xf, 0x0, 0x80, 0xc7, 0x1f, 0x1e, 0x7c, 0xfc, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1f, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xfc, 0x1f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc0, 0x7f, 0x0, 0x0, 0xfc, 0xff, 0xff, 0xf3, 0xf8, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0xf0, 0xff, 0xff, 0xc7, 0xf9, 0xff, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xfe, 0x3, 0x0, 0x80, 0xff, 0xff, 0x1f, 0xf8, 0xf1, 0x1f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0x0, 0x0, 0xfc, 0xff, 0x3f, 0x70, 0x80, 0x7f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0x0, 0x0, 0xf8, 0xff, 0xff, 0x0, 0x80, 0xff, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc0, 0x3f, 0x0, 0x0, 0xe0, 0x7f, 0xfe, 0x7, 0xc0, 0xff, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x80, 0x7f, 0x0, 0x0, 0x80, 0x7f, 0xe0, 0x1f, 0xf8, 0xff, 0x7f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x1, 0x0, 0xe0, 0xff, 0x0, 0xff, 0xf7, 0xff, 0xff, 0x3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xfc, 0x3, 0x0, 0xc0, 0xff, 0x3, 0xfc, 0x1f, 0x0, 0xf8, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf8, 0xf, 0x0, 0x0, 0xff, 0xf, 0xf0, 0x7f, 0x0, 0xff, 0x7f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf0, 0x1f, 0x0, 0x0, 0xfc, 0x3f, 0xc0, 0xff, 0x1, 0xe0, 0xff, 0x3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc0, 0x7f, 0x0, 0x0, 0xe0, 0xff, 0x0, 0xff, 0x7, 0x0, 0xf8, 0xf, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x80, 0xff, 0x0, 0x0, 0x0, 0xfc, 0x7, 0xfe, 0xc1, 0xff, 0xff, 0x7f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xfe, 0x1, 0x0, 0x0, 0xe0, 0x3f, 0xfc, 0x7, 0xf0, 0xff, 0xff, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xfc, 0x7, 0x0, 0x0, 0x80, 0xff, 0xf0, 0x1f, 0x0, 0xf8, 0xff, 0xf, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf0, 0xf, 0x0, 0x0, 0x0, 0xfc, 0xc1, 0x3f, 0x0, 0xf0, 0xf1, 0x3f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x3f, 0x0, 0x0, 0x0, 0xf8, 0x7, 0xfe, 0x1, 0xc7, 0xf, 0xff, 0x1, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x7f, 0x80, 0x7, 0x0, 0xf0, 0x1f, 0xf8, 0xc7, 0x3f, 0x10, 0xf8, 0x7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x3f, 0x0, 0xc0, 0x3f, 0xe0, 0x3f, 0xfc, 0x1f, 0xc0, 0x3f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xfe, 0x3, 0xfe, 0x1, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf8, 0x7, 0xf8, 0x7, 0x0, 0x38, 0x0, 0xe0, 0x79, 0xc0, 0xff, 0xff, 0x7, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x1f, 0xe0, 0x1f, 0x0, 0x46, 0x0, 0x0, 0xe2, 0x1, 0xff, 0xff, 0x3f, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x3f, 0x80, 0x7f, 0x0, 0x3e, 0x0, 0x0, 0x60, 0x3c, 0xfc, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x80, 0x7f, 0x0, 0xfe, 0x1, 0xfc, 0x0, 0x0, 0x0, 0xc3, 0xe3, 0x9f, 0xff, 0x7, 0x0, + 0x0, 0x0, 0x0, 0xfe, 0x1, 0xf0, 0x3, 0xf8, 0x3, 0x0, 0x0, 0x38, 0x3c, 0x3c, 0xe0, 0x1f, 0x0, 0x0, + 0x0, 0x0, 0xfc, 0x3, 0x78, 0xf8, 0xff, 0x3, 0x0, 0x0, 0xc0, 0xc1, 0x7, 0x0, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf8, 0xf, 0xf0, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x1c, 0x7c, 0x0, 0xfc, 0x7, 0x0, + 0x0, 0x0, 0xe0, 0x1f, 0xe0, 0xff, 0xff, 0xf, 0x0, 0xf8, 0x1, 0xe0, 0xc0, 0x7, 0xe0, 0x1f, 0x0, + 0x0, 0x0, 0xc0, 0x7f, 0xc0, 0xff, 0xff, 0x1f, 0x0, 0xff, 0x7, 0x0, 0xf, 0x7c, 0x80, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x80, 0xff, 0xff, 0x3f, 0xc0, 0xff, 0x1f, 0x0, 0x78, 0xf8, 0x7, 0xfc, 0x3, 0x0, + 0x0, 0x0, 0xfe, 0x1, 0xff, 0xff, 0x3, 0x80, 0xff, 0x7f, 0x0, 0xc0, 0xf7, 0x7f, 0xe0, 0x1f, 0x0, + 0x0, 0x0, 0xfc, 0x7, 0xfe, 0xff, 0x1f, 0x80, 0xff, 0xff, 0x0, 0x0, 0xfc, 0xdf, 0x87, 0xff, 0x0, + 0x0, 0x0, 0xf0, 0xf, 0xfc, 0xf9, 0xff, 0x80, 0xff, 0xf, 0x0, 0x0, 0xe0, 0x7f, 0x7c, 0xfc, 0x3, 0x0, + 0x0, 0xe0, 0x3f, 0xf0, 0xc3, 0xff, 0x7, 0xff, 0x1, 0x0, 0x0, 0x0, 0x1f, 0xc0, 0xff, 0x1f, 0x0, + 0x0, 0x80, 0x7f, 0xc0, 0x7, 0xfe, 0x3f, 0xff, 0x3, 0x0, 0x0, 0x0, 0xf8, 0x1, 0xfc, 0x7f, 0x0, + 0x0, 0x0, 0xff, 0x1, 0xf, 0xf0, 0xff, 0xff, 0x3, 0x0, 0x0, 0x0, 0xc0, 0x1f, 0xc0, 0xff, 0x3, + 0x0, 0x0, 0xfe, 0x3, 0x3c, 0xc0, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, 0xfc, 0x1f, 0x0, + 0x0, 0xf8, 0xf, 0xf0, 0x0, 0xfe, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xf, 0xc7, 0x7f, 0x0, + 0x0, 0xf0, 0x1f, 0xc0, 0x3, 0xf0, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x1c, 0xfe, 0x3, + 0x0, 0xc0, 0x3f, 0x0, 0xf, 0x80, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x7, 0xf0, 0xf, + 0x0, 0x80, 0xff, 0x0, 0x3c, 0x0, 0xfc, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x80, 0x7f, 0xc0, 0x7f, 0x0, + 0x0, 0xfe, 0x1, 0xf0, 0x0, 0xe0, 0xff, 0xff, 0xf, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x3, 0xfe, 0x1, + 0x0, 0xfc, 0x7, 0xc0, 0x3, 0x0, 0xfe, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x3f, 0xf8, 0xf, + 0x0, 0xf8, 0xf, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xff, 0x7, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc1, 0x7f, + 0x0, 0xe0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x3f, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x1f, 0xfe, 0x1, + 0xc0, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe, 0x3, 0x0, 0x0, 0x0, 0x80, 0xff, 0xf9, 0xf, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xcf, 0x3f, + 0x0, 0xfe, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0xff, + 0x1, 0xf8, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x7, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x7, + 0xf0, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xf, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xff, 0x3f, + 0xe0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x80, 0xff, 0xff, + 0x81, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, + 0x7, 0xff, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xff, 0x3f, + 0xfc, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, }; #endif diff --git a/images/logo_bw.png b/images/logo_bw.png index 1b658ab825bc1f105ee8995b0b12c6499505987a..2afc515c7ea943b7374149353a6419e4c4954018 100644 GIT binary patch literal 8749 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�+1n@Ih!r-r|va+&o)NU<#7}zA#6ckIq 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 literal 9035 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 z zRLh(W!g-iV*ej@ZO)ah2CPZ#tUZqC{9Qc%1RVlj~m~R>v6&C8J4{TYDXqqJYi9W!^ z&8Rvheej?KEKBuFt|m)2;A^?dsoB~2IX5Gf4-ZsGv7%I7dOG4Zn!P=oV^=T-zg}m( z>^-WnzOk_awXWAWQ(9Ei4p2K=gBXlw_c>LKO-n1Q*aTKi8_n!BCh*Lte=|vE(PBH1$?f7^$Qx}9m-i{C#p51RmGA+x5@p)kvy%} z2W}pS%WEv>3#$V@Z|mx)s|SFEv)dXg7&nRt=+tM@tdqB>pN8yGCgs`NH6}ASSOocQ zgVP)c4k$g&9%p7|a!G1W3S&XTR9ax9!?{wFVF`V^EN*lGeMdnBay}cumoHz0YjINH zF!b@`$0ZbRw|xE+8djUT__p8F4!s>;18J=Z{!nP`Q&SHhmUtl}gT1|X z2&7aZz+57U$jZu6Z(f4C$-(?J@YL(%W{q%bwmp%`&7xqe^)~ySU{Imv_5J+0WqO(f z<~sU+|8?KyK_G)rv~d`3E32wjWxRwTAl)W<;Y*XmWg4j%!fkIH2h=cloyg#YiH|ZH z5*xyz-RKV|dHO$dWzROV!j|^-1_^R4OQ1&jHJZ_E4Jhe5N{*U8<9k8n|O0e z-eIWIY4%8#NF#d<;RaxQE1X}d{p8Rw&Wy`V4*`9GeldUvO1k~ah9qxeC~Xl>xN*JS z$=dlTOn|CAtFe3q2GU|ZW&fJ>beMI^0L?>dKi|H*O&!5_YiJo|f@*!uEmBcdUIK(N zE0W%wuKaS!Nejo6_DM~4NUPo)QBu^!ev0;gN^jA1VS(b$pFc1>oLHI*+cqyD=3W6Q z>Hvk4S5$0Em?)6#=z{`MvxsK(DJdyQSP5^SOhrbvgk*z(hJr-{0-9~S7gknQgKEOE zW;YU*p`rKT02|B}3g8sr#cka7=FOYUIlmzfbOZvq|Ms&0^_+0rR<7HM46w5VE2x2y zp~>=6T|GgXXui)Feo-acv$MtpwC8E`-O{!fFnf#7XIPaH%*@P($3w!l8b4dw&+K2HmN0y{URzS`&E-11|U1m2fZtCy~_`k8jDbo@7$aN%1A* zvy~c@*I2|Yx4{gjwp_&QMPWG{<}jYg16e&JCx7?$JG5AX>6%AhZ||q1B(mb-Vm?91 ztw5({c_cdrhpzME4RzWJIF}T3l+iRdBqJk(F!Za(pT7&PW#iLWgfaZ}a2|(8E0?-@ zX-WR@p>`^QVffxu@E~SYu4;^rx3_Xz_7<9dP0cw-x^0)hL^HGPd4Ha4(!|5WCR3v- zF6KsWB3A9oxd-kRpXTT14`;2K=@UXM7n|nIHW-P5D$K?i-gGcq&@nTY@c;P4y@v{! z>>IUe@X1Xd>b?+f1w5iER;xe;$)JN8H{EcrJb+w5U1YgB;Rr@*431C>^Yh=2xoQwI zUP4!^`N|yz{VLcsYv0J=U2yUdI$w>7{pkg_o&j5but*?RtT8+=P-2844#U#C(a{k*>;3O^`z7e|CBt!c1Q_3`O^rbf^A?ac#mQ2wTPt`e zeVi>`YqdxN2BiVc%=%2>QzT{>qswt#@IeyiU#Q`Gh*uJC K#7jkWz5fRaQ@-i| diff --git a/main.c b/main.c index 9184302..57f1ee4 100644 --- a/main.c +++ b/main.c @@ -9,7 +9,8 @@ //#include "logo.h" #include "logo_bw.h" -#include "tom_thumb.h" +//#include "tom_thumb.h" +#include "free_sans.h" int main(void) { spi_init(); @@ -18,7 +19,7 @@ int main(void) { st7735_set_orientation(ST7735_LANDSCAPE); st7735_fill_rect(0, 0, 160, 128, ST7735_COLOR_BLACK); - st7735_draw_mono_bitmap(0, 0, &logo_bw, ST7735_COLOR_WHITE, ST7735_COLOR_BLACK); + st7735_draw_mono_bitmap(16, 4, &logo_bw, ST7735_COLOR_WHITE, ST7735_COLOR_BLACK); //st7735_draw_bitmap(10, 10, &logo); @@ -47,10 +48,10 @@ int main(void) { w += 20; } - _delay_ms(1000); + _delay_ms(5000); st7735_fill_rect(0, 0, 160, 128, ST7735_COLOR_BLACK); - st7735_draw_text(10, 30, "This is\nJust a Test", &TomThumb, 3, ST7735_COLOR_CYAN); + st7735_draw_text(5, 30, "This is\njust a Test xyz\nST7735\nLongHairedHacker", &FreeSans, 1, ST7735_COLOR_CYAN); st7735_draw_fast_hline(10, 30, 100, ST7735_COLOR_RED); while(1); diff --git a/utils/fontconvert/.gitignore b/utils/fontconvert/.gitignore new file mode 100644 index 0000000..3d84b66 --- /dev/null +++ b/utils/fontconvert/.gitignore @@ -0,0 +1 @@ +fontconvert diff --git a/utils/fontconvert/Makefile b/utils/fontconvert/Makefile new file mode 100644 index 0000000..47f5a0e --- /dev/null +++ b/utils/fontconvert/Makefile @@ -0,0 +1,12 @@ +all: fontconvert + +CC = gcc +CFLAGS = -Wall -I/usr/local/include/freetype2 -I/usr/include/freetype2 -I/usr/include +LIBS = -lfreetype + +fontconvert: fontconvert.c + $(CC) $(CFLAGS) $< $(LIBS) -o $@ + strip $@ + +clean: + rm -f fontconvert diff --git a/utils/fontconvert/fontconvert.c b/utils/fontconvert/fontconvert.c new file mode 100644 index 0000000..4bdb13d --- /dev/null +++ b/utils/fontconvert/fontconvert.c @@ -0,0 +1,278 @@ +/* +TrueType to Adafruit_GFX font converter. Derived from Peter Jakobs' +Adafruit_ftGFX fork & makefont tool, and Paul Kourany's Adafruit_mfGFX. + +NOT AN ARDUINO SKETCH. This is a command-line tool for preprocessing +fonts to be used with the Adafruit_GFX Arduino library. + +For UNIX-like systems. Outputs to stdout; redirect to header file, e.g.: + ./fontconvert ~/Library/Fonts/FreeSans.ttf 18 > FreeSans18pt7b.h + +REQUIRES FREETYPE LIBRARY. www.freetype.org + +Currently this only extracts the printable 7-bit ASCII chars of a font. +Will eventually extend with some int'l chars a la ftGFX, not there yet. +Keep 7-bit fonts around as an option in that case, more compact. + +See notes at end for glyph nomenclature & other tidbits. +*/ + +#include +#include +#include +#include +#include FT_GLYPH_H +#include "gfxfont.h" // Adafruit_GFX font structures + +#define DPI 141 // Approximate res. of Adafruit 2.8" TFT + +// Accumulate bits for output, with periodic hexadecimal byte write +void enbit(uint8_t value) { + static uint8_t row = 0, sum = 0, bit = 0x80, firstCall = 1; + if(value) sum |= bit; // Set bit if needed + if(!(bit >>= 1)) { // Advance to next bit, end of byte reached? + if(!firstCall) { // Format output table nicely + if(++row >= 12) { // Last entry on line? + printf(",\n "); // Newline format output + row = 0; // Reset row counter + } else { // Not end of line + printf(", "); // Simple comma delim + } + } + printf("0x%02X", sum); // Write byte value + sum = 0; // Clear for next byte + bit = 0x80; // Reset bit counter + firstCall = 0; // Formatting flag + } +} + +int main(int argc, char *argv[]) { + int i, j, err, size, first=' ', last='~', + bitmapOffset = 0, x, y, byte; + char *fontName, c, *ptr; + FT_Library library; + FT_Face face; + FT_Glyph glyph; + FT_Bitmap *bitmap; + FT_BitmapGlyphRec *g; + GFXglyph *table; + uint8_t bit; + + // Parse command line. Valid syntaxes are: + // fontconvert [filename] [size] + // fontconvert [filename] [size] [last char] + // fontconvert [filename] [size] [first char] [last char] + // Unless overridden, default first and last chars are + // ' ' (space) and '~', respectively + + if(argc < 3) { + fprintf(stderr, "Usage: %s fontfile size [first] [last]\n", + argv[0]); + return 1; + } + + size = atoi(argv[2]); + + if(argc == 4) { + last = atoi(argv[3]); + } else if(argc == 5) { + first = atoi(argv[3]); + last = atoi(argv[4]); + } + + if(last < first) { + i = first; + first = last; + last = i; + } + + ptr = strrchr(argv[1], '/'); // Find last slash in filename + if(ptr) ptr++; // First character of filename (path stripped) + else ptr = argv[1]; // No path; font in local dir. + + // Allocate space for font name and glyph table + if((!(fontName = malloc(strlen(ptr) + 20))) || + (!(table = (GFXglyph *)malloc((last - first + 1) * + sizeof(GFXglyph))))) { + fprintf(stderr, "Malloc error\n"); + return 1; + } + + // Derive font table names from filename. Period (filename + // extension) is truncated and replaced with the font size & bits. + strcpy(fontName, ptr); + ptr = strrchr(fontName, '.'); // Find last period (file ext) + if(!ptr) ptr = &fontName[strlen(fontName)]; // If none, append + // Insert font size and 7/8 bit. fontName was alloc'd w/extra + // space to allow this, we're not sprintfing into Forbidden Zone. + sprintf(ptr, "%dpt%db", size, (last > 127) ? 8 : 7); + // Space and punctuation chars in name replaced w/ underscores. + for(i=0; (c=fontName[i]); i++) { + if(isspace(c) || ispunct(c)) fontName[i] = '_'; + } + + // Init FreeType lib, load font + if((err = FT_Init_FreeType(&library))) { + fprintf(stderr, "FreeType init error: %d", err); + return err; + } + if((err = FT_New_Face(library, argv[1], 0, &face))) { + fprintf(stderr, "Font load error: %d", err); + FT_Done_FreeType(library); + return err; + } + + // << 6 because '26dot6' fixed-point format + FT_Set_Char_Size(face, size << 6, 0, DPI, 0); + + // Currently all symbols from 'first' to 'last' are processed. + // Fonts may contain WAY more glyphs than that, but this code + // will need to handle encoding stuff to deal with extracting + // the right symbols, and that's not done yet. + // fprintf(stderr, "%ld glyphs\n", face->num_glyphs); + + printf("const uint8_t %sBitmaps[] PROGMEM = {\n ", fontName); + + // Process glyphs and output huge bitmap data array + for(i=first, j=0; i<=last; i++, j++) { + // MONO renderer provides clean image with perfect crop + // (no wasted pixels) via bitmap struct. + if((err = FT_Load_Char(face, i, FT_LOAD_TARGET_MONO))) { + fprintf(stderr, "Error %d loading char '%c'\n", + err, i); + continue; + } + + if((err = FT_Render_Glyph(face->glyph, + FT_RENDER_MODE_MONO))) { + fprintf(stderr, "Error %d rendering char '%c'\n", + err, i); + continue; + } + + if((err = FT_Get_Glyph(face->glyph, &glyph))) { + fprintf(stderr, "Error %d getting glyph '%c'\n", + err, i); + continue; + } + + bitmap = &face->glyph->bitmap; + g = (FT_BitmapGlyphRec *)glyph; + + // Minimal font and per-glyph information is stored to + // reduce flash space requirements. Glyph bitmaps are + // fully bit-packed; no per-scanline pad, though end of + // each character may be padded to next byte boundary + // when needed. 16-bit offset means 64K max for bitmaps, + // code currently doesn't check for overflow. (Doesn't + // check that size & offsets are within bounds either for + // that matter...please convert fonts responsibly.) + table[j].bitmapOffset = bitmapOffset; + table[j].width = bitmap->width; + table[j].height = bitmap->rows; + table[j].xAdvance = face->glyph->advance.x >> 6; + table[j].xOffset = g->left; + table[j].yOffset = 1 - g->top; + + for(y=0; y < bitmap->rows; y++) { + for(x=0;x < bitmap->width; x++) { + byte = x / 8; + bit = 0x80 >> (x & 7); + enbit(bitmap->buffer[ + y * bitmap->pitch + byte] & bit); + } + } + + // Pad end of char bitmap to next byte boundary if needed + int n = (bitmap->width * bitmap->rows) & 7; + if(n) { // Pixel count not an even multiple of 8? + n = 8 - n; // # bits to next multiple + while(n--) enbit(0); + } + bitmapOffset += (bitmap->width * bitmap->rows + 7) / 8; + + FT_Done_Glyph(glyph); + } + + printf(" };\n\n"); // End bitmap array + + // Output glyph attributes table (one per character) + printf("const GFXglyph %sGlyphs[] PROGMEM = {\n", fontName); + for(i=first, j=0; i<=last; i++, j++) { + printf(" { %5d, %3d, %3d, %3d, %4d, %4d }", + table[j].bitmapOffset, + table[j].width, + table[j].height, + table[j].xAdvance, + table[j].xOffset, + table[j].yOffset); + if(i < last) { + printf(", // 0x%02X", i); + if((i >= ' ') && (i <= '~')) { + printf(" '%c'", i); + } + putchar('\n'); + } + } + printf(" }; // 0x%02X", last); + if((last >= ' ') && (last <= '~')) printf(" '%c'", last); + printf("\n\n"); + + // Output font structure + printf("const GFXfont %s PROGMEM = {\n", fontName); + printf(" (uint8_t *)%sBitmaps,\n", fontName); + printf(" (GFXglyph *)%sGlyphs,\n", fontName); + printf(" 0x%02X, 0x%02X, %ld };\n\n", + first, last, face->size->metrics.height >> 6); + printf("// Approx. %d bytes\n", + bitmapOffset + (last - first + 1) * 7 + 7); + // Size estimate is based on AVR struct and pointer sizes; + // actual size may vary. + + FT_Done_FreeType(library); + + return 0; +} + +/* ------------------------------------------------------------------------- + +Character metrics are slightly different from classic GFX & ftGFX. +In classic GFX: cursor position is the upper-left pixel of each 5x7 +character; lower extent of most glyphs (except those w/descenders) +is +6 pixels in Y direction. +W/new GFX fonts: cursor position is on baseline, where baseline is +'inclusive' (containing the bottom-most row of pixels in most symbols, +except those with descenders; ftGFX is one pixel lower). + +Cursor Y will be moved automatically when switching between classic +and new fonts. If you switch fonts, any print() calls will continue +along the same baseline. + + ...........#####.. -- yOffset + ..........######.. + ..........######.. + .........#######.. + ........#########. + * = Cursor pos. ........#########. + .......##########. + ......#####..####. + ......#####..####. + *.#.. .....#####...####. + .#.#. ....############## + #...# ...############### + #...# ...############### + ##### ..#####......##### + #...# .#####.......##### +====== #...# ====== #*###.........#### ======= Baseline + || xOffset + +glyph->xOffset and yOffset are pixel offsets, in GFX coordinate space +(+Y is down), from the cursor position to the top-left pixel of the +glyph bitmap. i.e. yOffset is typically negative, xOffset is typically +zero but a few glyphs will have other values (even negative xOffsets +sometimes, totally normal). glyph->xAdvance is the distance to move +the cursor on the X axis after drawing the corresponding symbol. + +There's also some changes with regard to 'background' color and new GFX +fonts (classic fonts unchanged). See Adafruit_GFX.cpp for explanation. +*/ diff --git a/utils/fontconvert/gfxfont.h b/utils/fontconvert/gfxfont.h new file mode 100644 index 0000000..07381ed --- /dev/null +++ b/utils/fontconvert/gfxfont.h @@ -0,0 +1,24 @@ +// Font structures for newer Adafruit_GFX (1.1 and later). +// Example fonts are included in 'Fonts' directory. +// To use a font in your Arduino sketch, #include the corresponding .h +// file and pass address of GFXfont struct to setFont(). Pass NULL to +// revert to 'classic' fixed-space bitmap font. + +#ifndef _GFXFONT_H_ +#define _GFXFONT_H_ + +typedef struct { // Data stored PER GLYPH + uint16_t bitmapOffset; // Pointer into GFXfont->bitmap + uint8_t width, height; // Bitmap dimensions in pixels + uint8_t xAdvance; // Distance to advance cursor (x axis) + int8_t xOffset, yOffset; // Dist from cursor pos to UL corner +} GFXglyph; + +typedef struct { // Data stored for FONT AS A WHOLE: + uint8_t *bitmap; // Glyph bitmaps, concatenated + GFXglyph *glyph; // Glyph array + uint8_t first, last; // ASCII extents + uint8_t yAdvance; // Newline distance (y axis) +} GFXfont; + +#endif // _GFXFONT_H_