├── src ├── Fonts │ ├── readme.txt │ ├── FreeSans12pt7b.h │ ├── FreeSans9pt8b.h │ ├── FreeSans18pt7b.h │ └── FreeSansBoldOblique18pt7b.h ├── gfxfont.h ├── ILI9341_ESP32.h ├── glcdfont.c └── ILI9341_ESP32.cpp ├── library.properties └── README.md /src/Fonts/readme.txt: -------------------------------------------------------------------------------- 1 | #Readme Fonts 2 | -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=ILI9341_ESP32 2 | version=0.2 3 | author=the-fallen 4 | sentence=A fast ILI9341 LCD driver to be used with ESP32. 5 | paragraph= 6 | category=Display 7 | architectures=esp32 8 | -------------------------------------------------------------------------------- /src/gfxfont.h: -------------------------------------------------------------------------------- 1 | // Font structures for newer Adafruit_GFX (1.1 and later). 2 | // Example fonts are included in 'Fonts' directory. 3 | // To use a font in your Arduino sketch, #include the corresponding .h 4 | // file and pass address of GFXfont struct to setFont(). Pass NULL to 5 | // revert to 'classic' fixed-space bitmap font. 6 | 7 | #ifndef _GFXFONT_H_ 8 | #define _GFXFONT_H_ 9 | 10 | typedef struct { // Data stored PER GLYPH 11 | uint16_t bitmapOffset; // Pointer into GFXfont->bitmap 12 | uint8_t width, height; // Bitmap dimensions in pixels 13 | uint8_t xAdvance; // Distance to advance cursor (x axis) 14 | int8_t xOffset, yOffset; // Dist from cursor pos to UL corner 15 | } GFXglyph; 16 | 17 | typedef struct { // Data stored for FONT AS A WHOLE: 18 | uint8_t *bitmap; // Glyph bitmaps, concatenated 19 | GFXglyph *glyph; // Glyph array 20 | uint8_t first, last; // ASCII extents 21 | uint8_t yAdvance; // Newline distance (y axis) 22 | } GFXfont; 23 | 24 | #endif // _GFXFONT_H_ 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ILI9341_ESP32 2 | A fast driver for displays with ILI9341 controller to be used with an ESP32. 3 | 4 | The ESP32 can transfer 64Bytes at once to the SPI bus instead of sending byte for byte. This driver takes usage of that. 5 | 6 | This driver is a work in progress. It will provide an interface fully compatible to Adafruits ILI9341 and GFX library. 7 | 8 | Expect changes and additions regularly. 9 | 10 | ## You want to help? Great. 11 | 12 | Any help is welcome. At the moment the most important thing to do is to check if everything is pixel-correct. 13 | If you find a bug or think that there are things that can be done smarter, faster or smaller, let me know. 14 | 15 | 16 | ## Speed comparison 17 | 18 | | Benchmark | this driver | this driver with HAL-Locks disabled | Adafruits driver with disabled HAL-Locks and HW-SPI | 19 | | --- | --- | --- | --- | 20 | | Screen Fill | 189280 | 104626 (faster) | 662772 (slower) | 21 | | Text | 70418 | 12330 (faster) | 51971 (faster) | 22 | | Lines | 665410 | 105083 (faster) | 511414 (faster) | 23 | | Horz/Vert Lines | 21896 | 9329 (faster) | 55201 (slower) | 24 | | Rectangles (outline) | 17355 | 6336 (faster) | 35831 (slower) | 25 | | Rectangles (filled) | 395414 | 217453 (faster) | 1376127 (slower) | 26 | | Circles (filled) | 312178 | 66635 (faster) | 235643 (faster) | 27 | | Circles (outline) | 675115 | 100625 (faster) | 223025 (faster) | 28 | | Triangles (outline) | 147280 | 32708 (faster) | 162235 (slower) | 29 | | Triangles (filled) | 303023 | 91075 (faster) | 470071 (slower) | 30 | | Rounded Rects (outline) | 185902 | 30606 (faster) | 91688 (faster) | 31 | | Rounded Rects (filled) | 512880 | 250357 (faster) | 1513809 (slower) | 32 | -------------------------------------------------------------------------------- /src/ILI9341_ESP32.h: -------------------------------------------------------------------------------- 1 | #ifndef _ILI9341_ESP32_H_ 2 | #define _ILI9341_ESP32_H_ 3 | 4 | #ifndef ESP32 5 | error("Hardware seems not to be an ESP32 - driver might not work") 6 | #endif 7 | 8 | 9 | #define TFT_WIDTH 240 10 | #define TFT_HEIGHT 320 11 | 12 | #define ILI9341_TFTWIDTH 240 13 | #define ILI9341_TFTHEIGHT 320 14 | 15 | #define ILI9341_NOP 0x00 16 | #define ILI9341_SWRESET 0x01 17 | #define ILI9341_RDDID 0x04 18 | #define ILI9341_RDDST 0x09 19 | 20 | #define ILI9341_SLPIN 0x10 21 | #define ILI9341_SLPOUT 0x11 22 | #define ILI9341_PTLON 0x12 23 | #define ILI9341_NORON 0x13 24 | 25 | #define ILI9341_RDMODE 0x0A 26 | #define ILI9341_RDMADCTL 0x0B 27 | #define ILI9341_RDPIXFMT 0x0C 28 | #define ILI9341_RDIMGFMT 0x0D 29 | #define ILI9341_RDSELFDIAG 0x0F 30 | 31 | #define ILI9341_INVOFF 0x20 32 | #define ILI9341_INVON 0x21 33 | #define ILI9341_GAMMASET 0x26 34 | #define ILI9341_DISPOFF 0x28 35 | #define ILI9341_DISPON 0x29 36 | 37 | #define ILI9341_CASET 0x2A 38 | #define ILI9341_PASET 0x2B 39 | #define ILI9341_RAMWR 0x2C 40 | #define ILI9341_RAMRD 0x2E 41 | 42 | #define ILI9341_PTLAR 0x30 43 | #define ILI9341_MADCTL 0x36 44 | #define ILI9341_PIXFMT 0x3A 45 | 46 | #define ILI9341_FRMCTR1 0xB1 47 | #define ILI9341_FRMCTR2 0xB2 48 | #define ILI9341_FRMCTR3 0xB3 49 | #define ILI9341_INVCTR 0xB4 50 | #define ILI9341_DFUNCTR 0xB6 51 | 52 | #define ILI9341_PWCTR1 0xC0 53 | #define ILI9341_PWCTR2 0xC1 54 | #define ILI9341_PWCTR3 0xC2 55 | #define ILI9341_PWCTR4 0xC3 56 | #define ILI9341_PWCTR5 0xC4 57 | #define ILI9341_VMCTR1 0xC5 58 | #define ILI9341_VMCTR2 0xC7 59 | 60 | #define ILI9341_RDID1 0xDA 61 | #define ILI9341_RDID2 0xDB 62 | #define ILI9341_RDID3 0xDC 63 | #define ILI9341_RDID4 0xDD 64 | 65 | #define ILI9341_GMCTRP1 0xE0 66 | #define ILI9341_GMCTRN1 0xE1 67 | 68 | #define MADCTL_MY 0x80 69 | #define MADCTL_MX 0x40 70 | #define MADCTL_MV 0x20 71 | #define MADCTL_ML 0x10 72 | #define MADCTL_RGB 0x00 73 | #define MADCTL_BGR 0x08 74 | #define MADCTL_MH 0x04 75 | 76 | //definiton of colors 77 | 78 | #define ILI9341_BLACK 0x0000 /* 0, 0, 0 */ 79 | #define ILI9341_NAVY 0x000F /* 0, 0, 128 */ 80 | #define ILI9341_DARKGREEN 0x03E0 /* 0, 128, 0 */ 81 | #define ILI9341_DARKCYAN 0x03EF /* 0, 128, 128 */ 82 | #define ILI9341_MAROON 0x7800 /* 128, 0, 0 */ 83 | #define ILI9341_PURPLE 0x780F /* 128, 0, 128 */ 84 | #define ILI9341_OLIVE 0x7BE0 /* 128, 128, 0 */ 85 | #define ILI9341_LIGHTGREY 0xC618 /* 192, 192, 192 */ 86 | #define ILI9341_DARKGREY 0x7BEF /* 128, 128, 128 */ 87 | #define ILI9341_BLUE 0x001F /* 0, 0, 255 */ 88 | #define ILI9341_GREEN 0x07E0 /* 0, 255, 0 */ 89 | #define ILI9341_CYAN 0x07FF /* 0, 255, 255 */ 90 | #define ILI9341_RED 0xF800 /* 255, 0, 0 */ 91 | #define ILI9341_MAGENTA 0xF81F /* 255, 0, 255 */ 92 | #define ILI9341_YELLOW 0xFFE0 /* 255, 255, 0 */ 93 | #define ILI9341_WHITE 0xFFFF /* 255, 255, 255 */ 94 | #define ILI9341_ORANGE 0xFD20 /* 255, 165, 0 */ 95 | #define ILI9341_GREENYELLOW 0xAFE5 /* 173, 255, 47 */ 96 | #define ILI9341_PINK 0xF81F 97 | 98 | #include "Arduino.h" 99 | #include 100 | #include "gfxfont.h" 101 | #include "glcdfont.c" //default fonts 102 | 103 | class ILI9341_ESP32 : public Print { 104 | public: 105 | ILI9341_ESP32(int8_t mosi, int8_t miso, int8_t clk, int8_t cs, int8_t dc, int8_t reset=0); 106 | void begin(uint32_t busFrequency); //init driveer and set a bus frequency 107 | void begin(); //init driver, sets 20MHz as default bus frequency 108 | void clearDisplay(); 109 | void setRotation(uint8_t m); 110 | void invertDisplay(bool invert); //inverts the screens content 111 | void fillScreen(uint16_t color); //fills screen with a given color 112 | uint8_t readcommand8(uint8_t reg, uint8_t index = 0); 113 | uint16_t color565(uint8_t r, uint8_t g, uint8_t b); 114 | uint16_t height(); //returns the height of this display depending on the current rotation 115 | uint16_t width(); 116 | uint8_t getRotation(void) const; 117 | int16_t getCursorX(void) const; 118 | int16_t getCursorY(void) const; 119 | //pixels 120 | void drawPixel(uint16_t x, uint16_t y, uint16_t color); 121 | //lines 122 | void drawFastVLine(uint16_t x, uint16_t y, uint16_t h, uint16_t color); 123 | void drawFastHLine(uint16_t x, uint16_t y, uint16_t w, uint16_t color); 124 | void drawLine(uint16_t x, uint16_t y, uint16_t x2, uint16_t y2, uint16_t color); 125 | //figures 126 | void drawRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color); 127 | void fillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color); 128 | void drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color); 129 | void fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color); 130 | void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color); 131 | void fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color); 132 | void drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t radius, uint16_t color); 133 | void fillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t radius, uint16_t color); 134 | //bitmaps 135 | void drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color); 136 | void drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bg); 137 | void drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h, uint16_t color); 138 | void drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bg); 139 | void drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color); 140 | void drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bg); 141 | //text and fonts 142 | void setCursor(int16_t x, int16_t y); 143 | void setTextColor(uint16_t color); 144 | void setTextColor(uint16_t color, uint16_t bgcolor); 145 | void setTextSize(uint8_t s); 146 | void setTextWrap(bool wrap); 147 | void cp437(boolean x=true); 148 | void setFont(const GFXfont *f = NULL); 149 | void drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size); 150 | void getTextBounds(char *str, int16_t x, int16_t y, int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h); 151 | void getTextBounds(const __FlashStringHelper *str, int16_t x, int16_t y, int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h); 152 | size_t write(uint8_t); 153 | 154 | private: 155 | uint16_t _width; //internal width, e.g. after rotating the screen 156 | uint16_t _height; //internal height, e.g. after rotating the screen 157 | uint8_t pin_miso, pin_mosi, pin_clk, pin_cs, pin_dc, pin_reset; 158 | uint8_t _rotation; 159 | uint8_t buf[64]; 160 | uint32_t _busFrequency; //bus frequency, ESP32 can do up to 80MHz 161 | 162 | int16_t cursor_x, cursor_y; 163 | int16_t textcolor, textbgcolor; 164 | uint8_t textsize; 165 | boolean _wrap; // If set, 'wrap' text at right edge of display 166 | boolean _cp437; // If set, use correct CP437 charset (default is off) 167 | GFXfont *gfxFont; 168 | 169 | void _writeCommand(uint8_t command); 170 | void _writeData(uint8_t * data, size_t length); 171 | void _writeData(uint8_t data); 172 | void _setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); 173 | void _drawPixels(size_t length); 174 | void _fillBuff(uint16_t color); 175 | void _fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, int16_t delta, uint16_t color); 176 | void _drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, uint16_t color); 177 | void _drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bgcolor, uint8_t size); 178 | }; 179 | 180 | #endif 181 | -------------------------------------------------------------------------------- /src/glcdfont.c: -------------------------------------------------------------------------------- 1 | // This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0. 2 | // See gfxfont.h for newer custom bitmap font info. 3 | 4 | #ifndef FONT5X7_H 5 | #define FONT5X7_H 6 | 7 | #ifdef __AVR__ 8 | #include 9 | #include 10 | #elif defined(ESP8266) 11 | #include 12 | #else 13 | #define PROGMEM 14 | #endif 15 | 16 | // Standard ASCII 5x7 font 17 | 18 | static const unsigned char font[] PROGMEM = { 19 | 0x00, 0x00, 0x00, 0x00, 0x00, 20 | 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 21 | 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 22 | 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 23 | 0x18, 0x3C, 0x7E, 0x3C, 0x18, 24 | 0x1C, 0x57, 0x7D, 0x57, 0x1C, 25 | 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 26 | 0x00, 0x18, 0x3C, 0x18, 0x00, 27 | 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 28 | 0x00, 0x18, 0x24, 0x18, 0x00, 29 | 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 30 | 0x30, 0x48, 0x3A, 0x06, 0x0E, 31 | 0x26, 0x29, 0x79, 0x29, 0x26, 32 | 0x40, 0x7F, 0x05, 0x05, 0x07, 33 | 0x40, 0x7F, 0x05, 0x25, 0x3F, 34 | 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 35 | 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 36 | 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 37 | 0x14, 0x22, 0x7F, 0x22, 0x14, 38 | 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 39 | 0x06, 0x09, 0x7F, 0x01, 0x7F, 40 | 0x00, 0x66, 0x89, 0x95, 0x6A, 41 | 0x60, 0x60, 0x60, 0x60, 0x60, 42 | 0x94, 0xA2, 0xFF, 0xA2, 0x94, 43 | 0x08, 0x04, 0x7E, 0x04, 0x08, 44 | 0x10, 0x20, 0x7E, 0x20, 0x10, 45 | 0x08, 0x08, 0x2A, 0x1C, 0x08, 46 | 0x08, 0x1C, 0x2A, 0x08, 0x08, 47 | 0x1E, 0x10, 0x10, 0x10, 0x10, 48 | 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 49 | 0x30, 0x38, 0x3E, 0x38, 0x30, 50 | 0x06, 0x0E, 0x3E, 0x0E, 0x06, 51 | 0x00, 0x00, 0x00, 0x00, 0x00, 52 | 0x00, 0x00, 0x5F, 0x00, 0x00, 53 | 0x00, 0x07, 0x00, 0x07, 0x00, 54 | 0x14, 0x7F, 0x14, 0x7F, 0x14, 55 | 0x24, 0x2A, 0x7F, 0x2A, 0x12, 56 | 0x23, 0x13, 0x08, 0x64, 0x62, 57 | 0x36, 0x49, 0x56, 0x20, 0x50, 58 | 0x00, 0x08, 0x07, 0x03, 0x00, 59 | 0x00, 0x1C, 0x22, 0x41, 0x00, 60 | 0x00, 0x41, 0x22, 0x1C, 0x00, 61 | 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 62 | 0x08, 0x08, 0x3E, 0x08, 0x08, 63 | 0x00, 0x80, 0x70, 0x30, 0x00, 64 | 0x08, 0x08, 0x08, 0x08, 0x08, 65 | 0x00, 0x00, 0x60, 0x60, 0x00, 66 | 0x20, 0x10, 0x08, 0x04, 0x02, 67 | 0x3E, 0x51, 0x49, 0x45, 0x3E, 68 | 0x00, 0x42, 0x7F, 0x40, 0x00, 69 | 0x72, 0x49, 0x49, 0x49, 0x46, 70 | 0x21, 0x41, 0x49, 0x4D, 0x33, 71 | 0x18, 0x14, 0x12, 0x7F, 0x10, 72 | 0x27, 0x45, 0x45, 0x45, 0x39, 73 | 0x3C, 0x4A, 0x49, 0x49, 0x31, 74 | 0x41, 0x21, 0x11, 0x09, 0x07, 75 | 0x36, 0x49, 0x49, 0x49, 0x36, 76 | 0x46, 0x49, 0x49, 0x29, 0x1E, 77 | 0x00, 0x00, 0x14, 0x00, 0x00, 78 | 0x00, 0x40, 0x34, 0x00, 0x00, 79 | 0x00, 0x08, 0x14, 0x22, 0x41, 80 | 0x14, 0x14, 0x14, 0x14, 0x14, 81 | 0x00, 0x41, 0x22, 0x14, 0x08, 82 | 0x02, 0x01, 0x59, 0x09, 0x06, 83 | 0x3E, 0x41, 0x5D, 0x59, 0x4E, 84 | 0x7C, 0x12, 0x11, 0x12, 0x7C, 85 | 0x7F, 0x49, 0x49, 0x49, 0x36, 86 | 0x3E, 0x41, 0x41, 0x41, 0x22, 87 | 0x7F, 0x41, 0x41, 0x41, 0x3E, 88 | 0x7F, 0x49, 0x49, 0x49, 0x41, 89 | 0x7F, 0x09, 0x09, 0x09, 0x01, 90 | 0x3E, 0x41, 0x41, 0x51, 0x73, 91 | 0x7F, 0x08, 0x08, 0x08, 0x7F, 92 | 0x00, 0x41, 0x7F, 0x41, 0x00, 93 | 0x20, 0x40, 0x41, 0x3F, 0x01, 94 | 0x7F, 0x08, 0x14, 0x22, 0x41, 95 | 0x7F, 0x40, 0x40, 0x40, 0x40, 96 | 0x7F, 0x02, 0x1C, 0x02, 0x7F, 97 | 0x7F, 0x04, 0x08, 0x10, 0x7F, 98 | 0x3E, 0x41, 0x41, 0x41, 0x3E, 99 | 0x7F, 0x09, 0x09, 0x09, 0x06, 100 | 0x3E, 0x41, 0x51, 0x21, 0x5E, 101 | 0x7F, 0x09, 0x19, 0x29, 0x46, 102 | 0x26, 0x49, 0x49, 0x49, 0x32, 103 | 0x03, 0x01, 0x7F, 0x01, 0x03, 104 | 0x3F, 0x40, 0x40, 0x40, 0x3F, 105 | 0x1F, 0x20, 0x40, 0x20, 0x1F, 106 | 0x3F, 0x40, 0x38, 0x40, 0x3F, 107 | 0x63, 0x14, 0x08, 0x14, 0x63, 108 | 0x03, 0x04, 0x78, 0x04, 0x03, 109 | 0x61, 0x59, 0x49, 0x4D, 0x43, 110 | 0x00, 0x7F, 0x41, 0x41, 0x41, 111 | 0x02, 0x04, 0x08, 0x10, 0x20, 112 | 0x00, 0x41, 0x41, 0x41, 0x7F, 113 | 0x04, 0x02, 0x01, 0x02, 0x04, 114 | 0x40, 0x40, 0x40, 0x40, 0x40, 115 | 0x00, 0x03, 0x07, 0x08, 0x00, 116 | 0x20, 0x54, 0x54, 0x78, 0x40, 117 | 0x7F, 0x28, 0x44, 0x44, 0x38, 118 | 0x38, 0x44, 0x44, 0x44, 0x28, 119 | 0x38, 0x44, 0x44, 0x28, 0x7F, 120 | 0x38, 0x54, 0x54, 0x54, 0x18, 121 | 0x00, 0x08, 0x7E, 0x09, 0x02, 122 | 0x18, 0xA4, 0xA4, 0x9C, 0x78, 123 | 0x7F, 0x08, 0x04, 0x04, 0x78, 124 | 0x00, 0x44, 0x7D, 0x40, 0x00, 125 | 0x20, 0x40, 0x40, 0x3D, 0x00, 126 | 0x7F, 0x10, 0x28, 0x44, 0x00, 127 | 0x00, 0x41, 0x7F, 0x40, 0x00, 128 | 0x7C, 0x04, 0x78, 0x04, 0x78, 129 | 0x7C, 0x08, 0x04, 0x04, 0x78, 130 | 0x38, 0x44, 0x44, 0x44, 0x38, 131 | 0xFC, 0x18, 0x24, 0x24, 0x18, 132 | 0x18, 0x24, 0x24, 0x18, 0xFC, 133 | 0x7C, 0x08, 0x04, 0x04, 0x08, 134 | 0x48, 0x54, 0x54, 0x54, 0x24, 135 | 0x04, 0x04, 0x3F, 0x44, 0x24, 136 | 0x3C, 0x40, 0x40, 0x20, 0x7C, 137 | 0x1C, 0x20, 0x40, 0x20, 0x1C, 138 | 0x3C, 0x40, 0x30, 0x40, 0x3C, 139 | 0x44, 0x28, 0x10, 0x28, 0x44, 140 | 0x4C, 0x90, 0x90, 0x90, 0x7C, 141 | 0x44, 0x64, 0x54, 0x4C, 0x44, 142 | 0x00, 0x08, 0x36, 0x41, 0x00, 143 | 0x00, 0x00, 0x77, 0x00, 0x00, 144 | 0x00, 0x41, 0x36, 0x08, 0x00, 145 | 0x02, 0x01, 0x02, 0x04, 0x02, 146 | 0x3C, 0x26, 0x23, 0x26, 0x3C, 147 | 0x1E, 0xA1, 0xA1, 0x61, 0x12, 148 | 0x3A, 0x40, 0x40, 0x20, 0x7A, 149 | 0x38, 0x54, 0x54, 0x55, 0x59, 150 | 0x21, 0x55, 0x55, 0x79, 0x41, 151 | 0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut 152 | 0x21, 0x55, 0x54, 0x78, 0x40, 153 | 0x20, 0x54, 0x55, 0x79, 0x40, 154 | 0x0C, 0x1E, 0x52, 0x72, 0x12, 155 | 0x39, 0x55, 0x55, 0x55, 0x59, 156 | 0x39, 0x54, 0x54, 0x54, 0x59, 157 | 0x39, 0x55, 0x54, 0x54, 0x58, 158 | 0x00, 0x00, 0x45, 0x7C, 0x41, 159 | 0x00, 0x02, 0x45, 0x7D, 0x42, 160 | 0x00, 0x01, 0x45, 0x7C, 0x40, 161 | 0x7D, 0x12, 0x11, 0x12, 0x7D, // A-umlaut 162 | 0xF0, 0x28, 0x25, 0x28, 0xF0, 163 | 0x7C, 0x54, 0x55, 0x45, 0x00, 164 | 0x20, 0x54, 0x54, 0x7C, 0x54, 165 | 0x7C, 0x0A, 0x09, 0x7F, 0x49, 166 | 0x32, 0x49, 0x49, 0x49, 0x32, 167 | 0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut 168 | 0x32, 0x4A, 0x48, 0x48, 0x30, 169 | 0x3A, 0x41, 0x41, 0x21, 0x7A, 170 | 0x3A, 0x42, 0x40, 0x20, 0x78, 171 | 0x00, 0x9D, 0xA0, 0xA0, 0x7D, 172 | 0x3D, 0x42, 0x42, 0x42, 0x3D, // O-umlaut 173 | 0x3D, 0x40, 0x40, 0x40, 0x3D, 174 | 0x3C, 0x24, 0xFF, 0x24, 0x24, 175 | 0x48, 0x7E, 0x49, 0x43, 0x66, 176 | 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, 177 | 0xFF, 0x09, 0x29, 0xF6, 0x20, 178 | 0xC0, 0x88, 0x7E, 0x09, 0x03, 179 | 0x20, 0x54, 0x54, 0x79, 0x41, 180 | 0x00, 0x00, 0x44, 0x7D, 0x41, 181 | 0x30, 0x48, 0x48, 0x4A, 0x32, 182 | 0x38, 0x40, 0x40, 0x22, 0x7A, 183 | 0x00, 0x7A, 0x0A, 0x0A, 0x72, 184 | 0x7D, 0x0D, 0x19, 0x31, 0x7D, 185 | 0x26, 0x29, 0x29, 0x2F, 0x28, 186 | 0x26, 0x29, 0x29, 0x29, 0x26, 187 | 0x30, 0x48, 0x4D, 0x40, 0x20, 188 | 0x38, 0x08, 0x08, 0x08, 0x08, 189 | 0x08, 0x08, 0x08, 0x08, 0x38, 190 | 0x2F, 0x10, 0xC8, 0xAC, 0xBA, 191 | 0x2F, 0x10, 0x28, 0x34, 0xFA, 192 | 0x00, 0x00, 0x7B, 0x00, 0x00, 193 | 0x08, 0x14, 0x2A, 0x14, 0x22, 194 | 0x22, 0x14, 0x2A, 0x14, 0x08, 195 | 0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code 196 | 0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block 197 | 0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block 198 | 0x00, 0x00, 0x00, 0xFF, 0x00, 199 | 0x10, 0x10, 0x10, 0xFF, 0x00, 200 | 0x14, 0x14, 0x14, 0xFF, 0x00, 201 | 0x10, 0x10, 0xFF, 0x00, 0xFF, 202 | 0x10, 0x10, 0xF0, 0x10, 0xF0, 203 | 0x14, 0x14, 0x14, 0xFC, 0x00, 204 | 0x14, 0x14, 0xF7, 0x00, 0xFF, 205 | 0x00, 0x00, 0xFF, 0x00, 0xFF, 206 | 0x14, 0x14, 0xF4, 0x04, 0xFC, 207 | 0x14, 0x14, 0x17, 0x10, 0x1F, 208 | 0x10, 0x10, 0x1F, 0x10, 0x1F, 209 | 0x14, 0x14, 0x14, 0x1F, 0x00, 210 | 0x10, 0x10, 0x10, 0xF0, 0x00, 211 | 0x00, 0x00, 0x00, 0x1F, 0x10, 212 | 0x10, 0x10, 0x10, 0x1F, 0x10, 213 | 0x10, 0x10, 0x10, 0xF0, 0x10, 214 | 0x00, 0x00, 0x00, 0xFF, 0x10, 215 | 0x10, 0x10, 0x10, 0x10, 0x10, 216 | 0x10, 0x10, 0x10, 0xFF, 0x10, 217 | 0x00, 0x00, 0x00, 0xFF, 0x14, 218 | 0x00, 0x00, 0xFF, 0x00, 0xFF, 219 | 0x00, 0x00, 0x1F, 0x10, 0x17, 220 | 0x00, 0x00, 0xFC, 0x04, 0xF4, 221 | 0x14, 0x14, 0x17, 0x10, 0x17, 222 | 0x14, 0x14, 0xF4, 0x04, 0xF4, 223 | 0x00, 0x00, 0xFF, 0x00, 0xF7, 224 | 0x14, 0x14, 0x14, 0x14, 0x14, 225 | 0x14, 0x14, 0xF7, 0x00, 0xF7, 226 | 0x14, 0x14, 0x14, 0x17, 0x14, 227 | 0x10, 0x10, 0x1F, 0x10, 0x1F, 228 | 0x14, 0x14, 0x14, 0xF4, 0x14, 229 | 0x10, 0x10, 0xF0, 0x10, 0xF0, 230 | 0x00, 0x00, 0x1F, 0x10, 0x1F, 231 | 0x00, 0x00, 0x00, 0x1F, 0x14, 232 | 0x00, 0x00, 0x00, 0xFC, 0x14, 233 | 0x00, 0x00, 0xF0, 0x10, 0xF0, 234 | 0x10, 0x10, 0xFF, 0x10, 0xFF, 235 | 0x14, 0x14, 0x14, 0xFF, 0x14, 236 | 0x10, 0x10, 0x10, 0x1F, 0x00, 237 | 0x00, 0x00, 0x00, 0xF0, 0x10, 238 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 239 | 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 240 | 0xFF, 0xFF, 0xFF, 0x00, 0x00, 241 | 0x00, 0x00, 0x00, 0xFF, 0xFF, 242 | 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 243 | 0x38, 0x44, 0x44, 0x38, 0x44, 244 | 0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta 245 | 0x7E, 0x02, 0x02, 0x06, 0x06, 246 | 0x02, 0x7E, 0x02, 0x7E, 0x02, 247 | 0x63, 0x55, 0x49, 0x41, 0x63, 248 | 0x38, 0x44, 0x44, 0x3C, 0x04, 249 | 0x40, 0x7E, 0x20, 0x1E, 0x20, 250 | 0x06, 0x02, 0x7E, 0x02, 0x02, 251 | 0x99, 0xA5, 0xE7, 0xA5, 0x99, 252 | 0x1C, 0x2A, 0x49, 0x2A, 0x1C, 253 | 0x4C, 0x72, 0x01, 0x72, 0x4C, 254 | 0x30, 0x4A, 0x4D, 0x4D, 0x30, 255 | 0x30, 0x48, 0x78, 0x48, 0x30, 256 | 0xBC, 0x62, 0x5A, 0x46, 0x3D, 257 | 0x3E, 0x49, 0x49, 0x49, 0x00, 258 | 0x7E, 0x01, 0x01, 0x01, 0x7E, 259 | 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 260 | 0x44, 0x44, 0x5F, 0x44, 0x44, 261 | 0x40, 0x51, 0x4A, 0x44, 0x40, 262 | 0x40, 0x44, 0x4A, 0x51, 0x40, 263 | 0x00, 0x00, 0xFF, 0x01, 0x03, 264 | 0xE0, 0x80, 0xFF, 0x00, 0x00, 265 | 0x08, 0x08, 0x6B, 0x6B, 0x08, 266 | 0x36, 0x12, 0x36, 0x24, 0x36, 267 | 0x06, 0x0F, 0x09, 0x0F, 0x06, 268 | 0x00, 0x00, 0x18, 0x18, 0x00, 269 | 0x00, 0x00, 0x10, 0x10, 0x00, 270 | 0x30, 0x40, 0xFF, 0x01, 0x01, 271 | 0x00, 0x1F, 0x01, 0x01, 0x1E, 272 | 0x00, 0x19, 0x1D, 0x17, 0x12, 273 | 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 274 | 0x00, 0x00, 0x00, 0x00, 0x00 // #255 NBSP 275 | }; 276 | #endif // FONT5X7_H 277 | -------------------------------------------------------------------------------- /src/Fonts/FreeSans12pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeSans12pt7bBitmaps[] PROGMEM = { 2 | 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xCF, 0x3C, 0xF3, 0x8A, 0x20, 0x06, 0x30, 3 | 0x31, 0x03, 0x18, 0x18, 0xC7, 0xFF, 0xBF, 0xFC, 0x31, 0x03, 0x18, 0x18, 4 | 0xC7, 0xFF, 0xBF, 0xFC, 0x31, 0x01, 0x18, 0x18, 0xC0, 0xC6, 0x06, 0x30, 5 | 0x04, 0x03, 0xE1, 0xFF, 0x72, 0x6C, 0x47, 0x88, 0xF1, 0x07, 0x20, 0x7E, 6 | 0x03, 0xF0, 0x17, 0x02, 0x3C, 0x47, 0x88, 0xF1, 0x1B, 0x26, 0x7F, 0xC3, 7 | 0xE0, 0x10, 0x02, 0x00, 0x00, 0x06, 0x03, 0xC0, 0x40, 0x7E, 0x0C, 0x0E, 8 | 0x70, 0x80, 0xC3, 0x18, 0x0C, 0x31, 0x00, 0xE7, 0x30, 0x07, 0xE6, 0x00, 9 | 0x3C, 0x40, 0x00, 0x0C, 0x7C, 0x00, 0x8F, 0xE0, 0x19, 0xC7, 0x01, 0x18, 10 | 0x30, 0x31, 0x83, 0x02, 0x1C, 0x70, 0x40, 0xFE, 0x04, 0x07, 0xC0, 0x0F, 11 | 0x00, 0x7E, 0x03, 0x9C, 0x0C, 0x30, 0x30, 0xC0, 0xE7, 0x01, 0xF8, 0x03, 12 | 0x80, 0x3E, 0x01, 0xCC, 0x6E, 0x19, 0xB0, 0x7C, 0xC0, 0xF3, 0x03, 0xCE, 13 | 0x1F, 0x9F, 0xE6, 0x1E, 0x1C, 0xFF, 0xA0, 0x08, 0x8C, 0x66, 0x31, 0x98, 14 | 0xC6, 0x31, 0x8C, 0x63, 0x08, 0x63, 0x08, 0x61, 0x0C, 0x20, 0x82, 0x18, 15 | 0xC3, 0x18, 0xC3, 0x18, 0xC6, 0x31, 0x8C, 0x62, 0x31, 0x88, 0xC4, 0x62, 16 | 0x00, 0x10, 0x23, 0x5B, 0xE3, 0x8D, 0x91, 0x00, 0x0C, 0x03, 0x00, 0xC0, 17 | 0x30, 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0xF5, 0x60, 18 | 0xFF, 0xF0, 0xF0, 0x02, 0x0C, 0x10, 0x20, 0xC1, 0x02, 0x0C, 0x10, 0x20, 19 | 0xC1, 0x02, 0x0C, 0x10, 0x20, 0xC1, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x30, 20 | 0x6E, 0x0F, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 21 | 0x0E, 0xC1, 0x9C, 0x71, 0xFC, 0x1F, 0x00, 0x08, 0xCF, 0xFF, 0x8C, 0x63, 22 | 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0x1F, 0x0F, 0xF9, 0x87, 0x60, 0x7C, 23 | 0x06, 0x00, 0xC0, 0x18, 0x07, 0x01, 0xC0, 0xF0, 0x78, 0x1C, 0x06, 0x00, 24 | 0x80, 0x30, 0x07, 0xFF, 0xFF, 0xE0, 0x3F, 0x0F, 0xF3, 0x87, 0x60, 0x6C, 25 | 0x0C, 0x01, 0x80, 0x70, 0x7C, 0x0F, 0x80, 0x18, 0x01, 0x80, 0x3C, 0x07, 26 | 0x80, 0xD8, 0x73, 0xFC, 0x1F, 0x00, 0x01, 0x80, 0x70, 0x0E, 0x03, 0xC0, 27 | 0xD8, 0x1B, 0x06, 0x61, 0x8C, 0x21, 0x8C, 0x33, 0x06, 0x7F, 0xFF, 0xFE, 28 | 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x3F, 0xCF, 0xF9, 0x80, 0x30, 0x06, 29 | 0x00, 0xDE, 0x1F, 0xE7, 0x0E, 0x00, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x07, 30 | 0x81, 0xF8, 0x73, 0xFC, 0x1F, 0x00, 0x0F, 0x07, 0xF9, 0xC3, 0x30, 0x74, 31 | 0x01, 0x80, 0x33, 0xC7, 0xFE, 0xF0, 0xDC, 0x1F, 0x01, 0xE0, 0x3C, 0x06, 32 | 0xC1, 0xDC, 0x71, 0xFC, 0x1F, 0x00, 0xFF, 0xFF, 0xFC, 0x01, 0x00, 0x60, 33 | 0x18, 0x02, 0x00, 0xC0, 0x30, 0x06, 0x01, 0x80, 0x30, 0x04, 0x01, 0x80, 34 | 0x30, 0x06, 0x01, 0x80, 0x30, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x30, 0x66, 35 | 0x0C, 0xC1, 0x8C, 0x61, 0xFC, 0x3F, 0x8E, 0x3B, 0x01, 0xE0, 0x3C, 0x07, 36 | 0x80, 0xD8, 0x31, 0xFC, 0x1F, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x6C, 37 | 0x07, 0x80, 0xF0, 0x1E, 0x07, 0x61, 0xEF, 0xFC, 0x79, 0x80, 0x30, 0x05, 38 | 0x81, 0x98, 0x73, 0xFC, 0x1E, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0xF0, 0x00, 39 | 0x0F, 0x56, 0x00, 0x00, 0x07, 0x01, 0xE0, 0xF8, 0x3C, 0x0F, 0x00, 0xE0, 40 | 0x07, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0x00, 41 | 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x0E, 0x00, 0x78, 0x01, 0xF0, 0x07, 42 | 0xC0, 0x0F, 0x00, 0x70, 0x1E, 0x0F, 0x03, 0xC0, 0xF0, 0x08, 0x00, 0x1F, 43 | 0x1F, 0xEE, 0x1B, 0x03, 0xC0, 0xC0, 0x30, 0x0C, 0x06, 0x03, 0x81, 0xC0, 44 | 0xE0, 0x30, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x03, 0x00, 0x00, 0xFE, 45 | 0x00, 0x0F, 0xFE, 0x00, 0xF0, 0x3E, 0x07, 0x00, 0x3C, 0x38, 0x00, 0x30, 46 | 0xC1, 0xE0, 0x66, 0x0F, 0xD9, 0xD8, 0x61, 0xC3, 0xC3, 0x07, 0x0F, 0x1C, 47 | 0x1C, 0x3C, 0x60, 0x60, 0xF1, 0x81, 0x83, 0xC6, 0x06, 0x1B, 0x18, 0x38, 48 | 0xEE, 0x71, 0xE7, 0x18, 0xFD, 0xF8, 0x71, 0xE7, 0xC0, 0xE0, 0x00, 0x01, 49 | 0xE0, 0x00, 0x01, 0xFF, 0xC0, 0x01, 0xFC, 0x00, 0x03, 0xC0, 0x03, 0xC0, 50 | 0x03, 0xC0, 0x07, 0xE0, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0x0C, 0x30, 51 | 0x0C, 0x30, 0x1C, 0x38, 0x18, 0x18, 0x1F, 0xF8, 0x3F, 0xFC, 0x30, 0x1C, 52 | 0x30, 0x0C, 0x70, 0x0E, 0x60, 0x06, 0x60, 0x06, 0xFF, 0xC7, 0xFF, 0x30, 53 | 0x19, 0x80, 0x6C, 0x03, 0x60, 0x1B, 0x00, 0xD8, 0x0C, 0xFF, 0xC7, 0xFF, 54 | 0x30, 0x0D, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x06, 0xFF, 0xF7, 55 | 0xFE, 0x00, 0x07, 0xE0, 0x3F, 0xF0, 0xE0, 0x73, 0x80, 0x66, 0x00, 0x6C, 56 | 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, 0x00, 57 | 0x06, 0x00, 0x6C, 0x00, 0xDC, 0x03, 0x1E, 0x0E, 0x1F, 0xF8, 0x0F, 0xC0, 58 | 0xFF, 0x83, 0xFF, 0x8C, 0x07, 0x30, 0x0E, 0xC0, 0x1B, 0x00, 0x7C, 0x00, 59 | 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1F, 0x00, 60 | 0x6C, 0x03, 0xB0, 0x1C, 0xFF, 0xE3, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xC0, 61 | 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFF, 0xEF, 0xFE, 0xC0, 62 | 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 63 | 0xFF, 0xFF, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xFF, 0xDF, 64 | 0xFB, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x00, 65 | 0x07, 0xF0, 0x1F, 0xFC, 0x3C, 0x1E, 0x70, 0x06, 0x60, 0x03, 0xE0, 0x00, 66 | 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x7F, 0xC0, 0x7F, 0xC0, 0x03, 0xC0, 0x03, 67 | 0x60, 0x03, 0x60, 0x07, 0x30, 0x0F, 0x3C, 0x1F, 0x1F, 0xFB, 0x07, 0xE1, 68 | 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 69 | 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 70 | 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 71 | 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 72 | 0x3C, 0x1E, 0x0F, 0x07, 0xC7, 0x7F, 0x1F, 0x00, 0xC0, 0x3B, 0x01, 0xCC, 73 | 0x0E, 0x30, 0x70, 0xC3, 0x83, 0x1C, 0x0C, 0xE0, 0x33, 0x80, 0xDE, 0x03, 74 | 0xDC, 0x0E, 0x38, 0x30, 0x60, 0xC1, 0xC3, 0x03, 0x8C, 0x06, 0x30, 0x1C, 75 | 0xC0, 0x3B, 0x00, 0x60, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 76 | 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 77 | 0xFF, 0xFF, 0xF0, 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0F, 0xF0, 0x0F, 0xD0, 78 | 0x0F, 0xD8, 0x1B, 0xD8, 0x1B, 0xD8, 0x1B, 0xCC, 0x33, 0xCC, 0x33, 0xCC, 79 | 0x33, 0xC6, 0x63, 0xC6, 0x63, 0xC6, 0x63, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 80 | 0xC3, 0xC1, 0x83, 0xE0, 0x1F, 0x00, 0xFC, 0x07, 0xE0, 0x3D, 0x81, 0xEE, 81 | 0x0F, 0x30, 0x79, 0xC3, 0xC6, 0x1E, 0x18, 0xF0, 0xE7, 0x83, 0x3C, 0x1D, 82 | 0xE0, 0x6F, 0x01, 0xF8, 0x0F, 0xC0, 0x3E, 0x01, 0xC0, 0x03, 0xE0, 0x0F, 83 | 0xFC, 0x0F, 0x07, 0x86, 0x00, 0xC6, 0x00, 0x33, 0x00, 0x1B, 0x00, 0x07, 84 | 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x36, 0x00, 85 | 0x33, 0x00, 0x18, 0xC0, 0x18, 0x78, 0x3C, 0x1F, 0xFC, 0x03, 0xF8, 0x00, 86 | 0xFF, 0x8F, 0xFE, 0xC0, 0x6C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x07, 87 | 0xFF, 0xEF, 0xFC, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 88 | 0xC0, 0x0C, 0x00, 0x03, 0xE0, 0x0F, 0xFC, 0x0F, 0x07, 0x86, 0x00, 0xC6, 89 | 0x00, 0x33, 0x00, 0x1B, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 90 | 0xF0, 0x00, 0x78, 0x00, 0x36, 0x00, 0x33, 0x01, 0x98, 0xC0, 0xFC, 0x78, 91 | 0x3C, 0x1F, 0xFF, 0x03, 0xF9, 0x80, 0x00, 0x40, 0xFF, 0xC3, 0xFF, 0xCC, 92 | 0x03, 0xB0, 0x06, 0xC0, 0x1B, 0x00, 0x6C, 0x01, 0xB0, 0x0C, 0xFF, 0xE3, 93 | 0xFF, 0xCC, 0x03, 0xB0, 0x06, 0xC0, 0x1B, 0x00, 0x6C, 0x01, 0xB0, 0x06, 94 | 0xC0, 0x1B, 0x00, 0x70, 0x0F, 0xE0, 0x7F, 0xC3, 0x83, 0x9C, 0x07, 0x60, 95 | 0x0D, 0x80, 0x06, 0x00, 0x1E, 0x00, 0x3F, 0x80, 0x3F, 0xC0, 0x0F, 0x80, 96 | 0x07, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0xDE, 0x0E, 0x3F, 0xF0, 0x3F, 0x80, 97 | 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 98 | 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 99 | 0x06, 0x00, 0x60, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 100 | 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 101 | 0xE0, 0x0F, 0x80, 0xEE, 0x0E, 0x3F, 0xE0, 0x7C, 0x00, 0x60, 0x06, 0xC0, 102 | 0x1D, 0xC0, 0x31, 0x80, 0x63, 0x01, 0xC7, 0x03, 0x06, 0x06, 0x0C, 0x1C, 103 | 0x1C, 0x30, 0x18, 0x60, 0x31, 0xC0, 0x73, 0x00, 0x66, 0x00, 0xDC, 0x01, 104 | 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0xE0, 0x30, 0x1D, 0x80, 0xE0, 105 | 0x76, 0x07, 0x81, 0xD8, 0x1E, 0x06, 0x70, 0x7C, 0x18, 0xC1, 0xB0, 0xE3, 106 | 0x0C, 0xC3, 0x8C, 0x33, 0x0C, 0x38, 0xC6, 0x30, 0x67, 0x18, 0xC1, 0x98, 107 | 0x67, 0x06, 0x61, 0xD8, 0x1D, 0x83, 0x60, 0x3C, 0x0D, 0x80, 0xF0, 0x3E, 108 | 0x03, 0xC0, 0x70, 0x0F, 0x01, 0xC0, 0x18, 0x07, 0x00, 0x70, 0x0E, 0x60, 109 | 0x38, 0xE0, 0x60, 0xE1, 0xC0, 0xC3, 0x01, 0xCC, 0x01, 0xF8, 0x01, 0xE0, 110 | 0x03, 0x80, 0x07, 0x80, 0x1F, 0x00, 0x33, 0x00, 0xE7, 0x03, 0x86, 0x06, 111 | 0x0E, 0x1C, 0x0E, 0x70, 0x0C, 0xC0, 0x1C, 0x60, 0x06, 0x70, 0x0E, 0x30, 112 | 0x1C, 0x38, 0x18, 0x1C, 0x38, 0x0C, 0x30, 0x0E, 0x70, 0x06, 0x60, 0x03, 113 | 0xC0, 0x03, 0xC0, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 114 | 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0x0E, 115 | 0x00, 0xE0, 0x0E, 0x00, 0x60, 0x07, 0x00, 0x70, 0x07, 0x00, 0x30, 0x03, 116 | 0x80, 0x38, 0x03, 0x80, 0x18, 0x01, 0xC0, 0x1C, 0x00, 0xFF, 0xFF, 0xFF, 117 | 0xC0, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, 118 | 0xF0, 0x81, 0x81, 0x02, 0x06, 0x04, 0x08, 0x18, 0x10, 0x20, 0x60, 0x40, 119 | 0x81, 0x81, 0x02, 0x06, 0x04, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 120 | 0x33, 0x33, 0x33, 0x3F, 0xF0, 0x0C, 0x0E, 0x05, 0x86, 0xC3, 0x21, 0x19, 121 | 0x8C, 0x83, 0xC1, 0x80, 0xFF, 0xFE, 0xE3, 0x8C, 0x30, 0x3F, 0x07, 0xF8, 122 | 0xE1, 0xCC, 0x0C, 0x00, 0xC0, 0x1C, 0x3F, 0xCF, 0x8C, 0xC0, 0xCC, 0x0C, 123 | 0xE3, 0xC7, 0xEF, 0x3C, 0x70, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 124 | 0x0C, 0xF8, 0xDF, 0xCF, 0x0E, 0xE0, 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 125 | 0x3C, 0x03, 0xE0, 0x6F, 0x0E, 0xDF, 0xCC, 0xF8, 0x1F, 0x0F, 0xE7, 0x1B, 126 | 0x83, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x38, 0x37, 0x1C, 0xFE, 0x1F, 127 | 0x00, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x3C, 0xCF, 0xFB, 0x8F, 128 | 0xE0, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF8, 0x3B, 0x8F, 0x3F, 129 | 0x63, 0xCC, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x3C, 0x07, 0xFF, 0xFF, 0xFE, 130 | 0x00, 0xC0, 0x1C, 0x0D, 0xC3, 0x1F, 0xE1, 0xF0, 0x3B, 0xD8, 0xC6, 0x7F, 131 | 0xEC, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x00, 0x1E, 0x67, 0xFD, 0xC7, 132 | 0xF0, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x7C, 0x1D, 0xC7, 0x9F, 133 | 0xB1, 0xE6, 0x00, 0xC0, 0x3E, 0x0E, 0x7F, 0xC7, 0xE0, 0xC0, 0x30, 0x0C, 134 | 0x03, 0x00, 0xC0, 0x33, 0xCD, 0xFB, 0xC7, 0xE0, 0xF0, 0x3C, 0x0F, 0x03, 135 | 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x30, 0xF0, 0x3F, 0xFF, 0xFF, 136 | 0xF0, 0x33, 0x00, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 137 | 0xE0, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x83, 0x30, 0xC6, 0x30, 138 | 0xCC, 0x1B, 0x83, 0xF0, 0x77, 0x0C, 0x61, 0x8E, 0x30, 0xE6, 0x0C, 0xC1, 139 | 0xD8, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xCF, 0x1F, 0x6F, 0xDF, 0xFC, 140 | 0x78, 0xFC, 0x18, 0x3C, 0x0C, 0x1E, 0x06, 0x0F, 0x03, 0x07, 0x81, 0x83, 141 | 0xC0, 0xC1, 0xE0, 0x60, 0xF0, 0x30, 0x78, 0x18, 0x3C, 0x0C, 0x18, 0xCF, 142 | 0x37, 0xEF, 0x1F, 0x83, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 143 | 0x0F, 0x03, 0xC0, 0xC0, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80, 144 | 0xF0, 0x1E, 0x03, 0xC0, 0x7C, 0x1D, 0xC7, 0x1F, 0xC1, 0xF0, 0xCF, 0x8D, 145 | 0xFC, 0xF0, 0xEE, 0x06, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3E, 146 | 0x07, 0xF0, 0xEF, 0xFC, 0xCF, 0x8C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x00, 147 | 0x1E, 0x67, 0xFD, 0xC7, 0xF0, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 148 | 0x7C, 0x1D, 0xC7, 0x9F, 0xF1, 0xE6, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 149 | 0xCF, 0x7F, 0x38, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC0, 0x3E, 0x1F, 150 | 0xEE, 0x1B, 0x00, 0xC0, 0x3C, 0x07, 0xF0, 0x3E, 0x01, 0xF0, 0x3E, 0x1D, 151 | 0xFE, 0x3E, 0x00, 0x63, 0x19, 0xFF, 0xB1, 0x8C, 0x63, 0x18, 0xC6, 0x31, 152 | 0xE7, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 153 | 0xF0, 0x7E, 0x3D, 0xFB, 0x3C, 0xC0, 0xE0, 0x66, 0x06, 0x60, 0x67, 0x0C, 154 | 0x30, 0xC3, 0x0C, 0x39, 0x81, 0x98, 0x19, 0x81, 0xF0, 0x0F, 0x00, 0xE0, 155 | 0x0E, 0x00, 0xC1, 0xC1, 0xB0, 0xE1, 0xD8, 0x70, 0xCC, 0x2C, 0x66, 0x36, 156 | 0x31, 0x9B, 0x18, 0xCD, 0x98, 0x64, 0x6C, 0x16, 0x36, 0x0F, 0x1A, 0x07, 157 | 0x8F, 0x03, 0x83, 0x80, 0xC1, 0xC0, 0x60, 0xEE, 0x18, 0xC6, 0x0C, 0xC1, 158 | 0xF0, 0x1C, 0x01, 0x80, 0x78, 0x1B, 0x03, 0x30, 0xC7, 0x30, 0x66, 0x06, 159 | 0xE0, 0x6C, 0x0D, 0x83, 0x38, 0x63, 0x0C, 0x63, 0x0E, 0x60, 0xCC, 0x1B, 160 | 0x03, 0x60, 0x3C, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00, 0xE0, 0x78, 0x0E, 161 | 0x00, 0xFF, 0xFF, 0xF0, 0x18, 0x0C, 0x07, 0x03, 0x81, 0xC0, 0x60, 0x30, 162 | 0x18, 0x0E, 0x03, 0xFF, 0xFF, 0xC0, 0x19, 0xCC, 0x63, 0x18, 0xC6, 0x31, 163 | 0x99, 0x86, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x1C, 0x60, 0xFF, 0xFF, 0xFF, 164 | 0xFF, 0xFF, 0xFC, 0xC7, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x0C, 0x33, 0x31, 165 | 0x8C, 0x63, 0x18, 0xC6, 0x73, 0x00, 0x70, 0x3E, 0x09, 0xE4, 0x1F, 0x03, 166 | 0x80 }; 167 | 168 | const GFXglyph FreeSans12pt7bGlyphs[] PROGMEM = { 169 | { 0, 0, 0, 6, 0, 1 }, // 0x20 ' ' 170 | { 0, 2, 18, 8, 3, -17 }, // 0x21 '!' 171 | { 5, 6, 6, 8, 1, -16 }, // 0x22 '"' 172 | { 10, 13, 16, 13, 0, -15 }, // 0x23 '#' 173 | { 36, 11, 20, 13, 1, -17 }, // 0x24 '$' 174 | { 64, 20, 17, 21, 1, -16 }, // 0x25 '%' 175 | { 107, 14, 17, 16, 1, -16 }, // 0x26 '&' 176 | { 137, 2, 6, 5, 1, -16 }, // 0x27 ''' 177 | { 139, 5, 23, 8, 2, -17 }, // 0x28 '(' 178 | { 154, 5, 23, 8, 1, -17 }, // 0x29 ')' 179 | { 169, 7, 7, 9, 1, -17 }, // 0x2A '*' 180 | { 176, 10, 11, 14, 2, -10 }, // 0x2B '+' 181 | { 190, 2, 6, 7, 2, -1 }, // 0x2C ',' 182 | { 192, 6, 2, 8, 1, -7 }, // 0x2D '-' 183 | { 194, 2, 2, 6, 2, -1 }, // 0x2E '.' 184 | { 195, 7, 18, 7, 0, -17 }, // 0x2F '/' 185 | { 211, 11, 17, 13, 1, -16 }, // 0x30 '0' 186 | { 235, 5, 17, 13, 3, -16 }, // 0x31 '1' 187 | { 246, 11, 17, 13, 1, -16 }, // 0x32 '2' 188 | { 270, 11, 17, 13, 1, -16 }, // 0x33 '3' 189 | { 294, 11, 17, 13, 1, -16 }, // 0x34 '4' 190 | { 318, 11, 17, 13, 1, -16 }, // 0x35 '5' 191 | { 342, 11, 17, 13, 1, -16 }, // 0x36 '6' 192 | { 366, 11, 17, 13, 1, -16 }, // 0x37 '7' 193 | { 390, 11, 17, 13, 1, -16 }, // 0x38 '8' 194 | { 414, 11, 17, 13, 1, -16 }, // 0x39 '9' 195 | { 438, 2, 13, 6, 2, -12 }, // 0x3A ':' 196 | { 442, 2, 16, 6, 2, -11 }, // 0x3B ';' 197 | { 446, 12, 12, 14, 1, -11 }, // 0x3C '<' 198 | { 464, 12, 6, 14, 1, -8 }, // 0x3D '=' 199 | { 473, 12, 12, 14, 1, -11 }, // 0x3E '>' 200 | { 491, 10, 18, 13, 2, -17 }, // 0x3F '?' 201 | { 514, 22, 21, 24, 1, -17 }, // 0x40 '@' 202 | { 572, 16, 18, 16, 0, -17 }, // 0x41 'A' 203 | { 608, 13, 18, 16, 2, -17 }, // 0x42 'B' 204 | { 638, 15, 18, 17, 1, -17 }, // 0x43 'C' 205 | { 672, 14, 18, 17, 2, -17 }, // 0x44 'D' 206 | { 704, 12, 18, 15, 2, -17 }, // 0x45 'E' 207 | { 731, 11, 18, 14, 2, -17 }, // 0x46 'F' 208 | { 756, 16, 18, 18, 1, -17 }, // 0x47 'G' 209 | { 792, 13, 18, 17, 2, -17 }, // 0x48 'H' 210 | { 822, 2, 18, 7, 2, -17 }, // 0x49 'I' 211 | { 827, 9, 18, 13, 1, -17 }, // 0x4A 'J' 212 | { 848, 14, 18, 16, 2, -17 }, // 0x4B 'K' 213 | { 880, 10, 18, 14, 2, -17 }, // 0x4C 'L' 214 | { 903, 16, 18, 20, 2, -17 }, // 0x4D 'M' 215 | { 939, 13, 18, 18, 2, -17 }, // 0x4E 'N' 216 | { 969, 17, 18, 19, 1, -17 }, // 0x4F 'O' 217 | { 1008, 12, 18, 16, 2, -17 }, // 0x50 'P' 218 | { 1035, 17, 19, 19, 1, -17 }, // 0x51 'Q' 219 | { 1076, 14, 18, 17, 2, -17 }, // 0x52 'R' 220 | { 1108, 14, 18, 16, 1, -17 }, // 0x53 'S' 221 | { 1140, 12, 18, 15, 1, -17 }, // 0x54 'T' 222 | { 1167, 13, 18, 17, 2, -17 }, // 0x55 'U' 223 | { 1197, 15, 18, 15, 0, -17 }, // 0x56 'V' 224 | { 1231, 22, 18, 22, 0, -17 }, // 0x57 'W' 225 | { 1281, 15, 18, 16, 0, -17 }, // 0x58 'X' 226 | { 1315, 16, 18, 16, 0, -17 }, // 0x59 'Y' 227 | { 1351, 13, 18, 15, 1, -17 }, // 0x5A 'Z' 228 | { 1381, 4, 23, 7, 2, -17 }, // 0x5B '[' 229 | { 1393, 7, 18, 7, 0, -17 }, // 0x5C '\' 230 | { 1409, 4, 23, 7, 1, -17 }, // 0x5D ']' 231 | { 1421, 9, 9, 11, 1, -16 }, // 0x5E '^' 232 | { 1432, 15, 1, 13, -1, 4 }, // 0x5F '_' 233 | { 1434, 5, 4, 6, 1, -17 }, // 0x60 '`' 234 | { 1437, 12, 13, 13, 1, -12 }, // 0x61 'a' 235 | { 1457, 12, 18, 13, 1, -17 }, // 0x62 'b' 236 | { 1484, 10, 13, 12, 1, -12 }, // 0x63 'c' 237 | { 1501, 11, 18, 13, 1, -17 }, // 0x64 'd' 238 | { 1526, 11, 13, 13, 1, -12 }, // 0x65 'e' 239 | { 1544, 5, 18, 7, 1, -17 }, // 0x66 'f' 240 | { 1556, 11, 18, 13, 1, -12 }, // 0x67 'g' 241 | { 1581, 10, 18, 13, 1, -17 }, // 0x68 'h' 242 | { 1604, 2, 18, 5, 2, -17 }, // 0x69 'i' 243 | { 1609, 4, 23, 6, 0, -17 }, // 0x6A 'j' 244 | { 1621, 11, 18, 12, 1, -17 }, // 0x6B 'k' 245 | { 1646, 2, 18, 5, 1, -17 }, // 0x6C 'l' 246 | { 1651, 17, 13, 19, 1, -12 }, // 0x6D 'm' 247 | { 1679, 10, 13, 13, 1, -12 }, // 0x6E 'n' 248 | { 1696, 11, 13, 13, 1, -12 }, // 0x6F 'o' 249 | { 1714, 12, 17, 13, 1, -12 }, // 0x70 'p' 250 | { 1740, 11, 17, 13, 1, -12 }, // 0x71 'q' 251 | { 1764, 6, 13, 8, 1, -12 }, // 0x72 'r' 252 | { 1774, 10, 13, 12, 1, -12 }, // 0x73 's' 253 | { 1791, 5, 16, 7, 1, -15 }, // 0x74 't' 254 | { 1801, 10, 13, 13, 1, -12 }, // 0x75 'u' 255 | { 1818, 12, 13, 12, 0, -12 }, // 0x76 'v' 256 | { 1838, 17, 13, 17, 0, -12 }, // 0x77 'w' 257 | { 1866, 11, 13, 11, 0, -12 }, // 0x78 'x' 258 | { 1884, 11, 18, 11, 0, -12 }, // 0x79 'y' 259 | { 1909, 10, 13, 12, 1, -12 }, // 0x7A 'z' 260 | { 1926, 5, 23, 8, 1, -17 }, // 0x7B '{' 261 | { 1941, 2, 23, 6, 2, -17 }, // 0x7C '|' 262 | { 1947, 5, 23, 8, 2, -17 }, // 0x7D '}' 263 | { 1962, 10, 5, 12, 1, -10 } }; // 0x7E '~' 264 | 265 | const GFXfont FreeSans12pt7b PROGMEM = { 266 | (uint8_t *)FreeSans12pt7bBitmaps, 267 | (GFXglyph *)FreeSans12pt7bGlyphs, 268 | 0x20, 0x7E, 29 }; 269 | 270 | // Approx. 2641 bytes 271 | -------------------------------------------------------------------------------- /src/Fonts/FreeSans9pt8b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeSans9pt8bBitmaps[] PROGMEM = { 2 | 0xFF, 0xFF, 0xF8, 0xC0, 0xDE, 0xF7, 0x20, 0x09, 0x86, 0x41, 0x91, 0xFF, 3 | 0x13, 0x04, 0xC3, 0x20, 0xC8, 0xFF, 0x89, 0x82, 0x61, 0x90, 0x10, 0x1F, 4 | 0x14, 0xDA, 0x3D, 0x1E, 0x83, 0x40, 0x78, 0x17, 0x08, 0xF4, 0x7A, 0x35, 5 | 0x33, 0xF0, 0x40, 0x20, 0x38, 0x10, 0xEC, 0x20, 0xC6, 0x20, 0xC6, 0x40, 6 | 0xC6, 0x40, 0x6C, 0x80, 0x39, 0x00, 0x01, 0x3C, 0x02, 0x77, 0x02, 0x63, 7 | 0x04, 0x63, 0x04, 0x77, 0x08, 0x3C, 0x0E, 0x06, 0x60, 0xCC, 0x19, 0x81, 8 | 0xE0, 0x18, 0x0F, 0x03, 0x36, 0xC2, 0xD8, 0x73, 0x06, 0x31, 0xE3, 0xC4, 9 | 0xFE, 0x13, 0x26, 0x6C, 0xCC, 0xCC, 0xC4, 0x66, 0x23, 0x10, 0x8C, 0x46, 10 | 0x63, 0x33, 0x33, 0x32, 0x66, 0x4C, 0x80, 0x25, 0x7E, 0xA5, 0x00, 0x30, 11 | 0xC3, 0x3F, 0x30, 0xC3, 0x0C, 0xD6, 0xF0, 0xC0, 0x08, 0x44, 0x21, 0x10, 12 | 0x84, 0x42, 0x11, 0x08, 0x00, 0x3C, 0x66, 0x42, 0xC3, 0xC3, 0xC3, 0xC3, 13 | 0xC3, 0xC3, 0xC3, 0x42, 0x66, 0x3C, 0x11, 0x3F, 0x33, 0x33, 0x33, 0x33, 14 | 0x30, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x1C, 0x1C, 0x1C, 0x18, 0x18, 15 | 0x10, 0x08, 0x07, 0xF8, 0x3C, 0x66, 0xC3, 0xC3, 0x03, 0x06, 0x1C, 0x07, 16 | 0x03, 0xC3, 0xC3, 0x66, 0x3C, 0x0C, 0x18, 0x71, 0x62, 0xC9, 0xA3, 0x46, 17 | 0xFE, 0x18, 0x30, 0x60, 0xC0, 0x7F, 0x20, 0x10, 0x08, 0x08, 0x07, 0xF3, 18 | 0x8C, 0x03, 0x01, 0x80, 0xF0, 0x6C, 0x63, 0xE0, 0x1E, 0x31, 0x98, 0x78, 19 | 0x0C, 0x06, 0xF3, 0x8D, 0x83, 0xC1, 0xE0, 0xD0, 0x6C, 0x63, 0xE0, 0xFF, 20 | 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30, 21 | 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1B, 0x18, 0xF8, 0xC6, 0xC1, 0xE0, 0xF0, 22 | 0x6C, 0x63, 0xE0, 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, 23 | 0x03, 0xC2, 0x66, 0x3C, 0xC0, 0x00, 0x30, 0xC0, 0x00, 0x00, 0x64, 0xA0, 24 | 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x07, 0x80, 0x70, 0x0E, 0x01, 0x80, 0xFF, 25 | 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x70, 0x0E, 0x01, 0xC0, 0x18, 0x38, 0x71, 26 | 0xC0, 0x80, 0x00, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x18, 0x38, 0x18, 27 | 0x18, 0x0C, 0x00, 0x00, 0x01, 0x80, 0x03, 0xF0, 0x06, 0x0E, 0x06, 0x01, 28 | 0x86, 0x00, 0x66, 0x1D, 0xBB, 0x31, 0xCF, 0x18, 0xC7, 0x98, 0x63, 0xCC, 29 | 0x31, 0xE6, 0x11, 0xB3, 0x99, 0xCC, 0xF7, 0x86, 0x00, 0x01, 0x80, 0x00, 30 | 0x70, 0x40, 0x0F, 0xE0, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x90, 0x19, 0x81, 31 | 0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, 0x30, 32 | 0xFF, 0x18, 0x33, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x3F, 0xC6, 0x06, 0xC0, 33 | 0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, 0x1F, 0x86, 0x19, 0x81, 0xA0, 0x3C, 34 | 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0x61, 0xF0, 35 | 0xFF, 0x18, 0x33, 0x03, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 36 | 0x78, 0x0F, 0x03, 0x60, 0xCF, 0xF0, 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06, 37 | 0x03, 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, 0xFF, 0xC0, 0xC0, 38 | 0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0F, 0x83, 39 | 0x0E, 0x60, 0x66, 0x03, 0xC0, 0x0C, 0x00, 0xC1, 0xFC, 0x03, 0xC0, 0x36, 40 | 0x03, 0x60, 0x73, 0x0F, 0x0F, 0x10, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 41 | 0x07, 0x80, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06, 42 | 0xFF, 0xFF, 0xFF, 0xC0, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07, 43 | 0x8F, 0x1E, 0x27, 0x80, 0xC0, 0xD8, 0x33, 0x0C, 0x63, 0x0C, 0xC1, 0xB8, 44 | 0x3F, 0x07, 0x30, 0xC3, 0x18, 0x63, 0x06, 0x60, 0x6C, 0x0C, 0xC0, 0xC0, 45 | 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xE0, 46 | 0x3F, 0x01, 0xFC, 0x1F, 0xE0, 0xFD, 0x05, 0xEC, 0x6F, 0x63, 0x79, 0x13, 47 | 0xCD, 0x9E, 0x6C, 0xF1, 0x47, 0x8E, 0x3C, 0x71, 0x80, 0xE0, 0x7C, 0x0F, 48 | 0xC1, 0xE8, 0x3D, 0x87, 0x98, 0xF1, 0x1E, 0x33, 0xC3, 0x78, 0x6F, 0x07, 49 | 0xE0, 0x7C, 0x0E, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0, 50 | 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x0C, 0x60, 0xC0, 0xF8, 51 | 0x00, 0xFF, 0x30, 0x6C, 0x0F, 0x03, 0xC0, 0xF0, 0x6F, 0xF3, 0x00, 0xC0, 52 | 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 53 | 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x6C, 54 | 0x60, 0xC0, 0xFB, 0x00, 0x08, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 55 | 0x6C, 0x0C, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, 0xC0, 56 | 0x70, 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0x1E, 0x01, 0xF0, 0x0E, 0x00, 57 | 0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x00, 0xFF, 0x86, 0x03, 0x01, 0x80, 0xC0, 58 | 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x78, 0x0F, 59 | 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 60 | 0xB0, 0x61, 0xF0, 0xC0, 0x6C, 0x0D, 0x81, 0x10, 0x63, 0x0C, 0x61, 0x04, 61 | 0x60, 0xCC, 0x19, 0x01, 0x60, 0x3C, 0x07, 0x00, 0x60, 0xC1, 0x81, 0x30, 62 | 0xE1, 0x98, 0x70, 0xCC, 0x28, 0x66, 0x26, 0x21, 0x13, 0x30, 0xC8, 0x98, 63 | 0x6C, 0x4C, 0x14, 0x34, 0x0A, 0x1A, 0x07, 0x07, 0x03, 0x03, 0x80, 0x81, 64 | 0x80, 0x60, 0x63, 0x0C, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0xE0, 0x06, 0x00, 65 | 0xF0, 0x19, 0x01, 0x98, 0x30, 0xC6, 0x0E, 0x60, 0x60, 0xC0, 0x36, 0x06, 66 | 0x30, 0xC3, 0x0C, 0x19, 0x81, 0xD8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, 67 | 0x06, 0x00, 0x60, 0x06, 0x00, 0xFF, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03, 68 | 0x01, 0xC0, 0x60, 0x30, 0x18, 0x06, 0x03, 0x00, 0xFF, 0xC0, 0xFB, 0x6D, 69 | 0xB6, 0xDB, 0x6D, 0xB6, 0xE0, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84, 70 | 0x10, 0x80, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB, 0xE0, 0x30, 0x60, 0xA2, 71 | 0x44, 0xD8, 0xA1, 0x80, 0xFF, 0xC0, 0xC6, 0x30, 0x7E, 0x71, 0xB0, 0xC0, 72 | 0x60, 0xF3, 0xDB, 0x0D, 0x86, 0xC7, 0x3D, 0xC0, 0xC0, 0x60, 0x30, 0x1B, 73 | 0xCE, 0x36, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0, 0x3C, 74 | 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x03, 0x03, 0x03, 75 | 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x3C, 0x66, 76 | 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x36, 0x6F, 0x66, 0x66, 77 | 0x66, 0x66, 0x60, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 78 | 0x3B, 0x03, 0x03, 0xC6, 0x7C, 0xC0, 0xC0, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 79 | 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC0, 0x30, 0x03, 80 | 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, 0xC0, 0x60, 0x30, 0x18, 0x4C, 81 | 0x46, 0x63, 0x61, 0xF0, 0xEC, 0x62, 0x31, 0x98, 0x6C, 0x30, 0xFF, 0xFF, 82 | 0xFF, 0xC0, 0xDE, 0xF7, 0x1C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F, 83 | 0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, 84 | 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 85 | 0xC3, 0x66, 0x3C, 0xDE, 0x71, 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 86 | 0xE3, 0x6F, 0x30, 0x18, 0x0C, 0x00, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 87 | 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0x03, 0xDF, 0x31, 0x8C, 0x63, 0x18, 88 | 0xC6, 0x00, 0x3E, 0xE3, 0xC0, 0xC0, 0xE0, 0x3C, 0x07, 0xC3, 0xE3, 0x7E, 89 | 0x66, 0xF6, 0x66, 0x66, 0x66, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 90 | 0xC3, 0xC3, 0xC7, 0x7B, 0xC1, 0xA0, 0x98, 0xCC, 0x42, 0x21, 0xB0, 0xD0, 91 | 0x28, 0x1C, 0x0C, 0x00, 0xC6, 0x1E, 0x38, 0x91, 0xC4, 0xCA, 0x66, 0xD3, 92 | 0x16, 0xD0, 0xA6, 0x87, 0x1C, 0x38, 0xC0, 0xC6, 0x00, 0x43, 0x62, 0x36, 93 | 0x1C, 0x18, 0x1C, 0x3C, 0x26, 0x62, 0x43, 0xC1, 0x21, 0x98, 0xCC, 0x42, 94 | 0x61, 0xB0, 0xD0, 0x38, 0x1C, 0x0C, 0x06, 0x03, 0x01, 0x03, 0x00, 0xFE, 95 | 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x20, 0xC1, 0xFC, 0x74, 0x63, 0x17, 0x00, 96 | 0x19, 0x80, 0x00, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x90, 0x19, 0x81, 0x98, 97 | 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, 0x30, 0x19, 98 | 0x80, 0x00, 0x03, 0xE0, 0x60, 0xC6, 0x03, 0x30, 0x1B, 0x00, 0x78, 0x03, 99 | 0xC0, 0x1E, 0x00, 0xF0, 0x06, 0xC0, 0x66, 0x03, 0x18, 0x30, 0x3E, 0x00, 100 | 0x19, 0x80, 0x03, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 101 | 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06, 0xC1, 0x87, 0xC0, 0x66, 0x00, 0x1F, 102 | 0x9C, 0x6C, 0x30, 0x18, 0x3C, 0xF6, 0xC3, 0x61, 0xB1, 0xCF, 0x70, 0x66, 103 | 0x00, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, 0x66, 104 | 0x00, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7B }; 105 | 106 | const GFXglyph FreeSans9pt8bGlyphs[] PROGMEM = { 107 | { 0, 0, 0, 5, 0, 1 }, // 0x20 ' ' 108 | { 0, 2, 13, 6, 2, -12 }, // 0x21 '!' 109 | { 4, 5, 4, 6, 1, -12 }, // 0x22 '"' 110 | { 7, 10, 12, 10, 0, -11 }, // 0x23 '#' 111 | { 22, 9, 16, 10, 1, -13 }, // 0x24 '$' 112 | { 40, 16, 13, 16, 1, -12 }, // 0x25 '%' 113 | { 66, 11, 13, 12, 1, -12 }, // 0x26 '&' 114 | { 84, 2, 4, 4, 1, -12 }, // 0x27 ''' 115 | { 85, 4, 17, 6, 1, -12 }, // 0x28 '(' 116 | { 94, 4, 17, 6, 1, -12 }, // 0x29 ')' 117 | { 103, 5, 5, 7, 1, -12 }, // 0x2A '*' 118 | { 107, 6, 8, 11, 3, -7 }, // 0x2B '+' 119 | { 113, 2, 4, 5, 2, 0 }, // 0x2C ',' 120 | { 114, 4, 1, 6, 1, -4 }, // 0x2D '-' 121 | { 115, 2, 1, 5, 1, 0 }, // 0x2E '.' 122 | { 116, 5, 13, 5, 0, -12 }, // 0x2F '/' 123 | { 125, 8, 13, 10, 1, -12 }, // 0x30 '0' 124 | { 138, 4, 13, 10, 3, -12 }, // 0x31 '1' 125 | { 145, 9, 13, 10, 1, -12 }, // 0x32 '2' 126 | { 160, 8, 13, 10, 1, -12 }, // 0x33 '3' 127 | { 173, 7, 13, 10, 2, -12 }, // 0x34 '4' 128 | { 185, 9, 13, 10, 1, -12 }, // 0x35 '5' 129 | { 200, 9, 13, 10, 1, -12 }, // 0x36 '6' 130 | { 215, 8, 13, 10, 0, -12 }, // 0x37 '7' 131 | { 228, 9, 13, 10, 1, -12 }, // 0x38 '8' 132 | { 243, 8, 13, 10, 1, -12 }, // 0x39 '9' 133 | { 256, 2, 10, 5, 1, -9 }, // 0x3A ':' 134 | { 259, 3, 12, 5, 1, -8 }, // 0x3B ';' 135 | { 264, 9, 9, 11, 1, -8 }, // 0x3C '<' 136 | { 275, 9, 4, 11, 1, -5 }, // 0x3D '=' 137 | { 280, 9, 9, 11, 1, -8 }, // 0x3E '>' 138 | { 291, 9, 13, 10, 1, -12 }, // 0x3F '?' 139 | { 306, 17, 16, 18, 1, -12 }, // 0x40 '@' 140 | { 340, 12, 13, 12, 0, -12 }, // 0x41 'A' 141 | { 360, 11, 13, 12, 1, -12 }, // 0x42 'B' 142 | { 378, 11, 13, 13, 1, -12 }, // 0x43 'C' 143 | { 396, 11, 13, 13, 1, -12 }, // 0x44 'D' 144 | { 414, 9, 13, 11, 1, -12 }, // 0x45 'E' 145 | { 429, 8, 13, 11, 1, -12 }, // 0x46 'F' 146 | { 442, 12, 13, 14, 1, -12 }, // 0x47 'G' 147 | { 462, 11, 13, 13, 1, -12 }, // 0x48 'H' 148 | { 480, 2, 13, 5, 2, -12 }, // 0x49 'I' 149 | { 484, 7, 13, 10, 1, -12 }, // 0x4A 'J' 150 | { 496, 11, 13, 12, 1, -12 }, // 0x4B 'K' 151 | { 514, 8, 13, 10, 1, -12 }, // 0x4C 'L' 152 | { 527, 13, 13, 15, 1, -12 }, // 0x4D 'M' 153 | { 549, 11, 13, 13, 1, -12 }, // 0x4E 'N' 154 | { 567, 13, 13, 14, 1, -12 }, // 0x4F 'O' 155 | { 589, 10, 13, 12, 1, -12 }, // 0x50 'P' 156 | { 606, 13, 14, 14, 1, -12 }, // 0x51 'Q' 157 | { 629, 12, 13, 13, 1, -12 }, // 0x52 'R' 158 | { 649, 10, 13, 12, 1, -12 }, // 0x53 'S' 159 | { 666, 9, 13, 11, 1, -12 }, // 0x54 'T' 160 | { 681, 11, 13, 13, 1, -12 }, // 0x55 'U' 161 | { 699, 11, 13, 12, 0, -12 }, // 0x56 'V' 162 | { 717, 17, 13, 17, 0, -12 }, // 0x57 'W' 163 | { 745, 12, 13, 12, 0, -12 }, // 0x58 'X' 164 | { 765, 12, 13, 12, 0, -12 }, // 0x59 'Y' 165 | { 785, 10, 13, 11, 1, -12 }, // 0x5A 'Z' 166 | { 802, 3, 17, 5, 1, -12 }, // 0x5B '[' 167 | { 809, 5, 13, 5, 0, -12 }, // 0x5C '\' 168 | { 818, 3, 17, 5, 0, -12 }, // 0x5D ']' 169 | { 825, 7, 7, 8, 1, -12 }, // 0x5E '^' 170 | { 832, 10, 1, 10, 0, 3 }, // 0x5F '_' 171 | { 834, 4, 3, 5, 0, -12 }, // 0x60 '`' 172 | { 836, 9, 10, 10, 1, -9 }, // 0x61 'a' 173 | { 848, 9, 13, 10, 1, -12 }, // 0x62 'b' 174 | { 863, 8, 10, 9, 1, -9 }, // 0x63 'c' 175 | { 873, 8, 13, 10, 1, -12 }, // 0x64 'd' 176 | { 886, 8, 10, 10, 1, -9 }, // 0x65 'e' 177 | { 896, 4, 13, 5, 1, -12 }, // 0x66 'f' 178 | { 903, 8, 14, 10, 1, -9 }, // 0x67 'g' 179 | { 917, 8, 13, 10, 1, -12 }, // 0x68 'h' 180 | { 930, 2, 13, 4, 1, -12 }, // 0x69 'i' 181 | { 934, 4, 17, 4, 0, -12 }, // 0x6A 'j' 182 | { 943, 9, 13, 9, 1, -12 }, // 0x6B 'k' 183 | { 958, 2, 13, 4, 1, -12 }, // 0x6C 'l' 184 | { 962, 13, 10, 15, 1, -9 }, // 0x6D 'm' 185 | { 979, 8, 10, 10, 1, -9 }, // 0x6E 'n' 186 | { 989, 8, 10, 10, 1, -9 }, // 0x6F 'o' 187 | { 999, 9, 13, 10, 1, -9 }, // 0x70 'p' 188 | { 1014, 8, 13, 10, 1, -9 }, // 0x71 'q' 189 | { 1027, 5, 10, 6, 1, -9 }, // 0x72 'r' 190 | { 1034, 8, 10, 9, 1, -9 }, // 0x73 's' 191 | { 1044, 4, 12, 5, 1, -11 }, // 0x74 't' 192 | { 1050, 8, 10, 10, 1, -9 }, // 0x75 'u' 193 | { 1060, 9, 10, 9, 0, -9 }, // 0x76 'v' 194 | { 1072, 13, 10, 13, 0, -9 }, // 0x77 'w' 195 | { 1089, 8, 10, 9, 0, -9 }, // 0x78 'x' 196 | { 1099, 9, 14, 9, 0, -9 }, // 0x79 'y' 197 | { 1115, 7, 10, 9, 1, -9 }, // 0x7A 'z' 198 | { 770, 2, 3, 2, 3, 2 }, // 0x7B '{' 199 | { 770, 2, 3, 2, 3, 2 }, // 0x7C '|' 200 | { 770, 2, 3, 2, 3, 16 }, // 0x7D '}' 201 | { 770, 2, 3, 2, 3, 2 }, // 0x7E '~' 202 | { 770, 2, 3, 2, 3, 2 }, // 0x7F 203 | { 49, 1, 48, 101, 54, 0 }, // 0x80 204 | { 33152, 130, 131, 132, -123, -122 }, // 0x81 205 | { 35208, 154, 139, 156, -115, -98 }, // 0x82 206 | { 37264, 146, 147, 148, -107, -106 }, // 0x83 207 | { 39320, 154, 155, 156, -99, -98 }, // 0x84 208 | { 41376, 162, 163, 164, -91, -90 }, // 0x85 209 | { 43432, 170, 171, 172, -83, -82 }, // 0x86 210 | { 45488, 178, 179, 180, -75, -74 }, // 0x87 211 | { 47544, 186, 187, 188, -67, -66 }, // 0x88 212 | { 57824, 226, 227, 228, -27, -26 }, // 0x89 213 | { 59880, 234, 235, 236, -19, -18 }, // 0x8A 214 | { 61936, 242, 243, 244, -11, -10 }, // 0x8B 215 | { 63992, 250, 251, 252, -3, -2 }, // 0x8C 216 | { 57824, 226, 227, 228, -27, -26 }, // 0x8D 217 | { 59880, 234, 235, 236, -19, -18 }, // 0x8E 218 | { 61936, 242, 243, 244, -11, -10 }, // 0x8F 219 | { 63992, 250, 251, 252, -3, -2 }, // 0x90 220 | { 256, 2, 3, 4, 5, 6 }, // 0x91 221 | { 2312, 10, 11, 12, 13, 14 }, // 0x92 222 | { 4368, 18, 19, 20, 21, 22 }, // 0x93 223 | { 6424, 26, 27, 28, 29, 30 }, // 0x94 224 | { 8480, 34, 35, 36, 37, 38 }, // 0x95 225 | { 10536, 42, 43, 44, 45, 46 }, // 0x96 226 | { 12592, 50, 51, 52, 53, 54 }, // 0x97 227 | { 14648, 58, 59, 60, 61, 62 }, // 0x98 228 | { 24896, 98, 99, 100, 101, 102 }, // 0x99 229 | { 26984, 106, 107, 108, 109, 110 }, // 0x9A 230 | { 29040, 114, 115, 116, 117, 118 }, // 0x9B 231 | { 31096, 122, 91, 92, 93, 94 }, // 0x9C 232 | { 24928, 98, 99, 100, 101, 102 }, // 0x9D 233 | { 26984, 106, 107, 108, 109, 110 }, // 0x9E 234 | { 29040, 114, 115, 116, 117, 118 }, // 0x9F 235 | { 31096, 122, 123, 124, 125, 126 }, // 0xA0 236 | { 33152, 130, 131, 132, -123, -122 }, // 0xA1 237 | { 35208, 154, 139, 156, -115, -98 }, // 0xA2 238 | { 37264, 146, 147, 148, -107, -106 }, // 0xA3 239 | { 39320, 154, 155, 156, -99, -98 }, // 0xA4 240 | { 41376, 162, 163, 164, -91, -90 }, // 0xA5 241 | { 43432, 170, 171, 172, -83, -82 }, // 0xA6 242 | { 45488, 178, 179, 180, -75, -74 }, // 0xA7 243 | { 47544, 186, 187, 188, -67, -66 }, // 0xA8 244 | { 57824, 226, 227, 228, -27, -26 }, // 0xA9 245 | { 59880, 234, 235, 236, -19, -18 }, // 0xAA 246 | { 61936, 242, 243, 244, -11, -10 }, // 0xAB 247 | { 63992, 250, 251, 252, -3, -2 }, // 0xAC 248 | { 57824, 226, 227, 228, -27, -26 }, // 0xAD 249 | { 59880, 234, 235, 236, -19, -18 }, // 0xAE 250 | { 61936, 242, 243, 244, -11, -10 }, // 0xAF 251 | { 1124, 5, 5, 11, 3, -11 }, // 0xB0 252 | { 49, 1, 48, 150, 54, 0 }, // 0xB1 253 | { 33152, 130, 131, 132, -123, -122 }, // 0xB2 254 | { 35208, 138, 139, 140, -115, -114 }, // 0xB3 255 | { 37264, 146, 147, 148, -107, -106 }, // 0xB4 256 | { 39320, 138, 155, 140, -99, -114 }, // 0xB5 257 | { 41376, 162, 163, 164, -91, -90 }, // 0xB6 258 | { 43432, 170, 171, 172, -83, -82 }, // 0xB7 259 | { 45488, 178, 179, 180, -75, -74 }, // 0xB8 260 | { 47544, 186, 187, 188, -67, -66 }, // 0xB9 261 | { 49600, 194, 195, 196, -59, -58 }, // 0xBA 262 | { 51656, 202, 203, 204, -51, -50 }, // 0xBB 263 | { 53712, 210, 211, 212, -43, -42 }, // 0xBC 264 | { 55768, 218, 219, 220, -35, -34 }, // 0xBD 265 | { 49600, 194, 195, 196, -59, -58 }, // 0xBE 266 | { 51656, 202, 203, 204, -51, -50 }, // 0xBF 267 | { 53712, 210, 211, 212, -43, -42 }, // 0xC0 268 | { 55768, 218, 219, 220, -35, -34 }, // 0xC1 269 | { 256, 2, 3, 4, 5, 6 }, // 0xC2 270 | { 2312, 10, 11, 12, 13, 14 }, // 0xC3 271 | { 1128, 12, 15, 12, 0, -14 }, // 0xC4 272 | { 6424, 26, 27, 28, 29, 30 }, // 0xC5 273 | { 8480, 34, 35, 36, 37, 38 }, // 0xC6 274 | { 10536, 42, 43, 44, 45, 46 }, // 0xC7 275 | { 12592, 50, 51, 52, 53, 54 }, // 0xC8 276 | { 14648, 58, 59, 60, 61, 62 }, // 0xC9 277 | { 16704, 66, 67, 68, 69, 70 }, // 0xCA 278 | { 18760, 74, 75, 76, 77, 78 }, // 0xCB 279 | { 20816, 82, 83, 84, 85, 86 }, // 0xCC 280 | { 22872, 90, 91, 92, 93, 94 }, // 0xCD 281 | { 16736, 66, 67, 68, 69, 70 }, // 0xCE 282 | { 18760, 74, 75, 76, 77, 78 }, // 0xCF 283 | { 20816, 82, 83, 84, 85, 86 }, // 0xD0 284 | { 22872, 90, 123, 124, 125, 126 }, // 0xD1 285 | { 33152, 130, 131, 132, -123, -122 }, // 0xD2 286 | { 35208, 138, 139, 140, -115, -114 }, // 0xD3 287 | { 37264, 146, 147, 148, -107, -106 }, // 0xD4 288 | { 39320, 138, 155, 140, -99, -114 }, // 0xD5 289 | { 1151, 13, 15, 14, 1, -14 }, // 0xD6 290 | { 43432, 170, 171, 172, -83, -82 }, // 0xD7 291 | { 45488, 178, 179, 180, -75, -74 }, // 0xD8 292 | { 47544, 186, 187, 188, -67, -66 }, // 0xD9 293 | { 49600, 194, 195, 196, -59, -58 }, // 0xDA 294 | { 51656, 202, 203, 204, -51, -50 }, // 0xDB 295 | { 1176, 11, 15, 13, 1, -14 }, // 0xDC 296 | { 55768, 218, 219, 220, -35, -34 }, // 0xDD 297 | { 49600, 194, 195, 196, -59, -58 }, // 0xDE 298 | { 51656, 202, 203, 204, -51, -50 }, // 0xDF 299 | { 53712, 210, 211, 212, -43, -42 }, // 0xE0 300 | { 55768, 218, 219, 220, -35, -34 }, // 0xE1 301 | { 60, 0, 60, 199, 54, 0 }, // 0xE2 302 | { 192, 119, 0, 208, 14, 119 }, // 0xE3 303 | { 1197, 9, 12, 10, 1, -11 }, // 0xE4 304 | { 4368, 18, 19, 20, 21, 22 }, // 0xE5 305 | { 6424, 26, 27, 28, 29, 30 }, // 0xE6 306 | { 8480, 34, 35, 36, 37, 38 }, // 0xE7 307 | { 10536, 42, 43, 44, 45, 46 }, // 0xE8 308 | { 12592, 50, 51, 52, 53, 54 }, // 0xE9 309 | { 14648, 58, 59, 60, 61, 62 }, // 0xEA 310 | { 16704, 66, 67, 68, 69, 70 }, // 0xEB 311 | { 18760, 74, 75, 76, 77, 78 }, // 0xEC 312 | { 20816, 82, 83, 84, 85, 86 }, // 0xED 313 | { 22872, 90, 91, 92, 93, 94 }, // 0xEE 314 | { 24928, 98, 99, 100, 101, 102 }, // 0xEF 315 | { 26984, 106, 107, 108, 109, 110 }, // 0xF0 316 | { 29040, 114, 115, 116, 117, 118 }, // 0xF1 317 | { 31096, 122, 123, 124, 125, 126 }, // 0xF2 318 | { 33152, 130, 131, 132, -123, -122 }, // 0xF3 319 | { 35208, 138, 139, 140, -115, -114 }, // 0xF4 320 | { 37264, 146, 147, 148, -107, -106 }, // 0xF5 321 | { 1211, 8, 12, 10, 1, -11 }, // 0xF6 322 | { 41376, 162, 163, 164, -91, -90 }, // 0xF7 323 | { 43432, 170, 171, 172, -83, -82 }, // 0xF8 324 | { 45488, 178, 179, 180, -75, -74 }, // 0xF9 325 | { 47544, 186, 187, 188, -67, -66 }, // 0xFA 326 | { 49600, 194, 195, 196, -59, -58 }, // 0xFB 327 | { 1223, 8, 12, 10, 1, -11 } }; // 0xFC 328 | 329 | const GFXfont FreeSans9pt8b PROGMEM = { 330 | (uint8_t *)FreeSans9pt8bBitmaps, 331 | (GFXglyph *)FreeSans9pt8bGlyphs, 332 | 0x20, 0xFC, 22 }; 333 | 334 | // Approx. 2789 bytes 335 | -------------------------------------------------------------------------------- /src/Fonts/FreeSans18pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeSans18pt7bBitmaps[] PROGMEM = { 2 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x20, 0x3F, 0xFC, 0xE3, 0xF1, 3 | 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8E, 0x82, 0x41, 0x00, 0x01, 0xC3, 0x80, 4 | 0x38, 0x70, 0x06, 0x0E, 0x00, 0xC1, 0x80, 0x38, 0x70, 0x07, 0x0E, 0x0F, 5 | 0xFF, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE0, 0xE1, 0xC0, 0x1C, 0x38, 0x03, 6 | 0x87, 0x00, 0x70, 0xE0, 0x0C, 0x18, 0x3F, 0xFF, 0xF7, 0xFF, 0xFE, 0xFF, 7 | 0xFF, 0xC1, 0xC3, 0x80, 0x30, 0x60, 0x06, 0x0C, 0x01, 0xC3, 0x80, 0x38, 8 | 0x70, 0x07, 0x0E, 0x00, 0xC1, 0x80, 0x03, 0x00, 0x0F, 0xC0, 0x3F, 0xF0, 9 | 0x3F, 0xF8, 0x7B, 0x3C, 0xF3, 0x1C, 0xE3, 0x0E, 0xE3, 0x0E, 0xE3, 0x0E, 10 | 0xE3, 0x00, 0xE3, 0x00, 0xF3, 0x00, 0x7B, 0x00, 0x7F, 0x80, 0x1F, 0xF0, 11 | 0x07, 0xFC, 0x03, 0x7E, 0x03, 0x0F, 0x03, 0x07, 0xE3, 0x07, 0xE3, 0x07, 12 | 0xE3, 0x07, 0xE3, 0x0F, 0x73, 0x3E, 0x7F, 0xFC, 0x3F, 0xF8, 0x0F, 0xE0, 13 | 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x78, 0x00, 14 | 0xE0, 0x0F, 0xF0, 0x06, 0x00, 0xFF, 0xC0, 0x70, 0x07, 0x0E, 0x07, 0x00, 15 | 0x70, 0x38, 0x38, 0x03, 0x00, 0xC3, 0x80, 0x18, 0x06, 0x1C, 0x00, 0xE0, 16 | 0x71, 0xC0, 0x03, 0x87, 0x8C, 0x00, 0x1F, 0xF8, 0xE0, 0x00, 0x7F, 0x86, 17 | 0x00, 0x01, 0xF8, 0x70, 0x00, 0x00, 0x03, 0x03, 0xC0, 0x00, 0x38, 0x7F, 18 | 0x80, 0x01, 0x87, 0xFE, 0x00, 0x1C, 0x38, 0x70, 0x00, 0xC3, 0x81, 0xC0, 19 | 0x0E, 0x18, 0x06, 0x00, 0xE0, 0xC0, 0x30, 0x07, 0x07, 0x03, 0x80, 0x70, 20 | 0x1C, 0x38, 0x03, 0x80, 0xFF, 0xC0, 0x38, 0x03, 0xFC, 0x01, 0x80, 0x07, 21 | 0x80, 0x01, 0xF0, 0x00, 0x7F, 0x80, 0x0F, 0xFC, 0x01, 0xE1, 0xE0, 0x1C, 22 | 0x0E, 0x01, 0xC0, 0xE0, 0x1C, 0x0E, 0x01, 0xE1, 0xE0, 0x0E, 0x3C, 0x00, 23 | 0x77, 0x80, 0x07, 0xF0, 0x00, 0x7C, 0x00, 0x0F, 0xE0, 0x03, 0xCF, 0x1C, 24 | 0x78, 0x79, 0xC7, 0x03, 0xDC, 0xE0, 0x1F, 0x8E, 0x00, 0xF8, 0xE0, 0x0F, 25 | 0x0E, 0x00, 0x70, 0xF0, 0x0F, 0x87, 0xC3, 0xFC, 0x7F, 0xFD, 0xC3, 0xFF, 26 | 0x0E, 0x0F, 0xC0, 0xF0, 0xFF, 0xFF, 0xFA, 0x40, 0x06, 0x06, 0x0C, 0x0C, 27 | 0x18, 0x18, 0x38, 0x30, 0x70, 0x70, 0x70, 0x60, 0xE0, 0xE0, 0xE0, 0xE0, 28 | 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x60, 0x70, 0x70, 0x70, 0x30, 0x38, 0x18, 29 | 0x18, 0x0C, 0x0C, 0x06, 0x03, 0xC0, 0x60, 0x30, 0x30, 0x38, 0x18, 0x1C, 30 | 0x0C, 0x0E, 0x0E, 0x0E, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 31 | 0x07, 0x07, 0x06, 0x0E, 0x0E, 0x0E, 0x0C, 0x1C, 0x18, 0x38, 0x30, 0x30, 32 | 0x60, 0xC0, 0x0C, 0x03, 0x00, 0xC3, 0xB7, 0xFF, 0xC7, 0x81, 0xE0, 0xEC, 33 | 0x73, 0x88, 0x40, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 34 | 0x80, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, 35 | 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0xFF, 36 | 0xF6, 0xDA, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xC0, 0x30, 0x18, 37 | 0x06, 0x01, 0x80, 0xC0, 0x30, 0x0C, 0x06, 0x01, 0x80, 0x60, 0x30, 0x0C, 38 | 0x03, 0x00, 0xC0, 0x60, 0x18, 0x06, 0x03, 0x00, 0xC0, 0x30, 0x18, 0x06, 39 | 0x01, 0x80, 0xC0, 0x30, 0x00, 0x07, 0xE0, 0x0F, 0xF8, 0x1F, 0xFC, 0x3C, 40 | 0x3C, 0x78, 0x1E, 0x70, 0x0E, 0x70, 0x0E, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 41 | 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 42 | 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0x70, 0x0E, 0x70, 0x0E, 0x78, 0x1E, 0x3C, 43 | 0x3C, 0x1F, 0xF8, 0x1F, 0xF0, 0x07, 0xE0, 0x03, 0x03, 0x07, 0x0F, 0x3F, 44 | 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 45 | 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xE0, 0x1F, 0xF8, 46 | 0x3F, 0xFC, 0x7C, 0x3E, 0x70, 0x0F, 0xF0, 0x0F, 0xE0, 0x07, 0xE0, 0x07, 47 | 0x00, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF8, 48 | 0x03, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x70, 0x00, 49 | 0x60, 0x00, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xF0, 50 | 0x07, 0xFE, 0x07, 0xFF, 0x87, 0x83, 0xC3, 0x80, 0xF3, 0x80, 0x39, 0xC0, 51 | 0x1C, 0xE0, 0x0E, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x7F, 0x00, 0x3F, 0x00, 52 | 0x1F, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03, 0xF0, 0x01, 53 | 0xF8, 0x00, 0xFE, 0x00, 0x77, 0x00, 0x73, 0xE0, 0xF8, 0xFF, 0xF8, 0x3F, 54 | 0xF8, 0x07, 0xF0, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x78, 0x00, 0xF8, 55 | 0x00, 0xF8, 0x01, 0xF8, 0x03, 0xB8, 0x03, 0x38, 0x07, 0x38, 0x0E, 0x38, 56 | 0x1C, 0x38, 0x18, 0x38, 0x38, 0x38, 0x70, 0x38, 0x60, 0x38, 0xE0, 0x38, 57 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 58 | 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x1F, 0xFF, 0x0F, 0xFF, 0x8F, 0xFF, 59 | 0xC7, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x39, 60 | 0xF0, 0x3F, 0xFE, 0x1F, 0xFF, 0x8F, 0x83, 0xE7, 0x00, 0xF0, 0x00, 0x3C, 61 | 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xFC, 0x00, 62 | 0xEF, 0x00, 0x73, 0xC0, 0xF0, 0xFF, 0xF8, 0x3F, 0xF8, 0x07, 0xE0, 0x00, 63 | 0x03, 0xE0, 0x0F, 0xF8, 0x1F, 0xFC, 0x3C, 0x1E, 0x38, 0x0E, 0x70, 0x0E, 64 | 0x70, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xE3, 0xE0, 0xEF, 0xF8, 0xFF, 0xFC, 65 | 0xFC, 0x3E, 0xF0, 0x0E, 0xF0, 0x0F, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 66 | 0x60, 0x07, 0x70, 0x0F, 0x70, 0x0E, 0x3C, 0x3E, 0x3F, 0xFC, 0x1F, 0xF8, 67 | 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x06, 0x00, 0x0E, 68 | 0x00, 0x1C, 0x00, 0x18, 0x00, 0x38, 0x00, 0x70, 0x00, 0x60, 0x00, 0xE0, 69 | 0x00, 0xC0, 0x01, 0xC0, 0x01, 0x80, 0x03, 0x80, 0x03, 0x80, 0x07, 0x00, 70 | 0x07, 0x00, 0x07, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x00, 71 | 0x1C, 0x00, 0x1C, 0x00, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x87, 0x83, 72 | 0xC7, 0x80, 0xF3, 0x80, 0x39, 0xC0, 0x1C, 0xE0, 0x0E, 0x78, 0x0F, 0x1E, 73 | 0x0F, 0x07, 0xFF, 0x01, 0xFF, 0x03, 0xFF, 0xE3, 0xE0, 0xF9, 0xC0, 0x1D, 74 | 0xC0, 0x0F, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0xF7, 0x00, 75 | 0x73, 0xE0, 0xF8, 0xFF, 0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x07, 0xE0, 76 | 0x1F, 0xF8, 0x3F, 0xFC, 0x7C, 0x3C, 0x70, 0x0E, 0xF0, 0x0E, 0xE0, 0x06, 77 | 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0x70, 0x0F, 0x78, 0x3F, 78 | 0x3F, 0xFF, 0x1F, 0xF7, 0x07, 0xC7, 0x00, 0x07, 0x00, 0x06, 0x00, 0x0E, 79 | 0x70, 0x0E, 0x70, 0x1C, 0x78, 0x3C, 0x3F, 0xF8, 0x1F, 0xF0, 0x07, 0xC0, 80 | 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0xFF, 0xF0, 0x00, 0x00, 81 | 0x00, 0x07, 0xFF, 0xB6, 0xD6, 0x00, 0x00, 0x80, 0x03, 0xC0, 0x07, 0xE0, 82 | 0x0F, 0xC0, 0x3F, 0x80, 0x7E, 0x00, 0xFC, 0x01, 0xF0, 0x00, 0xE0, 0x00, 83 | 0x7C, 0x00, 0x1F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, 84 | 0x7E, 0x00, 0x0F, 0x00, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 85 | 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 86 | 0xFF, 0x80, 0x80, 0x00, 0x70, 0x00, 0x3E, 0x00, 0x0F, 0xE0, 0x00, 0xFC, 87 | 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0x80, 0x0F, 0xC0, 88 | 0x1F, 0x80, 0x7F, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x01, 0xC0, 0x00, 89 | 0x80, 0x00, 0x00, 0x0F, 0xC0, 0x7F, 0xE1, 0xFF, 0xE3, 0xC3, 0xEF, 0x01, 90 | 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0x00, 0x0E, 0x00, 0x38, 0x00, 0xF0, 91 | 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x00, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x0E, 92 | 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x03, 0x80, 93 | 0x07, 0x00, 0x0E, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0x00, 94 | 0x00, 0xFF, 0xFF, 0xC0, 0x01, 0xF8, 0x0F, 0xE0, 0x03, 0xE0, 0x01, 0xF0, 95 | 0x07, 0x80, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0x1E, 96 | 0x3C, 0x03, 0xE0, 0x1E, 0x38, 0x0F, 0xF3, 0x8E, 0x78, 0x1E, 0x3F, 0x0F, 97 | 0x70, 0x38, 0x1F, 0x07, 0x70, 0x78, 0x0F, 0x07, 0xE0, 0x70, 0x0E, 0x07, 98 | 0xE0, 0x70, 0x0E, 0x07, 0xE0, 0xE0, 0x0E, 0x07, 0xE0, 0xE0, 0x1C, 0x07, 99 | 0xE0, 0xE0, 0x1C, 0x0E, 0xE0, 0xE0, 0x1C, 0x0E, 0xE0, 0xE0, 0x38, 0x1C, 100 | 0xF0, 0x70, 0x78, 0x3C, 0x70, 0x78, 0xFC, 0x78, 0x78, 0x3F, 0xDF, 0xF0, 101 | 0x38, 0x1F, 0x0F, 0xC0, 0x3C, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 102 | 0x0F, 0x80, 0x00, 0x00, 0x07, 0xF0, 0x0E, 0x00, 0x01, 0xFF, 0xFE, 0x00, 103 | 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x03, 104 | 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xDC, 0x00, 0x07, 0x78, 105 | 0x00, 0x3C, 0xE0, 0x00, 0xE3, 0x80, 0x03, 0x8F, 0x00, 0x1E, 0x1C, 0x00, 106 | 0x70, 0x70, 0x01, 0xC1, 0xE0, 0x0E, 0x03, 0x80, 0x38, 0x0E, 0x00, 0xE0, 107 | 0x3C, 0x07, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0xFF, 0xFF, 0x83, 0xC0, 0x0E, 108 | 0x0E, 0x00, 0x3C, 0x78, 0x00, 0xF1, 0xE0, 0x01, 0xC7, 0x00, 0x07, 0xBC, 109 | 0x00, 0x1E, 0xF0, 0x00, 0x3B, 0x80, 0x00, 0xF0, 0xFF, 0xFC, 0x1F, 0xFF, 110 | 0xE3, 0xFF, 0xFE, 0x70, 0x03, 0xCE, 0x00, 0x3D, 0xC0, 0x03, 0xB8, 0x00, 111 | 0x77, 0x00, 0x0E, 0xE0, 0x01, 0xDC, 0x00, 0x73, 0x80, 0x1E, 0x7F, 0xFF, 112 | 0x8F, 0xFF, 0xF1, 0xFF, 0xFF, 0x38, 0x00, 0xF7, 0x00, 0x0E, 0xE0, 0x00, 113 | 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x03, 114 | 0xF8, 0x00, 0xF7, 0xFF, 0xFC, 0xFF, 0xFF, 0x1F, 0xFF, 0x80, 0x00, 0xFF, 115 | 0x00, 0x0F, 0xFF, 0x00, 0xFF, 0xFE, 0x07, 0xE0, 0x7C, 0x3E, 0x00, 0x78, 116 | 0xF0, 0x00, 0xE7, 0x80, 0x03, 0xDC, 0x00, 0x07, 0x70, 0x00, 0x03, 0x80, 117 | 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 118 | 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x1D, 0xC0, 0x00, 0x77, 119 | 0x00, 0x03, 0xDE, 0x00, 0x0E, 0x3C, 0x00, 0x78, 0xF8, 0x03, 0xC1, 0xF8, 120 | 0x1F, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xC0, 0x03, 0xF8, 0x00, 0xFF, 0xF8, 121 | 0x0F, 0xFF, 0xE0, 0xFF, 0xFF, 0x0E, 0x00, 0xF8, 0xE0, 0x03, 0xCE, 0x00, 122 | 0x1C, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xFE, 0x00, 0x07, 0xE0, 123 | 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 124 | 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x0F, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 125 | 0xE0, 0x01, 0xEE, 0x00, 0x3C, 0xE0, 0x0F, 0x8F, 0xFF, 0xF0, 0xFF, 0xFE, 126 | 0x0F, 0xFF, 0x80, 0xFF, 0xFF, 0xBF, 0xFF, 0xEF, 0xFF, 0xFB, 0x80, 0x00, 127 | 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 128 | 0x00, 0x0E, 0x00, 0x03, 0xFF, 0xFE, 0xFF, 0xFF, 0xBF, 0xFF, 0xEE, 0x00, 129 | 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 130 | 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 131 | 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0E, 0x00, 132 | 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 133 | 0x00, 0x1F, 0xFF, 0xCF, 0xFF, 0xE7, 0xFF, 0xF3, 0x80, 0x01, 0xC0, 0x00, 134 | 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 135 | 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7F, 136 | 0x80, 0x03, 0xFF, 0xE0, 0x07, 0xFF, 0xF8, 0x0F, 0x80, 0xFC, 0x1E, 0x00, 137 | 0x3E, 0x3C, 0x00, 0x0E, 0x78, 0x00, 0x0F, 0x70, 0x00, 0x07, 0x70, 0x00, 138 | 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x03, 139 | 0xFF, 0xE0, 0x03, 0xFF, 0xE0, 0x03, 0xFF, 0xE0, 0x00, 0x07, 0xF0, 0x00, 140 | 0x07, 0x70, 0x00, 0x07, 0x70, 0x00, 0x0F, 0x78, 0x00, 0x0F, 0x3C, 0x00, 141 | 0x1F, 0x1E, 0x00, 0x3F, 0x0F, 0xC0, 0xF7, 0x07, 0xFF, 0xE7, 0x03, 0xFF, 142 | 0xC3, 0x00, 0xFF, 0x03, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 143 | 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 144 | 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 145 | 0xFF, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 146 | 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 147 | 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 148 | 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 149 | 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 150 | 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1F, 0x80, 0x7E, 151 | 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0, 0xF7, 0x87, 0x9F, 0xFE, 0x3F, 0xF0, 152 | 0x3F, 0x00, 0xE0, 0x01, 0xEE, 0x00, 0x3C, 0xE0, 0x07, 0x8E, 0x00, 0xF0, 153 | 0xE0, 0x1E, 0x0E, 0x03, 0xE0, 0xE0, 0x7C, 0x0E, 0x0F, 0x80, 0xE1, 0xF0, 154 | 0x0E, 0x1E, 0x00, 0xE3, 0xC0, 0x0E, 0x7C, 0x00, 0xEF, 0xE0, 0x0F, 0xCE, 155 | 0x00, 0xF8, 0xF0, 0x0F, 0x07, 0x80, 0xE0, 0x3C, 0x0E, 0x03, 0xC0, 0xE0, 156 | 0x1E, 0x0E, 0x00, 0xF0, 0xE0, 0x0F, 0x0E, 0x00, 0x78, 0xE0, 0x03, 0xCE, 157 | 0x00, 0x3C, 0xE0, 0x01, 0xEE, 0x00, 0x0F, 0xE0, 0x01, 0xC0, 0x03, 0x80, 158 | 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 159 | 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 160 | 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 161 | 0x38, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0x00, 0x1F, 0xF8, 162 | 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 163 | 0x00, 0x3F, 0xEE, 0x00, 0x77, 0xEE, 0x00, 0x77, 0xEE, 0x00, 0x77, 0xE7, 164 | 0x00, 0xE7, 0xE7, 0x00, 0xE7, 0xE7, 0x00, 0xE7, 0xE3, 0x81, 0xC7, 0xE3, 165 | 0x81, 0xC7, 0xE3, 0x81, 0xC7, 0xE1, 0xC3, 0x87, 0xE1, 0xC3, 0x87, 0xE1, 166 | 0xC3, 0x87, 0xE0, 0xE7, 0x07, 0xE0, 0xE7, 0x07, 0xE0, 0xE7, 0x07, 0xE0, 167 | 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x3C, 0x07, 0xE0, 168 | 0x3C, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF8, 0x00, 0x7F, 0xC0, 0x07, 169 | 0xFC, 0x00, 0x7F, 0xE0, 0x07, 0xEF, 0x00, 0x7E, 0x70, 0x07, 0xE7, 0x80, 170 | 0x7E, 0x3C, 0x07, 0xE1, 0xC0, 0x7E, 0x1E, 0x07, 0xE0, 0xE0, 0x7E, 0x0F, 171 | 0x07, 0xE0, 0x78, 0x7E, 0x03, 0x87, 0xE0, 0x3C, 0x7E, 0x01, 0xE7, 0xE0, 172 | 0x0E, 0x7E, 0x00, 0xF7, 0xE0, 0x07, 0xFE, 0x00, 0x3F, 0xE0, 0x03, 0xFE, 173 | 0x00, 0x1F, 0xE0, 0x01, 0xFE, 0x00, 0x0F, 0x00, 0x7F, 0x00, 0x01, 0xFF, 174 | 0xF0, 0x01, 0xFF, 0xFC, 0x01, 0xF0, 0x1F, 0x01, 0xE0, 0x03, 0xC1, 0xE0, 175 | 0x00, 0xF1, 0xE0, 0x00, 0x3C, 0xE0, 0x00, 0x0E, 0x70, 0x00, 0x07, 0x70, 176 | 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 177 | 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, 178 | 0xB8, 0x00, 0x03, 0x9C, 0x00, 0x01, 0xCF, 0x00, 0x01, 0xE3, 0xC0, 0x01, 179 | 0xE0, 0xF0, 0x01, 0xE0, 0x3E, 0x03, 0xE0, 0x0F, 0xFF, 0xE0, 0x03, 0xFF, 180 | 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFF, 0xFC, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3, 181 | 0x80, 0x3E, 0xE0, 0x03, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 182 | 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x3F, 0x80, 0x1E, 0xFF, 0xFF, 0x3F, 0xFF, 183 | 0x8F, 0xFF, 0xC3, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 184 | 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 185 | 0x00, 0x38, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0xFF, 0xF0, 0x01, 0xFF, 186 | 0xFC, 0x01, 0xF0, 0x1F, 0x01, 0xE0, 0x03, 0xC1, 0xE0, 0x00, 0xF1, 0xE0, 187 | 0x00, 0x3C, 0xE0, 0x00, 0x0E, 0x70, 0x00, 0x07, 0x70, 0x00, 0x01, 0xF8, 188 | 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 189 | 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xB8, 0x00, 0x03, 190 | 0x9C, 0x00, 0x01, 0xCF, 0x00, 0x39, 0xE3, 0xC0, 0x1F, 0xE0, 0xF0, 0x07, 191 | 0xE0, 0x3E, 0x03, 0xF0, 0x0F, 0xFF, 0xFC, 0x03, 0xFF, 0xEE, 0x00, 0x3F, 192 | 0x83, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x20, 0xFF, 0xFE, 0x0F, 0xFF, 193 | 0xF8, 0xFF, 0xFF, 0xCE, 0x00, 0x3C, 0xE0, 0x01, 0xEE, 0x00, 0x0E, 0xE0, 194 | 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x01, 0xCE, 195 | 0x00, 0x3C, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0xFF, 0xFF, 0x8E, 0x00, 0x3C, 196 | 0xE0, 0x01, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 197 | 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xFE, 0x00, 198 | 0x0F, 0x03, 0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xE0, 0x7C, 0x38, 199 | 0x01, 0xE7, 0x00, 0x0E, 0x70, 0x00, 0xE7, 0x00, 0x00, 0x70, 0x00, 0x07, 200 | 0x80, 0x00, 0x3E, 0x00, 0x01, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x3F, 0xF8, 201 | 0x00, 0x3F, 0xE0, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0xE0, 0x00, 202 | 0x7E, 0x00, 0x07, 0xF0, 0x00, 0x77, 0x80, 0x0E, 0x7C, 0x03, 0xE3, 0xFF, 203 | 0xFC, 0x1F, 0xFF, 0x80, 0x3F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 204 | 0xFF, 0x80, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 205 | 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 206 | 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 207 | 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 208 | 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0xE0, 0x00, 0xFC, 0x00, 209 | 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 210 | 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 211 | 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 212 | 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x1E, 0xF0, 0x07, 213 | 0x9F, 0x01, 0xF1, 0xFF, 0xFC, 0x1F, 0xFE, 0x00, 0x7F, 0x00, 0xE0, 0x00, 214 | 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x1C, 0xE0, 0x01, 0xE7, 0x80, 0x0F, 0x3C, 215 | 0x00, 0x70, 0xE0, 0x07, 0x87, 0x80, 0x3C, 0x1C, 0x01, 0xC0, 0xE0, 0x0E, 216 | 0x07, 0x80, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x38, 0x07, 0x83, 0x80, 0x1C, 217 | 0x1C, 0x00, 0xE0, 0xE0, 0x07, 0x8E, 0x00, 0x1C, 0x70, 0x00, 0xE3, 0x80, 218 | 0x07, 0xB8, 0x00, 0x1D, 0xC0, 0x00, 0xEE, 0x00, 0x07, 0xE0, 0x00, 0x1F, 219 | 0x00, 0x00, 0xF8, 0x00, 0x03, 0x80, 0x00, 0x70, 0x03, 0xC0, 0x0F, 0x70, 220 | 0x03, 0xC0, 0x0F, 0x78, 0x03, 0xE0, 0x0F, 0x78, 0x03, 0xE0, 0x0E, 0x38, 221 | 0x07, 0xE0, 0x0E, 0x38, 0x07, 0xF0, 0x1E, 0x3C, 0x07, 0x70, 0x1E, 0x3C, 222 | 0x07, 0x70, 0x1C, 0x1C, 0x0E, 0x70, 0x1C, 0x1C, 0x0E, 0x38, 0x3C, 0x1C, 223 | 0x0E, 0x38, 0x3C, 0x1E, 0x1E, 0x38, 0x38, 0x0E, 0x1C, 0x38, 0x38, 0x0E, 224 | 0x1C, 0x1C, 0x38, 0x0E, 0x1C, 0x1C, 0x78, 0x0F, 0x3C, 0x1C, 0x70, 0x07, 225 | 0x38, 0x0E, 0x70, 0x07, 0x38, 0x0E, 0x70, 0x07, 0x38, 0x0E, 0x70, 0x07, 226 | 0x70, 0x0E, 0xE0, 0x03, 0xF0, 0x07, 0xE0, 0x03, 0xF0, 0x07, 0xE0, 0x03, 227 | 0xF0, 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xC0, 0x01, 0xE0, 0x03, 0xC0, 0x01, 228 | 0xE0, 0x03, 0xC0, 0xF0, 0x00, 0x7B, 0xC0, 0x07, 0x8F, 0x00, 0x38, 0x78, 229 | 0x03, 0xC1, 0xE0, 0x3C, 0x07, 0x81, 0xC0, 0x3C, 0x1E, 0x00, 0xF1, 0xE0, 230 | 0x03, 0x8E, 0x00, 0x1E, 0xF0, 0x00, 0x7F, 0x00, 0x01, 0xF0, 0x00, 0x0F, 231 | 0x80, 0x00, 0x7C, 0x00, 0x07, 0xF0, 0x00, 0x3B, 0x80, 0x03, 0xDE, 0x00, 232 | 0x3C, 0x78, 0x01, 0xC1, 0xC0, 0x1E, 0x0F, 0x01, 0xE0, 0x3C, 0x0E, 0x00, 233 | 0xE0, 0xF0, 0x07, 0x8F, 0x00, 0x1E, 0x70, 0x00, 0xF7, 0x80, 0x03, 0xC0, 234 | 0xF0, 0x00, 0x3C, 0xF0, 0x00, 0x78, 0xF0, 0x01, 0xE1, 0xE0, 0x03, 0x81, 235 | 0xE0, 0x0F, 0x01, 0xC0, 0x1C, 0x03, 0xC0, 0x78, 0x03, 0xC1, 0xE0, 0x07, 236 | 0x83, 0x80, 0x07, 0x8F, 0x00, 0x07, 0x1C, 0x00, 0x0F, 0x78, 0x00, 0x0E, 237 | 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 238 | 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 239 | 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 240 | 0x00, 0x70, 0x00, 0x7F, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0x80, 0x00, 241 | 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 242 | 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 243 | 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x7C, 0x00, 244 | 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xFF, 0xFF, 245 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xF8, 0xE3, 0x8E, 0x38, 0xE3, 246 | 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 247 | 0x8E, 0x38, 0xE3, 0x8F, 0xFF, 0xFC, 0xC0, 0x30, 0x06, 0x01, 0x80, 0x60, 248 | 0x0C, 0x03, 0x00, 0xC0, 0x18, 0x06, 0x01, 0x80, 0x20, 0x0C, 0x03, 0x00, 249 | 0x40, 0x18, 0x06, 0x01, 0x80, 0x30, 0x0C, 0x03, 0x00, 0x60, 0x18, 0x06, 250 | 0x00, 0xC0, 0x30, 0xFF, 0xFF, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 251 | 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 252 | 0x1C, 0x7F, 0xFF, 0xFC, 0x07, 0x00, 0x78, 0x03, 0xC0, 0x3F, 0x01, 0xD8, 253 | 0x0C, 0xE0, 0xE3, 0x06, 0x1C, 0x70, 0xE3, 0x83, 0x18, 0x1D, 0xC0, 0x6C, 254 | 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF0, 0xF0, 0xE0, 0xE0, 255 | 0xE0, 0x07, 0xF0, 0x0F, 0xFC, 0x0F, 0xFF, 0x0F, 0x03, 0xC7, 0x00, 0xE0, 256 | 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0xFE, 0x0F, 0xFF, 0x1F, 0xF3, 257 | 0x9F, 0x01, 0xCF, 0x00, 0xE7, 0x00, 0x73, 0x80, 0x79, 0xE0, 0xFC, 0x7F, 258 | 0xEF, 0x9F, 0xE3, 0xC7, 0xE1, 0xE0, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 259 | 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE3, 0xE0, 0xEF, 0xF8, 260 | 0xFF, 0xFC, 0xFC, 0x3E, 0xF8, 0x1E, 0xF0, 0x0E, 0xE0, 0x0F, 0xE0, 0x07, 261 | 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0E, 262 | 0xF8, 0x1E, 0xFC, 0x3C, 0xEF, 0xFC, 0xEF, 0xF8, 0xE3, 0xE0, 0x07, 0xF0, 263 | 0x1F, 0xF8, 0x3F, 0xFC, 0x3C, 0x1E, 0x78, 0x0E, 0x70, 0x07, 0xE0, 0x00, 264 | 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x07, 265 | 0x70, 0x07, 0x78, 0x0E, 0x7C, 0x1E, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0, 266 | 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 267 | 0x1C, 0x00, 0x0E, 0x0F, 0xC7, 0x1F, 0xFB, 0x9F, 0xFF, 0xDF, 0x07, 0xEF, 268 | 0x01, 0xF7, 0x00, 0x7F, 0x80, 0x3F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03, 269 | 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x77, 0x00, 0x7B, 0xC0, 0x7D, 0xF0, 270 | 0x7E, 0x7F, 0xFB, 0x1F, 0xF9, 0x83, 0xF0, 0xC0, 0x07, 0xE0, 0x1F, 0xF8, 271 | 0x3F, 0xFC, 0x7C, 0x1E, 0x70, 0x0E, 0x60, 0x06, 0xE0, 0x07, 0xFF, 0xFF, 272 | 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0x70, 0x07, 273 | 0x78, 0x0E, 0x3C, 0x1E, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0, 0x0E, 0x3C, 274 | 0xF9, 0xC3, 0x87, 0x0E, 0x7F, 0xFF, 0xFC, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 275 | 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0x07, 0xC7, 0x1F, 276 | 0xF7, 0x3F, 0xFF, 0x3C, 0x3F, 0x78, 0x0F, 0x70, 0x0F, 0xE0, 0x07, 0xE0, 277 | 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0x70, 278 | 0x0F, 0x78, 0x0F, 0x7C, 0x3F, 0x3F, 0xF7, 0x1F, 0xE7, 0x07, 0xC7, 0x00, 279 | 0x07, 0x00, 0x07, 0x00, 0x0E, 0x70, 0x0E, 0x78, 0x1E, 0x3F, 0xFC, 0x1F, 280 | 0xF8, 0x07, 0xE0, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 281 | 0x1C, 0x00, 0x38, 0x00, 0x71, 0xF8, 0xE7, 0xFD, 0xDF, 0xFB, 0xF0, 0xFF, 282 | 0xC0, 0xFF, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 283 | 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 284 | 0xE0, 0x0F, 0xC0, 0x1C, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 285 | 0xFF, 0xFC, 0x1C, 0x71, 0xC7, 0x00, 0x00, 0x07, 0x1C, 0x71, 0xC7, 0x1C, 286 | 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 287 | 0x73, 0xFF, 0xFB, 0xC0, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 288 | 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x3C, 0xE0, 0x78, 0xE0, 0xF0, 289 | 0xE1, 0xE0, 0xE3, 0xC0, 0xE7, 0x80, 0xEF, 0x00, 0xEF, 0x80, 0xFF, 0x80, 290 | 0xFB, 0xC0, 0xF1, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xE0, 0x70, 0xE0, 0x78, 291 | 0xE0, 0x3C, 0xE0, 0x1C, 0xE0, 0x1E, 0xE0, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 292 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xE3, 0xE0, 0xF8, 0xE7, 0xF1, 0xFE, 293 | 0xEF, 0xFB, 0xFE, 0xF8, 0x7F, 0x0F, 0xF0, 0x3E, 0x07, 0xF0, 0x1C, 0x07, 294 | 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 295 | 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 296 | 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 297 | 0xE0, 0x1C, 0x07, 0xE3, 0xF1, 0xCF, 0xFB, 0xBF, 0xF7, 0xE1, 0xFF, 0x81, 298 | 0xFE, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 299 | 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 300 | 0x1F, 0x80, 0x38, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x87, 0x83, 0xC7, 301 | 0x80, 0xF3, 0x80, 0x3B, 0x80, 0x1F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, 302 | 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3B, 0x80, 0x39, 0xE0, 0x3C, 0x78, 303 | 0x3C, 0x3F, 0xFE, 0x0F, 0xFE, 0x01, 0xFC, 0x00, 0xE3, 0xE0, 0xE7, 0xF8, 304 | 0xEF, 0xFC, 0xFC, 0x3E, 0xF8, 0x1E, 0xF0, 0x0E, 0xE0, 0x0F, 0xE0, 0x07, 305 | 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0E, 306 | 0xF8, 0x1E, 0xFC, 0x3E, 0xFF, 0xFC, 0xEF, 0xF8, 0xE3, 0xE0, 0xE0, 0x00, 307 | 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0x07, 0xE1, 308 | 0x8F, 0xFC, 0xCF, 0xFF, 0x67, 0x83, 0xF7, 0x80, 0xFB, 0x80, 0x3F, 0xC0, 309 | 0x1F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 310 | 0x00, 0x3B, 0x80, 0x3D, 0xE0, 0x3E, 0xF8, 0x3F, 0x3F, 0xFF, 0x8F, 0xFD, 311 | 0xC1, 0xF8, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 312 | 0x07, 0x00, 0x03, 0x80, 0xE3, 0xF7, 0xFB, 0xFF, 0x8F, 0x07, 0x83, 0x81, 313 | 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 314 | 0x38, 0x00, 0x0F, 0xC0, 0xFF, 0x87, 0xFF, 0x3C, 0x1E, 0xE0, 0x3B, 0x80, 315 | 0x0E, 0x00, 0x3C, 0x00, 0x7F, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x7F, 0x00, 316 | 0x3F, 0x80, 0x7E, 0x01, 0xFC, 0x1F, 0x7F, 0xF8, 0xFF, 0xC1, 0xFC, 0x00, 317 | 0x38, 0x70, 0xE1, 0xCF, 0xFF, 0xFF, 0x9C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 318 | 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0xE7, 0xC7, 0x80, 0xE0, 0x0F, 0xC0, 319 | 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 320 | 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x03, 0xFC, 321 | 0x0F, 0xFC, 0x3F, 0x7F, 0xEE, 0xFF, 0x9C, 0x7E, 0x38, 0x70, 0x03, 0xB8, 322 | 0x03, 0x9C, 0x01, 0xC7, 0x00, 0xE3, 0x80, 0xE1, 0xC0, 0x70, 0x70, 0x38, 323 | 0x38, 0x38, 0x1C, 0x1C, 0x07, 0x0E, 0x03, 0x8E, 0x01, 0xC7, 0x00, 0x77, 324 | 0x00, 0x3B, 0x80, 0x1D, 0xC0, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 325 | 0x70, 0x00, 0xF0, 0x1C, 0x03, 0xB8, 0x1F, 0x03, 0xDC, 0x0F, 0x81, 0xCE, 326 | 0x07, 0xC0, 0xE7, 0x83, 0xE0, 0x71, 0xC3, 0xB8, 0x70, 0xE1, 0xDC, 0x38, 327 | 0x70, 0xEE, 0x1C, 0x1C, 0x63, 0x0E, 0x0E, 0x71, 0xCE, 0x07, 0x38, 0xE7, 328 | 0x03, 0x9C, 0x73, 0x80, 0xEC, 0x19, 0x80, 0x7E, 0x0F, 0xC0, 0x3F, 0x07, 329 | 0xE0, 0x0F, 0x83, 0xF0, 0x07, 0x80, 0xF0, 0x03, 0xC0, 0x78, 0x01, 0xE0, 330 | 0x3C, 0x00, 0x70, 0x07, 0x38, 0x0E, 0x3C, 0x1C, 0x1C, 0x1C, 0x0E, 0x38, 331 | 0x0F, 0x70, 0x07, 0x70, 0x03, 0xE0, 0x03, 0xC0, 0x01, 0xC0, 0x03, 0xE0, 332 | 0x07, 0xE0, 0x07, 0x70, 0x0E, 0x78, 0x1E, 0x38, 0x1C, 0x1C, 0x38, 0x1E, 333 | 0x78, 0x0E, 0x70, 0x07, 0x70, 0x07, 0x38, 0x03, 0x9C, 0x01, 0xC7, 0x01, 334 | 0xC3, 0x80, 0xE1, 0xC0, 0x70, 0x70, 0x70, 0x38, 0x38, 0x1C, 0x3C, 0x07, 335 | 0x1C, 0x03, 0x8E, 0x01, 0xCE, 0x00, 0x77, 0x00, 0x3B, 0x80, 0x1F, 0x80, 336 | 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x38, 337 | 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x0F, 338 | 0x00, 0x00, 0x7F, 0xFC, 0xFF, 0xF9, 0xFF, 0xF0, 0x00, 0xE0, 0x03, 0x80, 339 | 0x0E, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x1C, 0x00, 0x70, 340 | 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 341 | 0xFF, 0xF8, 0x07, 0x0F, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 342 | 0x1C, 0x1C, 0x1C, 0x1C, 0x38, 0xF8, 0xE0, 0xF8, 0x38, 0x1C, 0x1C, 0x1C, 343 | 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x0F, 0x07, 0xFF, 344 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE0, 0xF0, 0xF8, 0x38, 345 | 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x1C, 0x1F, 346 | 0x07, 0x1F, 0x1C, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 347 | 0x38, 0x38, 0xF8, 0xF0, 0xE0, 0x38, 0x00, 0xFC, 0x03, 0xFC, 0x1F, 0x3E, 348 | 0x3C, 0x1F, 0xE0, 0x1F, 0x80, 0x1E, 0x00 }; 349 | 350 | const GFXglyph FreeSans18pt7bGlyphs[] PROGMEM = { 351 | { 0, 0, 0, 9, 0, 1 }, // 0x20 ' ' 352 | { 0, 3, 26, 12, 4, -25 }, // 0x21 '!' 353 | { 10, 9, 9, 12, 1, -24 }, // 0x22 '"' 354 | { 21, 19, 24, 19, 0, -23 }, // 0x23 '#' 355 | { 78, 16, 30, 19, 2, -26 }, // 0x24 '$' 356 | { 138, 29, 25, 31, 1, -24 }, // 0x25 '%' 357 | { 229, 20, 25, 23, 2, -24 }, // 0x26 '&' 358 | { 292, 3, 9, 7, 2, -24 }, // 0x27 ''' 359 | { 296, 8, 33, 12, 3, -25 }, // 0x28 '(' 360 | { 329, 8, 33, 12, 1, -25 }, // 0x29 ')' 361 | { 362, 10, 10, 14, 2, -25 }, // 0x2A '*' 362 | { 375, 16, 16, 20, 2, -15 }, // 0x2B '+' 363 | { 407, 3, 9, 10, 3, -3 }, // 0x2C ',' 364 | { 411, 8, 3, 12, 2, -10 }, // 0x2D '-' 365 | { 414, 3, 4, 9, 3, -3 }, // 0x2E '.' 366 | { 416, 10, 26, 10, 0, -25 }, // 0x2F '/' 367 | { 449, 16, 25, 19, 2, -24 }, // 0x30 '0' 368 | { 499, 8, 25, 19, 4, -24 }, // 0x31 '1' 369 | { 524, 16, 25, 19, 2, -24 }, // 0x32 '2' 370 | { 574, 17, 25, 19, 1, -24 }, // 0x33 '3' 371 | { 628, 16, 25, 19, 1, -24 }, // 0x34 '4' 372 | { 678, 17, 25, 19, 1, -24 }, // 0x35 '5' 373 | { 732, 16, 25, 19, 2, -24 }, // 0x36 '6' 374 | { 782, 16, 25, 19, 2, -24 }, // 0x37 '7' 375 | { 832, 17, 25, 19, 1, -24 }, // 0x38 '8' 376 | { 886, 16, 25, 19, 1, -24 }, // 0x39 '9' 377 | { 936, 3, 19, 9, 3, -18 }, // 0x3A ':' 378 | { 944, 3, 24, 9, 3, -18 }, // 0x3B ';' 379 | { 953, 17, 17, 20, 2, -16 }, // 0x3C '<' 380 | { 990, 17, 9, 20, 2, -12 }, // 0x3D '=' 381 | { 1010, 17, 17, 20, 2, -16 }, // 0x3E '>' 382 | { 1047, 15, 26, 19, 3, -25 }, // 0x3F '?' 383 | { 1096, 32, 31, 36, 1, -25 }, // 0x40 '@' 384 | { 1220, 22, 26, 23, 1, -25 }, // 0x41 'A' 385 | { 1292, 19, 26, 23, 3, -25 }, // 0x42 'B' 386 | { 1354, 22, 26, 25, 1, -25 }, // 0x43 'C' 387 | { 1426, 20, 26, 24, 3, -25 }, // 0x44 'D' 388 | { 1491, 18, 26, 22, 3, -25 }, // 0x45 'E' 389 | { 1550, 17, 26, 21, 3, -25 }, // 0x46 'F' 390 | { 1606, 24, 26, 27, 1, -25 }, // 0x47 'G' 391 | { 1684, 19, 26, 25, 3, -25 }, // 0x48 'H' 392 | { 1746, 3, 26, 10, 4, -25 }, // 0x49 'I' 393 | { 1756, 14, 26, 18, 1, -25 }, // 0x4A 'J' 394 | { 1802, 20, 26, 24, 3, -25 }, // 0x4B 'K' 395 | { 1867, 15, 26, 20, 3, -25 }, // 0x4C 'L' 396 | { 1916, 24, 26, 30, 3, -25 }, // 0x4D 'M' 397 | { 1994, 20, 26, 26, 3, -25 }, // 0x4E 'N' 398 | { 2059, 25, 26, 27, 1, -25 }, // 0x4F 'O' 399 | { 2141, 18, 26, 23, 3, -25 }, // 0x50 'P' 400 | { 2200, 25, 28, 27, 1, -25 }, // 0x51 'Q' 401 | { 2288, 20, 26, 25, 3, -25 }, // 0x52 'R' 402 | { 2353, 20, 26, 23, 1, -25 }, // 0x53 'S' 403 | { 2418, 19, 26, 22, 1, -25 }, // 0x54 'T' 404 | { 2480, 19, 26, 25, 3, -25 }, // 0x55 'U' 405 | { 2542, 21, 26, 23, 1, -25 }, // 0x56 'V' 406 | { 2611, 32, 26, 33, 0, -25 }, // 0x57 'W' 407 | { 2715, 21, 26, 23, 1, -25 }, // 0x58 'X' 408 | { 2784, 23, 26, 24, 0, -25 }, // 0x59 'Y' 409 | { 2859, 19, 26, 22, 1, -25 }, // 0x5A 'Z' 410 | { 2921, 6, 33, 10, 2, -25 }, // 0x5B '[' 411 | { 2946, 10, 26, 10, 0, -25 }, // 0x5C '\' 412 | { 2979, 6, 33, 10, 1, -25 }, // 0x5D ']' 413 | { 3004, 13, 13, 16, 2, -24 }, // 0x5E '^' 414 | { 3026, 21, 2, 19, -1, 5 }, // 0x5F '_' 415 | { 3032, 7, 5, 9, 1, -25 }, // 0x60 '`' 416 | { 3037, 17, 19, 19, 1, -18 }, // 0x61 'a' 417 | { 3078, 16, 26, 20, 2, -25 }, // 0x62 'b' 418 | { 3130, 16, 19, 18, 1, -18 }, // 0x63 'c' 419 | { 3168, 17, 26, 20, 1, -25 }, // 0x64 'd' 420 | { 3224, 16, 19, 19, 1, -18 }, // 0x65 'e' 421 | { 3262, 7, 26, 10, 1, -25 }, // 0x66 'f' 422 | { 3285, 16, 27, 19, 1, -18 }, // 0x67 'g' 423 | { 3339, 15, 26, 19, 2, -25 }, // 0x68 'h' 424 | { 3388, 3, 26, 8, 2, -25 }, // 0x69 'i' 425 | { 3398, 6, 34, 9, 0, -25 }, // 0x6A 'j' 426 | { 3424, 16, 26, 18, 2, -25 }, // 0x6B 'k' 427 | { 3476, 3, 26, 7, 2, -25 }, // 0x6C 'l' 428 | { 3486, 24, 19, 28, 2, -18 }, // 0x6D 'm' 429 | { 3543, 15, 19, 19, 2, -18 }, // 0x6E 'n' 430 | { 3579, 17, 19, 19, 1, -18 }, // 0x6F 'o' 431 | { 3620, 16, 25, 20, 2, -18 }, // 0x70 'p' 432 | { 3670, 17, 25, 20, 1, -18 }, // 0x71 'q' 433 | { 3724, 9, 19, 12, 2, -18 }, // 0x72 'r' 434 | { 3746, 14, 19, 17, 2, -18 }, // 0x73 's' 435 | { 3780, 7, 23, 10, 1, -22 }, // 0x74 't' 436 | { 3801, 15, 19, 19, 2, -18 }, // 0x75 'u' 437 | { 3837, 17, 19, 17, 0, -18 }, // 0x76 'v' 438 | { 3878, 25, 19, 25, 0, -18 }, // 0x77 'w' 439 | { 3938, 16, 19, 17, 0, -18 }, // 0x78 'x' 440 | { 3976, 17, 27, 17, 0, -18 }, // 0x79 'y' 441 | { 4034, 15, 19, 17, 1, -18 }, // 0x7A 'z' 442 | { 4070, 8, 33, 12, 1, -25 }, // 0x7B '{' 443 | { 4103, 2, 33, 9, 3, -25 }, // 0x7C '|' 444 | { 4112, 8, 33, 12, 3, -25 }, // 0x7D '}' 445 | { 4145, 15, 7, 18, 1, -15 } }; // 0x7E '~' 446 | 447 | const GFXfont FreeSans18pt7b PROGMEM = { 448 | (uint8_t *)FreeSans18pt7bBitmaps, 449 | (GFXglyph *)FreeSans18pt7bGlyphs, 450 | 0x20, 0x7E, 42 }; 451 | 452 | // Approx. 4831 bytes 453 | -------------------------------------------------------------------------------- /src/Fonts/FreeSansBoldOblique18pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeSansBoldOblique18pt7bBitmaps[] PROGMEM = { 2 | 0x06, 0x01, 0xC0, 0x7C, 0x1F, 0x0F, 0xC3, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 3 | 0xC0, 0xF0, 0x7C, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1C, 0x07, 0x01, 0xC0, 4 | 0x60, 0x7C, 0x1F, 0x07, 0xC3, 0xF0, 0xF8, 0x00, 0x78, 0x7B, 0xC3, 0xFE, 5 | 0x3F, 0xE1, 0xEF, 0x0F, 0x78, 0x7B, 0x83, 0x9C, 0x1C, 0xC0, 0xC0, 0x00, 6 | 0x3C, 0x38, 0x00, 0xF1, 0xE0, 0x07, 0x87, 0x00, 0x1E, 0x3C, 0x00, 0xF0, 7 | 0xE0, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x1F, 0xFF, 0xF8, 8 | 0x0F, 0x0E, 0x00, 0x3C, 0x78, 0x00, 0xE1, 0xE0, 0x07, 0x8F, 0x00, 0x1C, 9 | 0x3C, 0x07, 0xFF, 0xFE, 0x1F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE3, 0xFF, 0xFF, 10 | 0x01, 0xE3, 0xC0, 0x0F, 0x0E, 0x00, 0x3C, 0x78, 0x01, 0xE1, 0xC0, 0x07, 11 | 0x8F, 0x00, 0x3C, 0x38, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0xFC, 12 | 0x00, 0xFF, 0xC0, 0x3F, 0xFC, 0x0F, 0xFF, 0xC3, 0xE6, 0x78, 0x78, 0xCF, 13 | 0x1E, 0x39, 0xE3, 0xC7, 0x3C, 0x78, 0xC0, 0x0F, 0x98, 0x01, 0xFF, 0x00, 14 | 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 15 | 0x03, 0xBE, 0x00, 0x67, 0xCF, 0x8C, 0xF9, 0xF1, 0x9F, 0x3E, 0x77, 0xC7, 16 | 0xEF, 0xF8, 0x7F, 0xFE, 0x0F, 0xFF, 0x80, 0xFF, 0xE0, 0x03, 0xE0, 0x00, 17 | 0x38, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x07, 0x01, 0xE0, 18 | 0x03, 0x81, 0xFE, 0x00, 0xC0, 0xFF, 0x80, 0x70, 0x7F, 0xF0, 0x38, 0x1E, 19 | 0x3C, 0x1C, 0x0F, 0x07, 0x06, 0x03, 0x81, 0xC3, 0x80, 0xE0, 0xF1, 0xC0, 20 | 0x3C, 0x78, 0xE0, 0x0F, 0xFE, 0x30, 0x01, 0xFF, 0x1C, 0x00, 0x7F, 0x8E, 21 | 0x00, 0x07, 0x83, 0x00, 0x00, 0x01, 0x83, 0xE0, 0x00, 0xE3, 0xFE, 0x00, 22 | 0x71, 0xFF, 0x80, 0x18, 0xFF, 0xF0, 0x0C, 0x3C, 0x3C, 0x07, 0x1C, 0x07, 23 | 0x03, 0x87, 0x01, 0xC0, 0xC1, 0xE1, 0xE0, 0x60, 0x7F, 0xF8, 0x38, 0x0F, 24 | 0xFC, 0x1C, 0x03, 0xFE, 0x06, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x03, 25 | 0xFC, 0x00, 0x3F, 0xF0, 0x03, 0xFF, 0x80, 0x3F, 0x3C, 0x01, 0xF1, 0xE0, 26 | 0x0F, 0x8F, 0x00, 0x7C, 0xF0, 0x03, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0x3F, 27 | 0x00, 0x03, 0xF0, 0x00, 0x7F, 0xC7, 0x8F, 0xFE, 0x3C, 0xFC, 0xFB, 0xCF, 28 | 0x83, 0xFE, 0xF8, 0x1F, 0xE7, 0xC0, 0x7E, 0x3E, 0x03, 0xE1, 0xF0, 0x1F, 29 | 0x0F, 0xE3, 0xFC, 0x7F, 0xFF, 0xE1, 0xFF, 0xFF, 0x87, 0xFE, 0x7C, 0x0F, 30 | 0xE1, 0xF0, 0x7B, 0xFF, 0xEF, 0x7B, 0x9C, 0xC0, 0x00, 0x78, 0x07, 0x80, 31 | 0x78, 0x03, 0x80, 0x3C, 0x03, 0xC0, 0x1E, 0x01, 0xE0, 0x1E, 0x00, 0xF0, 32 | 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0xF0, 0x07, 33 | 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 34 | 0x07, 0x80, 0x1C, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x00, 0xE0, 0x07, 0x80, 35 | 0x1C, 0x00, 0x01, 0xC0, 0x0F, 0x00, 0x38, 0x01, 0xE0, 0x0F, 0x00, 0x78, 36 | 0x01, 0xC0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 37 | 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0xF8, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x1E, 38 | 0x00, 0xF0, 0x07, 0x80, 0x78, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x1E, 0x01, 39 | 0xE0, 0x1E, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x00, 0x03, 0x00, 0x70, 0x07, 40 | 0x04, 0x63, 0xFF, 0xF7, 0xFF, 0x1F, 0x83, 0xF0, 0x3B, 0x87, 0x38, 0x21, 41 | 0x00, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 42 | 0x00, 0x7C, 0x07, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xE0, 43 | 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x1E, 44 | 0x00, 0x3E, 0x7C, 0xF3, 0xE7, 0xC1, 0x87, 0x0C, 0x39, 0xE3, 0x00, 0x7F, 45 | 0xDF, 0xFF, 0xFB, 0xFE, 0x7D, 0xF7, 0xBE, 0xF8, 0x00, 0x0E, 0x00, 0x18, 46 | 0x00, 0x70, 0x00, 0xC0, 0x03, 0x80, 0x06, 0x00, 0x1C, 0x00, 0x30, 0x00, 47 | 0xE0, 0x01, 0x80, 0x07, 0x00, 0x0C, 0x00, 0x38, 0x00, 0x60, 0x01, 0xC0, 48 | 0x03, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x70, 0x00, 0xC0, 0x03, 0x80, 0x06, 49 | 0x00, 0x1C, 0x00, 0x30, 0x00, 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x7F, 0xC0, 50 | 0x7F, 0xF8, 0x3F, 0xFE, 0x0F, 0x8F, 0xC7, 0xC1, 0xF1, 0xE0, 0x7C, 0xF8, 51 | 0x1F, 0x3E, 0x07, 0xDF, 0x01, 0xF7, 0xC0, 0x7D, 0xF0, 0x3F, 0x7C, 0x0F, 52 | 0xBF, 0x03, 0xEF, 0x80, 0xFB, 0xE0, 0x3E, 0xF8, 0x1F, 0x3E, 0x07, 0xCF, 53 | 0x81, 0xE3, 0xE0, 0xF8, 0xFC, 0x7C, 0x1F, 0xFF, 0x07, 0xFF, 0x80, 0xFF, 54 | 0xC0, 0x0F, 0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x3C, 0x03, 0xE0, 0xFF, 55 | 0x3F, 0xF3, 0xFF, 0x9F, 0xFC, 0x03, 0xE0, 0x1F, 0x01, 0xF0, 0x0F, 0x80, 56 | 0x7C, 0x03, 0xE0, 0x1E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x3E, 57 | 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x3E, 0x00, 0x00, 0x1F, 0x80, 58 | 0x07, 0xFF, 0x00, 0x7F, 0xFC, 0x07, 0xFF, 0xE0, 0x7E, 0x1F, 0x83, 0xE0, 59 | 0x7C, 0x1F, 0x03, 0xE1, 0xF0, 0x1F, 0x0F, 0x80, 0xF8, 0x00, 0x0F, 0x80, 60 | 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xE0, 0x00, 0xFC, 61 | 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 62 | 0x00, 0x03, 0xF0, 0x00, 0x1F, 0xFF, 0xE1, 0xFF, 0xFF, 0x0F, 0xFF, 0xF0, 63 | 0x7F, 0xFF, 0x80, 0x00, 0x7F, 0x00, 0x1F, 0xFC, 0x03, 0xFF, 0xE0, 0x7F, 64 | 0xFF, 0x0F, 0x83, 0xF0, 0xF0, 0x1F, 0x1F, 0x01, 0xF1, 0xE0, 0x1F, 0x00, 65 | 0x03, 0xE0, 0x00, 0xFC, 0x00, 0xFF, 0x80, 0x0F, 0xF0, 0x00, 0xFF, 0x80, 66 | 0x0F, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xCF, 0x80, 0x7C, 67 | 0xF8, 0x07, 0xCF, 0x80, 0xF8, 0xFC, 0x3F, 0x8F, 0xFF, 0xF0, 0x7F, 0xFE, 68 | 0x03, 0xFF, 0xC0, 0x0F, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x01, 0xFC, 0x00, 69 | 0x7F, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, 0xEF, 0x80, 0x3D, 0xF0, 0x0F, 70 | 0x7C, 0x03, 0xCF, 0x80, 0xF1, 0xF0, 0x1C, 0x3E, 0x07, 0x07, 0xC1, 0xE1, 71 | 0xF0, 0x78, 0x3E, 0x1E, 0x07, 0xC3, 0xFF, 0xFE, 0x7F, 0xFF, 0xDF, 0xFF, 72 | 0xFB, 0xFF, 0xFF, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, 0x1F, 73 | 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x01, 0xFF, 0xF0, 0x3F, 0xFF, 0x03, 74 | 0xFF, 0xF0, 0x3F, 0xFF, 0x07, 0x80, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x00, 75 | 0xF7, 0xE0, 0x0F, 0xFF, 0x01, 0xFF, 0xF8, 0x1F, 0xFF, 0x83, 0xF0, 0xFC, 76 | 0x3E, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 77 | 0x8F, 0x80, 0xF8, 0xF8, 0x1F, 0x8F, 0xC3, 0xF0, 0xFF, 0xFE, 0x07, 0xFF, 78 | 0xC0, 0x3F, 0xF8, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F, 79 | 0xFF, 0x03, 0xFF, 0xE0, 0xF8, 0x7E, 0x3E, 0x07, 0xC7, 0x80, 0x01, 0xF0, 80 | 0x00, 0x3C, 0xFC, 0x07, 0xFF, 0xC1, 0xFF, 0xFC, 0x3F, 0xFF, 0xC7, 0xE1, 81 | 0xF8, 0xF8, 0x1F, 0x3E, 0x03, 0xE7, 0x80, 0x7C, 0xF0, 0x0F, 0x9E, 0x01, 82 | 0xE3, 0xC0, 0x7C, 0x78, 0x1F, 0x0F, 0x87, 0xE0, 0xFF, 0xF8, 0x1F, 0xFE, 83 | 0x01, 0xFF, 0x80, 0x0F, 0xC0, 0x00, 0x7F, 0xFF, 0xEF, 0xFF, 0xF9, 0xFF, 84 | 0xFF, 0x7F, 0xFF, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 85 | 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x07, 0x80, 0x01, 0xF0, 0x00, 0x7C, 86 | 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x07, 0xC0, 87 | 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x3E, 0x00, 88 | 0x07, 0xC0, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0xFC, 0x07, 0xFF, 0xE0, 0xFF, 89 | 0xFF, 0x0F, 0x81, 0xF1, 0xF0, 0x0F, 0x1E, 0x00, 0xF1, 0xE0, 0x1E, 0x1F, 90 | 0x07, 0xE0, 0xFF, 0xFC, 0x07, 0xFF, 0x00, 0xFF, 0xF8, 0x1F, 0xFF, 0x83, 91 | 0xF0, 0xFC, 0x7C, 0x07, 0xC7, 0xC0, 0x7C, 0xF8, 0x07, 0xCF, 0x80, 0x7C, 92 | 0xF8, 0x0F, 0x8F, 0x80, 0xF8, 0xFC, 0x3F, 0x0F, 0xFF, 0xF0, 0x7F, 0xFE, 93 | 0x03, 0xFF, 0x80, 0x0F, 0xE0, 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F, 94 | 0xFF, 0x03, 0xFF, 0xE0, 0xFC, 0x3E, 0x3F, 0x03, 0xC7, 0xC0, 0x79, 0xF0, 95 | 0x0F, 0x3E, 0x01, 0xE7, 0xC0, 0x3C, 0xF8, 0x0F, 0x9F, 0x03, 0xE3, 0xF0, 96 | 0xFC, 0x7F, 0xFF, 0x87, 0xFF, 0xF0, 0x7F, 0xFE, 0x07, 0xE7, 0x80, 0x01, 97 | 0xF0, 0x00, 0x3C, 0x7C, 0x0F, 0x8F, 0xC3, 0xE1, 0xFF, 0xF8, 0x1F, 0xFE, 98 | 0x01, 0xFF, 0x80, 0x0F, 0xC0, 0x00, 0x0F, 0x87, 0xC3, 0xC3, 0xE1, 0xF0, 99 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE1, 0xF0, 0xF0, 100 | 0xF8, 0x7C, 0x00, 0x07, 0xC1, 0xF0, 0x78, 0x3E, 0x0F, 0x80, 0x00, 0x00, 101 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x83, 0xE0, 0xF0, 0x7C, 102 | 0x1F, 0x00, 0xC0, 0x70, 0x18, 0x0E, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x20, 103 | 0x00, 0x3C, 0x00, 0x3F, 0x80, 0x3F, 0xE0, 0x3F, 0xFC, 0x3F, 0xFC, 0x1F, 104 | 0xFC, 0x07, 0xFC, 0x00, 0xFC, 0x00, 0x1F, 0xF0, 0x03, 0xFF, 0x80, 0x1F, 105 | 0xFE, 0x00, 0xFF, 0xF0, 0x03, 0xFE, 0x00, 0x1F, 0xC0, 0x00, 0x78, 0x00, 106 | 0x03, 0x00, 0x1F, 0xFF, 0xF3, 0xFF, 0xFE, 0x3F, 0xFF, 0xE3, 0xFF, 0xFE, 107 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 108 | 0xC7, 0xFF, 0xFC, 0xFF, 0xFF, 0x8F, 0xFF, 0xF8, 0x18, 0x00, 0x03, 0xC0, 109 | 0x00, 0x7F, 0x00, 0x0F, 0xF8, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0x3F, 110 | 0xF8, 0x01, 0xFF, 0x00, 0x07, 0xE0, 0x07, 0xFC, 0x07, 0xFF, 0x07, 0xFF, 111 | 0x87, 0xFF, 0x80, 0xFF, 0x80, 0x3F, 0x80, 0x07, 0x80, 0x00, 0x80, 0x00, 112 | 0x00, 0x03, 0xF8, 0x03, 0xFF, 0xC1, 0xFF, 0xF8, 0xFF, 0xFE, 0x7E, 0x1F, 113 | 0xDF, 0x03, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xC0, 0x03, 0xE0, 114 | 0x01, 0xF8, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F, 115 | 0x80, 0x07, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 116 | 0x07, 0xC0, 0x01, 0xF0, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x00, 117 | 0x00, 0x00, 0x7F, 0x80, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xFE, 118 | 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x0F, 0xC0, 0x03, 0xE0, 0x0F, 0x80, 0x00, 119 | 0xF8, 0x0F, 0x00, 0x00, 0x3C, 0x0F, 0x01, 0xF1, 0xCF, 0x0F, 0x03, 0xFD, 120 | 0xC7, 0x8F, 0x03, 0xFF, 0xE1, 0xC7, 0x03, 0xE3, 0xE0, 0xE7, 0x03, 0xC0, 121 | 0xF0, 0x73, 0x83, 0xC0, 0x78, 0x3B, 0x81, 0xE0, 0x38, 0x1D, 0xC1, 0xE0, 122 | 0x1C, 0x1C, 0xC0, 0xF0, 0x1C, 0x0E, 0xE0, 0x70, 0x0E, 0x0F, 0x70, 0x78, 123 | 0x0E, 0x07, 0x38, 0x3C, 0x0F, 0x07, 0x1C, 0x1E, 0x0F, 0x87, 0x8E, 0x0F, 124 | 0x8F, 0xCF, 0x87, 0x07, 0xFF, 0xFF, 0x83, 0xC1, 0xFE, 0x7F, 0x00, 0xE0, 125 | 0x3C, 0x1F, 0x00, 0x78, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0F, 126 | 0xC0, 0x01, 0x00, 0x03, 0xF8, 0x07, 0x80, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 127 | 0x1F, 0xFF, 0xE0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 128 | 0x0F, 0xE0, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xC0, 0x00, 0xFF, 0x80, 0x03, 129 | 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x1F, 0x7C, 0x00, 0x7E, 0xF8, 0x00, 0xF9, 130 | 0xF0, 0x03, 0xF3, 0xE0, 0x07, 0xC3, 0xE0, 0x1F, 0x87, 0xC0, 0x3E, 0x0F, 131 | 0x80, 0xF8, 0x1F, 0x01, 0xF0, 0x3E, 0x07, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8, 132 | 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xF1, 0xF0, 0x03, 0xE7, 0xC0, 0x07, 0xCF, 133 | 0x80, 0x0F, 0xBE, 0x00, 0x1F, 0x7C, 0x00, 0x3F, 0xF0, 0x00, 0x7C, 0x07, 134 | 0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x0F, 135 | 0xC0, 0x3F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x1F, 136 | 0x80, 0x1E, 0x1F, 0x80, 0x3E, 0x1F, 0x00, 0x7C, 0x1F, 0xFF, 0xF8, 0x1F, 137 | 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x3E, 0x00, 0xFC, 0x3E, 138 | 0x00, 0x7C, 0x3E, 0x00, 0x7C, 0x7E, 0x00, 0x7C, 0x7C, 0x00, 0x7C, 0x7C, 139 | 0x00, 0xF8, 0x7C, 0x01, 0xF8, 0x7F, 0xFF, 0xF0, 0xFF, 0xFF, 0xE0, 0xFF, 140 | 0xFF, 0xC0, 0xFF, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xF8, 0x01, 141 | 0xFF, 0xFC, 0x03, 0xFF, 0xFE, 0x07, 0xE0, 0x7F, 0x0F, 0xC0, 0x3F, 0x1F, 142 | 0x80, 0x1F, 0x3F, 0x00, 0x1F, 0x3E, 0x00, 0x1F, 0x7E, 0x00, 0x00, 0x7C, 143 | 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 144 | 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x7C, 0xF8, 145 | 0x00, 0x7C, 0xFC, 0x00, 0xF8, 0xFC, 0x01, 0xF8, 0x7F, 0x07, 0xF0, 0x7F, 146 | 0xFF, 0xE0, 0x3F, 0xFF, 0xC0, 0x0F, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x07, 147 | 0xFF, 0xE0, 0x07, 0xFF, 0xF8, 0x07, 0xFF, 0xFC, 0x0F, 0xFF, 0xFE, 0x0F, 148 | 0x80, 0x7E, 0x0F, 0x80, 0x3F, 0x0F, 0x80, 0x1F, 0x1F, 0x80, 0x1F, 0x1F, 149 | 0x80, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x3F, 150 | 0x00, 0x1F, 0x3E, 0x00, 0x3E, 0x3E, 0x00, 0x3E, 0x3E, 0x00, 0x3E, 0x3E, 151 | 0x00, 0x3E, 0x7E, 0x00, 0x7C, 0x7C, 0x00, 0x7C, 0x7C, 0x00, 0xF8, 0x7C, 152 | 0x01, 0xF8, 0x7C, 0x07, 0xF0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xC0, 0xFF, 153 | 0xFF, 0x00, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFF, 0x07, 0xFF, 0xFE, 0x07, 154 | 0xFF, 0xFE, 0x0F, 0xFF, 0xFE, 0x0F, 0x80, 0x00, 0x0F, 0x80, 0x00, 0x0F, 155 | 0x80, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x1F, 156 | 0x00, 0x00, 0x1F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF0, 0x3F, 157 | 0xFF, 0xF0, 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7E, 158 | 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFF, 159 | 0xFF, 0xF0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0x07, 160 | 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0xE0, 0xF8, 161 | 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x00, 162 | 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0xFF, 0xFE, 163 | 0x07, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 164 | 0xFC, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 165 | 0x80, 0x00, 0x3F, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 166 | 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xF8, 0x01, 0xFF, 0xFC, 0x03, 167 | 0xFF, 0xFE, 0x07, 0xE0, 0x7E, 0x0F, 0x80, 0x3F, 0x1F, 0x00, 0x1F, 0x3E, 168 | 0x00, 0x1F, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 169 | 0x00, 0x00, 0xF8, 0x03, 0xFF, 0xF8, 0x07, 0xFF, 0xF8, 0x07, 0xFE, 0xF8, 170 | 0x07, 0xFE, 0xF8, 0x00, 0x3E, 0xF8, 0x00, 0x3E, 0xFC, 0x00, 0x7E, 0xFC, 171 | 0x00, 0x7C, 0x7E, 0x00, 0xFC, 0x7F, 0x83, 0xFC, 0x3F, 0xFF, 0xFC, 0x1F, 172 | 0xFF, 0xBC, 0x0F, 0xFF, 0x38, 0x03, 0xFC, 0x38, 0x03, 0xE0, 0x07, 0xC0, 173 | 0xF8, 0x01, 0xF0, 0x7E, 0x00, 0x7C, 0x1F, 0x00, 0x3F, 0x07, 0xC0, 0x0F, 174 | 0x81, 0xF0, 0x03, 0xE0, 0xFC, 0x00, 0xF8, 0x3E, 0x00, 0x3E, 0x0F, 0x80, 175 | 0x1F, 0x83, 0xE0, 0x07, 0xC0, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, 0x1F, 176 | 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC1, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 177 | 0x3F, 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x83, 0xE0, 0x07, 0xE0, 0xF8, 0x01, 178 | 0xF0, 0x3E, 0x00, 0x7C, 0x1F, 0x80, 0x1F, 0x07, 0xC0, 0x0F, 0xC1, 0xF0, 179 | 0x03, 0xF0, 0x7C, 0x00, 0xF8, 0x3F, 0x00, 0x3E, 0x00, 0x07, 0xC3, 0xF0, 180 | 0xFC, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x7E, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 181 | 0x3F, 0x0F, 0xC3, 0xE0, 0xF8, 0x3E, 0x0F, 0x87, 0xE1, 0xF0, 0x7C, 0x1F, 182 | 0x07, 0xC3, 0xF0, 0xFC, 0x3E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 183 | 0x01, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 184 | 0x00, 0x3E, 0x00, 0x07, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 185 | 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x7C, 0x0F, 186 | 0x8F, 0x81, 0xF8, 0xF8, 0x1F, 0x0F, 0x81, 0xF0, 0xF8, 0x1F, 0x0F, 0xC3, 187 | 0xF0, 0xFF, 0xFE, 0x07, 0xFF, 0xC0, 0x3F, 0xF8, 0x01, 0xFC, 0x00, 0x07, 188 | 0xC0, 0x0F, 0xC1, 0xF0, 0x07, 0xE0, 0x7C, 0x03, 0xF0, 0x3F, 0x03, 0xF8, 189 | 0x0F, 0x81, 0xF8, 0x03, 0xE0, 0xFC, 0x00, 0xF8, 0x7E, 0x00, 0x7E, 0x3F, 190 | 0x00, 0x1F, 0x1F, 0x80, 0x07, 0xCF, 0xC0, 0x01, 0xF7, 0xE0, 0x00, 0x7F, 191 | 0xF0, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 192 | 0xFE, 0xFC, 0x00, 0x3F, 0x1F, 0x80, 0x1F, 0x87, 0xE0, 0x07, 0xC0, 0xFC, 193 | 0x01, 0xF0, 0x3F, 0x00, 0x7C, 0x07, 0xE0, 0x1F, 0x01, 0xFC, 0x0F, 0xC0, 194 | 0x3F, 0x03, 0xE0, 0x0F, 0xE0, 0xF8, 0x01, 0xF8, 0x3E, 0x00, 0x3F, 0x00, 195 | 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x0F, 0xC0, 0x03, 196 | 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F, 0x80, 0x07, 0xC0, 0x01, 0xF0, 197 | 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x0F, 0xC0, 0x03, 0xE0, 0x00, 0xF8, 0x00, 198 | 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 199 | 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xE0, 0x03, 200 | 0xF8, 0x01, 0xFC, 0x07, 0xF0, 0x07, 0xF8, 0x1F, 0xE0, 0x0F, 0xF0, 0x3F, 201 | 0xC0, 0x3F, 0xE0, 0x7F, 0x80, 0x7F, 0xC0, 0xFF, 0x01, 0xFF, 0x01, 0xFE, 202 | 0x03, 0xFE, 0x07, 0xDC, 0x07, 0x7C, 0x0F, 0xB8, 0x1E, 0xF8, 0x1F, 0x70, 203 | 0x3D, 0xF0, 0x3E, 0xF0, 0xF7, 0xC0, 0xF9, 0xE1, 0xEF, 0x81, 0xF3, 0xC7, 204 | 0x9F, 0x03, 0xE7, 0x8F, 0x3E, 0x07, 0xCF, 0x3C, 0x7C, 0x0F, 0x9E, 0x79, 205 | 0xF0, 0x3E, 0x3C, 0xE3, 0xE0, 0x7C, 0x7B, 0xC7, 0xC0, 0xF8, 0xF7, 0x8F, 206 | 0x81, 0xF1, 0xFE, 0x1E, 0x07, 0xE3, 0xFC, 0x7C, 0x0F, 0x87, 0xF0, 0xF8, 207 | 0x1F, 0x0F, 0xE1, 0xF0, 0x3E, 0x1F, 0x83, 0xE0, 0x7C, 0x3F, 0x0F, 0x81, 208 | 0xF0, 0x7E, 0x1F, 0x00, 0x03, 0xE0, 0x07, 0xC0, 0x7E, 0x00, 0xF8, 0x1F, 209 | 0xC0, 0x1F, 0x03, 0xF8, 0x03, 0xE0, 0x7F, 0x80, 0x7C, 0x0F, 0xF0, 0x1F, 210 | 0x01, 0xFF, 0x03, 0xE0, 0x7F, 0xE0, 0x7C, 0x0F, 0xBC, 0x0F, 0x81, 0xF7, 211 | 0xC1, 0xF0, 0x3E, 0xF8, 0x7C, 0x0F, 0x8F, 0x0F, 0x81, 0xF1, 0xF1, 0xF0, 212 | 0x3E, 0x3E, 0x3E, 0x07, 0xC3, 0xC7, 0xC0, 0xF8, 0x7D, 0xF0, 0x3E, 0x0F, 213 | 0xBE, 0x07, 0xC0, 0xF7, 0xC0, 0xF8, 0x1F, 0xF8, 0x1F, 0x01, 0xFE, 0x03, 214 | 0xC0, 0x3F, 0xC0, 0xF8, 0x07, 0xF8, 0x1F, 0x00, 0x7F, 0x03, 0xE0, 0x0F, 215 | 0xE0, 0x7C, 0x01, 0xF8, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0xE0, 0x00, 216 | 0x3F, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x7E, 0x07, 0xF0, 217 | 0x7E, 0x01, 0xF8, 0x7C, 0x00, 0x7E, 0x3E, 0x00, 0x1F, 0x3E, 0x00, 0x0F, 218 | 0x9E, 0x00, 0x07, 0xDF, 0x00, 0x03, 0xEF, 0x80, 0x01, 0xFF, 0x80, 0x00, 219 | 0xFF, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x7D, 0xF0, 0x00, 0x3E, 0xF8, 0x00, 220 | 0x1F, 0x7C, 0x00, 0x1F, 0x3E, 0x00, 0x1F, 0x9F, 0x80, 0x0F, 0x87, 0xE0, 221 | 0x0F, 0x83, 0xF8, 0x1F, 0x80, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0x80, 0x0F, 222 | 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, 223 | 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0xF0, 0xF8, 0x07, 0xE1, 0xF0, 0x07, 0xC3, 224 | 0xE0, 0x0F, 0x8F, 0xC0, 0x1F, 0x1F, 0x00, 0x3E, 0x3E, 0x00, 0xF8, 0x7C, 225 | 0x01, 0xF0, 0xF8, 0x07, 0xC3, 0xFF, 0xFF, 0x87, 0xFF, 0xFE, 0x0F, 0xFF, 226 | 0xF8, 0x1F, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF0, 0x00, 227 | 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x3F, 0x00, 0x00, 228 | 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x1F, 0xC0, 229 | 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x7F, 0x07, 230 | 0xF0, 0x7E, 0x01, 0xF8, 0x7E, 0x00, 0x7E, 0x3E, 0x00, 0x1F, 0x3E, 0x00, 231 | 0x0F, 0x9E, 0x00, 0x07, 0xDF, 0x00, 0x03, 0xEF, 0x80, 0x01, 0xF7, 0x80, 232 | 0x00, 0xFF, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x7D, 0xF0, 0x00, 0x3E, 0xF8, 233 | 0x02, 0x1F, 0x7C, 0x03, 0x9F, 0x3E, 0x03, 0xFF, 0x9F, 0x81, 0xFF, 0x87, 234 | 0xE0, 0x7F, 0x83, 0xF8, 0x3F, 0xC0, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xF0, 235 | 0x0F, 0xFF, 0xFC, 0x01, 0xFE, 0x1C, 0x00, 0x00, 0x0C, 0x00, 0x07, 0xFF, 236 | 0xF8, 0x07, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x0F, 0x80, 237 | 0x3F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x1F, 0x80, 238 | 0x1E, 0x1F, 0x00, 0x3E, 0x1F, 0x00, 0x7C, 0x1F, 0xFF, 0xF8, 0x1F, 0xFF, 239 | 0xE0, 0x3F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x3E, 0x01, 0xF8, 0x3E, 0x00, 240 | 0xF8, 0x3E, 0x00, 0xF8, 0x7E, 0x00, 0xF8, 0x7C, 0x00, 0xF8, 0x7C, 0x01, 241 | 0xF0, 0x7C, 0x01, 0xF0, 0x7C, 0x01, 0xF0, 0xFC, 0x01, 0xF0, 0xF8, 0x01, 242 | 0xF0, 0xF8, 0x01, 0xF0, 0x00, 0x3F, 0xC0, 0x07, 0xFF, 0xC0, 0x3F, 0xFF, 243 | 0x81, 0xFF, 0xFF, 0x0F, 0xC0, 0xFC, 0x3E, 0x01, 0xF1, 0xF0, 0x07, 0xC7, 244 | 0xC0, 0x1F, 0x1F, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 245 | 0x80, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x03, 0xFE, 246 | 0x00, 0x01, 0xF8, 0x00, 0x03, 0xEF, 0x80, 0x0F, 0xBE, 0x00, 0x3C, 0xFC, 247 | 0x01, 0xF3, 0xF8, 0x1F, 0x87, 0xFF, 0xFE, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 248 | 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 249 | 0xFF, 0xFF, 0xF0, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x3E, 250 | 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00, 251 | 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xC0, 252 | 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 253 | 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 254 | 0x00, 0x0F, 0x80, 0x1F, 0x1F, 0x80, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 255 | 0x3F, 0x1F, 0x00, 0x3E, 0x1F, 0x00, 0x3E, 0x3E, 0x00, 0x3E, 0x3E, 0x00, 256 | 0x7E, 0x3E, 0x00, 0x7C, 0x3E, 0x00, 0x7C, 0x3E, 0x00, 0x7C, 0x7C, 0x00, 257 | 0x7C, 0x7C, 0x00, 0xFC, 0x7C, 0x00, 0xF8, 0x7C, 0x00, 0xF8, 0x7C, 0x00, 258 | 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x01, 0xF8, 0xF8, 0x01, 0xF0, 0xF8, 0x01, 259 | 0xF0, 0xF8, 0x03, 0xE0, 0xFE, 0x0F, 0xE0, 0x7F, 0xFF, 0xC0, 0x7F, 0xFF, 260 | 0x80, 0x1F, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0xFC, 0x00, 0x7F, 0xF0, 0x03, 261 | 0xE7, 0xC0, 0x0F, 0x9F, 0x00, 0x7C, 0x7C, 0x01, 0xF1, 0xF0, 0x0F, 0x87, 262 | 0xC0, 0x3E, 0x1F, 0x01, 0xF0, 0x7C, 0x07, 0x81, 0xF0, 0x3E, 0x03, 0xC0, 263 | 0xF0, 0x0F, 0x07, 0xC0, 0x3E, 0x1E, 0x00, 0xF8, 0xF8, 0x03, 0xE3, 0xC0, 264 | 0x0F, 0x9F, 0x00, 0x3E, 0x78, 0x00, 0xFB, 0xE0, 0x01, 0xEF, 0x00, 0x07, 265 | 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xE0, 266 | 0x00, 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x07, 0xE0, 0x1F, 0xF8, 267 | 0x07, 0xE0, 0x3F, 0xF8, 0x0F, 0xE0, 0x3E, 0xF8, 0x0F, 0xE0, 0x7E, 0xF8, 268 | 0x1F, 0xE0, 0x7C, 0xF8, 0x1F, 0xE0, 0x7C, 0xF8, 0x3F, 0xE0, 0xF8, 0xF8, 269 | 0x3D, 0xE0, 0xF8, 0x78, 0x3D, 0xE1, 0xF0, 0x78, 0x79, 0xE1, 0xF0, 0x78, 270 | 0x79, 0xE1, 0xE0, 0x78, 0xF9, 0xE3, 0xE0, 0x78, 0xF1, 0xE3, 0xC0, 0x79, 271 | 0xF1, 0xE7, 0xC0, 0x79, 0xE1, 0xE7, 0x80, 0x79, 0xE1, 0xE7, 0x80, 0x7B, 272 | 0xC1, 0xEF, 0x80, 0x7B, 0xC1, 0xEF, 0x00, 0x7F, 0x81, 0xFF, 0x00, 0x7F, 273 | 0x81, 0xFE, 0x00, 0x7F, 0x01, 0xFE, 0x00, 0x7F, 0x01, 0xFC, 0x00, 0x7F, 274 | 0x01, 0xFC, 0x00, 0x7E, 0x01, 0xF8, 0x00, 0x3E, 0x01, 0xF8, 0x00, 0x3C, 275 | 0x01, 0xF0, 0x00, 0x03, 0xF0, 0x07, 0xE0, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 276 | 0x7E, 0x00, 0xFC, 0x1F, 0x80, 0x1F, 0x83, 0xE0, 0x01, 0xF8, 0xF8, 0x00, 277 | 0x3F, 0x3F, 0x00, 0x03, 0xEF, 0xC0, 0x00, 0x7F, 0xF0, 0x00, 0x0F, 0xFC, 278 | 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00, 279 | 0x7F, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xC0, 280 | 0x00, 0x3E, 0xF8, 0x00, 0x0F, 0xDF, 0x80, 0x03, 0xF3, 0xF0, 0x00, 0xFC, 281 | 0x3F, 0x00, 0x3F, 0x07, 0xE0, 0x07, 0xE0, 0xFC, 0x01, 0xF8, 0x0F, 0xC0, 282 | 0x7E, 0x01, 0xF8, 0x1F, 0x80, 0x3F, 0x80, 0x7C, 0x00, 0xFD, 0xF8, 0x07, 283 | 0xE7, 0xE0, 0x1F, 0x1F, 0x80, 0xFC, 0x3E, 0x07, 0xE0, 0xFC, 0x1F, 0x03, 284 | 0xF0, 0xFC, 0x07, 0xC7, 0xE0, 0x1F, 0x1F, 0x00, 0x7E, 0xFC, 0x00, 0xFB, 285 | 0xE0, 0x03, 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, 286 | 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x01, 287 | 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, 288 | 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0x83, 0xFF, 289 | 0xFF, 0x81, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0x00, 0x07, 0xE0, 0x00, 290 | 0x07, 0xE0, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 291 | 0x07, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 292 | 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 293 | 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF8, 0x00, 294 | 0x03, 0xF8, 0x00, 0x01, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 295 | 0xF0, 0x7F, 0xFF, 0xF0, 0x00, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x1F, 296 | 0xF0, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, 297 | 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 298 | 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, 299 | 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 300 | 0xF0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x00, 0xE7, 0x39, 0xCE, 0x31, 0x8C, 301 | 0x63, 0x1C, 0xE7, 0x39, 0xCE, 0x31, 0x8C, 0x63, 0x9C, 0xE7, 0x38, 0x01, 302 | 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x1F, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 303 | 0x00, 0x3E, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x00, 304 | 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 305 | 0x00, 0x3E, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x00, 306 | 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x1F, 0xF0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 307 | 0x00, 0x00, 0x7C, 0x00, 0xFC, 0x01, 0xFC, 0x01, 0xFC, 0x03, 0xFC, 0x03, 308 | 0x9E, 0x07, 0x9E, 0x0F, 0x1E, 0x0F, 0x1E, 0x1E, 0x1E, 0x1C, 0x0F, 0x3C, 309 | 0x0F, 0x78, 0x0F, 0x78, 0x0F, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 310 | 0xFF, 0xFF, 0xFE, 0xF3, 0x8C, 0x71, 0x80, 0x01, 0xFE, 0x01, 0xFF, 0xE0, 311 | 0xFF, 0xF8, 0x7F, 0xFF, 0x1F, 0x0F, 0xC7, 0x81, 0xF0, 0x00, 0x7C, 0x00, 312 | 0xFE, 0x07, 0xFF, 0x87, 0xFF, 0xE3, 0xFE, 0xF9, 0xF0, 0x7C, 0xF8, 0x1F, 313 | 0x3E, 0x0F, 0xCF, 0x87, 0xF3, 0xFF, 0xF8, 0xFF, 0xFE, 0x1F, 0xEF, 0x81, 314 | 0xE3, 0xF0, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 315 | 0x07, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF9, 0xF8, 0x0F, 0xFF, 316 | 0xC1, 0xFF, 0xFE, 0x1F, 0xFF, 0xE1, 0xFC, 0x3F, 0x1F, 0x83, 0xF1, 0xF0, 317 | 0x1F, 0x3E, 0x01, 0xF3, 0xE0, 0x1F, 0x3C, 0x01, 0xF3, 0xC0, 0x1F, 0x3C, 318 | 0x03, 0xE7, 0xC0, 0x3E, 0x7E, 0x07, 0xC7, 0xF1, 0xFC, 0x7F, 0xFF, 0x87, 319 | 0xFF, 0xF0, 0xFB, 0xFE, 0x0F, 0x9F, 0x80, 0x00, 0xFC, 0x01, 0xFF, 0xC0, 320 | 0xFF, 0xF8, 0x7F, 0xFF, 0x3F, 0x0F, 0xCF, 0x81, 0xF7, 0xC0, 0x7D, 0xF0, 321 | 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x0F, 322 | 0xBE, 0x07, 0xCF, 0xC3, 0xF1, 0xFF, 0xF8, 0x7F, 0xFC, 0x0F, 0xFE, 0x00, 323 | 0xFE, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, 324 | 0x3E, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x7E, 0x7C, 325 | 0x07, 0xFD, 0xF0, 0x3F, 0xFF, 0xC1, 0xFF, 0xFE, 0x0F, 0xE3, 0xF8, 0x3E, 326 | 0x07, 0xE1, 0xF0, 0x1F, 0x87, 0xC0, 0x3C, 0x3E, 0x00, 0xF0, 0xF8, 0x07, 327 | 0xC3, 0xE0, 0x1F, 0x0F, 0x80, 0x7C, 0x3E, 0x03, 0xE0, 0xF8, 0x1F, 0x83, 328 | 0xF0, 0xFE, 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0x00, 0x7E, 329 | 0x7C, 0x00, 0x00, 0xFE, 0x00, 0x7F, 0xE0, 0x3F, 0xFE, 0x0F, 0xFF, 0xE3, 330 | 0xF0, 0x7E, 0x7C, 0x07, 0xDF, 0x00, 0xFB, 0xE0, 0x1F, 0x7F, 0xFF, 0xFF, 331 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x1F, 0x3F, 332 | 0x07, 0xE3, 0xFF, 0xF8, 0x7F, 0xFE, 0x03, 0xFF, 0x00, 0x3F, 0x80, 0x00, 333 | 0x00, 0xF8, 0x1F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7C, 0x07, 0xC0, 0x3E, 0x0F, 334 | 0xFE, 0x7F, 0xF3, 0xFF, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 335 | 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x78, 0x07, 0xC0, 0x3E, 0x01, 336 | 0xF0, 0x0F, 0x80, 0xF8, 0x07, 0xC0, 0x00, 0x00, 0x7C, 0x7C, 0x07, 0xFD, 337 | 0xF0, 0x3F, 0xF7, 0x81, 0xFF, 0xFE, 0x0F, 0xE3, 0xF8, 0x3E, 0x07, 0xE1, 338 | 0xF8, 0x0F, 0x87, 0xC0, 0x3C, 0x1E, 0x00, 0xF0, 0xF8, 0x03, 0xC3, 0xE0, 339 | 0x1F, 0x0F, 0x80, 0x78, 0x3E, 0x03, 0xE0, 0xF8, 0x1F, 0x83, 0xF0, 0xFE, 340 | 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xC0, 0x3F, 0xEF, 0x00, 0x3E, 0x7C, 0x00, 341 | 0x01, 0xF0, 0x00, 0x07, 0xC3, 0xE0, 0x3E, 0x0F, 0x80, 0xF8, 0x3F, 0x0F, 342 | 0xC0, 0x7F, 0xFE, 0x00, 0xFF, 0xF0, 0x00, 0xFE, 0x00, 0x00, 0x03, 0xE0, 343 | 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 344 | 0x00, 0x0F, 0x80, 0x00, 0xF8, 0xF8, 0x0F, 0xBF, 0xE0, 0xFF, 0xFF, 0x0F, 345 | 0xFF, 0xF1, 0xFC, 0x3F, 0x1F, 0x81, 0xF1, 0xF0, 0x1F, 0x1F, 0x01, 0xF1, 346 | 0xE0, 0x1F, 0x3E, 0x03, 0xE3, 0xE0, 0x3E, 0x3E, 0x03, 0xE3, 0xE0, 0x3E, 347 | 0x7C, 0x03, 0xE7, 0xC0, 0x7C, 0x7C, 0x07, 0xC7, 0xC0, 0x7C, 0x7C, 0x07, 348 | 0xCF, 0x80, 0x78, 0x07, 0xC1, 0xF0, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 349 | 0x3E, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 350 | 0x0F, 0x87, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC3, 0xE0, 0xF8, 0x3E, 0x00, 351 | 0x00, 0x3E, 0x00, 0x78, 0x01, 0xF0, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 352 | 0x00, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x1F, 353 | 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 354 | 0x1F, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x1F, 355 | 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x03, 0xF0, 0x1F, 0xC0, 0x3F, 0x80, 356 | 0x7E, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 357 | 0x0F, 0x80, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 358 | 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x07, 0xC7, 0xE0, 0x3E, 0x7E, 0x01, 359 | 0xF7, 0xE0, 0x0F, 0xFE, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x3F, 0xFC, 360 | 0x01, 0xFF, 0xE0, 0x0F, 0xDF, 0x00, 0xFC, 0xFC, 0x07, 0xC3, 0xE0, 0x3E, 361 | 0x1F, 0x01, 0xF0, 0xFC, 0x0F, 0x83, 0xE0, 0xF8, 0x1F, 0x87, 0xC0, 0xFC, 362 | 0x00, 0x07, 0xC1, 0xF0, 0x7C, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x1F, 363 | 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x87, 364 | 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC3, 0xE0, 0xF8, 0x3E, 0x00, 0x0F, 0x8F, 365 | 0x83, 0xF0, 0x3E, 0xFF, 0x3F, 0xE0, 0xF7, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 366 | 0xFF, 0x1F, 0xC7, 0xF8, 0x7C, 0x7C, 0x0F, 0x81, 0xF1, 0xF0, 0x3E, 0x07, 367 | 0xCF, 0x81, 0xF0, 0x3E, 0x3E, 0x07, 0xC0, 0xF8, 0xF8, 0x1F, 0x03, 0xE3, 368 | 0xE0, 0x7C, 0x0F, 0x8F, 0x81, 0xF0, 0x3E, 0x7C, 0x0F, 0x81, 0xF1, 0xF0, 369 | 0x3E, 0x07, 0xC7, 0xC0, 0xF8, 0x1F, 0x1F, 0x03, 0xE0, 0x7C, 0x7C, 0x0F, 370 | 0x81, 0xE3, 0xE0, 0x7C, 0x0F, 0x8F, 0x81, 0xF0, 0x3E, 0x00, 0x0F, 0x8F, 371 | 0x80, 0xFB, 0xFE, 0x0F, 0xFF, 0xF1, 0xFF, 0xFF, 0x1F, 0xC3, 0xF1, 0xF8, 372 | 0x1F, 0x1F, 0x01, 0xF1, 0xF0, 0x1F, 0x3E, 0x01, 0xF3, 0xE0, 0x3E, 0x3E, 373 | 0x03, 0xE3, 0xE0, 0x3E, 0x3C, 0x03, 0xE7, 0xC0, 0x3E, 0x7C, 0x07, 0xC7, 374 | 0xC0, 0x7C, 0x7C, 0x07, 0xC7, 0x80, 0x7C, 0xF8, 0x07, 0x80, 0x00, 0xFE, 375 | 0x00, 0x7F, 0xF0, 0x3F, 0xFF, 0x0F, 0xFF, 0xE3, 0xF8, 0xFE, 0x7C, 0x0F, 376 | 0xDF, 0x00, 0xFB, 0xE0, 0x1F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x1F, 377 | 0xFC, 0x03, 0xEF, 0x80, 0x7D, 0xF8, 0x1F, 0x3F, 0x07, 0xE3, 0xFF, 0xF8, 378 | 0x7F, 0xFE, 0x07, 0xFF, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xE7, 0xE0, 0x0F, 379 | 0xBF, 0xC0, 0x7D, 0xFF, 0x81, 0xFF, 0xFE, 0x07, 0xF0, 0xFC, 0x1F, 0x81, 380 | 0xF0, 0x7C, 0x07, 0xC3, 0xE0, 0x1F, 0x0F, 0x80, 0x7C, 0x3E, 0x01, 0xF0, 381 | 0xF0, 0x07, 0xC3, 0xC0, 0x3E, 0x1F, 0x00, 0xF8, 0x7E, 0x07, 0xC1, 0xFC, 382 | 0x7F, 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xC0, 0xFB, 0xFE, 0x03, 0xE7, 0xE0, 383 | 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x1F, 384 | 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x01, 385 | 0xF1, 0xF0, 0x7F, 0xDF, 0x0F, 0xFD, 0xF1, 0xFF, 0xFE, 0x3F, 0x8F, 0xE3, 386 | 0xE0, 0x7E, 0x7C, 0x03, 0xE7, 0xC0, 0x3E, 0xF8, 0x03, 0xCF, 0x80, 0x3C, 387 | 0xF8, 0x07, 0xCF, 0x80, 0x7C, 0xF8, 0x0F, 0x8F, 0x81, 0xF8, 0xFC, 0x3F, 388 | 0x87, 0xFF, 0xF8, 0x7F, 0xFF, 0x83, 0xFF, 0xF0, 0x1F, 0x9F, 0x00, 0x01, 389 | 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 390 | 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x0F, 0x8E, 0x1F, 0x7C, 0x3F, 391 | 0xF0, 0xFF, 0xE1, 0xFC, 0x03, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x3E, 0x00, 392 | 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 393 | 0x00, 0x7C, 0x00, 0xF0, 0x03, 0xE0, 0x00, 0x01, 0xFC, 0x01, 0xFF, 0xC0, 394 | 0xFF, 0xF8, 0x7F, 0xFF, 0x3F, 0x0F, 0xCF, 0x81, 0xF3, 0xF0, 0x00, 0xFF, 395 | 0x80, 0x3F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xF8, 0x03, 0xFE, 0x00, 0x1F, 396 | 0xBE, 0x03, 0xEF, 0xC1, 0xFB, 0xFF, 0xFC, 0x7F, 0xFE, 0x0F, 0xFF, 0x00, 397 | 0xFE, 0x00, 0x0F, 0x81, 0xF0, 0x7C, 0x0F, 0x81, 0xF0, 0xFF, 0xBF, 0xF7, 398 | 0xFE, 0x3E, 0x07, 0xC0, 0xF8, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 399 | 0xF8, 0x1F, 0x03, 0xE0, 0x7F, 0x0F, 0xE1, 0xFC, 0x1F, 0x80, 0x1F, 0x01, 400 | 0xF1, 0xF0, 0x1F, 0x3E, 0x03, 0xE3, 0xE0, 0x3E, 0x3E, 0x03, 0xE3, 0xE0, 401 | 0x3E, 0x3E, 0x03, 0xE7, 0xC0, 0x7C, 0x7C, 0x07, 0xC7, 0xC0, 0x7C, 0x7C, 402 | 0x07, 0xC7, 0xC0, 0x7C, 0xF8, 0x0F, 0x8F, 0x81, 0xF8, 0xF8, 0x3F, 0x8F, 403 | 0xFF, 0xF8, 0xFF, 0xFF, 0x07, 0xFD, 0xF0, 0x3F, 0x1F, 0x00, 0xF8, 0x0F, 404 | 0xFE, 0x03, 0xEF, 0x81, 0xF3, 0xE0, 0x7C, 0xF8, 0x3E, 0x3E, 0x0F, 0x8F, 405 | 0x87, 0xC1, 0xE1, 0xF0, 0x78, 0xF8, 0x1E, 0x3E, 0x07, 0x9F, 0x01, 0xF7, 406 | 0x80, 0x7F, 0xE0, 0x1F, 0xF0, 0x03, 0xFC, 0x00, 0xFE, 0x00, 0x3F, 0x80, 407 | 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xF8, 0x1F, 0x07, 0xFF, 0x03, 0xE0, 0xFB, 408 | 0xE0, 0xFC, 0x1F, 0x7C, 0x1F, 0x87, 0xCF, 0x87, 0xF0, 0xF9, 0xF0, 0xFE, 409 | 0x3E, 0x3E, 0x3D, 0xC7, 0xC3, 0xC7, 0xB9, 0xF0, 0x79, 0xE7, 0x3E, 0x0F, 410 | 0x3C, 0xE7, 0x81, 0xEF, 0x1D, 0xF0, 0x3D, 0xE3, 0xBC, 0x07, 0xBC, 0x7F, 411 | 0x80, 0xFF, 0x0F, 0xE0, 0x1F, 0xE1, 0xFC, 0x03, 0xF8, 0x3F, 0x00, 0x7F, 412 | 0x07, 0xE0, 0x0F, 0xC0, 0xF8, 0x01, 0xF8, 0x1F, 0x00, 0x00, 0x0F, 0xC1, 413 | 0xF8, 0x3F, 0x07, 0xC0, 0x7C, 0x3E, 0x01, 0xF9, 0xF8, 0x03, 0xEF, 0xC0, 414 | 0x0F, 0xBE, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0x80, 0x01, 0xFC, 0x00, 0x03, 415 | 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x3E, 0xF8, 416 | 0x01, 0xFB, 0xF0, 0x07, 0xC7, 0xC0, 0x3E, 0x1F, 0x81, 0xF8, 0x7E, 0x0F, 417 | 0xC0, 0xF8, 0x00, 0x1F, 0x80, 0x7C, 0x3E, 0x03, 0xE0, 0xF8, 0x0F, 0x03, 418 | 0xE0, 0x7C, 0x0F, 0x81, 0xE0, 0x3E, 0x0F, 0x80, 0xF8, 0x3C, 0x03, 0xE1, 419 | 0xF0, 0x07, 0x87, 0x80, 0x1F, 0x3E, 0x00, 0x7C, 0xF0, 0x01, 0xF7, 0xC0, 420 | 0x07, 0xDE, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xC0, 0x01, 0xFE, 0x00, 0x03, 421 | 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, 422 | 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, 0x01, 423 | 0xF8, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xE1, 0xFF, 0xFC, 0x3F, 424 | 0xFF, 0x87, 0xFF, 0xE0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 425 | 0xF0, 0x01, 0xFC, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 426 | 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xFF, 0xF8, 0xFF, 0xFF, 0x1F, 0xFF, 427 | 0xE3, 0xFF, 0xFC, 0x00, 0x00, 0x7C, 0x03, 0xF0, 0x1F, 0xC0, 0xFE, 0x03, 428 | 0xE0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 429 | 0xE0, 0x0F, 0x80, 0x3C, 0x01, 0xF0, 0x1F, 0x80, 0x70, 0x01, 0xF8, 0x01, 430 | 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 431 | 0xF0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xFC, 0x07, 0xE0, 0x0F, 0x80, 432 | 0x1E, 0x00, 0x03, 0x81, 0xC0, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0C, 0x0E, 433 | 0x07, 0x03, 0x81, 0xC0, 0xC0, 0xE0, 0x70, 0x38, 0x18, 0x1C, 0x0E, 0x07, 434 | 0x03, 0x81, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x18, 0x1C, 0x0E, 0x07, 0x01, 435 | 0x80, 0x80, 0x00, 0x00, 0x01, 0xE0, 0x07, 0xC0, 0x1F, 0x80, 0xFE, 0x00, 436 | 0x78, 0x01, 0xE0, 0x07, 0x80, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 437 | 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x7E, 0x00, 0x38, 0x07, 0xE0, 438 | 0x3E, 0x00, 0xF0, 0x07, 0xC0, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 439 | 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1F, 0x01, 0xF8, 0x0F, 0xE0, 0x3F, 0x00, 440 | 0xF8, 0x00, 0x0F, 0x00, 0x1F, 0xC1, 0xDF, 0xF0, 0xEE, 0x3F, 0xE6, 0x07, 441 | 0xF0, 0x01, 0xE0 }; 442 | 443 | const GFXglyph FreeSansBoldOblique18pt7bGlyphs[] PROGMEM = { 444 | { 0, 0, 0, 10, 0, 1 }, // 0x20 ' ' 445 | { 0, 10, 25, 12, 4, -24 }, // 0x21 '!' 446 | { 32, 13, 9, 17, 6, -25 }, // 0x22 '"' 447 | { 47, 22, 24, 19, 1, -23 }, // 0x23 '#' 448 | { 113, 19, 31, 19, 2, -26 }, // 0x24 '$' 449 | { 187, 26, 26, 31, 5, -25 }, // 0x25 '%' 450 | { 272, 21, 25, 25, 3, -24 }, // 0x26 '&' 451 | { 338, 5, 9, 8, 6, -25 }, // 0x27 ''' 452 | { 344, 13, 33, 12, 3, -25 }, // 0x28 '(' 453 | { 398, 13, 33, 12, -1, -25 }, // 0x29 ')' 454 | { 452, 12, 11, 14, 5, -25 }, // 0x2A '*' 455 | { 469, 18, 16, 20, 3, -15 }, // 0x2B '+' 456 | { 505, 7, 11, 10, 1, -4 }, // 0x2C ',' 457 | { 515, 10, 4, 12, 2, -10 }, // 0x2D '-' 458 | { 520, 6, 5, 10, 2, -4 }, // 0x2E '.' 459 | { 524, 15, 25, 10, 0, -24 }, // 0x2F '/' 460 | { 571, 18, 25, 19, 3, -24 }, // 0x30 '0' 461 | { 628, 13, 25, 19, 6, -24 }, // 0x31 '1' 462 | { 669, 21, 25, 19, 1, -24 }, // 0x32 '2' 463 | { 735, 20, 25, 19, 2, -24 }, // 0x33 '3' 464 | { 798, 19, 25, 19, 2, -24 }, // 0x34 '4' 465 | { 858, 20, 24, 19, 2, -23 }, // 0x35 '5' 466 | { 918, 19, 25, 19, 3, -24 }, // 0x36 '6' 467 | { 978, 19, 24, 19, 5, -23 }, // 0x37 '7' 468 | { 1035, 20, 25, 19, 2, -24 }, // 0x38 '8' 469 | { 1098, 19, 25, 19, 2, -24 }, // 0x39 '9' 470 | { 1158, 9, 18, 12, 4, -17 }, // 0x3A ':' 471 | { 1179, 10, 24, 12, 3, -17 }, // 0x3B ';' 472 | { 1209, 19, 17, 20, 3, -16 }, // 0x3C '<' 473 | { 1250, 20, 12, 20, 2, -13 }, // 0x3D '=' 474 | { 1280, 19, 17, 20, 1, -15 }, // 0x3E '>' 475 | { 1321, 18, 26, 21, 6, -25 }, // 0x3F '?' 476 | { 1380, 33, 31, 34, 3, -25 }, // 0x40 '@' 477 | { 1508, 23, 26, 25, 1, -25 }, // 0x41 'A' 478 | { 1583, 24, 26, 25, 3, -25 }, // 0x42 'B' 479 | { 1661, 24, 26, 25, 4, -25 }, // 0x43 'C' 480 | { 1739, 24, 26, 25, 3, -25 }, // 0x44 'D' 481 | { 1817, 24, 26, 23, 3, -25 }, // 0x45 'E' 482 | { 1895, 23, 26, 21, 3, -25 }, // 0x46 'F' 483 | { 1970, 24, 26, 27, 4, -25 }, // 0x47 'G' 484 | { 2048, 26, 26, 25, 2, -25 }, // 0x48 'H' 485 | { 2133, 10, 26, 10, 2, -25 }, // 0x49 'I' 486 | { 2166, 20, 26, 19, 2, -25 }, // 0x4A 'J' 487 | { 2231, 26, 26, 25, 3, -25 }, // 0x4B 'K' 488 | { 2316, 18, 26, 21, 3, -25 }, // 0x4C 'L' 489 | { 2375, 31, 26, 29, 2, -25 }, // 0x4D 'M' 490 | { 2476, 27, 26, 25, 2, -25 }, // 0x4E 'N' 491 | { 2564, 25, 26, 27, 4, -25 }, // 0x4F 'O' 492 | { 2646, 23, 26, 23, 3, -25 }, // 0x50 'P' 493 | { 2721, 25, 27, 27, 4, -25 }, // 0x51 'Q' 494 | { 2806, 24, 26, 25, 3, -25 }, // 0x52 'R' 495 | { 2884, 22, 26, 23, 3, -25 }, // 0x53 'S' 496 | { 2956, 21, 26, 21, 5, -25 }, // 0x54 'T' 497 | { 3025, 24, 26, 25, 4, -25 }, // 0x55 'U' 498 | { 3103, 22, 26, 23, 6, -25 }, // 0x56 'V' 499 | { 3175, 32, 26, 33, 6, -25 }, // 0x57 'W' 500 | { 3279, 27, 26, 23, 1, -25 }, // 0x58 'X' 501 | { 3367, 22, 26, 23, 6, -25 }, // 0x59 'Y' 502 | { 3439, 25, 26, 21, 1, -25 }, // 0x5A 'Z' 503 | { 3521, 15, 33, 12, 1, -25 }, // 0x5B '[' 504 | { 3583, 5, 25, 10, 5, -24 }, // 0x5C '\' 505 | { 3599, 15, 33, 12, -1, -25 }, // 0x5D ']' 506 | { 3661, 16, 15, 20, 4, -23 }, // 0x5E '^' 507 | { 3691, 21, 3, 19, -2, 5 }, // 0x5F '_' 508 | { 3699, 5, 5, 12, 6, -25 }, // 0x60 '`' 509 | { 3703, 18, 19, 19, 2, -18 }, // 0x61 'a' 510 | { 3746, 20, 26, 21, 2, -25 }, // 0x62 'b' 511 | { 3811, 18, 19, 19, 3, -18 }, // 0x63 'c' 512 | { 3854, 22, 26, 21, 3, -25 }, // 0x64 'd' 513 | { 3926, 19, 19, 19, 2, -18 }, // 0x65 'e' 514 | { 3972, 13, 26, 12, 3, -25 }, // 0x66 'f' 515 | { 4015, 22, 27, 21, 1, -18 }, // 0x67 'g' 516 | { 4090, 20, 26, 21, 2, -25 }, // 0x68 'h' 517 | { 4155, 10, 26, 10, 2, -25 }, // 0x69 'i' 518 | { 4188, 15, 34, 10, -2, -25 }, // 0x6A 'j' 519 | { 4252, 21, 26, 19, 2, -25 }, // 0x6B 'k' 520 | { 4321, 10, 26, 10, 2, -25 }, // 0x6C 'l' 521 | { 4354, 30, 19, 31, 2, -18 }, // 0x6D 'm' 522 | { 4426, 20, 19, 21, 2, -18 }, // 0x6E 'n' 523 | { 4474, 19, 19, 21, 3, -18 }, // 0x6F 'o' 524 | { 4520, 22, 27, 21, 0, -18 }, // 0x70 'p' 525 | { 4595, 20, 27, 21, 3, -18 }, // 0x71 'q' 526 | { 4663, 15, 19, 14, 2, -18 }, // 0x72 'r' 527 | { 4699, 18, 19, 19, 2, -18 }, // 0x73 's' 528 | { 4742, 11, 23, 12, 4, -22 }, // 0x74 't' 529 | { 4774, 20, 19, 21, 3, -18 }, // 0x75 'u' 530 | { 4822, 18, 19, 19, 5, -18 }, // 0x76 'v' 531 | { 4865, 27, 19, 27, 4, -18 }, // 0x77 'w' 532 | { 4930, 22, 19, 19, 1, -18 }, // 0x78 'x' 533 | { 4983, 22, 27, 19, 1, -18 }, // 0x79 'y' 534 | { 5058, 19, 19, 17, 1, -18 }, // 0x7A 'z' 535 | { 5104, 14, 33, 14, 2, -25 }, // 0x7B '{' 536 | { 5162, 9, 33, 10, 2, -25 }, // 0x7C '|' 537 | { 5200, 14, 33, 14, 2, -25 }, // 0x7D '}' 538 | { 5258, 17, 6, 20, 3, -10 } }; // 0x7E '~' 539 | 540 | const GFXfont FreeSansBoldOblique18pt7b PROGMEM = { 541 | (uint8_t *)FreeSansBoldOblique18pt7bBitmaps, 542 | (GFXglyph *)FreeSansBoldOblique18pt7bGlyphs, 543 | 0x20, 0x7E, 42 }; 544 | 545 | // Approx. 5943 bytes 546 | -------------------------------------------------------------------------------- /src/ILI9341_ESP32.cpp: -------------------------------------------------------------------------------- 1 | #include "ILI9341_ESP32.h" 2 | #include "SPI.h" 3 | #include "Arduino.h" 4 | #include 5 | #include "gfxfont.h" 6 | #include "glcdfont.c" //default fonts 7 | 8 | #ifndef min 9 | #define min(a,b) (((a) < (b)) ? (a) : (b)) 10 | #endif 11 | 12 | #ifndef _swap_int16_t 13 | #define _swap_int16_t(a, b) { uint16_t t = a; a = b; b = t; } 14 | #endif 15 | 16 | #if !defined(__INT_MAX__) || (__INT_MAX__ > 0xFFFF) 17 | #define pgm_read_pointer(addr) ((void *)pgm_read_dword(addr)) 18 | #else 19 | #define pgm_read_pointer(addr) ((void *)pgm_read_word(addr)) 20 | #endif 21 | 22 | 23 | #define SPI_BEGIN SPI.beginTransaction(SPISettings(_busFrequency, MSBFIRST, SPI_MODE0)); 24 | #define SPI_END 25 | 26 | void ILI9341_ESP32::_writeCommand(uint8_t command) { 27 | digitalWrite(pin_dc, LOW); 28 | digitalWrite(pin_clk, LOW); 29 | SPI.write(command); 30 | 31 | } 32 | 33 | 34 | void ILI9341_ESP32::_writeData(uint8_t * data, size_t length){ 35 | 36 | digitalWrite(pin_dc, HIGH); 37 | if(length==1){ 38 | SPI.write(data[0]); 39 | } else if(length==2){ 40 | SPI.write16((uint16_t)data[0]<<8 | data[1]); 41 | } else if(length==3){ 42 | SPI.write16((uint16_t)data[0]<<8 | data[1]); 43 | SPI.write(data[3]); 44 | } else if(length==4){ 45 | SPI.write32((uint32_t)data[0]<<24 | (uint32_t)data[1]<<16 | (uint32_t)data[2]<<8 | data[3]); 46 | } else { 47 | SPI.writeBytes(data, length); 48 | } 49 | }; 50 | 51 | void ILI9341_ESP32::_writeData(uint8_t data){ 52 | digitalWrite(pin_dc, HIGH); 53 | SPI.write(data); 54 | }; 55 | 56 | 57 | 58 | ILI9341_ESP32::ILI9341_ESP32(int8_t cs, int8_t dc, int8_t mosi, int8_t clk, int8_t reset, int8_t miso){ 59 | pin_miso = miso; 60 | pin_mosi = mosi; 61 | pin_clk = clk; 62 | pin_cs = cs; 63 | pin_dc = dc; 64 | pin_reset= reset; 65 | 66 | _rotation = 0; 67 | _width = TFT_WIDTH; 68 | _height = TFT_HEIGHT; 69 | _busFrequency=20000000; 70 | 71 | cursor_y = 0; 72 | cursor_x = 0; 73 | textsize = 1; 74 | textcolor = ILI9341_WHITE; 75 | textbgcolor = ILI9341_BLACK; 76 | _wrap = true; 77 | _cp437 = false; 78 | gfxFont = NULL; 79 | } 80 | 81 | 82 | void ILI9341_ESP32::begin(){ 83 | if (pin_reset > 0) { 84 | pinMode(pin_reset, OUTPUT); 85 | digitalWrite(pin_reset, LOW); 86 | } 87 | 88 | pinMode(pin_dc, OUTPUT); 89 | //pinMode(pin_cs, OUTPUT); 90 | 91 | SPI.begin(pin_clk, pin_miso, pin_mosi, pin_cs); //sck, miso, mosi, ss 92 | SPI.setHwCs(true); 93 | // toggle RST low to reset 94 | if (pin_reset > 0) { 95 | digitalWrite(pin_reset, HIGH); 96 | delay(5); 97 | digitalWrite(pin_reset, LOW); 98 | delay(20); 99 | digitalWrite(pin_reset, HIGH); 100 | delay(150); 101 | } 102 | 103 | 104 | SPI_BEGIN 105 | 106 | _writeCommand(0xEF); 107 | _writeData(0x03); 108 | _writeData(0x80); 109 | _writeData(0x02); 110 | 111 | _writeCommand(0xCF); // 112 | _writeData(0x00); 113 | _writeData(0XC1); 114 | _writeData(0X30); 115 | 116 | _writeCommand(0xED); // 117 | _writeData(0x64); 118 | _writeData(0x03); 119 | _writeData(0X12); 120 | _writeData(0X81); 121 | 122 | _writeCommand(0xE8); // 123 | _writeData(0x85); 124 | _writeData(0x00); 125 | _writeData(0x78); 126 | 127 | _writeCommand(0xCB); // 128 | _writeData(0x39); 129 | _writeData(0x2C); 130 | _writeData(0x00); 131 | _writeData(0x34); 132 | _writeData(0x02); 133 | 134 | _writeCommand(0xF7); // 135 | _writeData(0x20); 136 | 137 | _writeCommand(0xEA); // 138 | _writeData(0x00); 139 | _writeData(0x00); 140 | 141 | _writeCommand(ILI9341_PWCTR1); //Power control 142 | _writeData(0x23); //VRH[5:0] 143 | 144 | _writeCommand(ILI9341_PWCTR2); //Power control 145 | _writeData(0x10); //SAP[2:0];BT[3:0] 146 | 147 | _writeCommand(ILI9341_VMCTR1); //VCM control 148 | _writeData(0x3e); // 149 | _writeData(0x28); 150 | 151 | _writeCommand(ILI9341_VMCTR2); //VCM control2 152 | _writeData(0x86); //-- 153 | 154 | _writeCommand(ILI9341_MADCTL); // Memory Access Control 155 | _writeData(0x58);//_writeData(0x48); //Note: Set Bit 5 to enable line wrap when page end is reached. Used for very fast writing of Bitmaps 156 | 157 | _writeCommand(ILI9341_PIXFMT); //Set pixel format 158 | _writeData(0x55); //0x55= 16 Bit Pixel 159 | 160 | _writeCommand(ILI9341_FRMCTR1); //Frame Rate 161 | _writeData(0x00); 162 | _writeData(0x18); 163 | 164 | _writeCommand(ILI9341_DFUNCTR); // Display Function Control 165 | _writeData(0x08); 166 | _writeData(0x82); 167 | _writeData(0x27); 168 | 169 | _writeCommand(0xF2); // 3Gamma Function Disable 170 | _writeData(0x00); 171 | 172 | _writeCommand(ILI9341_GAMMASET); //Gamma curve selected 173 | _writeData(0x01); 174 | 175 | _writeCommand(ILI9341_GMCTRP1); //Set Gamma positive correction 176 | _writeData(0x0F); 177 | _writeData(0x31); 178 | _writeData(0x2B); 179 | _writeData(0x0C); 180 | _writeData(0x0E); 181 | _writeData(0x08); 182 | _writeData(0x4E); 183 | _writeData(0xF1); 184 | _writeData(0x37); 185 | _writeData(0x07); 186 | _writeData(0x10); 187 | _writeData(0x03); 188 | _writeData(0x0E); 189 | _writeData(0x09); 190 | _writeData(0x00); 191 | 192 | _writeCommand(ILI9341_GMCTRN1); //Set Gamma negative correction 193 | _writeData(0x00); 194 | _writeData(0x0E); 195 | _writeData(0x14); 196 | _writeData(0x03); 197 | _writeData(0x11); 198 | _writeData(0x07); 199 | _writeData(0x31); 200 | _writeData(0xC1); 201 | _writeData(0x48); 202 | _writeData(0x08); 203 | _writeData(0x0F); 204 | _writeData(0x0C); 205 | _writeData(0x31); 206 | _writeData(0x36); 207 | _writeData(0x0F); 208 | 209 | _writeCommand(ILI9341_SLPOUT); //Exit Sleep 210 | SPI_END 211 | delay(120); 212 | SPI_BEGIN 213 | _writeCommand(ILI9341_DISPON); //Display on 214 | SPI_END 215 | }; 216 | 217 | 218 | void ILI9341_ESP32::_setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1){ 219 | 220 | _writeCommand(ILI9341_CASET); // Column addr set 221 | digitalWrite(pin_dc, HIGH); 222 | SPI.write32(x0 <<16 | x1); 223 | 224 | _writeCommand(ILI9341_PASET); // Row addr set 225 | digitalWrite(pin_dc, HIGH); 226 | SPI.write32(y0 <<16 | y1); 227 | _writeCommand(ILI9341_RAMWR); // write to RAM 228 | }; 229 | 230 | 231 | void ILI9341_ESP32::begin(uint32_t busFrequency){ 232 | _busFrequency = busFrequency; 233 | begin(); 234 | }; 235 | 236 | 237 | 238 | 239 | 240 | void ILI9341_ESP32::drawPixel(uint16_t x, uint16_t y, uint16_t color){ 241 | if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return; 242 | SPI_BEGIN 243 | _setAddrWindow(x,y,x+1,y+1); 244 | digitalWrite(pin_dc, HIGH); 245 | SPI.write16(color); 246 | SPI_END 247 | }; 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | void ILI9341_ESP32::fillScreen(uint16_t color){ 256 | fillRect(0, 0, _width, _height, color); 257 | } 258 | 259 | void ILI9341_ESP32::clearDisplay (){ 260 | fillRect(0, 0, _width, _height, ILI9341_BLACK); 261 | } 262 | 263 | 264 | /******************************************************************************* 265 | 266 | ---------- drawing lines ---------- 267 | 268 | *******************************************************************************/ 269 | 270 | /* 271 | draws a vertical line 272 | */ 273 | void ILI9341_ESP32::drawFastVLine(uint16_t x, uint16_t y, uint16_t h, uint16_t color){ 274 | fillRect(x, y, 1, h, color); 275 | }; 276 | 277 | /* 278 | draws a horizontal link 279 | */ 280 | void ILI9341_ESP32::drawFastHLine(uint16_t x, uint16_t y, uint16_t w, uint16_t color){ 281 | fillRect(x, y, w, 1, color); 282 | }; 283 | 284 | /* 285 | draws a line from any given point to another point on screen 286 | */ 287 | void ILI9341_ESP32::drawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color){ 288 | _fillBuff(color); 289 | uint16_t steep = abs(y2-y1) > abs(x2 - x1); 290 | 291 | if (steep) { 292 | _swap_int16_t(x1, y1); 293 | _swap_int16_t(x2, y2); 294 | } 295 | 296 | if (x1 > x2) { 297 | _swap_int16_t(x1, x2); 298 | _swap_int16_t(y1, y2); 299 | } 300 | 301 | int16_t dx, dy; 302 | dx = x2 - x1; 303 | dy = abs(y2 - y1); 304 | 305 | int16_t err = dx / 2; 306 | int16_t ystep; 307 | 308 | if (y1 < y2) { 309 | ystep = 1; 310 | } else { 311 | ystep = -1; 312 | } 313 | 314 | uint16_t pxlen = 0; 315 | 316 | SPI_BEGIN 317 | for (; x1<=x2; x1++) { 318 | pxlen++; 319 | err -= dy; 320 | if (err < 0) { 321 | if(steep){ 322 | _setAddrWindow(y1, x1-(pxlen-1), y1, x1); 323 | } else { 324 | _setAddrWindow(x1-(pxlen-1), y1, x1, y1); 325 | } 326 | _drawPixels(pxlen); 327 | y1 += ystep; 328 | err += dx; 329 | pxlen=0; 330 | } 331 | } //for 332 | 333 | if(pxlen>0){ //draw resst if any or when drawing a horizontal or vertical line 334 | if(steep){ 335 | _setAddrWindow(y1, x1-(pxlen-1), y1, x1); 336 | } else { 337 | _setAddrWindow(x1-(pxlen-1), y1, x1, y1); 338 | } 339 | _drawPixels(pxlen); 340 | } 341 | SPI_END 342 | } 343 | 344 | 345 | /******************************************************************************* 346 | 347 | ---------- drawing figures ---------- 348 | 349 | *******************************************************************************/ 350 | 351 | /* 352 | draws a rect (outlines only) 353 | */ 354 | void ILI9341_ESP32::drawRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color){ 355 | _fillBuff(color); 356 | SPI_BEGIN 357 | 358 | //draw top line 359 | _setAddrWindow(x,y,x+w,y); 360 | _drawPixels(w); 361 | 362 | //draw bottom line 363 | _setAddrWindow(x,y+h+1,x+w,y+h-1); 364 | _drawPixels(w); 365 | 366 | //draw right line 367 | _setAddrWindow(x+w-1,y+1,x+w-1,y+h-2); 368 | _drawPixels(h); 369 | 370 | //draw left line 371 | _setAddrWindow(x,y+1,x,y+h-2); 372 | _drawPixels(h); 373 | 374 | SPI_END 375 | } 376 | 377 | 378 | /* 379 | draws a filled rect 380 | */ 381 | void ILI9341_ESP32::fillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color){ 382 | _fillBuff(color); 383 | SPI_BEGIN 384 | _setAddrWindow(x,y,x+w-1,y+h-1); 385 | _drawPixels(w*h); 386 | SPI_END 387 | } 388 | 389 | 390 | /* 391 | draws a circle (outline only) 392 | this function is a modified copy taken from Adafruit_GFX 393 | */ 394 | void ILI9341_ESP32::drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color){ 395 | int16_t f = 1 - r; 396 | int16_t ddF_x = 1; 397 | int16_t ddF_y = -2 * r; 398 | int16_t x = 0; 399 | int16_t y = r; 400 | _fillBuff(color); 401 | SPI_BEGIN 402 | _setAddrWindow(x0, y0+r, x0, y0+r); 403 | _drawPixels(1); 404 | _setAddrWindow(x0, y0-r, x0, y0-r); 405 | _drawPixels(1); 406 | _setAddrWindow(x0+r, y0, x0+r, y0); 407 | _drawPixels(1); 408 | _setAddrWindow(x0-r, y0, x0-r, y0); 409 | _drawPixels(1); 410 | 411 | while (x= 0) { 413 | y--; 414 | ddF_y += 2; 415 | f += ddF_y; 416 | } 417 | x++; 418 | ddF_x += 2; 419 | f += ddF_x; 420 | 421 | _setAddrWindow(x0 + x, y0 + y, x0 + x, y0 + y); 422 | _drawPixels(1); 423 | _setAddrWindow(x0 - x, y0 + y, x0 - x, y0 + y); 424 | _drawPixels(1); 425 | _setAddrWindow(x0 + x, y0 - y, x0 + x, y0 - y); 426 | _drawPixels(1); 427 | _setAddrWindow(x0 - x, y0 - y, x0 - x, y0 - y); 428 | _drawPixels(1); 429 | _setAddrWindow(x0 + y, y0 + x, x0 + y, y0 + x); 430 | _drawPixels(1); 431 | _setAddrWindow(x0 - y, y0 + x, x0 - y, y0 + x); 432 | _drawPixels(1); 433 | _setAddrWindow(x0 + y, y0 - x, x0 + y, y0 - x); 434 | _drawPixels(1); 435 | _setAddrWindow(x0 - y, y0 - x, x0 - y, y0 - x); 436 | _drawPixels(1); 437 | } //while 438 | SPI_END 439 | } 440 | 441 | 442 | void ILI9341_ESP32::_drawCircleHelper( int16_t x0, int16_t y0, 443 | int16_t r, uint8_t cornername, uint16_t color) { 444 | //_fillbuff(color); //maybe we could skip that since previous method that uses that one already filled buffer 445 | 446 | int16_t f = 1 - r; 447 | int16_t ddF_x = 1; 448 | int16_t ddF_y = -2 * r; 449 | int16_t x = 0; 450 | int16_t y = r; 451 | 452 | SPI_BEGIN 453 | while (x= 0) { 455 | y--; 456 | ddF_y += 2; 457 | f += ddF_y; 458 | } 459 | x++; 460 | ddF_x += 2; 461 | f += ddF_x; 462 | if (cornername & 0x4) { 463 | _setAddrWindow(x0 + x, y0 + y, x0 + x, y0 + y); 464 | _drawPixels(1); 465 | _setAddrWindow(x0 + y, y0 + x, x0 + y, y0 + x); 466 | _drawPixels(1); 467 | } 468 | if (cornername & 0x2) { 469 | _setAddrWindow(x0 + x, y0 - y, x0 + x, y0 - y); 470 | _drawPixels(1); 471 | _setAddrWindow(x0 + y, y0 - x, x0 + y, y0 - x); 472 | _drawPixels(1); 473 | } 474 | if (cornername & 0x8) { 475 | _setAddrWindow(x0 - y, y0 + x, x0 - y, y0 + x); 476 | _drawPixels(1); 477 | _setAddrWindow(x0 - x, y0 + y, x0 - x, y0 + y); 478 | _drawPixels(1); 479 | } 480 | if (cornername & 0x1) { 481 | _setAddrWindow(x0 - y, y0 - x, x0 - y, y0 - x); 482 | _drawPixels(1); 483 | _setAddrWindow(x0 - x, y0 - y, x0 - x, y0 - y); 484 | _drawPixels(1); 485 | } 486 | } 487 | SPI_END 488 | } 489 | 490 | 491 | /* 492 | draws a filled circle 493 | */ 494 | void ILI9341_ESP32::fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color){ 495 | fillRect(x0, y0-r, 1 ,2*r+1, color); 496 | _fillCircleHelper(x0, y0, r, 3, 0, color); 497 | } 498 | 499 | /* 500 | helper function to draw a circle, can also be used to help drawing round rects 501 | this function is a modified copy taken from Adafruit_GFX 502 | */ 503 | void ILI9341_ESP32::_fillCircleHelper(int16_t x0, int16_t y0, int16_t r, 504 | uint8_t cornername, int16_t delta, uint16_t color) { 505 | //_fillbuff(color); //maybe we could skip that since previous method that uses that one already filled buffer 506 | int16_t f = 1 - r; 507 | int16_t ddF_x = 1; 508 | int16_t ddF_y = -2 * r; 509 | int16_t x = 0; 510 | int16_t y = r; 511 | 512 | SPI_BEGIN 513 | while (x= 0) { 515 | y--; 516 | ddF_y += 2; 517 | f += ddF_y; 518 | } 519 | x++; 520 | ddF_x += 2; 521 | f += ddF_x; 522 | 523 | if (cornername & 0x1) { //right half of a circle 524 | _setAddrWindow(x0+x, y0-y, x0+x, (y0-y) + (2*y+1+delta)); 525 | _drawPixels(2*y+1+delta); 526 | _setAddrWindow(x0+y, y0-x, x0+y, (y0-x) + (2*x+1+delta)); 527 | _drawPixels(2*y+1+delta); 528 | } 529 | if (cornername & 0x2) { //left half of a circle 530 | _setAddrWindow(x0-x, y0-y, x0-x, (y0-y) + (2*y+1+delta)); 531 | _drawPixels(2*y+1+delta); 532 | _setAddrWindow(x0-y, y0-x, x0-y, (y0-x) + (2*x+1+delta)); 533 | _drawPixels(2*y+1+delta); 534 | } 535 | } 536 | SPI_END 537 | } 538 | 539 | 540 | void ILI9341_ESP32::drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color){ 541 | drawLine(x0, y0, x1, y1, color); 542 | drawLine(x1, y1, x2, y2, color); 543 | drawLine(x2, y2, x0, y0, color); 544 | }; 545 | 546 | /* 547 | draws a filled triangle 548 | this function is a modified copy taken from Adafruit_GFX 549 | */ 550 | void ILI9341_ESP32::fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color){ int16_t a, b, y, last; 551 | 552 | // Sort coordinates by Y order (y2 >= y1 >= y0) 553 | if (y0 > y1) { 554 | _swap_int16_t(y0, y1); _swap_int16_t(x0, x1); 555 | } 556 | if (y1 > y2) { 557 | _swap_int16_t(y2, y1); _swap_int16_t(x2, x1); 558 | } 559 | if (y0 > y1) { 560 | _swap_int16_t(y0, y1); _swap_int16_t(x0, x1); 561 | } 562 | 563 | if(y0 == y2) { // Handle awkward all-on-same-line case as its own thing 564 | a = b = x0; 565 | if(x1 < a) a = x1; 566 | else if(x1 > b) b = x1; 567 | if(x2 < a) a = x2; 568 | else if(x2 > b) b = x2; 569 | fillRect(a, y0, b-a+1, 1, color); 570 | return; 571 | } 572 | 573 | int16_t 574 | dx01 = x1 - x0, 575 | dy01 = y1 - y0, 576 | dx02 = x2 - x0, 577 | dy02 = y2 - y0, 578 | dx12 = x2 - x1, 579 | dy12 = y2 - y1; 580 | int32_t 581 | sa = 0, 582 | sb = 0; 583 | 584 | // For upper part of triangle, find scanline crossings for segments 585 | // 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1 586 | // is included here (and second loop will be skipped, avoiding a /0 587 | // error there), otherwise scanline y1 is skipped here and handled 588 | // in the second loop...which also avoids a /0 error here if y0=y1 589 | // (flat-topped triangle). 590 | if(y1 == y2) last = y1; // Include y1 scanline 591 | else last = y1-1; // Skip it 592 | 593 | for(y=y0; y<=last; y++) { 594 | a = x0 + sa / dy01; 595 | b = x0 + sb / dy02; 596 | sa += dx01; 597 | sb += dx02; 598 | /* longhand: 599 | a = x0 + (x1 - x0) * (y - y0) / (y1 - y0); 600 | b = x0 + (x2 - x0) * (y - y0) / (y2 - y0); 601 | */ 602 | if(a > b) _swap_int16_t(a,b); 603 | fillRect(a, y, b-a+1, 1, color); 604 | } 605 | 606 | // For lower part of triangle, find scanline crossings for segments 607 | // 0-2 and 1-2. This loop is skipped if y1=y2. 608 | sa = dx12 * (y - y1); 609 | sb = dx02 * (y - y0); 610 | for(; y<=y2; y++) { 611 | a = x1 + sa / dy12; 612 | b = x0 + sb / dy02; 613 | sa += dx12; 614 | sb += dx02; 615 | /* longhand: 616 | a = x1 + (x2 - x1) * (y - y1) / (y2 - y1); 617 | b = x0 + (x2 - x0) * (y - y0) / (y2 - y0); 618 | */ 619 | if(a > b) _swap_int16_t(a,b); 620 | fillRect(a, y, b-a+1, 1, color); 621 | } 622 | }; 623 | 624 | 625 | /* 626 | draw a rounded rectangle (outline only) 627 | this function is a modified copy taken from Adafruit_GFX 628 | */ 629 | void ILI9341_ESP32::drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t radius, uint16_t color){ 630 | // smarter version 631 | drawFastHLine(x+radius , y , w-2*radius, color); // Top 632 | drawFastHLine(x+radius , y+h-1 , w-2*radius, color); // Bottom 633 | drawFastVLine(x , y+radius , h-2*radius, color); // Left 634 | drawFastVLine(x+w-1 , y+radius , h-2*radius, color); // Right 635 | // draw four corners 636 | _drawCircleHelper(x+radius , y+radius , radius, 1, color); 637 | _drawCircleHelper(x+w-radius-1, y+radius , radius, 2, color); 638 | _drawCircleHelper(x+w-radius-1, y+h-radius-1, radius, 4, color); 639 | _drawCircleHelper(x+radius , y+h-radius-1, radius, 8, color); 640 | }; 641 | 642 | 643 | /* 644 | draw a filled rounded rectangle 645 | this function is a modified copy taken from Adafruit_GFX 646 | */ 647 | void ILI9341_ESP32::fillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t radius, uint16_t color){ 648 | // smarter version 649 | fillRect(x+radius, y, w-2*radius, h, color); 650 | // draw four corners 651 | _fillCircleHelper(x+w-radius-1, y+radius, radius, 1, h-2*radius-1, color); 652 | _fillCircleHelper(x+radius , y+radius, radius, 2, h-2*radius-1, color); 653 | }; 654 | 655 | 656 | 657 | /******************************************************************************* 658 | 659 | ---------- drawing Bitmaps ---------- 660 | 661 | *******************************************************************************/ 662 | 663 | /* 664 | drawBitmap w/o background (=transparent) for ROM resident (PROGMEM) bitmaps 665 | */ 666 | void ILI9341_ESP32::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color){ 667 | 668 | int16_t i, j, byteWidth = (w + 7) / 8; 669 | uint8_t byte; 670 | uint32_t xpos = x; 671 | uint32_t ypos = y; 672 | uint32_t pxlen = 0; //count of drawable pixels since last SPI transfer 673 | 674 | _fillBuff(color); 675 | 676 | SPI_BEGIN 677 | for(j=0; j<(w*h); j++) { 678 | if(j & 7) byte <<= 1; 679 | else byte = pgm_read_byte(bitmap + (j / 8)); 680 | 681 | if(byte & 0x80) { 682 | if(pxlen==0) //change from low to high 683 | _setAddrWindow(xpos, ypos, x+w-1, ypos); //set new adress window 684 | pxlen++; 685 | } else { 686 | if(pxlen>0) { //change from high to low 687 | _drawPixels(pxlen); //draw pixels 688 | pxlen=0; 689 | } 690 | } 691 | xpos++; 692 | 693 | if(xpos==x+w) { //already reached end of a line 694 | _drawPixels(pxlen); //draw pixels 695 | pxlen=0; 696 | xpos=x; 697 | ypos++; 698 | } 699 | } 700 | SPI_END 701 | }; 702 | 703 | /* 704 | drawBitmap with background for ROM resident (PROGMEM) bitmaps 705 | */ 706 | void ILI9341_ESP32::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bg){ 707 | fillRect(x,y,w,h,bg); 708 | drawBitmap(x,y,bitmap,w,h,color); 709 | }; 710 | 711 | 712 | /* 713 | drawBitmap w/o background (=transparent) for RAM resident (not PROGMEM) bitmaps 714 | */ 715 | void ILI9341_ESP32::drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h, uint16_t color){ 716 | 717 | int16_t i, j, byteWidth = (w + 7) / 8; 718 | uint8_t byte; 719 | uint32_t xpos = x; 720 | uint32_t ypos = y; 721 | uint32_t pxlen = 0; //count of drawable pixels since last SPI transfer 722 | 723 | _fillBuff(color); 724 | 725 | SPI_BEGIN 726 | for(j=0; j<(w*h); j++) { 727 | if(j & 7) byte <<= 1; 728 | else byte = bitmap[j*byteWidth + i/8]; 729 | 730 | if(byte & 0x80) { 731 | if(pxlen==0) //change from low to high 732 | _setAddrWindow(xpos, ypos, x+w-1, ypos); //set new adress window 733 | pxlen++; 734 | } else { 735 | if(pxlen>0) { //change from high to low 736 | _drawPixels(pxlen); //draw pixels 737 | pxlen=0; 738 | } 739 | } 740 | xpos++; 741 | 742 | if(xpos==x+w) { //already reached end of a line 743 | _drawPixels(pxlen); //draw pixels 744 | pxlen=0; 745 | xpos=x; 746 | ypos++; 747 | } 748 | } 749 | SPI_END 750 | }; 751 | 752 | /* 753 | drawBitmap with background for RAM resident (not PROGMEM) bitmaps 754 | */ 755 | void ILI9341_ESP32::drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bg){ 756 | fillRect(x,y,w,h,bg); 757 | drawBitmap(x,y,bitmap,w,h,color); 758 | }; 759 | 760 | 761 | /* 762 | Draws XBitMap files (*.xbm), exported from GIMP, 763 | HowTo: Export image from GIMP to *.xbm, rename that file to *.c and open in a texteditor. 764 | This array can be displayed using this function 765 | 766 | 767 | THIS FUNCTION NEEDS TESTING 768 | */ 769 | void ILI9341_ESP32::drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color){ 770 | int16_t i, j, byteWidth = (w + 7) / 8; 771 | uint8_t byte; 772 | uint32_t xpos = x; 773 | uint32_t ypos = y; 774 | uint32_t pxlen = 0; //count of drawable pixels since last SPI transfer 775 | 776 | _fillBuff(color); 777 | 778 | SPI_BEGIN 779 | for(j=0; j<(w*h); j++) { 780 | for(i=0; i>= 1; 782 | else byte = pgm_read_byte(bitmap + j * byteWidth + i / 8); 783 | 784 | if(byte & 0x01) { 785 | if(pxlen==0) //change from low to high 786 | _setAddrWindow(xpos, ypos, x+w-1, ypos); //set new adress window 787 | pxlen++; 788 | } else { 789 | if(pxlen>0) { //change from high to low 790 | _drawPixels(pxlen); //draw pixels 791 | pxlen=0; 792 | } 793 | } 794 | xpos++; 795 | 796 | if(xpos==x+w) { //already reached end of a line 797 | _drawPixels(pxlen); //draw pixels 798 | pxlen=0; 799 | xpos=x; 800 | ypos++; 801 | } 802 | } //for i 803 | } //for j 804 | SPI_END 805 | } 806 | 807 | 808 | void ILI9341_ESP32::drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bg){ 809 | fillRect(x,y,w,h,bg); 810 | drawXBitmap(x,y,bitmap,w,h,color); 811 | }; 812 | 813 | 814 | /******************************************************************************* 815 | 816 | ---------- other public functions ---------- 817 | 818 | *******************************************************************************/ 819 | 820 | uint16_t ILI9341_ESP32::color565(uint8_t r, uint8_t g, uint8_t b) { 821 | return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); 822 | } 823 | 824 | 825 | /* 826 | set _rotation of screen in 90deg steps (0=0deg, 1=90deg, 2 = 180deg, 3 = 270deg) 827 | */ 828 | void ILI9341_ESP32::setRotation(uint8_t m) { 829 | SPI_BEGIN 830 | _writeCommand(ILI9341_MADCTL); 831 | _rotation = m % 4; // can't be higher than 3 832 | switch (_rotation) { 833 | case 0: 834 | _writeData(MADCTL_MX | MADCTL_BGR); 835 | _width = TFT_WIDTH; 836 | _height = TFT_HEIGHT; 837 | break; 838 | case 1: 839 | _writeData(MADCTL_MV | MADCTL_BGR); 840 | _width = TFT_HEIGHT; 841 | _height = TFT_WIDTH; 842 | break; 843 | case 2: 844 | _writeData(MADCTL_MY | MADCTL_BGR); 845 | _width = TFT_WIDTH; 846 | _height = TFT_HEIGHT; 847 | break; 848 | case 3: 849 | _writeData(MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); 850 | _width = TFT_HEIGHT; 851 | _height = TFT_WIDTH; 852 | break; 853 | } 854 | SPI_END 855 | } 856 | 857 | 858 | /* 859 | invert whole display 860 | */ 861 | void ILI9341_ESP32::invertDisplay(bool invert) { 862 | SPI_BEGIN 863 | _writeCommand(invert ? ILI9341_INVON : ILI9341_INVOFF); 864 | SPI_END 865 | } 866 | 867 | 868 | /* 869 | returns the width of the display dpending on the current _rotation 870 | */ 871 | uint16_t ILI9341_ESP32::width(){ return _width; }; 872 | 873 | 874 | /* 875 | returns the height of the display dpending on the current _rotation 876 | */ 877 | uint16_t ILI9341_ESP32::height() { return _height; }; 878 | 879 | 880 | uint8_t ILI9341_ESP32::getRotation(void) const { 881 | return _rotation; 882 | }; 883 | int16_t ILI9341_ESP32::getCursorX(void) const{ 884 | return cursor_x; 885 | }; 886 | int16_t ILI9341_ESP32::getCursorY(void) const{ 887 | return cursor_y; 888 | }; 889 | /******************************************************************************* 890 | 891 | ---------- text functions ---------- 892 | 893 | *******************************************************************************/ 894 | 895 | void ILI9341_ESP32::setCursor(int16_t x, int16_t y) { 896 | cursor_x = x; 897 | cursor_y = y; 898 | } 899 | 900 | 901 | void ILI9341_ESP32::setTextColor(uint16_t color) { 902 | // For 'transparent' background, we'll set the bg 903 | // to the same as fg instead of using a flag 904 | textcolor = textbgcolor = color; 905 | }; 906 | 907 | 908 | 909 | void ILI9341_ESP32::setTextColor(uint16_t color, uint16_t bgcolor) { 910 | textcolor = color; 911 | textbgcolor = bgcolor; 912 | }; 913 | 914 | 915 | 916 | void ILI9341_ESP32::cp437(bool x){ 917 | _cp437=x; 918 | } 919 | 920 | 921 | void ILI9341_ESP32::setTextWrap(bool wrap) { 922 | _wrap=wrap; 923 | } 924 | 925 | 926 | void ILI9341_ESP32::setTextSize(uint8_t s) { 927 | textsize = (s > 0) ? s : 1; 928 | } 929 | 930 | 931 | void ILI9341_ESP32::setFont(const GFXfont *f) { 932 | if(f) { // Font struct pointer passed in? 933 | if(!gfxFont) { // And no current font struct? 934 | // Switching from classic to new font behavior. 935 | // Move cursor pos down 6 pixels so it's on baseline. 936 | cursor_y += 6; 937 | } 938 | } else if(gfxFont) { // NULL passed. Current font struct defined? 939 | // Switching from new to classic font behavior. 940 | // Move cursor pos up 6 pixels so it's at top-left of char. 941 | cursor_y -= 6; 942 | } 943 | gfxFont = (GFXfont *)f; 944 | } 945 | 946 | 947 | size_t ILI9341_ESP32::write(uint8_t c) { 948 | SPI_BEGIN 949 | if(!gfxFont) { // 'Classic' built-in font 950 | 951 | if(c == '\n') { 952 | cursor_y += textsize*8; 953 | cursor_x = 0; 954 | } else if(c == '\r') { 955 | // skip em 956 | } else { 957 | if(_wrap && ((cursor_x + textsize * 6) >= _width)) { // Heading off edge? 958 | cursor_x = 0; // Reset x to zero 959 | cursor_y += textsize * 8; // Advance y one line 960 | } 961 | _drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize); 962 | cursor_x += textsize * 6; 963 | } 964 | 965 | } else { // Custom font 966 | 967 | if(c == '\n') { 968 | cursor_x = 0; 969 | cursor_y += (int16_t)textsize * 970 | (uint8_t)pgm_read_byte(&gfxFont->yAdvance); 971 | } else if(c != '\r') { 972 | uint8_t first = pgm_read_byte(&gfxFont->first); 973 | if((c >= first) && (c <= (uint8_t)pgm_read_byte(&gfxFont->last))) { 974 | uint8_t c2 = c - pgm_read_byte(&gfxFont->first); 975 | GFXglyph *glyph = &(((GFXglyph *)pgm_read_pointer(&gfxFont->glyph))[c2]); 976 | uint8_t w = pgm_read_byte(&glyph->width), 977 | h = pgm_read_byte(&glyph->height); 978 | if((w > 0) && (h > 0)) { // Is there an associated bitmap? 979 | int16_t xo = (int8_t)pgm_read_byte(&glyph->xOffset); // sic 980 | if(_wrap && ((cursor_x + textsize * (xo + w)) >= _width)) { 981 | // Drawing character would go off right edge; wrap to new line 982 | cursor_x = 0; 983 | cursor_y += (int16_t)textsize * 984 | (uint8_t)pgm_read_byte(&gfxFont->yAdvance); 985 | } 986 | _drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize); 987 | } 988 | cursor_x += pgm_read_byte(&glyph->xAdvance) * (int16_t)textsize; 989 | } 990 | } 991 | 992 | } 993 | SPI_END 994 | return 1; 995 | } 996 | 997 | void ILI9341_ESP32::drawChar(int16_t x, int16_t y, unsigned char c, 998 | uint16_t color, uint16_t bg, uint8_t size) { 999 | SPI_BEGIN 1000 | _drawChar(x,y,c,color, bg, size); 1001 | SPI_END 1002 | }; 1003 | 1004 | 1005 | /* 1006 | get the boundaries of a given text 1007 | this function is a modified copy taken from Adafruit_GFX 1008 | */ 1009 | void ILI9341_ESP32::getTextBounds(char *str, int16_t x, int16_t y, int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h){ 1010 | uint8_t c; // Current character 1011 | 1012 | *x1 = x; 1013 | *y1 = y; 1014 | *w = *h = 0; 1015 | 1016 | if(gfxFont) { 1017 | 1018 | GFXglyph *glyph; 1019 | uint8_t first = pgm_read_byte(&gfxFont->first), 1020 | last = pgm_read_byte(&gfxFont->last), 1021 | gw, gh, xa; 1022 | int8_t xo, yo; 1023 | int16_t minx = _width, miny = _height, maxx = -1, maxy = -1, 1024 | gx1, gy1, gx2, gy2, ts = (int16_t)textsize, 1025 | ya = ts * (uint8_t)pgm_read_byte(&gfxFont->yAdvance); 1026 | 1027 | while((c = *str++)) { 1028 | if(c != '\n') { // Not a newline 1029 | if(c != '\r') { // Not a carriage return, is normal char 1030 | if((c >= first) && (c <= last)) { // Char present in current font 1031 | c -= first; 1032 | glyph = &(((GFXglyph *)pgm_read_pointer(&gfxFont->glyph))[c]); 1033 | gw = pgm_read_byte(&glyph->width); 1034 | gh = pgm_read_byte(&glyph->height); 1035 | xa = pgm_read_byte(&glyph->xAdvance); 1036 | xo = pgm_read_byte(&glyph->xOffset); 1037 | yo = pgm_read_byte(&glyph->yOffset); 1038 | if(_wrap && ((x + (((int16_t)xo + gw) * ts)) >= _width)) { 1039 | // Line wrap 1040 | x = 0; // Reset x to 0 1041 | y += ya; // Advance y by 1 line 1042 | } 1043 | gx1 = x + xo * ts; 1044 | gy1 = y + yo * ts; 1045 | gx2 = gx1 + gw * ts - 1; 1046 | gy2 = gy1 + gh * ts - 1; 1047 | if(gx1 < minx) minx = gx1; 1048 | if(gy1 < miny) miny = gy1; 1049 | if(gx2 > maxx) maxx = gx2; 1050 | if(gy2 > maxy) maxy = gy2; 1051 | x += xa * ts; 1052 | } 1053 | } // Carriage return = do nothing 1054 | } else { // Newline 1055 | x = 0; // Reset x 1056 | y += ya; // Advance y by 1 line 1057 | } 1058 | } 1059 | // End of string 1060 | *x1 = minx; 1061 | *y1 = miny; 1062 | if(maxx >= minx) *w = maxx - minx + 1; 1063 | if(maxy >= miny) *h = maxy - miny + 1; 1064 | 1065 | } else { // Default font 1066 | 1067 | uint16_t lineWidth = 0, maxWidth = 0; // Width of current, all lines 1068 | 1069 | while((c = *str++)) { 1070 | if(c != '\n') { // Not a newline 1071 | if(c != '\r') { // Not a carriage return, is normal char 1072 | if(_wrap && ((x + textsize * 6) >= _width)) { 1073 | x = 0; // Reset x to 0 1074 | y += textsize * 8; // Advance y by 1 line 1075 | if(lineWidth > maxWidth) maxWidth = lineWidth; // Save widest line 1076 | lineWidth = textsize * 6; // First char on new line 1077 | } else { // No line wrap, just keep incrementing X 1078 | lineWidth += textsize * 6; // Includes interchar x gap 1079 | } 1080 | } // Carriage return = do nothing 1081 | } else { // Newline 1082 | x = 0; // Reset x to 0 1083 | y += textsize * 8; // Advance y by 1 line 1084 | if(lineWidth > maxWidth) maxWidth = lineWidth; // Save widest line 1085 | lineWidth = 0; // Reset lineWidth for new line 1086 | } 1087 | } 1088 | // End of string 1089 | if(lineWidth) y += textsize * 8; // Add height of last (or only) line 1090 | *w = maxWidth - 1; // Don't include last interchar x gap 1091 | *h = y - *y1; 1092 | 1093 | } // End classic vs custom font 1094 | }; 1095 | 1096 | 1097 | /* 1098 | get the boundaries of a given text 1099 | this function is a modified copy taken from Adafruit_GFX 1100 | */ 1101 | void ILI9341_ESP32::getTextBounds(const __FlashStringHelper *str, int16_t x, int16_t y, int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h) { 1102 | uint8_t *s = (uint8_t *)str, c; 1103 | 1104 | *x1 = x; 1105 | *y1 = y; 1106 | *w = *h = 0; 1107 | 1108 | if(gfxFont) { 1109 | 1110 | GFXglyph *glyph; 1111 | uint8_t first = pgm_read_byte(&gfxFont->first), 1112 | last = pgm_read_byte(&gfxFont->last), 1113 | gw, gh, xa; 1114 | int8_t xo, yo; 1115 | int16_t minx = _width, miny = _height, maxx = -1, maxy = -1, 1116 | gx1, gy1, gx2, gy2, ts = (int16_t)textsize, 1117 | ya = ts * (uint8_t)pgm_read_byte(&gfxFont->yAdvance); 1118 | 1119 | while((c = pgm_read_byte(s++))) { 1120 | if(c != '\n') { // Not a newline 1121 | if(c != '\r') { // Not a carriage return, is normal char 1122 | if((c >= first) && (c <= last)) { // Char present in current font 1123 | c -= first; 1124 | glyph = &(((GFXglyph *)pgm_read_pointer(&gfxFont->glyph))[c]); 1125 | gw = pgm_read_byte(&glyph->width); 1126 | gh = pgm_read_byte(&glyph->height); 1127 | xa = pgm_read_byte(&glyph->xAdvance); 1128 | xo = pgm_read_byte(&glyph->xOffset); 1129 | yo = pgm_read_byte(&glyph->yOffset); 1130 | if(_wrap && ((x + (((int16_t)xo + gw) * ts)) >= _width)) { 1131 | // Line wrap 1132 | x = 0; // Reset x to 0 1133 | y += ya; // Advance y by 1 line 1134 | } 1135 | gx1 = x + xo * ts; 1136 | gy1 = y + yo * ts; 1137 | gx2 = gx1 + gw * ts - 1; 1138 | gy2 = gy1 + gh * ts - 1; 1139 | if(gx1 < minx) minx = gx1; 1140 | if(gy1 < miny) miny = gy1; 1141 | if(gx2 > maxx) maxx = gx2; 1142 | if(gy2 > maxy) maxy = gy2; 1143 | x += xa * ts; 1144 | } 1145 | } // Carriage return = do nothing 1146 | } else { // Newline 1147 | x = 0; // Reset x 1148 | y += ya; // Advance y by 1 line 1149 | } 1150 | } 1151 | // End of string 1152 | *x1 = minx; 1153 | *y1 = miny; 1154 | if(maxx >= minx) *w = maxx - minx + 1; 1155 | if(maxy >= miny) *h = maxy - miny + 1; 1156 | 1157 | } else { // Default font 1158 | 1159 | uint16_t lineWidth = 0, maxWidth = 0; // Width of current, all lines 1160 | 1161 | while((c = pgm_read_byte(s++))) { 1162 | if(c != '\n') { // Not a newline 1163 | if(c != '\r') { // Not a carriage return, is normal char 1164 | if(_wrap && ((x + textsize * 6) >= _width)) { 1165 | x = 0; // Reset x to 0 1166 | y += textsize * 8; // Advance y by 1 line 1167 | if(lineWidth > maxWidth) maxWidth = lineWidth; // Save widest line 1168 | lineWidth = textsize * 6; // First char on new line 1169 | } else { // No line wrap, just keep incrementing X 1170 | lineWidth += textsize * 6; // Includes interchar x gap 1171 | } 1172 | } // Carriage return = do nothing 1173 | } else { // Newline 1174 | x = 0; // Reset x to 0 1175 | y += textsize * 8; // Advance y by 1 line 1176 | if(lineWidth > maxWidth) maxWidth = lineWidth; // Save widest line 1177 | lineWidth = 0; // Reset lineWidth for new line 1178 | } 1179 | } 1180 | // End of string 1181 | if(lineWidth) y += textsize * 8; // Add height of last (or only) line 1182 | *w = maxWidth - 1; // Don't include last interchar x gap 1183 | *h = y - *y1; 1184 | 1185 | } // End classic vs custom font 1186 | }; 1187 | 1188 | 1189 | /******************************************************************************* 1190 | 1191 | ---------- private functions ---------- 1192 | 1193 | *******************************************************************************/ 1194 | 1195 | 1196 | void ILI9341_ESP32::_drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bgcolor, uint8_t size){ 1197 | if(!gfxFont && color!=bgcolor) { 1198 | fillRect(x,y-1,6*size,8*size,bgcolor); //draw a BG behind text if wished. Only suitable for non-GFX fonts 1199 | } 1200 | 1201 | _fillBuff(color); 1202 | 1203 | if(!gfxFont) { // 'Classic' built-in font 1204 | 1205 | if((x >= _width) || // Clip right 1206 | (y >= _height) || // Clip bottom 1207 | ((x + 6 * size - 1) < 0) || // Clip left 1208 | ((y + 8 * size - 1) < 0)) // Clip top 1209 | return; 1210 | 1211 | if(!_cp437 && (c >= 176)) c++; // Handle 'classic' charset behavior 1212 | uint32_t pxlen = 0; //count the pixels that can be drawn at once 1213 | 1214 | for(int8_t i=0; i<6; i++ ) { //X part 1215 | uint8_t line; 1216 | if(i < 5) line = pgm_read_byte(font+(c*5)+i); 1217 | else line = 0x0; 1218 | 1219 | for(int8_t j=0; j<8; j++, line >>= 1) { //Y part 1220 | 1221 | if(line & 0x1) { 1222 | if(pxlen==0) //change from low to high 1223 | _setAddrWindow(x+(i*size), y+(j*size), x+(i*size)+size-1, y+(j*size)+((7-j)*size)); //set new adress window 1224 | pxlen+=size*size; 1225 | } else { 1226 | if(pxlen>0) { //change from high to low 1227 | _drawPixels(pxlen); //draw pixels 1228 | pxlen=0; 1229 | } 1230 | } 1231 | } 1232 | } 1233 | 1234 | } else { // Custom font 1235 | 1236 | // Character is assumed previously filtered by write() to eliminate 1237 | // newlines, returns, non-printable characters, etc. Calling drawChar() 1238 | // directly with 'bad' characters of font may cause mayhem! 1239 | 1240 | c -= pgm_read_byte(&gfxFont->first); 1241 | GFXglyph *glyph = &(((GFXglyph *)pgm_read_pointer(&gfxFont->glyph))[c]); 1242 | uint8_t *bitmap = (uint8_t *)pgm_read_pointer(&gfxFont->bitmap); 1243 | 1244 | uint16_t bo = pgm_read_word(&glyph->bitmapOffset); 1245 | uint8_t w = pgm_read_byte(&glyph->width), 1246 | h = pgm_read_byte(&glyph->height); 1247 | int16_t xo = (int8_t)pgm_read_byte(&glyph->xOffset), 1248 | yo = (int8_t)pgm_read_byte(&glyph->yOffset); 1249 | uint8_t xx, yy, bits, bit = 0; 1250 | 1251 | 1252 | // Todo: Add character clipping here 1253 | 1254 | // NOTE: THERE IS NO 'BACKGROUND' COLOR OPTION ON CUSTOM FONTS. 1255 | // THIS IS ON PURPOSE AND BY DESIGN. The background color feature 1256 | // has typically been used with the 'classic' font to overwrite old 1257 | // screen contents with new data. This ONLY works because the 1258 | // characters are a uniform size; it's not a sensible thing to do with 1259 | // proportionally-spaced fonts with glyphs of varying sizes (and that 1260 | // may overlap). To replace previously-drawn text when using a custom 1261 | // font, use the getTextBounds() function to determine the smallest 1262 | // rectangle encompassing a string, erase the area with fillRect(), 1263 | // then draw new text. This WILL infortunately 'blink' the text, but 1264 | // is unavoidable. Drawing 'background' pixels will NOT fix this, 1265 | // only creates a new set of problems. 1266 | for(yy=0; yy>8; //...maybe we should take care later 1288 | buf[i+1]=color; 1289 | } 1290 | } 1291 | 1292 | 1293 | 1294 | 1295 | /* 1296 | Sends a command and reads the answear 1297 | 1298 | ToDo: should be reworked completely, but didn't gt it working using _writeCommand and _writeData 1299 | */ 1300 | uint8_t ILI9341_ESP32::readcommand8(uint8_t c, uint8_t index) { 1301 | SPI_BEGIN 1302 | digitalWrite(pin_dc, LOW); // command 1303 | digitalWrite(pin_cs, LOW); 1304 | SPI.write(0xD9); // woo sekret command? 1305 | digitalWrite(pin_dc, HIGH); // data 1306 | SPI.write(0x10 + index); 1307 | digitalWrite(pin_cs, HIGH); 1308 | digitalWrite(pin_cs, HIGH); 1309 | 1310 | digitalWrite(pin_dc, LOW); 1311 | digitalWrite(pin_clk, LOW); 1312 | digitalWrite(pin_cs, LOW); 1313 | SPI.write(c); 1314 | 1315 | digitalWrite(pin_dc, HIGH); 1316 | uint8_t r = SPI.transfer(0x00); 1317 | digitalWrite(pin_cs, HIGH); 1318 | SPI_END 1319 | return r; 1320 | } 1321 | 1322 | 1323 | 1324 | 1325 | void ILI9341_ESP32::_drawPixels(size_t length){ 1326 | digitalWrite(pin_dc, HIGH); 1327 | //the following two lines makes things faster when few pixels are written (outline figures , etc) but slower when writing many pixels (filled figures) 1328 | //if(length==1){ SPI.write16(buf[0]<<8 | buf[1]); return; }; //write16 is faster than writeBytes 1329 | //if(length==2){ SPI.write32(buf[0]<<24 | buf[1]<<16 | buf[2]<<8 | buf[3]); return; }; //write32 is faster than writebytes 1330 | while(length>=32){ 1331 | SPI.writeBytes(buf, 64); 1332 | length-=32; 1333 | }; 1334 | if(length>0)SPI.writeBytes(buf, length*2); //write rest if any 1335 | }; 1336 | --------------------------------------------------------------------------------