diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..2016152 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,42 @@ +# Continuous Integration (CI) is the practice, in software +# engineering, of merging all developer working copies with a shared mainline +# several times a day < https://docs.platformio.org/page/ci/index.html > +# +# Documentation: +# +# * Travis CI Embedded Builds with PlatformIO +# < https://docs.travis-ci.com/user/integration/platformio/ > +# +# * PlatformIO integration with Travis CI +# < https://docs.platformio.org/page/ci/travis.html > +# +# * User Guide for `platformio ci` command +# < https://docs.platformio.org/page/userguide/cmd_ci.html > +# +# +# Please choose one of the following templates (proposed below) and uncomment +# it (remove "# " before each line) or use own configuration according to the +# Travis CI documentation (see above). +# + +language: python +python: + - "2.7" + +sudo: false +cache: + directories: + - "~/.platformio" + +env: + - PLATFORMIO_CI_SRC=examples/current-sensor + - PLATFORMIO_CI_SRC=examples/demo-menu + +install: + - pip install -U platformio + - platformio update + - platformio lib -g install "XPT2046_Touchscreen@26b691b2c8" + - platformio lib -g install "Adafruit INA219@1.0.5" + +script: + - platformio ci --lib="." --board=nodemcuv2 diff --git a/README.md b/README.md index a5ac76a..f9789b8 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,13 @@ -emGUI v1.0.0 +emGUI v2.0.0 ===== +[![Build Status](https://travis-ci.org/libEmGUI/emGUI-arduino.svg?branch=master)](https://travis-ci.org/libEmGUI/emGUI-arduino) -C GUI Library for Arduino. - -Some photos +C/C++ GUI Library for Arduino. +Some photos ![Main menu](Pictures/fa314fcf-e02c-4a30-bb53-9c6628b62733.jpg)![Another photo](Pictures/af27046c-2f33-44af-a220-e1cf2456dcb5.jpg) - This lib could work not only with Arduino, so we made an [example with visual studio](https://github.com/libEmGUI/emGUI-example) (will be submited soon) ![Example on PC: main menu](Pictures/main%20menu.PNG)![Example on PC: modal dialog](Pictures/modal%20dialog.PNG)![Example on PC: Big colorful image](Pictures/Image.PNG)![Example on PC: Multiline textbox with left allign](Pictures/Text%20box.PNG) diff --git a/examples/current-sensor/.gitignore b/examples/current-sensor/.gitignore index 8f1faee..d30b083 100644 --- a/examples/current-sensor/.gitignore +++ b/examples/current-sensor/.gitignore @@ -1 +1,2 @@ /.vscode/ +/.pio/ \ No newline at end of file diff --git a/examples/current-sensor/User_Setup.h b/examples/current-sensor/User_Setup.h index a35be78..249ae2f 100644 --- a/examples/current-sensor/User_Setup.h +++ b/examples/current-sensor/User_Setup.h @@ -1,103 +1,40 @@ -// USER DEFINED SETTINGS V16 -// Set fonts to be loaded, pins used and SPI control method +/* -// ################################################################################## -// -// Define the pins that are used to interface with the display here -// -// ################################################################################## - -// We must use hardware SPI -// Typical setup for NodeMCU ESP-12 is : -// -// Display SDO/MISO to NodeMCU pin D6 -// Display LED to NodeMCU pin VIN (5V) -// Display SCK to NodeMCU pin D5 -// Display SDI/MOSI to NodeMCU pin D7 -// Display DC to NodeMCU pin D3 -// Display RESET to NodeMCU pin D4 -// Display CS to NodeMCU pin D8 -// Display GND to NodeMCU pin GND (0V) -// Display VCC to NodeMCU pin VIN (5V) - -// ###### EDIT THE PIN NUMBERS IN THE 3 LINES FOLLOWING TO SUIT YOUR SETUP ###### - -// LinkSpriteTouchScreen -//#define TFT_DC D4 // Data Command control pin - - - -/* +USER DEFINED SETTINGS http://www.forward.com.au/pfod/ESP8266/GPIOpins/index.html - -static const uint8_t D0 = 16; - встроенный PULL-DOWN -static const uint8_t D1 = 5; - *cs TOUCH* -static const uint8_t D2 = 4; - *cs TFT* -static const uint8_t D3 = 0; - [BOOT]*SDA_PIN* -static const uint8_t D4 = 2; - [BOOT] На старте должен быть HIGH *SCK_PIN* -static const uint8_t D5 = 14; - [SPI] SCK -static const uint8_t D6 = 12; - [SPI] MOSI -static const uint8_t D7 = 13; - [SPI] MOSI -static const uint8_t D8 = 15; - [BOOT] на старте должен быть LOW *DC* -static const uint8_t D9 = 3; - [UART] rx -static const uint8_t D10 = 1; - [UART] tx + We must use hardware SPI for Touch and Display + +| NodeMCU | Function | Display | INA 219 (optional) | Comment | +| ---------|---------------------|-----------------|------------------------| ------------------------------------------| +| D1 | | T_CS | | To Display | +| D2 | | CS | | To Display | +| D3 | [BOOT, I2C] SDA | | SDA | To INA219 | +| D4 | [BOOT, I2C] SCL | | SCL | To INA219, Should be HIGH on startup | +| D5 | [SPI] SCK | SCK, T_CLK | | To Display | +| D6 | [SPI] MISO | SDO, T_DO | | To Display | +| D7 | [SPI] MOSI | SDI, T_DI | | To Display | +| D8 | [BOOT] | DC | | To Display, Should be LOW on startup | +| RST | [RESET] | RST | | To Display, Optional | +| GND | [GROUND] | GND | GND | To INA and Display | +| VCC | [+3,3V] | VCC, LED | VCC | To INA and Display | */ -// Topfoison -#define TFT_DC 15 // Data Command control pin -#define TFT_CS 4 -#define TOUCH_CS 5 -#define TFT_RST -1 - -//#define INTR_TOUCH 10 - - -#define SDA_PIN 0 -#define SCK_PIN 2 -#define INTR_SYS -1 -#define INTR_NFC -1 - -#define UART_RX 3 - -// ################################################################################## -// -// Define the fonts that are to be used here -// -// ################################################################################## - -// Comment out the #defines below with // to stop that font being loaded -// The ESP8366 had plenty of memory so commenting out fonts is not normally necessary -// If all fonts are loaded the extra FLASH space required is about 17000 bytes... -// To save FLASH space only enable the fonts you need! - -//#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH -//#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters -//#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters -//#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm -//#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. -//#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. - -// ################################################################################## -// -// Define use of 9bit SPI use for displays without D/C pin, TFT_DC pin still needed -// -// ################################################################################## -//#define USE_SPI9 +// ###### EDIT THE PIN NUMBERS IN THE FOLLOWING BLOCK TO SUIT YOUR SETUP ###### -// ################################################################################## -// -// Other speed up options -// -// ################################################################################## +#define TFT_DC D8 // Data Command control pin +#define TFT_CS D2 +#define TOUCH_CS D1 +#define TFT_RST -1 // Use system reset or opt-out -// Define the SPI clock frequency (40MHz works OK) 80MHz sometimes fails +#define SDA_PIN D3 +#define SCL_PIN D4 // #define SPI_FREQUENCY 20000000 -// #define SPI_FREQUENCY 40000000 - #define SPI_FREQUENCY 40000000 +#define SPI_FREQUENCY 40000000 +// #define SPI_FREQUENCY 80000000 // #define SPI_FREQUENCY 16000000 diff --git a/examples/current-sensor/current-sensor.ino b/examples/current-sensor/current-sensor.ino index 905cf9d..6bdfe4f 100644 --- a/examples/current-sensor/current-sensor.ino +++ b/examples/current-sensor/current-sensor.ino @@ -4,7 +4,7 @@ * TFT configs are in User_Setup.h * fbits.tech 2018 // Roman Savrulin, Mikhail Natalenko */ - +#include #include #include #include @@ -16,9 +16,6 @@ #include #include "src/FIR-filter-class/filt.h" -extern "C" { - #include "user_interface.h" -} #include "User_Setup.h" // Signal filter @@ -28,20 +25,11 @@ Adafruit_INA219 monitor; TouchWrapper touch; void setup() { - // Init serial and start firmware - if(digitalRead(UART_RX) == 1) { - if(!Serial){ - Serial.begin(115200); - while (!Serial){ - delay(100); - } - } - } + Serial.begin(115200); Serial.println(F("Ready")); - SPIFFS.begin(); - Wire.begin(SDA_PIN, SCK_PIN); + Wire.begin(SDA_PIN, SCL_PIN); touch.init(); // Setup emGUI @@ -57,7 +45,7 @@ void setup() { // To reduce noise in signal we use filter void handleData(float data) { auto window = WindowPlot::getInstance(false); - auto fData = lpf.do_sample(data); + lpf.do_sample(data); if (window) window->update(data); } diff --git a/examples/current-sensor/emGUIGlue.cpp b/examples/current-sensor/emGUIGlue.cpp index 957e37f..156161d 100644 --- a/examples/current-sensor/emGUIGlue.cpp +++ b/examples/current-sensor/emGUIGlue.cpp @@ -44,7 +44,6 @@ check_size CHECK_BITMAPINFOHEADER; #define pgm_read_pointer(addr) ((void *)pgm_read_dword(addr)) -//SPI9Class SPI9(TFT_DC); // construct global SPI9 instance here, where the dcPin is known static TFT_ILI9341_ESP *tft = NULL; static xDraw_t LCD; @@ -134,8 +133,6 @@ bool vGUICheckUTF(uint8_t data, tUTFstateMachine * t_status) { //returns tr static const uint8_t secondMarker = 0b10000000; static const uint8_t secondMask = 0b11000000; - tUTFstateMachine * status = t_status; - switch (t_status->state) { case UTF_WAIT_FIRST: if ((data & firstMask) == firstMarker) { @@ -161,6 +158,7 @@ bool vGUICheckUTF(uint8_t data, tUTFstateMachine * t_status) { //returns tr t_status->buffer = 0; return false; } + return false; } static uint16_t usFontGetH(xFont pubFont) { @@ -427,6 +425,7 @@ void TFTWake(){ } void vGUIGlueInit(){ + SPIFFS.begin(); // Config EM_GUI opts EMGUI_LCD_WIDTH = 320; EMGUI_STATUS_BAR_HEIGHT = 26; diff --git a/examples/current-sensor/lib/.gitignore b/examples/current-sensor/lib/.gitignore new file mode 100644 index 0000000..8bda964 --- /dev/null +++ b/examples/current-sensor/lib/.gitignore @@ -0,0 +1 @@ +emGUI/ \ No newline at end of file diff --git a/examples/current-sensor/lib/.gitkeep b/examples/current-sensor/lib/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/examples/current-sensor/platformio.ini b/examples/current-sensor/platformio.ini new file mode 100644 index 0000000..6128946 --- /dev/null +++ b/examples/current-sensor/platformio.ini @@ -0,0 +1,30 @@ +;PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[platformio] +src_dir = . +data_dir = ./data/ +env_default = nodemcuv2 + +[env:nodemcuv2] +platform = espressif8266@2.2.2 +board = nodemcuv2 +framework = arduino +lib_extra_dirs = ./lib/ +board_build.f_cpu = 80000000L +board_build.f_flash = 80000000L +board_build.flash_mode = dio +monitor_speed = 115200 +monitor_rts = 0 +monitor_dtr = 0 +upload_speed = 921600 +lib_deps = XPT2046_Touchscreen@26b691b2c8, Adafruit INA219@1.0.5 + + diff --git a/examples/current-sensor/src/GUI/GUI.cpp b/examples/current-sensor/src/GUI/GUI.cpp index 5d80783..d088e99 100644 --- a/examples/current-sensor/src/GUI/GUI.cpp +++ b/examples/current-sensor/src/GUI/GUI.cpp @@ -16,7 +16,7 @@ bool MainWindowCloseRequestHdl(xWidget *); bool bGUIonWindowManagerCreateHandler(xWidget *) { vWindowManagerSetKeypressHandler([](int iID, uint16_t uEv){ (void)iID; - if(uEv = 1) + if(uEv == 1) vWindowManagerCloseActiveWindow(); return true; diff --git a/examples/current-sensor/src/GUI/WindowPlot.h b/examples/current-sensor/src/GUI/WindowPlot.h index e643bb9..48b584b 100644 --- a/examples/current-sensor/src/GUI/WindowPlot.h +++ b/examples/current-sensor/src/GUI/WindowPlot.h @@ -35,7 +35,7 @@ class WindowPlot : public DisposableWindow { xLabel * currentMonitor; xLabel * currentMonitorHeader; short data; - short passDelay = 60; + unsigned short passDelay = 60; bool onClose(){ free(plotLead.psData); return false; @@ -51,7 +51,7 @@ class WindowPlot : public DisposableWindow { static auto lastMillis = millis(); if (millis() - lastMillis > passDelay) { - sprintf (textBuffer, "%d\0", data / 10); + snprintf (textBuffer, sizeof(textBuffer), "%d", data / 10); pcLabelSetText(currentMonitor, textBuffer); lastMillis = millis(); } diff --git a/examples/current-sensor/src/TFT/TFT_ILI9341_ESP.cpp b/examples/current-sensor/src/TFT/TFT_ILI9341_ESP.cpp index cf72546..18ccdd7 100644 --- a/examples/current-sensor/src/TFT/TFT_ILI9341_ESP.cpp +++ b/examples/current-sensor/src/TFT/TFT_ILI9341_ESP.cpp @@ -297,7 +297,7 @@ uint16_t TFT_ILI9341_ESP::readPixel(int32_t x0, int32_t y0) ***************************************************************************************/ uint16_t TFT_ILI9341_ESP::readcommand16(uint8_t cmd_function, uint8_t index) { - uint32_t reg; + uint32_t reg = 0; reg |= (readcommand8(cmd_function, index + 0) << 8); reg |= (readcommand8(cmd_function, index + 1) << 0); @@ -1808,7 +1808,7 @@ void TFT_ILI9341_ESP::drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, u #else // This is a weeny bit faster -void TFT_ILI9341_ESP::drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color) +void TFT_ILI9341_ESP::drawLine(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t color) { spi_begin(); @@ -1916,7 +1916,7 @@ void TFT_ILI9341_ESP::drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, u ** Function name: drawFastVLine ** Description: draw a vertical line ***************************************************************************************/ -void TFT_ILI9341_ESP::drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color) +void TFT_ILI9341_ESP::drawFastVLine(uint32_t x, uint32_t y, uint32_t h, uint32_t color) { // Rudimentary clipping if ((x >= _width) || (y >= _height)) return; @@ -1940,7 +1940,7 @@ void TFT_ILI9341_ESP::drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t co ** Function name: drawFastHLine ** Description: draw a horizontal line ***************************************************************************************/ -void TFT_ILI9341_ESP::drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color) +void TFT_ILI9341_ESP::drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color) { // Rudimentary clipping if ((x >= _width) || (y >= _height)) return; @@ -1962,7 +1962,7 @@ void TFT_ILI9341_ESP::drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t co ** Function name: fillRect ** Description: draw a filled rectangle ***************************************************************************************/ -void TFT_ILI9341_ESP::fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color) +void TFT_ILI9341_ESP::fillRect(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t color) { // rudimentary clipping (drawChar w/big text requires this) if ((x > _width) || (y > _height) || (w==0) || (h==0)) return; @@ -2233,11 +2233,11 @@ int16_t TFT_ILI9341_ESP::drawChar(unsigned int uniCode, int x, int y, int font) } int width = 0; - int height = 0; - uint32_t flash_address = 0; uniCode -= 32; #ifdef LOAD_FONT2 + int height = 0; + uint32_t flash_address = 0; if (font == 2) { // This is faster than using the fontdata structure @@ -2262,12 +2262,12 @@ int16_t TFT_ILI9341_ESP::drawChar(unsigned int uniCode, int x, int y, int font) } #endif +#ifdef LOAD_FONT2 // chop out code if we do not need it int w = width; int pX = 0; int pY = y; byte line = 0; -#ifdef LOAD_FONT2 // chop out code if we do not need it if (font == 2) { w = w + 6; // Should be + 7 but we need to compensate for width increment w = w / 8; @@ -2448,7 +2448,7 @@ int16_t TFT_ILI9341_ESP::drawChar(unsigned int uniCode, int x, int y, int font) ** Description : draw string with padding if it is defined ***************************************************************************************/ // Without font number, uses font set by setTextFont() -int16_t TFT_ILI9341_ESP::drawString(const String& string, int poX, int poY) +int16_t TFT_ILI9341_ESP::drawString(const String& string, uint poX, uint poY) { int16_t len = string.length() + 2; char buffer[len]; @@ -2456,7 +2456,7 @@ int16_t TFT_ILI9341_ESP::drawString(const String& string, int poX, int poY) return drawString(buffer, poX, poY, textfont); } // With font number -int16_t TFT_ILI9341_ESP::drawString(const String& string, int poX, int poY, int font) +int16_t TFT_ILI9341_ESP::drawString(const String& string, uint poX, uint poY, int font) { int16_t len = string.length() + 2; char buffer[len]; @@ -2465,12 +2465,12 @@ int16_t TFT_ILI9341_ESP::drawString(const String& string, int poX, int poY, int } // Without font number, uses font set by setTextFont() -int16_t TFT_ILI9341_ESP::drawString(const char *string, int poX, int poY) +int16_t TFT_ILI9341_ESP::drawString(const char *string, uint poX, uint poY) { return drawString(string, poX, poY, textfont); } // With font number -int16_t TFT_ILI9341_ESP::drawString(const char *string, int poX, int poY, int font) +int16_t TFT_ILI9341_ESP::drawString(const char *string, uint poX, uint poY, int font) { int16_t sumX = 0; uint8_t padding = 1, baseline = 0; @@ -2581,7 +2581,7 @@ int16_t TFT_ILI9341_ESP::drawString(const char *string, int poX, int poY, int fo if((padX>cwidth) && (textcolor!=textbgcolor)) { - int16_t padXc = poX+cwidth; + uint16_t padXc = poX+cwidth; #ifdef LOAD_GFXFF if ((font == 1) && (gfxFont)) { @@ -2846,7 +2846,7 @@ void TFT_ILI9341_ESP::setTextFont(uint8_t f) If any other conditions of use have been missed then please raise this as an issue on GitHub: - + ****************************************************/ /*************************************************** The Adafruit_ILI9341 library has been used as a starting point diff --git a/examples/current-sensor/src/TFT/TFT_ILI9341_ESP.h b/examples/current-sensor/src/TFT/TFT_ILI9341_ESP.h index da77c0d..f25320b 100644 --- a/examples/current-sensor/src/TFT/TFT_ILI9341_ESP.h +++ b/examples/current-sensor/src/TFT/TFT_ILI9341_ESP.h @@ -311,12 +311,12 @@ class TFT_ILI9341_ESP : public Print { backupSPCR(void), restoreSPCR(void), - drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color), - drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color), - drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color), + drawLine(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t color), + drawFastVLine(uint32_t x, uint32_t y, uint32_t h, uint32_t color), + drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color), drawRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color), - fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color), + fillRect(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t color), drawRoundRect(int32_t x0, int32_t y0, int32_t w, int32_t h, int32_t radius, uint32_t color), fillRoundRect(int32_t x0, int32_t y0, int32_t w, int32_t h, int32_t radius, uint32_t color), @@ -389,14 +389,14 @@ class TFT_ILI9341_ESP : public Print { drawFloat(float floatNumber,int decimal,int poX, int poY), // Handle char arrays - drawString(const char *string, int poX, int poY, int font), - drawString(const char *string, int poX, int poY), + drawString(const char *string, uint poX, uint poY, int font), + drawString(const char *string, uint poX, uint poY), drawCentreString(const char *string, int dX, int poY, int font), // Deprecated, use setTextDatum() and drawString() drawRightString(const char *string, int dX, int poY, int font), // Deprecated, use setTextDatum() and drawString() // Handle String type - drawString(const String& string, int poX, int poY, int font), - drawString(const String& string, int poX, int poY), + drawString(const String& string, uint poX, uint poY, int font), + drawString(const String& string, uint poX, uint poY), drawCentreString(const String& string, int dX, int poY, int font), // Deprecated, use setTextDatum() and drawString() drawRightString(const String& string, int dX, int poY, int font); // Deprecated, use setTextDatum() and drawString() @@ -420,15 +420,9 @@ class TFT_ILI9341_ESP : public Print { inline void spi_begin() __attribute__((always_inline)); inline void spi_end() __attribute__((always_inline)); - - - void writeBytes_(uint8_t * data, uint8_t size); inline void setDataBits(uint16_t bits); - - - boolean hwSPI; volatile uint32_t *mosiport, *clkport, *dcport, *rsport, *csport; @@ -443,7 +437,7 @@ inline void setDataBits(uint16_t bits); protected: - int32_t cursor_x, cursor_y, win_xe, win_ye, padX; + uint32_t cursor_x, cursor_y, win_xe, win_ye, padX; uint32_t _width, _height, // Display w/h as modified by current rotation textcolor, textbgcolor, fontsloaded, addr_row, addr_col; diff --git a/examples/current-sensor/src/TouchWrapper/TouchWrapper.cpp b/examples/current-sensor/src/TouchWrapper/TouchWrapper.cpp index 4cae341..c3a5bd1 100644 --- a/examples/current-sensor/src/TouchWrapper/TouchWrapper.cpp +++ b/examples/current-sensor/src/TouchWrapper/TouchWrapper.cpp @@ -19,9 +19,7 @@ bool TouchWrapper::handleTouch(bool flag) if (touchFlag) { alreadyPoped = false; - uint16_t xptr; - uint16_t yptr; - + TS_Point p = getPoint(); currentTouch.x = 320 - ((p.x - 300) * 10 / 115); // * xCompensationA / mul + xCompensationB; diff --git a/examples/demo-menu-due/demo-menu-due.ino b/examples/demo-menu-due/demo-menu-due.ino deleted file mode 100644 index e073a64..0000000 --- a/examples/demo-menu-due/demo-menu-due.ino +++ /dev/null @@ -1,282 +0,0 @@ -/* -Adapted from the Adafruit graphicstest sketch. - -This sketch uses the GLCD font (font 1) only. Disable other fonts to make -the sketch fit in an UNO! - -Make sure all the required fonts are loaded by editting the -User_Setup.h file in the TFT_ILI9341_DUE library folder. - -If using an UNO or Mega (ATmega328 or ATmega2560 processor) then for best -performance use the F_AS_T option found in the User_Setup.h file in the -TFT_ILI9341_DUE library folder. - -The library uses the hardware SPI pins only: - For UNO, Nano, Micro Pro ATmega328 based processors - MOSI = pin 11, SCK = pin 13 - For Mega: - MOSI = pin 51, SCK = pin 52 - -The pins used for the TFT chip select (CS) and Data/command (DC) and Reset (RST) -signal lines to the TFT must also be defined in the library User_Setup.h file. - -Sugested TFT connections for UNO and Atmega328 based boards - sclk 13 // Don't change, this is the hardware SPI SCLK line - mosi 11 // Don't change, this is the hardware SPI MOSI line - cs 10 // Chip select for TFT display - dc 9 // Data/command line - rst 7 // Reset, you could connect this to the Arduino reset pin - -Suggested TFT connections for the MEGA and ATmega2560 based boards - sclk 52 // Don't change, this is the hardware SPI SCLK line - mosi 51 // Don't change, this is the hardware SPI MOSI line - cs 47 // TFT chip select line - dc 48 // TFT data/command line - rst 44 // you could alternatively connect this to the Arduino reset - - -for this demo , you need an arduino due with ili9341 TFT. -third-part library is ILI9341_due :https://github.com/marekburiak/ILI9341_due -(git clone https://github.com/marekburiak/ILI9341_due.git ) - -######################################################################### -###### DON'T FORGET TO UPDATE THE User_Setup.h FILE IN THE LIBRARY ###### -###### TO SELECT THE FONTS AND PINS YOU USE, SEE ABOVE ###### -######################################################################### -*/ - - -#include -#include "SPI.h" -#include "ILI9341_due.h" - - - -// For the Adafruit shield, these are the default. -#define TFT_RST 8 -#define TFT_DC 9 -#define TFT_CS 10 - -// Use hardware SPI -ILI9341_due tft = ILI9341_due(TFT_CS, TFT_DC, TFT_RST); - -typedef uint8_t u8; - -static xDraw_t LCD; -static xInterface * interface1; -static xLabel * mouseMonitor; - -extern "C" { - - void vRectangle(uint16_t usX0, uint16_t usY0, uint16_t usX1, uint16_t usY1, uint16_t usColor, bool bFill){ - if (bFill) { - tft.fillRect(usX0, usY0, usX1 - usX0, usY1 - usY0, usColor); - } else { - tft.drawRect(usX0, usY0, usX1 - usX0, usY1 - usY0, usColor); - } - - - } - void vPutChar( uint16_t usX, uint16_t usY, char ASCI, xFont pubFont, uint16_t usColor, uint16_t usBackground, bool bFillBg){ - - unsigned const char *pubBuf = pubFont[(int)ASCI]; - unsigned char charWidth = *pubBuf; //each symbol in NEO fonts contains width info in first byte. - unsigned char usHeight = *pubFont[0]; //each NEO font contains height info in first byte. - pubBuf++; //go to first pattern of font - uint16_t usXt, usYt; - - for (u8 column = 0; column < charWidth; column++) { - usXt = usX + column; - if( usXt >= ILI9341_TFTWIDTH) - break; - for (u8 row = 0; row < 8; row++){ - usYt = usY+row; - if(*pubBuf & (1 << row)) - tft.drawPixel(usXt, usYt, usColor); - else if(bFillBg) - tft.drawPixel(usXt, usYt, usBackground); - if( usYt >= ILI9341_TFTHEIGHT) - break; - }; - - /* Hack for 16X NEO font */ - if(usHeight == 16){ - for (u8 row = 0; row < 8; row++){ - usYt = usY + row + 8; - if(*(pubBuf + charWidth)& (1 << row)) - tft.drawPixel(usXt, usYt, usColor); - else if(bFillBg) - tft.drawPixel(usXt, usYt, usBackground); - if( usYt >= ILI9341_TFTHEIGHT) - break; - }; - } - pubBuf++; - } - } - void vHLine(uint16_t usX0, uint16_t usY0, uint16_t usY1, uint16_t usColor){ - tft.drawFastVLine(usX0, usY0, usY1 - usY0, usColor); - } - void vVLine(uint16_t usX0, uint16_t usY0, uint16_t usX1, uint16_t usColor){ - tft.drawFastVLine(usX0, usY0, usX1 - usX0, usColor); - } - void bPicture(int16_t sX0, int16_t sY0, xPicture pusPicture){ - int16_t i, j; - uint16_t x = 2; - - for (j = 0; j < pgm_read_byte(pusPicture + 1); j++) { - for (i = 0; i < pgm_read_byte(pusPicture); i++ ) { - tft.drawPixel(sX0 + j, sY0 + i, ((pgm_read_byte(pusPicture + x) << 8)| pgm_read_byte(pusPicture + x + 1) )); - x++; - } - } - } - uint16_t usGetPictureW(xPicture pusPic) { - return pgm_read_byte(pusPic + 1); - } - - uint16_t usGetPictureH(xPicture pusPic) { - return pgm_read_byte(pusPic + 0); - } - -}; - -unsigned long total = 0; -unsigned long tn = 0; - -xWidget frame1; -xWindow * window; -xLabel label1; -eWindow wind1 = WINDOW_MENU; - -void closeWindow() { - ; -} -bool bGUIOnWindowCloseHandlerMain(xWidget *) { - auto dial = iModalDialogOpen(MODAL_AUTO, "ny", "Close?", ""); - vModalDialogSetHandler(dial, 'y', closeWindow); - return true; -} -void doMagic() { - char outString[25]; - static int i = 0; - i++; - sprintf(outString, "Magic count: %d times", i); - pcLabelSetText(mouseMonitor, outString); -} -bool btnMagicHDLR(xWidget *) { - auto dlg = iModalDialogOpen(MODAL_AUTO, "ny", "Magic Button", "Magic will happen. Are you sure?"); - vModalDialogSetHandler(dlg, 'y', &doMagic); - return true; -} - -bool btnAboutHDLR(xWidget *) { - vInterfaceOpenWindow(WINDOW_ABOUT); - return true; -} - -bool btnLabelHDLR(xWidget *) { - //vInterfaceOpenWindow(WINDOW_NOTES); - return true; -} - -bool btnFolderHDLR(xWidget *) { - //vInterfaceOpenWindow(WINDOW_ARCHIVE); - return true; -} - - -bool myHandler(xWidget *){ - auto window = pxWindowCreate(WINDOW_MENU); - vWindowSetHeader(window, "Main menu"); - mouseMonitor = pxLabelCreate(1, 200, 238, 0, "Magic count: 0", FONT_ASCII_8_X, 500, window); - uint8_t offset = 15; - - uint8_t row1 = offset; - uint8_t row2 = row1 + 60 + offset; - uint8_t row3 = row2 + 60 + offset; - uint8_t column1 = offset; - uint8_t column2 = LCD_SizeX / 2 - 30; - uint8_t column3 = LCD_SizeX - offset - 60; - auto menuBut = pxMenuButtonCreate(column1, row1, magic, "Do magic", &btnMagicHDLR, window); - auto menuButAbout = pxMenuButtonCreate(column2, row1, help, "Info", &btnAboutHDLR, window); - auto menuButLabel = pxMenuButtonCreate(column3, row1, process, "Test Label", &btnLabelHDLR, window); - auto menuButFolder = pxMenuButtonCreate(column1, row2, open_folder, "Many windows", &btnFolderHDLR, window); - - auto window2_about = pxWindowCreate(WINDOW_ABOUT); - vWindowSetHeader(window2_about, "About"); - - auto window_show_label = pxWindowCreate(WINDOW_NOTES); - vWindowSetHeader(window_show_label, "Big label"); - - auto window_show_folder = pxWindowCreate(WINDOW_ARCHIVE); - vWindowSetHeader(window_show_folder, "Labels"); - /*auto menuButAbout2 = pxMenuButtonCreate(column1, row1, PIC_LABEL_BG, "Info", &btnAboutHDLR, window_show_folder); - auto menuButLabel2 = pxMenuButtonCreate(column2, row1, PIC_LABEL_BG, "Test Label", &btnLabelHDLR, window_show_folder);*/ - - auto big_label = pxLabelCreate(1, 1, 238, 238, "Sample text: hypothetical rosters of players \ -considered the best in the nation at their respective positions\ -The National Collegiate Athletic Association, a college sports \ -governing body, uses officially recognized All-America selectors \ -to determine the consensus selections. These are based on a point \ -system in which a player is awarded three points for every selector \ -that names him to the first team, two points for the second team, \ -and one point for the third team. The individual who receives the \ -most points at his position is called a consensus All-American.[4] \ -Over time, the sources used to determine the consensus selections \ -have changed, and since 2002, the NCAA has used five selectors, \ -the Associated Press (AP), American Football Coaches Association \ -(AFCA), Football Writers Association of America (FWAA), The Sporting \ -News (TSN), and the Walter Camp Football Foundation (WCFF), \ -to determine consensus All-Americans.[5]", FONT_ASCII_8_X, 1010, window_show_label); - - auto labelAbout = pxLabelCreate(1, 1, 238, 60, "This is Demo for emGUI. 2017", FONT_ASCII_8_X, 200, window2_about); - - vWindowSetOnCloseRequestHandler(window, &bGUIOnWindowCloseHandlerMain); - auto dialog1 = pxModalDialogWindowCreate(); - vInterfaceOpenWindow(WINDOW_MENU); - return true; - - return true; - -} - - - -void setup() { - vDrawHandlerInit(&LCD); - LCD.vRectangle = &vRectangle; - LCD.vPutChar = &vPutChar; - LCD.bPicture = &bPicture; - LCD.vVLine = &vVLine; - LCD.vHLine = &vHLine; - LCD.usGetPictureH = &usGetPictureH; - LCD.usGetPictureW = &usGetPictureW; - vDrawSetHandler(&LCD); - yield();Serial.begin(9600); - while (!Serial); - yield();Serial.println("emGUI testing"); - // Initial setup - tft.begin(); - //tft.setRotation(iliRotation270); // landscape - tft.fillScreen(ILI9341_BLACK); - - interface1 = pxInterfaceCreate(&myHandler); - - vInterfaceOpenWindow(WINDOW_MENU); -} - - - -uint16_t color; - -void loop(void) { - vInterfaceDraw(); - delay(3000); - btnAboutHDLR(NULL); - vInterfaceDraw(); - delay(3000); - vInterfaceCloseActiveWindow(); - vInterfaceDraw(); - -} \ No newline at end of file diff --git a/examples/demo-menu/.gitignore b/examples/demo-menu/.gitignore new file mode 100644 index 0000000..d30b083 --- /dev/null +++ b/examples/demo-menu/.gitignore @@ -0,0 +1,2 @@ +/.vscode/ +/.pio/ \ No newline at end of file diff --git a/examples/demo-menu/User_Setup.h b/examples/demo-menu/User_Setup.h index 6396402..249ae2f 100644 --- a/examples/demo-menu/User_Setup.h +++ b/examples/demo-menu/User_Setup.h @@ -1,78 +1,40 @@ -// USER DEFINED SETTINGS V16 -// Set fonts to be loaded, pins used and SPI control method +/* -// ################################################################################## -// -// Define the pins that are used to interface with the display here -// -// ################################################################################## +USER DEFINED SETTINGS -// We must use hardware SPI -// Typical setup for NodeMCU ESP-12 is : -// -// Display SDO/MISO to NodeMCU pin D6 -// Display LED to NodeMCU pin VIN (5V) -// Display SCK to NodeMCU pin D5 -// Display SDI/MOSI to NodeMCU pin D7 -// Display DC to NodeMCU pin D3 -// Display RESET to NodeMCU pin D4 -// Display CS to NodeMCU pin D8 -// Display GND to NodeMCU pin GND (0V) -// Display VCC to NodeMCU pin VIN (5V) +http://www.forward.com.au/pfod/ESP8266/GPIOpins/index.html -// ###### EDIT THE PIN NUMBERS IN THE 3 LINES FOLLOWING TO SUIT YOUR SETUP ###### + We must use hardware SPI for Touch and Display -// LinkSpriteTouchScreen -//#define TFT_DC D4 // Data Command control pin +| NodeMCU | Function | Display | INA 219 (optional) | Comment | +| ---------|---------------------|-----------------|------------------------| ------------------------------------------| +| D1 | | T_CS | | To Display | +| D2 | | CS | | To Display | +| D3 | [BOOT, I2C] SDA | | SDA | To INA219 | +| D4 | [BOOT, I2C] SCL | | SCL | To INA219, Should be HIGH on startup | +| D5 | [SPI] SCK | SCK, T_CLK | | To Display | +| D6 | [SPI] MISO | SDO, T_DO | | To Display | +| D7 | [SPI] MOSI | SDI, T_DI | | To Display | +| D8 | [BOOT] | DC | | To Display, Should be LOW on startup | +| RST | [RESET] | RST | | To Display, Optional | +| GND | [GROUND] | GND | GND | To INA and Display | +| VCC | [+3,3V] | VCC, LED | VCC | To INA and Display | -// Topfoison -#define TFT_DC 2 // Data Command control pin +*/ -#define SDA_PIN 5 -#define SCK_PIN 10 -#define INTR_SYS 4 -#define INTR_TOUCH 9 -#define INTR_NFC 12 +// ###### EDIT THE PIN NUMBERS IN THE FOLLOWING BLOCK TO SUIT YOUR SETUP ###### -#define UART_RX 3 +#define TFT_DC D8 // Data Command control pin +#define TFT_CS D2 +#define TOUCH_CS D1 +#define TFT_RST -1 // Use system reset or opt-out -// ################################################################################## -// -// Define the fonts that are to be used here -// -// ################################################################################## - -// Comment out the #defines below with // to stop that font being loaded -// The ESP8366 had plenty of memory so commenting out fonts is not normally necessary -// If all fonts are loaded the extra FLASH space required is about 17000 bytes... -// To save FLASH space only enable the fonts you need! - -//#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH -//#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters -//#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters -//#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm -//#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. -//#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. - -// ################################################################################## -// -// Define use of 9bit SPI use for displays without D/C pin, TFT_DC pin still needed -// -// ################################################################################## - -//#define USE_SPI9 - -// ################################################################################## -// -// Other speed up options -// -// ################################################################################## - -// Define the SPI clock frequency (40MHz works OK) 80MHz sometimes fails +#define SDA_PIN D3 +#define SCL_PIN D4 // #define SPI_FREQUENCY 20000000 -// #define SPI_FREQUENCY 40000000 - #define SPI_FREQUENCY 40000000 +#define SPI_FREQUENCY 40000000 +// #define SPI_FREQUENCY 80000000 // #define SPI_FREQUENCY 16000000 diff --git a/examples/demo-menu/demo-menu.ino b/examples/demo-menu/demo-menu.ino index 809f40d..39eedc5 100644 --- a/examples/demo-menu/demo-menu.ino +++ b/examples/demo-menu/demo-menu.ino @@ -1,56 +1,21 @@ +#include #include #include "emGUIGlue.h" -#include "Gui.h" +#include "src/GUI/GUI.h" +#include "src/TouchWrapper/TouchWrapper.h" - -/* -Adapted from the Adafruit graphicstest sketch. +#include -This sketch uses the GLCD font (font 1) only. Disable other fonts to make -the sketch fit in an UNO! - -Make sure all the required fonts are loaded by editting the -User_Setup.h file in the TFT_ILI9341_ESP library folder. - -If using an UNO or Mega (ATmega328 or ATmega2560 processor) then for best -performance use the F_AS_T option found in the User_Setup.h file in the -TFT_ILI9341_ESP library folder. - -The library uses the hardware SPI pins only: - For UNO, Nano, Micro Pro ATmega328 based processors - MOSI = pin 11, SCK = pin 13 - For Mega: - MOSI = pin 51, SCK = pin 52 - -The pins used for the TFT chip select (CS) and Data/command (DC) and Reset (RST) -signal lines to the TFT must also be defined in the library User_Setup.h file. - -Sugested TFT connections for UNO and Atmega328 based boards - sclk 13 // Don't change, this is the hardware SPI SCLK line - mosi 11 // Don't change, this is the hardware SPI MOSI line - cs 10 // Chip select for TFT display - dc 9 // Data/command line - rst 7 // Reset, you could connect this to the Arduino reset pin - -Suggested TFT connections for the MEGA and ATmega2560 based boards - sclk 52 // Don't change, this is the hardware SPI SCLK line - mosi 51 // Don't change, this is the hardware SPI MOSI line - cs 47 // TFT chip select line - dc 48 // TFT data/command line - rst 44 // you could alternatively connect this to the Arduino reset - -######################################################################### -###### DON'T FORGET TO UPDATE THE User_Setup.h FILE IN THE LIBRARY ###### -###### TO SELECT THE FONTS AND PINS YOU USE, SEE ABOVE ###### -######################################################################### -*/ +TouchWrapper touch; void setup() { + Serial1.begin(115200); + touch.init(); vGUIGlueInit(); GUIInit(); } void loop(void) { vWindowManagerDraw(); + touch.handleTouch(true); } - diff --git a/examples/demo-menu/emGUIGlue.cpp b/examples/demo-menu/emGUIGlue.cpp index 0784406..156161d 100644 --- a/examples/demo-menu/emGUIGlue.cpp +++ b/examples/demo-menu/emGUIGlue.cpp @@ -2,13 +2,14 @@ #include "SPI.h" #include "src/TFT/TFT_ILI9341_ESP.h" -#include "src/TFT/SPI9.h" - #include "FS.h" -#include "Fonts/FreeSans9pt7b.h" +#include "src/TFT/Fonts/GFXFF/FreeSans9pt7b.h" +#include "src/TFT/Fonts/GFXFF/FreeSansBold9pt7b.h" +#include "src/UTF8-fonts/MyriadPro_Regular9pt8b.h" #include +#include template struct check_size { static_assert(sizeof(s) == t, "wrong size"); @@ -43,14 +44,12 @@ check_size CHECK_BITMAPINFOHEADER; #define pgm_read_pointer(addr) ((void *)pgm_read_dword(addr)) -//SPI9Class SPI9(TFT_DC); // construct global SPI9 instance here, where the dcPin is known static TFT_ILI9341_ESP *tft = NULL; static xDraw_t LCD; class BMPFile{ public: - BMPFile(): _w(0), _h(0), _offs(0){ - + BMPFile(): _w(0), _h(0), _offs(0) { } operator bool() const{ @@ -117,19 +116,57 @@ class BMPFile{ static BMPFile *bmFile = NULL; +typedef enum { + UTF_WAIT_FIRST = 0, + UTF_WAIT_SECOND = 1 +}eUTFstate; + +typedef struct { + eUTFstate state; + uint16_t buffer; +} tUTFstateMachine; + +bool vGUICheckUTF(uint8_t data, tUTFstateMachine * t_status) { //returns true if we got whole char + static const uint8_t firstMarker= 0b11000000; + static const uint8_t firstMask = 0b11100000; + + static const uint8_t secondMarker = 0b10000000; + static const uint8_t secondMask = 0b11000000; + + switch (t_status->state) { + case UTF_WAIT_FIRST: + if ((data & firstMask) == firstMarker) { + t_status->state = UTF_WAIT_SECOND;// we catched first symbol + t_status->buffer = 0; + t_status->buffer = (data & ~firstMask) << 6; + return false; + } + + t_status->buffer = data; + return true; + + case UTF_WAIT_SECOND: + t_status->state = UTF_WAIT_FIRST; + if ((data & secondMask) == secondMarker) { + t_status->buffer |= data & ~secondMask; + return true; + } + if (data < 0x80) { //can be valid ASCII character + t_status->buffer = data; + return true; + } + t_status->buffer = 0; + return false; + } + return false; +} + static uint16_t usFontGetH(xFont pubFont) { - const GFXfont *gfxFont = pubFont; + const GFXfont *gfxFont = *pubFont; uint8_t height = pgm_read_byte (&gfxFont->yAdvance); return (uint16_t) height; } -static xPicture prvGetPicture(const char * picName) { - if(strcmp(picName, "SB_CROSS.pic") == 0) //special picture name for status-bar cross - return "/cross16px.bmp"; - - return picName; //if we use picture names, to get them from FS, we should pass name as is -} - static xModalDialogPictureSet prvGetPicSet(char cType) { xModalDialogPictureSet xPicSet; switch (cType) { @@ -143,23 +180,48 @@ static xModalDialogPictureSet prvGetPicSet(char cType) { break; case 'o': xPicSet.strLabel = "OK"; - xPicSet.xPicMain = "/ok.bmp"; //for debug purposses use 59 pixels ok picture + xPicSet.xPicMain = "/ok59.bmp"; //for debug purposses use 59 pixels ok picture break; default: xPicSet.strLabel = "OK"; - xPicSet.xPicMain = "/ok.bmp"; + xPicSet.xPicMain = "/ok59.bmp"; break; } return xPicSet; } +static const GFXfont * prvGetFontSegment(uint16_t ch, xFont f) { +#if EMGUI_USE_UTF8_FONTS + while (*f) { + uint16_t first = (uint16_t)pgm_read_word(&(*f)->first); + uint16_t last = (uint16_t)pgm_read_word(&(*f)->last); + + if (ch >= first && ch <= last) + return *f; + f++; + } +#else + return f; +#endif // EMGUI_USE_UTF8_FONTS + return NULL; +} + static uint16_t ucFontGetCharW(char cChar, xFont pubFont) { - const GFXfont *gfxFont = pubFont; - if (cChar < (uint8_t)pgm_read_byte(&gfxFont->first) || cChar > (uint8_t)pgm_read_byte(&gfxFont->last)) + static tUTFstateMachine machine = { UTF_WAIT_FIRST,0 }; + uint16_t utfChar; + if (!vGUICheckUTF(cChar, &machine)) { + return 0; + } + else { + utfChar = machine.buffer; + } + const GFXfont *gfxFont = prvGetFontSegment(utfChar, pubFont); + if (!gfxFont) return 0; - cChar -= (uint8_t)pgm_read_byte(&gfxFont->first); - GFXglyph *glyph = &(((GFXglyph *)pgm_read_pointer(&gfxFont->glyph))[cChar]); + + utfChar -= (uint16_t)pgm_read_word(&gfxFont->first); + GFXglyph *glyph = &(((GFXglyph *)pgm_read_pointer(&gfxFont->glyph))[utfChar]); uint8_t w = pgm_read_byte(&glyph->xAdvance); return (uint16_t) w; @@ -184,6 +246,7 @@ static void vRectangle(uint16_t usX0, uint16_t usY0, uint16_t usX1, uint16_t usY if (!tft) return; if (bFill) { + tft->fillRect(usX0, usY0, usX1 - usX0 + 1, usY1 - usY0 + 1, usColor); } else { tft->drawRect(usX0, usY0, usX1 - usX0 + 1, usY1 - usY0 + 1, usColor); @@ -191,38 +254,45 @@ static void vRectangle(uint16_t usX0, uint16_t usY0, uint16_t usX1, uint16_t usY } static void vPutChar( uint16_t usX, uint16_t usY, char cChar, xFont pubFont, uint16_t usColor, uint16_t usBackground, bool bFillBg) { - - const GFXfont *gfxFont = pubFont; + static tUTFstateMachine machine = { UTF_WAIT_FIRST,0 }; + uint16_t utfChar; + if (!vGUICheckUTF(cChar, &machine)) { + return ; + } + else { + utfChar = machine.buffer; + } + const GFXfont *gfxFont = prvGetFontSegment(utfChar, pubFont); + if (!gfxFont) + return ; - if (cChar < (uint8_t)pgm_read_byte(&gfxFont->first) || cChar > (uint8_t)pgm_read_byte(&gfxFont->last)) - return; - cChar -= (uint8_t)pgm_read_byte(&gfxFont->first); - GFXglyph *glyph = &(((GFXglyph *)pgm_read_pointer(&gfxFont->glyph))[cChar]); - uint8_t *bitmap = (uint8_t *)pgm_read_pointer(&gfxFont->bitmap); - - uint16_t bo = pgm_read_word(&glyph->bitmapOffset); - uint8_t w = pgm_read_byte(&glyph->width), - h = pgm_read_byte(&glyph->height); - int8_t xo = pgm_read_byte(&glyph->xOffset), - yo = pgm_read_byte(&glyph->yOffset); - uint8_t xx, yy, bits = 0, bit = 0; - - auto x = usX; - auto y = usY + usFontGetH(pubFont) * 3 / 4 - 1; - - - for(yy=0; yydrawPixel(x+xo+xx, y+yo+yy, usColor); - } - bits <<= 1; - } - } + utfChar -= (uint16_t)pgm_read_word(&gfxFont->first); + GFXglyph *glyph = &(((GFXglyph *)pgm_read_pointer(&gfxFont->glyph))[utfChar]); + uint8_t *bitmap = (uint8_t *)pgm_read_pointer(&gfxFont->bitmap); + + uint16_t bo = pgm_read_word(&glyph->bitmapOffset); + uint8_t w = pgm_read_byte(&glyph->width), + h = pgm_read_byte(&glyph->height); + int8_t xo = pgm_read_byte(&glyph->xOffset), + yo = pgm_read_byte(&glyph->yOffset); + uint8_t xx, yy, bits = 0, bit = 0; + + auto x = usX; + auto y = usY + usFontGetH(pubFont) * 3 / 4 - 1; + + + for(yy=0; yydrawPixel(x+xo+xx, y+yo+yy, usColor); + } + bits <<= 1; + } + } } @@ -231,13 +301,14 @@ static void vHLine(uint16_t usX0, uint16_t usY0, uint16_t usX1, uint16_t usColor if (!tft) return; + if (usX0 == usX1) usX1++; tft->drawFastHLine(usX0, usY0, usX1 - usX0, usColor); } static void vVLine(uint16_t usX0, uint16_t usY0, uint16_t usY1, uint16_t usColor) { if (!tft) return; - + if (usY0 == usY1) usY1++; tft->drawFastVLine(usX0, usY0, usY1 - usY0, usColor); } @@ -245,7 +316,7 @@ static void bPicture(int16_t sX0, int16_t sY0, xPicture pusPicture) { if (!tft || !bmFile) return; - //Serial.println(pusPicture); + Serial.println(pusPicture); if (bmFile->open(pusPicture)){ uint32_t W = bmFile->width(); @@ -259,16 +330,10 @@ static void bPicture(int16_t sX0, int16_t sY0, xPicture pusPicture) { dataSize = dataSize + padding; // in case of odd width we should pad to 4 bytes dataSize *= H; - // Serial.print(W); - // Serial.print("x"); - // Serial.println(H); - // Serial.println(dataSize); - - tft->writecommand (ILI9341_MADCTL); - tft->writedata(0x80); - + tft->setRotation(5); //we need to translate coords with respect to MAXIMUM available resolution for our controller - tft->setWindow(sX0, ILI9341_TFTHEIGHT - sY1, sX1, ILI9341_TFTHEIGHT - sY0); + //tft->setWindow(sX0, ILI9341_TFTWIDTH - sY1, sX1, ILI9341_TFTHEIGHT - sY0); + tft->setWindow(sX0, 240 - sY1, sX1, 240 - sY0); //for swapping X and Y //tft->setWindow(EMGUI_LCD_WIDTH - sX1, ILI9341_TFTHEIGHT - sY1, EMGUI_LCD_WIDTH - sX0, ILI9341_TFTHEIGHT - sY0); @@ -313,8 +378,9 @@ static void bPicture(int16_t sX0, int16_t sY0, xPicture pusPicture) { } } - tft->writecommand (ILI9341_MADCTL); - tft->writedata(0x00); + //tft->writecommand (ILI9341_MADCTL); + //tft->writedata(0x00); + tft->setRotation(1); } } @@ -338,8 +404,10 @@ static uint16_t usGetPictureH(xPicture pusPicture) { return 0; } +static const GFXfont * xDefaultFont[] = { &FreeSans9pt7b, &MyriadPro_Regular9pt8b, NULL }; + xFont xGetDefaultFont() { - return &FreeSans9pt7b; + return xDefaultFont; } void TFTSleep(){ @@ -357,8 +425,11 @@ void TFTWake(){ } void vGUIGlueInit(){ + SPIFFS.begin(); + // Config EM_GUI opts + EMGUI_LCD_WIDTH = 320; + EMGUI_STATUS_BAR_HEIGHT = 26; if (!tft){ - SPIFFS.begin(); bmFile = new BMPFile(); tft = new TFT_ILI9341_ESP(); // Use hardware SPI @@ -376,12 +447,12 @@ void vGUIGlueInit(){ LCD.usFontGetStrW = &usFontGetStrW; LCD.usFontGetStrH = &usFontGetStrH; LCD.xGetDialogPictureSet = prvGetPicSet; - LCD.xGetPicture = prvGetPicture; LCD.xGetDefaultFont = xGetDefaultFont; vDrawSetHandler(&LCD); tft->init(); tft->fillScreen(TFT_LIGHTGREY); + tft->setRotation(1); } } \ No newline at end of file diff --git a/examples/demo-menu/emGUIGlue.h b/examples/demo-menu/emGUIGlue.h index 5593161..a353629 100644 --- a/examples/demo-menu/emGUIGlue.h +++ b/examples/demo-menu/emGUIGlue.h @@ -3,6 +3,8 @@ #include + + void TFTSleep(); void TFTWake(); @@ -12,4 +14,5 @@ void vGUIGlueInit(); xFont xGetDefaultFont(); void vGUIGlueSetCtx(void *); + #endif \ No newline at end of file diff --git a/examples/demo-menu/lib/.gitignore b/examples/demo-menu/lib/.gitignore new file mode 100644 index 0000000..8bda964 --- /dev/null +++ b/examples/demo-menu/lib/.gitignore @@ -0,0 +1 @@ +emGUI/ \ No newline at end of file diff --git a/examples/demo-menu/lib/.gitkeep b/examples/demo-menu/lib/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/examples/demo-menu/platformio.ini b/examples/demo-menu/platformio.ini new file mode 100644 index 0000000..780646c --- /dev/null +++ b/examples/demo-menu/platformio.ini @@ -0,0 +1,28 @@ +;PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[platformio] +src_dir = . +data_dir = ./data/ +env_default = nodemcuv2 + +[env:nodemcuv2] +platform = espressif8266@2.2.2 +board = nodemcuv2 +framework = arduino +lib_extra_dirs = ./lib/ +board_build.f_cpu = 80000000L +board_build.f_flash = 80000000L +board_build.flash_mode = dio +monitor_speed = 115200 +monitor_rts = 0 +monitor_dtr = 0 +upload_speed = 921600 +lib_deps = XPT2046_Touchscreen@26b691b2c8 diff --git a/examples/demo-menu/GUI.cpp b/examples/demo-menu/src/GUI/GUI.cpp similarity index 92% rename from examples/demo-menu/GUI.cpp rename to examples/demo-menu/src/GUI/GUI.cpp index 4fffb1f..236a345 100644 --- a/examples/demo-menu/GUI.cpp +++ b/examples/demo-menu/src/GUI/GUI.cpp @@ -55,7 +55,7 @@ class TPTest: public DisposableWindow { } protected: - int colorNum = 0; + unsigned int colorNum = 0; }; @@ -71,7 +71,7 @@ class WindowHWTest: public emGUI::DisposableWindow auto y = spacing / 2; auto x = 5; auto w = 130; - auto len = 20; + //auto len = 20; l1 = pxLabelCreate(x, y, w, 110, F_WRP(""), NULL, 100, xThis); @@ -95,8 +95,9 @@ class WindowHWTest: public emGUI::DisposableWindow y += draw->H() + spacing; tp = std::make_unique(x, y, w, h, "TP ON", this); - tp->onToggle = [](ButtonToggle* b, bool state) { + tp->onToggle = [](ButtonToggle* b, bool state) -> bool { //do something + return true; }; y += tp->H() + spacing; @@ -106,20 +107,23 @@ class WindowHWTest: public emGUI::DisposableWindow spacing = 2; act = std::make_unique(x, y, w, h, "ACTIVE", this); - act->onToggle = [](ButtonToggle* b, bool state) { + act->onToggle = [](ButtonToggle* b, bool state) -> bool { //do something + return true; }; x += act->W() + spacing; vib = std::make_unique(x, y, w, h, "VBR", this); - vib->onToggle = [](ButtonToggle* b, bool state) { + vib->onToggle = [](ButtonToggle* b, bool state) -> bool { //do something + return true; }; x += vib->W() + spacing; bl = std::make_unique(x, y, w, h, "BL", this); - bl->onToggle = [](ButtonToggle* b, bool state) { + bl->onToggle = [](ButtonToggle* b, bool state) -> bool { //do something + return true; }; x += bl->W() + spacing; @@ -181,7 +185,7 @@ class WindowMain : public DisposableWindow { uint8_t row2 = row1 + 80 + offset; uint8_t column1 = offset; uint8_t column2 = EMGUI_LCD_WIDTH / 2 - 30; - uint8_t column3 = EMGUI_LCD_WIDTH - offset - 60; + //uint8_t column3 = EMGUI_LCD_WIDTH - offset - 60; auto btn = pxButtonCreateFromImageWithText(column1, row1, "/about.bmp", "HW Test", xThis); vButtonSetOnClickHandler(btn, [](xWidget *) { @@ -227,7 +231,7 @@ class WindowMain : public DisposableWindow { // Action on interface creatings bool bGUIonWindowManagerCreateHandler(xWidget *) { vWindowManagerSetKeypressHandler([](int iID, uint16_t uEv){ - if(uEv = 1) + if(uEv == 1) vWindowManagerCloseActiveWindow(); return true; diff --git a/examples/demo-menu/GUI.h b/examples/demo-menu/src/GUI/GUI.h similarity index 84% rename from examples/demo-menu/GUI.h rename to examples/demo-menu/src/GUI/GUI.h index 10efff9..39914d8 100644 --- a/examples/demo-menu/GUI.h +++ b/examples/demo-menu/src/GUI/GUI.h @@ -2,7 +2,7 @@ #define _GUI_H_ #include -#include "emGUIGlue.h" +#include "../../emGUIGlue.h" typedef enum { WINDOW_MENU, diff --git a/examples/demo-menu/src/TFT/SPI9.cpp b/examples/demo-menu/src/TFT/SPI9.cpp deleted file mode 100644 index 84c1d25..0000000 --- a/examples/demo-menu/src/TFT/SPI9.cpp +++ /dev/null @@ -1,91 +0,0 @@ -// SPI9.cpp - -// My additions for SPI9 is "Help Yourself Software", no warranty, no support, no obligations. - -// JZ 27.12.2016 - -#include "SPI9.h" - -SPI9Class::SPI9Class(uint8_t dcPin) : _dc(dcPin) -{ -} - -inline void SPI9Class::setDataBits(uint16_t bits) -{ - const uint32_t mask = ~((SPIMMOSI << SPILMOSI) | (SPIMMISO << SPILMISO)); - bits--; - SPI1U1 = ((SPI1U1 & mask) | ((bits << SPILMOSI) | (bits << SPILMISO))); -} - -uint8_t SPI9Class::transfer(uint8_t data) -{ - while (SPI1CMD & SPIBUSY) {} - // low byte first, ms bit first!; CMD : dc low -> first bit 0, DATA : dc high -> first bit high - setDataBits(9); - SPI1W0 = (data >> 1) | (data << 15) | (digitalRead(_dc) << 7); - SPI1CMD |= SPIBUSY; - while (SPI1CMD & SPIBUSY) {} - uint16_t rv = SPI1W0; - return uint8_t((rv << 1) | (rv >> 15)); // most likely first try is wrong, need to find test method -} - -void SPI9Class::write(uint8_t data) -{ - while (SPI1CMD & SPIBUSY) {} - // low byte first, ms bit first!; CMD : dc low -> first bit 0, DATA : dc high -> first bit high - setDataBits(9); - SPI1W0 = (data >> 1) | (data << 15) | (digitalRead(_dc) << 7); - SPI1CMD |= SPIBUSY; - while (SPI1CMD & SPIBUSY) {} -} - -void SPI9Class::write16(uint16_t data) -{ // no easy optimization - write(data >> 8); - write(data); -} - -void SPI9Class::write32(uint32_t data) -{ // no easy optimization - union - { - uint32_t l; - uint8_t b[4]; - } data_; - data_.l = data; - write(data_.b[3]); - write(data_.b[2]); - write(data_.b[1]); - write(data_.b[0]); -} - -void SPI9Class::writeBytes(uint8_t * data, uint32_t size) -{ // no easy optimization - for (uint8_t i = 0; i < size; i++) - { - write(data[i]); - } - return; -} - -void SPI9Class::writePattern(uint8_t * data, uint8_t size, uint32_t repeat) -{ // no easy optimization - for (uint32_t r = 0; r < repeat; r++) - { - for (uint8_t i = 0; i < size; i++) - { - write(data[i]); - } - yield(); // avoid wdt timeout on low bitrates - } -} -void SPI9Class::transferBytes(uint8_t * out, uint8_t * in, uint32_t size) -{ // no easy optimization - for (uint32_t i = 0; i < size; i++) - { - out[i] = transfer(in[i]); - } - return; -} - - diff --git a/examples/demo-menu/src/TFT/SPI9.h b/examples/demo-menu/src/TFT/SPI9.h deleted file mode 100644 index d61afec..0000000 --- a/examples/demo-menu/src/TFT/SPI9.h +++ /dev/null @@ -1,32 +0,0 @@ -// SPI9.h - -// preliminary version 27.12.2015, for ESP8266 only, for MSBFIRST only, not optimized. - -// My additions for SPI9 is "Help Yourself Software", no warranty, no support, no obligations. - -// JZ 27.12.2016 - -#ifndef _SPI9_H_ -#define _SPI9_H_ - -#include - -class SPI9Class : public SPIClass -{ - public: - SPI9Class(uint8_t dcPin); - uint8_t transfer(uint8_t data); - void write(uint8_t data); - void write16(uint16_t data); - void write32(uint32_t data); - void writeBytes(uint8_t * data, uint32_t size); - void writePattern(uint8_t * data, uint8_t size, uint32_t repeat); - void transferBytes(uint8_t * out, uint8_t * in, uint32_t size); - private: - uint8_t _dc; - inline void setDataBits(uint16_t bits); -}; - -extern SPI9Class SPI9; // create instance in application, where dcPin to use is known - -#endif diff --git a/examples/demo-menu/src/TFT/TFT_ILI9341_ESP.cpp b/examples/demo-menu/src/TFT/TFT_ILI9341_ESP.cpp index fce3168..18ccdd7 100644 --- a/examples/demo-menu/src/TFT/TFT_ILI9341_ESP.cpp +++ b/examples/demo-menu/src/TFT/TFT_ILI9341_ESP.cpp @@ -1,6 +1,6 @@ /*************************************************** Arduino TFT graphics library targetted at ESP8266 - based boards such as the NodeMCU. + based boards. (ESP32 support is planned!) This library has been derived from the Adafruit_GFX library and the associated driver library. See text @@ -13,1977 +13,2932 @@ The larger fonts are Run Length Encoded to reduce their size. + Created by Bodmer 2/12/16 ****************************************************/ - #include "TFT_ILI9341_ESP.h" - - #include - - #include - #include "pins_arduino.h" - #include "wiring_private.h" - #include - - // If the SPI library has transaction support, these functions - // establish settings and protect from interference from other - // libraries. Otherwise, they simply do nothing. - - inline void TFT_ILI9341_ESP::spi_begin(void){ - #ifdef SPI_HAS_TRANSACTION - #ifdef SUPPORT_TRANSACTIONS - _SPI->beginTransaction(SPISettings(SPI_FREQUENCY, MSBFIRST, SPI_MODE0)); - #endif - #endif - } - - inline void TFT_ILI9341_ESP::spi_end(void){ - #ifdef SPI_HAS_TRANSACTION - #ifdef SUPPORT_TRANSACTIONS - _SPI->endTransaction(); - #endif - #endif - } - - /*************************************************************************************** - ** Function name: TFT_ILI9341_ESP - ** Description: Constructor , we must use hardware SPI pins - ***************************************************************************************/ - TFT_ILI9341_ESP::TFT_ILI9341_ESP(int16_t w, int16_t h) - { - - _dc = TFT_DC; - - #ifdef USE_SPI9 - _SPI = &SPI9; // addition JZ 27.12.2016 - #else - _SPI = &SPI; // fixed JZ 27.12.2016 - #endif - - //if (TFT_RST > 0) { - //digitalWrite(TFT_RST, LOW); - //pinMode(TFT_RST, OUTPUT); - //} - - digitalWrite(TFT_DC, HIGH); - pinMode(TFT_DC, OUTPUT); - - _width = w; - _height = h; - rotation = 0; - cursor_y = cursor_x = 0; - textfont = 1; - textsize = 1; - textcolor = 0xFFFF; - textbgcolor = 0x0000; - padX = 0; - textwrap = true; - textdatum = 0; // Left text alignment is default - fontsloaded = 0; - - addr_row = 0xFFFF; - addr_col = 0xFFFF; - win_xe = 0xFFFF; - win_ye = 0xFFFF; - - #ifdef LOAD_GLCD - fontsloaded = 0x0002; // Bit 1 set - #endif - - #ifdef LOAD_FONT2 - fontsloaded |= 0x0004; // Bit 2 set - #endif - - #ifdef LOAD_FONT4 - fontsloaded |= 0x0010; // Bit 4 set - #endif - - #ifdef LOAD_FONT6 - fontsloaded |= 0x0040; // Bit 6 set - #endif - - #ifdef LOAD_FONT7 - fontsloaded |= 0x0080; // Bit 7 set - #endif - - #ifdef LOAD_FONT8 - fontsloaded |= 0x0100; // Bit 8 set - #endif - - } - - /*************************************************************************************** - ** Function name: spiwrite - ** Description: Write 8 bits to SPI port - ***************************************************************************************/ - void TFT_ILI9341_ESP::spiwrite(uint8_t c) - { - _SPI->transfer(c); - } - - /*************************************************************************************** - ** Function name: writecommand - ** Description: Send an 8 bit command to the TFT - ***************************************************************************************/ - void TFT_ILI9341_ESP::writecommand(uint8_t c) - { - *dcport &= ~dcpinmask; - spiwrite(c); - *dcport |= dcpinmask; - } - - /*************************************************************************************** - ** Function name: writedata - ** Description: Send a 8 bit data value to the TFT - ***************************************************************************************/ - void TFT_ILI9341_ESP::writedata(uint8_t c) - { - spiwrite(c); - } - - /*************************************************************************************** - ** Function name: begin - ** Description: Included for backwards compatibility - ***************************************************************************************/ - void TFT_ILI9341_ESP::begin(void) - { - init(); - } - - /*************************************************************************************** - ** Function name: init - ** Description: Reset, then initialise the TFT display registers - ***************************************************************************************/ - void TFT_ILI9341_ESP::init(void) - { - dcport = portOutputRegister(digitalPinToPort(_dc)); - dcpinmask = digitalPinToBitMask(_dc); - - _SPI->begin(); - _SPI->setHwCs(true); - - #ifndef SUPPORT_TRANSACTIONS - _SPI->setBitOrder(MSBFIRST); - _SPI->setDataMode(SPI_MODE0); - _SPI->setFrequency(SPI_FREQUENCY); - #endif - - spi_begin(); - - //digitalWrite(TFT_RST, HIGH); - //delay(1); //Delay 1ms - //digitalWrite(TFT_RST, LOW); - //delay(10); //Delay 10ms - //digitalWrite(TFT_RST, HIGH); - delay(120); //Delay 120ms - //---------------------------------------------------------------------------------------------------// - writecommand (ILI9341_SLPOUT); - delay(120); //Delay 120ms - - // DATASHEET SEQUENCE - writecommand (ILI9341_MADCTL); - writedata(0x00); - - writecommand (ILI9341_PIXFMT); - writedata(0x05); - - writecommand (ILI9341_INVON); - - writecommand (ILI9341_CASET); - writedata(0x00); - writedata(0x00); - writedata(0x00); - writedata(0xef); - - writecommand (ILI9341_PASET); - writedata(0x00); - writedata(0x00); - writedata(0x00); - writedata(0xef); - //--------------------------------ST7789V Frame ratesetting----------------------------------// - writecommand (ILI9341_FRMCTR2); - writedata(0x0c); - writedata(0x0c); - writedata(0x00); - writedata(0x33); - writedata(0x33); - - writecommand (0xb7); - writedata(0x35); - writecommand (0xbb); - writedata(0x1f); - writecommand (0xc0); - writedata(0x2c); - writecommand (0xc2); - writedata(0x01); - writecommand (0xc3); - writedata(0x12); - writecommand (0xc4); - writedata(0x20); - writecommand (0xc6); - writedata(0x0f); - writecommand (0xd0); - writedata(0xa4); - writedata(0xa1); - - //--------------------------------ST7789V gammasetting--------------------------------------// - writecommand (ILI9341_GMCTRP1); - writedata(0xd0); - writedata(0x08); - writedata(0x11); - writedata(0x08); - writedata(0x0c); - writedata(0x15); - writedata(0x39); - writedata(0x33); - writedata(0x50); - writedata(0x36); - writedata(0x13); - writedata(0x14); - writedata(0x29); - writedata(0x2d); - writecommand (ILI9341_GMCTRN1); - writedata(0xd0); - writedata(0x08); - writedata(0x10); - writedata(0x08); - writedata(0x06); - writedata(0x06); - writedata(0x39); - writedata(0x44); - writedata(0x51); - writedata(0x0b); - writedata(0x16); - writedata(0x14); - writedata(0x2f); - writedata(0x31); - writecommand (ILI9341_DISPON); - } - - - /*************************************************************************************** - ** Function name: drawCircle - ** Description: Draw a circle outline - ***************************************************************************************/ - void TFT_ILI9341_ESP::drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) - { - int16_t f = 1 - r; - int16_t ddF_x = 1; - int16_t ddF_y = - r - r; - int16_t x = 0; - - //fastSetup(); - - drawPixel(x0 + r, y0 , color); - drawPixel(x0 - r, y0 , color); - drawPixel(x0 , y0 - r, color); - drawPixel(x0 , y0 + r, color); - - while (x < r) { - if (f >= 0) { - r--; - ddF_y += 2; - f += ddF_y; - } - x++; - ddF_x += 2; - f += ddF_x; - - drawPixel(x0 + x, y0 + r, color); - drawPixel(x0 - x, y0 + r, color); - drawPixel(x0 - x, y0 - r, color); - drawPixel(x0 + x, y0 - r, color); - - drawPixel(x0 + r, y0 + x, color); - drawPixel(x0 - r, y0 + x, color); - drawPixel(x0 - r, y0 - x, color); - drawPixel(x0 + r, y0 - x, color); - } - } - - /*************************************************************************************** - ** Function name: drawCircleHelper - ** Description: Support function for circle drawing - ***************************************************************************************/ - void TFT_ILI9341_ESP::drawCircleHelper( int16_t x0, int16_t y0, int16_t r, uint8_t cornername, uint16_t color) - { - int16_t f = 1 - r; - int16_t ddF_x = 1; - int16_t ddF_y = -2 * r; - int16_t x = 0; - - while (x < r) { - if (f >= 0) { - r--; - ddF_y += 2; - f += ddF_y; - } - x++; - ddF_x += 2; - f += ddF_x; - if (cornername & 0x4) { - drawPixel(x0 + x, y0 + r, color); - drawPixel(x0 + r, y0 + x, color); - } - if (cornername & 0x2) { - drawPixel(x0 + x, y0 - r, color); - drawPixel(x0 + r, y0 - x, color); - } - if (cornername & 0x8) { - drawPixel(x0 - r, y0 + x, color); - drawPixel(x0 - x, y0 + r, color); - } - if (cornername & 0x1) { - drawPixel(x0 - r, y0 - x, color); - drawPixel(x0 - x, y0 - r, color); - } - } - } - - /*************************************************************************************** - ** Function name: fillCircle - ** Description: draw a filled circle - ***************************************************************************************/ - void TFT_ILI9341_ESP::fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) - { - drawFastVLine(x0, y0 - r, r + r + 1, color); - fillCircleHelper(x0, y0, r, 3, 0, color); - } - - /*************************************************************************************** - ** Function name: fillCircleHelper - ** Description: Support function for filled circle drawing - ***************************************************************************************/ - // Used to do circles and roundrects - void TFT_ILI9341_ESP::fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, int16_t delta, uint16_t color) - { - int16_t f = 1 - r; - int16_t ddF_x = 1; - int16_t ddF_y = -r - r; - int16_t x = 0; - - delta++; - while (x < r) { - if (f >= 0) { - r--; - ddF_y += 2; - f += ddF_y; - } - x++; - ddF_x += 2; - f += ddF_x; - - if (cornername & 0x1) { - drawFastVLine(x0 + x, y0 - r, r + r + delta, color); - drawFastVLine(x0 + r, y0 - x, x + x + delta, color); - } - if (cornername & 0x2) { - drawFastVLine(x0 - x, y0 - r, r + r + delta, color); - drawFastVLine(x0 - r, y0 - x, x + x + delta, color); - } - } - } - - /*************************************************************************************** - ** Function name: drawEllipse - ** Description: Draw a ellipse outline - ***************************************************************************************/ - void TFT_ILI9341_ESP::drawEllipse(int16_t x0, int16_t y0, int16_t rx, int16_t ry, uint16_t color) - { - if (rx<2) return; - if (ry<2) return; - int16_t x, y; - int32_t rx2 = rx * rx; - int32_t ry2 = ry * ry; - int32_t fx2 = 4 * rx2; - int32_t fy2 = 4 * ry2; - int32_t s; - - //fastSetup(); - - for (x = 0, y = ry, s = 2*ry2+rx2*(1-2*ry); ry2*x <= rx2*y; x++) - { - drawPixel(x0 + x, y0 + y, color); - drawPixel(x0 - x, y0 + y, color); - drawPixel(x0 - x, y0 - y, color); - drawPixel(x0 + x, y0 - y, color); - if (s >= 0) - { - s += fx2 * (1 - y); - y--; - } - s += ry2 * ((4 * x) + 6); - } - - for (x = rx, y = 0, s = 2*rx2+ry2*(1-2*rx); rx2*y <= ry2*x; y++) - { - drawPixel(x0 + x, y0 + y, color); - drawPixel(x0 - x, y0 + y, color); - drawPixel(x0 - x, y0 - y, color); - drawPixel(x0 + x, y0 - y, color); - if (s >= 0) - { - s += fy2 * (1 - x); - x--; - } - s += rx2 * ((4 * y) + 6); - } - } - - /*************************************************************************************** - ** Function name: fillEllipse - ** Description: draw a filled ellipse - ***************************************************************************************/ - void TFT_ILI9341_ESP::fillEllipse(int16_t x0, int16_t y0, int16_t rx, int16_t ry, uint16_t color) - { - if (rx<2) return; - if (ry<2) return; - int16_t x, y; - int32_t rx2 = rx * rx; - int32_t ry2 = ry * ry; - int32_t fx2 = 4 * rx2; - int32_t fy2 = 4 * ry2; - int32_t s; - - for (x = 0, y = ry, s = 2*ry2+rx2*(1-2*ry); ry2*x <= rx2*y; x++) - { - drawFastHLine(x0 - x, y0 - y, x + x + 1, color); - drawFastHLine(x0 - x, y0 + y, x + x + 1, color); - - if (s >= 0) - { - s += fx2 * (1 - y); - y--; - } - s += ry2 * ((4 * x) + 6); - } - - for (x = rx, y = 0, s = 2*rx2+ry2*(1-2*rx); rx2*y <= ry2*x; y++) - { - drawFastHLine(x0 - x, y0 - y, x + x + 1, color); - drawFastHLine(x0 - x, y0 + y, x + x + 1, color); - - if (s >= 0) - { - s += fy2 * (1 - x); - x--; - } - s += rx2 * ((4 * y) + 6); - } - - } - - /*************************************************************************************** - ** Function name: fillScreen - ** Description: Clear the screen to defined colour - ***************************************************************************************/ - void TFT_ILI9341_ESP::fillScreen(uint16_t color) - { - fillRect(0, 0, _width, _height, color); - } - - /*************************************************************************************** - ** Function name: drawRect - ** Description: Draw a rectangle outline - ***************************************************************************************/ - // Draw a rectangle - void TFT_ILI9341_ESP::drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) - { - drawFastHLine(x, y, w, color); - drawFastHLine(x, y + h - 1, w, color); - drawFastVLine(x, y, h, color); - drawFastVLine(x + w - 1, y, h, color); - } - - /*************************************************************************************** - ** Function name: drawRoundRect - ** Description: Draw a rounded corner rectangle outline - ***************************************************************************************/ - // Draw a rounded rectangle - void TFT_ILI9341_ESP::drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color) - { - // smarter version - drawFastHLine(x + r , y , w - r - r, color); // Top - drawFastHLine(x + r , y + h - 1, w - r - r, color); // Bottom - drawFastVLine(x , y + r , h - r - r, color); // Left - drawFastVLine(x + w - 1, y + r , h - r - r, color); // Right - // draw four corners - drawCircleHelper(x + r , y + r , r, 1, color); - drawCircleHelper(x + w - r - 1, y + r , r, 2, color); - drawCircleHelper(x + w - r - 1, y + h - r - 1, r, 4, color); - drawCircleHelper(x + r , y + h - r - 1, r, 8, color); - } - - /*************************************************************************************** - ** Function name: fillRoundRect - ** Description: Draw a rounded corner filled rectangle - ***************************************************************************************/ - // Fill a rounded rectangle - void TFT_ILI9341_ESP::fillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color) - { - // smarter version - fillRect(x + r, y, w - r - r, h, color); - - // draw four corners - fillCircleHelper(x + w - r - 1, y + r, r, 1, h - r - r - 1, color); - fillCircleHelper(x + r , y + r, r, 2, h - r - r - 1, color); - } - - /*************************************************************************************** - ** Function name: drawTriangle - ** Description: Draw a triangle outline using 3 arbitrary points - ***************************************************************************************/ - // Draw a triangle - void TFT_ILI9341_ESP::drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color) - { - drawLine(x0, y0, x1, y1, color); - drawLine(x1, y1, x2, y2, color); - drawLine(x2, y2, x0, y0, color); - } - - /*************************************************************************************** - ** Function name: fillTriangle - ** Description: Draw a filled triangle using 3 arbitrary points - ***************************************************************************************/ - // Fill a triangle - original Adafruit function works well and code footprint is small - void TFT_ILI9341_ESP::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; - - // Sort coordinates by Y order (y2 >= y1 >= y0) - if (y0 > y1) { - swap(y0, y1); swap(x0, x1); - } - if (y1 > y2) { - swap(y2, y1); swap(x2, x1); - } - if (y0 > y1) { - swap(y0, y1); swap(x0, x1); - } - - if (y0 == y2) { // Handle awkward all-on-same-line case as its own thing - a = b = x0; - if (x1 < a) a = x1; - else if (x1 > b) b = x1; - if (x2 < a) a = x2; - else if (x2 > b) b = x2; - drawFastHLine(a, y0, b - a + 1, color); - return; - } - - int16_t - dx01 = x1 - x0, - dy01 = y1 - y0, - dx02 = x2 - x0, - dy02 = y2 - y0, - dx12 = x2 - x1, - dy12 = y2 - y1, - sa = 0, - sb = 0; - - // For upper part of triangle, find scanline crossings for segments - // 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1 - // is included here (and second loop will be skipped, avoiding a /0 - // error there), otherwise scanline y1 is skipped here and handled - // in the second loop...which also avoids a /0 error here if y0=y1 - // (flat-topped triangle). - if (y1 == y2) last = y1; // Include y1 scanline - else last = y1 - 1; // Skip it - - for (y = y0; y <= last; y++) { - a = x0 + sa / dy01; - b = x0 + sb / dy02; - sa += dx01; - sb += dx02; - - if (a > b) swap(a, b); - drawFastHLine(a, y, b - a + 1, color); - } - - // For lower part of triangle, find scanline crossings for segments - // 0-2 and 1-2. This loop is skipped if y1=y2. - sa = dx12 * (y - y1); - sb = dx02 * (y - y0); - for (; y <= y2; y++) { - a = x1 + sa / dy12; - b = x0 + sb / dy02; - sa += dx12; - sb += dx02; - - if (a > b) swap(a, b); - drawFastHLine(a, y, b - a + 1, color); - } - } - - /*************************************************************************************** - ** Function name: drawBitmap - ** Description: Draw an image stored in an array on the TFT - ***************************************************************************************/ - void TFT_ILI9341_ESP::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color) { - - int16_t i, j, byteWidth = (w + 7) / 8; - //fastSetup(); - for (j = 0; j < h; j++) { - for (i = 0; i < w; i++ ) { - if (pgm_read_byte(bitmap + j * byteWidth + i / 8) & (128 >> (i & 7))) { - drawPixel(x + i, y + j, color); - } - } - } - } - - /*************************************************************************************** - ** Function name: setCursor - ** Description: Set the text cursor x,y position - ***************************************************************************************/ - void TFT_ILI9341_ESP::setCursor(int16_t x, int16_t y) - { - cursor_x = x; - cursor_y = y; - } - - /*************************************************************************************** - ** Function name: setCursor - ** Description: Set the text cursor x,y position and font - ***************************************************************************************/ - void TFT_ILI9341_ESP::setCursor(int16_t x, int16_t y, uint8_t font) - { - textfont = font; - cursor_x = x; - cursor_y = y; - } - - /*************************************************************************************** - ** Function name: setTextSize - ** Description: Set the text size multiplier - ***************************************************************************************/ - void TFT_ILI9341_ESP::setTextSize(uint8_t s) - { - if (s>7) s = 7; // Limit the maximum size multiplier so byte variables can be used for rendering - textsize = (s > 0) ? s : 1; // Don't allow font size 0 - } - - /*************************************************************************************** - ** Function name: setTextFont - ** Description: Set the font for the print stream - ***************************************************************************************/ - void TFT_ILI9341_ESP::setTextFont(uint8_t f) - { - textfont = (f > 0) ? f : 1; // Don't allow font 0 - } - - /*************************************************************************************** - ** Function name: setTextColor - ** Description: Set the font foreground colour (background is transparent) - ***************************************************************************************/ - void TFT_ILI9341_ESP::setTextColor(uint16_t c) - { - // For 'transparent' background, we'll set the bg - // to the same as fg instead of using a flag - textcolor = textbgcolor = c; - } - - /*************************************************************************************** - ** Function name: setTextColor - ** Description: Set the font foreground and background colour - ***************************************************************************************/ - void TFT_ILI9341_ESP::setTextColor(uint16_t c, uint16_t b) - { - textcolor = c; - textbgcolor = b; - } - - /*************************************************************************************** - ** Function name: setTextWrap - ** Description: Define if text should wrap at end of line - ***************************************************************************************/ - void TFT_ILI9341_ESP::setTextWrap(boolean w) - { - textwrap = w; - } - - /*************************************************************************************** - ** Function name: setTextDatum - ** Description: Set the text position reference datum - ***************************************************************************************/ - void TFT_ILI9341_ESP::setTextDatum(uint8_t d) - { - textdatum = d; - } - - /*************************************************************************************** - ** Function name: setTextPadding - ** Description: Define padding width (aids erasing old text and numbers) - ***************************************************************************************/ - void TFT_ILI9341_ESP::setTextPadding(uint16_t x_width) - { - padX = x_width; - } - - /*************************************************************************************** - ** Function name: getRotation - ** Description: Return the rotation value (as used by setRotation()) - ***************************************************************************************/ - uint8_t TFT_ILI9341_ESP::getRotation(void) - { - return rotation; - } - - /*************************************************************************************** - ** Function name: width - ** Description: Return the pixel width of display (per current rotation) - ***************************************************************************************/ - // Return the size of the display (per current rotation) - int16_t TFT_ILI9341_ESP::width(void) - { - return _width; - } - - /*************************************************************************************** - ** Function name: height - ** Description: Return the pixel height of display (per current rotation) - ***************************************************************************************/ - int16_t TFT_ILI9341_ESP::height(void) - { - return _height; - } - - /*************************************************************************************** - ** Function name: textWidth - ** Description: Return the width in pixels of a string in a given font - ***************************************************************************************/ - int16_t TFT_ILI9341_ESP::textWidth(const char *string, int font) - { - unsigned int str_width = 0; - char uniCode; - char *widthtable; - - if (font>0 && font<9) - { - widthtable = (char *)pgm_read_dword( &(fontdata[font].widthtbl ) ) - 32; //subtract the 32 outside the loop - - while (*string) - { - uniCode = *(string++); - #ifdef LOAD_GLCD - if (font == 1) str_width += 6; - else - #endif - str_width += pgm_read_byte( widthtable + uniCode); // Normally we need to subract 32 from uniCode - } - } - return str_width * textsize; - } - - /*************************************************************************************** - ** Function name: fontsLoaded - ** Description: return an encoded 16 bit value showing the fonts loaded - ***************************************************************************************/ - // Returns a value showing which fonts are loaded (bit N set = Font N loaded) - - uint16_t TFT_ILI9341_ESP::fontsLoaded(void) - { - return fontsloaded; - } - - /*************************************************************************************** - ** Function name: fontHeight - ** Description: return the height of a font - ***************************************************************************************/ - int16_t TFT_ILI9341_ESP::fontHeight(int font) - { - return pgm_read_byte( &fontdata[font].height ) * textsize; - } - - /*************************************************************************************** - ** Function name: drawChar - ** Description: draw a single character in the Adafruit GLCD font - ***************************************************************************************/ - void TFT_ILI9341_ESP::drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size) - { - #ifdef LOAD_GLCD - if ((x >= (int16_t)_width) || // Clip right - (y >= (int16_t)_height) || // Clip bottom - ((x + 6 * size - 1) < 0) || // Clip left - ((y + 8 * size - 1) < 0)) // Clip top - return; - boolean fillbg = (bg != color); - - spi_begin(); - - if ((size==1) && fillbg) - { - byte column[6]; - byte mask = 0x1; - setAddrWindow(x, y, x+5, y+8); - for (int8_t i = 0; i < 5; i++ ) column[i] = pgm_read_byte(font + (c * 5) + i); - column[5] = 0; - - for (int8_t j = 0; j < 8; j++) { - for (int8_t k = 0; k < 5; k++ ) { - if (column[k] & mask) { - spiwrite(color >> 8); - spiwrite(color); - } - else { - spiwrite(bg >> 8); - spiwrite(bg); - } - } - - mask <<= 1; - spiwrite(bg >> 8); - spiwrite(bg); - } - } - else - { - for (int8_t i = 0; i < 6; i++ ) { - uint8_t line; - if (i == 5) - line = 0x0; - else - line = pgm_read_byte(font + (c * 5) + i); - - if (size == 1) // default size - { - for (int8_t j = 0; j < 8; j++) { - if (line & 0x1) drawPixel(x + i, y + j, color); - line >>= 1; - } - } - else { // big size - for (int8_t j = 0; j < 8; j++) { - if (line & 0x1) fillRect(x + (i * size), y + (j * size), size, size, color); - else if (fillbg) fillRect(x + i * size, y + j * size, size, size, bg); - line >>= 1; - } - } - } - } - spi_end(); - - #endif // LOAD_GLCD - } - - /*************************************************************************************** - ** Function name: setAddrWindow - ** Description: define an area to rexeive a stream of pixels - ***************************************************************************************/ - // Chip select is high at the end of this function - - void TFT_ILI9341_ESP::setWindow(int16_t x0, int16_t y0, int16_t x1, int16_t y1) - { - spi_begin(); - setAddrWindow(x0, y0, x1, y1); - spi_end(); - } - - /*************************************************************************************** - ** Function name: setAddrWindow - ** Description: define an area to receive a stream of pixels - ***************************************************************************************/ - // Chip select stays low, use setWindow() from sketches - - void TFT_ILI9341_ESP::setAddrWindow(int16_t x0, int16_t y0, int16_t x1, int16_t y1) - { - uint8_t buffC[] = { (uint8_t) (x0 >> 8), (uint8_t) x0, (uint8_t) (x1 >> 8), (uint8_t) x1 }; - uint8_t buffP[] = { (uint8_t) (y0 >> 8), (uint8_t) y0, (uint8_t) (y1 >> 8), (uint8_t) y1 }; - - spi_begin(); - - // Column addr set - *dcport &= ~dcpinmask; - - spiwrite(ILI9341_CASET); - - *dcport |= dcpinmask; - - _SPI->writePattern(&buffC[0], 4, 1); - - /* - spiwrite(x0 >> 8); - addr_col = 0xFFFF; - spiwrite(x0); - if(x1!=win_xe) { - spiwrite(x1 >> 8); - win_xe=x1; - spiwrite(x1); - } - */ - - // Row addr set - *dcport &= ~dcpinmask; - - spiwrite(ILI9341_PASET); - - *dcport |= dcpinmask; - - _SPI->writePattern(&buffP[0], 4, 1); - - /* - spiwrite(y0 >> 8); - addr_row = 0xFFFF; - spiwrite(y0); - if(y1!=win_ye) { - spiwrite(y1 >> 8); - win_ye=y1; - spiwrite(y1); - } - */ - - // write to RAM - *dcport &= ~dcpinmask; - spiwrite(ILI9341_RAMWR); - - //CS, HIGH; - //*csport |= cspinmask; - *dcport |= dcpinmask; - - spi_end(); - } - - /* - void TFT_ILI9341_ESP::setAddrWindow(int16_t x0, int16_t y0, int16_t x1, int16_t y1) - { - spi_begin(); - - // Column addr set - *dcport &= ~dcpinmask; - *csport &= ~cspinmask; - spiwrite(ILI9341_CASET); - - - *dcport |= dcpinmask; - spiwrite(x0 >> 8); - spiwrite(x0); - spiwrite(x1 >> 8); - spiwrite(x1); - - // Row addr set - *dcport &= ~dcpinmask; - spiwrite(ILI9341_PASET); - - *dcport |= dcpinmask; - spiwrite(y0 >> 8); - spiwrite(y0); - spiwrite(y1 >> 8); - spiwrite(y1); - - // write to RAM - *dcport &= ~dcpinmask; - spiwrite(ILI9341_RAMWR); - - //CS, HIGH; - //*csport |= cspinmask; - *dcport |= dcpinmask; - - spi_end(); - } - */ - /*************************************************************************************** - ** Function name: drawPixel - ** Description: push a single pixel at an arbitrary position - ***************************************************************************************/ - void TFT_ILI9341_ESP::drawPixel(uint16_t x, uint16_t y, uint16_t color) - { - // Faster range checking, possible because x and y are unsigned - if ((x >= _width) || (y >= _height)) return; - spi_begin(); - - if (addr_col != x) { - uint8_t buffC[] = { (uint8_t) (x >> 8), (uint8_t) x, (uint8_t) (x >> 8), (uint8_t) x }; - - *dcport &= ~dcpinmask; - spiwrite(ILI9341_CASET); - - addr_col = x; - *dcport |= dcpinmask; - - _SPI->writePattern(&buffC[0], 4, 1); - - //spiwrite(x >> 8); - //spiwrite(x); - - //spiwrite(x >> 8); - //spiwrite(x); - } - - if (addr_row != y) { - uint8_t buffP[] = { (uint8_t) (y >> 8), (uint8_t) y, (uint8_t) (y >> 8), (uint8_t) y }; - - *dcport &= ~dcpinmask; - spiwrite(ILI9341_PASET); - - addr_row = y; - *dcport |= dcpinmask; - - _SPI->writePattern(&buffP[0], 4, 1); - - //spiwrite(y >> 8); - //spiwrite(y); - - //spiwrite(y >> 8); - //spiwrite(y); - } - - *dcport &= ~dcpinmask; - - spiwrite(ILI9341_RAMWR); - - *dcport |= dcpinmask; - - spiwrite(color >> 8); - win_xe=x; - spiwrite(color); - win_ye=y; - - spi_end(); - } - - /* - void TFT_ILI9341_ESP::fastPixel(uint16_t x, uint16_t y, uint16_t color) - { - // Faster range checking, possible because x and y are unsigned - if ((x >= _width) || (y >= _height)) return; - spi_begin(); - - *csport &= ~cspinmask; - - if (addr_col != x) { - *dcport &= ~dcpinmask; - spiwrite(ILI9341_CASET); - - addr_col = x; - *dcport |= dcpinmask; - - spiwrite(x >> 8); - spiwrite(x); - } - - if (addr_row != y) { - *dcport &= ~dcpinmask; - spiwrite(ILI9341_PASET); - - addr_row = y; - *dcport |= dcpinmask; - - spiwrite(y >> 8); - spiwrite(y); - } - - *dcport &= ~dcpinmask; - - spiwrite(ILI9341_RAMWR); - - *dcport |= dcpinmask; - - spiwrite(color >> 8); - spiwrite(color); - - *csport |= cspinmask; - - spi_end(); - } - */ - - /* - void TFT_ILI9341_ESP::fastSetup(void) - { - spi_begin(); - - *dcport &= ~dcpinmask; - *csport &= ~cspinmask; - - spiwrite(ILI9341_CASET); - - *dcport |= dcpinmask; - spiwrite(0); - addr_col = 0; - spiwrite(0); - win_xe=_width-1; - spiwrite(win_xe >> 8); - spiwrite(win_xe); - - *dcport &= ~dcpinmask; - - spiwrite(ILI9341_PASET); - - *dcport |= dcpinmask; - spiwrite(0); - addr_row = 0; - spiwrite(0); - win_ye=_height-1; - spiwrite(win_ye >> 8); - spiwrite(win_ye); - - *csport |= cspinmask; - - spi_end(); - } - */ - - /* - void TFT_ILI9341_ESP::drawPixel(uint16_t x, uint16_t y, uint16_t color) - { - // Faster range checking, possible because x and y are unsigned - if ((x >= _width) || (y >= _height)) return; - spi_begin(); - - // Column addr set - *dcport &= ~dcpinmask; - *csport &= ~cspinmask; - spiwrite(ILI9341_CASET); - - - *dcport |= dcpinmask; - spiwrite(x >> 8); - spiwrite(x; x++); - spiwrite(x >> 8); - spiwrite(x); - - // Row addr set - *dcport &= ~dcpinmask; - //*csport &= ~cspinmask; - spiwrite(ILI9341_PASET); - - *dcport |= dcpinmask; - spiwrite(y >> 8); - spiwrite(y; y++); - spiwrite(y >> 8); - spiwrite(y); - - // write to RAM - *dcport &= ~dcpinmask; - spiwrite(ILI9341_RAMWR); - - *dcport |= dcpinmask; - - spiwrite(color >> 8); - spiwrite(color); - - //CS, HIGH; - *csport |= cspinmask; - //*dcport |= dcpinmask; - - spi_end(); - } - */ - - /*************************************************************************************** - ** Function name: pushColor - ** Description: push a single pixel - ***************************************************************************************/ - void TFT_ILI9341_ESP::pushColor(uint16_t color) - { - spi_begin(); - - spiwrite(color>>8); - spiwrite(color); - - spi_end(); - } - - /*************************************************************************************** - ** Function name: pushColor - ** Description: push a single colour to "len" pixels - ***************************************************************************************/ - void TFT_ILI9341_ESP::pushColor(uint16_t color, uint16_t len) - { - spi_begin(); - - uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color }; - while(len>32) { _SPI->writePattern(&colorBin[0], 2, 32); len-=32;} - _SPI->writePattern(&colorBin[0], 2, len); - - spi_end(); - } - - /*************************************************************************************** - ** Function name: pushColors - ** Description: push an aray of pixels for BMP image drawing - ***************************************************************************************/ - // Sends an array of 16-bit color values to the TFT; used - // externally by BMP examples. Assumes that setWindow() has - // previously been called to define the bounds. Max 255 pixels at - // a time (BMP examples read in small chunks due to limited RAM). - - void TFT_ILI9341_ESP::pushColors(uint16_t *data, uint8_t len) - { - uint16_t color; - spi_begin(); - - while (len--) { - color = *(data++); - spiwrite(color >> 8); - spiwrite(color); - } +#include "TFT_ILI9341_ESP.h" + +#include + +#include +#include "pins_arduino.h" +#include "wiring_private.h" +#include + +// If the SPI library has transaction support, these functions +// establish settings and protect from interference from other +// libraries. Otherwise, they simply do nothing. + +inline void TFT_ILI9341_ESP::spi_begin(void){ +#ifdef SPI_HAS_TRANSACTION + #ifdef SUPPORT_TRANSACTIONS + _SPI->beginTransaction(SPISettings(SPI_FREQUENCY, MSBFIRST, SPI_MODE0)); + #endif +#endif +} + +inline void TFT_ILI9341_ESP::spi_end(void){ +#ifdef SPI_HAS_TRANSACTION + #ifdef SUPPORT_TRANSACTIONS + _SPI->endTransaction(); + #endif +#endif +} + +/*************************************************************************************** +** Function name: TFT_ILI9341_ESP +** Description: Constructor , we must use hardware SPI pins +***************************************************************************************/ +TFT_ILI9341_ESP::TFT_ILI9341_ESP(int16_t w, int16_t h) +{ + + _SPI = &SPI; // Initialise class pointer - spi_end(); - } - - /*************************************************************************************** - ** Function name: pushColors - ** Description: push an aray of pixels for 16 bit raw image drawing - ***************************************************************************************/ - // Assumed that setWindow() has previously been called - - void TFT_ILI9341_ESP::pushColors(uint8_t *data, uint16_t len) - { - spi_begin(); - len = len<<1; + _cs = TFT_CS; + _dc = TFT_DC; + _rst = TFT_RST; + + hwSPI = true; + _mosi = _sclk = 0; + + + if (TFT_RST >= 0) { + digitalWrite(TFT_RST, LOW); + pinMode(TFT_RST, OUTPUT); + } + + digitalWrite(TFT_DC, HIGH); + pinMode(TFT_DC, OUTPUT); + + digitalWrite(TFT_CS, HIGH); + pinMode(TFT_CS, OUTPUT); + + _width = w; + _height = h; + rotation = 0; + cursor_y = cursor_x = 0; + textfont = 1; + textsize = 1; + textcolor = 0xFFFF; + textbgcolor = 0x0000; + padX = 0; + textwrap = true; + textdatum = 0; // Left text alignment is default + fontsloaded = 0; + + addr_row = 0xFFFF; + addr_col = 0xFFFF; + +#ifdef LOAD_GLCD + fontsloaded = 0x0002; // Bit 1 set +#endif + +#ifdef LOAD_FONT2 + fontsloaded |= 0x0004; // Bit 2 set +#endif + +#ifdef LOAD_FONT4 + fontsloaded |= 0x0010; // Bit 4 set +#endif + +#ifdef LOAD_FONT6 + fontsloaded |= 0x0040; // Bit 6 set +#endif + +#ifdef LOAD_FONT7 + fontsloaded |= 0x0080; // Bit 7 set +#endif + +#ifdef LOAD_FONT8 + fontsloaded |= 0x0100; // Bit 8 set +#endif + +} + +/*************************************************************************************** +** Function name: spiwrite +** Description: Write 8 bits to SPI port +***************************************************************************************/ +void TFT_ILI9341_ESP::spiwrite(uint8_t c) +{ + _SPI->transfer(c); +} + +/*************************************************************************************** +** Function name: writecommand +** Description: Send an 8 bit command to the TFT +***************************************************************************************/ +void TFT_ILI9341_ESP::writecommand(uint8_t c) +{ + DC_C; + CS_L; + _SPI->transfer(c); + CS_H; + DC_D; +} + +/*************************************************************************************** +** Function name: writedata +** Description: Send a 8 bit data value to the TFT +***************************************************************************************/ +void TFT_ILI9341_ESP::writedata(uint8_t c) +{ + CS_L; + _SPI->transfer(c); + CS_H; +} + +/*************************************************************************************** +** Function name: read pixel (for SPI Interface II i.e. IM [3:0] = "1101") +** Description: Read 565 pixel colours from a pixel +***************************************************************************************/ +uint16_t TFT_ILI9341_ESP::readPixel(int32_t x0, int32_t y0) +{ + spi_begin(); + + setAddrWindow(x0, y0, x0, y0); // Sets CS low, don't care it sent RAMWR + + DC_C; + _SPI->transfer(ILI9341_RAMRD); // Read CGRAM command + DC_D; + + // Dummy read to throw away don't care value + _SPI->transfer(0); + + // Read window pixel 24 bit RGB values + uint8_t r = _SPI->transfer(0); + uint8_t g = _SPI->transfer(0); + uint8_t b = _SPI->transfer(0); + + CS_H; + + spi_end(); + + return color565(r, g, b); +} + +/*************************************************************************************** +** Function name: read rectangle (for SPI Interface II i.e. IM [3:0] = "1101") +** Description: Read 565 pixel colours from a defined area +***************************************************************************************/ + void TFT_ILI9341_ESP::readRect(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h, uint16_t *data) +{ + spi_begin(); + + setAddrWindow(x0, y0, x0 + w - 1, y0 + h - 1); // Sets CS low, don't care it sent RAMWR + + DC_C; + _SPI->transfer(ILI9341_RAMRD); // Read CGRAM command + DC_D; + + // Dummy read to throw away don't care value + _SPI->transfer(0); + + // Read window pixel 24 bit RGB values + uint32_t len = w * h; + while (len--) { + uint8_t r = _SPI->transfer(0); + uint8_t g = _SPI->transfer(0); + uint8_t b = _SPI->transfer(0); + // Swapped colour byte order for compatibility with pushRect() + *data++ = (r & 0xF8) | (g & 0xE0) >> 5 | (b & 0xF8) << 5 | (g & 0x1C) << 11; + yield(); + } + + // Write NOP command to stop read mode + //DC_C; + //_SPI->transfer(ILI9341_NOP); + //DC_D; + + CS_H; + + spi_end(); +} + +/*************************************************************************************** +** Function name: push rectangle (for SPI Interface II i.e. IM [3:0] = "1101") +** Description: push 565 pixel colours into a defined area +***************************************************************************************/ + void TFT_ILI9341_ESP::pushRect(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h, uint16_t *data) +{ + spi_begin(); + + setAddrWindow(x0, y0, x0 + w - 1, y0 + h - 1); // Sets CS low and sent RAMWR + + uint32_t len = w * h * 2; + // Push pixels into window rectangle, data is a 16 bit pointer thus increment is halved + while ( len >=32 ) {_SPI->writeBytes((uint8_t*)data, 32); data += 16; len -= 32; } + if (len) _SPI->writeBytes((uint8_t*)data, len); + + CS_H; + + spi_end(); +} + +/*************************************************************************************** +** Function name: read rectangle (for SPI Interface II i.e. IM [3:0] = "1101") +** Description: Read RGB pixel colours from a defined area +***************************************************************************************/ + void TFT_ILI9341_ESP::readRectRGB(int32_t x0, int32_t y0, int32_t w, int32_t h, uint8_t *data) +{ + spi_begin(); + + setAddrWindow(x0, y0, x0 + w - 1, y0 + h - 1); // Sets CS low,, don't care it sent RAMWR + + DC_C; + _SPI->transfer(ILI9341_RAMRD); // Read CGRAM command + DC_D; + + // Dummy read to throw away don't care value + _SPI->transfer(0); + + // Read window pixel 24 bit RGB values, buffer must be set in sketch to 3 * w * h + uint32_t len = w * h; + while (len--) { + *data++ = _SPI->transfer(0); + *data++ = _SPI->transfer(0); + *data++ = _SPI->transfer(0); + } + CS_H; + + spi_end(); +} + +/*************************************************************************************** +** Function name: readcommand8 (for SPI Interface II i.e. IM [3:0] = "1101") +** Description: Read a 8 bit data value from an indexed command register +***************************************************************************************/ + uint8_t TFT_ILI9341_ESP::readcommand8(uint8_t cmd_function, uint8_t index) +{ + spi_begin(); + index = 0x10 + (index & 0x0F); + + DC_C; + CS_L; + _SPI->transfer(0xD9); + DC_D; + _SPI->transfer(index); + CS_H; + + DC_C; + CS_L; + _SPI->transfer(cmd_function); + DC_D; + uint8_t reg = _SPI->transfer(0); + CS_H; + + spi_end(); + return reg; +} + +/*************************************************************************************** +** Function name: readcommand16 (for SPI Interface II i.e. IM [3:0] = "1101") +** Description: Read a 16 bit data value from an indexed command register +***************************************************************************************/ + uint16_t TFT_ILI9341_ESP::readcommand16(uint8_t cmd_function, uint8_t index) +{ + uint32_t reg = 0; + reg |= (readcommand8(cmd_function, index + 0) << 8); + reg |= (readcommand8(cmd_function, index + 1) << 0); + + return reg; +} + +/*************************************************************************************** +** Function name: readcommand32 (for SPI Interface II i.e. IM [3:0] = "1101") +** Description: Read a 32 bit data value from an indexed command register +***************************************************************************************/ + uint32_t TFT_ILI9341_ESP::readcommand32(uint8_t cmd_function, uint8_t index) +{ + uint32_t reg; + + reg = (readcommand8(cmd_function, index + 0) << 24); + reg |= (readcommand8(cmd_function, index + 1) << 16); + reg |= (readcommand8(cmd_function, index + 2) << 8); + reg |= (readcommand8(cmd_function, index + 3) << 0); + + return reg; +} + +/*************************************************************************************** +** Function name: begin +** Description: Included for backwards compatibility +***************************************************************************************/ +void TFT_ILI9341_ESP::begin(void) +{ + init(); +} + +/*************************************************************************************** +** Function name: init +** Description: Reset, then initialise the TFT display registers +***************************************************************************************/ +void TFT_ILI9341_ESP::init(void) +{ + csport = portOutputRegister(digitalPinToPort(_cs)); + cspinmask = (uint32_t) digitalPinToBitMask(_cs); + dcport = portOutputRegister(digitalPinToPort(_dc)); + dcpinmask = (uint32_t) digitalPinToBitMask(_dc); + + _SPI->begin(); // This will set MISO to input + +#ifndef SUPPORT_TRANSACTIONS + _SPI->setBitOrder(MSBFIRST); + _SPI->setDataMode(SPI_MODE0); + _SPI->setFrequency(SPI_FREQUENCY); +#endif + + // SPI1U1 |= SPIUSIO; // Single I/O pin on MOSI (bi-directional) - not tested + + // toggle RST low to reset + if (TFT_RST >= 0) { + digitalWrite(TFT_RST, HIGH); + delay(5); + digitalWrite(TFT_RST, LOW); + delay(20); + digitalWrite(TFT_RST, HIGH); + delay(150); + } + + + spi_begin(); + writecommand(0x01); // Software reset + spi_end(); - while (len--) spiwrite(*(data++)); + delay(5); // Wait for software reset to complete + + spi_begin(); - spi_end(); - } - - /*************************************************************************************** - ** Function name: drawLine - ** Description: draw a line between 2 arbitrary points - ***************************************************************************************/ - - // Bresenham's algorithm - thx wikipedia - speed enhanced by Bodmer to use - // an eficient FastH/V Line draw routine for line segments of 2 pixels or more - - void TFT_ILI9341_ESP::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color) - { - boolean steep = abs(y1 - y0) > abs(x1 - x0); - if (steep) { - swap(x0, y0); - swap(x1, y1); - } - - if (x0 > x1) { - swap(x0, x1); - swap(y0, y1); - } - - int16_t dx = x1 - x0, dy = abs(y1 - y0);; - - - int16_t err = dx >> 1, ystep = -1, xs = x0, dlen = 0; - if (y0 < y1) ystep = 1; - - // Split into steep and not steep for FastH/V separation - if (steep) { - for (; x0 <= x1; x0++) { - dlen++; - err -= dy; - if (err < 0) { - err += dx; - if (dlen == 1) drawPixel(y0, xs, color); - else drawFastVLine(y0, xs, dlen, color); - dlen = 0; y0 += ystep; xs = x0 + 1; - } - } - if (dlen) drawFastVLine(y0, xs, dlen, color); - } - else - { - for (; x0 <= x1; x0++) { - dlen++; - err -= dy; - if (err < 0) { - err += dx; - if (dlen == 1) drawPixel(xs, y0, color); - else drawFastHLine(xs, y0, dlen, color); - dlen = 0; y0 += ystep; xs = x0 + 1; - } - } - if (dlen) drawFastHLine(xs, y0, dlen, color); - } - } - - /*************************************************************************************** - ** Function name: drawFastVLine - ** Description: draw a vertical line - ***************************************************************************************/ - void TFT_ILI9341_ESP::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) - { - // Rudimentary clipping - if ((x >= _width) || (y >= _height)) return; - if ((y + h - 1) >= _height) h = _height - y; - - spi_begin(); - - setAddrWindow(x, y, x, y + h - 1); - - uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color }; - //while(h>32) { _SPI->writePattern(&colorBin[0], 2, 32); h-=32;} - _SPI->writePattern(&colorBin[0], 2, h); - - spi_end(); - } - - /*************************************************************************************** - ** Function name: drawFastHLine - ** Description: draw a horizontal line - ***************************************************************************************/ - void TFT_ILI9341_ESP::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) - { - // Rudimentary clipping - if ((x >= _width) || (y >= _height)) return; - if ((x + w - 1) >= _width) w = _width - x; - - spi_begin(); - - setAddrWindow(x, y, x + w - 1, y); - - uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color }; - //while(w>32) { _SPI->writePattern(&colorBin[0], 2, 32); w-=32;} - _SPI->writePattern(&colorBin[0], 2, w); - - spi_end(); - } - - /*************************************************************************************** - ** Function name: fillRect - ** Description: draw a filled rectangle - ***************************************************************************************/ - void TFT_ILI9341_ESP::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) - { - // rudimentary clipping (drawChar w/big text requires this) - if ((x > _width) || (y > _height) || (w==0) || (h==0)) return; - if ((x + w - 1) > _width) w = _width - x; - if ((y + h - 1) > _height) h = _height - y; - - spi_begin(); - setAddrWindow(x, y, x + w - 1, y + h - 1); - - uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color }; - uint32_t n = (uint32_t)w * (uint32_t)h; - //while(n>32) { _SPI->writePattern(&colorBin[0], 2, 32); n-=32;} - _SPI->writePattern(&colorBin[0], 2, n); - - spi_end(); - } - - /*************************************************************************************** - ** Function name: color565 - ** Description: convert three 8 bit RGB levels to a 16 bit colour value - ***************************************************************************************/ - uint16_t TFT_ILI9341_ESP::color565(uint8_t r, uint8_t g, uint8_t b) - { - return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); - } - - /*************************************************************************************** - ** Function name: setRotation - ** Description: rotate the screen orientation m = 0-3 or 4-7 for BMP drawing - ***************************************************************************************/ - void TFT_ILI9341_ESP::setRotation(uint8_t m) - { - rotation = m % 8; - spi_begin(); - writecommand(ILI9341_MADCTL); - switch (rotation) { - case 0: - writedata(ILI9341_MADCTL_MX | ILI9341_MADCTL_BGR); - _width = ILI9341_TFTWIDTH; - _height = ILI9341_TFTHEIGHT; - break; - case 1: - writedata(ILI9341_MADCTL_MV | ILI9341_MADCTL_BGR); - _width = ILI9341_TFTHEIGHT; - _height = ILI9341_TFTWIDTH; - break; - case 2: - writedata(ILI9341_MADCTL_MY | ILI9341_MADCTL_BGR); - _width = ILI9341_TFTWIDTH; - _height = ILI9341_TFTHEIGHT; - break; - case 3: - writedata(ILI9341_MADCTL_MX | ILI9341_MADCTL_MY | ILI9341_MADCTL_MV | ILI9341_MADCTL_BGR); - _width = ILI9341_TFTHEIGHT; - _height = ILI9341_TFTWIDTH; - break; - // These next rotations are for bottum up BMP drawing - case 4: - writedata(ILI9341_MADCTL_MX | ILI9341_MADCTL_MY | ILI9341_MADCTL_BGR); - _width = ILI9341_TFTWIDTH; - _height = ILI9341_TFTHEIGHT; - break; - case 5: - writedata(ILI9341_MADCTL_MV | ILI9341_MADCTL_MX | ILI9341_MADCTL_BGR); - _width = ILI9341_TFTHEIGHT; - _height = ILI9341_TFTWIDTH; - break; - case 6: - writedata(ILI9341_MADCTL_BGR); - _width = ILI9341_TFTWIDTH; - _height = ILI9341_TFTHEIGHT; - break; - case 7: - writedata(ILI9341_MADCTL_MY | ILI9341_MADCTL_MV | ILI9341_MADCTL_BGR); - _width = ILI9341_TFTHEIGHT; - _height = ILI9341_TFTWIDTH; - break; - - } - spi_end(); - //fastSetup(); // Just incase setRotation is called inside a fast pixel loop - addr_row = 0xFFFF; - addr_col = 0xFFFF; - win_xe = 0xFFFF; - win_ye = 0xFFFF; - - } - - /*************************************************************************************** - ** Function name: invertDisplay - ** Description: invert the display colours i = 1 invert, i = 0 normal - ***************************************************************************************/ - void TFT_ILI9341_ESP::invertDisplay(boolean i) - { - spi_begin(); - // Send the command twice as otherwise it does not always work! - writecommand(i ? ILI9341_INVON : ILI9341_INVOFF); - writecommand(i ? ILI9341_INVON : ILI9341_INVOFF); - spi_end(); - } - - /*************************************************************************************** - ** Function name: write - ** Description: draw characters piped through serial stream - ***************************************************************************************/ - size_t TFT_ILI9341_ESP::write(uint8_t uniCode) - { - if (uniCode == '\r') return 1; - unsigned int width = 0; - unsigned int height = 0; - //Serial.print((char) uniCode); // Debug line sends all printed TFT text to serial port - - #ifdef LOAD_FONT2 - if (textfont == 2) - { - // This is 20us faster than using the fontdata structure (0.443ms per character instead of 0.465ms) - width = pgm_read_byte(widtbl_f16 + uniCode-32); - height = chr_hgt_f16; - // Font 2 is rendered in whole byte widths so we must allow for this - width = (width + 6) / 8; // Width in whole bytes for font 2, should be + 7 but must allow for font width change - width = width * 8; // Width converted back to pixles - } - #ifdef LOAD_RLE - else - #endif - #endif - - #ifdef LOAD_RLE - { - if ((textfont>2) && (textfont<9)) - { - // Uses the fontinfo struct array to avoid lots of 'if' or 'switch' statements - // A tad slower than above but this is not significant and is more convenient for the RLE fonts - // Yes, this code can be needlessly executed when textfont == 1... - width = pgm_read_byte( pgm_read_dword( &(fontdata[textfont].widthtbl ) ) + uniCode-32 ); - height= pgm_read_byte( &fontdata[textfont].height ); - } - } - #endif - - #ifdef LOAD_GLCD - if (textfont==1) - { - width = 6; - height = 8; - } - #else - if (textfont==1) return 0; - #endif - - height = height * textsize; - - if (uniCode == '\n') { - cursor_y += height; - cursor_x = 0; - } - else - { - if (textwrap && (cursor_x + width * textsize >= _width)) - { - cursor_y += height; - cursor_x = 0; - } - cursor_x += drawChar(uniCode, cursor_x, cursor_y, textfont); - } - return 1; - } - - /*************************************************************************************** - ** Function name: drawChar - ** Description: draw a unicode onto the screen - ***************************************************************************************/ - int16_t TFT_ILI9341_ESP::drawChar(unsigned int uniCode, int x, int y, int font) - { - - if (font==1) - { - #ifdef LOAD_GLCD - drawChar(x, y, uniCode, textcolor, textbgcolor, textsize); - return 6 * textsize; - #else - return 0; - #endif - } - - int width = 0; - int height = 0; - uint32_t flash_address = 0; // 16 bit address OK for Arduino if font files <60K - uniCode -= 32; - - #ifdef LOAD_FONT2 - if (font == 2) - { - // This is 20us faster than using the fontdata structure (0.413ms per character instead of 0.433ms) - flash_address = pgm_read_dword(&chrtbl_f16[uniCode]); - width = pgm_read_byte(widtbl_f16 + uniCode); - height = chr_hgt_f16; - } - #ifdef LOAD_RLE - else - #endif - #endif - - #ifdef LOAD_RLE - { - if ((font>2) && (font<9)) - { - // This is slower than above but is more convenient for the RLE fonts - flash_address = pgm_read_dword( pgm_read_dword( &(fontdata[font].chartbl ) ) + uniCode*sizeof(void *) ); - width = pgm_read_byte( pgm_read_dword( &(fontdata[font].widthtbl ) ) + uniCode ); - height= pgm_read_byte( &fontdata[font].height ); - } - } - #endif - - int w = width; - int pX = 0; - int pY = y; - byte line = 0; - - byte tl = textcolor; - byte th = textcolor >> 8; - byte bl = textbgcolor; - byte bh = textbgcolor >> 8; - - #ifdef LOAD_FONT2 // chop out 962 bytes of code if we do not need it - if (font == 2) { - w = w + 6; // Should be + 7 but we need to compensate for width increment - w = w / 8; - if (x + width * textsize >= (int16_t)_width) return width * textsize ; - - if (textcolor == textbgcolor || textsize != 1) { - - for (int i = 0; i < height; i++) - { - if (textcolor != textbgcolor) fillRect(x, pY, width * textsize, textsize, textbgcolor); - - for (int k = 0; k < w; k++) - { - line = pgm_read_byte(flash_address + w * i + k); - if (line) { - if (textsize == 1) { - pX = x + k * 8; - if (line & 0x80) drawPixel(pX, pY, textcolor); - if (line & 0x40) drawPixel(pX + 1, pY, textcolor); - if (line & 0x20) drawPixel(pX + 2, pY, textcolor); - if (line & 0x10) drawPixel(pX + 3, pY, textcolor); - if (line & 0x08) drawPixel(pX + 4, pY, textcolor); - if (line & 0x04) drawPixel(pX + 5, pY, textcolor); - if (line & 0x02) drawPixel(pX + 6, pY, textcolor); - if (line & 0x01) drawPixel(pX + 7, pY, textcolor); - } - else { - pX = x + k * 8 * textsize; - if (line & 0x80) fillRect(pX, pY, textsize, textsize, textcolor); - if (line & 0x40) fillRect(pX + textsize, pY, textsize, textsize, textcolor); - if (line & 0x20) fillRect(pX + 2 * textsize, pY, textsize, textsize, textcolor); - if (line & 0x10) fillRect(pX + 3 * textsize, pY, textsize, textsize, textcolor); - if (line & 0x08) fillRect(pX + 4 * textsize, pY, textsize, textsize, textcolor); - if (line & 0x04) fillRect(pX + 5 * textsize, pY, textsize, textsize, textcolor); - if (line & 0x02) fillRect(pX + 6 * textsize, pY, textsize, textsize, textcolor); - if (line & 0x01) fillRect(pX + 7 * textsize, pY, textsize, textsize, textcolor); - } - } - } - pY += textsize; - } - } - else - // Faster drawing of characters and background using block write - { - spi_begin(); - setAddrWindow(x, y, (x + w * 8) - 1, y + height - 1); - - byte mask; - for (int i = 0; i < height; i++) - { - for (int k = 0; k < w; k++) - { - line = pgm_read_byte(flash_address + w * i + k); - pX = x + k * 8; - mask = 0x80; - while (mask) { - if (line & mask) { - spiwrite(th); - spiwrite(tl); - } - else { - spiwrite(bh); - spiwrite(bl); - } - mask = mask >> 1; - } - } - pY += textsize; - } - - spi_end(); - } - } - - #ifdef LOAD_RLE - else - #endif - #endif //FONT2 - - #ifdef LOAD_RLE //674 bytes of code - // Font is not 2 and hence is RLE encoded - { - spi_begin(); - - w *= height; // Now w is total number of pixels in the character - if ((textsize != 1) || (textcolor == textbgcolor)) { - if (textcolor != textbgcolor) fillRect(x, pY, width * textsize, textsize * height, textbgcolor); - int px = 0, py = pY; // To hold character block start and end column and row values - int pc = 0; // Pixel count - byte np = textsize * textsize; // Number of pixels in a drawn pixel - - byte tnp = 0; // Temporary copy of np for while loop - byte ts = textsize - 1; // Temporary copy of textsize - // 16 bit pixel count so maximum font size is equivalent to 180x180 pixels in area - // w is total number of pixels to plot to fill character block - while (pc < w) - { - line = pgm_read_byte(flash_address); - flash_address++; // 20 bytes smaller by incrementing here - if (line & 0x80) { - line &= 0x7F; - line++; - if (ts) { - px = x + textsize * (pc % width); // Keep these px and py calculations outside the loop as they are slow - py = y + textsize * (pc / width); - } - else { - px = x + pc % width; // Keep these px and py calculations outside the loop as they are slow - py = y + pc / width; - } - while (line--) { // In this case the while(line--) is faster - pc++; // This is faster than putting pc+=line before while()? - setAddrWindow(px, py, px + ts, py + ts); - - if (ts) { - tnp = np; - while (tnp--) { - spiwrite(th); - spiwrite(tl); - } - } - else { - spiwrite(th); - spiwrite(tl); - } - px += textsize; - - if (px >= (x + width * textsize)) - { - px = x; - py += textsize; - } - } - } - else { - line++; - pc += line; - } - } - - spi_end(); - } - else // Text colour != background && textsize = 1 - // so use faster drawing of characters and background using block write - { - spi_begin(); - setAddrWindow(x, y, x + width - 1, y + height - 1); - - uint8_t textcolorBin[] = { (uint8_t) (textcolor >> 8), (uint8_t) textcolor }; - uint8_t textbgcolorBin[] = { (uint8_t) (textbgcolor >> 8), (uint8_t) textbgcolor }; - - // Maximum font size is equivalent to 180x180 pixels in area - while (w > 0) - { - line = pgm_read_byte(flash_address++); // 8 bytes smaller when incrementing here - if (line & 0x80) { - line &= 0x7F; - line++; w -= line; - while(line>32) { _SPI->writePattern(&textcolorBin[0], 2, 32); line-=32;} - _SPI->writePattern(&textcolorBin[0], 2, line); - } - else { - line++; w -= line; - while(line>32) { _SPI->writePattern(&textbgcolorBin[0], 2, 32); line-=32;} - _SPI->writePattern(&textbgcolorBin[0], 2, line); - } - } - spi_end(); - } - } - // End of RLE font rendering - #endif - return width * textsize; // x + - } - - /*************************************************************************************** - ** Function name: drawString - ** Description : draw string with padding if it is defined - ***************************************************************************************/ - int16_t TFT_ILI9341_ESP::drawString(const char *string, int poX, int poY, int font) - { - int16_t sumX = 0; - uint8_t padding = 1; - unsigned int cheight = 0; - - if (textdatum || padX) - { - // Find the pixel width of the string in the font - unsigned int cwidth = textWidth(string, font); - - // Get the pixel height of the font - cheight = pgm_read_byte( &fontdata[font].height ) * textsize; - - switch(textdatum) { - case TC_DATUM: - poX -= cwidth/2; - padding = 2; - break; - case TR_DATUM: - poX -= cwidth; - padding = 3; - break; - case ML_DATUM: - poY -= cheight/2; - padding = 1; - break; - case MC_DATUM: - poX -= cwidth/2; - poY -= cheight/2; - padding = 2; - break; - case MR_DATUM: - poX -= cwidth; - poY -= cheight/2; - padding = 3; - break; - case BL_DATUM: - poY -= cheight; - padding = 1; - break; - case BC_DATUM: - poX -= cwidth/2; - poY -= cheight; - padding = 2; - break; - case BR_DATUM: - poX -= cwidth; - poY -= cheight; - padding = 3; - break; - } - // Check coordinates are OK, adjust if not - if (poX < 0) poX = 0; - if (poX+cwidth>_width) poX = _width - cwidth; - if (poY < 0) poY = 0; - if (poY+cheight>_height) poY = _height - cheight; - } - - while (*string) sumX += drawChar(*(string++), poX+sumX, poY, font); - - //#define PADDING_DEBUG - - #ifndef PADDING_DEBUG - if((padX>sumX) && (textcolor!=textbgcolor)) - { - int padXc = poX+sumX; // Maximum left side padding - switch(padding) { - case 1: - fillRect(padXc,poY,padX-sumX,cheight, textbgcolor); - break; - case 2: - fillRect(padXc,poY,(padX-sumX)>>1,cheight, textbgcolor); - padXc = (padX-sumX)>>1; - if (padXc>poX) padXc = poX; - fillRect(poX - padXc,poY,(padX-sumX)>>1,cheight, textbgcolor); - break; - case 3: - if (padXc>padX) padXc = padX; - fillRect(poX + sumX - padXc,poY,padXc-sumX,cheight, textbgcolor); - break; - } - } - #else - - // This is debug code to show text (green box) and blanked (white box) areas - // to show that the padding areas are being correctly sized and positioned - if((padX>sumX) && (textcolor!=textbgcolor)) - { - int padXc = poX+sumX; // Maximum left side padding - drawRect(poX,poY,sumX,cheight, TFT_GREEN); - switch(padding) { - case 1: - drawRect(padXc,poY,padX-sumX,cheight, TFT_WHITE); - break; - case 2: - drawRect(padXc,poY,(padX-sumX)>>1, cheight, TFT_WHITE); - padXc = (padX-sumX)>>1; - if (padXc>poX) padXc = poX; - drawRect(poX - padXc,poY,(padX-sumX)>>1,cheight, TFT_WHITE); - break; - case 3: - if (padXc>padX) padXc = padX; - drawRect(poX + sumX - padXc,poY,padXc-sumX,cheight, TFT_WHITE); - break; - } - } - #endif - - return sumX; - } - - /*************************************************************************************** - ** Function name: drawCentreString - ** Descriptions: draw string centred on dX - ***************************************************************************************/ - int16_t TFT_ILI9341_ESP::drawCentreString(const char *string, int dX, int poY, int font) - { - byte tempdatum = textdatum; - int sumX = 0; - textdatum = TC_DATUM; - sumX = drawString(string, dX, poY, font); - textdatum = tempdatum; - return sumX; - } - - /*************************************************************************************** - ** Function name: drawRightString - ** Descriptions: draw string right justified to dX - ***************************************************************************************/ - int16_t TFT_ILI9341_ESP::drawRightString(const char *string, int dX, int poY, int font) - { - byte tempdatum = textdatum; - int sumX = 0; - textdatum = TR_DATUM; - sumX = drawString(string, dX, poY, font); - textdatum = tempdatum; - return sumX; - } - - /*************************************************************************************** - ** Function name: drawNumber - ** Description: draw a long integer - ***************************************************************************************/ - int16_t TFT_ILI9341_ESP::drawNumber(long long_num, int poX, int poY, int font) - { - char str[12]; - ltoa(long_num, str, 10); - return drawString(str, poX, poY, font); - } - - /*************************************************************************************** - ** Function name: drawFloat - ** Descriptions: drawFloat, prints 7 non zero digits maximum - ***************************************************************************************/ - // Adapted to assemble and print a string, this permits alignment relative to a datum - // looks complicated but much more compact and actually faster than using print class - int16_t TFT_ILI9341_ESP::drawFloat(float floatNumber, int dp, int poX, int poY, int font) - { - char str[14]; // Array to contain decimal string - uint8_t ptr = 0; // Initialise pointer for array - int8_t digits = 1; // Count the digits to avoid array overflow - float rounding = 0.5; // Round up down delta - - if (dp > 7) dp = 7; // Limit the size of decimal portion - - // Adjust the rounding value - for (uint8_t i = 0; i < dp; ++i) rounding /= 10.0; - - if (floatNumber < -rounding) // add sign, avoid adding - sign to 0.0! - { - str[ptr++] = '-'; // Negative number - str[ptr] = 0; // Put a null in the array as a precaution - digits = 0; // Set digits to 0 to compensate so pointer value can be used later - floatNumber = -floatNumber; // Make positive - } - - floatNumber += rounding; // Round up or down - - // For error put ... in string and return (all TFT_ILI9341_ESP library fonts contain . character) - if (floatNumber >= 2147483647) { - strcpy(str, "..."); - return drawString(str, poX, poY, font); - } - // No chance of overflow from here on - - // Get integer part - unsigned long temp = (unsigned long)floatNumber; - - // Put integer part into array - ltoa(temp, str + ptr, 10); - - // Find out where the null is to get the digit count loaded - while ((uint8_t)str[ptr] != 0) ptr++; // Move the pointer along - digits += ptr; // Count the digits - - str[ptr++] = '.'; // Add decimal point - str[ptr] = '0'; // Add a dummy zero - str[ptr + 1] = 0; // Add a null but don't increment pointer so it can be overwritten - - // Get the decimal portion - floatNumber = floatNumber - temp; - - // Get decimal digits one by one and put in array - // Limit digit count so we don't get a false sense of resolution - uint8_t i = 0; - while ((i < dp) && (digits < 9)) // while (i < dp) for no limit but array size must be increased - { - i++; - floatNumber *= 10; // for the next decimal - temp = floatNumber; // get the decimal - ltoa(temp, str + ptr, 10); - ptr++; digits++; // Increment pointer and digits count - floatNumber -= temp; // Remove that digit - } - - // Finally we can plot the string and return pixel length - return drawString(str, poX, poY, font); - } - - - /*************************************************** - - ORIGINAL LIBRARY HEADER - - This is our library for the Adafruit ILI9341 Breakout and Shield - ----> http://www.adafruit.com/products/1651 - - Check out the links above for our tutorials and wiring diagrams - These displays use SPI to communicate, 4 or 5 pins are required to - interface (RST is optional) - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing - products from Adafruit! - - Written by Limor Fried/Ladyada for Adafruit Industries. - MIT license, all text above must be included in any redistribution - - ****************************************************/ - \ No newline at end of file + writecommand(0xEF); + writedata(0x03); + writedata(0x80); + writedata(0x02); + + writecommand(0xCF); + writedata(0x00); + writedata(0XC1); + writedata(0X30); + + writecommand(0xED); + writedata(0x64); + writedata(0x03); + writedata(0X12); + writedata(0X81); + + writecommand(0xE8); + writedata(0x85); + writedata(0x00); + writedata(0x78); + + writecommand(0xCB); + writedata(0x39); + writedata(0x2C); + writedata(0x00); + writedata(0x34); + writedata(0x02); + + writecommand(0xF7); + writedata(0x20); + + writecommand(0xEA); + writedata(0x00); + writedata(0x00); + + writecommand(ILI9341_PWCTR1); //Power control + writedata(0x23); //VRH[5:0] + + writecommand(ILI9341_PWCTR2); //Power control + writedata(0x10); //SAP[2:0];BT[3:0] + + writecommand(ILI9341_VMCTR1); //VCM control + writedata(0x3e); + writedata(0x28); + + writecommand(ILI9341_VMCTR2); //VCM control2 + writedata(0x86); //-- + + writecommand(ILI9341_MADCTL); // Memory Access Control + writedata(0x48); + + writecommand(ILI9341_PIXFMT); + writedata(0x55); + + writecommand(ILI9341_FRMCTR1); + writedata(0x00); + writedata(0x13); // 0x18 79Hz, 0x1B default 70Hz, 0x13 100Hz + + writecommand(ILI9341_DFUNCTR); // Display Function Control + writedata(0x08); + writedata(0x82); + writedata(0x27); + + writecommand(0xF2); // 3Gamma Function Disable + writedata(0x00); + + writecommand(ILI9341_GAMMASET); //Gamma curve selected + writedata(0x01); + + writecommand(ILI9341_GMCTRP1); //Set Gamma + writedata(0x0F); + writedata(0x31); + writedata(0x2B); + writedata(0x0C); + writedata(0x0E); + writedata(0x08); + writedata(0x4E); + writedata(0xF1); + writedata(0x37); + writedata(0x07); + writedata(0x10); + writedata(0x03); + writedata(0x0E); + writedata(0x09); + writedata(0x00); + + writecommand(ILI9341_GMCTRN1); //Set Gamma + writedata(0x00); + writedata(0x0E); + writedata(0x14); + writedata(0x03); + writedata(0x11); + writedata(0x07); + writedata(0x31); + writedata(0xC1); + writedata(0x48); + writedata(0x08); + writedata(0x0F); + writedata(0x0C); + writedata(0x31); + writedata(0x36); + writedata(0x0F); + + writecommand(ILI9341_SLPOUT); //Exit Sleep + spi_end(); + delay(120); + spi_begin(); + writecommand(ILI9341_DISPON); //Display on + spi_end(); + +} + + +/*************************************************************************************** +** Function name: drawCircle +** Description: Draw a circle outline +***************************************************************************************/ +/* +// Midpoint circle algorithm, we can optimise this since y = 0 on first pass +// and we can eliminate the multiply as well +void TFT_ILI9341_ESP::drawCircle(int32_t x0, int32_t y0, int32_t radius, uint32_t color) +{ + int32_t x = radius; + int32_t y = 0; + int32_t err = 0; + + while (x >= y) + { + drawPixel(x0 + x, y0 + y, color); + drawPixel(x0 + x, y0 - y, color); + drawPixel(x0 - x, y0 - y, color); + drawPixel(x0 - x, y0 + y, color); + + drawPixel(x0 + y, y0 + x, color); + drawPixel(x0 + y, y0 - x, color); + drawPixel(x0 - y, y0 - x, color); + drawPixel(x0 - y, y0 + x, color); + + if (err <= 0) + { + y += 1; + err += 2*y + 1; + } + if (err > 0) + { + x -= 1; + err -= 2*x + 1; + } + } +} +*/ + +// Optimised midpoint circle algorithm +void TFT_ILI9341_ESP::drawCircle(int32_t x0, int32_t y0, int32_t r, uint32_t color) +{ + int32_t x = 0; + int32_t dx = 1; + int32_t dy = r+r; + int32_t p = -(r>>1); + + // These are ordered to minimise coordinate changes in x or y + // drawPixel can then send fewer bounding box commands + drawPixel(x0 + r, y0, color); + drawPixel(x0 - r, y0, color); + drawPixel(x0, y0 - r, color); + drawPixel(x0, y0 + r, color); + + while(x=0) { + dy-=2; + p-=dy; + r--; + } + + dx+=2; + p+=dx; + + x++; + + // These are ordered to minimise coordinate changes in x or y + // drawPixel can then send fewer bounding box commands + drawPixel(x0 + x, y0 + r, color); + drawPixel(x0 - x, y0 + r, color); + drawPixel(x0 - x, y0 - r, color); + drawPixel(x0 + x, y0 - r, color); + + drawPixel(x0 + r, y0 + x, color); + drawPixel(x0 - r, y0 + x, color); + drawPixel(x0 - r, y0 - x, color); + drawPixel(x0 + r, y0 - x, color); + } +} + +/*************************************************************************************** +** Function name: drawCircleHelper +** Description: Support function for circle drawing +***************************************************************************************/ +void TFT_ILI9341_ESP::drawCircleHelper( int32_t x0, int32_t y0, int32_t r, uint8_t cornername, uint32_t color) +{ + int32_t f = 1 - r; + int32_t ddF_x = 1; + int32_t ddF_y = -2 * r; + int32_t x = 0; + + while (x < r) { + if (f >= 0) { + r--; + ddF_y += 2; + f += ddF_y; + } + x++; + ddF_x += 2; + f += ddF_x; + if (cornername & 0x4) { + drawPixel(x0 + x, y0 + r, color); + drawPixel(x0 + r, y0 + x, color); + } + if (cornername & 0x2) { + drawPixel(x0 + x, y0 - r, color); + drawPixel(x0 + r, y0 - x, color); + } + if (cornername & 0x8) { + drawPixel(x0 - r, y0 + x, color); + drawPixel(x0 - x, y0 + r, color); + } + if (cornername & 0x1) { + drawPixel(x0 - r, y0 - x, color); + drawPixel(x0 - x, y0 - r, color); + } + } +} + +/*************************************************************************************** +** Function name: fillCircle +** Description: draw a filled circle +***************************************************************************************/ +/* +void TFT_ILI9341_ESP::fillCircle(int32_t x0, int32_t y0, int32_t r, uint32_t color) +{ + drawFastVLine(x0, y0 - r, r + r + 1, color); + fillCircleHelper(x0, y0, r, 3, 0, color); +} +*/ + +// Optimised midpoint circle algorithm +void TFT_ILI9341_ESP::fillCircle(int32_t x0, int32_t y0, int32_t r, uint32_t color) + +{ + int32_t x = 0; + int32_t dx = 1; + int32_t dy = r+r; + int32_t p = -(r>>1); + + drawFastVLine(x0, y0 - r, dy+1, color); + + while(x=0) { + dy-=2; + p-=dy; + r--; + } + + dx+=2; + p+=dx; + + x++; + + drawFastVLine(x0 + x, y0 - r, 2 * r+1, color); + drawFastVLine(x0 - x, y0 - r, 2 * r+1, color); + drawFastVLine(x0 + r, y0 - x, 2 * x+1, color); + drawFastVLine(x0 - r, y0 - x, 2 * x+1, color); + + } +} + + +/* +// Another algorithm, this one tends to produce less pretty circles with odd edge pixels +void TFT_ILI9341_ESP::fillCircle(int32_t x, int32_t y, int32_t r, uint32_t color) +{ + for (int y1 = -r; y1 <= 0; y1++) + for (int x1 = -r; x1 <= 0; x1++) + if (x1 * x1 + y1 * y1 <= r * r) + { + drawFastHLine(x + x1, y + y1, 2 * (-x1), color); + drawFastHLine(x + x1, y - y1, 2 * (-x1), color); + break; + } +} +*/ + +/*************************************************************************************** +** Function name: fillCircleHelper +** Description: Support function for filled circle drawing +***************************************************************************************/ +// Used to do circles and roundrects +void TFT_ILI9341_ESP::fillCircleHelper(int32_t x0, int32_t y0, int32_t r, uint8_t cornername, int32_t delta, uint32_t color) +{ + int32_t f = 1 - r; + int32_t ddF_x = 1; + int32_t ddF_y = -r - r; + int32_t x = 0; + + delta++; + while (x < r) { + if (f >= 0) { + r--; + ddF_y += 2; + f += ddF_y; + } + x++; + ddF_x += 2; + f += ddF_x; + + if (cornername & 0x1) { + drawFastVLine(x0 + x, y0 - r, r + r + delta, color); + drawFastVLine(x0 + r, y0 - x, x + x + delta, color); + } + if (cornername & 0x2) { + drawFastVLine(x0 - x, y0 - r, r + r + delta, color); + drawFastVLine(x0 - r, y0 - x, x + x + delta, color); + } + } +} + +/*************************************************************************************** +** Function name: drawEllipse +** Description: Draw a ellipse outline +***************************************************************************************/ +void TFT_ILI9341_ESP::drawEllipse(int16_t x0, int16_t y0, int16_t rx, int16_t ry, uint16_t color) +{ + if (rx<2) return; + if (ry<2) return; + int32_t x, y; + int32_t rx2 = rx * rx; + int32_t ry2 = ry * ry; + int32_t fx2 = 4 * rx2; + int32_t fy2 = 4 * ry2; + int32_t s; + + //fastSetup(); + + for (x = 0, y = ry, s = 2*ry2+rx2*(1-2*ry); ry2*x <= rx2*y; x++) + { + // These are ordered to minimise coordinate changes in x or y + // drawPixel can then send fewer bounding box commands + drawPixel(x0 + x, y0 + y, color); + drawPixel(x0 - x, y0 + y, color); + drawPixel(x0 - x, y0 - y, color); + drawPixel(x0 + x, y0 - y, color); + if (s >= 0) + { + s += fx2 * (1 - y); + y--; + } + s += ry2 * ((4 * x) + 6); + } + + for (x = rx, y = 0, s = 2*rx2+ry2*(1-2*rx); rx2*y <= ry2*x; y++) + { + // These are ordered to minimise coordinate changes in x or y + // drawPixel can then send fewer bounding box commands + drawPixel(x0 + x, y0 + y, color); + drawPixel(x0 - x, y0 + y, color); + drawPixel(x0 - x, y0 - y, color); + drawPixel(x0 + x, y0 - y, color); + if (s >= 0) + { + s += fy2 * (1 - x); + x--; + } + s += rx2 * ((4 * y) + 6); + } +} + +/*************************************************************************************** +** Function name: fillEllipse +** Description: draw a filled ellipse +***************************************************************************************/ +void TFT_ILI9341_ESP::fillEllipse(int16_t x0, int16_t y0, int16_t rx, int16_t ry, uint16_t color) +{ + if (rx<2) return; + if (ry<2) return; + int32_t x, y; + int32_t rx2 = rx * rx; + int32_t ry2 = ry * ry; + int32_t fx2 = 4 * rx2; + int32_t fy2 = 4 * ry2; + int32_t s; + + for (x = 0, y = ry, s = 2*ry2+rx2*(1-2*ry); ry2*x <= rx2*y; x++) + { + drawFastHLine(x0 - x, y0 - y, x + x + 1, color); + drawFastHLine(x0 - x, y0 + y, x + x + 1, color); + + if (s >= 0) + { + s += fx2 * (1 - y); + y--; + } + s += ry2 * ((4 * x) + 6); + } + + for (x = rx, y = 0, s = 2*rx2+ry2*(1-2*rx); rx2*y <= ry2*x; y++) + { + drawFastHLine(x0 - x, y0 - y, x + x + 1, color); + drawFastHLine(x0 - x, y0 + y, x + x + 1, color); + + if (s >= 0) + { + s += fy2 * (1 - x); + x--; + } + s += rx2 * ((4 * y) + 6); + } + +} + +/*************************************************************************************** +** Function name: fillScreen +** Description: Clear the screen to defined colour +***************************************************************************************/ +void TFT_ILI9341_ESP::fillScreen(uint32_t color) +{ + fillRect(0, 0, _width, _height, color); +} + +/*************************************************************************************** +** Function name: drawRect +** Description: Draw a rectangle outline +***************************************************************************************/ +// Draw a rectangle +void TFT_ILI9341_ESP::drawRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color) +{ + drawFastHLine(x, y, w, color); + drawFastHLine(x, y + h - 1, w, color); + drawFastVLine(x, y, h, color); + drawFastVLine(x + w - 1, y, h, color); +} + +/*************************************************************************************** +** Function name: drawRoundRect +** Description: Draw a rounded corner rectangle outline +***************************************************************************************/ +// Draw a rounded rectangle +void TFT_ILI9341_ESP::drawRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t r, uint32_t color) +{ + // smarter version + drawFastHLine(x + r , y , w - r - r, color); // Top + drawFastHLine(x + r , y + h - 1, w - r - r, color); // Bottom + drawFastVLine(x , y + r , h - r - r, color); // Left + drawFastVLine(x + w - 1, y + r , h - r - r, color); // Right + // draw four corners + drawCircleHelper(x + r , y + r , r, 1, color); + drawCircleHelper(x + w - r - 1, y + r , r, 2, color); + drawCircleHelper(x + w - r - 1, y + h - r - 1, r, 4, color); + drawCircleHelper(x + r , y + h - r - 1, r, 8, color); +} + +/*************************************************************************************** +** Function name: fillRoundRect +** Description: Draw a rounded corner filled rectangle +***************************************************************************************/ +// Fill a rounded rectangle +void TFT_ILI9341_ESP::fillRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t r, uint32_t color) +{ + // smarter version + fillRect(x + r, y, w - r - r, h, color); + + // draw four corners + fillCircleHelper(x + w - r - 1, y + r, r, 1, h - r - r - 1, color); + fillCircleHelper(x + r , y + r, r, 2, h - r - r - 1, color); +} + +/*************************************************************************************** +** Function name: drawTriangle +** Description: Draw a triangle outline using 3 arbitrary points +***************************************************************************************/ +// Draw a triangle +void TFT_ILI9341_ESP::drawTriangle(int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color) +{ + drawLine(x0, y0, x1, y1, color); + drawLine(x1, y1, x2, y2, color); + drawLine(x2, y2, x0, y0, color); +} + +/*************************************************************************************** +** Function name: fillTriangle +** Description: Draw a filled triangle using 3 arbitrary points +***************************************************************************************/ + +// Fill a triangle - original Adafruit function works well and code footprint is small +void TFT_ILI9341_ESP::fillTriangle ( int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color) +{ + int32_t a, b, y, last; + + // Sort coordinates by Y order (y2 >= y1 >= y0) + if (y0 > y1) { + swap(y0, y1); swap(x0, x1); + } + if (y1 > y2) { + swap(y2, y1); swap(x2, x1); + } + if (y0 > y1) { + swap(y0, y1); swap(x0, x1); + } + + if (y0 == y2) { // Handle awkward all-on-same-line case as its own thing + a = b = x0; + if (x1 < a) a = x1; + else if (x1 > b) b = x1; + if (x2 < a) a = x2; + else if (x2 > b) b = x2; + drawFastHLine(a, y0, b - a + 1, color); + return; + } + + int32_t + dx01 = x1 - x0, + dy01 = y1 - y0, + dx02 = x2 - x0, + dy02 = y2 - y0, + dx12 = x2 - x1, + dy12 = y2 - y1, + sa = 0, + sb = 0; + + // For upper part of triangle, find scanline crossings for segments + // 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1 + // is included here (and second loop will be skipped, avoiding a /0 + // error there), otherwise scanline y1 is skipped here and handled + // in the second loop...which also avoids a /0 error here if y0=y1 + // (flat-topped triangle). + if (y1 == y2) last = y1; // Include y1 scanline + else last = y1 - 1; // Skip it + + for (y = y0; y <= last; y++) { + a = x0 + sa / dy01; + b = x0 + sb / dy02; + sa += dx01; + sb += dx02; + + if (a > b) swap(a, b); + drawFastHLine(a, y, b - a + 1, color); + } + + // For lower part of triangle, find scanline crossings for segments + // 0-2 and 1-2. This loop is skipped if y1=y2. + sa = dx12 * (y - y1); + sb = dx02 * (y - y0); + for (; y <= y2; y++) { + a = x1 + sa / dy12; + b = x0 + sb / dy02; + sa += dx12; + sb += dx02; + + if (a > b) swap(a, b); + drawFastHLine(a, y, b - a + 1, color); + } +} + +/*************************************************************************************** +** Function name: drawBitmap +** Description: Draw an image stored in an array on the TFT +***************************************************************************************/ +void TFT_ILI9341_ESP::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color) { + + int32_t i, j, byteWidth = (w + 7) / 8; + + for (j = 0; j < h; j++) { + for (i = 0; i < w; i++ ) { + if (pgm_read_byte(bitmap + j * byteWidth + i / 8) & (128 >> (i & 7))) { + drawPixel(x + i, y + j, color); + } + } + } +} + +/*************************************************************************************** +** Function name: setCursor +** Description: Set the text cursor x,y position +***************************************************************************************/ +void TFT_ILI9341_ESP::setCursor(int16_t x, int16_t y) +{ + cursor_x = x; + cursor_y = y; +} + +/*************************************************************************************** +** Function name: setCursor +** Description: Set the text cursor x,y position and font +***************************************************************************************/ +void TFT_ILI9341_ESP::setCursor(int16_t x, int16_t y, uint8_t font) +{ + textfont = font; + cursor_x = x; + cursor_y = y; +} + +/*************************************************************************************** +** Function name: setTextSize +** Description: Set the text size multiplier +***************************************************************************************/ +void TFT_ILI9341_ESP::setTextSize(uint8_t s) +{ + if (s>7) s = 7; // Limit the maximum size multiplier so byte variables can be used for rendering + textsize = (s > 0) ? s : 1; // Don't allow font size 0 +} + +/*************************************************************************************** +** Function name: setTextColor +** Description: Set the font foreground colour (background is transparent) +***************************************************************************************/ +void TFT_ILI9341_ESP::setTextColor(uint16_t c) +{ + // For 'transparent' background, we'll set the bg + // to the same as fg instead of using a flag + textcolor = textbgcolor = c; +} + +/*************************************************************************************** +** Function name: setTextColor +** Description: Set the font foreground and background colour +***************************************************************************************/ +void TFT_ILI9341_ESP::setTextColor(uint16_t c, uint16_t b) +{ + textcolor = c; + textbgcolor = b; +} + +/*************************************************************************************** +** Function name: setTextWrap +** Description: Define if text should wrap at end of line +***************************************************************************************/ +void TFT_ILI9341_ESP::setTextWrap(boolean w) +{ + textwrap = w; +} + +/*************************************************************************************** +** Function name: setTextDatum +** Description: Set the text position reference datum +***************************************************************************************/ +void TFT_ILI9341_ESP::setTextDatum(uint8_t d) +{ + textdatum = d; +} + +/*************************************************************************************** +** Function name: setTextPadding +** Description: Define padding width (aids erasing old text and numbers) +***************************************************************************************/ +void TFT_ILI9341_ESP::setTextPadding(uint16_t x_width) +{ + padX = x_width; +} + +/*************************************************************************************** +** Function name: getRotation +** Description: Return the rotation value (as used by setRotation()) +***************************************************************************************/ +uint8_t TFT_ILI9341_ESP::getRotation(void) +{ + return rotation; +} + +/*************************************************************************************** +** Function name: width +** Description: Return the pixel width of display (per current rotation) +***************************************************************************************/ +// Return the size of the display (per current rotation) +int16_t TFT_ILI9341_ESP::width(void) +{ + return _width; +} + +/*************************************************************************************** +** Function name: height +** Description: Return the pixel height of display (per current rotation) +***************************************************************************************/ +int16_t TFT_ILI9341_ESP::height(void) +{ + return _height; +} + +/*************************************************************************************** +** Function name: textWidth +** Description: Return the width in pixels of a string in a given font +***************************************************************************************/ +int16_t TFT_ILI9341_ESP::textWidth(const String& string) +{ + int16_t len = string.length() + 2; + char buffer[len]; + string.toCharArray(buffer, len); + return textWidth(buffer, textfont); +} + +int16_t TFT_ILI9341_ESP::textWidth(const String& string, int font) +{ + int16_t len = string.length() + 2; + char buffer[len]; + string.toCharArray(buffer, len); + return textWidth(buffer, font); +} + +int16_t TFT_ILI9341_ESP::textWidth(const char *string) +{ + return textWidth(string, textfont); +} + +int16_t TFT_ILI9341_ESP::textWidth(const char *string, int font) +{ + unsigned int str_width = 0; + char uniCode; + char *widthtable; + + if (font>1 && font<9) + { + widthtable = (char *)pgm_read_dword( &(fontdata[font].widthtbl ) ) - 32; //subtract the 32 outside the loop + + while (*string) + { + uniCode = *(string++); + + str_width += pgm_read_byte( widthtable + uniCode); // Normally we need to subract 32 from uniCode + } + } + else + { + +#ifdef LOAD_GFXFF + if(gfxFont) // New font + { + while (*string) + { + uniCode = *(string++); + if (uniCode > (uint8_t)pgm_read_byte(&gfxFont->last)) uniCode = pgm_read_byte(&gfxFont->first); + uniCode -= pgm_read_byte(&gfxFont->first); + GFXglyph *glyph = &(((GFXglyph *)pgm_read_dword(&gfxFont->glyph))[uniCode]); + // If this is not the last character then use xAdvance + if (*string) str_width += pgm_read_byte(&glyph->xAdvance); + // Else use the offset plus width since this can be bigger than xAdvance + else str_width += ((int8_t)pgm_read_byte(&glyph->xOffset) + pgm_read_byte(&glyph->width)); + } + } + else +#endif + { +#ifdef LOAD_GLCD + while (*string++) str_width += 6; +#endif + } + } + return str_width * textsize; +} + +/*************************************************************************************** +** Function name: fontsLoaded +** Description: return an encoded 16 bit value showing the fonts loaded +***************************************************************************************/ +// Returns a value showing which fonts are loaded (bit N set = Font N loaded) + +uint16_t TFT_ILI9341_ESP::fontsLoaded(void) +{ + return fontsloaded; +} + +/*************************************************************************************** +** Function name: fontHeight +** Description: return the height of a font (yAdvance for free fonts) +***************************************************************************************/ +int16_t TFT_ILI9341_ESP::fontHeight(int16_t font) +{ +#ifdef LOAD_GFXFF + if (font==1) + { + if(gfxFont) // New font + { + return pgm_read_byte(&gfxFont->yAdvance) * textsize; + } + } +#endif + return pgm_read_byte( &fontdata[font].height ) * textsize; +} + +/*************************************************************************************** +** Function name: drawChar +** Description: draw a single character in the Adafruit GLCD font +***************************************************************************************/ +void TFT_ILI9341_ESP::drawChar(int32_t x, int32_t y, unsigned char c, uint32_t color, uint32_t bg, uint8_t size) +{ + if ((x >= (int16_t)_width) || // Clip right + (y >= (int16_t)_height) || // Clip bottom + ((x + 6 * size - 1) < 0) || // Clip left + ((y + 8 * size - 1) < 0)) // Clip top + return; + +#ifdef LOAD_GLCD +//>>>>>>>>>>>>>>>>>> +#ifdef LOAD_GFXFF + if(!gfxFont) { // 'Classic' built-in font +#endif +//>>>>>>>>>>>>>>>>>> + + boolean fillbg = (bg != color); + +spi_begin(); + + if ((size==1) && fillbg) + { + byte column[6]; + byte mask = 0x1; + setAddrWindow(x, y, x+5, y+8); + for (int8_t i = 0; i < 5; i++ ) column[i] = pgm_read_byte(font + (c * 5) + i); + column[5] = 0; + + for (int8_t j = 0; j < 8; j++) { + for (int8_t k = 0; k < 5; k++ ) { + if (column[k] & mask) { + //_SPI->transfer(color >> 8); + _SPI->write16(color); + } + else { + //_SPI->transfer(bg >> 8); + _SPI->write16(bg); + } + } + + mask <<= 1; + //_SPI->transfer(bg >> 8); + _SPI->write16(bg); + } + CS_H; + } + else + { + for (int8_t i = 0; i < 6; i++ ) { + uint8_t line; + if (i == 5) + line = 0x0; + else + line = pgm_read_byte(font + (c * 5) + i); + + if (size == 1) // default size + { + for (int8_t j = 0; j < 8; j++) { + if (line & 0x1) drawPixel(x + i, y + j, color); + line >>= 1; + } + } + else { // big size + for (int8_t j = 0; j < 8; j++) { + if (line & 0x1) fillRect(x + (i * size), y + (j * size), size, size, color); + else if (fillbg) fillRect(x + i * size, y + j * size, size, size, bg); + line >>= 1; + } + } + } + } + +//>>>>>>>>>>>>>>>>>>>>>>>>>>> +#ifdef LOAD_GFXFF + } else { // Custom font +#endif +//>>>>>>>>>>>>>>>>>>>>>>>>>>> +#endif // LOAD_GLCD + +#ifdef LOAD_GFXFF +//>>>>>>>>>>>>>>>>>>>>>>>>>>> + // Character is assumed previously filtered by write() to eliminate + // newlines, returns, non-printable characters, etc. Calling drawChar() + // directly with 'bad' characters of font may cause mayhem! + if (c > pgm_read_byte(&gfxFont->last)) c = pgm_read_byte(&gfxFont->first);; + c -= pgm_read_byte(&gfxFont->first); + GFXglyph *glyph = &(((GFXglyph *)pgm_read_dword(&gfxFont->glyph))[c]); + uint8_t *bitmap = (uint8_t *)pgm_read_dword(&gfxFont->bitmap); + + uint16_t bo = pgm_read_word(&glyph->bitmapOffset); + uint8_t w = pgm_read_byte(&glyph->width), + h = pgm_read_byte(&glyph->height), + xa = pgm_read_byte(&glyph->xAdvance); + int8_t xo = pgm_read_byte(&glyph->xOffset), + yo = pgm_read_byte(&glyph->yOffset); + uint8_t xx, yy, bits, bit=0; + int16_t xo16, yo16; + + if(size > 1) { + xo16 = xo; + yo16 = yo; + } + + // Todo: Add character clipping here + + // NOTE: THERE IS NO 'BACKGROUND' COLOR OPTION ON CUSTOM FONTS. + // THIS IS ON PURPOSE AND BY DESIGN. The background color feature + // has typically been used with the 'classic' font to overwrite old + // screen contents with new data. This ONLY works because the + // characters are a uniform size; it's not a sensible thing to do with + // proportionally-spaced fonts with glyphs of varying sizes (and that + // may overlap). To replace previously-drawn text when using a custom + // font, use the getTextBounds() function to determine the smallest + // rectangle encompassing a string, erase the area with fillRect(), + // then draw new text. This WILL infortunately 'blink' the text, but + // is unavoidable. Drawing 'background' pixels will NOT fix this, + // only creates a new set of problems. Have an idea to work around + // this (a canvas object type for MCUs that can afford the RAM and + // displays supporting setAddrWindow() and pushColors()), but haven't + // implemented this yet. + +// Here we have 3 versions of the same function just for evaluation purposes +// Comment out the next two #defines to revert to the slower Adafruit implementation + +// If FAST_LINE is defined then the free fonts are rendered using horizontal lines +// this makes rendering fonts 2-5 times faster. Particularly good for large fonts. +// This is an elegant solution since it still uses generic functions present in the +// stock library. + +// If FAST_SHIFT is defined then a slightly faster (at least for AVR processors) +// shifting bit mask is used + +// Free fonts don't look good when the size multiplier is >1 so we could remove +// code if this is not wanted and speed things up + +#define FAST_HLINE +#define FAST_SHIFT +//FIXED_SIZE is an option in User_Setup.h that only works with FAST_LINE enabled + +#ifdef FIXED_SIZE + x+=xo; // Save 88 bytes of FLASH + y+=yo; +#endif + +#ifdef FAST_HLINE + + #ifdef FAST_SHIFT + uint16_t hpc = 0; // Horizontal foreground pixel count + for(yy=0; yy>= 1; + } + // Draw pixels for this line as we are about to increment yy + if (hpc) { +#ifndef FIXED_SIZE + if(size == 1) drawFastHLine(x+xo+xx-hpc, y+yo+yy, hpc, color); + else fillRect(x+(xo16+xx-hpc)*size, y+(yo16+yy)*size, size*hpc, size, color); +#else + drawFastHLine(x+xx-hpc, y+yy, hpc, color); +#endif + hpc=0; + } + } + #else + uint16_t hpc = 0; // Horizontal foreground pixel count + for(yy=0; yy> 8) | (uint16_t)(x0 << 8) | ((uint8_t)(x1 >> 8)<<16 | (x1 << 24)); + SPI1CMD |= SPIBUSY; + while(SPI1CMD & SPIBUSY) {} + + // This proves we can only change the byte level bit SPI register read-out order, not the actual byte order + // So we can't use this method to avoid coordinate byte order swapping! + //uint32_t x = (x0 << 16) | x1; + // Swap bits in 32 bit word end for end + //x = (((x & 0xAAAAAAAA) >> 1) | ((x & 0x55555555) << 1)); + //x = (((x & 0xCCCCCCCC) >> 2) | ((x & 0x33333333) << 2)); + //x = (((x & 0xF0F0F0F0) >> 4) | ((x & 0x0F0F0F0F) << 4)); + //x = (((x & 0xFF00FF00) >> 8) | ((x & 0x00FF00FF) << 8)); + //x = (x >> 16) | (x << 16); + //SPI1W0 = x; + //SPI1C |= (SPICWBO | SPICRBO); // LSB first + //SPI1CMD |= SPIBUSY; + //while(SPI1CMD & SPIBUSY) {} + //SPI1C &= ~(SPICWBO | SPICRBO); // MSB first = default + + // Row addr set + DC_C; + + SPI1U1 = mask | (7 << SPILMOSI) | (7 << SPILMISO); + + SPI1W0 = ILI9341_PASET; + SPI1CMD |= SPIBUSY; + while(SPI1CMD & SPIBUSY) {} + + DC_D; + + SPI1U1 = mask | (31 << SPILMOSI) | (31 << SPILMISO); + // Load the two coords as a 32 bit value and shift in one go + SPI1W0 = (y0 >> 8) | (uint16_t)(y0 << 8) | ((uint8_t)(y1 >> 8)<<16 | (y1 << 24)); + SPI1CMD |= SPIBUSY; + while(SPI1CMD & SPIBUSY) {} + + // write to RAM + DC_C; + + SPI1U1 = mask | (7 << SPILMOSI) | (7 << SPILMISO); + SPI1W0 = ILI9341_RAMWR; + SPI1CMD |= SPIBUSY; + while(SPI1CMD & SPIBUSY) {} + + DC_D; + + spi_end(); +} +#else + +inline void TFT_ILI9341_ESP::setAddrWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1) +{ + spi_begin(); + + addr_col = 0xFFFF; + addr_row = 0xFFFF; + + // Column addr set + DC_C; + CS_L; + + _SPI->write(ILI9341_CASET); + + DC_D; + + _SPI->write16((x0 >> 8) | (x0 << 8)); + + _SPI->write16((x1 >> 8) | (x1 << 8)); + + // Row addr set + DC_C; + + _SPI->write(ILI9341_PASET); + + DC_D; + + _SPI->write16((y0 >> 8) | (y0 << 8)); + + _SPI->write16((y1 >> 8) | (y1 << 8)); + + // write to RAM + DC_C; + + _SPI->write(ILI9341_RAMWR); + + DC_D; + + spi_end(); +} + +#endif + +/*************************************************************************************** +** Function name: drawPixel +** Description: push a single pixel at an arbitrary position +***************************************************************************************/ +#ifdef ESP8266 +void TFT_ILI9341_ESP::drawPixel(uint32_t x, uint32_t y, uint32_t color) +{ + // Faster range checking, possible because x and y are unsigned + if ((x >= _width) || (y >= _height)) return; + spi_begin(); + + CS_L; + + uint32_t mask = ~((SPIMMOSI << SPILMOSI) | (SPIMMISO << SPILMISO)); + mask = SPI1U1 & mask; + // No need to send x if it has not changed (speeds things up) + if (addr_col != x) { + + DC_C; + + SPI1U1 = mask | (7 << SPILMOSI) | (7 << SPILMISO); + SPI1W0 = ILI9341_CASET; + SPI1CMD |= SPIBUSY; + while(SPI1CMD & SPIBUSY) {} + + DC_D; + + SPI1U1 = mask | (31 << SPILMOSI) | (31 << SPILMISO); + // Load the two coords as a 32 bit value and shift in one go + uint32_t xswap = (x >> 8) | (uint16_t)(x << 8); + SPI1W0 = xswap | (xswap << 16); + SPI1CMD |= SPIBUSY; + while(SPI1CMD & SPIBUSY) {} + + addr_col = x; + } + + // No need to send y if it has not changed (speeds things up) + if (addr_row != y) { + + DC_C; + + SPI1U1 = mask | (7 << SPILMOSI) | (7 << SPILMISO); + + SPI1W0 = ILI9341_PASET; + SPI1CMD |= SPIBUSY; + while(SPI1CMD & SPIBUSY) {} + DC_D; + + SPI1U1 = mask | (31 << SPILMOSI) | (31 << SPILMISO); + // Load the two coords as a 32 bit value and shift in one go + uint32_t yswap = (y >> 8) | (uint16_t)(y << 8); + SPI1W0 = yswap | (yswap << 16); + SPI1CMD |= SPIBUSY; + while(SPI1CMD & SPIBUSY) {} + + addr_row = y; + } + + DC_C; + + SPI1U1 = mask | (7 << SPILMOSI) | (7 << SPILMISO); + + SPI1W0 = ILI9341_RAMWR; + SPI1CMD |= SPIBUSY; + while(SPI1CMD & SPIBUSY) {} + + DC_D; + + SPI1U1 = mask | (15 << SPILMOSI) | (15 << SPILMISO); + + SPI1W0 = (color >> 8) | (color << 8); + SPI1CMD |= SPIBUSY; + while(SPI1CMD & SPIBUSY) {} + + CS_H; + + spi_end(); +} + +#else + + void TFT_ILI9341_ESP::drawPixel(uint32_t x, uint32_t y, uint32_t color) +{ + // Faster range checking, possible because x and y are unsigned + if ((x >= _width) || (y >= _height)) return; + spi_begin(); + + CS_L; + + // No need to send x if it has not changed (speeds things up) + if (addr_col != x) { + + DC_C; + + _SPI->write(ILI9341_CASET); + + DC_D; + + _SPI->write16((x >> 8) | (x << 8)); + + // Send same x value again + _SPI->write16((x >> 8) | (x << 8)); + + addr_col = x; + } + + // No need to send y if it has not changed (speeds things up) + if (addr_row != y) { + + DC_C; + + _SPI->write(ILI9341_PASET); + + DC_D; + + _SPI->write16((y >> 8) | (y << 8)); + + // Send same y value again + _SPI->write16((y >> 8) | (y << 8)); + + addr_row = y; + } + + DC_C; + + _SPI->write(ILI9341_RAMWR); + + DC_D; + + _SPI->write16((color >> 8) | (color << 8)); + + CS_H; + + spi_end(); +} + +#endif +/*************************************************************************************** +** Function name: pushColor +** Description: push a single pixel +***************************************************************************************/ +void TFT_ILI9341_ESP::pushColor(uint16_t color) +{ + spi_begin(); + + CS_L; + + _SPI->write16(color); + + CS_H; + + spi_end(); +} + +/*************************************************************************************** +** Function name: pushColor +** Description: push a single colour to "len" pixels +***************************************************************************************/ +void TFT_ILI9341_ESP::pushColor(uint16_t color, uint16_t len) +{ + spi_begin(); + + CS_L; + + uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color }; + while(len>32) { _SPI->writePattern(&colorBin[0], 2, 32); len-=32;} + _SPI->writePattern(&colorBin[0], 2, len); + + CS_H; + + spi_end(); +} + +/*************************************************************************************** +** Function name: pushColors +** Description: push an aray of pixels for BMP image drawing +***************************************************************************************/ +// Sends an array of 16-bit color values to the TFT; used +// externally by BMP examples. Assumes that setWindow() has +// previously been called to define the bounds. Max 255 pixels at +// a time (BMP examples read in small chunks due to limited RAM). + +void TFT_ILI9341_ESP::pushColors(uint16_t *data, uint8_t len) +{ + spi_begin(); + + CS_L; + + while (len--) _SPI->write16(*(data++)); + + CS_H; + + spi_end(); +} + +/*************************************************************************************** +** Function name: pushColors +** Description: push an aray of pixels for 16 bit raw image drawing +***************************************************************************************/ +// Assumed that setWindow() has previously been called + +void TFT_ILI9341_ESP::pushColors(uint8_t *data, uint32_t len) +{ + spi_begin(); + + CS_L; + + while ( len >=64 ) {_SPI->writePattern(data, 64, 1); data += 64; len -= 64; } + if (len) _SPI->writePattern(data, len, 1); + + CS_H; + + spi_end(); +} + +/*************************************************************************************** +** Function name: drawLine +** Description: draw a line between 2 arbitrary points +***************************************************************************************/ + +// Bresenham's algorithm - thx wikipedia - speed enhanced by Bodmer to use +// an eficient FastH/V Line draw routine for line segments of 2 pixels or more +#ifdef ESP32 + +void TFT_ILI9341_ESP::drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color) +{ + boolean steep = abs(y1 - y0) > abs(x1 - x0); + if (steep) { + swap(x0, y0); + swap(x1, y1); + } + + if (x0 > x1) { + swap(x0, x1); + swap(y0, y1); + } + + int32_t dx = x1 - x0, dy = abs(y1 - y0);; + + + int32_t err = dx >> 1, ystep = -1, xs = x0, dlen = 0; + + if (y0 < y1) ystep = 1; + + // Split into steep and not steep for FastH/V separation + if (steep) { + for (; x0 <= x1; x0++) { + dlen++; + err -= dy; + if (err < 0) { + err += dx; + if (dlen == 1) drawPixel(y0, xs, color); + else drawFastVLine(y0, xs, dlen, color); + dlen = 0; y0 += ystep; xs = x0 + 1; + } + } + if (dlen) drawFastVLine(y0, xs, dlen, color); + } + else + { + for (; x0 <= x1; x0++) { + dlen++; + err -= dy; + if (err < 0) { + err += dx; + if (dlen == 1) drawPixel(xs, y0, color); + else drawFastHLine(xs, y0, dlen, color); + dlen = 0; y0 += ystep; xs = x0 + 1; + } + } + if (dlen) drawFastHLine(xs, y0, dlen, color); + } +} + +#else + +// This is a weeny bit faster +void TFT_ILI9341_ESP::drawLine(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t color) +{ + spi_begin(); + + boolean steep = abs(y1 - y0) > abs(x1 - x0); + + if (steep) { + swap(x0, y0); + swap(x1, y1); + } + + if (x0 > x1) { + swap(x0, x1); + swap(y0, y1); + } + + if (x1 < 0) return; + + int16_t dx, dy; + dx = x1 - x0; + dy = abs(y1 - y0); + + int16_t err = dx / 2; + int8_t ystep = (y0 < y1) ? 1 : (-1); + + uint32_t mask = ~((SPIMMOSI << SPILMOSI) | (SPIMMISO << SPILMISO)); + mask = (SPI1U1 & mask) | (15 << SPILMOSI) | (15 << SPILMISO); + + int16_t swapped_color = (color >> 8) | (color << 8); + + if (steep) // y increments every iteration (y0 is x-axis, and x0 is y-axis) + { + if (x1 >= _height) x1 = _height - 1; + + for (; x0 <= x1; x0++) { + if ((x0 >= 0) && (y0 >= 0) && (y0 < _width)) break; + err -= dy; + if (err < 0) { + err += dx; + y0 += ystep; + } + } + + if (x0 > x1) return; + + setAddrWindow(y0, x0, y0, _height); + SPI1U1 = mask; + for (; x0 <= x1; x0++) { + while(SPI1CMD & SPIBUSY) {} + SPI1W0 = swapped_color; + SPI1CMD |= SPIBUSY; + + err -= dy; + if (err < 0) { + y0 += ystep; + if ((y0 < 0) || (y0 >= _width)) break; + err += dx; + while(SPI1CMD & SPIBUSY) {} + setAddrWindow(y0, x0+1, y0, _height); + SPI1U1 = mask; + } + } + } + else // x increments every iteration (x0 is x-axis, and y0 is y-axis) + { + if (x1 >= _width) x1 = _width - 1; + + for (; x0 <= x1; x0++) { + if ((x0 >= 0) && (y0 >= 0) && (y0 < _height)) break; + err -= dy; + if (err < 0) { + err += dx; + y0 += ystep; + } + } + + if (x0 > x1) return; + + setAddrWindow(x0, y0, _width, y0); + SPI1U1 = mask; + + for (; x0 <= x1; x0++) { + while(SPI1CMD & SPIBUSY) {} + SPI1W0 = swapped_color; + SPI1CMD |= SPIBUSY; + + err -= dy; + if (err < 0) { + y0 += ystep; + if ((y0 < 0) || (y0 >= _height)) break; + err += dx; + while(SPI1CMD & SPIBUSY) {} + setAddrWindow(x0+1, y0, _width, y0); + SPI1U1 = mask; + } + } + } + + while(SPI1CMD & SPIBUSY) {} + CS_H; + spi_end(); +} +#endif + +/*************************************************************************************** +** Function name: drawFastVLine +** Description: draw a vertical line +***************************************************************************************/ +void TFT_ILI9341_ESP::drawFastVLine(uint32_t x, uint32_t y, uint32_t h, uint32_t color) +{ + // Rudimentary clipping + if ((x >= _width) || (y >= _height)) return; + if ((y + h - 1) >= _height) h = _height - y; + + spi_begin(); + + setAddrWindow(x, y, x, y + h - 1); + + uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color}; + _SPI->writePattern(&colorBin[0], 2, h); + + CS_H; + + spi_end(); +} + +//Done! Total = 1028742 + +/*************************************************************************************** +** Function name: drawFastHLine +** Description: draw a horizontal line +***************************************************************************************/ +void TFT_ILI9341_ESP::drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color) +{ + // Rudimentary clipping + if ((x >= _width) || (y >= _height)) return; + if ((x + w - 1) >= _width) w = _width - x; + + spi_begin(); + + setAddrWindow(x, y, x + w - 1, y); + + uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color}; + _SPI->writePattern(&colorBin[0], 2, w); + + CS_H; + + spi_end(); +} + +/*************************************************************************************** +** Function name: fillRect +** Description: draw a filled rectangle +***************************************************************************************/ +void TFT_ILI9341_ESP::fillRect(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t color) +{ + // rudimentary clipping (drawChar w/big text requires this) + if ((x > _width) || (y > _height) || (w==0) || (h==0)) return; + if ((x + w - 1) > _width) w = _width - x; + if ((y + h - 1) > _height) h = _height - y; + + spi_begin(); + setAddrWindow(x, y, x + w - 1, y + h - 1); + + uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color}; + uint32_t n = (uint32_t)w * (uint32_t)h; + _SPI->writePattern(&colorBin[0], 2, n); + + CS_H; + + spi_end(); +} + +/*************************************************************************************** +** Function name: color565 +** Description: convert three 8 bit RGB levels to a 16 bit colour value +***************************************************************************************/ +uint16_t TFT_ILI9341_ESP::color565(uint8_t r, uint8_t g, uint8_t b) +{ + return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); +} + +/*************************************************************************************** +** Function name: setRotation +** Description: rotate the screen orientation m = 0-3 or 4-7 for BMP drawing +***************************************************************************************/ +void TFT_ILI9341_ESP::setRotation(uint8_t m) +{ + rotation = m % 8; + spi_begin(); + writecommand(ILI9341_MADCTL); + switch (rotation) { + case 0: + writedata(ILI9341_MADCTL_MX | ILI9341_MADCTL_BGR); + _width = ILI9341_TFTWIDTH; + _height = ILI9341_TFTHEIGHT; + break; + case 1: + writedata(ILI9341_MADCTL_MV | ILI9341_MADCTL_BGR); + _width = ILI9341_TFTHEIGHT; + _height = ILI9341_TFTWIDTH; + break; + case 2: + writedata(ILI9341_MADCTL_MY | ILI9341_MADCTL_BGR); + _width = ILI9341_TFTWIDTH; + _height = ILI9341_TFTHEIGHT; + break; + case 3: + writedata(ILI9341_MADCTL_MX | ILI9341_MADCTL_MY | ILI9341_MADCTL_MV | ILI9341_MADCTL_BGR); + _width = ILI9341_TFTHEIGHT; + _height = ILI9341_TFTWIDTH; + break; + // These next rotations are for bottum up BMP drawing + case 4: + writedata(ILI9341_MADCTL_MX | ILI9341_MADCTL_MY | ILI9341_MADCTL_BGR); + _width = ILI9341_TFTWIDTH; + _height = ILI9341_TFTHEIGHT; + break; + case 5: + writedata(ILI9341_MADCTL_MV | ILI9341_MADCTL_MX | ILI9341_MADCTL_BGR); + _width = ILI9341_TFTHEIGHT; + _height = ILI9341_TFTWIDTH; + break; + case 6: + writedata(ILI9341_MADCTL_BGR); + _width = ILI9341_TFTWIDTH; + _height = ILI9341_TFTHEIGHT; + break; + case 7: + writedata(ILI9341_MADCTL_MY | ILI9341_MADCTL_MV | ILI9341_MADCTL_BGR); + _width = ILI9341_TFTHEIGHT; + _height = ILI9341_TFTWIDTH; + break; + + } + spi_end(); + + addr_row = 0xFFFF; + addr_col = 0xFFFF; +} + +/*************************************************************************************** +** Function name: invertDisplay +** Description: invert the display colours i = 1 invert, i = 0 normal +***************************************************************************************/ +void TFT_ILI9341_ESP::invertDisplay(boolean i) +{ + spi_begin(); + // Send the command twice as otherwise it does not always work! + writecommand(i ? ILI9341_INVON : ILI9341_INVOFF); + writecommand(i ? ILI9341_INVON : ILI9341_INVOFF); + spi_end(); +} + +/*************************************************************************************** +** Function name: write +** Description: draw characters piped through serial stream +***************************************************************************************/ +size_t TFT_ILI9341_ESP::write(uint8_t utf8) +{ + if (utf8 == '\r') return 1; + + uint8_t uniCode = utf8; // Work with a copy + if (utf8 == '\n') uniCode+=22; // Make it a valid space character to stop errors + + uint16_t width = 0; + uint16_t height = 0; + +//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv DEBUG vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv + //Serial.print((uint8_t) uniCode); // Debug line sends all printed TFT text to serial port + //Serial.println(uniCode, HEX); // Debug line sends all printed TFT text to serial port + //delay(5); // Debug optional wait for serial port to flush through +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ DEBUG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +#ifdef LOAD_GFXFF + if(!gfxFont) { +#endif +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +#ifdef LOAD_FONT2 + if (textfont == 2) + { + // This is 20us faster than using the fontdata structure (0.443ms per character instead of 0.465ms) + width = pgm_read_byte(widtbl_f16 + uniCode-32); + height = chr_hgt_f16; + // Font 2 is rendered in whole byte widths so we must allow for this + width = (width + 6) / 8; // Width in whole bytes for font 2, should be + 7 but must allow for font width change + width = width * 8; // Width converted back to pixles + } + #ifdef LOAD_RLE + else + #endif +#endif + +#ifdef LOAD_RLE + { + if ((textfont>2) && (textfont<9)) + { + // Uses the fontinfo struct array to avoid lots of 'if' or 'switch' statements + // A tad slower than above but this is not significant and is more convenient for the RLE fonts + width = pgm_read_byte( pgm_read_dword( &(fontdata[textfont].widthtbl ) ) + uniCode-32 ); + height= pgm_read_byte( &fontdata[textfont].height ); + } + } +#endif + +#ifdef LOAD_GLCD + if (textfont==1) + { + width = 6; + height = 8; + } +#else + if (textfont==1) return 0; +#endif + + height = height * textsize; + + if (utf8 == '\n') { + cursor_y += height; + cursor_x = 0; + } + else + { + if (textwrap && (cursor_x + width * textsize >= _width)) + { + cursor_y += height; + cursor_x = 0; + } + cursor_x += drawChar(uniCode, cursor_x, cursor_y, textfont); + } + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +#ifdef LOAD_GFXFF + } // Custom GFX font + else + { + + if(utf8 == '\n') { + cursor_x = 0; + cursor_y += (int16_t)textsize * + (uint8_t)pgm_read_byte(&gfxFont->yAdvance); + } else if(uniCode != '\r') { + if (uniCode > (uint8_t)pgm_read_byte(&gfxFont->last)) uniCode = pgm_read_byte(&gfxFont->first); + + if(uniCode >= pgm_read_byte(&gfxFont->first)) { + uint8_t c2 = uniCode - pgm_read_byte(&gfxFont->first); + GFXglyph *glyph = &(((GFXglyph *)pgm_read_dword(&gfxFont->glyph))[c2]); + uint8_t w = pgm_read_byte(&glyph->width), + h = pgm_read_byte(&glyph->height); + if((w > 0) && (h > 0)) { // Is there an associated bitmap? + int16_t xo = (int8_t)pgm_read_byte(&glyph->xOffset); + if(textwrap && ((cursor_x + textsize * (xo + w)) >= _width)) { + // Drawing character would go off right edge; wrap to new line + cursor_x = 0; + cursor_y += (int16_t)textsize * + (uint8_t)pgm_read_byte(&gfxFont->yAdvance); + } + drawChar(cursor_x, cursor_y, uniCode, textcolor, textbgcolor, textsize); + } + cursor_x += pgm_read_byte(&glyph->xAdvance) * (int16_t)textsize; + } + } + + } +#endif // LOAD_GFXFF +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + return 1; +} + +/*************************************************************************************** +** Function name: drawChar +** Description: draw a unicode onto the screen +***************************************************************************************/ +int16_t TFT_ILI9341_ESP::drawChar(unsigned int uniCode, int x, int y) +{ + return drawChar(uniCode, x, y, textfont); +} + +int16_t TFT_ILI9341_ESP::drawChar(unsigned int uniCode, int x, int y, int font) +{ + + if (font==1) + { +#ifdef LOAD_GLCD + #ifndef LOAD_GFXFF + drawChar(x, y, uniCode, textcolor, textbgcolor, textsize); + return 6 * textsize; + #endif +#else + #ifndef LOAD_GFXFF + return 0; + #endif +#endif + +#ifdef LOAD_GFXFF + drawChar(x, y, uniCode, textcolor, textbgcolor, textsize); + if(!gfxFont) { // 'Classic' built-in font + #ifdef LOAD_GLCD + return 6 * textsize; + #else + return 0; + #endif + } + else + { + if (uniCode > pgm_read_byte(&gfxFont->last)) uniCode = pgm_read_byte(&gfxFont->first); + + if(uniCode >= pgm_read_byte(&gfxFont->first)) + { + uint8_t c2 = uniCode - pgm_read_byte(&gfxFont->first); + GFXglyph *glyph = &(((GFXglyph *)pgm_read_dword(&gfxFont->glyph))[c2]); + return pgm_read_byte(&glyph->xAdvance) * textsize; + } + else + { + return 0; + } + } +#endif + } + + int width = 0; + uniCode -= 32; + +#ifdef LOAD_FONT2 + int height = 0; + uint32_t flash_address = 0; + if (font == 2) + { + // This is faster than using the fontdata structure + flash_address = pgm_read_dword(&chrtbl_f16[uniCode]); + width = pgm_read_byte(widtbl_f16 + uniCode); + height = chr_hgt_f16; + } + #ifdef LOAD_RLE + else + #endif +#endif + +#ifdef LOAD_RLE + { + if ((font>2) && (font<9)) + { + // This is slower than above but is more convenient for the RLE fonts + flash_address = pgm_read_dword( pgm_read_dword( &(fontdata[font].chartbl ) ) + uniCode*sizeof(void *) ); + width = pgm_read_byte( pgm_read_dword( &(fontdata[font].widthtbl ) ) + uniCode ); + height= pgm_read_byte( &fontdata[font].height ); + } + } +#endif + +#ifdef LOAD_FONT2 // chop out code if we do not need it + int w = width; + int pX = 0; + int pY = y; + byte line = 0; + + if (font == 2) { + w = w + 6; // Should be + 7 but we need to compensate for width increment + w = w / 8; + if (x + width * textsize >= (int16_t)_width) return width * textsize ; + + if (textcolor == textbgcolor || textsize != 1) { + + for (int i = 0; i < height; i++) + { + if (textcolor != textbgcolor) fillRect(x, pY, width * textsize, textsize, textbgcolor); + + for (int k = 0; k < w; k++) + { + line = pgm_read_byte(flash_address + w * i + k); + if (line) { + if (textsize == 1) { + pX = x + k * 8; + if (line & 0x80) drawPixel(pX, pY, textcolor); + if (line & 0x40) drawPixel(pX + 1, pY, textcolor); + if (line & 0x20) drawPixel(pX + 2, pY, textcolor); + if (line & 0x10) drawPixel(pX + 3, pY, textcolor); + if (line & 0x08) drawPixel(pX + 4, pY, textcolor); + if (line & 0x04) drawPixel(pX + 5, pY, textcolor); + if (line & 0x02) drawPixel(pX + 6, pY, textcolor); + if (line & 0x01) drawPixel(pX + 7, pY, textcolor); + } + else { + pX = x + k * 8 * textsize; + if (line & 0x80) fillRect(pX, pY, textsize, textsize, textcolor); + if (line & 0x40) fillRect(pX + textsize, pY, textsize, textsize, textcolor); + if (line & 0x20) fillRect(pX + 2 * textsize, pY, textsize, textsize, textcolor); + if (line & 0x10) fillRect(pX + 3 * textsize, pY, textsize, textsize, textcolor); + if (line & 0x08) fillRect(pX + 4 * textsize, pY, textsize, textsize, textcolor); + if (line & 0x04) fillRect(pX + 5 * textsize, pY, textsize, textsize, textcolor); + if (line & 0x02) fillRect(pX + 6 * textsize, pY, textsize, textsize, textcolor); + if (line & 0x01) fillRect(pX + 7 * textsize, pY, textsize, textsize, textcolor); + } + } + } + pY += textsize; + } + } + else + // Faster drawing of characters and background using block write + { + spi_begin(); + setAddrWindow(x, y, (x + w * 8) - 1, y + height - 1); + + byte mask; + for (int i = 0; i < height; i++) + { + for (int k = 0; k < w; k++) + { + line = pgm_read_byte(flash_address + w * i + k); + pX = x + k * 8; + mask = 0x80; + while (mask) { + if (line & mask) { + _SPI->write16(textcolor); + } + else { + _SPI->write16(textbgcolor); + } + mask = mask >> 1; + } + } + pY += textsize; + } + + CS_H; + spi_end(); + } + } + + #ifdef LOAD_RLE + else + #endif +#endif //FONT2 + +#ifdef LOAD_RLE //674 bytes of code + // Font is not 2 and hence is RLE encoded + { + spi_begin(); + + w *= height; // Now w is total number of pixels in the character + if ((textsize != 1) || (textcolor == textbgcolor)) { + if (textcolor != textbgcolor) fillRect(x, pY, width * textsize, textsize * height, textbgcolor); + int px = 0, py = pY; // To hold character block start and end column and row values + int pc = 0; // Pixel count + byte np = textsize * textsize; // Number of pixels in a drawn pixel + + byte tnp = 0; // Temporary copy of np for while loop + byte ts = textsize - 1; // Temporary copy of textsize + // 16 bit pixel count so maximum font size is equivalent to 180x180 pixels in area + // w is total number of pixels to plot to fill character block + while (pc < w) + { + line = pgm_read_byte(flash_address); + flash_address++; // 20 bytes smaller by incrementing here + if (line & 0x80) { + line &= 0x7F; + line++; + if (ts) { + px = x + textsize * (pc % width); // Keep these px and py calculations outside the loop as they are slow + py = y + textsize * (pc / width); + } + else { + px = x + pc % width; // Keep these px and py calculations outside the loop as they are slow + py = y + pc / width; + } + while (line--) { // In this case the while(line--) is faster + pc++; // This is faster than putting pc+=line before while()? + setAddrWindow(px, py, px + ts, py + ts); + + if (ts) { + tnp = np; + while (tnp--) { + _SPI->write16(textcolor); + } + } + else { + _SPI->write16(textcolor); + } + px += textsize; + + if (px >= (x + width * textsize)) + { + px = x; + py += textsize; + } + } + } + else { + line++; + pc += line; + } + } + + CS_H; + spi_end(); + } + else // Text colour != background && textsize = 1 + // so use faster drawing of characters and background using block write + { + spi_begin(); + setAddrWindow(x, y, x + width - 1, y + height - 1); + + uint8_t textcolorBin[] = { (uint8_t) (textcolor >> 8), (uint8_t) textcolor }; + uint8_t textbgcolorBin[] = { (uint8_t) (textbgcolor >> 8), (uint8_t) textbgcolor }; + + // Maximum font size is equivalent to 180x180 pixels in area + while (w > 0) + { + line = pgm_read_byte(flash_address++); // 8 bytes smaller when incrementing here + if (line & 0x80) { + line &= 0x7F; + line++; w -= line; + while(line>32) { _SPI->writePattern(&textcolorBin[0], 2, 32); line-=32;} + _SPI->writePattern(&textcolorBin[0], 2, line); + } + else { + line++; w -= line; + while(line>32) { _SPI->writePattern(&textbgcolorBin[0], 2, 32); line-=32;} + _SPI->writePattern(&textbgcolorBin[0], 2, line); + } + } + CS_H; + spi_end(); + } + } + // End of RLE font rendering +#endif + return width * textsize; // x + +} + +/*************************************************************************************** +** Function name: drawString (with or without user defined font) +** Description : draw string with padding if it is defined +***************************************************************************************/ +// Without font number, uses font set by setTextFont() +int16_t TFT_ILI9341_ESP::drawString(const String& string, uint poX, uint poY) +{ + int16_t len = string.length() + 2; + char buffer[len]; + string.toCharArray(buffer, len); + return drawString(buffer, poX, poY, textfont); +} +// With font number +int16_t TFT_ILI9341_ESP::drawString(const String& string, uint poX, uint poY, int font) +{ + int16_t len = string.length() + 2; + char buffer[len]; + string.toCharArray(buffer, len); + return drawString(buffer, poX, poY, font); +} + +// Without font number, uses font set by setTextFont() +int16_t TFT_ILI9341_ESP::drawString(const char *string, uint poX, uint poY) +{ + return drawString(string, poX, poY, textfont); +} +// With font number +int16_t TFT_ILI9341_ESP::drawString(const char *string, uint poX, uint poY, int font) +{ + int16_t sumX = 0; + uint8_t padding = 1, baseline = 0; + uint16_t cwidth = textWidth(string, font); // Find the pixel width of the string in the font + uint16_t cheight = 0; + +#ifdef LOAD_GFXFF + if (font == 1) { + if(gfxFont) { + cheight = glyph_ab * textsize; + poY += cheight; // Adjust for baseline datum of free fonts + baseline = cheight; + padding =101; // Different padding method used for Free Fonts + + // We need to make an adjustment for the botom of the string (eg 'y' character) + if ((textdatum == BL_DATUM) || (textdatum == BC_DATUM) || (textdatum == BR_DATUM)) { + cheight += glyph_bb * textsize; + } + } + } +#endif + + if (textdatum || padX) + { + + // If it is not font 1 (GLCD or free font) get the basline and pixel height of the font + if (font!=1) { + baseline = pgm_read_byte( &fontdata[font].baseline ) * textsize; + cheight = fontHeight(font); + } + + switch(textdatum) { + case TC_DATUM: + poX -= cwidth/2; + padding += 1; + break; + case TR_DATUM: + poX -= cwidth; + padding += 2; + break; + case ML_DATUM: + poY -= cheight/2; + //padding += 0; + break; + case MC_DATUM: + poX -= cwidth/2; + poY -= cheight/2; + padding += 1; + break; + case MR_DATUM: + poX -= cwidth; + poY -= cheight/2; + padding += 2; + break; + case BL_DATUM: + poY -= cheight; + //padding += 0; + break; + case BC_DATUM: + poX -= cwidth/2; + poY -= cheight; + padding += 1; + break; + case BR_DATUM: + poX -= cwidth; + poY -= cheight; + padding += 2; + break; + case L_BASELINE: + poY -= baseline; + //padding += 0; + break; + case C_BASELINE: + poX -= cwidth/2; + poY -= baseline; + //padding += 1; + break; + case R_BASELINE: + poX -= cwidth; + poY -= baseline; + padding += 2; + break; + } + // Check coordinates are OK, adjust if not + if (poX < 0) poX = 0; + if (poX+cwidth>_width) poX = _width - cwidth; + if (poY < 0) poY = 0; + if (poY+cheight-baseline>_height) poY = _height - cheight; + } + +#ifdef LOAD_GFXFF + if ((font == 1) && (gfxFont) && (textcolor!=textbgcolor)) + { + cheight = (glyph_ab + glyph_bb) * textsize; + fillRect(poX, poY - glyph_ab * textsize, cwidth, cheight, textbgcolor); + padding -=100; + } +#endif + + while (*string) sumX += drawChar(*(string++), poX+sumX, poY, font); + +//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv DEBUG vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv +// Switch on debugging for the padding areas +//#define PADDING_DEBUG + +#ifndef PADDING_DEBUG +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ DEBUG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + if((padX>cwidth) && (textcolor!=textbgcolor)) + { + uint16_t padXc = poX+cwidth; +#ifdef LOAD_GFXFF + if ((font == 1) && (gfxFont)) + { + poY -= glyph_ab * textsize; + } +#endif + switch(padding) { + case 1: + fillRect(padXc,poY,padX-cwidth,cheight, textbgcolor); + break; + case 2: + fillRect(padXc,poY,(padX-cwidth)>>1,cheight, textbgcolor); + padXc = (padX-cwidth)>>1; + if (padXc>poX) padXc = poX; + fillRect(poX - padXc,poY,(padX-cwidth)>>1,cheight, textbgcolor); + break; + case 3: + if (padXc>padX) padXc = padX; + fillRect(poX + cwidth - padXc,poY,padXc-cwidth,cheight, textbgcolor); + break; + } + } + + +#else + +//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv DEBUG vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv +// This is debug code to show text (green box) and blanked (white box) areas +// It shows that the padding areas are being correctly sized and positioned + + if((padX>sumX) && (textcolor!=textbgcolor)) + { + int16_t padXc = poX+sumX; // Maximum left side padding +#ifdef LOAD_GFXFF + if ((font == 1) && (gfxFont)) poY -= glyph_ab; +#endif + drawRect(poX,poY,sumX,cheight, TFT_GREEN); + switch(padding) { + case 1: + drawRect(padXc,poY,padX-sumX,cheight, TFT_WHITE); + break; + case 2: + drawRect(padXc,poY,(padX-sumX)>>1, cheight, TFT_WHITE); + padXc = (padX-sumX)>>1; + if (padXc>poX) padXc = poX; + drawRect(poX - padXc,poY,(padX-sumX)>>1,cheight, TFT_WHITE); + break; + case 3: + if (padXc>padX) padXc = padX; + drawRect(poX + sumX - padXc,poY,padXc-sumX,cheight, TFT_WHITE); + break; + } + } +#endif +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ DEBUG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +return sumX; +} + +/*************************************************************************************** +** Function name: drawCentreString (deprecated, use setTextDatum()) +** Descriptions: draw string centred on dX +***************************************************************************************/ +int16_t TFT_ILI9341_ESP::drawCentreString(const String& string, int dX, int poY, int font) +{ + int16_t len = string.length() + 2; + char buffer[len]; + string.toCharArray(buffer, len); + return drawCentreString(buffer, dX, poY, font); +} + +int16_t TFT_ILI9341_ESP::drawCentreString(const char *string, int dX, int poY, int font) +{ + byte tempdatum = textdatum; + int sumX = 0; + textdatum = TC_DATUM; + sumX = drawString(string, dX, poY, font); + textdatum = tempdatum; + return sumX; +} + +/*************************************************************************************** +** Function name: drawRightString (deprecated, use setTextDatum()) +** Descriptions: draw string right justified to dX +***************************************************************************************/ +int16_t TFT_ILI9341_ESP::drawRightString(const String& string, int dX, int poY, int font) +{ + int16_t len = string.length() + 2; + char buffer[len]; + string.toCharArray(buffer, len); + return drawRightString(buffer, dX, poY, font); +} + +int16_t TFT_ILI9341_ESP::drawRightString(const char *string, int dX, int poY, int font) +{ + byte tempdatum = textdatum; + int16_t sumX = 0; + textdatum = TR_DATUM; + sumX = drawString(string, dX, poY, font); + textdatum = tempdatum; + return sumX; +} + +/*************************************************************************************** +** Function name: drawNumber +** Description: draw a long integer +***************************************************************************************/ +int16_t TFT_ILI9341_ESP::drawNumber(long long_num, int poX, int poY) +{ + char str[12]; + ltoa(long_num, str, 10); + return drawString(str, poX, poY, textfont); +} + +int16_t TFT_ILI9341_ESP::drawNumber(long long_num, int poX, int poY, int font) +{ + char str[12]; + ltoa(long_num, str, 10); + return drawString(str, poX, poY, font); +} + +/*************************************************************************************** +** Function name: drawFloat +** Descriptions: drawFloat, prints 7 non zero digits maximum +***************************************************************************************/ +// Assemble and print a string, this permits alignment relative to a datum +// looks complicated but much more compact and actually faster than using print class +int16_t TFT_ILI9341_ESP::drawFloat(float floatNumber, int dp, int poX, int poY) +{ + return drawFloat(floatNumber, dp, poX, poY, textfont); +} + +int16_t TFT_ILI9341_ESP::drawFloat(float floatNumber, int dp, int poX, int poY, int font) +{ + char str[14]; // Array to contain decimal string + uint8_t ptr = 0; // Initialise pointer for array + int8_t digits = 1; // Count the digits to avoid array overflow + float rounding = 0.5; // Round up down delta + + if (dp > 7) dp = 7; // Limit the size of decimal portion + + // Adjust the rounding value + for (uint8_t i = 0; i < dp; ++i) rounding /= 10.0; + + if (floatNumber < -rounding) // add sign, avoid adding - sign to 0.0! + { + str[ptr++] = '-'; // Negative number + str[ptr] = 0; // Put a null in the array as a precaution + digits = 0; // Set digits to 0 to compensate so pointer value can be used later + floatNumber = -floatNumber; // Make positive + } + + floatNumber += rounding; // Round up or down + + // For error put ... in string and return (all TFT_ILI9341_ESP library fonts contain . character) + if (floatNumber >= 2147483647) { + strcpy(str, "..."); + return drawString(str, poX, poY, font); + } + // No chance of overflow from here on + + // Get integer part + unsigned long temp = (unsigned long)floatNumber; + + // Put integer part into array + ltoa(temp, str + ptr, 10); + + // Find out where the null is to get the digit count loaded + while ((uint8_t)str[ptr] != 0) ptr++; // Move the pointer along + digits += ptr; // Count the digits + + str[ptr++] = '.'; // Add decimal point + str[ptr] = '0'; // Add a dummy zero + str[ptr + 1] = 0; // Add a null but don't increment pointer so it can be overwritten + + // Get the decimal portion + floatNumber = floatNumber - temp; + + // Get decimal digits one by one and put in array + // Limit digit count so we don't get a false sense of resolution + uint8_t i = 0; + while ((i < dp) && (digits < 9)) // while (i < dp) for no limit but array size must be increased + { + i++; + floatNumber *= 10; // for the next decimal + temp = floatNumber; // get the decimal + ltoa(temp, str + ptr, 10); + ptr++; digits++; // Increment pointer and digits count + floatNumber -= temp; // Remove that digit + } + + // Finally we can plot the string and return pixel length + return drawString(str, poX, poY, font); +} + +/*************************************************************************************** +** Function name: setFreeFont +** Descriptions: Sets the GFX free font to use +***************************************************************************************/ + +#ifdef LOAD_GFXFF + +void TFT_ILI9341_ESP::setFreeFont(const GFXfont *f) { + //textdatum = L_BASELINE; + textfont = 1; + gfxFont = (GFXfont *)f; + + // Save above baseline (for say H) and below baseline (for y tail) heights + uint16_t uniCode = FF_HEIGHT - pgm_read_byte(&gfxFont->first); + GFXglyph *glyph1 = &(((GFXglyph *)pgm_read_dword(&gfxFont->glyph))[uniCode]); + glyph_ab = -pgm_read_byte(&glyph1->yOffset); + + uniCode = FF_BOTTOM - pgm_read_byte(&gfxFont->first); + GFXglyph *glyph2 = &(((GFXglyph *)pgm_read_dword(&gfxFont->glyph))[uniCode]); + glyph_bb = pgm_read_byte(&glyph2->height) + (int8_t)pgm_read_byte(&glyph2->yOffset); +} + +/*************************************************************************************** +** Function name: setTextFont +** Description: Set the font for the print stream +***************************************************************************************/ +void TFT_ILI9341_ESP::setTextFont(uint8_t f) +{ + textfont = (f > 0) ? f : 1; // Don't allow font 0 + gfxFont = NULL; +} + +#else + +/*************************************************************************************** +** Function name: setFreeFont +** Descriptions: Sets the GFX free font to use +***************************************************************************************/ + +// Alternative to setTextFont() so we don't need two different named functions +void TFT_ILI9341_ESP::setFreeFont(uint8_t font) { + setTextFont(font); +} + +/*************************************************************************************** +** Function name: setTextFont +** Description: Set the font for the print stream +***************************************************************************************/ +void TFT_ILI9341_ESP::setTextFont(uint8_t f) +{ + textfont = (f > 0) ? f : 1; // Don't allow font 0 +} + +#endif + +/*************************************************** + The majority of code in this file is "FunWare", the only condition of use of + those portions is that users have fun! Most of the effort has been spent on + the creation and incorporation of the proportional Run Length Encoded fonts. + + Other portions of code are protected by the licenses as noted below. + + The library would not have been created without the initial inspiration from + Adafruit_ILI9341 and Adafruit_GFX libraries. + + + If any other conditions of use have been missed then please raise this as an + issue on GitHub: + ****************************************************/ + +/*************************************************** + The Adafruit_ILI9341 library has been used as a starting point + for this library. + + ORIGINAL LIBRARY HEADER + + This is our library for the Adafruit ILI9341 Breakout and Shield + ----> http://www.adafruit.com/products/1651 + + Check out the links above for our tutorials and wiring diagrams + These displays use SPI to communicate, 4 or 5 pins are required to + interface (RST is optional) + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Written by Limor Fried/Ladyada for Adafruit Industries. + MIT license, all text above must be included in any redistribution + + ****************************************************/ + + +/**************************************************** + + Some member funtions have been imported from the Adafruit_GFX + library. The license associated with these is reproduced below. + + ORIGINAL LIBRARY HEADER from Adafruit_GFX.cpp + + This is the core graphics library for all our displays, providing a common + set of graphics primitives (points, lines, circles, etc.). It needs to be + paired with a hardware-specific library for each display device we carry + (to handle the lower-level functions). + + Adafruit invests time and resources providing this open source code, please + support Adafruit & open-source hardware by purchasing products from Adafruit! + + Copyright (c) 2013 Adafruit Industries. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + ****************************************************/ + + +/**************************************************** + + In compliance with the licence.txt file for the Adafruit_GFX library the + following is included. + + Software License Agreement (BSD License) + + Copyright (c) 2012 Adafruit Industries. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + *****************************************************/ diff --git a/examples/demo-menu/src/TFT/TFT_ILI9341_ESP.h b/examples/demo-menu/src/TFT/TFT_ILI9341_ESP.h index 28d3197..f25320b 100644 --- a/examples/demo-menu/src/TFT/TFT_ILI9341_ESP.h +++ b/examples/demo-menu/src/TFT/TFT_ILI9341_ESP.h @@ -1,6 +1,6 @@ /*************************************************** Arduino TFT graphics library targetted at ESP8266 - based boards such as the NodeMCU. + based boards. (ESP32 support is planned!) This library has been derived from the Adafruit_GFX library and the associated driver library. See text @@ -65,11 +65,28 @@ #include -#ifdef USE_SPI9 -#include "SPI9.h" // addition JZ 27.12.2016 +#define USE_FAST_PINIO + +#if defined (ESP32) || defined (D0_USED_FOR_DC) + #define DC_C digitalWrite(TFT_DC, LOW) + #define DC_D digitalWrite(TFT_DC, HIGH) +#else + #define DC_C GPOC = dcpinmask + #define DC_D GPOS = dcpinmask #endif -#define USE_FAST_PINIO +#ifndef NO_PIN_USED_FOR_CS + #if defined (ESP32) || defined (D0_USED_FOR_CS) + #define CS_L digitalWrite(TFT_CS, LOW) + #define CS_H digitalWrite(TFT_CS, HIGH) + #else + #define CS_L GPOC = cspinmask + #define CS_H GPOS = cspinmask + #endif +#else + #define CS_L + #define CS_H +#endif // Swap any type template static inline void @@ -88,6 +105,9 @@ swap(T& a, T& b) { T t = a; a = b; b = t; } #define BL_DATUM 6 // Bottom left #define BC_DATUM 7 // Bottom centre #define BR_DATUM 8 // Bottom right +#define L_BASELINE 9 // Left character baseline (Line the 'A' character would sit on) +#define C_BASELINE 10 // Centre character baseline +#define R_BASELINE 11 // Right character baseline // Change the width and height if required (defined in portrait mode) @@ -131,6 +151,10 @@ swap(T& a, T& b) { T t = a; a = b; b = t; } #define ILI9341_VSCRSADD 0x37 #define ILI9341_PIXFMT 0x3A +#define ILI9341_WRDISBV 0x51 +#define ILI9341_RDDISBV 0x52 +#define ILI9341_WRCTRLD 0x53 + #define ILI9341_FRMCTR1 0xB1 #define ILI9341_FRMCTR2 0xB2 #define ILI9341_FRMCTR3 0xB3 @@ -145,10 +169,12 @@ swap(T& a, T& b) { T t = a; a = b; b = t; } #define ILI9341_VMCTR1 0xC5 #define ILI9341_VMCTR2 0xC7 +#define ILI9341_RDID4 0xD3 +#define ILI9341_RDINDEX 0xD9 #define ILI9341_RDID1 0xDA #define ILI9341_RDID2 0xDB #define ILI9341_RDID3 0xDC -#define ILI9341_RDID4 0xDD +#define ILI9341_RDIDX 0xDD // TBC #define ILI9341_GMCTRP1 0xE0 #define ILI9341_GMCTRN1 0xE1 @@ -203,56 +229,62 @@ swap(T& a, T& b) { T t = a; a = b; b = t; } #define ILI9341_GREENYELLOW 0xAFE5 /* 173, 255, 47 */ #define ILI9341_PINK 0xF81F +// This is a structure to conveniently hold infomation on the default fonts +// Stores pointer to font character image address table, width table and height + typedef struct { - const unsigned char *chartbl; - const unsigned char *widthtbl; - unsigned char height; + const uint8_t *chartbl; + const uint8_t *widthtbl; + uint8_t height; + uint8_t baseline; } fontinfo; -// This is a structure to conveniently hold infomation on the fonts -// Stores font character image address pointer, width table and height - +// Now fill the structure const PROGMEM fontinfo fontdata [] = { - { 0, 0, 0 }, + { 0, 0, 0, 0 }, - { 0, 0, 8 }, + // GLCD font (Font 1) does not have all parameters + { 0, 0, 8, 7 }, #ifdef LOAD_FONT2 - { (const unsigned char *)chrtbl_f16, widtbl_f16, chr_hgt_f16}, + { (const uint8_t *)chrtbl_f16, widtbl_f16, chr_hgt_f16, baseline_f16}, #else - { 0, 0, 0 }, + { 0, 0, 0, 0 }, #endif - { 0, 0, 0 }, + // Font 3 current unused + { 0, 0, 0, 0 }, #ifdef LOAD_FONT4 - { (const unsigned char *)chrtbl_f32, widtbl_f32, chr_hgt_f32}, + { (const uint8_t *)chrtbl_f32, widtbl_f32, chr_hgt_f32, baseline_f32}, #else - { 0, 0, 0 }, + { 0, 0, 0, 0 }, #endif - { 0, 0, 0 }, + // Font 5 current unused + { 0, 0, 0, 0 }, #ifdef LOAD_FONT6 - { (const unsigned char *)chrtbl_f64, widtbl_f64, chr_hgt_f64}, + { (const uint8_t *)chrtbl_f64, widtbl_f64, chr_hgt_f64, baseline_f64}, #else - { 0, 0, 0 }, + { 0, 0, 0, 0 }, #endif #ifdef LOAD_FONT7 - { (const unsigned char *)chrtbl_f7s, widtbl_f7s, chr_hgt_f7s}, + { (const uint8_t *)chrtbl_f7s, widtbl_f7s, chr_hgt_f7s, baseline_f7s}, #else - { 0, 0, 0 }, + { 0, 0, 0, 0 }, #endif #ifdef LOAD_FONT8 - { (const unsigned char *)chrtbl_f72, widtbl_f72, chr_hgt_f72} + { (const uint8_t *)chrtbl_f72, widtbl_f72, chr_hgt_f72, baseline_f72} #else - { 0, 0, 0 } + { 0, 0, 0, 0 } #endif }; + // Class functions and variables class TFT_ILI9341_ESP : public Print { @@ -260,49 +292,47 @@ class TFT_ILI9341_ESP : public Print { TFT_ILI9341_ESP(int16_t _W = ILI9341_TFTWIDTH, int16_t _H = ILI9341_TFTHEIGHT); - void init(void), begin(void), // Same - begin included for backwards compatibility + void init(void), begin(void); // Same - begin included for backwards compatibility - drawPixel(uint16_t x, uint16_t y, uint16_t color), - fastPixel(uint16_t x, uint16_t y, uint16_t color), - fastSetup(void), + void drawPixel(uint32_t x, uint32_t y, uint32_t color); - drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t font), + void drawChar(int32_t x, int32_t y, unsigned char c, uint32_t color, uint32_t bg, uint8_t font), setWindow(int16_t x0, int16_t y0, int16_t x1, int16_t y1), pushColor(uint16_t color), pushColor(uint16_t color, uint16_t len), pushColors(uint16_t *data, uint8_t len), - pushColors(uint8_t *data, uint16_t len), + pushColors(uint8_t *data, uint32_t len), - fillScreen(uint16_t color), + fillScreen(uint32_t color), writeEnd(void), backupSPCR(void), restoreSPCR(void), - drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color), - drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color), - drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color), + drawLine(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t color), + drawFastVLine(uint32_t x, uint32_t y, uint32_t h, uint32_t color), + drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color), - drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color), - fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color), - drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color), - fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color), + drawRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color), + fillRect(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t color), + drawRoundRect(int32_t x0, int32_t y0, int32_t w, int32_t h, int32_t radius, uint32_t color), + fillRoundRect(int32_t x0, int32_t y0, int32_t w, int32_t h, int32_t radius, uint32_t color), setRotation(uint8_t r), invertDisplay(boolean i), - drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color), - drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, uint16_t color), - fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color), - fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, int16_t delta, uint16_t color), + drawCircle(int32_t x0, int32_t y0, int32_t r, uint32_t color), + drawCircleHelper(int32_t x0, int32_t y0, int32_t r, uint8_t cornername, uint32_t color), + fillCircle(int32_t x0, int32_t y0, int32_t r, uint32_t color), + fillCircleHelper(int32_t x0, int32_t y0, int32_t r, uint8_t cornername, int32_t delta, uint32_t color), drawEllipse(int16_t x0, int16_t y0, int16_t rx, int16_t ry, uint16_t color), fillEllipse(int16_t x0, int16_t y0, int16_t rx, int16_t ry, uint16_t color), - drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color), - fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color), + drawTriangle(int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color), + fillTriangle(int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color), drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color), @@ -311,72 +341,121 @@ class TFT_ILI9341_ESP : public Print { setTextColor(uint16_t color), setTextColor(uint16_t fgcolor, uint16_t bgcolor), setTextSize(uint8_t size), - setTextFont(uint8_t font), + setTextWrap(boolean wrap), setTextDatum(uint8_t datum), setTextPadding(uint16_t x_width), +#ifdef LOAD_GFXFF + setFreeFont(const GFXfont *f = NULL), + setTextFont(uint8_t font), +#else + setFreeFont(uint8_t font), + setTextFont(uint8_t font), +#endif spiwrite(uint8_t), writecommand(uint8_t c), writedata(uint8_t d), commandList(const uint8_t *addr); + uint8_t readcommand8(uint8_t cmd_function, uint8_t index); + uint16_t readcommand16(uint8_t cmd_function, uint8_t index); + uint32_t readcommand32(uint8_t cmd_function, uint8_t index); + + // Read the colour of a pixel at x,y and return value in 565 format + uint16_t readPixel(int32_t x0, int32_t y0); + + // The next functions can be used as a pair to copy screen blocks (or horizontal/vertical lines) to another location + // Read a block of pixels to a data buffer, buffer is 16 bit and the array size must be at least w * h + void readRect(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h, uint16_t *data); + // Write a block of pixels to the screen + void pushRect(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h, uint16_t *data); + + // This next function has been used successfully to dump the TFT screen to a PC for documentation purposes + // It reads a screen area and returns the RGB 8 bit colour values of each pixel + // Set w and h to 1 to read 1 pixel's colour. The data buffer must be at least w * h * 3 bytes + void readRectRGB(int32_t x0, int32_t y0, int32_t w, int32_t h, uint8_t *data); + uint8_t getRotation(void); uint16_t fontsLoaded(void), color565(uint8_t r, uint8_t g, uint8_t b); int16_t drawChar(unsigned int uniCode, int x, int y, int font), + drawChar(unsigned int uniCode, int x, int y), drawNumber(long long_num,int poX, int poY, int font), + drawNumber(long long_num,int poX, int poY), drawFloat(float floatNumber,int decimal,int poX, int poY, int font), - - drawString(const char *string, int poX, int poY, int font), - drawCentreString(const char *string, int dX, int poY, int font), - drawRightString(const char *string, int dX, int poY, int font), - - height(void), + drawFloat(float floatNumber,int decimal,int poX, int poY), + + // Handle char arrays + drawString(const char *string, uint poX, uint poY, int font), + drawString(const char *string, uint poX, uint poY), + drawCentreString(const char *string, int dX, int poY, int font), // Deprecated, use setTextDatum() and drawString() + drawRightString(const char *string, int dX, int poY, int font), // Deprecated, use setTextDatum() and drawString() + + // Handle String type + drawString(const String& string, uint poX, uint poY, int font), + drawString(const String& string, uint poX, uint poY), + drawCentreString(const String& string, int dX, int poY, int font), // Deprecated, use setTextDatum() and drawString() + drawRightString(const String& string, int dX, int poY, int font); // Deprecated, use setTextDatum() and drawString() + + int16_t height(void), width(void), textWidth(const char *string, int font), - fontHeight(int font); + textWidth(const char *string), + textWidth(const String& string, int font), + textWidth(const String& string), + fontHeight(int16_t font); + + void setAddrWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1); virtual size_t write(uint8_t); private: -#ifdef USE_SPI9 - SPI9Class *_SPI; // addition JZ 27.12.2016 -#else - SPIClass *_SPI; -#endif - - void setAddrWindow(int16_t x0, int16_t y0, int16_t x1, int16_t y1); - uint8_t tabcolor; - - void spiWriteBytes(uint8_t * data, uint32_t size, uint32_t repeat=1); + + SPIClass *_SPI; inline void spi_begin() __attribute__((always_inline)); inline void spi_end() __attribute__((always_inline)); - volatile uint32_t *dcport, *rsport; - int32_t _dc; +void writeBytes_(uint8_t * data, uint8_t size); +inline void setDataBits(uint16_t bits); + + boolean hwSPI; + + volatile uint32_t *mosiport, *clkport, *dcport, *rsport, *csport; + int32_t _cs, _dc, _rst, _mosi, _miso, _sclk; uint32_t mosipinmask, clkpinmask, cspinmask, dcpinmask; uint8_t mySPCR, savedSPCR; + //uint8_t fifoBuffer[64]; + uint8_t colorBin[2]; + uint32_t lastColor = 0xFFFF; + protected: - int16_t cursor_x, cursor_y, win_xe, win_ye, padX; + uint32_t cursor_x, cursor_y, win_xe, win_ye, padX; - uint16_t _width, _height, // Display w/h as modified by current rotation + uint32_t _width, _height, // Display w/h as modified by current rotation textcolor, textbgcolor, fontsloaded, addr_row, addr_col; - uint8_t textfont, - textsize, - textdatum, - rotation; + uint8_t glyph_ab, // glyph height above baseline + glyph_bb, // glyph height below baseline + textfont, // Current selected font + textsize, // Current font size multiplier + textdatum, // Text reference datum + rotation; // Display rotation (0-3) boolean textwrap; // If set, 'wrap' text at right edge of display +#ifdef LOAD_GFXFF + GFXfont + *gfxFont; +#endif + }; #endif diff --git a/examples/demo-menu/src/TouchWrapper/TouchWrapper.cpp b/examples/demo-menu/src/TouchWrapper/TouchWrapper.cpp new file mode 100644 index 0000000..c3a5bd1 --- /dev/null +++ b/examples/demo-menu/src/TouchWrapper/TouchWrapper.cpp @@ -0,0 +1,52 @@ +#include "TouchWrapper.h" + +void TouchWrapper::init(bool debug) +{ + Serial.println("configuring touch"); + begin(); + + bTouchInt = false; + alreadyPoped = true; + + lastTouched = false; +} + +bool TouchWrapper::handleTouch(bool flag) +{ + currentTouch.eventTime = millis(); + bool touchFlag = touched(); + + if (touchFlag) + { + alreadyPoped = false; + + TS_Point p = getPoint(); + + currentTouch.x = 320 - ((p.x - 300) * 10 / 115); // * xCompensationA / mul + xCompensationB; + currentTouch.y = (p.y - 300) * 10 / 154; // * yCompensationA / mul + yCompensationB; + + if (!lastTouched) + { + currentTouch.event = pushTs; + //Serial.printf(F_WRP("push x: %d; y: %d; m: %d;\n"), currentTouch.x, currentTouch.y, currentTouch.eventTime); + } + else + { + currentTouch.event = updateTs; + //Serial.printf(F_WRP("upd x: %d; y: %d; m: %d;\n"), currentTouch.x, currentTouch.y, currentTouch.eventTime); + } + bWindowManagerCheckTouchScreenEvent((xTouchEvent *)¤tTouch); + } + else if (!alreadyPoped) + { + currentTouch.event = popTs; + alreadyPoped = true; + Serial.printf(F_WRP("pop x: %d; y: %d; m: %d;\n"), currentTouch.x, currentTouch.y, currentTouch.eventTime); + bWindowManagerCheckTouchScreenEvent((xTouchEvent *)¤tTouch); + } + + bTouchInt = false; + lastTouched = touchFlag; + + return touchFlag; +} diff --git a/examples/demo-menu/src/TouchWrapper/TouchWrapper.h b/examples/demo-menu/src/TouchWrapper/TouchWrapper.h new file mode 100644 index 0000000..8f60d15 --- /dev/null +++ b/examples/demo-menu/src/TouchWrapper/TouchWrapper.h @@ -0,0 +1,20 @@ +#pragma once + +#include + +#include "../../emGUIGlue.h" +#include "../../User_Setup.h" + +class TouchWrapper : XPT2046_Touchscreen { +public: + TouchWrapper() : XPT2046_Touchscreen(TOUCH_CS) {} + + void init(bool debug = false); + bool handleTouch(bool flag); + +protected: + volatile xTouchEvent currentTouch; + volatile bool bTouchInt = false; + bool alreadyPoped = true; + bool lastTouched = false; +}; diff --git a/examples/demo-menu/src/UTF8-fonts/MyriadPro_Bold9pt8b.h b/examples/demo-menu/src/UTF8-fonts/MyriadPro_Bold9pt8b.h new file mode 100644 index 0000000..32d8096 --- /dev/null +++ b/examples/demo-menu/src/UTF8-fonts/MyriadPro_Bold9pt8b.h @@ -0,0 +1,190 @@ +const uint8_t MyriadPro_Bold9pt8bBitmaps[] PROGMEM = { + 0x66, 0x6E, 0x00, 0xFE, 0xFE, 0xE0, 0xE0, 0xE0, 0xFE, 0xFE, 0xE0, 0xE0, + 0xE0, 0xFF, 0xFF, 0xFF, 0xCF, 0xFC, 0x1C, 0x01, 0xC0, 0x1F, 0xC1, 0xFE, + 0x1C, 0xF1, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x01, 0xE0, 0x1C, + 0x01, 0x00, 0x1C, 0x30, 0x07, 0xFF, 0xFC, 0x38, 0x70, 0xE1, 0xC3, 0x87, + 0x0E, 0x1C, 0x38, 0x00, 0x1F, 0x9F, 0xDC, 0x1C, 0x0E, 0x07, 0xFB, 0xFD, + 0xC0, 0xE0, 0x38, 0x1F, 0xE3, 0xF0, 0x3E, 0x7E, 0xE2, 0xE0, 0xF0, 0x7C, + 0x3E, 0x0F, 0x07, 0x87, 0xFE, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x6C, + 0xD8, 0x01, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, + 0x00, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x7F, 0xBC, 0x3F, 0xC0, + 0x3F, 0xC0, 0x39, 0xC0, 0x39, 0xC0, 0x39, 0xFC, 0x39, 0xFE, 0x39, 0xC7, + 0x39, 0xC7, 0x31, 0xC7, 0x71, 0xC7, 0xF1, 0xFE, 0xC1, 0xF8, 0xE3, 0x81, + 0xC7, 0x03, 0x8E, 0x07, 0x1C, 0x0E, 0x3F, 0x9F, 0xFF, 0xBF, 0xE3, 0xF1, + 0xC7, 0xE3, 0x8F, 0xC7, 0x1F, 0x8F, 0xF7, 0x1F, 0xC0, 0xFF, 0xCF, 0xFC, + 0x1C, 0x01, 0xC0, 0x1F, 0xC1, 0xFE, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, + 0x1C, 0x71, 0xC7, 0x0E, 0x07, 0x00, 0x03, 0x8E, 0xE7, 0x39, 0xCE, 0xE3, + 0xF0, 0xFC, 0x3F, 0x8E, 0x73, 0x9C, 0xE3, 0xB8, 0xEE, 0x38, 0xFF, 0xE0, + 0xF8, 0xB4, 0x59, 0x4C, 0x46, 0x23, 0x29, 0xA2, 0xF1, 0x70, 0x7F, 0xF0, + 0x13, 0x07, 0x80, 0x03, 0x87, 0x71, 0xDC, 0x63, 0x98, 0xEE, 0x1B, 0x07, + 0xC0, 0xE0, 0x38, 0x1E, 0x0F, 0x07, 0x80, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, + 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7F, 0xFF, 0xFF, 0x0C, 0x03, + 0x00, 0xC0, 0x0F, 0x03, 0xE0, 0x6C, 0x0D, 0xC1, 0xB8, 0x73, 0x0C, 0x61, + 0xFE, 0x7F, 0xCE, 0x39, 0xC3, 0xF0, 0x70, 0xFF, 0x7F, 0xB8, 0x1C, 0x0F, + 0xE7, 0xFB, 0x9F, 0xC7, 0xE3, 0xF3, 0xFF, 0xDF, 0x80, 0xFE, 0x7F, 0xB8, + 0xFC, 0x7E, 0x77, 0xF3, 0xFD, 0xC7, 0xE3, 0xF1, 0xFF, 0xDF, 0xC0, 0xFF, + 0xFF, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x00, 0x1F, 0xE1, + 0xFE, 0x18, 0xE1, 0x8E, 0x18, 0xE1, 0x8E, 0x18, 0xE3, 0x8E, 0x38, 0xE7, + 0x0E, 0xFF, 0xFF, 0xFF, 0xC0, 0x7C, 0x03, 0xC0, 0x30, 0xFE, 0xFE, 0xE0, + 0xE0, 0xE0, 0xFE, 0xFE, 0xE0, 0xE0, 0xE0, 0xFF, 0xFF, 0xF3, 0x8E, 0xE7, + 0x38, 0xEE, 0x60, 0xDD, 0xC1, 0xFB, 0x01, 0xFE, 0x0F, 0xFE, 0x1D, 0xCE, + 0x73, 0x9C, 0xE7, 0x1D, 0x8E, 0x3F, 0x1C, 0x70, 0x7C, 0xFE, 0x8F, 0x07, + 0x0E, 0x3C, 0x3E, 0x07, 0x07, 0x8F, 0xFE, 0xFC, 0xE1, 0xF8, 0xFE, 0x3F, + 0x9F, 0xE6, 0xFB, 0xBE, 0xCF, 0xF3, 0xF9, 0xFE, 0x7F, 0x1F, 0x87, 0x13, + 0x07, 0x80, 0x03, 0x87, 0xE3, 0xF8, 0xFE, 0x7F, 0x9B, 0xEE, 0xFB, 0x3F, + 0xCF, 0xE7, 0xF9, 0xFC, 0x7E, 0x1C, 0xE3, 0xB9, 0xCE, 0x73, 0xB8, 0xFC, + 0x3F, 0x0F, 0xE3, 0x9C, 0xE7, 0x38, 0xEE, 0x3B, 0x8E, 0x3F, 0xCF, 0xF3, + 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xDC, 0x7F, 0x1F, 0x07, + 0x70, 0x73, 0xC7, 0xBE, 0x3D, 0xF1, 0xFF, 0xDF, 0xFE, 0xDF, 0xB6, 0xFD, + 0xB7, 0xEF, 0x3E, 0x39, 0xF1, 0xCF, 0x8C, 0x70, 0xE1, 0xF8, 0x7E, 0x1F, + 0x87, 0xE1, 0xFF, 0xFF, 0xFF, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0x1F, + 0x0F, 0xF1, 0xC7, 0x70, 0x7E, 0x0F, 0x81, 0xF0, 0x3F, 0x07, 0xE0, 0xEE, + 0x39, 0xFE, 0x0F, 0x80, 0xFF, 0xFF, 0xFE, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, + 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xFE, 0x7F, 0xB9, 0xDC, 0x7E, + 0x3F, 0x3B, 0xFD, 0xF8, 0xE0, 0x70, 0x38, 0x1C, 0x00, 0x1F, 0x9F, 0xDE, + 0x3C, 0x0E, 0x06, 0x03, 0x01, 0xC0, 0xE0, 0x3C, 0x1F, 0xE3, 0xF0, 0xFF, + 0xFF, 0xC7, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, + 0x80, 0xE1, 0xDC, 0x77, 0x18, 0xE6, 0x3B, 0x86, 0xC1, 0xF0, 0x38, 0x0E, + 0x07, 0x83, 0xC1, 0xE0, 0x06, 0x01, 0xF8, 0x7F, 0xEE, 0x67, 0xE6, 0x7C, + 0x63, 0xC6, 0x3C, 0x67, 0xE6, 0x7F, 0x6F, 0x7F, 0xE1, 0xF8, 0x06, 0x00, + 0x71, 0xCE, 0x30, 0xEE, 0x1D, 0x81, 0xF0, 0x3C, 0x07, 0x80, 0xF8, 0x3B, + 0x86, 0x71, 0xC7, 0x38, 0xE0, 0xE1, 0xDC, 0x3B, 0x87, 0x70, 0xEE, 0x1D, + 0xC3, 0xB8, 0x77, 0x0E, 0xE1, 0xDC, 0x3B, 0xFF, 0xFF, 0xF0, 0x06, 0x00, + 0xC0, 0x18, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x3F, 0x1D, 0xFE, 0x7F, 0x03, + 0x81, 0xC0, 0xE0, 0x70, 0xE3, 0x1F, 0x8C, 0x7E, 0x31, 0xF8, 0xC7, 0xE3, + 0x1F, 0x8C, 0x7E, 0x31, 0xF8, 0xC7, 0xE3, 0x1F, 0x8C, 0x7F, 0xFF, 0xFF, + 0xFF, 0xE3, 0x1D, 0xC6, 0x3B, 0x8C, 0x77, 0x18, 0xEE, 0x31, 0xDC, 0x63, + 0xB8, 0xC7, 0x71, 0x8E, 0xE3, 0x1D, 0xC6, 0x3B, 0xFF, 0xFF, 0xFF, 0xF0, + 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0xFC, 0x0F, 0xC0, 0x1C, 0x01, 0xC0, + 0x1F, 0xC1, 0xFE, 0x1C, 0xF1, 0xC7, 0x1C, 0x71, 0xCF, 0x1F, 0xE1, 0xF8, + 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7F, 0xE3, 0xFF, 0x9F, 0x9E, 0xFC, + 0x77, 0xE3, 0xBF, 0x3D, 0xFF, 0xCF, 0xF8, 0x70, 0xE0, 0x70, 0x38, 0x1C, + 0x0F, 0xE7, 0xFB, 0x9F, 0xC7, 0xE3, 0xF1, 0xFF, 0xDF, 0x80, 0x7C, 0x1F, + 0xC4, 0x78, 0x0E, 0x01, 0xCF, 0xF3, 0xFC, 0x07, 0x03, 0x81, 0xE7, 0xF1, + 0xF0, 0xE1, 0xF1, 0xC7, 0xF3, 0x9C, 0x77, 0x30, 0xEE, 0xE0, 0xFF, 0xC1, + 0xFF, 0x83, 0xF7, 0x07, 0xE6, 0x1D, 0xCE, 0x3B, 0x8F, 0xE7, 0x0F, 0x80, + 0x1F, 0x9F, 0xDC, 0x6E, 0x37, 0x19, 0xFC, 0x7E, 0x73, 0x71, 0xB8, 0xDC, + 0x7C, 0x30, 0x7D, 0xFC, 0x39, 0xFF, 0xF8, 0xF3, 0xFF, 0x76, 0x0F, 0x1F, + 0x9E, 0x1C, 0x0D, 0xE7, 0xFB, 0x9D, 0x87, 0xC3, 0xF1, 0xB9, 0xCF, 0xE3, + 0xC0, 0xFE, 0xFF, 0xE7, 0xFE, 0xFE, 0xE7, 0xE7, 0xFF, 0xFC, 0xFF, 0xFE, + 0x38, 0xE3, 0x8E, 0x38, 0xE0, 0x3F, 0x8F, 0xE3, 0xB8, 0xEE, 0x33, 0x8C, + 0xE7, 0x3B, 0xFF, 0xFF, 0xF0, 0x3C, 0x0F, 0x03, 0x3C, 0x7E, 0xC7, 0xFF, + 0xFF, 0xC0, 0xE0, 0x7E, 0x3E, 0xE7, 0x3B, 0xBB, 0x8D, 0xD8, 0x7F, 0xC3, + 0xFE, 0x3F, 0xF9, 0xDD, 0xCC, 0xE6, 0xE7, 0x38, 0x7E, 0x7F, 0x07, 0x3E, + 0x3E, 0x07, 0x07, 0x7F, 0x7C, 0xE7, 0xE7, 0xEF, 0xEF, 0xFB, 0xFB, 0xD3, + 0xF3, 0xF3, 0x36, 0x1C, 0x00, 0xE7, 0xE7, 0xEF, 0xEF, 0xFB, 0xFB, 0xD3, + 0xF3, 0xF3, 0xE7, 0xEE, 0xEC, 0xFC, 0xFC, 0xFE, 0xEE, 0xE7, 0xE7, 0x3F, + 0x9F, 0xCC, 0xE6, 0x73, 0x3B, 0x9D, 0xCF, 0xC7, 0xC3, 0x80, 0xF1, 0xDE, + 0x3B, 0x4F, 0xED, 0xFD, 0xAF, 0xBD, 0xF3, 0xBE, 0x77, 0xCC, 0xE0, 0xE7, + 0xE7, 0xE7, 0xFF, 0xFF, 0xE7, 0xE7, 0xE7, 0xE7, 0x3C, 0x3F, 0xB9, 0xD8, + 0x7C, 0x3E, 0x1B, 0x9C, 0xFE, 0x3C, 0x00, 0xFF, 0xFF, 0xE7, 0xE7, 0xE7, + 0xE7, 0xE7, 0xE7, 0xE7, 0xDE, 0x7F, 0xB9, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, + 0xFE, 0xFE, 0x70, 0x38, 0x1C, 0x0E, 0x00, 0x3E, 0xFB, 0x86, 0x0C, 0x18, + 0x38, 0x3E, 0x3E, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0xE3, 0xB9, 0xDC, 0xCE, 0xE3, 0x71, 0xF0, 0x78, 0x38, 0x1C, 0x0E, 0x1E, + 0x0E, 0x00, 0x00, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x03, 0xF0, 0xFF, 0xBB, + 0xBE, 0x77, 0xCE, 0xF9, 0xDF, 0xBB, 0xBF, 0xE3, 0xF8, 0x1C, 0x03, 0x80, + 0x70, 0x0E, 0x00, 0xE3, 0xBB, 0x8D, 0x87, 0xC1, 0xC1, 0xF0, 0xDC, 0xEE, + 0xE3, 0x80, 0xE7, 0x73, 0xB9, 0xDC, 0xEE, 0x77, 0x3B, 0x9D, 0xFF, 0xFF, + 0x80, 0xC0, 0x60, 0x30, 0xE7, 0xE7, 0xE7, 0xE7, 0xFF, 0x7F, 0x07, 0x07, + 0x07, 0xE6, 0x3E, 0x63, 0xE6, 0x3E, 0x63, 0xE6, 0x3E, 0x63, 0xE6, 0x3F, + 0xFF, 0xFF, 0xF0, 0xE6, 0x37, 0x31, 0xB9, 0x8D, 0xCC, 0x6E, 0x63, 0x73, + 0x1B, 0x98, 0xDF, 0xFF, 0xFF, 0xF8, 0x00, 0xC0, 0x06, 0x00, 0x30, 0xF8, + 0x1F, 0x00, 0x60, 0x0F, 0xC1, 0xFE, 0x31, 0xC6, 0x38, 0xFE, 0x1F, 0x80, + 0xE0, 0x7E, 0x07, 0xFC, 0x7F, 0xE7, 0xE7, 0x7E, 0x77, 0xE7, 0x7F, 0xE7, + 0xFC, 0x70, 0xE0, 0xE0, 0xFC, 0xFF, 0xE7, 0xE3, 0xE7, 0xFF, 0xFC, 0x7C, + 0x7E, 0x07, 0x7F, 0x7F, 0x07, 0x0E, 0x7E, 0x7C, 0xE3, 0xCE, 0x7E, 0xEE, + 0x7F, 0xC7, 0xFC, 0x7E, 0xC7, 0xEE, 0x7E, 0x7E, 0xE3, 0xC0, 0x3F, 0xBF, + 0xDC, 0xEE, 0x73, 0xF9, 0xFD, 0xCE, 0xE7, 0xE3, 0x80, 0xFF, 0xE0, 0xF8, + 0xB4, 0x59, 0x4C, 0x46, 0x23, 0x29, 0xA2, 0xF1, 0x70, 0x7F, 0xF0, 0x66, + 0x66, 0x00, 0x3C, 0x7E, 0xC7, 0xFF, 0xFF, 0xC0, 0xE0, 0x7E, 0x3E }; + +const GFXglyph MyriadPro_Bold9pt8bGlyphs[] PROGMEM = { + { 0, 8, 15, 9, 1, -14 }, // 0x401 + { 15, 12, 15, 13, 0, -11 }, // 0x402 + { 38, 7, 15, 9, 1, -14 }, // 0x403 + { 52, 9, 12, 10, 1, -11 }, // 0x404 + { 66, 8, 12, 10, 1, -11 }, // 0x405 + { 78, 3, 12, 5, 1, -11 }, // 0x406 + { 83, 7, 15, 5, -1, -14 }, // 0x407 + { 97, 6, 12, 7, 0, -11 }, // 0x408 + { 106, 16, 12, 17, 0, -11 }, // 0x409 + { 130, 15, 12, 17, 1, -11 }, // 0x40A + { 153, 12, 12, 13, 0, -11 }, // 0x40B + { 171, 10, 15, 11, 1, -14 }, // 0x40C + { 190, 9, 12, 9, 0, -11 }, // 0x40D + { 204, 10, 15, 10, 0, -14 }, // 0x40E + { 223, 10, 15, 12, 1, -11 }, // 0x40F + { 242, 11, 12, 12, 0, -11 }, // 0x410 + { 259, 9, 12, 11, 1, -11 }, // 0x411 + { 273, 9, 12, 11, 1, -11 }, // 0x412 + { 287, 7, 12, 9, 1, -11 }, // 0x413 + { 298, 12, 15, 12, 0, -11 }, // 0x414 + { 321, 8, 12, 9, 1, -11 }, // 0x415 + { 333, 15, 12, 15, 0, -11 }, // 0x416 + { 356, 8, 12, 10, 1, -11 }, // 0x417 + { 368, 10, 12, 12, 1, -11 }, // 0x418 + { 383, 10, 15, 12, 1, -14 }, // 0x419 + { 402, 10, 12, 11, 1, -11 }, // 0x41A + { 417, 10, 12, 11, 0, -11 }, // 0x41B + { 432, 13, 12, 15, 1, -11 }, // 0x41C + { 452, 10, 12, 12, 1, -11 }, // 0x41D + { 467, 11, 12, 13, 1, -11 }, // 0x41E + { 484, 10, 12, 12, 1, -11 }, // 0x41F + { 499, 9, 12, 10, 1, -11 }, // 0x420 + { 513, 9, 12, 10, 1, -11 }, // 0x421 + { 527, 9, 12, 10, 0, -11 }, // 0x422 + { 541, 10, 12, 10, 0, -11 }, // 0x423 + { 556, 12, 13, 14, 1, -11 }, // 0x424 + { 576, 11, 12, 11, 0, -11 }, // 0x425 + { 593, 11, 15, 12, 1, -11 }, // 0x426 + { 614, 9, 12, 11, 1, -11 }, // 0x427 + { 628, 14, 12, 16, 1, -11 }, // 0x428 + { 649, 15, 15, 16, 1, -11 }, // 0x429 + { 678, 12, 12, 12, 0, -11 }, // 0x42A + { 696, 13, 12, 15, 1, -11 }, // 0x42B + { 716, 9, 12, 11, 1, -11 }, // 0x42C + { 730, 10, 12, 10, 0, -11 }, // 0x42D + { 745, 15, 12, 16, 1, -11 }, // 0x42E + { 768, 9, 12, 11, 0, -11 }, // 0x42F + { 782, 7, 9, 9, 1, -8 }, // 0x430 + { 790, 9, 13, 10, 1, -12 }, // 0x431 + { 805, 8, 9, 10, 1, -8 }, // 0x432 + { 814, 6, 9, 7, 1, -8 }, // 0x433 + { 821, 10, 12, 10, 0, -8 }, // 0x434 + { 836, 8, 9, 9, 1, -8 }, // 0x435 + { 845, 13, 9, 13, 0, -8 }, // 0x436 + { 860, 8, 9, 9, 0, -8 }, // 0x437 + { 869, 8, 9, 11, 1, -8 }, // 0x438 + { 878, 8, 12, 11, 1, -11 }, // 0x439 + { 890, 8, 9, 9, 1, -8 }, // 0x43A + { 899, 9, 9, 10, 0, -8 }, // 0x43B + { 910, 11, 9, 13, 1, -8 }, // 0x43C + { 923, 8, 9, 10, 1, -8 }, // 0x43D + { 932, 9, 9, 10, 1, -8 }, // 0x43E + { 943, 8, 9, 10, 1, -8 }, // 0x43F + { 952, 9, 13, 11, 1, -8 }, // 0x440 + { 967, 7, 9, 8, 1, -8 }, // 0x441 + { 975, 8, 9, 8, 0, -8 }, // 0x442 + { 984, 9, 13, 9, 0, -8 }, // 0x443 + { 999, 11, 17, 13, 1, -12 }, // 0x444 + { 1023, 9, 9, 9, 0, -8 }, // 0x445 + { 1034, 9, 12, 10, 1, -8 }, // 0x446 + { 1048, 8, 9, 10, 1, -8 }, // 0x447 + { 1057, 12, 9, 14, 1, -8 }, // 0x448 + { 1071, 13, 12, 15, 1, -8 }, // 0x449 + { 1091, 11, 9, 11, 0, -8 }, // 0x44A + { 1104, 12, 9, 14, 1, -8 }, // 0x44B + { 1118, 8, 9, 10, 1, -8 }, // 0x44C + { 1127, 8, 9, 9, 0, -8 }, // 0x44D + { 1136, 12, 9, 14, 1, -8 }, // 0x44E + { 1150, 9, 9, 10, 0, -8 }, // 0x44F + { 1161, 9, 12, 9, 0, -11 }, // 0x450 + { 1175, 8, 12, 9, 1, -11 } }; // 0x451 + +const GFXfont MyriadPro_Bold9pt8b PROGMEM = { + (uint8_t *)MyriadPro_Bold9pt8bBitmaps, + (GFXglyph *)MyriadPro_Bold9pt8bGlyphs, + 0x401, 0x451, 21 }; + +// Approx. 1761 bytes diff --git a/examples/demo-menu/src/UTF8-fonts/MyriadPro_Regular12pt8b.h b/examples/demo-menu/src/UTF8-fonts/MyriadPro_Regular12pt8b.h new file mode 100644 index 0000000..ec0bfe6 --- /dev/null +++ b/examples/demo-menu/src/UTF8-fonts/MyriadPro_Regular12pt8b.h @@ -0,0 +1,244 @@ +const uint8_t MyriadPro_Regular12pt8bBitmaps[] PROGMEM = { + 0x66, 0x33, 0x00, 0x1F, 0xEF, 0xF6, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x3F, + 0xDF, 0xEC, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x7F, 0xFF, 0xE0, 0xFF, 0xF1, + 0xFF, 0xE0, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x8C, 0x03, 0xFE, 0x07, + 0x0E, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x38, 0x60, 0x30, 0xC0, 0x61, 0x81, + 0xC3, 0x03, 0x06, 0x06, 0x00, 0x18, 0x00, 0xE0, 0x01, 0x80, 0x0E, 0x0C, + 0x18, 0x00, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x07, 0xF1, 0xFE, 0x38, 0x07, 0x00, + 0x60, 0x0C, 0x00, 0xC0, 0x0F, 0xFC, 0xFF, 0xCC, 0x00, 0xC0, 0x0E, 0x00, + 0x70, 0x03, 0x80, 0x1F, 0xF0, 0x7E, 0x1F, 0x9F, 0xE6, 0x03, 0x00, 0xC0, + 0x18, 0x07, 0x00, 0xF8, 0x0F, 0x00, 0xE0, 0x18, 0x07, 0x01, 0xA0, 0x6F, + 0xF1, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, 0xCC, 0x00, 0xC1, 0x83, 0x06, + 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x06, + 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x61, 0xFF, + 0x7C, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x18, 0x30, 0x01, 0x83, 0x00, 0x18, + 0x30, 0x01, 0x83, 0x00, 0x18, 0x3F, 0x81, 0x83, 0xFC, 0x18, 0x30, 0xE1, + 0x83, 0x07, 0x18, 0x30, 0x31, 0x83, 0x03, 0x30, 0x30, 0x73, 0x03, 0x0E, + 0xE0, 0x3F, 0xCC, 0x03, 0xF0, 0xC0, 0xC0, 0x30, 0x30, 0x0C, 0x0C, 0x03, + 0x03, 0x00, 0xC0, 0xC0, 0x30, 0x30, 0x0F, 0xFF, 0xE3, 0xFF, 0xFE, 0xC0, + 0xC1, 0xF0, 0x30, 0x3C, 0x0C, 0x0F, 0x03, 0x03, 0xC0, 0xC0, 0xF0, 0x30, + 0x6C, 0x0F, 0xFB, 0x03, 0xF8, 0xFF, 0xF3, 0xFF, 0xC0, 0xC0, 0x03, 0x00, + 0x0C, 0x00, 0x31, 0x80, 0xFF, 0x83, 0x87, 0x0C, 0x0C, 0x30, 0x30, 0xC0, + 0xC3, 0x03, 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3, 0x03, 0x07, 0x01, 0xC0, + 0x30, 0x00, 0x0C, 0x1D, 0x83, 0x30, 0xC6, 0x30, 0xCE, 0x19, 0x83, 0x60, + 0x7C, 0x0F, 0xE1, 0x8E, 0x30, 0xC6, 0x0C, 0xC1, 0x98, 0x3B, 0x03, 0x60, + 0x60, 0xFF, 0xFC, 0x03, 0xE0, 0x5B, 0x0D, 0x91, 0x98, 0x91, 0x8F, 0x18, + 0x61, 0x86, 0x18, 0xB1, 0x99, 0x19, 0x09, 0xA0, 0xDE, 0x05, 0xC0, 0x3F, + 0xFF, 0x19, 0x80, 0xF0, 0x00, 0x0E, 0x03, 0x60, 0x37, 0x06, 0x30, 0x63, + 0x0C, 0x18, 0xC1, 0x8C, 0x0D, 0x80, 0xD8, 0x07, 0x00, 0x70, 0x07, 0x00, + 0x60, 0x0C, 0x07, 0xC0, 0x70, 0x00, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, + 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, + 0x80, 0xFF, 0xFF, 0xFF, 0x0C, 0x01, 0x80, 0x10, 0x02, 0x00, 0x07, 0x00, + 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x0C, 0xC0, 0x63, 0x06, 0x18, 0x30, + 0xC1, 0xFF, 0x1F, 0xF8, 0xC0, 0xC6, 0x07, 0x70, 0x1B, 0x00, 0xD8, 0x07, + 0xFF, 0xBF, 0xEC, 0x03, 0x00, 0xC0, 0x30, 0x0F, 0xE3, 0xFC, 0xC1, 0xB0, + 0x7C, 0x0F, 0x03, 0xC1, 0xF0, 0x6F, 0xF3, 0xF0, 0xFE, 0x3F, 0xCC, 0x3B, + 0x06, 0xC1, 0xB0, 0x6C, 0x33, 0xF8, 0xFF, 0x30, 0x6C, 0x1F, 0x03, 0xC1, + 0xF0, 0x6F, 0xF3, 0xF8, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0F, 0xF8, 0x3F, 0xE0, + 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x08, 0x18, + 0x60, 0x61, 0x81, 0x86, 0x06, 0x30, 0x18, 0xC0, 0x6F, 0xFF, 0xFF, 0xFF, + 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xFF, 0x7F, 0xB0, 0x18, 0x0C, + 0x06, 0x03, 0x01, 0xFE, 0xFF, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0xFF, + 0xFF, 0x60, 0xC0, 0xC6, 0x18, 0x30, 0xE3, 0x0C, 0x0C, 0x63, 0x80, 0xCC, + 0x60, 0x0D, 0x98, 0x00, 0xB6, 0x00, 0x3F, 0xE0, 0x1F, 0xFE, 0x03, 0x18, + 0x60, 0xC3, 0x0E, 0x18, 0x60, 0xC3, 0x0C, 0x18, 0xC1, 0x81, 0x98, 0x30, + 0x37, 0x06, 0x06, 0x3E, 0x3F, 0xC0, 0x38, 0x06, 0x01, 0x80, 0xE0, 0x70, + 0xF0, 0x3F, 0x00, 0xE0, 0x18, 0x07, 0x01, 0xC0, 0x6F, 0xF1, 0xF8, 0xC0, + 0x7C, 0x07, 0xC0, 0xFC, 0x1B, 0xC1, 0xBC, 0x33, 0xC3, 0x3C, 0x63, 0xCE, + 0x3C, 0xC3, 0xD8, 0x3D, 0x83, 0xF0, 0x3F, 0x03, 0xE0, 0x3C, 0x03, 0x19, + 0x80, 0xF0, 0x00, 0x0C, 0x07, 0xC0, 0x7C, 0x0F, 0xC1, 0xBC, 0x1B, 0xC3, + 0x3C, 0x33, 0xC6, 0x3C, 0xE3, 0xCC, 0x3D, 0x83, 0xD8, 0x3F, 0x03, 0xF0, + 0x3E, 0x03, 0xC0, 0x30, 0xC1, 0xD8, 0x33, 0x0C, 0x63, 0x0C, 0xE1, 0x98, + 0x36, 0x07, 0xC0, 0xFE, 0x18, 0xE3, 0x0C, 0x60, 0xCC, 0x19, 0x83, 0xB0, + 0x36, 0x06, 0x1F, 0xF1, 0xFF, 0x18, 0x31, 0x83, 0x18, 0x31, 0x83, 0x18, + 0x31, 0x83, 0x18, 0x31, 0x83, 0x18, 0x31, 0x83, 0x30, 0x33, 0x03, 0xE0, + 0x3C, 0x03, 0x70, 0x07, 0x3C, 0x07, 0x9E, 0x03, 0xCF, 0x01, 0x66, 0xC1, + 0xB3, 0x60, 0xD9, 0xB0, 0x4C, 0xCC, 0x66, 0x66, 0x33, 0x33, 0x11, 0x98, + 0xD8, 0xCC, 0x6C, 0x66, 0x34, 0x32, 0x0E, 0x1B, 0x07, 0x0D, 0x83, 0x06, + 0xC0, 0x7C, 0x07, 0xC0, 0x7C, 0x07, 0xC0, 0x7C, 0x07, 0xC0, 0x7F, 0xFF, + 0xFF, 0xFC, 0x07, 0xC0, 0x7C, 0x07, 0xC0, 0x7C, 0x07, 0xC0, 0x7C, 0x07, + 0x07, 0xC0, 0x7F, 0xC3, 0x03, 0x98, 0x06, 0x60, 0x1F, 0x00, 0x3C, 0x00, + 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF8, 0x07, 0x60, 0x18, 0xE0, + 0xE1, 0xFE, 0x03, 0xF0, 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0x3C, 0x07, 0x80, + 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, + 0x1E, 0x03, 0xFE, 0x3F, 0xCC, 0x1B, 0x06, 0xC1, 0xF0, 0x6C, 0x1B, 0x0E, + 0xFF, 0x3C, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0x07, 0xF1, + 0xFF, 0x38, 0x07, 0x00, 0x60, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, + 0x00, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1F, 0xF0, 0x7E, 0xFF, 0xFF, + 0xFF, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, + 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0xE0, 0x36, + 0x03, 0x70, 0x63, 0x06, 0x30, 0xC1, 0x8C, 0x18, 0xC0, 0xD8, 0x0D, 0x80, + 0x70, 0x07, 0x00, 0x70, 0x06, 0x00, 0xC0, 0x7C, 0x07, 0x00, 0x01, 0x80, + 0x03, 0x00, 0x7F, 0xC1, 0xC9, 0xC6, 0x10, 0xCC, 0x21, 0xF0, 0x41, 0xE0, + 0x83, 0xC1, 0x07, 0x82, 0x0F, 0x04, 0x1E, 0x08, 0x3E, 0x10, 0xEC, 0x21, + 0x8E, 0x4E, 0x0F, 0xF8, 0x01, 0x00, 0x02, 0x00, 0xC0, 0x66, 0x0E, 0x70, + 0xC3, 0x1C, 0x39, 0x81, 0xB0, 0x0F, 0x00, 0xE0, 0x0E, 0x01, 0xB0, 0x1B, + 0x83, 0x18, 0x31, 0xC6, 0x0C, 0xE0, 0x6C, 0x07, 0xC0, 0x66, 0x03, 0x30, + 0x19, 0x80, 0xCC, 0x06, 0x60, 0x33, 0x01, 0x98, 0x0C, 0xC0, 0x66, 0x03, + 0x30, 0x19, 0x80, 0xCC, 0x06, 0x60, 0x33, 0xFF, 0xFF, 0xFF, 0x00, 0x10, + 0x00, 0x80, 0x04, 0x00, 0x20, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, + 0x3C, 0x0F, 0x83, 0x7F, 0xCF, 0xB0, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, + 0x03, 0xC1, 0x83, 0xC1, 0x83, 0xC1, 0x83, 0xC1, 0x83, 0xC1, 0x83, 0xC1, + 0x83, 0xC1, 0x83, 0xC1, 0x83, 0xC1, 0x83, 0xC1, 0x83, 0xC1, 0x83, 0xC1, + 0x83, 0xC1, 0x83, 0xC1, 0x83, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x83, 0x30, + 0x60, 0xCC, 0x18, 0x33, 0x06, 0x0C, 0xC1, 0x83, 0x30, 0x60, 0xCC, 0x18, + 0x33, 0x06, 0x0C, 0xC1, 0x83, 0x30, 0x60, 0xCC, 0x18, 0x33, 0x06, 0x0C, + 0xC1, 0x83, 0x30, 0x60, 0xCF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x80, + 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0xFC, 0x03, 0xF0, 0x00, 0xC0, 0x03, + 0x00, 0x0C, 0x00, 0x30, 0x00, 0xFE, 0x03, 0xFE, 0x0C, 0x18, 0x30, 0x70, + 0xC0, 0xC3, 0x03, 0x0C, 0x1C, 0x30, 0x60, 0xFF, 0x03, 0xF0, 0xC0, 0x0F, + 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3F, 0xE0, 0xFF, 0xC3, + 0xC3, 0x8F, 0x07, 0x3C, 0x0C, 0xF0, 0x33, 0xC1, 0xCF, 0x0E, 0x3F, 0xF0, + 0xFF, 0x03, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0F, 0xE3, 0xFE, + 0xC1, 0xB0, 0x7C, 0x0F, 0x03, 0xC1, 0xF0, 0x6F, 0xF3, 0xF0, 0x7E, 0x1F, + 0xF0, 0x07, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x19, 0xFF, 0x3F, 0xE0, 0x0C, + 0x01, 0x80, 0x30, 0x0C, 0x03, 0xBF, 0xE7, 0xF0, 0xC0, 0xF8, 0x30, 0x7F, + 0x8C, 0x30, 0x73, 0x18, 0x0E, 0xC6, 0x01, 0xB3, 0x80, 0x6C, 0xC0, 0x1B, + 0xF0, 0x07, 0xFC, 0x01, 0xF3, 0x00, 0x6C, 0xC0, 0x1B, 0x18, 0x06, 0xC6, + 0x03, 0xB0, 0xC1, 0xCC, 0x1F, 0xE3, 0x03, 0xE0, 0x0F, 0xE7, 0xFC, 0xC1, + 0xB0, 0x36, 0x06, 0xE0, 0xCC, 0x18, 0xFF, 0x0F, 0xE3, 0x0C, 0xE1, 0x98, + 0x33, 0x06, 0xC0, 0xD8, 0x1B, 0x03, 0x3E, 0x3F, 0x80, 0xC0, 0x30, 0x19, + 0xFD, 0x87, 0x83, 0xC1, 0xE1, 0xFF, 0xEF, 0x30, 0x01, 0x83, 0xF0, 0xE0, + 0x30, 0x06, 0x01, 0x9E, 0x3F, 0xE7, 0x0E, 0xE0, 0xD8, 0x1B, 0x03, 0xE0, + 0x6C, 0x0C, 0xC1, 0x98, 0x71, 0xFC, 0x1F, 0x00, 0xFE, 0x67, 0xB0, 0xD8, + 0x6C, 0x37, 0xE3, 0x3D, 0x87, 0xC1, 0xE1, 0xF3, 0xDF, 0x80, 0xFF, 0xFF, + 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x00, 0x1F, 0xE1, 0xFE, + 0x18, 0xE1, 0x8E, 0x18, 0xE1, 0x8E, 0x18, 0xE3, 0x0E, 0x30, 0xE3, 0x0E, + 0xFF, 0xFF, 0xFF, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0x1E, 0x0F, 0xE6, + 0x1B, 0x03, 0xC0, 0xFF, 0xFC, 0x03, 0x00, 0xC0, 0x18, 0x07, 0xF8, 0x7E, + 0x61, 0x86, 0x31, 0x8C, 0x39, 0x98, 0x19, 0xB0, 0x0D, 0xB0, 0x0F, 0xF0, + 0x3D, 0xB8, 0x31, 0x8C, 0x61, 0x8C, 0x61, 0x86, 0x61, 0x86, 0xC1, 0x86, + 0x7C, 0xFE, 0x07, 0x03, 0x06, 0x38, 0x1E, 0x03, 0x03, 0x03, 0xFF, 0x7C, + 0xC1, 0xE1, 0xF0, 0xB8, 0xFC, 0xDE, 0x6F, 0x67, 0xB3, 0xF1, 0xF0, 0xF8, + 0x78, 0x30, 0x22, 0x1B, 0x07, 0x00, 0x0C, 0x1E, 0x1F, 0x0B, 0x8F, 0xCD, + 0xE6, 0xF6, 0x7B, 0x3F, 0x1F, 0x0F, 0x87, 0x83, 0xC3, 0xE3, 0xB3, 0x99, + 0x8D, 0x87, 0xC3, 0x79, 0x8C, 0xC7, 0x61, 0xB0, 0xF8, 0x30, 0x3F, 0xCF, + 0xF3, 0x0C, 0xC3, 0x30, 0xCC, 0x33, 0x0C, 0xC3, 0x30, 0xCC, 0x3E, 0x0F, + 0x03, 0x70, 0x33, 0x83, 0x94, 0x14, 0xB1, 0xA5, 0x8D, 0xEC, 0x4F, 0x36, + 0x79, 0xB3, 0xCD, 0x1E, 0x38, 0xF1, 0xC7, 0x8C, 0x30, 0xC1, 0xE0, 0xF0, + 0x78, 0x3C, 0x1F, 0xFF, 0xFF, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x30, 0x1F, + 0x07, 0xF1, 0x83, 0x70, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xE0, 0xEC, + 0x18, 0xFE, 0x0F, 0x80, 0xFF, 0xFF, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, + 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x30, 0xCF, 0x3F, 0xEE, 0x1F, 0x03, 0xC0, + 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF8, 0x7F, 0xFB, 0x78, 0xC0, 0x30, 0x0C, + 0x03, 0x00, 0xC0, 0x00, 0x1F, 0x9F, 0xD8, 0x1C, 0x0C, 0x06, 0x03, 0x01, + 0x80, 0xE0, 0x38, 0x0F, 0xE3, 0xE0, 0xFF, 0xFF, 0xC3, 0x01, 0x80, 0xC0, + 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xE0, 0x6C, 0x19, 0x83, + 0x18, 0x63, 0x18, 0x73, 0x06, 0x40, 0xD8, 0x0F, 0x01, 0xC0, 0x38, 0x06, + 0x00, 0xC0, 0x30, 0x0E, 0x03, 0x80, 0x40, 0x00, 0x02, 0x00, 0x10, 0x00, + 0x80, 0x04, 0x00, 0x20, 0x07, 0xE0, 0xEB, 0x8C, 0x46, 0xE2, 0x1E, 0x10, + 0xF0, 0x87, 0x84, 0x3C, 0x21, 0xF1, 0x0D, 0x88, 0xC7, 0x5C, 0x1F, 0xC0, + 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x60, 0xCE, 0x30, 0xC6, + 0x0D, 0x81, 0xA0, 0x1C, 0x03, 0x80, 0xD8, 0x3B, 0x06, 0x31, 0x87, 0x30, + 0x60, 0xC1, 0xB0, 0x6C, 0x1B, 0x06, 0xC1, 0xB0, 0x6C, 0x1B, 0x06, 0xC1, + 0xB0, 0x6F, 0xFF, 0xFF, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC3, 0xFF, 0x7F, 0x03, 0x03, 0x03, 0x03, 0xC3, 0x0F, 0x0C, + 0x3C, 0x30, 0xF0, 0xC3, 0xC3, 0x0F, 0x0C, 0x3C, 0x30, 0xF0, 0xC3, 0xC3, + 0x0F, 0x0C, 0x3F, 0xFF, 0xFF, 0xFF, 0xC3, 0x0D, 0x86, 0x1B, 0x0C, 0x36, + 0x18, 0x6C, 0x30, 0xD8, 0x61, 0xB0, 0xC3, 0x61, 0x86, 0xC3, 0x0D, 0x86, + 0x1B, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, + 0xFC, 0x07, 0xE0, 0x03, 0x00, 0x18, 0x00, 0xFE, 0x07, 0xF8, 0x30, 0xE1, + 0x83, 0x0C, 0x18, 0x61, 0x83, 0xBC, 0x1F, 0x80, 0xC0, 0x3C, 0x03, 0xC0, + 0x3C, 0x03, 0xFC, 0x3F, 0xF3, 0xC3, 0x3C, 0x33, 0xC3, 0x3C, 0x33, 0xCE, + 0x3F, 0xC3, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xE7, 0xFB, 0x0F, 0x83, 0xC1, + 0xE1, 0xF3, 0xDF, 0x80, 0x7C, 0x7F, 0x00, 0xC0, 0x70, 0x1B, 0xFC, 0x06, + 0x03, 0x03, 0x83, 0xBF, 0x9F, 0x80, 0xC1, 0xE3, 0x1F, 0xCC, 0xE1, 0xB3, + 0x06, 0xCC, 0x1F, 0xF0, 0x3F, 0xC0, 0xF3, 0x07, 0xCC, 0x1B, 0x38, 0x6C, + 0x7F, 0x30, 0xF8, 0x1F, 0xCF, 0x36, 0x0D, 0x83, 0x70, 0xCF, 0x30, 0xFC, + 0xE3, 0x30, 0xD8, 0x36, 0x0D, 0x83, 0xFF, 0xFC, 0x03, 0xE0, 0x5B, 0x0D, + 0x91, 0x98, 0x91, 0x8F, 0x18, 0x61, 0x86, 0x18, 0xB1, 0x99, 0x19, 0x09, + 0xA0, 0xDE, 0x05, 0xC0, 0x3F, 0xFF, 0x31, 0x0C, 0xE0, 0x00, 0x00, 0x1E, + 0x0F, 0xE6, 0x1B, 0x03, 0xC0, 0xFF, 0xFC, 0x03, 0x00, 0xC0, 0x18, 0x07, + 0xF8, 0x7E }; + +const GFXglyph MyriadPro_Regular12pt8bGlyphs[] PROGMEM = { + { 0, 9, 19, 12, 2, -18 }, // 0x401 + { 22, 15, 19, 16, 0, -15 }, // 0x402 + { 58, 8, 20, 10, 2, -19 }, // 0x403 + { 78, 12, 16, 14, 1, -15 }, // 0x404 + { 102, 10, 16, 12, 1, -15 }, // 0x405 + { 122, 2, 16, 6, 2, -15 }, // 0x406 + { 126, 7, 19, 6, -1, -18 }, // 0x407 + { 143, 7, 16, 9, 0, -15 }, // 0x408 + { 157, 20, 16, 21, 0, -15 }, // 0x409 + { 197, 18, 16, 21, 2, -15 }, // 0x40A + { 233, 14, 16, 16, 0, -15 }, // 0x40B + { 261, 11, 20, 13, 2, -19 }, // 0x40C + { 289, 12, 16, 12, 0, -15 }, // 0x40D + { 313, 12, 19, 12, 0, -18 }, // 0x40E + { 342, 11, 20, 15, 2, -15 }, // 0x40F + { 370, 13, 16, 14, 1, -15 }, // 0x410 + { 396, 10, 16, 13, 2, -15 }, // 0x411 + { 416, 10, 16, 13, 2, -15 }, // 0x412 + { 436, 8, 16, 10, 2, -15 }, // 0x413 + { 452, 14, 20, 15, 0, -15 }, // 0x414 + { 487, 9, 16, 12, 2, -15 }, // 0x415 + { 505, 19, 16, 19, 0, -15 }, // 0x416 + { 543, 10, 16, 12, 1, -15 }, // 0x417 + { 563, 12, 16, 15, 2, -15 }, // 0x418 + { 587, 12, 19, 15, 2, -18 }, // 0x419 + { 616, 11, 16, 13, 2, -15 }, // 0x41A + { 638, 12, 16, 14, 0, -15 }, // 0x41B + { 662, 17, 16, 19, 1, -15 }, // 0x41C + { 696, 12, 16, 15, 2, -15 }, // 0x41D + { 720, 14, 16, 16, 1, -15 }, // 0x41E + { 748, 11, 16, 15, 2, -15 }, // 0x41F + { 770, 10, 16, 13, 2, -15 }, // 0x420 + { 790, 12, 16, 14, 1, -15 }, // 0x421 + { 814, 12, 16, 12, 0, -15 }, // 0x422 + { 838, 12, 16, 12, 0, -15 }, // 0x423 + { 862, 15, 18, 17, 1, -16 }, // 0x424 + { 896, 12, 16, 13, 1, -15 }, // 0x425 + { 920, 13, 20, 15, 2, -15 }, // 0x426 + { 953, 10, 16, 14, 2, -15 }, // 0x427 + { 973, 16, 16, 20, 2, -15 }, // 0x428 + { 1005, 18, 20, 20, 2, -15 }, // 0x429 + { 1050, 14, 16, 15, 0, -15 }, // 0x42A + { 1078, 14, 16, 18, 2, -15 }, // 0x42B + { 1106, 10, 16, 13, 2, -15 }, // 0x42C + { 1126, 11, 16, 13, 1, -15 }, // 0x42D + { 1148, 18, 16, 20, 2, -15 }, // 0x42E + { 1184, 11, 16, 13, 0, -15 }, // 0x42F + { 1206, 9, 12, 11, 1, -11 }, // 0x430 + { 1220, 11, 17, 12, 1, -16 }, // 0x431 + { 1244, 9, 12, 12, 2, -11 }, // 0x432 + { 1258, 7, 12, 9, 2, -11 }, // 0x433 + { 1269, 12, 16, 12, 0, -11 }, // 0x434 + { 1293, 10, 12, 12, 1, -11 }, // 0x435 + { 1308, 16, 12, 16, 0, -11 }, // 0x436 + { 1332, 8, 12, 10, 1, -11 }, // 0x437 + { 1344, 9, 12, 13, 2, -11 }, // 0x438 + { 1358, 9, 16, 13, 2, -15 }, // 0x439 + { 1376, 9, 12, 11, 2, -11 }, // 0x43A + { 1390, 10, 12, 12, 0, -11 }, // 0x43B + { 1405, 13, 12, 15, 1, -11 }, // 0x43C + { 1425, 9, 12, 13, 2, -11 }, // 0x43D + { 1439, 11, 12, 13, 1, -11 }, // 0x43E + { 1456, 9, 12, 13, 2, -11 }, // 0x43F + { 1470, 10, 17, 13, 2, -11 }, // 0x440 + { 1492, 9, 12, 11, 1, -11 }, // 0x441 + { 1506, 9, 12, 10, 0, -11 }, // 0x442 + { 1520, 11, 17, 11, 0, -11 }, // 0x443 + { 1544, 13, 22, 15, 1, -16 }, // 0x444 + { 1580, 11, 12, 11, 0, -11 }, // 0x445 + { 1597, 10, 16, 13, 2, -11 }, // 0x446 + { 1617, 8, 12, 12, 2, -11 }, // 0x447 + { 1629, 14, 12, 17, 2, -11 }, // 0x448 + { 1650, 15, 16, 18, 2, -11 }, // 0x449 + { 1680, 13, 12, 14, 0, -11 }, // 0x44A + { 1700, 12, 12, 16, 2, -11 }, // 0x44B + { 1718, 9, 12, 12, 2, -11 }, // 0x44C + { 1732, 9, 12, 11, 1, -11 }, // 0x44D + { 1746, 14, 12, 17, 2, -11 }, // 0x44E + { 1767, 10, 12, 12, 0, -11 }, // 0x44F + { 1782, 12, 16, 12, 0, -15 }, // 0x450 + { 1806, 10, 16, 12, 1, -15 } }; // 0x451 + +const GFXfont MyriadPro_Regular12pt8b PROGMEM = { + (uint8_t *)MyriadPro_Regular12pt8bBitmaps, + (GFXglyph *)MyriadPro_Regular12pt8bGlyphs, + 0x401, 0x451, 28 }; + +// Approx. 2400 bytes diff --git a/examples/demo-menu/src/UTF8-fonts/MyriadPro_Regular24pt8b.h b/examples/demo-menu/src/UTF8-fonts/MyriadPro_Regular24pt8b.h new file mode 100644 index 0000000..a283e81 --- /dev/null +++ b/examples/demo-menu/src/UTF8-fonts/MyriadPro_Regular24pt8b.h @@ -0,0 +1,688 @@ +const uint8_t MyriadPro_Regular24pt8bBitmaps[] PROGMEM = { + 0x38, 0x1C, 0x3E, 0x1F, 0x1F, 0x0F, 0x87, 0x87, 0x81, 0x81, 0x80, 0x00, + 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x1E, + 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, + 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0xFF, 0xFB, 0xFF, + 0xFD, 0xFF, 0xFE, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, + 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, + 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, + 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xC0, 0x00, 0xF0, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x01, 0xE0, 0x00, + 0x00, 0x0F, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x00, 0xF3, 0xFE, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x3F, + 0xFF, 0xE0, 0x01, 0xF8, 0x1F, 0x80, 0x0F, 0x00, 0x7E, 0x00, 0x78, 0x01, + 0xF0, 0x03, 0xC0, 0x07, 0x80, 0x1E, 0x00, 0x3E, 0x00, 0xF0, 0x00, 0xF0, + 0x07, 0x80, 0x07, 0x80, 0x3C, 0x00, 0x3C, 0x01, 0xE0, 0x01, 0xE0, 0x0F, + 0x00, 0x0F, 0x00, 0x78, 0x00, 0x78, 0x03, 0xC0, 0x03, 0xC0, 0x1E, 0x00, + 0x1E, 0x00, 0xF0, 0x00, 0xF0, 0x07, 0x80, 0x07, 0x80, 0x3C, 0x00, 0x78, + 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0x00, 0x01, 0xE0, 0x00, + 0x00, 0x1E, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x03, + 0xE0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x7C, 0x00, + 0xF8, 0x01, 0xF0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xFE, 0x01, 0xFF, 0xFE, + 0x03, 0xFE, 0x7E, 0x0F, 0xE0, 0x02, 0x1F, 0x80, 0x00, 0x1F, 0x00, 0x00, + 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xF0, + 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF0, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00, + 0x0F, 0xE0, 0x02, 0x07, 0xFE, 0x7E, 0x03, 0xFF, 0xFE, 0x00, 0xFF, 0xFE, + 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0xFF, 0xF8, 0x7F, 0xFE, 0x1F, 0xE7, + 0xC3, 0xE0, 0x08, 0xF8, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, + 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x80, + 0x03, 0xFC, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0x00, 0x07, 0xF0, 0x00, 0x3F, + 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, + 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x0F, 0x30, 0x03, 0xEF, 0xE7, 0xF9, + 0xFF, 0xFE, 0x1F, 0xFF, 0x80, 0x7F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, + 0x3F, 0x83, 0xFE, 0x1F, 0xE0, 0xF6, 0x03, 0x00, 0x00, 0x00, 0x00, 0xF0, + 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, + 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, + 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, + 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, + 0xC0, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, + 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, + 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, + 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x01, + 0xF0, 0x07, 0x80, 0x3E, 0x7F, 0xF1, 0xFF, 0xCF, 0xFC, 0x1F, 0xC0, 0x03, + 0xFF, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0xFF, + 0x00, 0x00, 0x03, 0xC0, 0x1F, 0x00, 0x00, 0x03, 0xC0, 0x1F, 0x00, 0x00, + 0x03, 0xC0, 0x1F, 0x00, 0x00, 0x03, 0xC0, 0x1F, 0x00, 0x00, 0x03, 0xC0, + 0x1F, 0x00, 0x00, 0x03, 0xC0, 0x1F, 0x00, 0x00, 0x03, 0xC0, 0x1F, 0x00, + 0x00, 0x03, 0xC0, 0x1F, 0x00, 0x00, 0x03, 0xC0, 0x1F, 0x00, 0x00, 0x03, + 0xC0, 0x1F, 0xFF, 0x80, 0x03, 0xC0, 0x1F, 0xFF, 0xE0, 0x03, 0xC0, 0x1F, + 0xFF, 0xF0, 0x03, 0xC0, 0x1F, 0x03, 0xF8, 0x03, 0xC0, 0x1F, 0x00, 0x7C, + 0x03, 0xC0, 0x1F, 0x00, 0x3E, 0x03, 0xC0, 0x1F, 0x00, 0x1E, 0x03, 0xC0, + 0x1F, 0x00, 0x1E, 0x03, 0xC0, 0x1F, 0x00, 0x1F, 0x07, 0x80, 0x1F, 0x00, + 0x1F, 0x07, 0x80, 0x1F, 0x00, 0x1F, 0x07, 0x80, 0x1F, 0x00, 0x1E, 0x07, + 0x80, 0x1F, 0x00, 0x1E, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x0F, 0x00, 0x1F, + 0x00, 0x7C, 0x1F, 0x00, 0x1F, 0x00, 0xFC, 0x7E, 0x00, 0x1F, 0x07, 0xF8, + 0xFC, 0x00, 0x1F, 0xFF, 0xF0, 0xF8, 0x00, 0x1F, 0xFF, 0xC0, 0xE0, 0x00, + 0x1F, 0xFE, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x00, + 0xF0, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0xF0, + 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x0F, 0x00, + 0x0F, 0x00, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x00, + 0xF0, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0xFF, + 0xF8, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, + 0xFF, 0x03, 0xFC, 0xF0, 0x00, 0xF0, 0x07, 0xEF, 0x00, 0x0F, 0x00, 0x3F, + 0xF0, 0x00, 0xF0, 0x01, 0xFF, 0x00, 0x0F, 0x00, 0x0F, 0xF0, 0x00, 0xF0, + 0x00, 0xFF, 0x00, 0x0F, 0x00, 0x0F, 0xF0, 0x00, 0xF0, 0x00, 0xFF, 0x00, + 0x0F, 0x00, 0x0F, 0xF0, 0x00, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0x00, 0x1F, + 0xF0, 0x00, 0xF0, 0x03, 0xEF, 0x00, 0x0F, 0x00, 0x7E, 0xF0, 0x00, 0xF0, + 0x3F, 0xCF, 0x00, 0x0F, 0xFF, 0xF0, 0xF0, 0x00, 0xFF, 0xFE, 0x0F, 0x00, + 0x0F, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, + 0xFF, 0x00, 0x07, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x07, 0x8F, 0xF0, 0x00, 0x7F, 0xFF, + 0xC0, 0x07, 0xFF, 0xFE, 0x00, 0x7F, 0x07, 0xE0, 0x07, 0xC0, 0x1F, 0x00, + 0x78, 0x01, 0xF0, 0x07, 0x80, 0x0F, 0x00, 0x78, 0x00, 0xF0, 0x07, 0x80, + 0x0F, 0x00, 0x78, 0x00, 0xF0, 0x07, 0x80, 0x0F, 0x00, 0x78, 0x00, 0xF0, + 0x07, 0x80, 0x0F, 0x00, 0x78, 0x00, 0xF0, 0x07, 0x80, 0x0F, 0x00, 0x78, + 0x00, 0xF0, 0x07, 0x80, 0x0F, 0x00, 0x78, 0x00, 0xF0, 0x07, 0x80, 0x0F, + 0x00, 0x78, 0x00, 0xF0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x01, 0xE0, + 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x00, + 0x00, 0x1E, 0x00, 0x3E, 0xF0, 0x01, 0xE7, 0x80, 0x1F, 0x3C, 0x01, 0xF1, + 0xE0, 0x1F, 0x0F, 0x01, 0xF0, 0x78, 0x0F, 0x03, 0xC0, 0xF0, 0x1E, 0x0F, + 0x80, 0xF0, 0xF8, 0x07, 0x87, 0x80, 0x3C, 0x78, 0x01, 0xE7, 0x80, 0x0F, + 0x7C, 0x00, 0x7F, 0xC0, 0x03, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0xF0, 0xFE, + 0x07, 0x81, 0xF8, 0x3C, 0x07, 0xC1, 0xE0, 0x1F, 0x0F, 0x00, 0x78, 0x78, + 0x03, 0xC3, 0xC0, 0x1F, 0x1E, 0x00, 0x78, 0xF0, 0x03, 0xE7, 0x80, 0x1F, + 0x3C, 0x00, 0x79, 0xE0, 0x03, 0xEF, 0x00, 0x0F, 0x78, 0x00, 0x7B, 0xC0, + 0x03, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0xC0, + 0x00, 0xFF, 0x80, 0x03, 0xFB, 0x80, 0x06, 0xF3, 0x80, 0x1D, 0xE7, 0x00, + 0x73, 0xC7, 0x00, 0xC7, 0x87, 0x03, 0x8F, 0x0E, 0x0E, 0x1E, 0x0E, 0x18, + 0x3C, 0x0C, 0x70, 0x78, 0x1D, 0xC0, 0xF0, 0x1F, 0x01, 0xE0, 0x1E, 0x03, + 0xC0, 0x38, 0x07, 0x80, 0x78, 0x0F, 0x01, 0xF0, 0x1E, 0x07, 0x70, 0x3C, + 0x0C, 0x70, 0x78, 0x38, 0x60, 0xF0, 0xE0, 0xE1, 0xE1, 0xC0, 0xE3, 0xC7, + 0x00, 0xC7, 0x9C, 0x01, 0xCF, 0x38, 0x01, 0xDE, 0xE0, 0x01, 0xBF, 0x80, + 0x03, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0x03, 0x81, 0xC0, 0x00, 0xE0, 0xE0, 0x00, 0x78, 0xF0, 0x00, 0x1F, + 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, + 0x00, 0x1E, 0x78, 0x00, 0x0F, 0x3E, 0x00, 0x0F, 0x8F, 0x00, 0x07, 0x87, + 0xC0, 0x03, 0xC1, 0xE0, 0x03, 0xC0, 0xF8, 0x01, 0xE0, 0x3C, 0x00, 0xF0, + 0x1F, 0x00, 0xF0, 0x07, 0x80, 0x78, 0x03, 0xE0, 0x78, 0x00, 0xF0, 0x3C, + 0x00, 0x7C, 0x1E, 0x00, 0x1E, 0x1E, 0x00, 0x0F, 0x8F, 0x00, 0x03, 0xC7, + 0x00, 0x01, 0xE7, 0x80, 0x00, 0x7B, 0x80, 0x00, 0x3D, 0xC0, 0x00, 0x0F, + 0xE0, 0x00, 0x07, 0xE0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0x3E, 0x00, 0x02, 0xFE, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, + 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, + 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, + 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, + 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, + 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, + 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x78, 0x00, 0x01, 0xE0, + 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, + 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xE0, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xB8, 0x00, 0x00, 0xF7, + 0x80, 0x00, 0x1E, 0xF0, 0x00, 0x07, 0x9E, 0x00, 0x00, 0xF1, 0xE0, 0x00, + 0x1E, 0x3C, 0x00, 0x07, 0x87, 0x80, 0x00, 0xF0, 0x78, 0x00, 0x1E, 0x0F, + 0x00, 0x07, 0x81, 0xE0, 0x00, 0xF0, 0x1E, 0x00, 0x1E, 0x03, 0xC0, 0x07, + 0x80, 0x78, 0x00, 0xF0, 0x07, 0x80, 0x1E, 0x00, 0xF0, 0x07, 0xFF, 0xFE, + 0x00, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFC, 0x07, 0xC0, 0x07, 0x80, 0xF0, + 0x00, 0xF8, 0x1E, 0x00, 0x0F, 0x07, 0xC0, 0x01, 0xE0, 0xF0, 0x00, 0x3E, + 0x1E, 0x00, 0x03, 0xC7, 0xC0, 0x00, 0x7C, 0xF0, 0x00, 0x0F, 0x9E, 0x00, + 0x00, 0xF7, 0xC0, 0x00, 0x1F, 0xFF, 0xFF, 0x8F, 0xFF, 0xF8, 0xFF, 0xFF, + 0x8F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, + 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xFF, + 0xF8, 0x0F, 0xFF, 0xE0, 0xFF, 0xFF, 0x8F, 0x03, 0xFC, 0xF0, 0x07, 0xCF, + 0x00, 0x3E, 0xF0, 0x01, 0xEF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, + 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xEF, 0x00, 0x3E, 0xF0, 0x03, + 0xEF, 0x00, 0xFC, 0xF0, 0x3F, 0x8F, 0xFF, 0xF0, 0xFF, 0xFC, 0x0F, 0xFE, + 0x00, 0x7F, 0xF0, 0x0F, 0xFF, 0xE0, 0xFF, 0xFF, 0x0F, 0x03, 0xF8, 0xF0, + 0x0F, 0xCF, 0x00, 0x7C, 0xF0, 0x03, 0xCF, 0x00, 0x3C, 0xF0, 0x03, 0xCF, + 0x00, 0x3C, 0xF0, 0x03, 0xCF, 0x00, 0x78, 0xF0, 0x0F, 0x8F, 0x03, 0xF0, + 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, 0xFF, 0xFF, 0x0F, 0x01, 0xF8, 0xF0, 0x07, + 0xCF, 0x00, 0x3E, 0xF0, 0x01, 0xEF, 0x00, 0x1E, 0xF0, 0x01, 0xFF, 0x00, + 0x1F, 0xF0, 0x01, 0xEF, 0x00, 0x1E, 0xF0, 0x03, 0xEF, 0x00, 0x7C, 0xF0, + 0x3F, 0x8F, 0xFF, 0xF0, 0xFF, 0xFE, 0x0F, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, + 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xE0, 0x07, 0xFF, 0xFC, 0x00, + 0xE0, 0x07, 0x80, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x1E, 0x00, 0x70, 0x03, + 0xC0, 0x0E, 0x00, 0x78, 0x01, 0xC0, 0x0F, 0x00, 0x38, 0x01, 0xE0, 0x07, + 0x00, 0x3C, 0x01, 0xE0, 0x07, 0x80, 0x3C, 0x00, 0xF0, 0x07, 0x80, 0x1E, + 0x00, 0xF0, 0x03, 0xC0, 0x1E, 0x00, 0x78, 0x03, 0xC0, 0x0F, 0x00, 0x78, + 0x01, 0xE0, 0x0F, 0x00, 0x3C, 0x01, 0xC0, 0x07, 0x80, 0x78, 0x00, 0xF0, + 0x0F, 0x00, 0x1E, 0x01, 0xE0, 0x03, 0xC0, 0x78, 0x00, 0x78, 0x0F, 0x00, + 0x0F, 0x01, 0xE0, 0x01, 0xE0, 0x78, 0x00, 0x3C, 0x0F, 0x00, 0x07, 0x83, + 0xC0, 0x00, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0x7F, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, + 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, + 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xFF, 0xFD, + 0xFF, 0xFE, 0xFF, 0xFF, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, + 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, + 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF8, 0x00, 0xF0, 0x01, 0xE7, 0xC0, 0x0F, 0x00, 0x3E, 0x3E, 0x00, 0xF0, + 0x07, 0xC1, 0xE0, 0x0F, 0x00, 0xF8, 0x1F, 0x00, 0xF0, 0x0F, 0x00, 0xF8, + 0x0F, 0x01, 0xE0, 0x07, 0x80, 0xF0, 0x3E, 0x00, 0x3C, 0x0F, 0x03, 0xC0, + 0x01, 0xE0, 0xF0, 0x78, 0x00, 0x1E, 0x0F, 0x0F, 0x00, 0x00, 0xF0, 0xF0, + 0xF0, 0x00, 0x07, 0x8F, 0x1E, 0x00, 0x00, 0x3C, 0xF3, 0xC0, 0x00, 0x03, + 0xCF, 0x78, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, + 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0x0F, 0x0F, 0xC0, 0x07, 0xC0, 0xF0, + 0x3E, 0x00, 0xF8, 0x0F, 0x01, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x01, 0xE0, + 0x0F, 0x00, 0xF8, 0x1E, 0x00, 0xF0, 0x07, 0x83, 0xE0, 0x0F, 0x00, 0x78, + 0x3C, 0x00, 0xF0, 0x07, 0xC3, 0xC0, 0x0F, 0x00, 0x3C, 0x3C, 0x00, 0xF0, + 0x03, 0xC7, 0x80, 0x0F, 0x00, 0x3E, 0x78, 0x00, 0xF0, 0x01, 0xE7, 0x80, + 0x0F, 0x00, 0x1E, 0xF0, 0x00, 0xF0, 0x01, 0xFF, 0x00, 0x0F, 0x00, 0x0F, + 0x03, 0xF8, 0x01, 0xFF, 0xF0, 0x7F, 0xFF, 0x83, 0xE3, 0xFC, 0x30, 0x07, + 0xC0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, + 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x03, 0xF0, 0x07, + 0xFE, 0x00, 0x7F, 0xC0, 0x07, 0xFF, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xE0, + 0x00, 0x1E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, + 0x00, 0x00, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF6, 0x00, 0x7E, 0x7E, 0x3F, + 0xC7, 0xFF, 0xF8, 0x7F, 0xFF, 0x00, 0xFF, 0x80, 0xE0, 0x00, 0x1F, 0xC0, + 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00, 0x03, 0xFE, 0x00, 0x0F, 0xFC, 0x00, + 0x1F, 0xF8, 0x00, 0x7B, 0xF0, 0x00, 0xF7, 0xE0, 0x03, 0xCF, 0xC0, 0x0F, + 0x9F, 0x80, 0x1E, 0x3F, 0x00, 0x7C, 0x7E, 0x01, 0xF0, 0xFC, 0x03, 0xC1, + 0xF8, 0x0F, 0x83, 0xF0, 0x1E, 0x07, 0xE0, 0x7C, 0x0F, 0xC1, 0xF0, 0x1F, + 0x83, 0xC0, 0x7F, 0x0F, 0x80, 0xFE, 0x1E, 0x01, 0xFC, 0x78, 0x03, 0xF8, + 0xF0, 0x07, 0xF3, 0xC0, 0x0F, 0xEF, 0x80, 0x1F, 0xDE, 0x00, 0x3F, 0xF8, + 0x00, 0x7F, 0xF0, 0x00, 0xFF, 0xC0, 0x01, 0xFF, 0x00, 0x03, 0xFE, 0x00, + 0x07, 0xF8, 0x00, 0x0F, 0x07, 0x83, 0x80, 0x07, 0x07, 0x00, 0x0F, 0x1E, + 0x00, 0x0F, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x01, 0xFF, + 0x00, 0x07, 0xFE, 0x00, 0x0F, 0xFC, 0x00, 0x3D, 0xF8, 0x00, 0x7B, 0xF0, + 0x01, 0xE7, 0xE0, 0x07, 0xCF, 0xC0, 0x0F, 0x1F, 0x80, 0x3E, 0x3F, 0x00, + 0xF8, 0x7E, 0x01, 0xE0, 0xFC, 0x07, 0xC1, 0xF8, 0x0F, 0x03, 0xF0, 0x3E, + 0x07, 0xE0, 0xF8, 0x0F, 0xC1, 0xE0, 0x3F, 0x87, 0xC0, 0x7F, 0x0F, 0x00, + 0xFE, 0x3C, 0x01, 0xFC, 0x78, 0x03, 0xF9, 0xE0, 0x07, 0xF7, 0xC0, 0x0F, + 0xEF, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xF8, 0x00, 0x7F, 0xE0, 0x00, 0xFF, + 0x80, 0x01, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x07, 0x80, 0xF0, 0x01, 0xF7, + 0x80, 0x0F, 0x3C, 0x00, 0xF9, 0xE0, 0x0F, 0x8F, 0x00, 0xF8, 0x78, 0x0F, + 0x83, 0xC0, 0x78, 0x1E, 0x07, 0x80, 0xF0, 0x7C, 0x07, 0x87, 0xC0, 0x3C, + 0x3C, 0x01, 0xE3, 0xC0, 0x0F, 0x3C, 0x00, 0x7B, 0xE0, 0x03, 0xFE, 0x00, + 0x1F, 0xFE, 0x00, 0xFF, 0xFC, 0x07, 0x87, 0xF0, 0x3C, 0x0F, 0xC1, 0xE0, + 0x3E, 0x0F, 0x00, 0xF8, 0x78, 0x03, 0xC3, 0xC0, 0x1E, 0x1E, 0x00, 0xF8, + 0xF0, 0x03, 0xC7, 0x80, 0x1F, 0x3C, 0x00, 0xF9, 0xE0, 0x03, 0xCF, 0x00, + 0x1F, 0x78, 0x00, 0x7B, 0xC0, 0x03, 0xDE, 0x00, 0x1F, 0x03, 0xFF, 0xFF, + 0x03, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x03, 0xC0, 0x0F, 0x03, 0xC0, 0x0F, + 0x03, 0xC0, 0x0F, 0x03, 0xC0, 0x0F, 0x03, 0xC0, 0x0F, 0x03, 0xC0, 0x0F, + 0x03, 0xC0, 0x0F, 0x03, 0xC0, 0x0F, 0x03, 0xC0, 0x0F, 0x03, 0xC0, 0x0F, + 0x03, 0xC0, 0x0F, 0x03, 0xC0, 0x0F, 0x03, 0xC0, 0x0F, 0x03, 0xC0, 0x0F, + 0x03, 0xC0, 0x0F, 0x03, 0xC0, 0x0F, 0x03, 0xC0, 0x0F, 0x07, 0x80, 0x0F, + 0x07, 0x80, 0x0F, 0x07, 0x80, 0x0F, 0x07, 0x80, 0x0F, 0x07, 0x80, 0x0F, + 0x0F, 0x00, 0x0F, 0x0F, 0x00, 0x0F, 0x1F, 0x00, 0x0F, 0x7E, 0x00, 0x0F, + 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0x3E, 0x00, 0x00, + 0x7C, 0x3F, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, + 0xFC, 0x3F, 0x80, 0x01, 0xFC, 0x3B, 0x80, 0x01, 0xDC, 0x7B, 0x80, 0x03, + 0xDC, 0x7B, 0xC0, 0x03, 0xDE, 0x7B, 0xC0, 0x03, 0x9E, 0x79, 0xC0, 0x07, + 0x9E, 0x79, 0xE0, 0x07, 0x9E, 0x79, 0xE0, 0x07, 0x1E, 0x78, 0xE0, 0x0F, + 0x1E, 0x78, 0xF0, 0x0F, 0x1E, 0x78, 0xF0, 0x0E, 0x1E, 0x78, 0xF8, 0x1E, + 0x1E, 0x78, 0x78, 0x1E, 0x1E, 0x78, 0x78, 0x1C, 0x1E, 0x70, 0x7C, 0x3C, + 0x1E, 0x70, 0x3C, 0x3C, 0x1E, 0x70, 0x3C, 0x38, 0x1E, 0xF0, 0x3C, 0x78, + 0x1E, 0xF0, 0x1E, 0x70, 0x1E, 0xF0, 0x1E, 0x70, 0x0F, 0xF0, 0x1E, 0xF0, + 0x0F, 0xF0, 0x0F, 0xE0, 0x0F, 0xF0, 0x0F, 0xE0, 0x0F, 0xF0, 0x0F, 0xE0, + 0x0F, 0xF0, 0x07, 0xC0, 0x0F, 0xF0, 0x07, 0xC0, 0x0F, 0xF0, 0x07, 0xC0, + 0x0F, 0xF0, 0x03, 0x80, 0x0F, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xC0, + 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, 0x00, + 0x07, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, + 0x7F, 0x80, 0x00, 0xFF, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, + 0x80, 0x00, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, + 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, + 0x00, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00, + 0x0F, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0x80, + 0x0F, 0xF3, 0xFE, 0x00, 0xFC, 0x01, 0xF8, 0x0F, 0x80, 0x07, 0xE0, 0xF8, + 0x00, 0x1F, 0x07, 0x80, 0x00, 0x7C, 0x7C, 0x00, 0x01, 0xE3, 0xC0, 0x00, + 0x0F, 0x9E, 0x00, 0x00, 0x7D, 0xF0, 0x00, 0x01, 0xEF, 0x00, 0x00, 0x0F, + 0x78, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x1F, 0xF0, + 0x00, 0x00, 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, + 0x01, 0xEF, 0x80, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0xF9, 0xE0, 0x00, 0x07, + 0xCF, 0x80, 0x00, 0x3C, 0x3C, 0x00, 0x03, 0xE1, 0xF0, 0x00, 0x3E, 0x07, + 0xC0, 0x03, 0xE0, 0x1F, 0x80, 0x3F, 0x00, 0x7F, 0x8F, 0xF0, 0x01, 0xFF, + 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, + 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, + 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, + 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, + 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, + 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, + 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, + 0x0F, 0x7F, 0xF0, 0x1F, 0xFF, 0xC3, 0xFF, 0xFC, 0x7C, 0x3F, 0xCF, 0x00, + 0x7D, 0xE0, 0x07, 0xBC, 0x00, 0xFF, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, + 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x3F, 0xE0, 0x07, 0xBC, 0x01, + 0xF7, 0x80, 0xFC, 0xFF, 0xFF, 0x1F, 0xFF, 0x83, 0xFF, 0xC0, 0x78, 0x00, + 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, + 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, + 0x3C, 0x00, 0x07, 0x80, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xFF, 0x01, + 0xFF, 0xFE, 0x03, 0xFF, 0x7E, 0x0F, 0xE0, 0x02, 0x1F, 0x80, 0x00, 0x1F, + 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, + 0x80, 0x00, 0x0F, 0xE0, 0x02, 0x07, 0xFE, 0x7E, 0x03, 0xFF, 0xFE, 0x00, + 0xFF, 0xFF, 0x00, 0x1F, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF8, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, + 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, + 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, + 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, + 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, + 0x00, 0xF8, 0x00, 0x0F, 0x3C, 0x00, 0x07, 0x9F, 0x00, 0x07, 0xC7, 0x80, + 0x03, 0xC3, 0xE0, 0x01, 0xE0, 0xF0, 0x01, 0xE0, 0x7C, 0x00, 0xF0, 0x1E, + 0x00, 0x78, 0x0F, 0x80, 0x78, 0x03, 0xC0, 0x3C, 0x01, 0xF0, 0x3C, 0x00, + 0x78, 0x1E, 0x00, 0x3E, 0x0F, 0x00, 0x0F, 0x0F, 0x00, 0x07, 0xC7, 0x80, + 0x01, 0xE3, 0x80, 0x00, 0xF3, 0xC0, 0x00, 0x3D, 0xC0, 0x00, 0x1E, 0xE0, + 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x1F, 0x00, 0x01, 0x7F, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, + 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, + 0x1F, 0xFF, 0xFE, 0x00, 0xFC, 0x78, 0xFC, 0x07, 0xC1, 0xE0, 0xF8, 0x3E, + 0x07, 0x81, 0xF0, 0xF0, 0x1E, 0x03, 0xE7, 0x80, 0x78, 0x07, 0x9E, 0x01, + 0xE0, 0x1F, 0xF8, 0x07, 0x80, 0x3F, 0xC0, 0x1E, 0x00, 0xFF, 0x00, 0x78, + 0x03, 0xFC, 0x01, 0xE0, 0x0F, 0xF0, 0x07, 0x80, 0x3F, 0xC0, 0x1E, 0x00, + 0xFF, 0x00, 0x78, 0x03, 0xFC, 0x01, 0xE0, 0x0F, 0xF0, 0x07, 0x80, 0x3F, + 0xE0, 0x1E, 0x00, 0xFF, 0x80, 0x78, 0x07, 0xDF, 0x01, 0xE0, 0x1E, 0x7C, + 0x07, 0x80, 0xF8, 0xF8, 0x1E, 0x07, 0xC1, 0xF0, 0x78, 0x3E, 0x03, 0xF1, + 0xE3, 0xF0, 0x07, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xF8, 0x00, 0x07, 0xFF, + 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x7C, 0x00, 0x1F, 0x3E, 0x00, 0x0F, 0x0F, 0x80, 0x0F, 0x83, 0xC0, + 0x07, 0x81, 0xF0, 0x07, 0xC0, 0x78, 0x03, 0xC0, 0x3E, 0x03, 0xC0, 0x0F, + 0x03, 0xE0, 0x03, 0xC1, 0xE0, 0x01, 0xF1, 0xF0, 0x00, 0x78, 0xF0, 0x00, + 0x3E, 0xF0, 0x00, 0x0F, 0x78, 0x00, 0x07, 0xF8, 0x00, 0x01, 0xF8, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0xE0, + 0x00, 0x1E, 0xF0, 0x00, 0x1E, 0x7C, 0x00, 0x1F, 0x1E, 0x00, 0x0F, 0x0F, + 0x80, 0x0F, 0x83, 0xE0, 0x07, 0x80, 0xF0, 0x07, 0x80, 0x7C, 0x07, 0xC0, + 0x1E, 0x03, 0xC0, 0x0F, 0x83, 0xE0, 0x03, 0xE1, 0xE0, 0x01, 0xF1, 0xF0, + 0x00, 0x7D, 0xF0, 0x00, 0x1E, 0xF0, 0x00, 0x3C, 0x78, 0x00, 0x1E, 0x3C, + 0x00, 0x0F, 0x1E, 0x00, 0x07, 0x8F, 0x00, 0x03, 0xC7, 0x80, 0x01, 0xE3, + 0xC0, 0x00, 0xF1, 0xE0, 0x00, 0x78, 0xF0, 0x00, 0x3C, 0x78, 0x00, 0x1E, + 0x3C, 0x00, 0x0F, 0x1E, 0x00, 0x07, 0x8F, 0x00, 0x03, 0xC7, 0x80, 0x01, + 0xE3, 0xC0, 0x00, 0xF1, 0xE0, 0x00, 0x78, 0xF0, 0x00, 0x3C, 0x78, 0x00, + 0x1E, 0x3C, 0x00, 0x0F, 0x1E, 0x00, 0x07, 0x8F, 0x00, 0x03, 0xC7, 0x80, + 0x01, 0xE3, 0xC0, 0x00, 0xF1, 0xE0, 0x00, 0x78, 0xF0, 0x00, 0x3C, 0x78, + 0x00, 0x1E, 0x3C, 0x00, 0x0F, 0x1E, 0x00, 0x07, 0x8F, 0x00, 0x03, 0xC7, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x7F, 0xC0, 0x01, 0xFF, 0x00, 0x07, 0xFC, 0x00, 0x1F, 0xF0, 0x00, 0x7F, + 0xC0, 0x01, 0xFF, 0x00, 0x07, 0xFC, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xC0, + 0x01, 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00, 0x7D, 0xE0, 0x01, + 0xF7, 0xC0, 0x07, 0xDF, 0x00, 0x1F, 0x3F, 0x03, 0xFC, 0xFF, 0xFF, 0xF1, + 0xFF, 0xFF, 0xC1, 0xFF, 0x9F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, + 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07, + 0xC0, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, + 0x00, 0x1F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, + 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, + 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, + 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, + 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, + 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, + 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, + 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, + 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, + 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x03, + 0xC0, 0x0F, 0x1E, 0x00, 0x78, 0x01, 0xE3, 0xC0, 0x0F, 0x00, 0x3C, 0x78, + 0x01, 0xE0, 0x07, 0x8F, 0x00, 0x3C, 0x00, 0xF1, 0xE0, 0x07, 0x80, 0x1E, + 0x3C, 0x00, 0xF0, 0x03, 0xC7, 0x80, 0x1E, 0x00, 0x78, 0xF0, 0x03, 0xC0, + 0x0F, 0x1E, 0x00, 0x78, 0x01, 0xE3, 0xC0, 0x0F, 0x00, 0x3C, 0x78, 0x01, + 0xE0, 0x07, 0x8F, 0x00, 0x3C, 0x00, 0xF1, 0xE0, 0x07, 0x80, 0x1E, 0x3C, + 0x00, 0xF0, 0x03, 0xC7, 0x80, 0x1E, 0x00, 0x78, 0xF0, 0x03, 0xC0, 0x0F, + 0x1E, 0x00, 0x78, 0x01, 0xE3, 0xC0, 0x0F, 0x00, 0x3C, 0x78, 0x01, 0xE0, + 0x07, 0x8F, 0x00, 0x3C, 0x00, 0xF1, 0xE0, 0x07, 0x80, 0x1E, 0x3C, 0x00, + 0xF0, 0x03, 0xC7, 0x80, 0x1E, 0x00, 0x78, 0xF0, 0x03, 0xC0, 0x0F, 0x1E, + 0x00, 0x78, 0x01, 0xE3, 0xC0, 0x0F, 0x00, 0x3C, 0x78, 0x01, 0xE0, 0x07, + 0x8F, 0x00, 0x3C, 0x00, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0xF0, + 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0x00, 0x00, + 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, + 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, + 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0x80, 0x0F, 0x01, + 0xFC, 0x00, 0xF0, 0x07, 0xE0, 0x0F, 0x00, 0x3E, 0x00, 0xF0, 0x01, 0xE0, + 0x0F, 0x00, 0x1F, 0x00, 0xF0, 0x01, 0xF0, 0x0F, 0x00, 0x1F, 0x00, 0xF0, + 0x01, 0xF0, 0x0F, 0x00, 0x1F, 0x00, 0xF0, 0x01, 0xE0, 0x0F, 0x00, 0x1E, + 0x00, 0xF0, 0x03, 0xE0, 0x0F, 0x00, 0x7C, 0x00, 0xF0, 0x3F, 0x80, 0x0F, + 0xFF, 0xF0, 0x00, 0xFF, 0xFC, 0x00, 0x0F, 0xFE, 0x00, 0xF0, 0x00, 0x01, + 0xFE, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x0F, + 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07, 0xF8, 0x00, + 0x00, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0xE0, 0x7F, + 0x81, 0xFE, 0x0F, 0xF0, 0x07, 0xC1, 0xFE, 0x00, 0x7C, 0x3F, 0xC0, 0x07, + 0x87, 0xF8, 0x00, 0xF0, 0xFF, 0x00, 0x1F, 0x1F, 0xE0, 0x03, 0xE3, 0xFC, + 0x00, 0x7C, 0x7F, 0x80, 0x0F, 0x0F, 0xF0, 0x01, 0xE1, 0xFE, 0x00, 0x7C, + 0x3F, 0xC0, 0x0F, 0x07, 0xF8, 0x07, 0xE0, 0xFF, 0x07, 0xF8, 0x1F, 0xFF, + 0xFE, 0x03, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0x0F, + 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, + 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, + 0x0F, 0x00, 0x00, 0xFF, 0xF8, 0x0F, 0xFF, 0xE0, 0xFF, 0xFF, 0x8F, 0x01, + 0xFC, 0xF0, 0x07, 0xCF, 0x00, 0x3E, 0xF0, 0x01, 0xEF, 0x00, 0x1F, 0xF0, + 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xEF, + 0x00, 0x1E, 0xF0, 0x03, 0xEF, 0x00, 0xFC, 0xF0, 0x3F, 0x8F, 0xFF, 0xF0, + 0xFF, 0xFC, 0x0F, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x7F, + 0xFF, 0xC0, 0x7F, 0x3F, 0xE0, 0x20, 0x03, 0xF0, 0x00, 0x01, 0xF8, 0x00, + 0x00, 0xFC, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3E, 0x00, + 0x00, 0x1E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x07, + 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, + 0x01, 0xF8, 0x40, 0x07, 0xF0, 0x7E, 0x7F, 0xE0, 0x7F, 0xFF, 0x80, 0x7F, + 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0xF0, 0x00, 0x3F, 0xC0, 0x1E, 0x00, 0x1F, + 0xFE, 0x03, 0xC0, 0x0F, 0xFF, 0xF0, 0x78, 0x03, 0xF8, 0xFF, 0x0F, 0x00, + 0xF8, 0x03, 0xF1, 0xE0, 0x3E, 0x00, 0x3E, 0x3C, 0x07, 0x80, 0x03, 0xE7, + 0x81, 0xF0, 0x00, 0x3C, 0xF0, 0x3C, 0x00, 0x07, 0xDE, 0x0F, 0x80, 0x00, + 0x7B, 0xC1, 0xE0, 0x00, 0x0F, 0x78, 0x3C, 0x00, 0x01, 0xFF, 0x07, 0x80, + 0x00, 0x1F, 0xE1, 0xF0, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x7F, 0xFF, + 0x80, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x01, 0xFE, 0x1E, 0x00, 0x00, 0x3F, + 0xC3, 0xC0, 0x00, 0x07, 0xF8, 0x7C, 0x00, 0x00, 0xFF, 0x07, 0x80, 0x00, + 0x3F, 0xE0, 0xF0, 0x00, 0x07, 0xBC, 0x1E, 0x00, 0x00, 0xF7, 0x83, 0xE0, + 0x00, 0x3E, 0xF0, 0x3C, 0x00, 0x07, 0x9E, 0x07, 0xC0, 0x01, 0xF3, 0xC0, + 0x7C, 0x00, 0x7C, 0x78, 0x07, 0xC0, 0x1F, 0x0F, 0x00, 0x7F, 0x1F, 0xC1, + 0xE0, 0x07, 0xFF, 0xF0, 0x3C, 0x00, 0x7F, 0xFC, 0x07, 0x80, 0x01, 0xFC, + 0x00, 0x00, 0x7F, 0xF0, 0x1F, 0xFF, 0xC3, 0xFF, 0xFE, 0x3F, 0x80, 0xF1, + 0xF0, 0x07, 0x9F, 0x00, 0x3C, 0xF0, 0x01, 0xE7, 0x80, 0x0F, 0x7C, 0x00, + 0x7B, 0xE0, 0x03, 0xCF, 0x00, 0x1E, 0x78, 0x00, 0xF3, 0xE0, 0x07, 0x8F, + 0x80, 0x3C, 0x3F, 0x01, 0xE0, 0xFF, 0xFF, 0x00, 0xFF, 0xF8, 0x0F, 0xFF, + 0xC0, 0xF8, 0x1E, 0x0F, 0x00, 0xF0, 0xF8, 0x07, 0x87, 0x80, 0x3C, 0x7C, + 0x01, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x79, 0xE0, 0x03, 0xCF, 0x00, 0x1E, + 0x78, 0x00, 0xF7, 0xC0, 0x07, 0xBC, 0x00, 0x3F, 0xE0, 0x01, 0xFE, 0x00, + 0x0F, 0x07, 0xF0, 0x0F, 0xFF, 0x07, 0xFF, 0xF0, 0xE0, 0x7C, 0x00, 0x0F, + 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0xFF, 0x81, 0xFF, 0xE1, + 0xFF, 0xF8, 0xFC, 0x1E, 0x7C, 0x07, 0xBE, 0x01, 0xEF, 0x00, 0x7B, 0xC0, + 0x1E, 0xF0, 0x07, 0xBC, 0x01, 0xEF, 0x80, 0xFB, 0xF0, 0xFE, 0x7F, 0xFB, + 0xCF, 0xFC, 0xF0, 0xFC, 0x3C, 0x00, 0x00, 0x60, 0x00, 0x7F, 0x00, 0x1F, + 0xF8, 0x03, 0xFF, 0x80, 0x7F, 0x80, 0x07, 0xE0, 0x00, 0x7C, 0x00, 0x03, + 0xC0, 0x00, 0x3C, 0x00, 0x01, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0xFC, + 0x07, 0x1F, 0xF8, 0x7B, 0xFF, 0xE3, 0xFC, 0x1F, 0x9D, 0xC0, 0x7E, 0xFC, + 0x01, 0xF7, 0xC0, 0x07, 0xBE, 0x00, 0x3F, 0xF0, 0x00, 0xFF, 0x00, 0x07, + 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x7B, 0xC0, + 0x03, 0xDE, 0x00, 0x3E, 0xF8, 0x01, 0xE3, 0xC0, 0x1F, 0x1F, 0x01, 0xF0, + 0x7E, 0x1F, 0x01, 0xFF, 0xF8, 0x07, 0xFF, 0x00, 0x0F, 0xE0, 0x00, 0x7F, + 0xF8, 0x1F, 0xFF, 0xC3, 0xFF, 0xFE, 0x78, 0x07, 0xCF, 0x00, 0x7D, 0xE0, + 0x0F, 0xBC, 0x00, 0xF7, 0x80, 0x3C, 0xF0, 0x07, 0x9E, 0x03, 0xE3, 0xFF, + 0xF8, 0x7F, 0xFF, 0x0F, 0xFF, 0xF9, 0xE0, 0x1F, 0xBC, 0x00, 0xF7, 0x80, + 0x1F, 0xF0, 0x03, 0xFE, 0x00, 0x7F, 0xC0, 0x0F, 0x78, 0x07, 0xEF, 0xFF, + 0xF9, 0xFF, 0xFC, 0x3F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, + 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, + 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x00, 0x03, + 0xFF, 0xF8, 0x07, 0xFF, 0xF0, 0x0F, 0xFF, 0xE0, 0x1E, 0x03, 0xC0, 0x3C, + 0x07, 0x80, 0x78, 0x0F, 0x00, 0xF0, 0x1E, 0x01, 0xE0, 0x3C, 0x03, 0xC0, + 0x78, 0x07, 0x00, 0xF0, 0x0E, 0x01, 0xE0, 0x3C, 0x03, 0xC0, 0x78, 0x07, + 0x80, 0xF0, 0x0F, 0x01, 0xE0, 0x1E, 0x07, 0x80, 0x3C, 0x0F, 0x00, 0x78, + 0x1E, 0x00, 0xF0, 0x78, 0x01, 0xE0, 0xF0, 0x03, 0xCF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, + 0x00, 0x1F, 0xC0, 0x00, 0x3B, 0x80, 0x00, 0x77, 0x00, 0x00, 0xEE, 0x00, + 0x01, 0xC0, 0x01, 0xFC, 0x00, 0x7F, 0xF0, 0x0F, 0xFF, 0x81, 0xF0, 0x7C, + 0x3C, 0x03, 0xE7, 0x80, 0x1E, 0x78, 0x01, 0xEF, 0x00, 0x0F, 0xF0, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x0F, 0x00, + 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, 0x3E, + 0x00, 0x03, 0xFC, 0x1C, 0x1F, 0xFF, 0xC0, 0x7F, 0xFE, 0x01, 0xFF, 0x00, + 0x7C, 0x03, 0xC0, 0x3C, 0x78, 0x07, 0x80, 0xF0, 0x78, 0x0F, 0x03, 0xE0, + 0x78, 0x1E, 0x0F, 0x80, 0xF8, 0x3C, 0x1E, 0x00, 0xF8, 0x78, 0x78, 0x00, + 0xF0, 0xF1, 0xE0, 0x00, 0xF1, 0xE7, 0x80, 0x00, 0xF3, 0xCE, 0x00, 0x00, + 0xF7, 0xBC, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xFC, 0x00, 0x7F, + 0xFF, 0xFC, 0x01, 0xF8, 0x78, 0x7C, 0x03, 0xC0, 0xF0, 0x7C, 0x0F, 0x81, + 0xE0, 0x78, 0x1E, 0x03, 0xC0, 0xF8, 0x7C, 0x07, 0x80, 0xF0, 0xF0, 0x0F, + 0x01, 0xE1, 0xE0, 0x1E, 0x03, 0xE7, 0x80, 0x3C, 0x03, 0xCF, 0x00, 0x78, + 0x07, 0xBE, 0x00, 0xF0, 0x07, 0x80, 0x07, 0xF0, 0x0F, 0xFF, 0x07, 0xFF, + 0xE0, 0xE0, 0xFC, 0x00, 0x1F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, + 0x00, 0x1F, 0x00, 0x1F, 0x80, 0xFF, 0x80, 0x3F, 0xE0, 0x0F, 0xFE, 0x00, + 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1E, 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x00, + 0xF9, 0xC0, 0xFE, 0x7F, 0xFF, 0x1F, 0xFF, 0x00, 0xFF, 0x00, 0xF0, 0x01, + 0xFF, 0x00, 0x3F, 0xF0, 0x07, 0xFF, 0x00, 0x7F, 0xF0, 0x0F, 0xFF, 0x00, + 0xEF, 0xF0, 0x1E, 0xFF, 0x03, 0xCF, 0xF0, 0x3C, 0xFF, 0x07, 0x8F, 0xF0, + 0x70, 0xFF, 0x0F, 0x0F, 0xF1, 0xE0, 0xFF, 0x1E, 0x0F, 0xF3, 0xC0, 0xFF, + 0x38, 0x0F, 0xF7, 0x80, 0xFF, 0x70, 0x0F, 0xFF, 0x00, 0xFF, 0xE0, 0x0F, + 0xFE, 0x00, 0xFF, 0xC0, 0x0F, 0xF8, 0x00, 0xF0, 0x0E, 0x07, 0x00, 0xE0, + 0x70, 0x0F, 0x0F, 0x00, 0x79, 0xE0, 0x03, 0xFC, 0x00, 0x0F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0xF0, 0x03, 0xFF, + 0x00, 0x7F, 0xF0, 0x07, 0xFF, 0x00, 0xFF, 0xF0, 0x0E, 0xFF, 0x01, 0xEF, + 0xF0, 0x3C, 0xFF, 0x03, 0xCF, 0xF0, 0x78, 0xFF, 0x07, 0x0F, 0xF0, 0xF0, + 0xFF, 0x1E, 0x0F, 0xF1, 0xE0, 0xFF, 0x3C, 0x0F, 0xF3, 0x80, 0xFF, 0x78, + 0x0F, 0xF7, 0x00, 0xFF, 0xF0, 0x0F, 0xFE, 0x00, 0xFF, 0xE0, 0x0F, 0xFC, + 0x00, 0xFF, 0x80, 0x0F, 0xF8, 0x03, 0xFF, 0x00, 0xFB, 0xE0, 0x3E, 0x7C, + 0x0F, 0x8F, 0x83, 0xE1, 0xF0, 0xF8, 0x3E, 0x3E, 0x07, 0xC7, 0x80, 0xF9, + 0xE0, 0x1F, 0x78, 0x03, 0xFF, 0x00, 0x7F, 0xF8, 0x0F, 0xFF, 0xC1, 0xF0, + 0xFC, 0x3E, 0x0F, 0x87, 0xC0, 0xF8, 0xF8, 0x0F, 0x1F, 0x01, 0xF3, 0xE0, + 0x1E, 0x7C, 0x03, 0xEF, 0x80, 0x3D, 0xF0, 0x07, 0xFE, 0x00, 0x78, 0x07, + 0xFF, 0xF0, 0x7F, 0xFF, 0x07, 0xFF, 0xF0, 0x78, 0x0F, 0x07, 0x80, 0xF0, + 0x78, 0x0F, 0x07, 0x80, 0xF0, 0x78, 0x0F, 0x07, 0x80, 0xF0, 0x78, 0x0F, + 0x07, 0x80, 0xF0, 0x78, 0x0F, 0x07, 0x80, 0xF0, 0x70, 0x0F, 0x0F, 0x00, + 0xF0, 0xF0, 0x0F, 0x0F, 0x00, 0xF0, 0xF0, 0x0F, 0x1E, 0x00, 0xF7, 0xE0, + 0x0F, 0xFC, 0x00, 0xFF, 0x80, 0x0F, 0xE0, 0x00, 0xF0, 0x3E, 0x00, 0x1F, + 0x8F, 0x80, 0x07, 0xE7, 0xF0, 0x03, 0xF9, 0xFC, 0x00, 0xFE, 0x7F, 0x00, + 0x3F, 0x9F, 0xE0, 0x1F, 0xE7, 0xB8, 0x07, 0x79, 0xEE, 0x01, 0xDE, 0x7B, + 0xC0, 0xF7, 0x9E, 0x70, 0x38, 0xE7, 0x1E, 0x0E, 0x39, 0xC7, 0x87, 0x0E, + 0x71, 0xE1, 0xC3, 0x9C, 0x3C, 0x70, 0xE7, 0x0F, 0x38, 0x3D, 0xC1, 0xCE, + 0x0F, 0xF0, 0x7B, 0x83, 0xFC, 0x1F, 0xC0, 0xFF, 0x03, 0xF0, 0x3F, 0xC0, + 0xF8, 0x0F, 0xF0, 0x3E, 0x03, 0xFC, 0x07, 0x80, 0xFF, 0x01, 0xC0, 0x3C, + 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x1F, + 0xE0, 0x03, 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, 0x7F, + 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, + 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, 0x78, 0x00, 0xFE, 0x00, 0x1F, 0xFE, + 0x00, 0xFF, 0xFC, 0x07, 0xE1, 0xF8, 0x3E, 0x01, 0xF1, 0xF0, 0x03, 0xE7, + 0x80, 0x07, 0xBE, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xC0, 0x00, 0xFF, 0x00, + 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x07, + 0xFE, 0x00, 0x1E, 0x78, 0x00, 0x79, 0xF0, 0x03, 0xE3, 0xE0, 0x1F, 0x07, + 0xE1, 0xF8, 0x0F, 0xFF, 0xC0, 0x1F, 0xFC, 0x00, 0x1F, 0xC0, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0xE0, + 0x03, 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, + 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, 0x7F, 0x80, + 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0x00, + 0x1F, 0xE0, 0x03, 0xFC, 0x00, 0x78, 0xF0, 0x7E, 0x03, 0xC7, 0xFE, 0x0F, + 0x3F, 0xFE, 0x3D, 0xF1, 0xFC, 0xFE, 0x01, 0xF3, 0xF0, 0x03, 0xEF, 0x80, + 0x07, 0xBE, 0x00, 0x1F, 0xF8, 0x00, 0x7F, 0xE0, 0x00, 0xFF, 0x80, 0x03, + 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x80, 0x07, 0xFE, + 0x00, 0x1E, 0xF8, 0x00, 0x7B, 0xF0, 0x03, 0xEF, 0xE0, 0x1F, 0x3F, 0xE1, + 0xF8, 0xFF, 0xFF, 0xC3, 0xE7, 0xFE, 0x0F, 0x8F, 0xE0, 0x3E, 0x00, 0x00, + 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0xF8, + 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xFF, + 0x00, 0xFF, 0xF0, 0xFF, 0xF8, 0x7F, 0x0E, 0x3E, 0x00, 0x1F, 0x00, 0x07, + 0x80, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, + 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, + 0x1F, 0x00, 0x03, 0xF0, 0x00, 0x7F, 0x0E, 0x0F, 0xFF, 0x81, 0xFF, 0xF0, + 0x1F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x07, 0x80, 0x01, + 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, + 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, + 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, + 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x78, 0x00, 0x7D, 0xE0, 0x01, 0xE7, + 0xC0, 0x07, 0x8F, 0x00, 0x3C, 0x3E, 0x00, 0xF0, 0x78, 0x03, 0xC1, 0xE0, + 0x1E, 0x07, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x0F, 0x00, 0x78, 0x3C, + 0x01, 0xE0, 0xE0, 0x07, 0xC7, 0x80, 0x0F, 0x1E, 0x00, 0x3C, 0x70, 0x00, + 0x7B, 0xC0, 0x01, 0xEF, 0x00, 0x07, 0xB8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, + 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, + 0x00, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x1E, 0x00, 0x01, 0xF0, 0x00, 0x0F, + 0xC0, 0x00, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, + 0x00, 0x03, 0xFF, 0x00, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0x01, 0xF9, + 0xE7, 0xE0, 0xF8, 0x78, 0x7C, 0x7C, 0x1E, 0x0F, 0x9E, 0x07, 0x81, 0xEF, + 0x81, 0xE0, 0x7F, 0xC0, 0x78, 0x0F, 0xF0, 0x1E, 0x03, 0xFC, 0x07, 0x80, + 0xFF, 0x01, 0xE0, 0x3F, 0xC0, 0x78, 0x0F, 0xF0, 0x1E, 0x03, 0xFC, 0x07, + 0x80, 0xFF, 0x81, 0xE0, 0x3D, 0xE0, 0x78, 0x1E, 0x7C, 0x1E, 0x0F, 0x8F, + 0x87, 0x87, 0xC1, 0xF9, 0xE3, 0xE0, 0x3F, 0xFF, 0xF0, 0x07, 0xFF, 0xF8, + 0x00, 0x3F, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x7C, 0x00, 0xF9, + 0xE0, 0x07, 0x8F, 0x80, 0x78, 0x3E, 0x07, 0xC0, 0xF0, 0x3C, 0x07, 0xC3, + 0xC0, 0x1F, 0x3C, 0x00, 0x79, 0xE0, 0x01, 0xFE, 0x00, 0x0F, 0xE0, 0x00, + 0x3F, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0x00, 0x0F, 0x78, + 0x00, 0x79, 0xE0, 0x07, 0x8F, 0x80, 0x78, 0x3C, 0x07, 0xC0, 0xF0, 0x3C, + 0x07, 0xC3, 0xE0, 0x1F, 0x3E, 0x00, 0x79, 0xE0, 0x03, 0xE0, 0xF0, 0x01, + 0xE7, 0x80, 0x0F, 0x3C, 0x00, 0x79, 0xE0, 0x03, 0xCF, 0x00, 0x1E, 0x78, + 0x00, 0xF3, 0xC0, 0x07, 0x9E, 0x00, 0x3C, 0xF0, 0x01, 0xE7, 0x80, 0x0F, + 0x3C, 0x00, 0x79, 0xE0, 0x03, 0xCF, 0x00, 0x1E, 0x78, 0x00, 0xF3, 0xC0, + 0x07, 0x9E, 0x00, 0x3C, 0xF0, 0x01, 0xE7, 0x80, 0x0F, 0x3C, 0x00, 0x79, + 0xE0, 0x03, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, + 0x07, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x70, + 0x00, 0x03, 0x80, 0x00, 0x1C, 0xF0, 0x03, 0xFC, 0x00, 0xFF, 0x00, 0x3F, + 0xC0, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0xFF, 0x00, 0x3F, 0xC0, 0x0F, 0xF0, + 0x03, 0xFE, 0x00, 0xFF, 0x80, 0x3D, 0xF0, 0x3F, 0x7F, 0xFF, 0xCF, 0xFE, + 0xF0, 0xFE, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, + 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0xF0, 0x0F, 0x00, + 0xFF, 0x00, 0xF0, 0x0F, 0xF0, 0x0F, 0x00, 0xFF, 0x00, 0xF0, 0x0F, 0xF0, + 0x0F, 0x00, 0xFF, 0x00, 0xF0, 0x0F, 0xF0, 0x0F, 0x00, 0xFF, 0x00, 0xF0, + 0x0F, 0xF0, 0x0F, 0x00, 0xFF, 0x00, 0xF0, 0x0F, 0xF0, 0x0F, 0x00, 0xFF, + 0x00, 0xF0, 0x0F, 0xF0, 0x0F, 0x00, 0xFF, 0x00, 0xF0, 0x0F, 0xF0, 0x0F, + 0x00, 0xFF, 0x00, 0xF0, 0x0F, 0xF0, 0x0F, 0x00, 0xFF, 0x00, 0xF0, 0x0F, + 0xF0, 0x0F, 0x00, 0xFF, 0x00, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0x0F, 0x00, 0xF1, 0xE0, 0x1E, + 0x01, 0xE3, 0xC0, 0x3C, 0x03, 0xC7, 0x80, 0x78, 0x07, 0x8F, 0x00, 0xF0, + 0x0F, 0x1E, 0x01, 0xE0, 0x1E, 0x3C, 0x03, 0xC0, 0x3C, 0x78, 0x07, 0x80, + 0x78, 0xF0, 0x0F, 0x00, 0xF1, 0xE0, 0x1E, 0x01, 0xE3, 0xC0, 0x3C, 0x03, + 0xC7, 0x80, 0x78, 0x07, 0x8F, 0x00, 0xF0, 0x0F, 0x1E, 0x01, 0xE0, 0x1E, + 0x3C, 0x03, 0xC0, 0x3C, 0x78, 0x07, 0x80, 0x78, 0xF0, 0x0F, 0x00, 0xF1, + 0xE0, 0x1E, 0x01, 0xE3, 0xC0, 0x3C, 0x03, 0xC7, 0x80, 0x78, 0x07, 0x8F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0xC0, 0x00, + 0x00, 0x03, 0x80, 0xFF, 0xE0, 0x00, 0x7F, 0xF0, 0x00, 0x3F, 0xF8, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, + 0x00, 0x07, 0xFF, 0x80, 0x03, 0xFF, 0xF8, 0x01, 0xFF, 0xFE, 0x00, 0xF0, + 0x1F, 0x80, 0x78, 0x03, 0xE0, 0x3C, 0x00, 0xF0, 0x1E, 0x00, 0x78, 0x0F, + 0x00, 0x3E, 0x07, 0x80, 0x1F, 0x03, 0xC0, 0x0F, 0x01, 0xE0, 0x07, 0x80, + 0xF0, 0x07, 0xC0, 0x78, 0x0F, 0xC0, 0x3F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, + 0x0F, 0xFF, 0x00, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, + 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xC0, 0x00, + 0x1F, 0xFF, 0xE0, 0x0F, 0xFF, 0xFC, 0x07, 0xFF, 0xFF, 0x83, 0xFC, 0x07, + 0xE1, 0xFE, 0x01, 0xF0, 0xFF, 0x00, 0x7C, 0x7F, 0x80, 0x1E, 0x3F, 0xC0, + 0x0F, 0x1F, 0xE0, 0x07, 0x8F, 0xF0, 0x03, 0xC7, 0xF8, 0x03, 0xE3, 0xFC, + 0x03, 0xE1, 0xFE, 0x03, 0xE0, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xE0, 0x3F, + 0xFF, 0x80, 0x1E, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, + 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0xFF, 0x80, 0xFF, 0xFE, + 0x1F, 0xFF, 0xF3, 0xC0, 0x7E, 0x78, 0x03, 0xEF, 0x00, 0x3D, 0xE0, 0x07, + 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 0x03, 0xFE, 0x00, 0x7B, 0xC0, 0x1F, + 0x78, 0x0F, 0xCF, 0xFF, 0xF1, 0xFF, 0xFC, 0x3F, 0xF8, 0x00, 0x0F, 0xE0, + 0x0F, 0xFF, 0x81, 0xFF, 0xF8, 0x3C, 0x3F, 0x80, 0x00, 0xF8, 0x00, 0x0F, + 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x7F, 0xFF, + 0x8F, 0xFF, 0xF1, 0xFF, 0xFE, 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00, 0x1E, + 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00, 0x3E, 0x3C, 0x7F, 0x87, 0xFF, 0xE1, + 0xFF, 0xF0, 0x07, 0xF8, 0x00, 0xF0, 0x01, 0xFC, 0x0F, 0x00, 0x7F, 0xF0, + 0xF0, 0x0F, 0xFF, 0x8F, 0x01, 0xF0, 0xFC, 0xF0, 0x3E, 0x03, 0xEF, 0x03, + 0xC0, 0x1E, 0xF0, 0x78, 0x01, 0xFF, 0x07, 0x80, 0x0F, 0xF0, 0x78, 0x00, + 0xFF, 0x0F, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, + 0xF0, 0x00, 0xFF, 0x0F, 0x00, 0x0F, 0xF0, 0xF0, 0x00, 0xFF, 0x07, 0x80, + 0x0F, 0xF0, 0x78, 0x01, 0xEF, 0x07, 0xC0, 0x1E, 0xF0, 0x3E, 0x03, 0xCF, + 0x01, 0xF0, 0xFC, 0xF0, 0x0F, 0xFF, 0x8F, 0x00, 0x7F, 0xE0, 0xF0, 0x01, + 0xF8, 0x00, 0x01, 0xFF, 0xE1, 0xFF, 0xFC, 0x7F, 0xFF, 0x9F, 0x80, 0xF7, + 0xC0, 0x1E, 0xF8, 0x03, 0xDE, 0x00, 0x7B, 0xC0, 0x0F, 0x7C, 0x01, 0xE7, + 0xC0, 0x3C, 0x7E, 0x07, 0x87, 0xFF, 0xF0, 0x1F, 0xFE, 0x0F, 0xFF, 0xC3, + 0xE0, 0x78, 0xF8, 0x0F, 0x1E, 0x01, 0xE7, 0x80, 0x3C, 0xF0, 0x07, 0xBE, + 0x00, 0xF7, 0x80, 0x1F, 0xF0, 0x03, 0xFC, 0x00, 0x78, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x80, 0x03, 0xFB, + 0x80, 0x06, 0xF3, 0x80, 0x1D, 0xE7, 0x00, 0x73, 0xC7, 0x00, 0xC7, 0x87, + 0x03, 0x8F, 0x0E, 0x0E, 0x1E, 0x0E, 0x18, 0x3C, 0x0C, 0x70, 0x78, 0x1D, + 0xC0, 0xF0, 0x1F, 0x01, 0xE0, 0x1E, 0x03, 0xC0, 0x38, 0x07, 0x80, 0x78, + 0x0F, 0x01, 0xF0, 0x1E, 0x07, 0x70, 0x3C, 0x0C, 0x70, 0x78, 0x38, 0x60, + 0xF0, 0xE0, 0xE1, 0xE1, 0xC0, 0xE3, 0xC7, 0x00, 0xC7, 0x9C, 0x01, 0xCF, + 0x38, 0x01, 0xDE, 0xE0, 0x01, 0xBF, 0x80, 0x03, 0xFF, 0x00, 0x03, 0xFC, + 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0x03, 0x00, 0xF0, + 0x78, 0x0F, 0x87, 0x80, 0xF0, 0x78, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x7F, 0xF0, 0x0F, 0xFF, 0x81, + 0xF0, 0x7C, 0x3C, 0x03, 0xE7, 0x80, 0x1E, 0x78, 0x01, 0xEF, 0x00, 0x0F, + 0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, + 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0xC0, + 0x00, 0x3E, 0x00, 0x03, 0xFC, 0x1C, 0x1F, 0xFF, 0xC0, 0x7F, 0xFE, 0x01, + 0xFF, 0x00 }; + +const GFXglyph MyriadPro_Regular24pt8bGlyphs[] PROGMEM = { + { 0, 17, 39, 23, 4, -38 }, // 0x401 + { 83, 29, 39, 31, 0, -31 }, // 0x402 + { 225, 16, 39, 20, 4, -38 }, // 0x403 + { 303, 24, 32, 27, 2, -31 }, // 0x404 + { 399, 19, 32, 23, 2, -31 }, // 0x405 + { 475, 4, 32, 11, 4, -31 }, // 0x406 + { 491, 13, 39, 11, -1, -38 }, // 0x407 + { 555, 14, 32, 17, 0, -31 }, // 0x408 + { 611, 40, 32, 41, 0, -31 }, // 0x409 + { 771, 36, 32, 42, 4, -31 }, // 0x40A + { 915, 28, 32, 32, 0, -31 }, // 0x40B + { 1027, 21, 39, 25, 4, -38 }, // 0x40C + { 1130, 23, 33, 24, 0, -32 }, // 0x40D + { 1225, 25, 39, 24, 0, -38 }, // 0x40E + { 1347, 22, 40, 30, 4, -31 }, // 0x40F + { 1457, 27, 32, 29, 1, -31 }, // 0x410 + { 1565, 20, 32, 26, 4, -31 }, // 0x411 + { 1645, 20, 32, 25, 4, -31 }, // 0x412 + { 1725, 16, 32, 20, 4, -31 }, // 0x413 + { 1789, 27, 40, 30, 1, -31 }, // 0x414 + { 1924, 17, 32, 23, 4, -31 }, // 0x415 + { 1992, 36, 32, 38, 1, -31 }, // 0x416 + { 2136, 20, 32, 23, 1, -31 }, // 0x417 + { 2216, 23, 32, 31, 4, -31 }, // 0x418 + { 2308, 23, 39, 31, 4, -38 }, // 0x419 + { 2421, 21, 32, 25, 4, -31 }, // 0x41A + { 2505, 24, 32, 28, 0, -31 }, // 0x41B + { 2601, 32, 32, 38, 3, -31 }, // 0x41C + { 2729, 23, 32, 31, 4, -31 }, // 0x41D + { 2821, 29, 32, 32, 2, -31 }, // 0x41E + { 2937, 22, 32, 30, 4, -31 }, // 0x41F + { 3025, 19, 32, 25, 4, -31 }, // 0x420 + { 3101, 24, 32, 27, 2, -31 }, // 0x421 + { 3197, 23, 32, 23, 0, -31 }, // 0x422 + { 3289, 25, 32, 24, 0, -31 }, // 0x423 + { 3389, 30, 34, 34, 2, -32 }, // 0x424 + { 3517, 25, 32, 27, 1, -31 }, // 0x425 + { 3617, 25, 40, 31, 4, -31 }, // 0x426 + { 3742, 22, 32, 28, 3, -31 }, // 0x427 + { 3830, 32, 32, 40, 4, -31 }, // 0x428 + { 3958, 35, 40, 41, 4, -31 }, // 0x429 + { 4133, 28, 32, 30, 0, -31 }, // 0x42A + { 4245, 27, 32, 35, 4, -31 }, // 0x42B + { 4353, 20, 32, 26, 4, -31 }, // 0x42C + { 4433, 24, 32, 27, 1, -31 }, // 0x42D + { 4529, 35, 32, 41, 4, -31 }, // 0x42E + { 4669, 21, 32, 26, 1, -31 }, // 0x42F + { 4753, 18, 23, 23, 2, -22 }, // 0x430 + { 4805, 21, 34, 25, 2, -33 }, // 0x431 + { 4895, 19, 23, 24, 3, -22 }, // 0x432 + { 4950, 14, 23, 18, 3, -22 }, // 0x433 + { 4991, 23, 30, 25, 0, -22 }, // 0x434 + { 5078, 20, 23, 24, 2, -22 }, // 0x435 + { 5136, 31, 23, 31, 0, -22 }, // 0x436 + { 5226, 18, 23, 20, 1, -22 }, // 0x437 + { 5278, 20, 23, 26, 3, -22 }, // 0x438 + { 5336, 20, 32, 26, 3, -31 }, // 0x439 + { 5416, 19, 23, 23, 3, -22 }, // 0x43A + { 5471, 20, 23, 24, 0, -22 }, // 0x43B + { 5529, 26, 23, 30, 2, -22 }, // 0x43C + { 5604, 19, 23, 26, 3, -22 }, // 0x43D + { 5659, 22, 23, 26, 2, -22 }, // 0x43E + { 5723, 19, 23, 25, 3, -22 }, // 0x43F + { 5778, 22, 32, 27, 3, -22 }, // 0x440 + { 5866, 18, 23, 21, 2, -22 }, // 0x441 + { 5918, 18, 23, 19, 1, -22 }, // 0x442 + { 5970, 22, 33, 22, 0, -22 }, // 0x443 + { 6061, 26, 43, 30, 2, -33 }, // 0x444 + { 6201, 21, 23, 22, 0, -22 }, // 0x445 + { 6262, 21, 30, 26, 3, -22 }, // 0x446 + { 6341, 18, 23, 24, 3, -22 }, // 0x447 + { 6393, 28, 23, 35, 3, -22 }, // 0x448 + { 6474, 31, 30, 35, 3, -22 }, // 0x449 + { 6591, 25, 23, 27, 1, -22 }, // 0x44A + { 6663, 25, 23, 31, 3, -22 }, // 0x44B + { 6735, 19, 23, 23, 3, -22 }, // 0x44C + { 6790, 19, 23, 22, 1, -22 }, // 0x44D + { 6845, 28, 23, 33, 3, -22 }, // 0x44E + { 6926, 19, 23, 23, 1, -22 }, // 0x44F + { 6981, 23, 33, 24, 0, -32 }, // 0x450 + { 7076, 20, 31, 24, 2, -30 } }; // 0x451 + +const GFXfont MyriadPro_Regular24pt8b PROGMEM = { + (uint8_t *)MyriadPro_Regular24pt8bBitmaps, + (GFXglyph *)MyriadPro_Regular24pt8bGlyphs, + 0x401, 0x451, 56 }; + +// Approx. 7728 bytes diff --git a/examples/demo-menu/src/UTF8-fonts/MyriadPro_Regular9pt8b.h b/examples/demo-menu/src/UTF8-fonts/MyriadPro_Regular9pt8b.h new file mode 100644 index 0000000..80c56de --- /dev/null +++ b/examples/demo-menu/src/UTF8-fonts/MyriadPro_Regular9pt8b.h @@ -0,0 +1,180 @@ +const uint8_t MyriadPro_Regular9pt8bBitmaps[] PROGMEM = { + 0x44, 0xD8, 0x07, 0xFC, 0x18, 0x30, 0x60, 0xFD, 0x83, 0x06, 0x0C, 0x18, + 0x3F, 0x80, 0xFF, 0x83, 0x00, 0x60, 0x0C, 0x01, 0xF8, 0x39, 0x86, 0x18, + 0xC3, 0x18, 0x63, 0x0C, 0x61, 0x8C, 0x30, 0x0C, 0x03, 0x00, 0x08, 0x20, + 0x07, 0xFC, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x00, + 0x1F, 0x18, 0x18, 0x18, 0x08, 0x07, 0xF2, 0x01, 0x00, 0xC0, 0x30, 0x1C, + 0x03, 0xE0, 0x3C, 0xCB, 0x06, 0x0C, 0x0F, 0x07, 0x03, 0x06, 0x0E, 0x37, + 0xC0, 0xFF, 0xFF, 0xFF, 0x94, 0xC0, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, + 0x31, 0x80, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, 0x47, 0xE0, 0x3F, 0x80, + 0x63, 0x00, 0xC6, 0x01, 0x8C, 0x03, 0x1F, 0x86, 0x31, 0x8C, 0x61, 0x98, + 0xC3, 0x21, 0x86, 0x43, 0x0D, 0x86, 0x36, 0x0F, 0xC0, 0xC1, 0x03, 0x04, + 0x0C, 0x10, 0x30, 0x40, 0xC1, 0x03, 0xFF, 0xEC, 0x10, 0xF0, 0x43, 0xC1, + 0x07, 0x04, 0x3C, 0x11, 0xB0, 0x7C, 0xFF, 0x83, 0x00, 0x60, 0x0C, 0x01, + 0xF8, 0x39, 0x86, 0x18, 0xC3, 0x18, 0x63, 0x0C, 0x61, 0x8C, 0x30, 0x0C, + 0x18, 0x00, 0xC3, 0xC6, 0xCC, 0xC8, 0xD0, 0xF8, 0xCC, 0xC6, 0xC6, 0xC2, + 0xC3, 0xC1, 0xFF, 0xE0, 0xF8, 0xB4, 0x59, 0x4C, 0x46, 0x23, 0x29, 0xA2, + 0xF1, 0x70, 0x7F, 0xF0, 0x32, 0x0E, 0x00, 0x18, 0x34, 0x1B, 0x08, 0x8C, + 0x64, 0x12, 0x0F, 0x03, 0x01, 0x80, 0x80, 0xC1, 0xC0, 0xC1, 0xE0, 0xF0, + 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7F, 0xF0, 0x80, + 0x40, 0x20, 0x0C, 0x03, 0x80, 0xA0, 0x68, 0x13, 0x04, 0x43, 0x18, 0xFE, + 0x20, 0x98, 0x36, 0x0D, 0x01, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0xC6, 0xC3, + 0xC3, 0xC3, 0xC3, 0xC6, 0xFC, 0xFC, 0xC6, 0xC2, 0xC2, 0xC6, 0xF8, 0xC6, + 0xC3, 0xC3, 0xC3, 0xC6, 0xFC, 0xFF, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, + 0xC1, 0x83, 0x06, 0x00, 0x1F, 0x82, 0x10, 0x42, 0x08, 0x41, 0x08, 0x21, + 0x04, 0x21, 0x84, 0x30, 0x84, 0x11, 0x82, 0x7F, 0xEC, 0x05, 0x80, 0xA0, + 0x10, 0xFF, 0x83, 0x06, 0x0C, 0x1F, 0xB0, 0x60, 0xC1, 0x83, 0x07, 0xF0, + 0x63, 0x08, 0x8C, 0x63, 0x33, 0x06, 0xD8, 0x0B, 0x40, 0x7F, 0x83, 0x33, + 0x08, 0xC4, 0x63, 0x19, 0x8C, 0x24, 0x30, 0xB0, 0xC3, 0x79, 0x18, 0x10, + 0x20, 0xCE, 0x03, 0x03, 0x06, 0x0E, 0x37, 0xC0, 0xC1, 0xE0, 0xF0, 0xF8, + 0x5C, 0x6E, 0x67, 0x23, 0xB1, 0xD0, 0xF8, 0x78, 0x38, 0x10, 0x12, 0x0E, + 0x00, 0x18, 0x3C, 0x1E, 0x1F, 0x0B, 0x8D, 0xCC, 0xE4, 0x76, 0x3A, 0x1F, + 0x0F, 0x07, 0x02, 0xC3, 0xC6, 0xCC, 0xC8, 0xD0, 0xF8, 0xCC, 0xC6, 0xC6, + 0xC2, 0xC3, 0xC1, 0x3F, 0x98, 0x4C, 0x26, 0x13, 0x09, 0x84, 0xC2, 0x61, + 0x20, 0x90, 0x58, 0x38, 0x10, 0x60, 0x66, 0x06, 0x70, 0x75, 0x0F, 0x50, + 0xBD, 0x9B, 0xC9, 0x3C, 0x93, 0xCF, 0x3C, 0x63, 0xC6, 0x1C, 0x61, 0xC0, + 0xE0, 0x70, 0x38, 0x1C, 0x0F, 0xFF, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, + 0x10, 0x1E, 0x1C, 0xE4, 0x0F, 0x03, 0x80, 0x60, 0x18, 0x06, 0x01, 0xC0, + 0xF0, 0x37, 0x38, 0x78, 0xFF, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, + 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x30, 0xFC, 0xC6, 0xC3, 0xC3, 0xC3, 0xC6, + 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x1F, 0x98, 0x18, 0x18, 0x08, 0x04, + 0x02, 0x01, 0x00, 0xC0, 0x60, 0x1C, 0x03, 0xE0, 0xFF, 0x84, 0x02, 0x01, + 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0xC1, 0xA0, + 0xD8, 0x44, 0x63, 0x20, 0x90, 0x78, 0x18, 0x0C, 0x04, 0x06, 0x0E, 0x00, + 0x04, 0x07, 0xF1, 0x93, 0x62, 0x38, 0x47, 0x08, 0x61, 0x0C, 0x23, 0xC4, + 0x6C, 0x98, 0xFE, 0x02, 0x00, 0x61, 0x98, 0x63, 0x30, 0x48, 0x1E, 0x03, + 0x00, 0xC0, 0x78, 0x13, 0x0C, 0xC6, 0x19, 0x02, 0xC1, 0xB0, 0x6C, 0x1B, + 0x06, 0xC1, 0xB0, 0x6C, 0x1B, 0x06, 0xC1, 0xB0, 0x6C, 0x1B, 0xFF, 0x00, + 0xC0, 0x10, 0x04, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0x63, 0x3D, 0x01, + 0x01, 0x01, 0x01, 0xC2, 0x1E, 0x10, 0xF0, 0x87, 0x84, 0x3C, 0x21, 0xE1, + 0x0F, 0x08, 0x78, 0x43, 0xC2, 0x1E, 0x10, 0xF0, 0x87, 0xFF, 0xF0, 0xC2, + 0x1B, 0x08, 0x6C, 0x21, 0xB0, 0x86, 0xC2, 0x1B, 0x08, 0x6C, 0x21, 0xB0, + 0x86, 0xC2, 0x1B, 0x08, 0x6C, 0x21, 0xBF, 0xFF, 0x00, 0x0C, 0x00, 0x30, + 0x00, 0xC0, 0xF8, 0x06, 0x01, 0x80, 0x60, 0x1F, 0x06, 0x71, 0x8C, 0x61, + 0x18, 0x46, 0x31, 0x9C, 0x7C, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3F, 0xC7, + 0x8C, 0xF0, 0xDE, 0x1B, 0xC3, 0x78, 0x6F, 0x19, 0xFE, 0x30, 0xC0, 0xC0, + 0xC0, 0xC0, 0xFC, 0xC6, 0xC3, 0xC3, 0xC3, 0xC3, 0xC6, 0xFC, 0xF8, 0x8E, + 0x03, 0x03, 0x01, 0x7F, 0x01, 0x01, 0x03, 0x06, 0x8E, 0xF8, 0xC3, 0xE3, + 0x18, 0xCC, 0xC1, 0xB3, 0x02, 0xC8, 0x0F, 0xE0, 0x3C, 0x80, 0xF2, 0x02, + 0xCC, 0x0B, 0x30, 0x6C, 0x63, 0x30, 0xF8, 0x1F, 0x71, 0x61, 0x41, 0x61, + 0x31, 0x0F, 0x31, 0x21, 0x61, 0x61, 0x41, 0x78, 0x30, 0x4F, 0xC6, 0x18, + 0x73, 0x74, 0x0E, 0x3C, 0x60, 0xC0, 0xBC, 0xC6, 0xC2, 0x83, 0x83, 0x83, + 0xC2, 0x66, 0x3C, 0xFD, 0x8F, 0x1E, 0x2F, 0x98, 0xF0, 0xE3, 0xFC, 0xFE, + 0x31, 0x8C, 0x63, 0x18, 0xC0, 0x3F, 0x19, 0x8C, 0xC6, 0x62, 0x31, 0x18, + 0x8C, 0xC6, 0xFF, 0xC0, 0xE0, 0x70, 0x30, 0x38, 0x8B, 0x1C, 0x1F, 0xF0, + 0x30, 0x70, 0x3E, 0x46, 0x66, 0x64, 0x36, 0x81, 0x78, 0x3F, 0x86, 0x6C, + 0x66, 0x64, 0x66, 0xC6, 0x20, 0x7C, 0x98, 0x18, 0x63, 0x80, 0xC1, 0x83, + 0x7C, 0xC7, 0xC7, 0xCF, 0xCB, 0xDB, 0xD3, 0xE3, 0xE3, 0xC3, 0x24, 0x3C, + 0x00, 0xC7, 0xC7, 0xCF, 0xCB, 0xDB, 0xD3, 0xE3, 0xE3, 0xC3, 0xC7, 0x9B, + 0x66, 0x8F, 0x99, 0xB1, 0x63, 0xC6, 0x3F, 0x23, 0x23, 0x23, 0x23, 0x23, + 0x63, 0x63, 0xC3, 0xC1, 0xB8, 0xEA, 0x2A, 0x8A, 0xB6, 0xA5, 0x29, 0x4A, + 0x72, 0x88, 0x80, 0xC3, 0x87, 0x0E, 0x1F, 0xF8, 0x70, 0xE1, 0xC2, 0x3C, + 0x66, 0xC3, 0x83, 0x83, 0x83, 0xC3, 0x66, 0x3C, 0xFF, 0x87, 0x0E, 0x1C, + 0x38, 0x70, 0xE1, 0xC2, 0xDE, 0xE7, 0xC3, 0xC1, 0xC1, 0xC1, 0xC3, 0xE6, + 0xDC, 0xC0, 0xC0, 0xC0, 0xC0, 0x3D, 0x8C, 0x20, 0x82, 0x0C, 0x18, 0x3C, + 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0xC3, 0x43, 0x62, 0x26, + 0x34, 0x34, 0x1C, 0x18, 0x18, 0x10, 0x30, 0x60, 0x08, 0x02, 0x00, 0x80, + 0x20, 0x3E, 0x1A, 0x6C, 0x8A, 0x23, 0x88, 0xE2, 0x3C, 0x89, 0xA6, 0x3E, + 0x02, 0x00, 0x80, 0x20, 0x08, 0x00, 0x43, 0x66, 0x34, 0x1C, 0x18, 0x3C, + 0x24, 0x66, 0xC3, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xFF, + 0x01, 0x01, 0x01, 0xC7, 0x8F, 0x1E, 0x3C, 0x6F, 0xC1, 0x83, 0x06, 0xC4, + 0x78, 0x8F, 0x11, 0xE2, 0x3C, 0x47, 0x88, 0xF1, 0x1E, 0x23, 0xFF, 0xE0, + 0xC4, 0x6C, 0x46, 0xC4, 0x6C, 0x46, 0xC4, 0x6C, 0x46, 0xC4, 0x6C, 0x46, + 0xFF, 0xF0, 0x03, 0x00, 0x30, 0x03, 0xF0, 0x04, 0x01, 0x00, 0x7C, 0x11, + 0x84, 0x31, 0x0C, 0x46, 0x1F, 0x00, 0xC0, 0xE0, 0x70, 0x3F, 0x1C, 0x6E, + 0x37, 0x1B, 0x99, 0xF8, 0x80, 0xC1, 0x83, 0x07, 0xEC, 0x78, 0x70, 0xE3, + 0xF8, 0x78, 0x0E, 0x06, 0x02, 0x3F, 0x02, 0x06, 0x0E, 0x78, 0xC7, 0x99, + 0x9B, 0x21, 0x6C, 0x3F, 0x87, 0xB0, 0xF6, 0x16, 0x66, 0xC7, 0x80, 0x3F, + 0x63, 0x43, 0x63, 0x1F, 0x23, 0x63, 0x43, 0xC3, 0xFF, 0xE0, 0xF8, 0xB4, + 0x59, 0x4C, 0x46, 0x23, 0x29, 0xA2, 0xF1, 0x70, 0x7F, 0xF0, 0x64, 0xC8, + 0x01, 0xC4, 0x58, 0xE0, 0xFF, 0x81, 0x83, 0x81, 0xF0 }; + +const GFXglyph MyriadPro_Regular9pt8bGlyphs[] PROGMEM = { + { 0, 7, 15, 9, 1, -14 }, // 0x401 + { 14, 11, 14, 12, 0, -11 }, // 0x402 + { 34, 7, 15, 8, 1, -14 }, // 0x403 + { 48, 9, 12, 10, 1, -11 }, // 0x404 + { 62, 7, 12, 9, 1, -11 }, // 0x405 + { 73, 2, 12, 4, 1, -11 }, // 0x406 + { 76, 5, 15, 4, 0, -14 }, // 0x407 + { 86, 5, 12, 7, 0, -11 }, // 0x408 + { 94, 15, 12, 16, 0, -11 }, // 0x409 + { 117, 14, 12, 16, 1, -11 }, // 0x40A + { 138, 11, 12, 12, 0, -11 }, // 0x40B + { 155, 8, 15, 10, 1, -14 }, // 0x40C + { 170, 9, 12, 9, 0, -11 }, // 0x40D + { 184, 9, 15, 9, 0, -14 }, // 0x40E + { 201, 9, 15, 11, 1, -11 }, // 0x40F + { 218, 10, 12, 11, 0, -11 }, // 0x410 + { 233, 8, 12, 10, 1, -11 }, // 0x411 + { 245, 8, 12, 10, 1, -11 }, // 0x412 + { 257, 7, 12, 8, 1, -11 }, // 0x413 + { 268, 11, 15, 11, 0, -11 }, // 0x414 + { 289, 7, 12, 9, 1, -11 }, // 0x415 + { 300, 14, 12, 14, 0, -11 }, // 0x416 + { 321, 7, 12, 9, 1, -11 }, // 0x417 + { 332, 9, 12, 12, 1, -11 }, // 0x418 + { 346, 9, 15, 12, 1, -14 }, // 0x419 + { 363, 8, 12, 10, 1, -11 }, // 0x41A + { 375, 9, 12, 10, 0, -11 }, // 0x41B + { 389, 12, 12, 14, 1, -11 }, // 0x41C + { 407, 9, 12, 11, 1, -11 }, // 0x41D + { 421, 10, 12, 12, 1, -11 }, // 0x41E + { 436, 9, 12, 11, 1, -11 }, // 0x41F + { 450, 8, 12, 9, 1, -11 }, // 0x420 + { 462, 9, 12, 10, 1, -11 }, // 0x421 + { 476, 9, 12, 9, 0, -11 }, // 0x422 + { 490, 9, 12, 9, 0, -11 }, // 0x423 + { 504, 11, 12, 13, 1, -11 }, // 0x424 + { 521, 10, 12, 10, 0, -11 }, // 0x425 + { 536, 10, 15, 11, 1, -11 }, // 0x426 + { 555, 8, 12, 11, 1, -11 }, // 0x427 + { 567, 13, 12, 15, 1, -11 }, // 0x428 + { 587, 14, 15, 15, 1, -11 }, // 0x429 + { 614, 10, 12, 11, 0, -11 }, // 0x42A + { 629, 11, 12, 13, 1, -11 }, // 0x42B + { 646, 8, 12, 10, 1, -11 }, // 0x42C + { 658, 8, 12, 10, 1, -11 }, // 0x42D + { 670, 14, 12, 15, 1, -11 }, // 0x42E + { 691, 8, 12, 10, 0, -11 }, // 0x42F + { 703, 6, 9, 9, 1, -8 }, // 0x430 + { 710, 8, 13, 9, 1, -12 }, // 0x431 + { 723, 7, 9, 9, 1, -8 }, // 0x432 + { 731, 5, 9, 7, 1, -8 }, // 0x433 + { 737, 9, 12, 9, 0, -8 }, // 0x434 + { 751, 7, 9, 9, 1, -8 }, // 0x435 + { 759, 12, 9, 12, 0, -8 }, // 0x436 + { 773, 7, 9, 8, 0, -8 }, // 0x437 + { 781, 8, 9, 10, 1, -8 }, // 0x438 + { 790, 8, 12, 10, 1, -11 }, // 0x439 + { 802, 7, 9, 8, 1, -8 }, // 0x43A + { 810, 8, 9, 9, 0, -8 }, // 0x43B + { 819, 10, 9, 11, 1, -8 }, // 0x43C + { 831, 7, 9, 10, 1, -8 }, // 0x43D + { 839, 8, 9, 10, 1, -8 }, // 0x43E + { 848, 7, 9, 10, 1, -8 }, // 0x43F + { 856, 8, 13, 10, 1, -8 }, // 0x440 + { 869, 6, 9, 8, 1, -8 }, // 0x441 + { 876, 7, 9, 7, 0, -8 }, // 0x442 + { 884, 8, 12, 8, 0, -8 }, // 0x443 + { 896, 10, 17, 11, 1, -12 }, // 0x444 + { 918, 8, 9, 8, 0, -8 }, // 0x445 + { 927, 8, 12, 10, 1, -8 }, // 0x446 + { 939, 7, 9, 9, 1, -8 }, // 0x447 + { 947, 11, 9, 13, 1, -8 }, // 0x448 + { 960, 12, 12, 13, 1, -8 }, // 0x449 + { 978, 10, 9, 10, 0, -8 }, // 0x44A + { 990, 9, 9, 12, 1, -8 }, // 0x44B + { 1001, 7, 9, 9, 1, -8 }, // 0x44C + { 1009, 8, 9, 8, 0, -8 }, // 0x44D + { 1018, 11, 9, 12, 1, -8 }, // 0x44E + { 1031, 8, 9, 9, 0, -8 }, // 0x44F + { 1040, 9, 12, 9, 0, -11 }, // 0x450 + { 1054, 7, 12, 9, 1, -11 } }; // 0x451 + +const GFXfont MyriadPro_Regular9pt8b PROGMEM = { + (uint8_t *)MyriadPro_Regular9pt8bBitmaps, + (GFXglyph *)MyriadPro_Regular9pt8bGlyphs, + 0x401, 0x451, 21 }; + +// Approx. 1639 bytes diff --git a/examples/demo-menu/src/UTF8-fonts/Roboto-Bold.ttf.9pt.RUS.h b/examples/demo-menu/src/UTF8-fonts/Roboto-Bold.ttf.9pt.RUS.h new file mode 100644 index 0000000..324188e --- /dev/null +++ b/examples/demo-menu/src/UTF8-fonts/Roboto-Bold.ttf.9pt.RUS.h @@ -0,0 +1,207 @@ +const uint8_t Roboto_Bold9pt8bRUSBitmaps[] PROGMEM = { + 0x70, 0x0C, 0x07, 0x00, 0x0F, 0xFF, 0xFF, 0x81, 0xC0, 0xE0, 0x7F, 0xBF, + 0xDC, 0x0E, 0x07, 0x03, 0x81, 0xFF, 0xFF, 0x80, 0x63, 0x3B, 0x80, 0x1F, + 0xFF, 0xFF, 0x03, 0x81, 0xC0, 0xFF, 0x7F, 0xB8, 0x1C, 0x0E, 0x07, 0x03, + 0xFF, 0xFF, 0xFF, 0xC7, 0xFE, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0F, 0xF0, + 0x7F, 0xC3, 0x8E, 0x1C, 0x38, 0xE1, 0xC7, 0x0C, 0x39, 0xE1, 0xCC, 0x00, + 0x07, 0x06, 0x07, 0x00, 0x0F, 0xFF, 0xFF, 0x81, 0xC0, 0xE0, 0x70, 0x38, + 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x00, 0x1F, 0x1F, 0xE7, 0x1F, + 0x87, 0xE0, 0x3F, 0x0F, 0xC3, 0x80, 0xE0, 0x38, 0x77, 0x1D, 0xFE, 0x1F, + 0x00, 0x3E, 0x3F, 0xF8, 0xFC, 0x3E, 0x03, 0xC0, 0xFC, 0x1F, 0x03, 0xE0, + 0xF8, 0xEF, 0xF3, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE7, 0xCC, 0x01, + 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x03, + 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0xF1, 0xD8, 0xEF, + 0xE3, 0xE0, 0x1F, 0xF0, 0x03, 0xFE, 0x00, 0x61, 0xC0, 0x0C, 0x38, 0x01, + 0x87, 0xF0, 0x30, 0xFF, 0x06, 0x1C, 0x70, 0xC3, 0x86, 0x18, 0x70, 0xE7, + 0x0E, 0x18, 0xE1, 0xC7, 0x78, 0x3F, 0xCE, 0x07, 0xF0, 0xE0, 0xE0, 0x70, + 0x70, 0x38, 0x38, 0x1C, 0x1C, 0x0E, 0x0F, 0xE7, 0xFF, 0xFB, 0xFF, 0x8F, + 0xC1, 0xC3, 0xE0, 0xE1, 0xF0, 0x70, 0xF8, 0x38, 0xFC, 0x1F, 0xEE, 0x0F, + 0xE0, 0xFF, 0xC7, 0xFE, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0F, 0xF0, 0x7F, + 0xC3, 0x87, 0x1C, 0x38, 0xE1, 0xC7, 0x0E, 0x38, 0x71, 0xC3, 0x80, 0x0F, + 0x03, 0x01, 0x80, 0x00, 0xE1, 0xF8, 0xEE, 0x73, 0xB8, 0xEE, 0x3F, 0x0F, + 0xC3, 0xF8, 0xEE, 0x39, 0xCE, 0x3B, 0x8E, 0xE1, 0xC0, 0x38, 0x07, 0x00, + 0xC0, 0x08, 0xE0, 0xF8, 0x7E, 0x3F, 0x8F, 0xE7, 0xF9, 0xBE, 0xEF, 0xF3, + 0xF8, 0xFE, 0x3F, 0x0F, 0xC3, 0xE0, 0xC0, 0x19, 0x83, 0xF0, 0x3C, 0x00, + 0x0E, 0x0E, 0xE1, 0x9C, 0x71, 0xCC, 0x3B, 0x83, 0x70, 0x7C, 0x07, 0x80, + 0xE0, 0x1C, 0x03, 0x01, 0xE0, 0x38, 0x00, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, + 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0xFF, 0xFF, 0xC3, + 0x80, 0xE0, 0x38, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0xF8, 0x1F, 0x81, 0x98, + 0x39, 0xC3, 0x9C, 0x3F, 0xC7, 0xFE, 0x70, 0x66, 0x07, 0xE0, 0x70, 0xFF, + 0x3F, 0xCE, 0x03, 0x80, 0xE0, 0x3F, 0x8F, 0xFB, 0x8E, 0xE1, 0xF8, 0x7E, + 0x3B, 0xFE, 0xFE, 0x00, 0xFE, 0x7F, 0xF8, 0xFC, 0x7E, 0x3F, 0xFB, 0xFD, + 0xC7, 0xE1, 0xF0, 0xF8, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0x1C, 0x0E, + 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x00, 0x1F, 0xF0, + 0xFF, 0x87, 0x1C, 0x38, 0xE1, 0x87, 0x0C, 0x38, 0x61, 0xC3, 0x0E, 0x38, + 0x71, 0xC3, 0x9C, 0x1D, 0xFF, 0xFF, 0xFF, 0xF0, 0x1F, 0x80, 0xFC, 0x07, + 0xFF, 0xFF, 0xF8, 0x1C, 0x0E, 0x07, 0xFB, 0xFD, 0xC0, 0xE0, 0x70, 0x38, + 0x1F, 0xFF, 0xF8, 0xF0, 0xC3, 0xDC, 0x30, 0xE3, 0x8C, 0x70, 0x73, 0x18, + 0x1C, 0xCE, 0x03, 0xFF, 0x00, 0xFF, 0xC0, 0x73, 0x38, 0x1C, 0xC7, 0x0E, + 0x31, 0xC3, 0x8C, 0x39, 0xC3, 0x0E, 0xF0, 0xC3, 0xC0, 0x3E, 0x7F, 0xB8, + 0xF8, 0x70, 0x38, 0xF8, 0x7C, 0x07, 0x01, 0xE0, 0xF8, 0xFF, 0xE3, 0xE0, + 0xE0, 0xF8, 0x7E, 0x3F, 0x8F, 0xE7, 0xF9, 0xBE, 0xEF, 0xF3, 0xF8, 0xFE, + 0x3F, 0x0F, 0xC3, 0xE0, 0xC0, 0x33, 0x07, 0xC1, 0xE0, 0x00, 0xE0, 0xF8, + 0x7E, 0x3F, 0x8F, 0xE7, 0xF9, 0xBE, 0xEF, 0xF3, 0xF8, 0xFE, 0x3F, 0x0F, + 0xC3, 0xE0, 0xC0, 0xE1, 0xDC, 0x73, 0x8E, 0x73, 0x8E, 0xE1, 0xFC, 0x3F, + 0x87, 0x30, 0xE7, 0x1C, 0x73, 0x8E, 0x70, 0xEE, 0x1E, 0x1F, 0xF1, 0xFF, + 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0x87, 0x18, 0x71, 0x87, 0x18, 0x73, 0x87, + 0x38, 0x7F, 0x07, 0xE0, 0x70, 0xF0, 0x3F, 0xC0, 0xFF, 0x07, 0xFE, 0x1F, + 0xF8, 0x7F, 0xF3, 0x7E, 0xCD, 0xFB, 0x37, 0xEF, 0x9F, 0x9E, 0x7E, 0x79, + 0xF9, 0xC7, 0xE3, 0x1C, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xFF, + 0xFF, 0xFF, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0E, 0x1E, 0x1F, + 0xEE, 0x1F, 0x87, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF8, 0x7E, 0x1D, + 0xFE, 0x1E, 0x00, 0xFF, 0xFF, 0xFF, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, + 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0E, 0xFF, 0x3F, 0xEE, + 0x1F, 0x87, 0xE1, 0xF8, 0x7F, 0xFB, 0xFC, 0xE0, 0x38, 0x0E, 0x03, 0x80, + 0xE0, 0x00, 0x1F, 0x1F, 0xE7, 0x1F, 0x87, 0xE0, 0xF0, 0x0C, 0x03, 0x00, + 0xE0, 0x38, 0x76, 0x1D, 0xFE, 0x1F, 0x00, 0xFF, 0xFF, 0xFC, 0x38, 0x07, + 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, + 0xE0, 0xE0, 0xEE, 0x19, 0xC7, 0x1C, 0xC3, 0xB8, 0x37, 0x07, 0xC0, 0x78, + 0x0E, 0x01, 0xC0, 0x30, 0x1E, 0x03, 0x80, 0x07, 0x00, 0x38, 0x07, 0xF0, + 0xFF, 0xEE, 0x73, 0x63, 0x9F, 0x1C, 0x78, 0xE3, 0xC7, 0x3F, 0x39, 0xDF, + 0xFC, 0x7F, 0x80, 0x70, 0x03, 0x80, 0xF0, 0xEE, 0x38, 0xE7, 0x1D, 0xC1, + 0xF8, 0x3E, 0x03, 0x80, 0xF8, 0x1F, 0x87, 0x70, 0xE7, 0x38, 0xEF, 0x0E, + 0xE0, 0xCE, 0x0C, 0xE0, 0xCE, 0x0C, 0xE0, 0xCE, 0x0C, 0xE0, 0xCE, 0x0C, + 0xE0, 0xCE, 0x0C, 0xE0, 0xCF, 0xFF, 0xFF, 0xF0, 0x03, 0x00, 0x30, 0x03, + 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0E, 0xE1, 0xDF, 0xF8, 0xFF, 0x00, + 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0xE3, 0x8F, 0xC7, 0x1F, 0x8E, 0x3F, + 0x1C, 0x7E, 0x38, 0xFC, 0x71, 0xF8, 0xE3, 0xF1, 0xC7, 0xE3, 0x8F, 0xC7, + 0x1F, 0x8E, 0x3F, 0xFF, 0xFF, 0xFF, 0xE0, 0xE3, 0x8E, 0x71, 0xC7, 0x38, + 0xE3, 0x9C, 0x71, 0xCE, 0x38, 0xE7, 0x1C, 0x73, 0x8E, 0x39, 0xC7, 0x1C, + 0xE3, 0x8E, 0x71, 0xC7, 0x38, 0xE3, 0x9F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, + 0x1C, 0x00, 0x0E, 0x00, 0x07, 0xFC, 0x07, 0xE0, 0x03, 0x00, 0x18, 0x00, + 0xC0, 0x07, 0xF0, 0x3F, 0xE1, 0x87, 0x0C, 0x18, 0x60, 0xC3, 0x0E, 0x1F, + 0xE0, 0xFE, 0x00, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, + 0xFC, 0x7F, 0xF9, 0xF8, 0x77, 0xE1, 0xDF, 0x87, 0x7E, 0x1D, 0xFF, 0xE7, + 0xFF, 0x1C, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x3F, 0x8F, 0xFB, 0x8E, + 0xE1, 0xF8, 0x7E, 0x3B, 0xFE, 0xFE, 0x00, 0x3E, 0x1F, 0xEE, 0x3B, 0x07, + 0x01, 0xC7, 0xF1, 0xFC, 0x07, 0x01, 0xF0, 0x7E, 0x39, 0xFE, 0x3E, 0x00, + 0xE1, 0xF1, 0xC7, 0xFB, 0x9C, 0x77, 0x30, 0x7E, 0xE0, 0xFF, 0xC0, 0xFF, + 0x81, 0xF7, 0x03, 0xE6, 0x0F, 0xCC, 0x1F, 0x9C, 0x77, 0x1F, 0xEE, 0x0F, + 0x00, 0x1F, 0xDF, 0xF7, 0x1D, 0x87, 0x61, 0xDC, 0x73, 0xFC, 0xFF, 0x39, + 0xCC, 0x77, 0x1D, 0x87, 0xE1, 0xC0, 0x3C, 0xFE, 0xC7, 0x07, 0x7F, 0xFF, + 0xC7, 0xC7, 0xFF, 0x7F, 0x03, 0x0F, 0x1F, 0x8E, 0x0C, 0x06, 0xF3, 0xFD, + 0xCE, 0xC3, 0xE1, 0xF0, 0xFC, 0xE7, 0xF1, 0xE0, 0xFE, 0x7F, 0xB9, 0xDC, + 0xEF, 0xE7, 0xFB, 0x8D, 0xC7, 0xFF, 0x7F, 0x00, 0xFF, 0xFE, 0x38, 0xE3, + 0x8E, 0x38, 0xE3, 0x80, 0x1F, 0xC7, 0xF8, 0xE7, 0x1C, 0xE3, 0x9C, 0x73, + 0x8E, 0x73, 0x8E, 0xFF, 0xFF, 0xFF, 0x83, 0xF0, 0x7E, 0x0E, 0x3C, 0x7E, + 0xE7, 0xC3, 0xFF, 0xFF, 0xC0, 0xE2, 0x7F, 0x3E, 0xF3, 0x8E, 0xE7, 0x38, + 0xEE, 0x70, 0xDD, 0xC1, 0xFF, 0x03, 0xFF, 0x0E, 0xEE, 0x1D, 0xCE, 0x73, + 0x9D, 0xE7, 0x1C, 0x3E, 0x3F, 0x98, 0xC0, 0x61, 0xF0, 0xF8, 0x0D, 0xC7, + 0x7F, 0x1F, 0x00, 0xE7, 0xE7, 0xEF, 0xEF, 0xFB, 0xFB, 0xF3, 0xF3, 0xE3, + 0xE3, 0x66, 0x7E, 0x3C, 0x00, 0xE7, 0xE7, 0xEF, 0xEF, 0xFB, 0xFB, 0xF3, + 0xF3, 0xE3, 0xE3, 0xE7, 0xF3, 0xBB, 0x9D, 0xCF, 0xC7, 0xE3, 0xB9, 0xDE, + 0xE7, 0x71, 0xC0, 0x3F, 0x9F, 0xCC, 0x66, 0x33, 0x19, 0x8C, 0xC6, 0xE3, + 0xE1, 0xF0, 0xC0, 0xE0, 0xFE, 0x1F, 0xC7, 0xFC, 0xFF, 0x9F, 0xF6, 0xFB, + 0xDF, 0x7B, 0xEE, 0x7C, 0xCC, 0xE3, 0xE3, 0xE3, 0xE3, 0xFF, 0xFF, 0xE3, + 0xE3, 0xE3, 0xE3, 0x1E, 0x0F, 0xC7, 0x39, 0x86, 0xE1, 0xB8, 0x76, 0x19, + 0xCE, 0x3F, 0x07, 0x80, 0xFF, 0xFF, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, + 0xE3, 0xE3, 0xDE, 0xFF, 0xE7, 0xC3, 0xC3, 0xC3, 0xC3, 0xE7, 0xFF, 0xDE, + 0xC0, 0xC0, 0xC0, 0xC0, 0x1E, 0x3F, 0x9C, 0xEC, 0x7E, 0x07, 0x01, 0x80, + 0xC7, 0x7F, 0x0F, 0x00, 0xFF, 0xFF, 0xC7, 0x03, 0x81, 0xC0, 0xE0, 0x70, + 0x38, 0x1C, 0x0E, 0x00, 0xE3, 0xB1, 0xD8, 0xCE, 0xE7, 0x71, 0xB0, 0xF8, + 0x7C, 0x1C, 0x0E, 0x07, 0x03, 0x07, 0x83, 0x80, 0x0E, 0x01, 0xC0, 0x38, + 0x07, 0x07, 0xFD, 0xFF, 0xFB, 0xBE, 0x73, 0xCE, 0x79, 0xCF, 0x39, 0xF7, + 0x7F, 0xFE, 0xFF, 0x83, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0xE3, 0xBB, 0x8D, + 0xC7, 0xC1, 0xC0, 0xF0, 0xF8, 0x6E, 0x77, 0x71, 0xC0, 0xE3, 0x38, 0xCE, + 0x33, 0x8C, 0xE3, 0x38, 0xCE, 0x33, 0x8C, 0xFF, 0xFF, 0xF0, 0x1C, 0x07, + 0x01, 0xC0, 0xC7, 0xC7, 0xC7, 0xC7, 0xE7, 0xFF, 0x3F, 0x07, 0x07, 0x07, + 0xE7, 0x3F, 0x39, 0xF9, 0xCF, 0xCE, 0x7E, 0x73, 0xF3, 0x9F, 0x9C, 0xFC, + 0xE7, 0xFF, 0xFF, 0xFF, 0xC0, 0xC7, 0x39, 0x8E, 0x73, 0x1C, 0xE6, 0x39, + 0xCC, 0x73, 0x98, 0xE7, 0x31, 0xCE, 0x63, 0x9C, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0xFC, 0x0F, 0xC0, 0x1C, 0x01, 0xFC, + 0x1F, 0xE1, 0xC6, 0x1C, 0x71, 0xC6, 0x1F, 0xE1, 0xFC, 0xE0, 0x3F, 0x01, + 0xF8, 0x0F, 0xFC, 0x7F, 0xF3, 0xF1, 0xDF, 0x8E, 0xFC, 0x77, 0xFF, 0x3F, + 0xF1, 0xC0, 0xE0, 0x70, 0x38, 0x1F, 0xCF, 0xF7, 0x1B, 0x8F, 0xC6, 0xFF, + 0x7F, 0x00, 0x3C, 0x3F, 0x98, 0xDC, 0x70, 0xF8, 0x7F, 0x8E, 0xC6, 0x7F, + 0x1E, 0x00, 0xE1, 0xE7, 0x3F, 0xB9, 0x8F, 0xDC, 0x3F, 0xE1, 0xFF, 0x0F, + 0xB8, 0x7C, 0xC7, 0xE7, 0xF7, 0x0F, 0x00, 0x3F, 0xBF, 0xDC, 0xEC, 0x77, + 0x3B, 0xFC, 0xFE, 0x67, 0x73, 0xF1, 0xC0 }; + +const GFXglyph Roboto_Bold9pt8bRUSGlyphs[] PROGMEM = { + { 0, 9, 17, 10, 1, -16 }, // 0x400 + { 20, 9, 16, 10, 1, -15 }, // 0x401 + { 38, 13, 13, 13, 0, -12 }, // 0x402 + { 60, 9, 17, 10, 1, -16 }, // 0x403 + { 80, 10, 13, 12, 1, -12 }, // 0x404 + { 97, 9, 13, 11, 1, -12 }, // 0x405 + { 112, 3, 13, 5, 1, -12 }, // 0x406 + { 117, 7, 16, 5, -1, -15 }, // 0x407 + { 131, 9, 13, 10, 0, -12 }, // 0x408 + { 146, 19, 13, 19, 0, -12 }, // 0x409 + { 177, 17, 13, 19, 1, -12 }, // 0x40A + { 205, 13, 13, 14, 0, -12 }, // 0x40B + { 227, 10, 17, 11, 1, -16 }, // 0x40C + { 249, 10, 17, 13, 1, -16 }, // 0x40D + { 271, 11, 17, 11, 0, -16 }, // 0x40E + { 295, 10, 16, 13, 1, -12 }, // 0x40F + { 315, 12, 13, 12, 0, -12 }, // 0x410 + { 335, 10, 13, 11, 1, -12 }, // 0x411 + { 352, 9, 13, 11, 1, -12 }, // 0x412 + { 367, 9, 13, 10, 1, -12 }, // 0x413 + { 382, 13, 16, 13, 0, -12 }, // 0x414 + { 408, 9, 13, 10, 1, -12 }, // 0x415 + { 423, 18, 13, 18, 0, -12 }, // 0x416 + { 453, 9, 13, 11, 1, -12 }, // 0x417 + { 468, 10, 13, 13, 1, -12 }, // 0x418 + { 485, 10, 17, 13, 1, -16 }, // 0x419 + { 507, 11, 13, 12, 1, -12 }, // 0x41A + { 525, 12, 13, 13, 0, -12 }, // 0x41B + { 545, 14, 13, 16, 1, -12 }, // 0x41C + { 568, 11, 13, 13, 1, -12 }, // 0x41D + { 586, 10, 13, 12, 1, -12 }, // 0x41E + { 603, 11, 13, 13, 1, -12 }, // 0x41F + { 621, 10, 13, 12, 1, -12 }, // 0x420 + { 638, 10, 13, 12, 1, -12 }, // 0x421 + { 655, 11, 13, 11, 0, -12 }, // 0x422 + { 673, 11, 13, 11, 0, -12 }, // 0x423 + { 691, 13, 14, 15, 1, -12 }, // 0x424 + { 714, 11, 13, 11, 0, -12 }, // 0x425 + { 732, 12, 16, 14, 1, -12 }, // 0x426 + { 756, 11, 13, 13, 1, -12 }, // 0x427 + { 774, 15, 13, 17, 1, -12 }, // 0x428 + { 799, 17, 16, 18, 1, -12 }, // 0x429 + { 833, 13, 13, 14, 0, -12 }, // 0x42A + { 855, 14, 13, 16, 1, -12 }, // 0x42B + { 878, 10, 13, 11, 1, -12 }, // 0x42C + { 895, 10, 13, 12, 1, -12 }, // 0x42D + { 912, 15, 13, 17, 1, -12 }, // 0x42E + { 937, 10, 13, 11, 0, -12 }, // 0x42F + { 954, 8, 10, 10, 1, -9 }, // 0x430 + { 964, 9, 14, 10, 1, -13 }, // 0x431 + { 980, 9, 10, 10, 1, -9 }, // 0x432 + { 992, 6, 10, 8, 1, -9 }, // 0x433 + { 1000, 11, 13, 11, 0, -9 }, // 0x434 + { 1018, 8, 10, 10, 1, -9 }, // 0x435 + { 1028, 15, 10, 15, 0, -9 }, // 0x436 + { 1047, 9, 10, 9, 0, -9 }, // 0x437 + { 1059, 8, 10, 10, 1, -9 }, // 0x438 + { 1069, 8, 14, 10, 1, -13 }, // 0x439 + { 1083, 9, 10, 10, 1, -9 }, // 0x43A + { 1095, 9, 10, 10, 0, -9 }, // 0x43B + { 1107, 11, 10, 14, 1, -9 }, // 0x43C + { 1121, 8, 10, 10, 1, -9 }, // 0x43D + { 1131, 10, 10, 10, 0, -9 }, // 0x43E + { 1144, 8, 10, 10, 1, -9 }, // 0x43F + { 1154, 8, 14, 10, 1, -9 }, // 0x440 + { 1168, 9, 10, 9, 0, -9 }, // 0x441 + { 1180, 9, 10, 9, 0, -9 }, // 0x442 + { 1192, 9, 14, 9, 0, -9 }, // 0x443 + { 1208, 11, 18, 13, 1, -13 }, // 0x444 + { 1233, 9, 10, 9, 0, -9 }, // 0x445 + { 1245, 10, 13, 11, 1, -9 }, // 0x446 + { 1262, 8, 10, 10, 1, -9 }, // 0x447 + { 1272, 13, 10, 15, 1, -9 }, // 0x448 + { 1289, 15, 13, 16, 1, -9 }, // 0x449 + { 1314, 12, 10, 12, 0, -9 }, // 0x44A + { 1329, 13, 10, 15, 1, -9 }, // 0x44B + { 1346, 9, 10, 10, 1, -9 }, // 0x44C + { 1358, 9, 10, 9, 0, -9 }, // 0x44D + { 1370, 13, 10, 15, 1, -9 }, // 0x44E + { 1387, 9, 10, 10, 0, -9 } }; // 0x44F + +const GFXfont Roboto_Bold9pt8bRUS PROGMEM = { + (uint8_t *)Roboto_Bold9pt8bRUSBitmaps, + (GFXglyph *)Roboto_Bold9pt8bRUSGlyphs, + 0x400, 0x44F, 21 }; + +// Approx. 1966 bytes diff --git a/examples/demo-menu/src/UTF8-fonts/Roboto-Bold.ttf.9pt.h b/examples/demo-menu/src/UTF8-fonts/Roboto-Bold.ttf.9pt.h new file mode 100644 index 0000000..69f2478 --- /dev/null +++ b/examples/demo-menu/src/UTF8-fonts/Roboto-Bold.ttf.9pt.h @@ -0,0 +1,204 @@ +const uint8_t Roboto_Bold9pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFF, 0xE3, 0xFE, 0x99, 0x99, 0x90, 0x1B, 0x0D, 0x84, 0xDF, + 0xFF, 0xF9, 0x90, 0xD9, 0xFF, 0xFF, 0x93, 0x19, 0x0C, 0x86, 0xC0, 0x08, + 0x08, 0x3C, 0x7F, 0xE7, 0xE3, 0xE0, 0x70, 0x3E, 0x0F, 0x07, 0xC3, 0xE7, + 0xFF, 0x3E, 0x18, 0x18, 0x70, 0x1F, 0x12, 0x66, 0x4D, 0x8F, 0xA0, 0xEC, + 0x01, 0x00, 0x6E, 0x1B, 0xE2, 0x64, 0xCC, 0x91, 0xF0, 0x1C, 0x3C, 0x0F, + 0xC1, 0x9C, 0x33, 0x87, 0x60, 0x78, 0x0E, 0x07, 0xE6, 0xCF, 0xD8, 0xF3, + 0x8E, 0x7F, 0xC3, 0xFE, 0xEA, 0x80, 0x11, 0xCC, 0xC6, 0x63, 0x18, 0xC6, + 0x31, 0x8C, 0x31, 0x86, 0x38, 0x80, 0x47, 0x18, 0x63, 0x0C, 0x63, 0x18, + 0xC6, 0x31, 0x98, 0xCC, 0xE2, 0x00, 0x18, 0x18, 0x59, 0xFF, 0x18, 0x3C, + 0x66, 0x24, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x6D, + 0xBC, 0xFF, 0xC0, 0xFF, 0x80, 0x0C, 0x30, 0xC6, 0x18, 0x63, 0x0C, 0x31, + 0x86, 0x18, 0xC3, 0x00, 0x3C, 0x7E, 0xE7, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x0C, 0xFF, 0xF7, 0x1C, 0x71, 0xC7, 0x1C, + 0x71, 0xC7, 0x1C, 0x1E, 0x3F, 0x9C, 0xEC, 0x38, 0x38, 0x1C, 0x1C, 0x1C, + 0x1C, 0x1C, 0x1C, 0x0F, 0xF7, 0xF8, 0x1E, 0x3F, 0xD8, 0xE0, 0x30, 0x38, + 0xF8, 0x7C, 0x07, 0x01, 0xF0, 0xD8, 0xEF, 0xE3, 0xE0, 0x07, 0x01, 0xC0, + 0xF0, 0x3C, 0x1B, 0x0E, 0xC3, 0x31, 0x8C, 0xFF, 0xDF, 0xF0, 0x30, 0x0C, + 0x03, 0x00, 0x7F, 0x7F, 0x60, 0xE0, 0xFE, 0xFF, 0x47, 0x03, 0x03, 0xC3, + 0xE7, 0x7E, 0x3C, 0x1E, 0x1F, 0x1C, 0x1C, 0x0D, 0xE7, 0xFB, 0x9D, 0x86, + 0xC3, 0xE1, 0xB9, 0xCF, 0xE3, 0xC0, 0xFF, 0xFF, 0xC0, 0xC0, 0xE0, 0x60, + 0x70, 0x30, 0x38, 0x1C, 0x0C, 0x0E, 0x06, 0x07, 0x00, 0x3C, 0xFF, 0xE7, + 0xE3, 0xE7, 0x7E, 0x7E, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0x3C, 0x3C, 0x7E, + 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0x7B, 0x07, 0x07, 0x0E, 0x7C, 0x78, 0xFF, + 0x80, 0x07, 0xFC, 0x67, 0x60, 0x00, 0x06, 0x66, 0x6C, 0x01, 0x0F, 0x3E, + 0xF8, 0xF0, 0x3E, 0x0F, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x80, + 0xF0, 0x7C, 0x0F, 0x0F, 0x7C, 0xF0, 0x80, 0x3E, 0x7F, 0x63, 0xE3, 0x03, + 0x07, 0x0E, 0x1C, 0x18, 0x00, 0x18, 0x1C, 0x18, 0x07, 0xC0, 0x7F, 0xC3, + 0x83, 0x9C, 0x06, 0x63, 0xCF, 0x1F, 0x1C, 0xCC, 0x73, 0x31, 0x8C, 0xC6, + 0x63, 0x38, 0xCC, 0xF3, 0xFE, 0xC6, 0x71, 0x80, 0x07, 0x04, 0x0F, 0xF0, + 0x0F, 0x80, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0xF8, 0x1F, 0x81, 0x98, 0x39, + 0xC3, 0x9C, 0x3F, 0xC7, 0xFE, 0x70, 0x66, 0x07, 0xE0, 0x70, 0xFE, 0x7F, + 0xF8, 0xFC, 0x7E, 0x3F, 0xFB, 0xFD, 0xC7, 0xE1, 0xF0, 0xF8, 0xFF, 0xFF, + 0xE0, 0x1F, 0x1F, 0xE7, 0x1F, 0x87, 0xE0, 0xF0, 0x0C, 0x03, 0x00, 0xE0, + 0x38, 0x76, 0x1D, 0xFE, 0x1F, 0x00, 0xFE, 0x3F, 0xCE, 0x3B, 0x86, 0xE1, + 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x6E, 0x3B, 0xFC, 0xFE, 0x00, 0xFF, + 0xFF, 0xF8, 0x1C, 0x0E, 0x07, 0xFB, 0xFD, 0xC0, 0xE0, 0x70, 0x38, 0x1F, + 0xFF, 0xF8, 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0x1F, 0x1F, 0xE7, 0x1F, 0x87, 0xE0, 0x30, 0x0C, 0x7F, + 0x1F, 0xE1, 0xF8, 0x77, 0x1D, 0xFF, 0x1F, 0x00, 0xE0, 0xFC, 0x1F, 0x83, + 0xF0, 0x7E, 0x0F, 0xFF, 0xFF, 0xFF, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, + 0x7E, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x03, 0x81, 0xC0, 0xE0, 0x70, + 0x38, 0x1C, 0x0E, 0x07, 0x03, 0xF1, 0xD8, 0xEF, 0xE3, 0xE0, 0xE1, 0xF8, + 0xEE, 0x73, 0xB8, 0xEE, 0x3F, 0x0F, 0xC3, 0xF8, 0xEE, 0x39, 0xCE, 0x3B, + 0x8E, 0xE1, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xFF, 0xFF, 0xF0, 0x3F, 0xC0, 0xFF, 0x07, 0xFE, 0x1F, 0xF8, + 0x7F, 0xF3, 0x7E, 0xCD, 0xFB, 0x37, 0xEF, 0x9F, 0x9E, 0x7E, 0x79, 0xF9, + 0xC7, 0xE3, 0x1C, 0xE0, 0xFE, 0x1F, 0xC3, 0xFC, 0x7F, 0xCF, 0xD9, 0xFB, + 0xBF, 0x37, 0xE7, 0xFC, 0x7F, 0x87, 0xF0, 0xFE, 0x0E, 0x1E, 0x1F, 0xEE, + 0x1F, 0x87, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF8, 0x7E, 0x1D, 0xFE, + 0x1E, 0x00, 0xFF, 0x3F, 0xEE, 0x1F, 0x87, 0xE1, 0xF8, 0x7F, 0xFB, 0xFC, + 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x00, 0x1E, 0x1F, 0xEE, 0x1F, 0x87, + 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF8, 0x7E, 0x1D, 0xFE, 0x1F, 0x80, + 0x70, 0x08, 0xFE, 0x3F, 0xEE, 0x3B, 0x86, 0xE1, 0xB8, 0xEF, 0xF3, 0xF8, + 0xE7, 0x39, 0xCE, 0x3B, 0x8E, 0xE1, 0xC0, 0x3E, 0x3F, 0xF8, 0xFC, 0x3E, + 0x03, 0xC0, 0xFC, 0x1F, 0x03, 0xE0, 0xF8, 0xEF, 0xF3, 0xE0, 0xFF, 0xFF, + 0xFC, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, + 0x38, 0x07, 0x00, 0xE0, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, + 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x1D, 0xFE, 0x3F, 0x00, 0xE0, 0x77, 0x0E, + 0x70, 0xE7, 0x0E, 0x30, 0xC3, 0x9C, 0x39, 0xC1, 0x98, 0x1F, 0x81, 0xF8, + 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xE1, 0x87, 0x61, 0x86, 0x73, 0xCE, 0x73, + 0xCE, 0x73, 0xCE, 0x33, 0xCC, 0x36, 0x6C, 0x36, 0x6C, 0x3E, 0x7C, 0x1E, + 0x7C, 0x1E, 0x78, 0x1C, 0x38, 0x1C, 0x38, 0xF0, 0xEE, 0x38, 0xE7, 0x1D, + 0xC1, 0xF8, 0x3E, 0x03, 0x80, 0xF8, 0x1F, 0x87, 0x70, 0xE7, 0x38, 0xEF, + 0x0E, 0xE0, 0xEE, 0x19, 0xC7, 0x18, 0xC3, 0xB8, 0x36, 0x07, 0xC0, 0x70, + 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0xFF, 0xFF, 0xC0, 0xE0, 0xE0, + 0xE0, 0x70, 0x70, 0x70, 0x38, 0x38, 0x38, 0x1F, 0xFF, 0xF8, 0xFF, 0xEE, + 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xFF, 0xE0, 0x60, 0x70, 0x70, 0x30, + 0x38, 0x38, 0x18, 0x1C, 0x0C, 0x0E, 0x0E, 0x06, 0x07, 0xFF, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0xFF, 0x18, 0x3C, 0x3C, 0x3C, 0x66, 0xE7, + 0xFF, 0xFF, 0xF1, 0x8E, 0x3C, 0xFE, 0xC7, 0x07, 0x7F, 0xFF, 0xC7, 0xC7, + 0xFF, 0x7F, 0xC0, 0xC0, 0xC0, 0xC0, 0xDE, 0xFF, 0xE7, 0xC3, 0xC3, 0xC3, + 0xC3, 0xE7, 0xFF, 0xDE, 0x1E, 0x3F, 0x9C, 0xEC, 0x7E, 0x07, 0x01, 0x8E, + 0xC7, 0x7F, 0x0F, 0x00, 0x03, 0x03, 0x03, 0x03, 0x7B, 0xFF, 0xE7, 0xC3, + 0xC3, 0xC3, 0xC3, 0xE7, 0xFF, 0x7B, 0x3C, 0x7E, 0xE7, 0xC3, 0xFF, 0xFF, + 0xC0, 0xE2, 0x7F, 0x3E, 0x1C, 0xF7, 0x1C, 0xFF, 0xF7, 0x1C, 0x71, 0xC7, + 0x1C, 0x71, 0xC0, 0x3D, 0xBF, 0xDC, 0xEC, 0x3E, 0x1F, 0x0D, 0x86, 0xE7, + 0x7F, 0x9E, 0xC0, 0xE4, 0x77, 0xF1, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xDE, + 0xFF, 0xE7, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0x8F, 0xFF, + 0xFF, 0xFF, 0xC0, 0x39, 0xCE, 0x03, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, + 0xE7, 0xF7, 0x00, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x7F, 0x73, 0xF1, 0xF8, + 0xF8, 0x7E, 0x3B, 0x9D, 0xCE, 0x77, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0xEE, 0x7B, 0xFF, 0xEE, 0x79, 0xF8, 0xC7, 0xE3, 0x1F, 0x8C, 0x7E, + 0x31, 0xF8, 0xC7, 0xE3, 0x1F, 0x8C, 0x70, 0xDE, 0xFF, 0xE7, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x1E, 0x0F, 0xC7, 0x39, 0x86, 0xE1, 0xB8, + 0x76, 0x19, 0xCE, 0x3F, 0x07, 0x80, 0xDE, 0xFF, 0xE7, 0xC3, 0xC3, 0xC3, + 0xC3, 0xE7, 0xFF, 0xDE, 0xC0, 0xC0, 0xC0, 0xC0, 0x7B, 0xFF, 0xE7, 0xC3, + 0xC3, 0xC3, 0xC3, 0xE7, 0xFF, 0x7B, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFE, + 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x80, 0x3E, 0x7F, 0x63, 0x60, 0x7E, 0x1F, + 0x03, 0xE3, 0x7F, 0x3E, 0x71, 0xCF, 0xFF, 0x71, 0xC7, 0x1C, 0x71, 0xC3, + 0xCF, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xE7, 0xFF, 0x7B, 0xE3, + 0xB1, 0x98, 0xCE, 0xE3, 0x61, 0xB0, 0xD8, 0x7C, 0x1C, 0x0E, 0x00, 0xE7, + 0x3B, 0x39, 0x99, 0xCC, 0xCE, 0x66, 0xDB, 0x3E, 0xF8, 0xF7, 0x87, 0x1C, + 0x38, 0xE1, 0xC7, 0x00, 0xE3, 0xBB, 0x8D, 0xC7, 0xC1, 0xC0, 0xF0, 0xF8, + 0x6E, 0x77, 0x71, 0xC0, 0xE3, 0xB1, 0xD8, 0xCE, 0xE7, 0x71, 0xB0, 0xF8, + 0x7C, 0x1C, 0x0E, 0x07, 0x03, 0x07, 0x83, 0x80, 0xFE, 0xFE, 0x0E, 0x1C, + 0x38, 0x38, 0x70, 0xE0, 0xFF, 0xFF, 0x08, 0x73, 0x8C, 0x30, 0xC3, 0x0C, + 0xE3, 0x83, 0x0C, 0x30, 0xC3, 0x06, 0x0C, 0xFF, 0xFE, 0x43, 0x87, 0x0C, + 0x30, 0xC3, 0x0C, 0x1C, 0x73, 0x0C, 0x30, 0xC3, 0x18, 0xC0, 0x70, 0xFF, + 0x3C, 0xFB, 0x1C }; + +const GFXglyph Roboto_Bold9pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 4, 0, 1 }, // 0x20 ' ' + { 0, 3, 13, 5, 1, -12 }, // 0x21 '!' + { 5, 4, 5, 6, 1, -13 }, // 0x22 '"' + { 8, 9, 13, 11, 1, -12 }, // 0x23 '#' + { 23, 8, 17, 10, 1, -14 }, // 0x24 '$' + { 40, 11, 13, 13, 1, -12 }, // 0x25 '%' + { 58, 11, 13, 12, 1, -12 }, // 0x26 '&' + { 76, 2, 5, 3, 1, -13 }, // 0x27 ''' + { 78, 5, 18, 6, 1, -13 }, // 0x28 '(' + { 90, 5, 18, 6, 0, -13 }, // 0x29 ')' + { 102, 8, 8, 8, 0, -12 }, // 0x2A '*' + { 110, 8, 9, 10, 1, -9 }, // 0x2B '+' + { 119, 3, 5, 4, 0, -2 }, // 0x2C ',' + { 121, 5, 2, 7, 1, -6 }, // 0x2D '-' + { 123, 3, 3, 5, 1, -2 }, // 0x2E '.' + { 125, 6, 14, 7, 0, -12 }, // 0x2F '/' + { 136, 8, 13, 10, 1, -12 }, // 0x30 '0' + { 149, 6, 13, 10, 1, -12 }, // 0x31 '1' + { 159, 9, 13, 10, 0, -12 }, // 0x32 '2' + { 174, 9, 13, 10, 0, -12 }, // 0x33 '3' + { 189, 10, 13, 10, 0, -12 }, // 0x34 '4' + { 206, 8, 13, 10, 1, -12 }, // 0x35 '5' + { 219, 9, 13, 10, 1, -12 }, // 0x36 '6' + { 234, 9, 13, 10, 1, -12 }, // 0x37 '7' + { 249, 8, 13, 10, 1, -12 }, // 0x38 '8' + { 262, 8, 13, 10, 1, -12 }, // 0x39 '9' + { 275, 3, 10, 5, 1, -9 }, // 0x3A ':' + { 279, 4, 12, 5, 0, -9 }, // 0x3B ';' + { 285, 8, 8, 9, 0, -9 }, // 0x3C '<' + { 293, 8, 6, 10, 1, -8 }, // 0x3D '=' + { 299, 8, 8, 9, 1, -9 }, // 0x3E '>' + { 307, 8, 13, 9, 0, -12 }, // 0x3F '?' + { 320, 14, 17, 16, 1, -12 }, // 0x40 '@' + { 350, 12, 13, 12, 0, -12 }, // 0x41 'A' + { 370, 9, 13, 11, 1, -12 }, // 0x42 'B' + { 385, 10, 13, 12, 1, -12 }, // 0x43 'C' + { 402, 10, 13, 12, 1, -12 }, // 0x44 'D' + { 419, 9, 13, 10, 1, -12 }, // 0x45 'E' + { 434, 8, 13, 10, 1, -12 }, // 0x46 'F' + { 447, 10, 13, 12, 1, -12 }, // 0x47 'G' + { 464, 11, 13, 13, 1, -12 }, // 0x48 'H' + { 482, 3, 13, 5, 1, -12 }, // 0x49 'I' + { 487, 9, 13, 10, 0, -12 }, // 0x4A 'J' + { 502, 10, 13, 11, 1, -12 }, // 0x4B 'K' + { 519, 8, 13, 10, 1, -12 }, // 0x4C 'L' + { 532, 14, 13, 16, 1, -12 }, // 0x4D 'M' + { 555, 11, 13, 13, 1, -12 }, // 0x4E 'N' + { 573, 10, 13, 12, 1, -12 }, // 0x4F 'O' + { 590, 10, 13, 12, 1, -12 }, // 0x50 'P' + { 607, 10, 15, 12, 1, -12 }, // 0x51 'Q' + { 626, 10, 13, 11, 1, -12 }, // 0x52 'R' + { 643, 9, 13, 11, 1, -12 }, // 0x53 'S' + { 658, 11, 13, 11, 0, -12 }, // 0x54 'T' + { 676, 10, 13, 12, 1, -12 }, // 0x55 'U' + { 693, 12, 13, 12, 0, -12 }, // 0x56 'V' + { 713, 16, 13, 16, 0, -12 }, // 0x57 'W' + { 739, 11, 13, 11, 0, -12 }, // 0x58 'X' + { 757, 11, 13, 11, 0, -12 }, // 0x59 'Y' + { 775, 9, 13, 11, 1, -12 }, // 0x5A 'Z' + { 790, 4, 18, 5, 1, -14 }, // 0x5B '[' + { 799, 8, 14, 8, 0, -12 }, // 0x5C '\' + { 813, 4, 18, 5, 0, -14 }, // 0x5D ']' + { 822, 8, 6, 8, 0, -12 }, // 0x5E '^' + { 828, 8, 2, 8, 0, 1 }, // 0x5F '_' + { 830, 5, 3, 6, 0, -13 }, // 0x60 '`' + { 832, 8, 10, 10, 1, -9 }, // 0x61 'a' + { 842, 8, 14, 10, 1, -13 }, // 0x62 'b' + { 856, 9, 10, 9, 0, -9 }, // 0x63 'c' + { 868, 8, 14, 10, 1, -13 }, // 0x64 'd' + { 882, 8, 10, 10, 1, -9 }, // 0x65 'e' + { 892, 6, 14, 6, 0, -13 }, // 0x66 'f' + { 903, 9, 14, 10, 0, -9 }, // 0x67 'g' + { 919, 8, 14, 10, 1, -13 }, // 0x68 'h' + { 933, 3, 14, 5, 1, -13 }, // 0x69 'i' + { 939, 5, 18, 5, -1, -13 }, // 0x6A 'j' + { 951, 9, 14, 10, 1, -13 }, // 0x6B 'k' + { 967, 3, 14, 5, 1, -13 }, // 0x6C 'l' + { 973, 14, 10, 16, 1, -9 }, // 0x6D 'm' + { 991, 8, 10, 10, 1, -9 }, // 0x6E 'n' + { 1001, 10, 10, 10, 0, -9 }, // 0x6F 'o' + { 1014, 8, 14, 10, 1, -9 }, // 0x70 'p' + { 1028, 8, 14, 10, 1, -9 }, // 0x71 'q' + { 1042, 6, 10, 7, 1, -9 }, // 0x72 'r' + { 1050, 8, 10, 9, 0, -9 }, // 0x73 's' + { 1060, 6, 12, 6, 0, -11 }, // 0x74 't' + { 1069, 8, 10, 10, 1, -9 }, // 0x75 'u' + { 1079, 9, 10, 9, 0, -9 }, // 0x76 'v' + { 1091, 13, 10, 13, 0, -9 }, // 0x77 'w' + { 1108, 9, 10, 9, 0, -9 }, // 0x78 'x' + { 1120, 9, 14, 9, 0, -9 }, // 0x79 'y' + { 1136, 8, 10, 9, 1, -9 }, // 0x7A 'z' + { 1146, 6, 17, 6, 0, -13 }, // 0x7B '{' + { 1159, 1, 15, 5, 2, -12 }, // 0x7C '|' + { 1161, 6, 17, 6, 0, -13 }, // 0x7D '}' + { 1174, 10, 4, 12, 1, -6 } }; // 0x7E '~' + +const GFXfont Roboto_Bold9pt7b PROGMEM = { + (uint8_t *)Roboto_Bold9pt7bBitmaps, + (GFXglyph *)Roboto_Bold9pt7bGlyphs, + 0x20, 0x7E, 21 }; + +// Approx. 1851 bytes diff --git a/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.12pt.RUS.h b/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.12pt.RUS.h new file mode 100644 index 0000000..6ada82c --- /dev/null +++ b/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.12pt.RUS.h @@ -0,0 +1,276 @@ +const uint8_t Roboto_Regular12pt8bRUSBitmaps[] PROGMEM = { + 0x38, 0x03, 0x80, 0x38, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x06, 0x00, 0xC0, + 0x18, 0x03, 0x00, 0x7F, 0xEF, 0xFD, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, + 0x03, 0x00, 0x7F, 0xFF, 0xFE, 0x31, 0x8E, 0x30, 0x00, 0x7F, 0xFF, 0xFF, + 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0xFF, 0x7F, 0xEC, 0x01, 0x80, + 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0xFF, 0xFF, 0xF0, 0xFF, 0xF8, 0xFF, + 0xF8, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0F, + 0xF8, 0x0F, 0xFE, 0x0E, 0x0E, 0x0E, 0x07, 0x0E, 0x03, 0x0E, 0x03, 0x0E, + 0x07, 0x0E, 0x07, 0x0E, 0x3E, 0x0E, 0x38, 0x03, 0x80, 0xC0, 0x30, 0x00, + 0x0F, 0xFF, 0xFF, 0xF0, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, + 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x00, + 0x07, 0xC0, 0xFF, 0x8E, 0x1C, 0xE0, 0x76, 0x01, 0xB0, 0x0F, 0x80, 0x1F, + 0xF0, 0xFF, 0x87, 0x00, 0x38, 0x00, 0xC0, 0x36, 0x01, 0xB8, 0x1C, 0xE1, + 0xC3, 0xFE, 0x0F, 0xC0, 0x1F, 0x83, 0xFE, 0x70, 0xEE, 0x07, 0xE0, 0x3E, + 0x00, 0x70, 0x03, 0xE0, 0x1F, 0x80, 0x3E, 0x00, 0x70, 0x03, 0xC0, 0x3E, + 0x03, 0x70, 0x73, 0xFE, 0x1F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC7, + 0x8C, 0x01, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, + 0x18, 0x30, 0x60, 0xC1, 0x80, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, + 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0xC0, 0xF0, 0x3E, 0x1D, + 0xFE, 0x3F, 0x00, 0x1F, 0xFC, 0x00, 0x1F, 0xFC, 0x00, 0x1C, 0x0C, 0x00, + 0x1C, 0x0C, 0x00, 0x1C, 0x0C, 0x00, 0x1C, 0x0C, 0x00, 0x1C, 0x0C, 0x00, + 0x18, 0x0F, 0xF8, 0x18, 0x0F, 0xFC, 0x18, 0x0C, 0x0E, 0x18, 0x0C, 0x07, + 0x18, 0x0C, 0x03, 0x18, 0x0C, 0x03, 0x38, 0x0C, 0x07, 0x30, 0x0C, 0x0E, + 0xF0, 0x0F, 0xFC, 0xE0, 0x0F, 0xF8, 0xC0, 0x18, 0x01, 0x80, 0x30, 0x03, + 0x00, 0x60, 0x06, 0x00, 0xC0, 0x0C, 0x01, 0x80, 0x18, 0x03, 0x00, 0x30, + 0x06, 0x00, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xFD, 0x80, 0x30, 0x3B, 0x00, + 0x60, 0x3E, 0x00, 0xC0, 0x3C, 0x01, 0x80, 0x78, 0x03, 0x01, 0xF0, 0x06, + 0x07, 0x60, 0x0F, 0xFE, 0xC0, 0x1F, 0xF0, 0xFF, 0xF8, 0x7F, 0xFC, 0x01, + 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x1F, 0xF0, 0x0F, 0xFC, + 0x06, 0x07, 0x03, 0x01, 0x81, 0x80, 0xE0, 0xC0, 0x70, 0x60, 0x38, 0x30, + 0x1C, 0x18, 0x0E, 0x0C, 0x07, 0x06, 0x03, 0x80, 0x03, 0x80, 0x30, 0x03, + 0x00, 0x00, 0x0C, 0x07, 0xE0, 0x73, 0x03, 0x18, 0x30, 0xC3, 0x86, 0x38, + 0x33, 0x81, 0xB8, 0x0F, 0xE0, 0x7B, 0x03, 0x9C, 0x18, 0x70, 0xC1, 0xC6, + 0x06, 0x30, 0x39, 0x80, 0xEC, 0x03, 0x80, 0x1C, 0x00, 0x70, 0x01, 0xC0, + 0x00, 0x0C, 0x03, 0xE0, 0x1F, 0x01, 0xF8, 0x1F, 0xC0, 0xDE, 0x0E, 0xF0, + 0x67, 0x86, 0x3C, 0x71, 0xE3, 0x0F, 0x38, 0x7B, 0x83, 0xD8, 0x1F, 0xC0, + 0xFC, 0x07, 0xC0, 0x3E, 0x01, 0x80, 0x18, 0xC0, 0xC6, 0x03, 0xE0, 0x00, + 0x0E, 0x01, 0xB0, 0x1D, 0xC0, 0xC6, 0x0E, 0x30, 0x61, 0xC7, 0x06, 0x38, + 0x39, 0x80, 0xDC, 0x07, 0xC0, 0x1E, 0x00, 0xE0, 0x03, 0x00, 0x38, 0x03, + 0x80, 0x78, 0x03, 0x80, 0x00, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, + 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x7F, 0xFF, 0xFF, 0xF8, 0x38, 0x01, 0xC0, + 0x0E, 0x00, 0x70, 0x00, 0x03, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, + 0xCC, 0x01, 0x98, 0x03, 0x30, 0x0C, 0x30, 0x18, 0x60, 0x70, 0xE0, 0xC0, + 0xC1, 0xFF, 0x87, 0xFF, 0x8C, 0x03, 0x38, 0x07, 0x60, 0x06, 0xC0, 0x0E, + 0xFF, 0xCF, 0xFC, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0F, 0xF8, + 0xFF, 0xEC, 0x0E, 0xC0, 0x7C, 0x03, 0xC0, 0x3C, 0x07, 0xC0, 0xEF, 0xFE, + 0xFF, 0x80, 0xFF, 0x8F, 0xFC, 0xC0, 0xEC, 0x06, 0xC0, 0x6C, 0x06, 0xC0, + 0xCF, 0xF8, 0xFF, 0xCC, 0x0E, 0xC0, 0x6C, 0x07, 0xC0, 0x7C, 0x06, 0xC0, + 0xEF, 0xFC, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0x0C, 0x01, 0x80, + 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, + 0x06, 0x00, 0xC0, 0x00, 0x0F, 0xFC, 0x0F, 0xFC, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1C, 0x0C, 0x1C, 0x0C, 0x1C, 0x0C, + 0x18, 0x0C, 0x18, 0x0C, 0x38, 0x0C, 0x30, 0x0C, 0x70, 0x0C, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xFF, 0xFF, + 0xFF, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x07, 0xFE, 0xFF, 0xD8, 0x03, + 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x07, 0xFF, 0xFF, 0xE0, 0x70, 0x30, + 0x38, 0xC0, 0xC0, 0xC3, 0x83, 0x06, 0x07, 0x0C, 0x38, 0x0C, 0x30, 0xC0, + 0x18, 0xC6, 0x00, 0x73, 0x38, 0x00, 0xFF, 0xC0, 0x03, 0xFF, 0x00, 0x1C, + 0xCE, 0x00, 0xE3, 0x1C, 0x03, 0x0C, 0x70, 0x1C, 0x30, 0xE0, 0xE0, 0xC1, + 0x83, 0x83, 0x07, 0x1C, 0x0C, 0x0E, 0xE0, 0x30, 0x1C, 0x1F, 0x87, 0xFE, + 0x70, 0xEE, 0x07, 0xC0, 0x30, 0x07, 0x00, 0xE0, 0xFC, 0x0F, 0xC0, 0x0E, + 0x00, 0x30, 0x03, 0xC0, 0x3C, 0x07, 0xF0, 0xE7, 0xFE, 0x1F, 0x80, 0xC0, + 0x3E, 0x01, 0xF0, 0x1F, 0x81, 0xFC, 0x0D, 0xE0, 0xEF, 0x06, 0x78, 0x63, + 0xC7, 0x1E, 0x30, 0xF3, 0x87, 0xB8, 0x3D, 0x81, 0xFC, 0x0F, 0xC0, 0x7C, + 0x03, 0xE0, 0x18, 0x18, 0xC0, 0xC6, 0x03, 0xE0, 0x00, 0x0C, 0x03, 0xE0, + 0x1F, 0x01, 0xF8, 0x1F, 0xC0, 0xDE, 0x0E, 0xF0, 0x67, 0x86, 0x3C, 0x71, + 0xE3, 0x0F, 0x38, 0x7B, 0x83, 0xD8, 0x1F, 0xC0, 0xFC, 0x07, 0xC0, 0x3E, + 0x01, 0x80, 0xC0, 0x3E, 0x03, 0xB0, 0x39, 0x83, 0x8C, 0x38, 0x63, 0x83, + 0x18, 0x1F, 0xC0, 0xFE, 0x06, 0x38, 0x30, 0xC1, 0x87, 0x0C, 0x1C, 0x60, + 0x73, 0x01, 0x98, 0x0E, 0xC0, 0x38, 0x1F, 0xFC, 0x7F, 0xF1, 0xC0, 0xC6, + 0x03, 0x18, 0x0C, 0x60, 0x31, 0x80, 0xC6, 0x03, 0x18, 0x0C, 0x60, 0x31, + 0x80, 0xC6, 0x03, 0x18, 0x0C, 0xE0, 0x37, 0x00, 0xFC, 0x03, 0xE0, 0x0C, + 0xE0, 0x03, 0xF0, 0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFD, 0x80, 0xDE, 0xC0, + 0x6F, 0x70, 0x77, 0x98, 0x33, 0xCC, 0x19, 0xE3, 0x18, 0xF1, 0x8C, 0x78, + 0xEE, 0x3C, 0x36, 0x1E, 0x1B, 0x0F, 0x07, 0x07, 0x83, 0x83, 0xC1, 0xC1, + 0x80, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, + 0x7F, 0xFF, 0xFF, 0xFE, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, + 0x00, 0x78, 0x03, 0xC0, 0x18, 0x07, 0xC0, 0x7F, 0xC3, 0x87, 0x9C, 0x06, + 0x60, 0x1D, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, + 0xD8, 0x03, 0x60, 0x1D, 0xC0, 0x63, 0x87, 0x87, 0xFC, 0x07, 0xC0, 0xFF, + 0xFF, 0xFF, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, + 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, + 0x03, 0xC0, 0x18, 0xFF, 0x8F, 0xFE, 0xC0, 0xEC, 0x07, 0xC0, 0x3C, 0x03, + 0xC0, 0x3C, 0x07, 0xC0, 0xEF, 0xFE, 0xFF, 0x8C, 0x00, 0xC0, 0x0C, 0x00, + 0xC0, 0x0C, 0x00, 0xC0, 0x00, 0x07, 0xC0, 0x7F, 0xC3, 0x87, 0x1C, 0x0E, + 0x60, 0x19, 0x80, 0x6E, 0x00, 0x78, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, + 0x18, 0x07, 0x60, 0x19, 0xC0, 0x63, 0x87, 0x07, 0xFC, 0x0F, 0xC0, 0xFF, + 0xFF, 0xFF, 0xC1, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, + 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, + 0xC0, 0x06, 0x00, 0xE0, 0x1B, 0x01, 0xDC, 0x0C, 0x60, 0xE3, 0x06, 0x1C, + 0x70, 0x63, 0x83, 0x98, 0x0D, 0xC0, 0x7C, 0x01, 0xE0, 0x0E, 0x00, 0x30, + 0x03, 0x80, 0x38, 0x07, 0x80, 0x38, 0x00, 0x01, 0xC0, 0x00, 0xE0, 0x01, + 0xFC, 0x03, 0xFF, 0x83, 0x9C, 0xE3, 0x8E, 0x39, 0x87, 0x0D, 0xC3, 0x87, + 0xC1, 0xC1, 0xE0, 0xE0, 0xF0, 0x70, 0x7C, 0x38, 0x76, 0x1C, 0x33, 0x8E, + 0x38, 0xE7, 0x38, 0x3F, 0xF8, 0x0F, 0xF8, 0x00, 0xE0, 0x00, 0x70, 0x00, + 0xE0, 0x3B, 0x01, 0x9C, 0x1C, 0x71, 0xC1, 0x8C, 0x0E, 0xE0, 0x3E, 0x00, + 0xF0, 0x07, 0x00, 0x3C, 0x03, 0x60, 0x3B, 0x81, 0x8E, 0x1C, 0x31, 0xC1, + 0xCC, 0x06, 0xE0, 0x38, 0xC0, 0x19, 0x80, 0x33, 0x00, 0x66, 0x00, 0xCC, + 0x01, 0x98, 0x03, 0x30, 0x06, 0x60, 0x0C, 0xC0, 0x19, 0x80, 0x33, 0x00, + 0x66, 0x00, 0xCC, 0x01, 0x98, 0x03, 0x30, 0x06, 0x7F, 0xFF, 0xFF, 0xFE, + 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0xC0, 0x3C, 0x03, 0xC0, + 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xE0, 0x77, 0xFF, 0x3F, + 0xB0, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0xC0, 0xC0, + 0xF8, 0x18, 0x1F, 0x03, 0x03, 0xE0, 0x60, 0x7C, 0x0C, 0x0F, 0x81, 0x81, + 0xF0, 0x30, 0x3E, 0x06, 0x07, 0xC0, 0xC0, 0xF8, 0x18, 0x1F, 0x03, 0x03, + 0xE0, 0x60, 0x7C, 0x0C, 0x0F, 0x81, 0x81, 0xF0, 0x30, 0x3F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xE0, 0xC0, 0xC0, 0xEC, 0x0C, 0x0E, 0xC0, 0xC0, 0xEC, 0x0C, + 0x0E, 0xC0, 0xC0, 0xEC, 0x0C, 0x0E, 0xC0, 0xC0, 0xEC, 0x0C, 0x0E, 0xC0, + 0xC0, 0xEC, 0x0C, 0x0E, 0xC0, 0xC0, 0xEC, 0x0C, 0x0E, 0xC0, 0xC0, 0xEC, + 0x0C, 0x0E, 0xC0, 0xC0, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x03, + 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x30, 0xFE, 0x00, 0x7F, 0x00, + 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0F, + 0xF8, 0x07, 0xFF, 0x03, 0x03, 0x81, 0x80, 0xE0, 0xC0, 0x30, 0x60, 0x18, + 0x30, 0x1C, 0x18, 0x1C, 0x0F, 0xFE, 0x07, 0xFC, 0x00, 0xC0, 0x03, 0xE0, + 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, + 0xFF, 0x07, 0xFF, 0xE3, 0xE0, 0x39, 0xF0, 0x0C, 0xF8, 0x06, 0x7C, 0x03, + 0x3E, 0x01, 0x9F, 0x01, 0xCF, 0xFF, 0xC7, 0xFF, 0x83, 0x80, 0xC0, 0x0C, + 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0F, 0xF8, 0xFF, 0xEC, + 0x0E, 0xC0, 0x7C, 0x03, 0xC0, 0x3C, 0x07, 0xC0, 0xEF, 0xFE, 0xFF, 0x80, + 0x1F, 0x81, 0xFE, 0x1C, 0x39, 0xC0, 0xEC, 0x03, 0x60, 0x1C, 0x00, 0xE1, + 0xFF, 0x0F, 0xF8, 0x01, 0xC0, 0x0F, 0x80, 0x7C, 0x03, 0x70, 0x39, 0xC3, + 0x87, 0xF8, 0x1F, 0x80, 0xC0, 0x7C, 0x30, 0x7F, 0xCC, 0x38, 0x3B, 0x1C, + 0x06, 0xC7, 0x01, 0xF1, 0x80, 0x3C, 0x60, 0x0F, 0xF8, 0x03, 0xFE, 0x00, + 0xF1, 0x80, 0x3C, 0x60, 0x0F, 0x18, 0x03, 0xC6, 0x01, 0xF0, 0xC0, 0x6C, + 0x38, 0x3B, 0x07, 0xFC, 0xC0, 0x7C, 0x00, 0x0F, 0xF3, 0xFF, 0x70, 0x36, + 0x03, 0x60, 0x36, 0x03, 0x60, 0x36, 0x03, 0x70, 0x33, 0xFF, 0x0F, 0xF1, + 0xC3, 0x18, 0x33, 0x03, 0x70, 0x36, 0x03, 0xE0, 0x30, 0x1F, 0x0F, 0xF1, + 0x87, 0x70, 0x60, 0x0C, 0x3F, 0x9F, 0xF3, 0x86, 0xE0, 0xD8, 0x1B, 0x87, + 0x3F, 0xE3, 0xEE, 0x00, 0x40, 0x38, 0x3E, 0x1F, 0x03, 0x00, 0xC0, 0x13, + 0xC7, 0xFE, 0xF0, 0xFC, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF8, 0x3B, + 0x86, 0x3F, 0xC3, 0xE0, 0xFF, 0x1F, 0xFB, 0x07, 0x60, 0x6C, 0x1D, 0xFF, + 0x3F, 0xE6, 0x06, 0xC0, 0xF8, 0x1F, 0x03, 0x7F, 0xEF, 0xF0, 0xFF, 0xFF, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0F, + 0xF0, 0x3F, 0xC0, 0xC3, 0x03, 0x0C, 0x0C, 0x30, 0x70, 0xC1, 0xC3, 0x06, + 0x0C, 0x18, 0x30, 0xE0, 0xC3, 0x03, 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x7E, + 0x01, 0xF8, 0x07, 0xE0, 0x1C, 0x0F, 0x07, 0xF9, 0xC3, 0x30, 0x7E, 0x07, + 0xFF, 0xFF, 0xFE, 0x00, 0xE0, 0x0C, 0x01, 0xC3, 0x9F, 0xE0, 0xF8, 0x70, + 0xC1, 0xCC, 0x30, 0xE3, 0x8C, 0x70, 0x73, 0x18, 0x0C, 0xCE, 0x03, 0xFF, + 0x00, 0xFF, 0xC0, 0x33, 0x38, 0x1C, 0xC6, 0x0E, 0x31, 0xC3, 0x0C, 0x31, + 0xC3, 0x0E, 0xE0, 0xC1, 0xC0, 0x3F, 0x1F, 0xEE, 0x1C, 0x03, 0x01, 0x87, + 0xE1, 0xF8, 0x07, 0x00, 0xF0, 0x3E, 0x1D, 0xFE, 0x3F, 0x00, 0xC0, 0xF0, + 0x7C, 0x3F, 0x0F, 0xC6, 0xF3, 0xBC, 0xCF, 0x63, 0xD8, 0xFC, 0x3F, 0x0F, + 0x83, 0xC0, 0xC0, 0x61, 0x0C, 0xC1, 0xE0, 0x00, 0xC0, 0xF0, 0x7C, 0x3F, + 0x0F, 0xC6, 0xF3, 0xBC, 0xCF, 0x63, 0xD8, 0xFC, 0x3F, 0x0F, 0x83, 0xC0, + 0xC0, 0xC1, 0xD8, 0x73, 0x0C, 0x63, 0x0C, 0xC1, 0xF8, 0x3F, 0x06, 0x70, + 0xC6, 0x18, 0xE3, 0x0E, 0x60, 0xEC, 0x0E, 0x3F, 0xE7, 0xFC, 0xE1, 0x9C, + 0x33, 0x06, 0x60, 0xCC, 0x19, 0x83, 0x30, 0x66, 0x0D, 0xC1, 0xF0, 0x3C, + 0x06, 0xE0, 0x1F, 0x80, 0x7F, 0x03, 0xFC, 0x0F, 0xD8, 0x6F, 0x61, 0xBD, + 0x8E, 0xF3, 0x33, 0xCC, 0xCF, 0x1E, 0x3C, 0x78, 0xF0, 0xC3, 0xC3, 0x0C, + 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0xF0, + 0x3C, 0x0F, 0x03, 0xC0, 0xC0, 0x0F, 0x03, 0xFC, 0x70, 0xE6, 0x06, 0xE0, + 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xE0, 0x76, 0x06, 0x70, 0xE3, 0xFC, 0x0F, + 0x00, 0xFF, 0xFF, 0xFC, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, + 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xC0, 0xCF, 0x1B, 0xFB, 0xC7, 0x70, 0x7E, + 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x1F, 0xC7, 0x7F, 0xEE, 0xF1, + 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x00, 0x0F, 0x07, 0xF9, 0xC3, 0x30, + 0x3E, 0x07, 0xC0, 0x30, 0x07, 0x00, 0xE0, 0x0C, 0x0D, 0xC3, 0x1F, 0xE1, + 0xF0, 0xFF, 0xFF, 0xFC, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, + 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0xE0, 0xEC, 0x19, 0x83, 0x38, + 0xE3, 0x18, 0x63, 0x0E, 0x60, 0xD8, 0x1B, 0x03, 0xE0, 0x38, 0x07, 0x00, + 0x60, 0x18, 0x03, 0x00, 0xC0, 0x78, 0x0E, 0x00, 0x03, 0x00, 0x06, 0x00, + 0x0C, 0x00, 0x18, 0x00, 0x30, 0x03, 0xFE, 0x1F, 0xFF, 0x39, 0x8E, 0xE3, + 0x0F, 0x86, 0x0F, 0x0C, 0x1E, 0x18, 0x3C, 0x30, 0x78, 0x60, 0xF8, 0xC3, + 0xB1, 0x8E, 0x7F, 0xFC, 0x7F, 0xF0, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, + 0x60, 0x00, 0xC0, 0x00, 0x60, 0xE6, 0x18, 0xE7, 0x0C, 0xC0, 0xF0, 0x1E, + 0x01, 0x80, 0x78, 0x1F, 0x03, 0x30, 0xE7, 0x38, 0x6E, 0x06, 0xC0, 0xCC, + 0x0C, 0xC0, 0xCC, 0x0C, 0xC0, 0xCC, 0x0C, 0xC0, 0xCC, 0x0C, 0xC0, 0xCC, + 0x0C, 0xC0, 0xCF, 0xFF, 0xFF, 0xE0, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF8, 0x36, 0x0D, 0xFF, 0x1F, 0xC0, + 0x30, 0x0C, 0x03, 0x00, 0xC0, 0xC1, 0x87, 0xC1, 0x87, 0xC1, 0x87, 0xC1, + 0x87, 0xC1, 0x87, 0xC1, 0x87, 0xC1, 0x87, 0xC1, 0x87, 0xC1, 0x87, 0xC1, + 0x87, 0xC1, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x87, 0x60, 0xC3, 0xB0, + 0x61, 0xD8, 0x30, 0xEC, 0x18, 0x76, 0x0C, 0x3B, 0x06, 0x1D, 0x83, 0x0E, + 0xC1, 0x87, 0x60, 0xC3, 0xB0, 0x61, 0xDF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, + 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0xFC, 0x03, 0xF0, 0x00, + 0xC0, 0x03, 0x00, 0x0F, 0xF0, 0x3F, 0xE0, 0xC1, 0xC3, 0x03, 0x0C, 0x0C, + 0x30, 0x30, 0xC1, 0xC3, 0xFE, 0x0F, 0xF0, 0xC0, 0x0F, 0x80, 0x1F, 0x00, + 0x3E, 0x00, 0x7F, 0xF0, 0xFF, 0xF1, 0xF0, 0x73, 0xE0, 0x67, 0xC0, 0xCF, + 0x81, 0x9F, 0x07, 0x3F, 0xFC, 0x7F, 0xF0, 0xE0, 0xC0, 0x30, 0x0C, 0x03, + 0x00, 0xFF, 0x3F, 0xEC, 0x1F, 0x03, 0xC0, 0xF0, 0x3C, 0x1F, 0xFE, 0xFF, + 0x00, 0x1E, 0x0F, 0xF1, 0x87, 0x60, 0x60, 0x0C, 0x1F, 0xC3, 0xF8, 0x07, + 0xC0, 0xDC, 0x19, 0x87, 0x3F, 0xC1, 0xE0, 0xC0, 0xF8, 0x60, 0xFF, 0x30, + 0xE1, 0xD8, 0x60, 0x6C, 0x70, 0x3F, 0xF0, 0x0F, 0xF8, 0x07, 0x8C, 0x03, + 0xC7, 0x03, 0xE1, 0x81, 0xB0, 0xE1, 0xD8, 0x3F, 0xCC, 0x07, 0x80, 0x1F, + 0xE7, 0xFD, 0xC1, 0xB0, 0x36, 0x06, 0xE0, 0xCF, 0xF8, 0xFF, 0x1C, 0x63, + 0x0C, 0xC1, 0xB8, 0x3E, 0x06 }; + +const GFXglyph Roboto_Regular12pt8bRUSGlyphs[] PROGMEM = { + { 0, 11, 21, 14, 2, -20 }, // 0x400 + { 29, 11, 20, 14, 2, -19 }, // 0x401 + { 57, 16, 17, 18, 1, -16 }, // 0x402 + { 91, 11, 21, 13, 2, -20 }, // 0x403 + { 120, 13, 17, 16, 1, -16 }, // 0x404 + { 148, 12, 17, 14, 1, -16 }, // 0x405 + { 174, 2, 17, 7, 2, -16 }, // 0x406 + { 179, 7, 20, 7, 0, -19 }, // 0x407 + { 197, 10, 17, 13, 1, -16 }, // 0x408 + { 219, 24, 17, 26, 1, -16 }, // 0x409 + { 270, 23, 17, 26, 2, -16 }, // 0x40A + { 319, 17, 17, 20, 1, -16 }, // 0x40B + { 356, 13, 21, 15, 2, -20 }, // 0x40C + { 391, 13, 21, 17, 2, -20 }, // 0x40D + { 426, 13, 21, 15, 1, -20 }, // 0x40E + { 461, 13, 21, 17, 2, -16 }, // 0x40F + { 496, 15, 17, 16, 1, -16 }, // 0x410 + { 528, 12, 17, 15, 2, -16 }, // 0x411 + { 554, 12, 17, 15, 2, -16 }, // 0x412 + { 580, 11, 17, 13, 2, -16 }, // 0x413 + { 604, 16, 21, 18, 1, -16 }, // 0x414 + { 646, 11, 17, 14, 2, -16 }, // 0x415 + { 670, 22, 17, 22, 0, -16 }, // 0x416 + { 717, 12, 17, 14, 1, -16 }, // 0x417 + { 743, 13, 17, 17, 2, -16 }, // 0x418 + { 771, 13, 21, 17, 2, -20 }, // 0x419 + { 806, 13, 17, 15, 2, -16 }, // 0x41A + { 834, 14, 17, 17, 1, -16 }, // 0x41B + { 864, 17, 17, 21, 2, -16 }, // 0x41C + { 901, 13, 17, 17, 2, -16 }, // 0x41D + { 929, 14, 17, 17, 1, -16 }, // 0x41E + { 959, 13, 17, 17, 2, -16 }, // 0x41F + { 987, 12, 17, 15, 2, -16 }, // 0x420 + { 1013, 14, 17, 16, 1, -16 }, // 0x421 + { 1043, 13, 17, 14, 1, -16 }, // 0x422 + { 1071, 13, 17, 15, 1, -16 }, // 0x423 + { 1099, 17, 19, 19, 1, -17 }, // 0x424 + { 1140, 13, 17, 15, 1, -16 }, // 0x425 + { 1168, 15, 21, 18, 2, -16 }, // 0x426 + { 1208, 12, 17, 16, 2, -16 }, // 0x427 + { 1234, 19, 17, 23, 2, -16 }, // 0x428 + { 1275, 20, 21, 23, 2, -16 }, // 0x429 + { 1328, 17, 17, 18, 0, -16 }, // 0x42A + { 1365, 17, 17, 21, 2, -16 }, // 0x42B + { 1402, 12, 17, 15, 2, -16 }, // 0x42C + { 1428, 13, 17, 16, 2, -16 }, // 0x42D + { 1456, 18, 17, 21, 2, -16 }, // 0x42E + { 1495, 12, 17, 15, 1, -16 }, // 0x42F + { 1521, 11, 13, 13, 1, -12 }, // 0x430 + { 1539, 11, 18, 13, 1, -17 }, // 0x431 + { 1564, 11, 13, 14, 2, -12 }, // 0x432 + { 1582, 8, 13, 10, 2, -12 }, // 0x433 + { 1595, 14, 17, 14, 0, -12 }, // 0x434 + { 1625, 11, 13, 13, 1, -12 }, // 0x435 + { 1643, 18, 13, 18, 0, -12 }, // 0x436 + { 1673, 10, 13, 12, 1, -12 }, // 0x437 + { 1690, 10, 13, 14, 2, -12 }, // 0x438 + { 1707, 10, 17, 14, 2, -16 }, // 0x439 + { 1729, 11, 13, 13, 2, -12 }, // 0x43A + { 1747, 11, 13, 14, 1, -12 }, // 0x43B + { 1765, 14, 13, 18, 2, -12 }, // 0x43C + { 1788, 10, 13, 14, 2, -12 }, // 0x43D + { 1805, 12, 13, 14, 1, -12 }, // 0x43E + { 1825, 10, 13, 14, 2, -12 }, // 0x43F + { 1842, 11, 18, 13, 1, -12 }, // 0x440 + { 1867, 11, 13, 13, 1, -12 }, // 0x441 + { 1885, 11, 13, 12, 0, -12 }, // 0x442 + { 1903, 11, 18, 11, 0, -12 }, // 0x443 + { 1928, 15, 23, 17, 1, -17 }, // 0x444 + { 1972, 11, 13, 12, 0, -12 }, // 0x445 + { 1990, 12, 17, 14, 2, -12 }, // 0x446 + { 2016, 10, 13, 13, 1, -12 }, // 0x447 + { 2033, 16, 13, 19, 2, -12 }, // 0x448 + { 2059, 17, 17, 20, 2, -12 }, // 0x449 + { 2096, 14, 13, 15, 0, -12 }, // 0x44A + { 2119, 15, 13, 19, 2, -12 }, // 0x44B + { 2144, 10, 13, 13, 2, -12 }, // 0x44C + { 2161, 11, 13, 13, 1, -12 }, // 0x44D + { 2179, 17, 13, 20, 2, -12 }, // 0x44E + { 2207, 11, 13, 13, 0, -12 } }; // 0x44F + +const GFXfont Roboto_Regular12pt8bRUS PROGMEM = { + (uint8_t *)Roboto_Regular12pt8bRUSBitmaps, + (GFXglyph *)Roboto_Regular12pt8bRUSGlyphs, + 0x400, 0x44F, 28 }; + +// Approx. 2792 bytes diff --git a/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.12pt.h b/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.12pt.h new file mode 100644 index 0000000..66fdbeb --- /dev/null +++ b/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.12pt.h @@ -0,0 +1,265 @@ +const uint8_t Roboto_Regular12pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0x99, 0x99, 0x99, 0x06, 0x30, 0x31, 0x81, + 0x88, 0x08, 0x47, 0xFF, 0xBF, 0xFC, 0x31, 0x81, 0x88, 0x08, 0x40, 0x46, + 0x3F, 0xFF, 0xFF, 0xF1, 0x8C, 0x0C, 0x40, 0x46, 0x02, 0x30, 0x31, 0x80, + 0x06, 0x00, 0xC0, 0x18, 0x0F, 0x83, 0xFC, 0xE1, 0x98, 0x3B, 0x03, 0x60, + 0x0E, 0x00, 0xF0, 0x0F, 0xC0, 0x3C, 0x01, 0xC0, 0x1E, 0x03, 0xE0, 0x6E, + 0x1C, 0xFF, 0x0F, 0xC0, 0x60, 0x0C, 0x00, 0x3C, 0x00, 0x66, 0x00, 0xC6, + 0x10, 0xC2, 0x38, 0xC2, 0x20, 0xC6, 0x60, 0x66, 0x40, 0x3C, 0xC0, 0x01, + 0x80, 0x01, 0x3C, 0x03, 0x66, 0x06, 0x42, 0x04, 0x43, 0x0C, 0x43, 0x18, + 0x42, 0x18, 0x66, 0x00, 0x3C, 0x0F, 0x00, 0xFE, 0x03, 0x1C, 0x0C, 0x30, + 0x30, 0xC0, 0xC6, 0x03, 0xF0, 0x07, 0x80, 0x1E, 0x01, 0xDC, 0x66, 0x31, + 0xB0, 0x6E, 0xC0, 0xF3, 0x81, 0xC7, 0x0F, 0x1F, 0xFE, 0x1F, 0x1C, 0xFF, + 0xF0, 0x08, 0x71, 0x8C, 0x61, 0x86, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, + 0x30, 0xC3, 0x0E, 0x18, 0x60, 0xC1, 0x87, 0x08, 0x41, 0xC0, 0xC1, 0x81, + 0x83, 0x03, 0x06, 0x0C, 0x18, 0x38, 0x70, 0xE1, 0xC3, 0x86, 0x0C, 0x18, + 0x30, 0xC1, 0x86, 0x0C, 0x30, 0xC0, 0x0C, 0x03, 0x00, 0xC1, 0xB7, 0xFF, + 0xC3, 0x01, 0xE0, 0xCC, 0x33, 0x88, 0x40, 0x06, 0x00, 0x60, 0x06, 0x00, + 0x60, 0x06, 0x0F, 0xFF, 0xFF, 0xF0, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, + 0x60, 0x77, 0x76, 0x6C, 0xFF, 0xF0, 0xF0, 0x01, 0x80, 0xC0, 0xC0, 0x60, + 0x20, 0x30, 0x18, 0x18, 0x0C, 0x04, 0x06, 0x03, 0x03, 0x01, 0x80, 0x80, + 0xC0, 0x60, 0x60, 0x00, 0x1F, 0x07, 0xF9, 0xC7, 0x30, 0x76, 0x07, 0xC0, + 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x36, 0x06, 0xC1, 0xDC, + 0x71, 0xFE, 0x1F, 0x00, 0x06, 0x7F, 0xFC, 0x70, 0xE1, 0xC3, 0x87, 0x0E, + 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1F, 0x03, 0xFC, 0x71, 0xCE, + 0x0E, 0xC0, 0x60, 0x06, 0x00, 0xC0, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, + 0xC0, 0x18, 0x03, 0x00, 0x70, 0x0F, 0xFF, 0xFF, 0xF0, 0x1F, 0x07, 0xF9, + 0xC7, 0x70, 0x7C, 0x0E, 0x01, 0x80, 0x70, 0x7C, 0x0F, 0x80, 0x38, 0x03, + 0x80, 0x3C, 0x07, 0xC1, 0xD8, 0x33, 0xFE, 0x1F, 0x00, 0x01, 0xC0, 0x3C, + 0x03, 0xC0, 0x7C, 0x0D, 0xC0, 0xDC, 0x19, 0xC3, 0x1C, 0x31, 0xC6, 0x1C, + 0xC1, 0xCF, 0xFF, 0xFF, 0xF0, 0x1C, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x7F, + 0xCF, 0xF9, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x1F, 0xC3, 0xFC, 0xE1, 0xC0, + 0x18, 0x03, 0x00, 0x7C, 0x0D, 0x81, 0xB8, 0x73, 0xFC, 0x1F, 0x00, 0x07, + 0x07, 0xC3, 0x81, 0xC0, 0xE0, 0x30, 0x0D, 0xF3, 0xFE, 0xE1, 0xF0, 0x3C, + 0x0F, 0x03, 0xC0, 0xF0, 0x36, 0x1D, 0xFE, 0x1E, 0x00, 0xFF, 0xFF, 0xFC, + 0x01, 0x80, 0x60, 0x0C, 0x03, 0x80, 0x60, 0x0C, 0x03, 0x00, 0x60, 0x18, + 0x03, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xC0, 0x38, 0x00, 0x1F, 0x07, 0xF9, + 0xC7, 0x30, 0x76, 0x06, 0xC1, 0xDC, 0x31, 0xFC, 0x3F, 0x8E, 0x19, 0x81, + 0xF0, 0x3C, 0x07, 0xC0, 0xDC, 0x39, 0xFE, 0x1F, 0x00, 0x1F, 0x07, 0xF1, + 0xC7, 0x70, 0x6C, 0x0F, 0x80, 0xF0, 0x1F, 0x07, 0x71, 0xEF, 0xFC, 0x79, + 0x80, 0x60, 0x0C, 0x03, 0x80, 0xE0, 0xF8, 0x1C, 0x00, 0xF0, 0x00, 0x03, + 0xC0, 0x77, 0x00, 0x00, 0x00, 0x00, 0x03, 0x33, 0x66, 0xC0, 0x00, 0x81, + 0xC3, 0xE7, 0xCF, 0x86, 0x03, 0xC0, 0x7C, 0x0F, 0x81, 0xC0, 0x20, 0xFF, + 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x80, 0x38, 0x0F, 0x80, + 0xF8, 0x07, 0x80, 0x70, 0x78, 0xF8, 0xF8, 0x38, 0x08, 0x00, 0x3E, 0x3F, + 0xB8, 0xF8, 0x30, 0x18, 0x0C, 0x06, 0x06, 0x07, 0x06, 0x07, 0x03, 0x01, + 0x80, 0x00, 0x00, 0x30, 0x1C, 0x00, 0x01, 0xFC, 0x00, 0x7F, 0xF0, 0x0F, + 0x07, 0x81, 0xC0, 0x1C, 0x30, 0x00, 0xC3, 0x07, 0x86, 0x60, 0xFC, 0x66, + 0x18, 0xC2, 0x43, 0x0C, 0x24, 0x30, 0xC2, 0xC3, 0x0C, 0x2C, 0x60, 0x82, + 0xC6, 0x08, 0x2C, 0x61, 0x86, 0x43, 0x3C, 0x66, 0x3E, 0xFC, 0x61, 0xC7, + 0x83, 0x00, 0x00, 0x38, 0x00, 0x01, 0xE0, 0xC0, 0x0F, 0xFC, 0x00, 0x3F, + 0x00, 0x03, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xCC, 0x01, 0x98, + 0x03, 0x30, 0x0C, 0x30, 0x18, 0x60, 0x70, 0xE0, 0xC0, 0xC1, 0xFF, 0x87, + 0xFF, 0x8C, 0x03, 0x38, 0x07, 0x60, 0x06, 0xC0, 0x0E, 0xFF, 0x8F, 0xFC, + 0xC0, 0xEC, 0x06, 0xC0, 0x6C, 0x06, 0xC0, 0xCF, 0xF8, 0xFF, 0xCC, 0x0E, + 0xC0, 0x6C, 0x07, 0xC0, 0x7C, 0x06, 0xC0, 0xEF, 0xFC, 0xFF, 0x80, 0x07, + 0xC0, 0x7F, 0xC3, 0x87, 0x1C, 0x0E, 0x60, 0x19, 0x80, 0x6E, 0x00, 0x78, + 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x18, 0x07, 0x60, 0x19, 0xC0, 0x63, + 0x87, 0x07, 0xFC, 0x0F, 0xC0, 0xFF, 0x0F, 0xF8, 0xC1, 0xEC, 0x06, 0xC0, + 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, + 0x7C, 0x06, 0xC1, 0xEF, 0xFC, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x60, + 0x0C, 0x01, 0x80, 0x30, 0x07, 0xFE, 0xFF, 0xD8, 0x03, 0x00, 0x60, 0x0C, + 0x01, 0x80, 0x30, 0x07, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0x00, 0x60, + 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xFF, 0x9F, 0xF3, 0x00, 0x60, 0x0C, + 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x00, 0x0F, 0xC0, 0x7F, 0xC3, 0x83, + 0x9C, 0x06, 0x60, 0x19, 0x80, 0x1E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x87, + 0xF6, 0x1F, 0xD8, 0x07, 0x60, 0x1D, 0xC0, 0x73, 0x81, 0xC7, 0xFE, 0x07, + 0xE0, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, + 0x7F, 0xFF, 0xFF, 0xFE, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, + 0x00, 0x78, 0x03, 0xC0, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0xC0, + 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, + 0x03, 0xC0, 0xF0, 0x3E, 0x1D, 0xFE, 0x3F, 0x00, 0xC0, 0x7E, 0x07, 0x30, + 0x31, 0x83, 0x0C, 0x38, 0x63, 0x83, 0x38, 0x1B, 0x80, 0xFE, 0x07, 0xB0, + 0x39, 0xC1, 0x87, 0x0C, 0x1C, 0x60, 0x63, 0x03, 0x98, 0x0E, 0xC0, 0x38, + 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, + 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0xFF, 0xFF, 0xC0, 0xE0, 0x03, + 0xF0, 0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFD, 0x80, 0xDE, 0xC0, 0x6F, 0x70, + 0x77, 0x98, 0x33, 0xCC, 0x19, 0xE3, 0x18, 0xF1, 0x8C, 0x78, 0xEE, 0x3C, + 0x36, 0x1E, 0x1B, 0x0F, 0x07, 0x07, 0x83, 0x83, 0xC1, 0xC1, 0x80, 0xE0, + 0x1F, 0x00, 0xFC, 0x07, 0xE0, 0x3D, 0x81, 0xEE, 0x0F, 0x30, 0x78, 0xC3, + 0xC7, 0x1E, 0x18, 0xF0, 0xE7, 0x83, 0xBC, 0x0D, 0xE0, 0x7F, 0x01, 0xF8, + 0x07, 0xC0, 0x38, 0x07, 0xC0, 0x7F, 0xC3, 0x87, 0x9C, 0x06, 0x60, 0x1D, + 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xD8, 0x03, + 0x60, 0x1D, 0xC0, 0x63, 0x87, 0x87, 0xFC, 0x07, 0xC0, 0xFF, 0x8F, 0xFE, + 0xC0, 0xEC, 0x07, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x07, 0xC0, 0xEF, 0xFE, + 0xFF, 0x8C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x00, 0x0F, + 0x81, 0xFF, 0x1C, 0x1C, 0xC0, 0x6C, 0x03, 0xE0, 0x0F, 0x00, 0x78, 0x03, + 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x03, 0xB0, 0x19, 0xC1, 0xC7, + 0xFC, 0x0F, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x20, 0xFF, 0x8F, 0xFC, 0xC0, + 0xEC, 0x07, 0xC0, 0x7C, 0x07, 0xC0, 0x7C, 0x0E, 0xFF, 0xCF, 0xF8, 0xC1, + 0x8C, 0x1C, 0xC0, 0xCC, 0x0E, 0xC0, 0x6C, 0x07, 0xC0, 0x30, 0x1F, 0x83, + 0xFE, 0x70, 0xEE, 0x07, 0xE0, 0x3E, 0x00, 0x70, 0x03, 0xE0, 0x1F, 0x80, + 0x3E, 0x00, 0x70, 0x03, 0xC0, 0x3E, 0x03, 0x70, 0x73, 0xFE, 0x1F, 0x80, + 0xFF, 0xFF, 0xFF, 0xC1, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, + 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, + 0x00, 0xC0, 0x06, 0x00, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, + 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3E, + 0x07, 0x70, 0xE3, 0xFC, 0x1F, 0x80, 0xE0, 0x0E, 0xC0, 0x19, 0xC0, 0x71, + 0x80, 0xE3, 0x01, 0x87, 0x07, 0x06, 0x0C, 0x0C, 0x18, 0x1C, 0x70, 0x18, + 0xC0, 0x31, 0x80, 0x77, 0x00, 0x6C, 0x00, 0xD8, 0x00, 0xE0, 0x01, 0xC0, + 0x03, 0x80, 0xC0, 0x60, 0x7C, 0x0E, 0x06, 0xE0, 0xE0, 0x66, 0x0F, 0x06, + 0x60, 0xF0, 0xE6, 0x1B, 0x0C, 0x61, 0x98, 0xC3, 0x19, 0x8C, 0x33, 0x18, + 0xC3, 0x31, 0x98, 0x33, 0x0D, 0x81, 0xB0, 0xD8, 0x1E, 0x0D, 0x81, 0xE0, + 0x58, 0x1E, 0x07, 0x01, 0xC0, 0x70, 0x0C, 0x07, 0x00, 0xE0, 0x3B, 0x01, + 0x9C, 0x1C, 0x71, 0xC1, 0x8C, 0x0E, 0xE0, 0x3E, 0x00, 0xF0, 0x07, 0x00, + 0x3C, 0x03, 0x60, 0x3B, 0x81, 0x8E, 0x1C, 0x31, 0xC1, 0xCC, 0x06, 0xE0, + 0x38, 0xE0, 0x1D, 0xC0, 0x63, 0x03, 0x8E, 0x0C, 0x18, 0x70, 0x71, 0x80, + 0xCE, 0x03, 0xB0, 0x07, 0xC0, 0x1E, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, + 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x70, + 0x0E, 0x00, 0xC0, 0x18, 0x03, 0x80, 0x70, 0x06, 0x00, 0xE0, 0x1C, 0x01, + 0x80, 0x30, 0x07, 0x00, 0xE0, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFF, 0xE0, 0x18, 0x07, + 0x00, 0xC0, 0x30, 0x06, 0x01, 0x80, 0x70, 0x0C, 0x03, 0x00, 0x60, 0x18, + 0x06, 0x00, 0xC0, 0x30, 0x06, 0x01, 0x80, 0x70, 0xFF, 0xCE, 0x73, 0x9C, + 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9F, 0xFF, 0x18, + 0x18, 0x3C, 0x3C, 0x66, 0x66, 0xC3, 0xC3, 0xFF, 0xFF, 0xFC, 0xE3, 0x8E, + 0x1F, 0x0F, 0xF1, 0x87, 0x70, 0x60, 0x0C, 0x3F, 0x9F, 0xF3, 0x86, 0xE0, + 0xD8, 0x1B, 0x87, 0x3F, 0xE3, 0xEE, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, + 0x01, 0xDE, 0x3F, 0xF7, 0x8E, 0xE0, 0xFC, 0x0F, 0x81, 0xF0, 0x3E, 0x07, + 0xC0, 0xF8, 0x3F, 0x8E, 0xDF, 0xD9, 0xE0, 0x0F, 0x07, 0xF9, 0xC3, 0x30, + 0x3E, 0x07, 0xC0, 0x30, 0x07, 0x00, 0xE0, 0x0C, 0x0D, 0xC3, 0x1F, 0xE1, + 0xF0, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x3E, 0xCF, 0xFB, 0x87, + 0x60, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x06, 0xC0, 0xD8, 0x1B, 0x87, 0x3F, + 0xE3, 0xEC, 0x0F, 0x07, 0xF9, 0xC3, 0x30, 0x7E, 0x07, 0xFF, 0xFF, 0xFE, + 0x00, 0xE0, 0x0C, 0x01, 0xC3, 0x9F, 0xE0, 0xF8, 0x1E, 0x7C, 0xC1, 0x83, + 0x1F, 0xBF, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, + 0x1E, 0x6F, 0xED, 0xC7, 0xF0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, + 0xFC, 0x1D, 0xC7, 0xBF, 0xF1, 0xEE, 0x01, 0xD0, 0x33, 0x0E, 0x7F, 0x83, + 0xE0, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0xFB, 0xFF, 0xC7, 0xC1, 0xE0, + 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xC0, 0xF0, 0xFF, + 0xFF, 0xFF, 0xC0, 0x18, 0xC0, 0x01, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, + 0x63, 0x18, 0xC6, 0x3F, 0xF8, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, + 0xFC, 0x33, 0x18, 0xCC, 0x37, 0x0F, 0x83, 0xE0, 0xEC, 0x33, 0x8C, 0x73, + 0x0C, 0xC1, 0xB0, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xDF, 0x1E, 0x7F, + 0xDF, 0xF8, 0xF8, 0xF8, 0x38, 0x3C, 0x1C, 0x1E, 0x0E, 0x0F, 0x07, 0x07, + 0x83, 0x83, 0xC1, 0xC1, 0xE0, 0xE0, 0xF0, 0x70, 0x78, 0x38, 0x3C, 0x1C, + 0x18, 0xDF, 0x7F, 0xF8, 0xF8, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, + 0xF0, 0x78, 0x3C, 0x18, 0x0F, 0x03, 0xFC, 0x70, 0xE6, 0x06, 0xE0, 0x7C, + 0x03, 0xC0, 0x3C, 0x03, 0xE0, 0x76, 0x06, 0x70, 0xE3, 0xFC, 0x0F, 0x00, + 0xCF, 0x1B, 0xFB, 0xC7, 0x70, 0x7E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, + 0x7C, 0x1F, 0xC7, 0x7F, 0xEE, 0xF1, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, + 0x00, 0x1F, 0x67, 0xFD, 0xC3, 0xB0, 0x3E, 0x07, 0xC0, 0xF0, 0x1E, 0x03, + 0xE0, 0x6C, 0x0D, 0xC3, 0x9F, 0xF1, 0xF6, 0x00, 0xC0, 0x18, 0x03, 0x00, + 0x60, 0x0C, 0xDF, 0xFE, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC0, + 0x1E, 0x1F, 0xE6, 0x1F, 0x83, 0xE0, 0x1F, 0x03, 0xF8, 0x0F, 0x00, 0xF0, + 0x3E, 0x1D, 0xFE, 0x1F, 0x00, 0x38, 0x70, 0xE7, 0xFF, 0xE7, 0x0E, 0x1C, + 0x38, 0x70, 0xE1, 0xC3, 0x83, 0x07, 0x87, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, + 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xD8, 0x36, 0x1D, 0xFF, 0x3E, 0xC0, + 0xC0, 0xF0, 0x3E, 0x1D, 0x86, 0x61, 0x8C, 0xC3, 0x30, 0xCC, 0x1E, 0x07, + 0x81, 0xE0, 0x30, 0x0C, 0x00, 0xE0, 0xC1, 0xB0, 0x60, 0xD8, 0x78, 0x6E, + 0x3C, 0x63, 0x1E, 0x31, 0x99, 0x98, 0xCC, 0xCC, 0x36, 0x6C, 0x1A, 0x16, + 0x0F, 0x0F, 0x07, 0x87, 0x01, 0x81, 0x80, 0xC0, 0xC0, 0x60, 0xE6, 0x18, + 0xE7, 0x0C, 0xC0, 0xF0, 0x1E, 0x01, 0x80, 0x78, 0x1F, 0x03, 0x30, 0xE7, + 0x38, 0x6E, 0x06, 0xE0, 0xEC, 0x19, 0x83, 0x38, 0xE3, 0x18, 0x63, 0x0E, + 0x60, 0xD8, 0x1B, 0x03, 0xE0, 0x38, 0x07, 0x00, 0x60, 0x18, 0x03, 0x00, + 0xC0, 0x78, 0x0E, 0x00, 0xFF, 0xFF, 0xF0, 0x18, 0x0C, 0x07, 0x03, 0x80, + 0xC0, 0x60, 0x38, 0x1C, 0x06, 0x03, 0xFF, 0xFF, 0xC0, 0x06, 0x1C, 0x61, + 0xC3, 0x06, 0x0C, 0x18, 0x30, 0x61, 0xC7, 0x0E, 0x0E, 0x0C, 0x18, 0x30, + 0x60, 0xC1, 0xC1, 0x83, 0x81, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, + 0xC0, 0xC1, 0x81, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x70, 0x70, 0xE3, 0x86, + 0x0C, 0x18, 0x30, 0x61, 0xC3, 0x0C, 0x30, 0x00, 0x3C, 0x0D, 0xF8, 0x36, + 0x79, 0xB0, 0x7E, 0xC0, 0xF0 }; + +const GFXglyph Roboto_Regular12pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 6, 0, 1 }, // 0x20 ' ' + { 0, 2, 17, 6, 2, -16 }, // 0x21 '!' + { 5, 4, 6, 8, 2, -17 }, // 0x22 '"' + { 8, 13, 17, 15, 1, -16 }, // 0x23 '#' + { 36, 11, 22, 13, 1, -19 }, // 0x24 '$' + { 67, 16, 17, 18, 1, -16 }, // 0x25 '%' + { 101, 14, 17, 15, 1, -16 }, // 0x26 '&' + { 131, 2, 6, 4, 1, -17 }, // 0x27 ''' + { 133, 6, 25, 8, 2, -18 }, // 0x28 '(' + { 152, 7, 25, 8, 0, -18 }, // 0x29 ')' + { 174, 10, 10, 10, 0, -16 }, // 0x2A '*' + { 187, 12, 12, 14, 1, -13 }, // 0x2B '+' + { 205, 4, 6, 5, 0, -1 }, // 0x2C ',' + { 208, 6, 2, 7, 0, -7 }, // 0x2D '-' + { 210, 2, 2, 6, 2, -1 }, // 0x2E '.' + { 211, 9, 18, 10, 0, -16 }, // 0x2F '/' + { 232, 11, 17, 13, 1, -16 }, // 0x30 '0' + { 256, 7, 17, 13, 2, -16 }, // 0x31 '1' + { 271, 12, 17, 13, 1, -16 }, // 0x32 '2' + { 297, 11, 17, 13, 1, -16 }, // 0x33 '3' + { 321, 12, 17, 13, 1, -16 }, // 0x34 '4' + { 347, 11, 17, 13, 2, -16 }, // 0x35 '5' + { 371, 10, 17, 13, 2, -16 }, // 0x36 '6' + { 393, 11, 17, 13, 1, -16 }, // 0x37 '7' + { 417, 11, 17, 13, 1, -16 }, // 0x38 '8' + { 441, 11, 17, 13, 1, -16 }, // 0x39 '9' + { 465, 2, 13, 6, 2, -12 }, // 0x3A ':' + { 469, 4, 17, 5, 0, -12 }, // 0x3B ';' + { 478, 9, 11, 12, 1, -12 }, // 0x3C '<' + { 491, 10, 7, 13, 2, -11 }, // 0x3D '=' + { 500, 10, 11, 13, 2, -12 }, // 0x3E '>' + { 514, 9, 17, 11, 1, -16 }, // 0x3F '?' + { 534, 20, 22, 22, 1, -16 }, // 0x40 '@' + { 589, 15, 17, 16, 1, -16 }, // 0x41 'A' + { 621, 12, 17, 15, 2, -16 }, // 0x42 'B' + { 647, 14, 17, 16, 1, -16 }, // 0x43 'C' + { 677, 12, 17, 16, 2, -16 }, // 0x44 'D' + { 703, 11, 17, 14, 2, -16 }, // 0x45 'E' + { 727, 11, 17, 13, 2, -16 }, // 0x46 'F' + { 751, 14, 17, 16, 1, -16 }, // 0x47 'G' + { 781, 13, 17, 17, 2, -16 }, // 0x48 'H' + { 809, 2, 17, 7, 2, -16 }, // 0x49 'I' + { 814, 10, 17, 13, 1, -16 }, // 0x4A 'J' + { 836, 13, 17, 15, 2, -16 }, // 0x4B 'K' + { 864, 10, 17, 13, 2, -16 }, // 0x4C 'L' + { 886, 17, 17, 21, 2, -16 }, // 0x4D 'M' + { 923, 13, 17, 17, 2, -16 }, // 0x4E 'N' + { 951, 14, 17, 17, 1, -16 }, // 0x4F 'O' + { 981, 12, 17, 15, 2, -16 }, // 0x50 'P' + { 1007, 13, 20, 17, 2, -16 }, // 0x51 'Q' + { 1040, 12, 17, 15, 2, -16 }, // 0x52 'R' + { 1066, 12, 17, 14, 1, -16 }, // 0x53 'S' + { 1092, 13, 17, 14, 1, -16 }, // 0x54 'T' + { 1120, 12, 17, 16, 2, -16 }, // 0x55 'U' + { 1146, 15, 17, 15, 0, -16 }, // 0x56 'V' + { 1178, 20, 17, 21, 1, -16 }, // 0x57 'W' + { 1221, 13, 17, 15, 1, -16 }, // 0x58 'X' + { 1249, 14, 17, 14, 0, -16 }, // 0x59 'Y' + { 1279, 12, 17, 14, 1, -16 }, // 0x5A 'Z' + { 1305, 4, 24, 6, 2, -19 }, // 0x5B '[' + { 1317, 10, 18, 10, 0, -16 }, // 0x5C '\' + { 1340, 5, 24, 6, 0, -19 }, // 0x5D ']' + { 1355, 8, 8, 10, 1, -16 }, // 0x5E '^' + { 1363, 11, 2, 11, 0, 1 }, // 0x5F '_' + { 1366, 5, 3, 7, 1, -17 }, // 0x60 '`' + { 1368, 11, 13, 13, 1, -12 }, // 0x61 'a' + { 1386, 11, 18, 13, 1, -17 }, // 0x62 'b' + { 1411, 11, 13, 13, 1, -12 }, // 0x63 'c' + { 1429, 11, 18, 14, 1, -17 }, // 0x64 'd' + { 1454, 11, 13, 13, 1, -12 }, // 0x65 'e' + { 1472, 7, 18, 8, 1, -17 }, // 0x66 'f' + { 1488, 11, 18, 13, 1, -12 }, // 0x67 'g' + { 1513, 9, 18, 13, 2, -17 }, // 0x68 'h' + { 1534, 2, 17, 6, 2, -16 }, // 0x69 'i' + { 1539, 5, 22, 6, -1, -16 }, // 0x6A 'j' + { 1553, 10, 18, 12, 2, -17 }, // 0x6B 'k' + { 1576, 2, 18, 6, 2, -17 }, // 0x6C 'l' + { 1581, 17, 13, 21, 2, -12 }, // 0x6D 'm' + { 1609, 9, 13, 13, 2, -12 }, // 0x6E 'n' + { 1624, 12, 13, 14, 1, -12 }, // 0x6F 'o' + { 1644, 11, 18, 13, 1, -12 }, // 0x70 'p' + { 1669, 11, 18, 14, 1, -12 }, // 0x71 'q' + { 1694, 6, 13, 8, 2, -12 }, // 0x72 'r' + { 1704, 10, 13, 12, 1, -12 }, // 0x73 's' + { 1721, 7, 16, 8, 0, -15 }, // 0x74 't' + { 1735, 10, 13, 13, 1, -12 }, // 0x75 'u' + { 1752, 10, 13, 12, 1, -12 }, // 0x76 'v' + { 1769, 17, 13, 18, 0, -12 }, // 0x77 'w' + { 1797, 11, 13, 12, 0, -12 }, // 0x78 'x' + { 1815, 11, 18, 11, 0, -12 }, // 0x79 'y' + { 1840, 10, 13, 12, 1, -12 }, // 0x7A 'z' + { 1857, 7, 23, 8, 1, -18 }, // 0x7B '{' + { 1878, 2, 20, 6, 2, -16 }, // 0x7C '|' + { 1883, 7, 23, 8, 0, -18 }, // 0x7D '}' + { 1904, 14, 5, 16, 1, -8 } }; // 0x7E '~' + +const GFXfont Roboto_Regular12pt7b PROGMEM = { + (uint8_t *)Roboto_Regular12pt7bBitmaps, + (GFXglyph *)Roboto_Regular12pt7bGlyphs, + 0x20, 0x7E, 28 }; + +// Approx. 2585 bytes diff --git a/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.24pt.RUS.h b/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.24pt.RUS.h new file mode 100644 index 0000000..0fb5591 --- /dev/null +++ b/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.24pt.RUS.h @@ -0,0 +1,799 @@ +const uint8_t Roboto_Regular24pt8bRUSBitmaps[] PROGMEM = { + 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x1E, + 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, + 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, + 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, + 0x1E, 0x00, 0x00, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0x3F, 0xFF, 0xF9, 0xFF, + 0xFF, 0xCF, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, + 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, + 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0E, 0x03, 0x80, 0xF8, 0x3E, 0x07, 0xC1, + 0xF0, 0x3E, 0x0F, 0x80, 0xE0, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, + 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, + 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1F, 0xFF, 0xFC, 0xFF, 0xFF, 0xE7, 0xFF, + 0xFF, 0x3F, 0xFF, 0xF9, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, + 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, + 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, + 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, + 0x00, 0x7C, 0xFF, 0x80, 0x00, 0x7F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xF8, + 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x7F, 0x00, 0xFE, 0x00, 0x7C, 0x00, 0x3E, + 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x7C, 0x00, 0x0F, + 0x00, 0x7C, 0x00, 0x0F, 0x00, 0x7C, 0x00, 0x0F, 0x00, 0x7C, 0x00, 0x0F, + 0x00, 0x7C, 0x00, 0x0F, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x7C, 0x00, 0x1F, + 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xFE, 0x00, 0x7C, 0x07, 0xFC, + 0x00, 0x7C, 0x07, 0xF8, 0x00, 0x7C, 0x07, 0xF0, 0x00, 0x7C, 0x07, 0x80, + 0x00, 0x0F, 0xC0, 0x00, 0xF8, 0x00, 0x07, 0x80, 0x00, 0x7C, 0x00, 0x07, + 0xC0, 0x00, 0x3C, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, + 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, + 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, + 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, + 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, + 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, + 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, + 0x80, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0xFC, 0x00, + 0x7F, 0xFF, 0x80, 0x3F, 0xFF, 0xF0, 0x1F, 0xC0, 0x7E, 0x07, 0xC0, 0x07, + 0xC3, 0xE0, 0x01, 0xF8, 0xF0, 0x00, 0x3E, 0x7C, 0x00, 0x07, 0x9E, 0x00, + 0x01, 0xE7, 0x80, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xC0, + 0x3F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFC, 0x03, 0xC0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x1F, 0x78, + 0x00, 0x07, 0x9F, 0x00, 0x01, 0xE7, 0xC0, 0x00, 0xF8, 0xF8, 0x00, 0x3C, + 0x1F, 0x00, 0x1F, 0x07, 0xF0, 0x1F, 0x80, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, + 0xE0, 0x01, 0xFF, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0xFF, 0x00, 0x03, + 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF8, 0x3F, 0x80, 0xFC, 0x3E, + 0x00, 0x3E, 0x7C, 0x00, 0x1E, 0x7C, 0x00, 0x1F, 0x78, 0x00, 0x1F, 0x78, + 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3F, + 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00, + 0xFF, 0xF0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF8, + 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0x7C, 0x00, 0x1F, 0x7E, 0x00, 0x3F, 0x3F, + 0x80, 0xFE, 0x1F, 0xFF, 0xFC, 0x0F, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x00, + 0x7F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x70, 0x1D, 0xF0, 0x7F, 0xE0, 0xFF, 0xC1, 0xF7, 0x01, 0xC0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, + 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, + 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, + 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, + 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x01, + 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x00, 0x00, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, + 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, + 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, + 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, + 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0xF8, 0x00, + 0x7F, 0xC0, 0x03, 0xFE, 0x00, 0x3E, 0xF0, 0x01, 0xF7, 0xC0, 0x1F, 0x3F, + 0x83, 0xF8, 0xFF, 0xFF, 0x83, 0xFF, 0xF8, 0x0F, 0xFF, 0x80, 0x0F, 0xE0, + 0x00, 0x01, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xE0, 0x00, + 0x00, 0x07, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x80, 0x00, + 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, + 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x00, + 0x01, 0xE0, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xC0, 0x03, 0xE0, 0x00, 0x00, + 0x07, 0x80, 0x07, 0xC0, 0x00, 0x00, 0x0F, 0x00, 0x0F, 0x80, 0x00, 0x00, + 0x1E, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3F, 0xFF, 0xE0, 0x00, + 0x78, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0xF0, 0x00, 0xFF, 0xFF, 0xF8, 0x01, + 0xE0, 0x01, 0xFF, 0xFF, 0xF8, 0x03, 0xC0, 0x03, 0xE0, 0x03, 0xF8, 0x07, + 0x80, 0x07, 0xC0, 0x01, 0xF0, 0x0F, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x3E, + 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x3E, 0x00, 0x03, 0xC0, 0xF8, + 0x00, 0x7C, 0x00, 0x07, 0x81, 0xE0, 0x00, 0xF8, 0x00, 0x0F, 0x03, 0xC0, + 0x01, 0xF0, 0x00, 0x1E, 0x07, 0x80, 0x03, 0xE0, 0x00, 0x7C, 0x1F, 0x00, + 0x07, 0xC0, 0x00, 0xF8, 0x3E, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0xF8, 0x00, + 0x1F, 0x00, 0x07, 0xC3, 0xF0, 0x00, 0x3E, 0x00, 0x3F, 0xBF, 0xC0, 0x00, + 0x7F, 0xFF, 0xFE, 0x7F, 0x80, 0x00, 0xFF, 0xFF, 0xF8, 0xFE, 0x00, 0x01, + 0xFF, 0xFF, 0xC1, 0xF0, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0xF8, 0x00, 0x07, + 0x80, 0x00, 0x07, 0xC0, 0x00, 0x3C, 0x00, 0x00, 0x3E, 0x00, 0x01, 0xE0, + 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x78, 0x00, + 0x00, 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x1E, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x07, 0x80, 0x00, 0x07, + 0xC0, 0x00, 0x3C, 0x00, 0x00, 0x3E, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xF0, + 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x78, 0x00, 0x00, 0x7C, 0x00, + 0x03, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xE0, 0x01, 0xF9, 0xF0, 0x00, 0x0F, 0x00, + 0x07, 0xEF, 0x80, 0x00, 0x78, 0x00, 0x1F, 0x7C, 0x00, 0x03, 0xC0, 0x00, + 0x7F, 0xE0, 0x00, 0x1E, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xF0, 0x00, 0x1F, + 0xF8, 0x00, 0x07, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x3C, 0x00, 0x07, 0xFE, + 0x00, 0x01, 0xE0, 0x00, 0x3F, 0xF0, 0x00, 0x0F, 0x00, 0x03, 0xEF, 0x80, + 0x00, 0x78, 0x00, 0x3F, 0x7C, 0x00, 0x03, 0xC0, 0x03, 0xF3, 0xE0, 0x00, + 0x1F, 0xFF, 0xFF, 0x9F, 0x00, 0x00, 0xFF, 0xFF, 0xF8, 0xF8, 0x00, 0x07, + 0xFF, 0xFF, 0x07, 0xC0, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, + 0xC0, 0x7F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, + 0xF8, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0xF0, + 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x03, + 0xC0, 0x00, 0x00, 0x01, 0xE7, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0x00, + 0x7F, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xFE, 0x00, 0x1F, 0x80, 0x3F, 0x80, + 0x0F, 0x00, 0x07, 0xC0, 0x07, 0x80, 0x01, 0xF0, 0x03, 0xC0, 0x00, 0xF8, + 0x01, 0xE0, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x78, 0x00, 0x0F, + 0x00, 0x3C, 0x00, 0x07, 0x80, 0x1E, 0x00, 0x03, 0xC0, 0x0F, 0x00, 0x01, + 0xE0, 0x07, 0x80, 0x00, 0xF0, 0x03, 0xC0, 0x00, 0x78, 0x01, 0xE0, 0x00, + 0x3C, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x3C, 0x00, + 0x07, 0x80, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x0F, 0x80, + 0x00, 0x0F, 0x80, 0x00, 0x07, 0x80, 0x00, 0x07, 0x80, 0x00, 0x07, 0x80, + 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, + 0x0F, 0xBC, 0x00, 0x0F, 0x9E, 0x00, 0x0F, 0x8F, 0x00, 0x0F, 0x87, 0x80, + 0x0F, 0xC3, 0xC0, 0x0F, 0xC1, 0xE0, 0x0F, 0xC0, 0xF0, 0x07, 0xC0, 0x78, + 0x07, 0xC0, 0x3C, 0x07, 0xC0, 0x1E, 0x07, 0xC0, 0x0F, 0x07, 0xC0, 0x07, + 0x87, 0xE0, 0x03, 0xC7, 0xE0, 0x01, 0xE7, 0xE0, 0x00, 0xF7, 0xF0, 0x00, + 0x7B, 0xF8, 0x00, 0x3F, 0xFE, 0x00, 0x1F, 0xEF, 0x80, 0x0F, 0xE7, 0xE0, + 0x07, 0xE1, 0xF0, 0x03, 0xE0, 0x7C, 0x01, 0xE0, 0x1F, 0x00, 0xF0, 0x0F, + 0xC0, 0x78, 0x03, 0xE0, 0x3C, 0x00, 0xF8, 0x1E, 0x00, 0x3E, 0x0F, 0x00, + 0x1F, 0x87, 0x80, 0x07, 0xC3, 0xC0, 0x01, 0xF1, 0xE0, 0x00, 0x7C, 0xF0, + 0x00, 0x3F, 0x78, 0x00, 0x0F, 0xBC, 0x00, 0x03, 0xE0, 0x03, 0xE0, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0xC0, + 0x00, 0x01, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x03, 0xFC, 0x00, 0x03, 0xFE, 0x00, 0x03, 0xFF, 0x00, + 0x01, 0xFF, 0x80, 0x01, 0xFF, 0xC0, 0x01, 0xFF, 0xE0, 0x00, 0xFF, 0xF0, + 0x00, 0xFF, 0xF8, 0x00, 0x7F, 0xFC, 0x00, 0x7D, 0xFE, 0x00, 0x7C, 0xFF, + 0x00, 0x3E, 0x7F, 0x80, 0x3E, 0x3F, 0xC0, 0x3E, 0x1F, 0xE0, 0x1F, 0x0F, + 0xF0, 0x1F, 0x07, 0xF8, 0x0F, 0x83, 0xFC, 0x0F, 0x81, 0xFE, 0x0F, 0x80, + 0xFF, 0x07, 0xC0, 0x7F, 0x87, 0xC0, 0x3F, 0xC7, 0xC0, 0x1F, 0xE3, 0xE0, + 0x0F, 0xF3, 0xE0, 0x07, 0xF9, 0xE0, 0x03, 0xFD, 0xF0, 0x01, 0xFF, 0xF0, + 0x00, 0xFF, 0xF8, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xF8, 0x00, 0x1F, 0xFC, + 0x00, 0x0F, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xE0, + 0x03, 0x80, 0xF0, 0x00, 0xF0, 0x3C, 0x00, 0x3E, 0x1E, 0x00, 0x07, 0xFF, + 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x03, 0xE0, + 0x00, 0x1F, 0x7C, 0x00, 0x07, 0xDF, 0x00, 0x03, 0xE3, 0xE0, 0x00, 0xF8, + 0xF8, 0x00, 0x3E, 0x1E, 0x00, 0x1F, 0x07, 0xC0, 0x07, 0xC1, 0xF0, 0x03, + 0xE0, 0x3E, 0x00, 0xF8, 0x0F, 0x80, 0x3C, 0x01, 0xF0, 0x1F, 0x00, 0x7C, + 0x07, 0xC0, 0x0F, 0x83, 0xE0, 0x03, 0xE0, 0xF8, 0x00, 0x78, 0x3C, 0x00, + 0x1F, 0x1F, 0x00, 0x03, 0xC7, 0x80, 0x00, 0xFB, 0xE0, 0x00, 0x1E, 0xF8, + 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, + 0xE0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0xFC, 0x00, + 0x03, 0xFE, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xC0, + 0x00, 0x00, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, + 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, + 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xC0, 0x00, + 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC, 0x00, + 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xC0, + 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC, + 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x07, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F, + 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, 0xF0, 0x00, + 0x00, 0xF7, 0x80, 0x00, 0x07, 0xBC, 0x00, 0x00, 0x78, 0xF0, 0x00, 0x03, + 0xC7, 0x80, 0x00, 0x1E, 0x3C, 0x00, 0x01, 0xE0, 0xF0, 0x00, 0x0F, 0x07, + 0x80, 0x00, 0xF8, 0x3E, 0x00, 0x07, 0x80, 0xF0, 0x00, 0x3C, 0x07, 0x80, + 0x03, 0xC0, 0x1E, 0x00, 0x1E, 0x00, 0xF0, 0x00, 0xF0, 0x07, 0x80, 0x0F, + 0x00, 0x1E, 0x00, 0x78, 0x00, 0xF0, 0x07, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, + 0xFE, 0x01, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xC0, 0xF0, 0x00, 0x1E, + 0x07, 0x80, 0x00, 0xF0, 0x7C, 0x00, 0x07, 0xC3, 0xC0, 0x00, 0x1E, 0x3E, + 0x00, 0x00, 0xF9, 0xF0, 0x00, 0x07, 0xCF, 0x00, 0x00, 0x1E, 0xF8, 0x00, + 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xC0, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF0, + 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF0, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, + 0xF0, 0x00, 0xFC, 0xF0, 0x00, 0x7E, 0xF0, 0x00, 0x3E, 0xF0, 0x00, 0x1F, + 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x1F, + 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x3E, 0xF0, 0x00, 0x7E, 0xF0, 0x00, 0xFC, + 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0x00, + 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0x8F, + 0x00, 0x3F, 0x9E, 0x00, 0x1F, 0x3C, 0x00, 0x1E, 0x78, 0x00, 0x3E, 0xF0, + 0x00, 0x7D, 0xE0, 0x00, 0xFB, 0xC0, 0x01, 0xF7, 0x80, 0x03, 0xCF, 0x00, + 0x0F, 0x9E, 0x00, 0x7E, 0x3F, 0xFF, 0xF8, 0x7F, 0xFF, 0xC0, 0xFF, 0xFF, + 0xC1, 0xFF, 0xFF, 0xE3, 0xC0, 0x07, 0xE7, 0x80, 0x03, 0xCF, 0x00, 0x07, + 0xDE, 0x00, 0x07, 0xBC, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xF0, 0x00, 0x3F, + 0xE0, 0x00, 0x7F, 0xC0, 0x00, 0xF7, 0x80, 0x03, 0xEF, 0x00, 0x0F, 0xDE, + 0x00, 0x3F, 0x3F, 0xFF, 0xFE, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xC1, 0xFF, + 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, + 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, + 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, + 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, + 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, + 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, + 0x00, 0x7F, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xFE, + 0x00, 0x0F, 0x80, 0x0F, 0x00, 0x07, 0xC0, 0x07, 0x80, 0x03, 0xE0, 0x03, + 0xC0, 0x01, 0xF0, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0xF0, 0x00, 0x78, 0x00, + 0x78, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x0F, 0x00, + 0x0F, 0x00, 0x07, 0x80, 0x07, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0xE0, + 0x01, 0xE0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF8, 0x00, 0x78, 0x00, 0x7C, + 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x0F, + 0x00, 0x07, 0x80, 0x0F, 0x80, 0x03, 0xC0, 0x07, 0xC0, 0x01, 0xE0, 0x03, + 0xC0, 0x00, 0xF0, 0x03, 0xE0, 0x00, 0x78, 0x01, 0xF0, 0x00, 0x3C, 0x01, + 0xF0, 0x00, 0x1E, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0xF8, 0x00, 0x07, 0x83, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x01, + 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, + 0x3F, 0xE0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, + 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, + 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, + 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1F, 0xFF, 0xFC, 0xFF, 0xFF, 0xE7, 0xFF, + 0xFF, 0x3F, 0xFF, 0xF9, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, + 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFC, 0x00, 0x3E, 0x00, + 0x1F, 0x3F, 0x00, 0x1F, 0x00, 0x1F, 0x8F, 0x80, 0x0F, 0x80, 0x0F, 0x83, + 0xE0, 0x07, 0xC0, 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x7C, 0x01, + 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x0F, 0x80, 0x7C, 0x03, + 0xE0, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x01, 0xF0, 0x1F, 0x01, 0xE0, 0x00, + 0x7C, 0x0F, 0x81, 0xF0, 0x00, 0x1F, 0x07, 0xC1, 0xF0, 0x00, 0x0F, 0x83, + 0xE0, 0xF8, 0x00, 0x03, 0xE1, 0xF0, 0xF8, 0x00, 0x00, 0xF0, 0xF8, 0x78, + 0x00, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x00, 0x1F, 0xFF, 0xFC, 0x00, 0x00, + 0x1F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x80, 0x00, 0x0F, 0x87, + 0xC3, 0xE0, 0x00, 0x0F, 0xC3, 0xE1, 0xF8, 0x00, 0x07, 0xC1, 0xF0, 0x7C, + 0x00, 0x07, 0xC0, 0xF8, 0x1F, 0x00, 0x07, 0xE0, 0x7C, 0x0F, 0xC0, 0x03, + 0xE0, 0x3E, 0x03, 0xE0, 0x03, 0xE0, 0x1F, 0x01, 0xF8, 0x03, 0xF0, 0x0F, + 0x80, 0x7E, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x01, 0xF8, 0x03, 0xE0, 0x0F, + 0xC1, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0xFC, + 0x00, 0x7C, 0x00, 0x7E, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x1F, + 0x00, 0x07, 0xC0, 0x00, 0xFF, 0x00, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, + 0x1F, 0xFF, 0xF8, 0x3F, 0x81, 0xFC, 0x7E, 0x00, 0x7E, 0x7C, 0x00, 0x3E, + 0x78, 0x00, 0x1E, 0xF8, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFC, + 0x00, 0xFF, 0xF0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xF0, 0x00, 0xFF, 0xF8, + 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xF8, 0x00, 0x1F, + 0xF8, 0x00, 0x3F, 0x7E, 0x00, 0x7E, 0x7F, 0x01, 0xFE, 0x3F, 0xFF, 0xFC, + 0x1F, 0xFF, 0xF8, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0x00, 0xF0, 0x00, 0x07, + 0xF8, 0x00, 0x07, 0xFC, 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x03, + 0xFF, 0x80, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0xE0, 0x01, 0xFF, 0xF0, 0x00, + 0xFF, 0xF8, 0x00, 0xFB, 0xFC, 0x00, 0xF9, 0xFE, 0x00, 0x7C, 0xFF, 0x00, + 0x7C, 0x7F, 0x80, 0x7C, 0x3F, 0xC0, 0x3E, 0x1F, 0xE0, 0x3E, 0x0F, 0xF0, + 0x1F, 0x07, 0xF8, 0x1F, 0x03, 0xFC, 0x1F, 0x01, 0xFE, 0x0F, 0x80, 0xFF, + 0x0F, 0x80, 0x7F, 0x8F, 0x80, 0x3F, 0xC7, 0xC0, 0x1F, 0xE7, 0xC0, 0x0F, + 0xF3, 0xC0, 0x07, 0xFB, 0xE0, 0x03, 0xFF, 0xE0, 0x01, 0xFF, 0xF0, 0x00, + 0xFF, 0xF0, 0x00, 0x7F, 0xF0, 0x00, 0x3F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, + 0x0F, 0xF8, 0x00, 0x07, 0xFC, 0x00, 0x03, 0xC0, 0x03, 0x80, 0xF0, 0x01, + 0xE0, 0x78, 0x00, 0xF8, 0x78, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFC, 0x00, + 0x01, 0xF8, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, + 0xF8, 0x00, 0x0F, 0xFC, 0x00, 0x07, 0xFE, 0x00, 0x07, 0xFF, 0x00, 0x07, + 0xFF, 0x80, 0x03, 0xFF, 0xC0, 0x03, 0xFF, 0xE0, 0x01, 0xFF, 0xF0, 0x01, + 0xF7, 0xF8, 0x01, 0xF3, 0xFC, 0x00, 0xF9, 0xFE, 0x00, 0xF8, 0xFF, 0x00, + 0xF8, 0x7F, 0x80, 0x7C, 0x3F, 0xC0, 0x7C, 0x1F, 0xE0, 0x3E, 0x0F, 0xF0, + 0x3E, 0x07, 0xF8, 0x3E, 0x03, 0xFC, 0x1F, 0x01, 0xFE, 0x1F, 0x00, 0xFF, + 0x1F, 0x00, 0x7F, 0x8F, 0x80, 0x3F, 0xCF, 0x80, 0x1F, 0xE7, 0x80, 0x0F, + 0xF7, 0xC0, 0x07, 0xFF, 0xC0, 0x03, 0xFF, 0xE0, 0x01, 0xFF, 0xE0, 0x00, + 0xFF, 0xE0, 0x00, 0x7F, 0xF0, 0x00, 0x3F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, + 0x0F, 0xF8, 0x00, 0x07, 0x80, 0xF0, 0x00, 0x1F, 0xBC, 0x00, 0x0F, 0xCF, + 0x00, 0x03, 0xE3, 0xC0, 0x01, 0xF0, 0xF0, 0x00, 0xF8, 0x3C, 0x00, 0x7E, + 0x0F, 0x00, 0x3F, 0x03, 0xC0, 0x1F, 0x80, 0xF0, 0x07, 0xC0, 0x3C, 0x03, + 0xE0, 0x0F, 0x01, 0xF8, 0x03, 0xC0, 0xFC, 0x00, 0xF0, 0x7E, 0x00, 0x3C, + 0x3F, 0x00, 0x0F, 0xFF, 0x80, 0x03, 0xFF, 0xC0, 0x00, 0xFF, 0xF8, 0x00, + 0x3F, 0xFF, 0x00, 0x0F, 0x07, 0xE0, 0x03, 0xC0, 0xF8, 0x00, 0xF0, 0x3F, + 0x00, 0x3C, 0x07, 0xE0, 0x0F, 0x00, 0xF8, 0x03, 0xC0, 0x1F, 0x00, 0xF0, + 0x07, 0xE0, 0x3C, 0x00, 0xFC, 0x0F, 0x00, 0x1F, 0x03, 0xC0, 0x03, 0xE0, + 0xF0, 0x00, 0xFC, 0x3C, 0x00, 0x1F, 0x8F, 0x00, 0x03, 0xE3, 0xC0, 0x00, + 0x7C, 0xF0, 0x00, 0x0F, 0xBC, 0x00, 0x03, 0xF0, 0x01, 0xFF, 0xFF, 0xF0, + 0x1F, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0x01, 0xF0, + 0x00, 0xF0, 0x1F, 0x00, 0x0F, 0x01, 0xF0, 0x00, 0xF0, 0x1F, 0x00, 0x0F, + 0x01, 0xE0, 0x00, 0xF0, 0x1E, 0x00, 0x0F, 0x01, 0xE0, 0x00, 0xF0, 0x1E, + 0x00, 0x0F, 0x01, 0xE0, 0x00, 0xF0, 0x1E, 0x00, 0x0F, 0x01, 0xE0, 0x00, + 0xF0, 0x1E, 0x00, 0x0F, 0x01, 0xE0, 0x00, 0xF0, 0x1E, 0x00, 0x0F, 0x01, + 0xE0, 0x00, 0xF0, 0x1E, 0x00, 0x0F, 0x03, 0xE0, 0x00, 0xF0, 0x3E, 0x00, + 0x0F, 0x03, 0xE0, 0x00, 0xF0, 0x3C, 0x00, 0x0F, 0x03, 0xC0, 0x00, 0xF0, + 0x3C, 0x00, 0x0F, 0x07, 0xC0, 0x00, 0xF0, 0x7C, 0x00, 0x0F, 0x0F, 0x80, + 0x00, 0xF1, 0xF8, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x0F, + 0xFE, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x1F, 0xFE, + 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x07, 0xFF, + 0xE0, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x01, 0xFF, + 0xFF, 0x00, 0x01, 0xFF, 0xF7, 0x80, 0x00, 0xF7, 0xFB, 0xC0, 0x00, 0x7B, + 0xFD, 0xF0, 0x00, 0x7D, 0xFE, 0x78, 0x00, 0x3C, 0xFF, 0x3C, 0x00, 0x3E, + 0x7F, 0x8F, 0x00, 0x1E, 0x3F, 0xC7, 0x80, 0x0F, 0x1F, 0xE3, 0xE0, 0x0F, + 0x8F, 0xF0, 0xF0, 0x07, 0x87, 0xF8, 0x78, 0x03, 0xC3, 0xFC, 0x1E, 0x03, + 0xC1, 0xFE, 0x0F, 0x01, 0xE0, 0xFF, 0x07, 0xC1, 0xF0, 0x7F, 0x81, 0xE0, + 0xF0, 0x3F, 0xC0, 0xF0, 0x78, 0x1F, 0xE0, 0x3C, 0x78, 0x0F, 0xF0, 0x1E, + 0x3C, 0x07, 0xF8, 0x0F, 0xBE, 0x03, 0xFC, 0x03, 0xDE, 0x01, 0xFE, 0x01, + 0xEF, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x7F, 0x80, 0x3F, 0x80, 0x3F, 0xC0, + 0x1F, 0xC0, 0x1F, 0xE0, 0x07, 0xC0, 0x0F, 0xF0, 0x03, 0xE0, 0x07, 0xF8, + 0x00, 0xE0, 0x03, 0xC0, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFF, 0x00, + 0x00, 0x7F, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFF, + 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x01, + 0xFF, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xFC, 0x00, + 0x01, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x07, + 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x1F, 0xF0, 0x00, + 0x07, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x1F, 0xF0, + 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x1F, + 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xF0, 0x00, 0x7F, 0x80, 0x00, 0x3F, + 0xFC, 0x00, 0x1F, 0xFF, 0xE0, 0x07, 0xFF, 0xFE, 0x01, 0xFC, 0x0F, 0xE0, + 0x3E, 0x00, 0x7E, 0x0F, 0x80, 0x07, 0xC3, 0xE0, 0x00, 0x7C, 0x7C, 0x00, + 0x07, 0x8F, 0x00, 0x00, 0xFB, 0xE0, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0xEF, + 0x00, 0x00, 0x3D, 0xE0, 0x00, 0x07, 0xBC, 0x00, 0x00, 0xFF, 0x80, 0x00, + 0x1F, 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x0F, 0xF8, + 0x00, 0x01, 0xFF, 0x00, 0x00, 0x3D, 0xE0, 0x00, 0x07, 0xBE, 0x00, 0x00, + 0xF7, 0xC0, 0x00, 0x3E, 0x78, 0x00, 0x07, 0xCF, 0x80, 0x00, 0xF1, 0xF0, + 0x00, 0x3E, 0x1F, 0x00, 0x0F, 0x83, 0xF0, 0x03, 0xF0, 0x3F, 0x81, 0xFC, + 0x03, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xC0, 0x01, 0xFF, 0xF0, 0x00, 0x0F, + 0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, + 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, + 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xC0, 0x00, + 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC, 0x00, + 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xC0, + 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC, + 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, + 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, + 0xC0, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, + 0xFC, 0xF0, 0x00, 0xFC, 0xF0, 0x00, 0x7E, 0xF0, 0x00, 0x3E, 0xF0, 0x00, + 0x1F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, + 0x0F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, + 0x3E, 0xF0, 0x00, 0xFE, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, + 0xE0, 0xFF, 0xFF, 0x80, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0xFF, + 0xF8, 0x01, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0x81, 0xFC, 0x0F, 0xE1, 0xF8, + 0x01, 0xF8, 0xF8, 0x00, 0x7C, 0xF8, 0x00, 0x1F, 0x7C, 0x00, 0x0F, 0xBC, + 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x78, 0x00, + 0x07, 0xBE, 0x00, 0x07, 0xDF, 0x00, 0x03, 0xE7, 0xC0, 0x03, 0xE3, 0xF0, + 0x03, 0xF0, 0xFE, 0x07, 0xF0, 0x3F, 0xFF, 0xF0, 0x0F, 0xFF, 0xF0, 0x01, + 0xFF, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1E, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0xF8, 0x00, 0x07, + 0xDF, 0x00, 0x01, 0xF7, 0xC0, 0x00, 0xF8, 0xF8, 0x00, 0x3E, 0x3E, 0x00, + 0x0F, 0x87, 0x80, 0x07, 0xC1, 0xF0, 0x01, 0xF0, 0x7C, 0x00, 0xF8, 0x0F, + 0x80, 0x3E, 0x03, 0xE0, 0x0F, 0x00, 0x7C, 0x07, 0xC0, 0x1F, 0x01, 0xF0, + 0x03, 0xE0, 0xF8, 0x00, 0xF8, 0x3E, 0x00, 0x1E, 0x0F, 0x00, 0x07, 0xC7, + 0xC0, 0x00, 0xF1, 0xE0, 0x00, 0x3E, 0xF8, 0x00, 0x07, 0xBE, 0x00, 0x01, + 0xFF, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x03, 0xF8, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xE0, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFF, + 0x80, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x00, + 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, + 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x7F, 0xFE, 0x00, + 0x01, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xF0, + 0x1F, 0xC3, 0xC3, 0xF8, 0x3F, 0x03, 0xC0, 0xFC, 0x3E, 0x03, 0xC0, 0x3E, + 0x7C, 0x03, 0xC0, 0x1E, 0x78, 0x03, 0xC0, 0x1F, 0xF8, 0x03, 0xC0, 0x0F, + 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, + 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, + 0xF0, 0x03, 0xC0, 0x0F, 0xF8, 0x03, 0xC0, 0x0F, 0x78, 0x03, 0xC0, 0x1F, + 0x7C, 0x03, 0xC0, 0x1E, 0x3E, 0x03, 0xC0, 0x3E, 0x3F, 0x03, 0xC0, 0xFC, + 0x1F, 0xC3, 0xC3, 0xF8, 0x0F, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xE0, + 0x01, 0xFF, 0xFF, 0x80, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x03, 0xC0, 0x00, + 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, + 0x7C, 0x00, 0x07, 0xE7, 0xC0, 0x00, 0xF8, 0xF8, 0x00, 0x3E, 0x0F, 0x80, + 0x07, 0xC1, 0xF8, 0x01, 0xF0, 0x1F, 0x00, 0x7E, 0x01, 0xF0, 0x0F, 0x80, + 0x3E, 0x03, 0xE0, 0x03, 0xE0, 0x7C, 0x00, 0x3E, 0x1F, 0x00, 0x07, 0xC7, + 0xC0, 0x00, 0x7C, 0xF8, 0x00, 0x0F, 0xBE, 0x00, 0x00, 0xFF, 0xC0, 0x00, + 0x0F, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF0, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x07, 0xFE, 0x00, 0x01, + 0xF7, 0xC0, 0x00, 0x3E, 0x7C, 0x00, 0x0F, 0x8F, 0xC0, 0x03, 0xE0, 0xF8, + 0x00, 0x7C, 0x0F, 0x80, 0x1F, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x00, 0xF8, + 0x01, 0xF0, 0x3E, 0x00, 0x3E, 0x07, 0xC0, 0x03, 0xE1, 0xF0, 0x00, 0x7E, + 0x7C, 0x00, 0x07, 0xDF, 0x80, 0x00, 0x7C, 0xF0, 0x00, 0x07, 0x87, 0x80, + 0x00, 0x3C, 0x3C, 0x00, 0x01, 0xE1, 0xE0, 0x00, 0x0F, 0x0F, 0x00, 0x00, + 0x78, 0x78, 0x00, 0x03, 0xC3, 0xC0, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0xF0, + 0xF0, 0x00, 0x07, 0x87, 0x80, 0x00, 0x3C, 0x3C, 0x00, 0x01, 0xE1, 0xE0, + 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x78, 0x78, 0x00, 0x03, 0xC3, 0xC0, 0x00, + 0x1E, 0x1E, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x07, 0x87, 0x80, 0x00, 0x3C, + 0x3C, 0x00, 0x01, 0xE1, 0xE0, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x78, 0x78, + 0x00, 0x03, 0xC3, 0xC0, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0xF0, 0xF0, 0x00, + 0x07, 0x87, 0x80, 0x00, 0x3C, 0x3C, 0x00, 0x01, 0xE1, 0xE0, 0x00, 0x0F, + 0x0F, 0x00, 0x00, 0x78, 0x78, 0x00, 0x03, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF0, + 0x00, 0x00, 0x07, 0x80, 0xF8, 0x00, 0x07, 0xFC, 0x00, 0x03, 0xFE, 0x00, + 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x7F, 0xC0, 0x00, 0x3F, 0xE0, + 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x07, 0xFC, 0x00, 0x03, 0xFE, + 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x7B, 0xC0, 0x00, 0x3D, + 0xF0, 0x00, 0x1E, 0xF8, 0x00, 0x0F, 0x3F, 0x00, 0x7F, 0x9F, 0xFF, 0xFF, + 0xC7, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF0, 0x1F, 0xFC, 0x78, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x03, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x03, 0xC0, 0xF0, 0x00, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0x00, 0x0F, + 0xF0, 0x00, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0x00, 0x0F, 0xF0, 0x00, 0xF0, + 0x00, 0xFF, 0x00, 0x0F, 0x00, 0x0F, 0xF0, 0x00, 0xF0, 0x00, 0xFF, 0x00, + 0x0F, 0x00, 0x0F, 0xF0, 0x00, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0x00, 0x0F, + 0xF0, 0x00, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0x00, 0x0F, 0xF0, 0x00, 0xF0, + 0x00, 0xFF, 0x00, 0x0F, 0x00, 0x0F, 0xF0, 0x00, 0xF0, 0x00, 0xFF, 0x00, + 0x0F, 0x00, 0x0F, 0xF0, 0x00, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0x00, 0x0F, + 0xF0, 0x00, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0x00, 0x0F, 0xF0, 0x00, 0xF0, + 0x00, 0xFF, 0x00, 0x0F, 0x00, 0x0F, 0xF0, 0x00, 0xF0, 0x00, 0xFF, 0x00, + 0x0F, 0x00, 0x0F, 0xF0, 0x00, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0x00, 0x0F, + 0xF0, 0x00, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0x00, 0x0F, 0xF0, 0x00, 0xF0, + 0x00, 0xFF, 0x00, 0x0F, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, + 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, + 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, + 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, + 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, + 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, + 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, + 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, + 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, + 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xF0, 0x00, 0xF0, 0x00, + 0xF0, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xFC, + 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, + 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x03, 0xC0, 0x00, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0xE0, + 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xFF, 0x00, 0x1E, 0x00, 0x1F, + 0x80, 0x0F, 0x00, 0x07, 0xE0, 0x07, 0x80, 0x01, 0xF0, 0x03, 0xC0, 0x00, + 0x78, 0x01, 0xE0, 0x00, 0x3E, 0x00, 0xF0, 0x00, 0x1F, 0x00, 0x78, 0x00, + 0x0F, 0x80, 0x3C, 0x00, 0x07, 0xC0, 0x1E, 0x00, 0x03, 0xC0, 0x0F, 0x00, + 0x03, 0xE0, 0x07, 0x80, 0x03, 0xF0, 0x03, 0xC0, 0x03, 0xF0, 0x01, 0xFF, + 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x3F, + 0xFF, 0xC0, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x07, 0xFE, + 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0xFF, + 0xC0, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x1F, + 0xF8, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x03, + 0xFF, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, + 0x7F, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xF8, + 0x0F, 0xFF, 0xFF, 0xFE, 0x07, 0xFE, 0x00, 0x3F, 0x83, 0xFF, 0x00, 0x07, + 0xC1, 0xFF, 0x80, 0x01, 0xF0, 0xFF, 0xC0, 0x00, 0xF8, 0x7F, 0xE0, 0x00, + 0x3C, 0x3F, 0xF0, 0x00, 0x1E, 0x1F, 0xF8, 0x00, 0x0F, 0x0F, 0xFC, 0x00, + 0x0F, 0x87, 0xFE, 0x00, 0x07, 0xC3, 0xFF, 0x00, 0x03, 0xE1, 0xFF, 0x80, + 0x03, 0xE0, 0xFF, 0xC0, 0x07, 0xF0, 0x7F, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, + 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xC0, 0x07, 0xC0, + 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xF0, + 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0xF8, 0x00, 0xFE, 0xF8, 0x00, 0x3E, + 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x0F, 0xF8, 0x00, 0x0F, + 0xF8, 0x00, 0x0F, 0xF8, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F, + 0xF8, 0x00, 0x3E, 0xF8, 0x00, 0xFE, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xF8, + 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0x80, 0x00, 0xFF, 0x00, 0x03, 0xFF, 0xE0, + 0x03, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x03, 0xF8, 0x1F, 0xC3, 0xF0, 0x03, + 0xF1, 0xF0, 0x00, 0xF9, 0xF0, 0x00, 0x3E, 0xF8, 0x00, 0x1F, 0x78, 0x00, + 0x07, 0xBC, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x01, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x80, + 0x7F, 0xFF, 0xC0, 0x3F, 0xFF, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xF0, 0x00, 0x0F, + 0x7C, 0x00, 0x0F, 0xBE, 0x00, 0x07, 0xCF, 0x80, 0x07, 0xC7, 0xE0, 0x07, + 0xE1, 0xFC, 0x0F, 0xE0, 0x7F, 0xFF, 0xE0, 0x1F, 0xFF, 0xE0, 0x07, 0xFF, + 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0xE0, 0x0F, 0x80, 0x07, + 0xFF, 0x80, 0xF8, 0x01, 0xFF, 0xFE, 0x0F, 0x80, 0x3F, 0xFF, 0xF0, 0xF8, + 0x07, 0xF0, 0x3F, 0x8F, 0x80, 0xFC, 0x00, 0xF8, 0xF8, 0x0F, 0x80, 0x07, + 0xCF, 0x81, 0xF0, 0x00, 0x3E, 0xF8, 0x1E, 0x00, 0x03, 0xEF, 0x83, 0xE0, + 0x00, 0x1E, 0xF8, 0x3C, 0x00, 0x01, 0xFF, 0x83, 0xC0, 0x00, 0x1F, 0xF8, + 0x3C, 0x00, 0x00, 0xFF, 0x87, 0xC0, 0x00, 0x0F, 0xF8, 0x7C, 0x00, 0x00, + 0xFF, 0x87, 0xC0, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x00, 0xFF, 0xFF, 0xC0, + 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xF8, + 0x7C, 0x00, 0x00, 0xFF, 0x87, 0xC0, 0x00, 0x0F, 0xF8, 0x3C, 0x00, 0x01, + 0xFF, 0x83, 0xC0, 0x00, 0x1F, 0xF8, 0x3E, 0x00, 0x01, 0xEF, 0x83, 0xE0, + 0x00, 0x3E, 0xF8, 0x1F, 0x00, 0x03, 0xEF, 0x81, 0xF8, 0x00, 0x7C, 0xF8, + 0x0F, 0xC0, 0x0F, 0xCF, 0x80, 0x7F, 0x03, 0xF8, 0xF8, 0x03, 0xFF, 0xFF, + 0x0F, 0x80, 0x1F, 0xFF, 0xE0, 0xF8, 0x00, 0xFF, 0xF8, 0x0F, 0x80, 0x01, + 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0x03, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0x0F, + 0xFF, 0xFF, 0x1F, 0xC0, 0x1F, 0x3F, 0x00, 0x1F, 0x3E, 0x00, 0x1F, 0x3C, + 0x00, 0x1F, 0x7C, 0x00, 0x1F, 0x7C, 0x00, 0x1F, 0x7C, 0x00, 0x1F, 0x7C, + 0x00, 0x1F, 0x3C, 0x00, 0x1F, 0x3C, 0x00, 0x1F, 0x3E, 0x00, 0x1F, 0x1F, + 0x00, 0x1F, 0x1F, 0xC0, 0x1F, 0x0F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0x01, + 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0x01, 0xE0, 0x1F, 0x03, 0xE0, 0x1F, 0x03, + 0xC0, 0x1F, 0x07, 0xC0, 0x1F, 0x07, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x0F, + 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1E, 0x00, 0x1F, 0x3E, 0x00, 0x1F, 0x7C, + 0x00, 0x1F, 0x7C, 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0x03, 0xFC, 0x00, 0xFF, + 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7E, 0x07, 0xE7, 0x80, 0x3E, 0xF8, + 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x03, 0xFF, 0xE0, + 0xFF, 0xFE, 0x3F, 0xFF, 0xE7, 0xFF, 0xFE, 0xFE, 0x01, 0xEF, 0x80, 0x1E, + 0xF0, 0x01, 0xEF, 0x00, 0x1E, 0xF0, 0x01, 0xEF, 0x80, 0x3E, 0xFC, 0x0F, + 0xE7, 0xFF, 0xFE, 0x3F, 0xFF, 0xF1, 0xFF, 0x9F, 0x07, 0xE0, 0xF0, 0x00, + 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x03, 0xFC, 0x00, 0x7F, + 0xE0, 0x07, 0xFF, 0x00, 0x7F, 0xF0, 0x03, 0xF8, 0x00, 0x0F, 0x80, 0x00, + 0x78, 0x00, 0x03, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x7E, 0x01, 0xE7, + 0xFF, 0x07, 0x7F, 0xFE, 0x1F, 0xFF, 0xFC, 0x7F, 0x83, 0xFB, 0xF8, 0x03, + 0xEF, 0xC0, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0xFF, + 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x80, + 0x03, 0xDE, 0x00, 0x0F, 0x78, 0x00, 0x7D, 0xF0, 0x01, 0xE3, 0xE0, 0x0F, + 0x8F, 0xE0, 0xFC, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0x80, 0x7F, 0xF8, 0x00, + 0x3F, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xFC, 0x3F, 0xFF, 0xF1, 0xFF, 0xFF, + 0xCF, 0x00, 0x7E, 0x78, 0x00, 0xFB, 0xC0, 0x07, 0xDE, 0x00, 0x3E, 0xF0, + 0x01, 0xE7, 0x80, 0x3F, 0x3F, 0xFF, 0xF1, 0xFF, 0xFE, 0x0F, 0xFF, 0xF8, + 0x7F, 0xFF, 0xF3, 0xC0, 0x0F, 0xDE, 0x00, 0x1E, 0xF0, 0x00, 0xF7, 0x80, + 0x07, 0xFC, 0x00, 0x3D, 0xE0, 0x01, 0xEF, 0x00, 0x3F, 0x7F, 0xFF, 0xFB, + 0xFF, 0xFF, 0x9F, 0xFF, 0xF0, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, + 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, + 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, + 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0xFF, + 0xFF, 0x80, 0x3F, 0xFF, 0xE0, 0x0F, 0xFF, 0xF8, 0x03, 0xE0, 0x3E, 0x00, + 0xF8, 0x0F, 0x80, 0x3E, 0x03, 0xE0, 0x0F, 0x80, 0xF8, 0x03, 0xC0, 0x3E, + 0x00, 0xF0, 0x0F, 0x80, 0x3C, 0x03, 0xE0, 0x0F, 0x00, 0xF8, 0x03, 0xC0, + 0x3E, 0x00, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, + 0x80, 0x3E, 0x03, 0xE0, 0x0F, 0x80, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, + 0x3E, 0x00, 0x3E, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x7F, 0xC0, + 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x7F, + 0xC0, 0x00, 0x1F, 0x00, 0xFC, 0x00, 0x1F, 0xFC, 0x03, 0xFF, 0xF0, 0x3F, + 0xFF, 0xC3, 0xF0, 0x3F, 0x1F, 0x00, 0xF9, 0xF0, 0x03, 0xCF, 0x00, 0x0F, + 0x78, 0x00, 0x7F, 0xC0, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x1F, 0x00, 0x08, 0x7C, 0x00, 0xE3, 0xF8, 0x1F, 0x8F, 0xFF, + 0xF8, 0x3F, 0xFF, 0x80, 0xFF, 0xF8, 0x00, 0xFE, 0x00, 0x7E, 0x00, 0xF0, + 0x07, 0xE7, 0xC0, 0x1E, 0x01, 0xF8, 0x7C, 0x03, 0xC0, 0x3E, 0x07, 0xC0, + 0x78, 0x0F, 0x80, 0xF8, 0x0F, 0x03, 0xE0, 0x0F, 0x81, 0xE0, 0x7C, 0x00, + 0xF8, 0x3C, 0x1F, 0x00, 0x1F, 0x07, 0x83, 0xC0, 0x01, 0xF0, 0xF0, 0xF8, + 0x00, 0x1F, 0x1E, 0x3E, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x00, 0x3F, 0xFF, + 0xF0, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xE0, 0x00, 0x3E, + 0x3C, 0x7C, 0x00, 0x0F, 0x87, 0x87, 0xC0, 0x03, 0xE0, 0xF0, 0x7C, 0x00, + 0x7C, 0x1E, 0x0F, 0x80, 0x1F, 0x03, 0xC0, 0xF8, 0x07, 0xC0, 0x78, 0x1F, + 0x80, 0xF8, 0x0F, 0x01, 0xF0, 0x3E, 0x01, 0xE0, 0x1F, 0x0F, 0x80, 0x3C, + 0x03, 0xF3, 0xF0, 0x07, 0x80, 0x3E, 0xFC, 0x00, 0xF0, 0x03, 0xE0, 0x03, + 0xFC, 0x00, 0xFF, 0xF0, 0x3F, 0xFF, 0xC7, 0xFF, 0xFC, 0x7E, 0x07, 0xE7, + 0x80, 0x3E, 0xF8, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x7C, + 0x03, 0xFF, 0xC0, 0x3F, 0xF0, 0x03, 0xFF, 0x80, 0x3F, 0xFC, 0x00, 0x07, + 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xFF, 0x00, 0x1F, 0xF8, 0x01, 0xFF, 0x80, + 0x3E, 0x7E, 0x07, 0xE7, 0xFF, 0xFC, 0x3F, 0xFF, 0xC0, 0xFF, 0xF0, 0x03, + 0xFC, 0x00, 0xF0, 0x01, 0xFF, 0x00, 0x3F, 0xF0, 0x03, 0xFF, 0x00, 0x7F, + 0xF0, 0x0F, 0xFF, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x01, 0xFF, 0xF0, 0x3D, + 0xFF, 0x07, 0xDF, 0xF0, 0x79, 0xFF, 0x0F, 0x1F, 0xF1, 0xF1, 0xFF, 0x1E, + 0x1F, 0xF3, 0xC1, 0xFF, 0x3C, 0x1F, 0xF7, 0x81, 0xFF, 0xF8, 0x1F, 0xFF, + 0x01, 0xFF, 0xE0, 0x1F, 0xFE, 0x01, 0xFF, 0xC0, 0x1F, 0xF8, 0x01, 0xFF, + 0x80, 0x1F, 0xF0, 0x01, 0xF0, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1E, 0x0F, + 0x00, 0xFF, 0xE0, 0x07, 0xFC, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0xF0, 0x03, 0xFF, 0x00, 0x3F, 0xF0, + 0x07, 0xFF, 0x00, 0xFF, 0xF0, 0x0F, 0xFF, 0x01, 0xFF, 0xF0, 0x1F, 0xFF, + 0x03, 0xDF, 0xF0, 0x7D, 0xFF, 0x07, 0x9F, 0xF0, 0xF1, 0xFF, 0x1F, 0x1F, + 0xF1, 0xE1, 0xFF, 0x3C, 0x1F, 0xF3, 0xC1, 0xFF, 0x78, 0x1F, 0xFF, 0x81, + 0xFF, 0xF0, 0x1F, 0xFE, 0x01, 0xFF, 0xE0, 0x1F, 0xFC, 0x01, 0xFF, 0x80, + 0x1F, 0xF8, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xF7, 0x80, 0x1F, 0x3C, + 0x01, 0xF1, 0xE0, 0x1F, 0x0F, 0x01, 0xF0, 0x78, 0x1F, 0x03, 0xC0, 0xF8, + 0x1E, 0x0F, 0x80, 0xF0, 0xF8, 0x07, 0x8F, 0x80, 0x3F, 0xF8, 0x01, 0xFF, + 0x80, 0x0F, 0xFE, 0x00, 0x7F, 0xF8, 0x03, 0xC7, 0xE0, 0x1E, 0x1F, 0x00, + 0xF0, 0x7C, 0x07, 0x81, 0xF0, 0x3C, 0x0F, 0xC1, 0xE0, 0x3F, 0x0F, 0x00, + 0xF8, 0x78, 0x03, 0xE3, 0xC0, 0x0F, 0x9E, 0x00, 0x7E, 0xF0, 0x01, 0xF8, + 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0x03, + 0xC0, 0x3C, 0x1F, 0x00, 0xF0, 0x7C, 0x03, 0xC1, 0xF0, 0x0F, 0x07, 0xC0, + 0x3C, 0x1E, 0x00, 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x07, 0x80, 0x3C, + 0x1E, 0x00, 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x07, 0x80, 0x3C, 0x3E, + 0x00, 0xF0, 0xF8, 0x03, 0xC3, 0xC0, 0x0F, 0x3F, 0x00, 0x3F, 0xFC, 0x00, + 0xFF, 0xE0, 0x03, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0x3C, 0xF8, 0x00, 0x03, + 0xFF, 0x80, 0x00, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0x00, 0x07, 0xFF, 0xE0, + 0x00, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xF8, 0x00, 0xFF, + 0xF7, 0x80, 0x3D, 0xFE, 0xF0, 0x07, 0xBF, 0xCF, 0x01, 0xE7, 0xF9, 0xE0, + 0x3C, 0xFF, 0x1E, 0x0F, 0x9F, 0xE3, 0xC1, 0xE3, 0xFC, 0x78, 0x3C, 0x7F, + 0x87, 0x8F, 0x0F, 0xF0, 0xF1, 0xE1, 0xFE, 0x0F, 0x78, 0x3F, 0xC1, 0xEF, + 0x07, 0xF8, 0x1F, 0xC0, 0xFF, 0x03, 0xF8, 0x1F, 0xE0, 0x3F, 0x03, 0xFC, + 0x07, 0xC0, 0x7F, 0x80, 0xF8, 0x0F, 0xF0, 0x0E, 0x01, 0xE0, 0xF0, 0x01, + 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, + 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, + 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, + 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, + 0xF0, 0x00, 0xFE, 0x00, 0x07, 0xFF, 0x00, 0x3F, 0xFF, 0x80, 0xFF, 0xFF, + 0x83, 0xF8, 0x3F, 0x07, 0xC0, 0x1F, 0x1F, 0x00, 0x1F, 0x3E, 0x00, 0x3E, + 0x78, 0x00, 0x3D, 0xF0, 0x00, 0x7F, 0xE0, 0x00, 0xFF, 0x80, 0x00, 0xFF, + 0x00, 0x01, 0xFE, 0x00, 0x07, 0xFE, 0x00, 0x0F, 0xFC, 0x00, 0x1F, 0x78, + 0x00, 0x3C, 0xF8, 0x00, 0xF9, 0xF0, 0x01, 0xF1, 0xF0, 0x07, 0xC3, 0xF8, + 0x3F, 0x83, 0xFF, 0xFE, 0x03, 0xFF, 0xF8, 0x01, 0xFF, 0xC0, 0x00, 0xFE, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, + 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, + 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, + 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, + 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, + 0x1F, 0xF0, 0x01, 0xF0, 0xF0, 0xFC, 0x07, 0x9F, 0xF8, 0x3D, 0xFF, 0xF1, + 0xFF, 0xFF, 0xCF, 0xE0, 0x7E, 0x7E, 0x01, 0xFB, 0xE0, 0x07, 0xDE, 0x00, + 0x1E, 0xF0, 0x00, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0xFF, + 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x1F, 0xF0, 0x00, + 0xFF, 0x80, 0x07, 0xBE, 0x00, 0x7D, 0xF8, 0x07, 0xEF, 0xE0, 0x7E, 0x7F, + 0xFF, 0xF3, 0xDF, 0xFF, 0x1E, 0x7F, 0xF0, 0xF0, 0xFE, 0x07, 0x80, 0x00, + 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, + 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x00, + 0x00, 0xFE, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xF0, 0x3F, 0xFF, 0xC3, 0xF8, + 0x3F, 0x1F, 0x00, 0xF9, 0xF0, 0x03, 0xEF, 0x00, 0x0F, 0x78, 0x00, 0x7F, + 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, + 0x03, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x03, 0xDF, + 0x00, 0x1E, 0x7C, 0x01, 0xF3, 0xF8, 0x3F, 0x0F, 0xFF, 0xF0, 0x3F, 0xFF, + 0x00, 0xFF, 0xF0, 0x00, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, + 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, + 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, + 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, + 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, + 0xF8, 0x00, 0x7D, 0xF0, 0x01, 0xE7, 0xC0, 0x0F, 0x8F, 0x00, 0x3C, 0x3E, + 0x00, 0xF0, 0xF8, 0x07, 0xC1, 0xE0, 0x1E, 0x07, 0xC0, 0x78, 0x1F, 0x03, + 0xE0, 0x3C, 0x0F, 0x00, 0xF8, 0x3C, 0x01, 0xE1, 0xF0, 0x07, 0x87, 0x80, + 0x1F, 0x1E, 0x00, 0x3C, 0x78, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x07, + 0xB8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x00, 0xFC, 0x00, 0x03, 0xF0, + 0x00, 0x0F, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, + 0x07, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3E, + 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x3F, 0x7B, 0xF0, 0x01, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, + 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0x83, 0xF0, 0x78, 0x3F, 0x0F, 0x81, 0xE0, + 0x7C, 0x7C, 0x07, 0x80, 0xF9, 0xE0, 0x1E, 0x01, 0xE7, 0x80, 0x78, 0x07, + 0xBE, 0x01, 0xE0, 0x1E, 0xF8, 0x07, 0x80, 0x7F, 0xE0, 0x1E, 0x01, 0xFF, + 0x80, 0x78, 0x07, 0xFE, 0x01, 0xE0, 0x1F, 0xF8, 0x07, 0x80, 0x7F, 0xE0, + 0x1E, 0x01, 0xF7, 0x80, 0x78, 0x07, 0xDE, 0x01, 0xE0, 0x1E, 0x7C, 0x07, + 0x80, 0xF9, 0xF0, 0x1E, 0x07, 0xE3, 0xF0, 0x78, 0x3F, 0x0F, 0xFF, 0xFF, + 0xFC, 0x1F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0x00, 0x3F, 0x7B, 0xF0, + 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, + 0x80, 0x00, 0xF8, 0x00, 0xFB, 0xE0, 0x0F, 0x8F, 0x80, 0x78, 0x7C, 0x07, + 0xC1, 0xF0, 0x7C, 0x07, 0x83, 0xC0, 0x3E, 0x3E, 0x00, 0xF9, 0xE0, 0x03, + 0xDE, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, + 0x00, 0x7E, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0xC0, 0x03, 0xDF, 0x00, 0x3C, + 0x78, 0x03, 0xE3, 0xE0, 0x1E, 0x0F, 0x81, 0xF0, 0x3C, 0x1F, 0x01, 0xF0, + 0xF0, 0x07, 0xCF, 0x80, 0x3E, 0xF8, 0x00, 0xF8, 0xF0, 0x01, 0xF3, 0xC0, + 0x07, 0xCF, 0x00, 0x1F, 0x3C, 0x00, 0x7C, 0xF0, 0x01, 0xF3, 0xC0, 0x07, + 0xCF, 0x00, 0x1F, 0x3C, 0x00, 0x7C, 0xF0, 0x01, 0xF3, 0xC0, 0x07, 0xCF, + 0x00, 0x1F, 0x3C, 0x00, 0x7C, 0xF0, 0x01, 0xF3, 0xC0, 0x07, 0xCF, 0x00, + 0x1F, 0x3C, 0x00, 0x7C, 0xF0, 0x01, 0xF3, 0xC0, 0x07, 0xCF, 0x00, 0x1F, + 0x3C, 0x00, 0x7C, 0xF0, 0x01, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, + 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, + 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x1F, + 0xE0, 0x03, 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, + 0xC0, 0x07, 0xFC, 0x00, 0xF7, 0xE0, 0x3E, 0xFF, 0xFF, 0xCF, 0xFF, 0xF8, + 0xFF, 0xFF, 0x03, 0xFD, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, + 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, + 0xF0, 0x07, 0x80, 0x3F, 0xE0, 0x0F, 0x00, 0x7F, 0xC0, 0x1E, 0x00, 0xFF, + 0x80, 0x3C, 0x01, 0xFF, 0x00, 0x78, 0x03, 0xFE, 0x00, 0xF0, 0x07, 0xFC, + 0x01, 0xE0, 0x0F, 0xF8, 0x03, 0xC0, 0x1F, 0xF0, 0x07, 0x80, 0x3F, 0xE0, + 0x0F, 0x00, 0x7F, 0xC0, 0x1E, 0x00, 0xFF, 0x80, 0x3C, 0x01, 0xFF, 0x00, + 0x78, 0x03, 0xFE, 0x00, 0xF0, 0x07, 0xFC, 0x01, 0xE0, 0x0F, 0xF8, 0x03, + 0xC0, 0x1F, 0xF0, 0x07, 0x80, 0x3F, 0xE0, 0x0F, 0x00, 0x7F, 0xC0, 0x1E, + 0x00, 0xFF, 0x80, 0x3C, 0x01, 0xFF, 0x00, 0x78, 0x03, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0xF8, 0x03, 0xC0, 0x1E, 0x1F, 0x00, 0x78, 0x03, 0xC3, 0xE0, 0x0F, + 0x00, 0x78, 0x7C, 0x01, 0xE0, 0x0F, 0x0F, 0x80, 0x3C, 0x01, 0xE1, 0xF0, + 0x07, 0x80, 0x3C, 0x3E, 0x00, 0xF0, 0x07, 0x87, 0xC0, 0x1E, 0x00, 0xF0, + 0xF8, 0x03, 0xC0, 0x1E, 0x1F, 0x00, 0x78, 0x03, 0xC3, 0xE0, 0x0F, 0x00, + 0x78, 0x7C, 0x01, 0xE0, 0x0F, 0x0F, 0x80, 0x3C, 0x01, 0xE1, 0xF0, 0x07, + 0x80, 0x3C, 0x3E, 0x00, 0xF0, 0x07, 0x87, 0xC0, 0x1E, 0x00, 0xF0, 0xF8, + 0x03, 0xC0, 0x1E, 0x1F, 0x00, 0x78, 0x03, 0xC3, 0xE0, 0x0F, 0x00, 0x78, + 0x7C, 0x01, 0xE0, 0x0F, 0x0F, 0x80, 0x3C, 0x01, 0xE1, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x03, + 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xE0, 0x00, + 0x1F, 0xFC, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x0F, 0x00, 0x00, + 0x01, 0xE0, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0xFF, + 0xFF, 0xC0, 0x1F, 0xFF, 0xFC, 0x03, 0xC0, 0x1F, 0x80, 0x78, 0x00, 0xF0, + 0x0F, 0x00, 0x1F, 0x01, 0xE0, 0x03, 0xE0, 0x3C, 0x00, 0x3C, 0x07, 0x80, + 0x0F, 0x80, 0xF0, 0x01, 0xE0, 0x1E, 0x00, 0xFC, 0x03, 0xFF, 0xFF, 0x00, + 0x7F, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xF8, 0x00, + 0x00, 0x7F, 0xC0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, + 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x01, 0xFF, + 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x7F, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, + 0xE0, 0x1F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFE, 0x07, 0xFC, 0x03, 0xF0, + 0x3F, 0xE0, 0x07, 0xC1, 0xFF, 0x00, 0x1E, 0x0F, 0xF8, 0x00, 0xF0, 0x7F, + 0xC0, 0x07, 0x83, 0xFE, 0x00, 0x3C, 0x1F, 0xF0, 0x03, 0xE0, 0xFF, 0x80, + 0x3E, 0x07, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xF0, + 0x0F, 0xFF, 0xFE, 0x00, 0x78, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, + 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, + 0x00, 0xF0, 0x00, 0x0F, 0xFF, 0xC0, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC, 0xFF, + 0xFF, 0xCF, 0x00, 0x7E, 0xF0, 0x03, 0xEF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, + 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1E, 0xF0, 0x07, 0xEF, 0xFF, 0xFC, + 0xFF, 0xFF, 0xCF, 0xFF, 0xF0, 0xFF, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x7F, + 0xF0, 0x07, 0xFF, 0xE0, 0x7F, 0xFF, 0x87, 0xE0, 0xFC, 0x3C, 0x01, 0xF3, + 0xE0, 0x07, 0xDE, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x7F, + 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x00, 0x03, 0xE0, + 0x00, 0x1E, 0xF0, 0x00, 0xF7, 0x80, 0x0F, 0xBE, 0x00, 0x7C, 0xF8, 0x07, + 0xC7, 0xE0, 0xFE, 0x1F, 0xFF, 0xE0, 0x7F, 0xFE, 0x01, 0xFF, 0xC0, 0x03, + 0xF8, 0x00, 0xF8, 0x00, 0x3F, 0x80, 0x7C, 0x00, 0x7F, 0xF8, 0x3E, 0x00, + 0xFF, 0xFE, 0x1F, 0x00, 0xFF, 0xFF, 0x8F, 0x80, 0x7E, 0x0F, 0xE7, 0xC0, + 0x7E, 0x01, 0xF3, 0xE0, 0x7E, 0x00, 0x7D, 0xF0, 0x3E, 0x00, 0x1E, 0xF8, + 0x1E, 0x00, 0x0F, 0xFC, 0x0F, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x01, 0xFF, + 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x3F, + 0xE0, 0x78, 0x00, 0x1F, 0xF0, 0x3C, 0x00, 0x0F, 0xF8, 0x1E, 0x00, 0x0F, + 0xFC, 0x0F, 0x80, 0x07, 0xBE, 0x03, 0xE0, 0x07, 0xDF, 0x01, 0xF0, 0x07, + 0xEF, 0x80, 0x7E, 0x07, 0xE7, 0xC0, 0x1F, 0xFF, 0xE3, 0xE0, 0x07, 0xFF, + 0xE1, 0xF0, 0x01, 0xFF, 0xE0, 0xF8, 0x00, 0x3F, 0x80, 0x00, 0x01, 0xFF, + 0xF8, 0x3F, 0xFF, 0xC3, 0xFF, 0xFE, 0x3F, 0xFF, 0xF3, 0xF0, 0x07, 0x9F, + 0x00, 0x3C, 0xF0, 0x01, 0xEF, 0x80, 0x0F, 0x7C, 0x00, 0x79, 0xE0, 0x03, + 0xCF, 0x80, 0x1E, 0x7E, 0x00, 0xF1, 0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x1F, + 0xFF, 0xE0, 0x7F, 0xFF, 0x03, 0xC0, 0x78, 0x3E, 0x03, 0xC3, 0xE0, 0x1E, + 0x1E, 0x00, 0xF1, 0xF0, 0x07, 0x9F, 0x00, 0x3C, 0xF0, 0x01, 0xEF, 0x80, + 0x0F, 0xF8, 0x00, 0x78 }; + +const GFXglyph Roboto_Regular24pt8bRUSGlyphs[] PROGMEM = { + { 0, 21, 43, 27, 4, -42 }, // 0x400 + { 113, 21, 42, 27, 4, -41 }, // 0x401 + { 224, 32, 34, 35, 1, -33 }, // 0x402 + { 360, 21, 43, 26, 4, -42 }, // 0x403 + { 473, 26, 34, 32, 3, -33 }, // 0x404 + { 584, 24, 34, 28, 2, -33 }, // 0x405 + { 686, 5, 34, 13, 4, -33 }, // 0x406 + { 708, 15, 42, 13, -1, -41 }, // 0x407 + { 787, 21, 34, 26, 1, -33 }, // 0x408 + { 877, 47, 34, 50, 1, -33 }, // 0x409 + { 1077, 45, 34, 51, 4, -33 }, // 0x40A + { 1269, 33, 34, 38, 1, -33 }, // 0x40B + { 1410, 25, 43, 29, 4, -42 }, // 0x40C + { 1545, 25, 43, 34, 4, -42 }, // 0x40D + { 1680, 26, 41, 30, 2, -40 }, // 0x40E + { 1814, 25, 42, 34, 4, -33 }, // 0x40F + { 1946, 29, 34, 31, 1, -33 }, // 0x410 + { 2070, 24, 34, 30, 4, -33 }, // 0x411 + { 2172, 23, 34, 29, 4, -33 }, // 0x412 + { 2270, 21, 34, 26, 4, -33 }, // 0x413 + { 2360, 33, 42, 35, 1, -33 }, // 0x414 + { 2534, 21, 34, 27, 4, -33 }, // 0x415 + { 2624, 41, 34, 43, 1, -33 }, // 0x416 + { 2799, 24, 34, 28, 2, -33 }, // 0x417 + { 2901, 25, 34, 34, 4, -33 }, // 0x418 + { 3008, 25, 41, 34, 4, -40 }, // 0x419 + { 3137, 26, 34, 30, 4, -33 }, // 0x41A + { 3248, 28, 34, 33, 1, -33 }, // 0x41B + { 3367, 33, 34, 41, 4, -33 }, // 0x41C + { 3508, 26, 34, 34, 4, -33 }, // 0x41D + { 3619, 27, 34, 32, 3, -33 }, // 0x41E + { 3734, 25, 34, 34, 4, -33 }, // 0x41F + { 3841, 24, 34, 30, 4, -33 }, // 0x420 + { 3943, 25, 34, 31, 3, -33 }, // 0x421 + { 4050, 26, 34, 28, 1, -33 }, // 0x422 + { 4161, 26, 34, 30, 2, -33 }, // 0x423 + { 4272, 32, 36, 36, 2, -34 }, // 0x424 + { 4416, 27, 34, 29, 1, -33 }, // 0x425 + { 4531, 29, 42, 34, 4, -33 }, // 0x426 + { 4684, 25, 34, 32, 3, -33 }, // 0x427 + { 4791, 36, 34, 44, 4, -33 }, // 0x428 + { 4944, 40, 42, 46, 4, -33 }, // 0x429 + { 5154, 33, 34, 36, 1, -33 }, // 0x42A + { 5295, 33, 34, 41, 4, -33 }, // 0x42B + { 5436, 24, 34, 29, 3, -33 }, // 0x42C + { 5538, 25, 34, 32, 4, -33 }, // 0x42D + { 5645, 36, 34, 42, 4, -33 }, // 0x42E + { 5798, 24, 34, 30, 2, -33 }, // 0x42F + { 5900, 20, 25, 26, 3, -24 }, // 0x430 + { 5963, 22, 36, 26, 2, -35 }, // 0x431 + { 6062, 21, 25, 27, 4, -24 }, // 0x432 + { 6128, 15, 25, 20, 4, -24 }, // 0x433 + { 6175, 26, 32, 28, 1, -24 }, // 0x434 + { 6279, 21, 25, 25, 2, -24 }, // 0x435 + { 6345, 35, 25, 36, 0, -24 }, // 0x436 + { 6455, 20, 25, 24, 2, -24 }, // 0x437 + { 6518, 20, 25, 27, 4, -24 }, // 0x438 + { 6581, 20, 34, 27, 4, -33 }, // 0x439 + { 6666, 21, 25, 25, 4, -24 }, // 0x43A + { 6732, 22, 25, 27, 1, -24 }, // 0x43B + { 6801, 27, 25, 35, 4, -24 }, // 0x43C + { 6886, 20, 25, 27, 4, -24 }, // 0x43D + { 6949, 23, 25, 27, 2, -24 }, // 0x43E + { 7021, 20, 25, 27, 4, -24 }, // 0x43F + { 7084, 21, 35, 26, 3, -24 }, // 0x440 + { 7176, 21, 25, 25, 2, -24 }, // 0x441 + { 7242, 21, 25, 23, 1, -24 }, // 0x442 + { 7308, 22, 35, 22, 0, -24 }, // 0x443 + { 7405, 30, 45, 34, 2, -34 }, // 0x444 + { 7574, 21, 25, 23, 1, -24 }, // 0x445 + { 7640, 22, 32, 28, 4, -24 }, // 0x446 + { 7728, 19, 25, 26, 3, -24 }, // 0x447 + { 7788, 31, 25, 38, 4, -24 }, // 0x448 + { 7885, 35, 32, 39, 3, -24 }, // 0x449 + { 8025, 27, 25, 29, 1, -24 }, // 0x44A + { 8110, 29, 25, 36, 3, -24 }, // 0x44B + { 8201, 20, 25, 26, 4, -24 }, // 0x44C + { 8264, 21, 25, 25, 2, -24 }, // 0x44D + { 8330, 33, 25, 38, 3, -24 }, // 0x44E + { 8434, 21, 25, 26, 1, -24 } }; // 0x44F + +const GFXfont Roboto_Regular24pt8bRUS PROGMEM = { + (uint8_t *)Roboto_Regular24pt8bRUSBitmaps, + (GFXglyph *)Roboto_Regular24pt8bRUSGlyphs, + 0x400, 0x44F, 55 }; + +// Approx. 9067 bytes diff --git a/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.24pt.h b/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.24pt.h new file mode 100644 index 0000000..8d4ccbf --- /dev/null +++ b/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.24pt.h @@ -0,0 +1,714 @@ +const uint8_t Roboto_Regular24pt7bBitmaps[] PROGMEM = { + 0xF7, 0xBD, 0xEF, 0x7B, 0xDE, 0xF7, 0xBD, 0xEF, 0x7B, 0xDE, 0xF7, 0xBD, + 0xEF, 0x7B, 0xDE, 0x00, 0x00, 0x00, 0x3B, 0xFF, 0xFB, 0x80, 0xE3, 0xF8, + 0xFE, 0x3F, 0x8F, 0xE3, 0xB8, 0xEE, 0x3B, 0x8E, 0xE3, 0xB8, 0xEE, 0x38, + 0x00, 0x38, 0x1E, 0x00, 0x1C, 0x0E, 0x00, 0x1E, 0x07, 0x00, 0x0F, 0x03, + 0x80, 0x07, 0x03, 0xC0, 0x03, 0x81, 0xE0, 0x01, 0xC0, 0xE0, 0x01, 0xE0, + 0x70, 0x00, 0xF0, 0x38, 0x00, 0x70, 0x3C, 0x1F, 0xFF, 0xFF, 0xEF, 0xFF, + 0xFF, 0xF7, 0xFF, 0xFF, 0xF8, 0x0F, 0x03, 0x80, 0x07, 0x03, 0xC0, 0x03, + 0x81, 0xE0, 0x01, 0xC0, 0xE0, 0x01, 0xE0, 0x70, 0x00, 0xF0, 0x38, 0x00, + 0x70, 0x3C, 0x00, 0x38, 0x1E, 0x07, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFD, + 0xFF, 0xFF, 0xFE, 0x07, 0x03, 0xC0, 0x03, 0x81, 0xE0, 0x01, 0xC0, 0xE0, + 0x00, 0xE0, 0x70, 0x00, 0xF0, 0x38, 0x00, 0x70, 0x1C, 0x00, 0x38, 0x1E, + 0x00, 0x1C, 0x0F, 0x00, 0x0E, 0x07, 0x00, 0x0F, 0x03, 0x80, 0x00, 0x00, + 0x70, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, + 0x00, 0xFE, 0x00, 0x1F, 0xFE, 0x03, 0xFF, 0xF8, 0x3F, 0xFF, 0xE1, 0xF8, + 0x3F, 0x1F, 0x00, 0x7C, 0xF8, 0x03, 0xE7, 0x80, 0x0F, 0x3C, 0x00, 0x79, + 0xE0, 0x03, 0xEF, 0x00, 0x1F, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xC0, + 0x00, 0x3F, 0x80, 0x01, 0xFF, 0x80, 0x03, 0xFF, 0x00, 0x0F, 0xFE, 0x00, + 0x0F, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x01, + 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x1F, 0xF8, + 0x00, 0xFF, 0xE0, 0x0F, 0x9F, 0x81, 0xFC, 0x7F, 0xFF, 0xC3, 0xFF, 0xFC, + 0x07, 0xFF, 0xC0, 0x0F, 0xF8, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x03, + 0x80, 0x00, 0x1C, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x03, + 0xFF, 0x80, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x70, 0x3C, 0x02, 0x01, 0xC0, + 0x70, 0x1E, 0x0F, 0x01, 0xC0, 0x70, 0x3C, 0x07, 0x03, 0x80, 0xF0, 0x1C, + 0x1E, 0x03, 0xC0, 0x70, 0x70, 0x07, 0x01, 0xC3, 0x80, 0x1C, 0x0F, 0x1E, + 0x00, 0x78, 0x78, 0x70, 0x00, 0xFF, 0xE3, 0x80, 0x01, 0xFF, 0x1E, 0x00, + 0x01, 0xF0, 0x70, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x0E, 0x00, 0x00, + 0x00, 0x70, 0x7C, 0x00, 0x03, 0xC7, 0xFC, 0x00, 0x0E, 0x3F, 0xF8, 0x00, + 0x71, 0xF1, 0xF0, 0x03, 0xC7, 0x83, 0xC0, 0x0E, 0x1C, 0x07, 0x00, 0x70, + 0x70, 0x1C, 0x03, 0xC1, 0xC0, 0x70, 0x0E, 0x07, 0x01, 0xC0, 0x78, 0x1C, + 0x07, 0x03, 0xC0, 0x70, 0x1C, 0x0E, 0x01, 0xE0, 0xF0, 0x18, 0x07, 0xC7, + 0xC0, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xFF, 0x00, 0x07, 0xFF, + 0xE0, 0x00, 0xF8, 0x3E, 0x00, 0x3E, 0x03, 0xC0, 0x07, 0xC0, 0x78, 0x00, + 0xF0, 0x0F, 0x00, 0x1E, 0x01, 0xE0, 0x03, 0xE0, 0x3C, 0x00, 0x7C, 0x0F, + 0x00, 0x07, 0xC3, 0xE0, 0x00, 0xF9, 0xF8, 0x00, 0x0F, 0xFE, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFF, 0x80, + 0x00, 0x7F, 0xF0, 0x1E, 0x1F, 0x9F, 0x03, 0xC7, 0xC1, 0xF0, 0x78, 0xF8, + 0x1F, 0x0F, 0x1E, 0x01, 0xF1, 0xE7, 0xC0, 0x1F, 0x78, 0xF8, 0x01, 0xEF, + 0x1F, 0x00, 0x3F, 0xE3, 0xE0, 0x03, 0xF8, 0x3C, 0x00, 0x3F, 0x07, 0xC0, + 0x0F, 0xE0, 0x7E, 0x07, 0xFE, 0x0F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0x7C, + 0x07, 0xFF, 0x87, 0xC0, 0x3F, 0xC0, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, + 0xE0, 0x00, 0x20, 0x07, 0x00, 0xF0, 0x1E, 0x03, 0xC0, 0x3C, 0x07, 0x80, + 0xF0, 0x0F, 0x01, 0xE0, 0x1E, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x78, 0x07, + 0x80, 0x78, 0x07, 0x80, 0xF8, 0x0F, 0x80, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x80, 0xF8, 0x07, + 0x80, 0x78, 0x07, 0x80, 0x78, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x1E, 0x01, + 0xE0, 0x0F, 0x00, 0xF0, 0x07, 0x80, 0x38, 0x03, 0xC0, 0x1E, 0x00, 0xF0, + 0x07, 0x00, 0x20, 0x40, 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x03, 0xC0, + 0x1E, 0x00, 0xF0, 0x0F, 0x00, 0x78, 0x07, 0x80, 0x3C, 0x03, 0xC0, 0x3C, + 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x1E, 0x01, 0xF0, 0x1F, 0x00, 0xF0, 0x0F, + 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x1F, + 0x01, 0xF0, 0x1E, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x3C, 0x03, 0xC0, 0x3C, + 0x07, 0x80, 0x78, 0x0F, 0x00, 0xF0, 0x1E, 0x01, 0xC0, 0x3C, 0x07, 0x80, + 0xF0, 0x0E, 0x00, 0x40, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, + 0x00, 0x70, 0x00, 0x0E, 0x00, 0x81, 0xC0, 0xBC, 0x38, 0xF7, 0xF7, 0xFE, + 0xFF, 0xFF, 0xE3, 0xFF, 0xC0, 0x07, 0xC0, 0x01, 0xF8, 0x00, 0x7F, 0x80, + 0x1E, 0x78, 0x03, 0xCF, 0x00, 0xF0, 0xF0, 0x3C, 0x0F, 0x03, 0x81, 0xC0, + 0x20, 0x10, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, + 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1E, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, + 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0x78, 0x00, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xDE, 0x7B, 0xCF, 0x18, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7B, 0xEF, 0xFE, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03, 0xC0, + 0x00, 0xF0, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03, 0xC0, 0x00, + 0xF0, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x00, 0xF0, + 0x00, 0x38, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xC0, 0x00, 0xF0, 0x00, + 0x3C, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xC0, 0x00, 0xF0, 0x00, 0x3C, + 0x00, 0x0E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, + 0x0E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x00, 0x01, 0xFC, + 0x00, 0x7F, 0xF8, 0x07, 0xFF, 0xE0, 0x7F, 0xFF, 0x83, 0xF0, 0x7E, 0x3E, + 0x01, 0xF1, 0xE0, 0x07, 0xDF, 0x00, 0x1E, 0xF0, 0x00, 0xF7, 0x80, 0x07, + 0xBC, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xC0, + 0x03, 0xFE, 0x00, 0x1F, 0xF0, 0x00, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0x3F, + 0xE0, 0x01, 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, + 0x1E, 0xF0, 0x00, 0xF7, 0xC0, 0x07, 0xBE, 0x00, 0x7C, 0xF0, 0x03, 0xE7, + 0xC0, 0x3E, 0x1F, 0x83, 0xF0, 0xFF, 0xFF, 0x03, 0xFF, 0xF0, 0x0F, 0xFF, + 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x18, 0x07, 0xC0, 0xFE, 0x1F, 0xF7, 0xFF, + 0xFF, 0xFF, 0xF3, 0xFE, 0x1F, 0x80, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, + 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, + 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, + 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, + 0x01, 0xFE, 0x00, 0x0F, 0xFF, 0x00, 0x7F, 0xFF, 0x01, 0xFF, 0xFF, 0x03, + 0xF0, 0x3F, 0x0F, 0x80, 0x3F, 0x1E, 0x00, 0x3E, 0x7C, 0x00, 0x7C, 0xF8, + 0x00, 0x79, 0xE0, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, + 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xF0, 0x00, 0x07, + 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, + 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, 0x00, + 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x07, + 0x80, 0x00, 0x1F, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, 0xFF, + 0xFF, 0xFC, 0x01, 0xFC, 0x00, 0x3F, 0xFC, 0x07, 0xFF, 0xF0, 0x7F, 0xFF, + 0xC3, 0xF0, 0x3F, 0x3E, 0x00, 0xF9, 0xE0, 0x03, 0xCF, 0x00, 0x1F, 0xF8, + 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, + 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x80, 0x3F, 0xF8, 0x01, 0xFF, 0x00, 0x0F, + 0xFC, 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0x7C, + 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x7F, 0x80, 0x03, 0xFE, 0x00, + 0x1E, 0xF0, 0x01, 0xF7, 0xC0, 0x0F, 0xBF, 0x81, 0xF8, 0xFF, 0xFF, 0x83, + 0xFF, 0xF8, 0x07, 0xFF, 0x80, 0x0F, 0xE0, 0x00, 0x00, 0x01, 0xF0, 0x00, + 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xF0, 0x00, + 0x0F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x3D, 0xF0, 0x00, + 0x79, 0xF0, 0x00, 0x79, 0xF0, 0x00, 0xF1, 0xF0, 0x01, 0xE1, 0xF0, 0x01, + 0xE1, 0xF0, 0x03, 0xC1, 0xF0, 0x03, 0xC1, 0xF0, 0x07, 0x81, 0xF0, 0x0F, + 0x01, 0xF0, 0x0F, 0x01, 0xF0, 0x1E, 0x01, 0xF0, 0x3E, 0x01, 0xF0, 0x3C, + 0x01, 0xF0, 0x78, 0x01, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x3F, 0xFF, 0xF1, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0x7F, 0xFF, + 0xE3, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, + 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x9F, 0xC0, + 0x3F, 0xFF, 0x81, 0xFF, 0xFE, 0x0F, 0xFF, 0xF8, 0x7E, 0x0F, 0xE1, 0xC0, + 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF7, 0x80, 0x07, 0xBC, 0x00, + 0x3D, 0xE0, 0x03, 0xEF, 0x80, 0x3E, 0x3F, 0x03, 0xF0, 0xFF, 0xFF, 0x03, + 0xFF, 0xF0, 0x0F, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x07, + 0xF8, 0x00, 0x7F, 0xC0, 0x0F, 0xFE, 0x00, 0xFF, 0x00, 0x07, 0xE0, 0x00, + 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0xE0, 0x00, 0x1E, 0x00, + 0x00, 0xF0, 0x00, 0x07, 0x8F, 0xE0, 0x7D, 0xFF, 0xC3, 0xDF, 0xFF, 0x1F, + 0xFF, 0xFC, 0xFF, 0x07, 0xF7, 0xE0, 0x0F, 0xBE, 0x00, 0x3D, 0xF0, 0x01, + 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x0F, 0xF8, + 0x00, 0x7B, 0xC0, 0x03, 0xDE, 0x00, 0x3E, 0xF8, 0x01, 0xE3, 0xE0, 0x1F, + 0x1F, 0x83, 0xF0, 0x7F, 0xFF, 0x81, 0xFF, 0xF8, 0x07, 0xFF, 0x80, 0x0F, + 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x3C, + 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, + 0x03, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x0F, + 0x00, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, + 0x00, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF8, 0x00, 0x03, + 0xC0, 0x00, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x80, + 0x00, 0x3C, 0x00, 0x01, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3E, 0x00, 0x00, + 0x01, 0xFC, 0x00, 0x7F, 0xF8, 0x07, 0xFF, 0xE0, 0x7F, 0xFF, 0x87, 0xF0, + 0x7E, 0x3E, 0x01, 0xF1, 0xE0, 0x07, 0xDF, 0x00, 0x3E, 0xF8, 0x00, 0xF7, + 0xC0, 0x07, 0xBE, 0x00, 0x3C, 0xF0, 0x03, 0xE7, 0x80, 0x1E, 0x3E, 0x01, + 0xF0, 0xFC, 0x1F, 0x03, 0xFF, 0xF0, 0x0F, 0xFF, 0x00, 0x7F, 0xF8, 0x07, + 0xFF, 0xF0, 0x7C, 0x0F, 0xC7, 0xC0, 0x1F, 0x7C, 0x00, 0x7B, 0xC0, 0x03, + 0xDE, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0x80, 0x07, 0xFC, 0x00, 0x3F, 0xF0, + 0x01, 0xFF, 0x80, 0x1F, 0x3F, 0x03, 0xF9, 0xFF, 0xFF, 0x87, 0xFF, 0xF8, + 0x0F, 0xFF, 0x80, 0x1F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x3F, 0xF8, 0x03, + 0xFF, 0xE0, 0x3F, 0xFF, 0x83, 0xF0, 0x7E, 0x1F, 0x01, 0xF9, 0xF0, 0x07, + 0xCF, 0x00, 0x1E, 0x78, 0x00, 0xFF, 0xC0, 0x03, 0xFE, 0x00, 0x1F, 0xE0, + 0x00, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0x3D, 0xE0, 0x01, 0xEF, 0x00, 0x0F, + 0x7C, 0x00, 0xFB, 0xF0, 0x0F, 0xCF, 0xC1, 0xFE, 0x3F, 0xFF, 0xF1, 0xFF, + 0xF7, 0x83, 0xFF, 0x3C, 0x07, 0xE1, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xF0, + 0x00, 0x0F, 0x80, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, 0xFC, 0x00, 0x1F, + 0xC0, 0x1F, 0xFC, 0x00, 0xFF, 0xC0, 0x07, 0xF8, 0x00, 0x3E, 0x00, 0x00, + 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x7F, 0xFF, 0x70, 0x3C, 0x7C, 0xF9, 0xF3, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC7, 0x8F, + 0x1E, 0x3C, 0x78, 0xF3, 0xE7, 0x9E, 0x3C, 0x10, 0x00, 0x00, 0x40, 0x00, + 0x70, 0x00, 0x7C, 0x00, 0x7F, 0x00, 0x7F, 0xC0, 0x7F, 0xC0, 0x7F, 0xC0, + 0xFF, 0x80, 0xFF, 0x80, 0x3F, 0x80, 0x0F, 0x00, 0x03, 0xF0, 0x00, 0xFF, + 0x80, 0x0F, 0xF8, 0x00, 0x7F, 0xC0, 0x07, 0xFC, 0x00, 0x7F, 0xC0, 0x07, + 0xF0, 0x00, 0x7C, 0x00, 0x07, 0x00, 0x00, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x0E, 0x00, 0x00, + 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0xC0, 0x01, 0xFF, 0x00, 0x07, 0xFE, + 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0x7F, 0x00, 0x01, 0xF0, 0x00, + 0x7F, 0x00, 0x3F, 0xE0, 0x0F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x00, 0xFF, + 0xC0, 0x0F, 0xF0, 0x00, 0xFC, 0x00, 0x0E, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x03, 0xF8, 0x07, 0xFF, 0x83, 0xFF, 0xF1, 0xFF, 0xFE, 0x7E, 0x0F, 0xBE, + 0x01, 0xFF, 0x00, 0x3F, 0xC0, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, + 0x3C, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, + 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x01, 0xE0, 0x00, + 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x3E, 0x00, 0x0F, 0x80, + 0x03, 0xE0, 0x00, 0x70, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x1F, + 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0xC0, 0x00, 0x1F, 0xC0, 0x1F, 0x80, + 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x00, 0x1E, 0x00, 0x3C, 0x00, + 0x00, 0x1C, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x07, 0x00, 0x00, 0x00, 0xE0, + 0x3C, 0x00, 0x00, 0x01, 0xC1, 0xE0, 0x03, 0xF0, 0x07, 0x07, 0x80, 0x3F, + 0xF0, 0x0E, 0x1C, 0x01, 0xFF, 0xE0, 0x38, 0xF0, 0x0F, 0x87, 0x80, 0xE3, + 0x80, 0x7C, 0x0E, 0x01, 0x8E, 0x01, 0xE0, 0x38, 0x07, 0x78, 0x0F, 0x01, + 0xE0, 0x1D, 0xE0, 0x3C, 0x07, 0x80, 0x77, 0x00, 0xE0, 0x1E, 0x01, 0xDC, + 0x07, 0x80, 0x78, 0x07, 0x70, 0x1E, 0x01, 0xE0, 0x1D, 0xC0, 0x78, 0x07, + 0x00, 0x77, 0x01, 0xC0, 0x1C, 0x01, 0xDC, 0x07, 0x00, 0x70, 0x07, 0x70, + 0x1C, 0x01, 0xC0, 0x19, 0xC0, 0x70, 0x07, 0x00, 0xE7, 0x01, 0xC0, 0x3C, + 0x03, 0x9C, 0x07, 0x80, 0xF0, 0x1C, 0x70, 0x1E, 0x07, 0xC0, 0x71, 0xE0, + 0x7C, 0x3F, 0x83, 0x83, 0x80, 0xFF, 0xCF, 0xBE, 0x0E, 0x01, 0xFE, 0x3F, + 0xE0, 0x3C, 0x03, 0xE0, 0x3F, 0x00, 0x70, 0x00, 0x00, 0x00, 0x01, 0xE0, + 0x00, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x04, 0x00, 0x00, 0x7F, + 0x00, 0x78, 0x00, 0x00, 0x7F, 0xFF, 0xE0, 0x00, 0x00, 0x7F, 0xFF, 0x00, + 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00, + 0x00, 0x1F, 0xF0, 0x00, 0x00, 0xF7, 0x80, 0x00, 0x07, 0xBC, 0x00, 0x00, + 0x78, 0xF0, 0x00, 0x03, 0xC7, 0x80, 0x00, 0x1E, 0x3C, 0x00, 0x01, 0xE0, + 0xF0, 0x00, 0x0F, 0x07, 0x80, 0x00, 0xF8, 0x3E, 0x00, 0x07, 0x80, 0xF0, + 0x00, 0x3C, 0x07, 0x80, 0x03, 0xC0, 0x1E, 0x00, 0x1E, 0x00, 0xF0, 0x00, + 0xF0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x78, 0x00, 0xF0, 0x07, 0xFF, + 0xFF, 0xC0, 0x3F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, + 0xC0, 0xF0, 0x00, 0x1E, 0x07, 0x80, 0x00, 0xF0, 0x7C, 0x00, 0x07, 0xC3, + 0xC0, 0x00, 0x1E, 0x3E, 0x00, 0x00, 0xF9, 0xF0, 0x00, 0x07, 0xCF, 0x00, + 0x00, 0x1E, 0xF8, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xC0, 0xFF, 0xFE, + 0x01, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0x8F, 0x00, 0x3F, + 0x9E, 0x00, 0x1F, 0x3C, 0x00, 0x1E, 0x78, 0x00, 0x3E, 0xF0, 0x00, 0x7D, + 0xE0, 0x00, 0xFB, 0xC0, 0x01, 0xF7, 0x80, 0x03, 0xCF, 0x00, 0x0F, 0x9E, + 0x00, 0x7E, 0x3F, 0xFF, 0xF8, 0x7F, 0xFF, 0xC0, 0xFF, 0xFF, 0xC1, 0xFF, + 0xFF, 0xE3, 0xC0, 0x07, 0xE7, 0x80, 0x03, 0xCF, 0x00, 0x07, 0xDE, 0x00, + 0x07, 0xBC, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xE0, 0x00, + 0x7F, 0xC0, 0x00, 0xF7, 0x80, 0x03, 0xEF, 0x00, 0x0F, 0xDE, 0x00, 0x3F, + 0x3F, 0xFF, 0xFE, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xC1, 0xFF, 0xFC, 0x00, + 0x00, 0x7F, 0x80, 0x00, 0xFF, 0xF8, 0x01, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, + 0x81, 0xFC, 0x0F, 0xE1, 0xF8, 0x01, 0xF8, 0xF8, 0x00, 0x7C, 0xF8, 0x00, + 0x1F, 0x7C, 0x00, 0x0F, 0xBC, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFF, 0x00, + 0x00, 0x0F, 0x00, 0x00, 0x07, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x01, + 0xF0, 0x00, 0x0F, 0x78, 0x00, 0x07, 0xBE, 0x00, 0x07, 0xDF, 0x00, 0x03, + 0xE7, 0xC0, 0x03, 0xE3, 0xF0, 0x03, 0xF0, 0xFE, 0x07, 0xF0, 0x3F, 0xFF, + 0xF0, 0x0F, 0xFF, 0xF0, 0x01, 0xFF, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, + 0xF8, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0xF0, + 0x07, 0xF0, 0xF0, 0x01, 0xF8, 0xF0, 0x00, 0xFC, 0xF0, 0x00, 0x7C, 0xF0, + 0x00, 0x3E, 0xF0, 0x00, 0x3E, 0xF0, 0x00, 0x1E, 0xF0, 0x00, 0x1F, 0xF0, + 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, + 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, + 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x1E, 0xF0, + 0x00, 0x3E, 0xF0, 0x00, 0x3E, 0xF0, 0x00, 0x7C, 0xF0, 0x00, 0xFC, 0xF0, + 0x01, 0xF8, 0xF0, 0x07, 0xF0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xC0, 0xFF, + 0xFF, 0x00, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, + 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, + 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1F, 0xFF, 0xFC, 0xFF, + 0xFF, 0xE7, 0xFF, 0xFF, 0x3F, 0xFF, 0xF9, 0xE0, 0x00, 0x0F, 0x00, 0x00, + 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, + 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, + 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x1F, 0xFF, 0xF8, 0xFF, 0xFF, 0xC7, 0xFF, 0xFE, 0x3F, 0xFF, + 0xF1, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, + 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, + 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, + 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x7F, 0xFC, 0x00, + 0x7F, 0xFF, 0x80, 0x3F, 0xFF, 0xF0, 0x1F, 0xC0, 0xFE, 0x0F, 0xC0, 0x0F, + 0xC3, 0xE0, 0x01, 0xF1, 0xF0, 0x00, 0x3E, 0x7C, 0x00, 0x07, 0x9E, 0x00, + 0x01, 0xEF, 0x80, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0x3C, 0x01, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x1F, 0xFF, 0xF0, 0x07, + 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0x78, + 0x00, 0x07, 0xDF, 0x00, 0x01, 0xF7, 0xE0, 0x00, 0x7C, 0xF8, 0x00, 0x1F, + 0x1F, 0x80, 0x0F, 0xC7, 0xF8, 0x0F, 0xE0, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, + 0xF8, 0x01, 0xFF, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0xF0, 0x00, 0x07, 0xFC, + 0x00, 0x01, 0xFF, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x07, + 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x1F, 0xF0, 0x00, + 0x07, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x1F, 0xF0, + 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, + 0x1F, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x7F, 0xC0, + 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x7F, + 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, + 0x7F, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xF0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, + 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, + 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, + 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, + 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, + 0xF8, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, 0x3E, 0xF0, 0x01, 0xF7, 0xC0, + 0x1F, 0x3F, 0x83, 0xF8, 0xFF, 0xFF, 0x83, 0xFF, 0xF8, 0x0F, 0xFF, 0x80, + 0x0F, 0xE0, 0x00, 0xF0, 0x00, 0x1F, 0x78, 0x00, 0x1F, 0x3C, 0x00, 0x1F, + 0x1E, 0x00, 0x1F, 0x0F, 0x00, 0x1F, 0x87, 0x80, 0x1F, 0x83, 0xC0, 0x1F, + 0x81, 0xE0, 0x0F, 0x80, 0xF0, 0x0F, 0x80, 0x78, 0x0F, 0x80, 0x3C, 0x0F, + 0x80, 0x1E, 0x0F, 0x80, 0x0F, 0x0F, 0xC0, 0x07, 0x8F, 0xC0, 0x03, 0xCF, + 0xC0, 0x01, 0xEF, 0xE0, 0x00, 0xF7, 0xF0, 0x00, 0x7F, 0xFC, 0x00, 0x3F, + 0xDF, 0x00, 0x1F, 0xCF, 0xC0, 0x0F, 0xC3, 0xE0, 0x07, 0xC0, 0xF8, 0x03, + 0xC0, 0x3E, 0x01, 0xE0, 0x1F, 0x80, 0xF0, 0x07, 0xC0, 0x78, 0x01, 0xF0, + 0x3C, 0x00, 0x7C, 0x1E, 0x00, 0x3F, 0x0F, 0x00, 0x0F, 0x87, 0x80, 0x03, + 0xE3, 0xC0, 0x00, 0xF9, 0xE0, 0x00, 0x7E, 0xF0, 0x00, 0x1F, 0x78, 0x00, + 0x07, 0xC0, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, + 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, + 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, + 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, + 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, + 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, + 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x0F, 0xFF, + 0x80, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x03, 0xFF, + 0xF8, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x01, 0xFF, + 0xF7, 0x80, 0x00, 0xF7, 0xFB, 0xC0, 0x00, 0x7B, 0xFD, 0xF0, 0x00, 0x7D, + 0xFE, 0x78, 0x00, 0x3C, 0xFF, 0x3C, 0x00, 0x3E, 0x7F, 0x8F, 0x00, 0x1E, + 0x3F, 0xC7, 0x80, 0x0F, 0x1F, 0xE3, 0xE0, 0x0F, 0x8F, 0xF0, 0xF0, 0x07, + 0x87, 0xF8, 0x78, 0x03, 0xC3, 0xFC, 0x1E, 0x03, 0xC1, 0xFE, 0x0F, 0x01, + 0xE0, 0xFF, 0x07, 0xC1, 0xF0, 0x7F, 0x81, 0xE0, 0xF0, 0x3F, 0xC0, 0xF0, + 0x78, 0x1F, 0xE0, 0x3C, 0x78, 0x0F, 0xF0, 0x1E, 0x3C, 0x07, 0xF8, 0x0F, + 0xBE, 0x03, 0xFC, 0x03, 0xDE, 0x01, 0xFE, 0x01, 0xEF, 0x00, 0xFF, 0x00, + 0x7F, 0x00, 0x7F, 0x80, 0x3F, 0x80, 0x3F, 0xC0, 0x1F, 0xC0, 0x1F, 0xE0, + 0x07, 0xC0, 0x0F, 0xF0, 0x03, 0xE0, 0x07, 0xF8, 0x00, 0xE0, 0x03, 0xC0, + 0xF8, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x3F, 0xF8, 0x00, + 0x0F, 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, + 0x00, 0x0F, 0xFF, 0xC0, 0x03, 0xFE, 0xF8, 0x00, 0xFF, 0xBE, 0x00, 0x3F, + 0xE7, 0xC0, 0x0F, 0xF8, 0xF8, 0x03, 0xFE, 0x3E, 0x00, 0xFF, 0x87, 0xC0, + 0x3F, 0xE0, 0xF8, 0x0F, 0xF8, 0x3E, 0x03, 0xFE, 0x07, 0xC0, 0xFF, 0x80, + 0xF8, 0x3F, 0xE0, 0x3E, 0x0F, 0xF8, 0x07, 0xC3, 0xFE, 0x01, 0xF0, 0xFF, + 0x80, 0x3E, 0x3F, 0xE0, 0x07, 0xCF, 0xF8, 0x01, 0xF3, 0xFE, 0x00, 0x3E, + 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFE, 0x00, + 0x07, 0xFF, 0x80, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xF8, 0x00, 0x07, 0xFE, + 0x00, 0x01, 0xF0, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xFC, 0x00, 0x1F, 0xFF, + 0xE0, 0x07, 0xFF, 0xFE, 0x01, 0xFC, 0x0F, 0xE0, 0x3E, 0x00, 0x7E, 0x0F, + 0x80, 0x07, 0xC3, 0xE0, 0x00, 0x7C, 0x7C, 0x00, 0x07, 0x8F, 0x00, 0x00, + 0xFB, 0xE0, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0xEF, 0x00, 0x00, 0x3D, 0xE0, + 0x00, 0x07, 0xBC, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x03, + 0xFE, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x0F, 0xF8, 0x00, 0x01, 0xFF, 0x00, + 0x00, 0x3D, 0xE0, 0x00, 0x07, 0xBE, 0x00, 0x00, 0xF7, 0xC0, 0x00, 0x3E, + 0x78, 0x00, 0x07, 0xCF, 0x80, 0x00, 0xF1, 0xF0, 0x00, 0x3E, 0x1F, 0x00, + 0x0F, 0x83, 0xF0, 0x03, 0xF0, 0x3F, 0x81, 0xFC, 0x03, 0xFF, 0xFF, 0x00, + 0x3F, 0xFF, 0xC0, 0x01, 0xFF, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0xFF, + 0x00, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0xF0, 0x00, + 0xFC, 0xF0, 0x00, 0x7E, 0xF0, 0x00, 0x3E, 0xF0, 0x00, 0x1F, 0xF0, 0x00, + 0x1F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, + 0x1F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x3E, 0xF0, 0x00, + 0xFE, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, + 0x80, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xFE, 0x00, 0x0F, + 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0x00, 0xFE, 0x07, 0xF0, 0x3F, 0x00, 0x3E, + 0x07, 0xC0, 0x03, 0xE1, 0xF0, 0x00, 0x3E, 0x3C, 0x00, 0x07, 0xCF, 0x80, + 0x00, 0x79, 0xE0, 0x00, 0x0F, 0xBC, 0x00, 0x01, 0xF7, 0x80, 0x00, 0x1F, + 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x0F, 0xF8, 0x00, + 0x01, 0xFF, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xFF, + 0x80, 0x00, 0x1E, 0xF0, 0x00, 0x03, 0xDE, 0x00, 0x00, 0xFB, 0xC0, 0x00, + 0x1F, 0x7C, 0x00, 0x03, 0xC7, 0x80, 0x00, 0xF8, 0xF8, 0x00, 0x1F, 0x0F, + 0x80, 0x07, 0xC1, 0xF8, 0x01, 0xF8, 0x1F, 0xC0, 0xFE, 0x01, 0xFF, 0xFF, + 0x80, 0x1F, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xE0, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x00, 0x60, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, + 0xE0, 0xFF, 0xFF, 0xF0, 0xF0, 0x03, 0xF8, 0xF0, 0x00, 0xFC, 0xF0, 0x00, + 0x7C, 0xF0, 0x00, 0x3C, 0xF0, 0x00, 0x3E, 0xF0, 0x00, 0x3E, 0xF0, 0x00, + 0x3E, 0xF0, 0x00, 0x3E, 0xF0, 0x00, 0x3E, 0xF0, 0x00, 0x3C, 0xF0, 0x00, + 0x7C, 0xF0, 0x00, 0xFC, 0xF0, 0x03, 0xF8, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, + 0xE0, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0x80, 0xF0, 0x0F, 0x80, 0xF0, 0x07, + 0xC0, 0xF0, 0x03, 0xC0, 0xF0, 0x03, 0xE0, 0xF0, 0x01, 0xE0, 0xF0, 0x01, + 0xF0, 0xF0, 0x00, 0xF8, 0xF0, 0x00, 0xF8, 0xF0, 0x00, 0x7C, 0xF0, 0x00, + 0x7C, 0xF0, 0x00, 0x3E, 0xF0, 0x00, 0x1E, 0xF0, 0x00, 0x1F, 0x00, 0xFF, + 0x00, 0x03, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF8, 0x3F, 0x80, + 0xFC, 0x3E, 0x00, 0x3E, 0x7C, 0x00, 0x1E, 0x7C, 0x00, 0x1F, 0x78, 0x00, + 0x1F, 0x78, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xFE, 0x00, 0x03, 0xFF, + 0xC0, 0x00, 0xFF, 0xF0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0xF0, 0x00, + 0x0F, 0xF8, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0x7C, 0x00, 0x1F, 0x7E, 0x00, + 0x3F, 0x3F, 0x80, 0xFE, 0x1F, 0xFF, 0xFC, 0x0F, 0xFF, 0xF8, 0x03, 0xFF, + 0xF0, 0x00, 0x7F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x0F, 0xF0, 0x00, + 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, + 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, + 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, + 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, + 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, + 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF8, 0x00, + 0x1F, 0xF8, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x7E, 0x00, 0x7E, 0x3F, 0x81, + 0xFC, 0x1F, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x07, 0xFF, 0xE0, 0x00, 0xFF, + 0x00, 0xF8, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x1F, 0x78, 0x00, 0x01, 0xE7, + 0xC0, 0x00, 0x3E, 0x7C, 0x00, 0x03, 0xE3, 0xC0, 0x00, 0x3C, 0x3E, 0x00, + 0x07, 0xC3, 0xE0, 0x00, 0x7C, 0x1E, 0x00, 0x07, 0x81, 0xF0, 0x00, 0xF8, + 0x0F, 0x00, 0x0F, 0x80, 0xF0, 0x00, 0xF0, 0x0F, 0x80, 0x1F, 0x00, 0x78, + 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x7C, 0x03, 0xE0, 0x03, 0xC0, 0x3C, + 0x00, 0x3C, 0x03, 0xC0, 0x03, 0xE0, 0x7C, 0x00, 0x1E, 0x07, 0x80, 0x01, + 0xE0, 0x78, 0x00, 0x0F, 0x0F, 0x80, 0x00, 0xF0, 0xF0, 0x00, 0x0F, 0x0F, + 0x00, 0x00, 0x79, 0xE0, 0x00, 0x07, 0x9E, 0x00, 0x00, 0x7B, 0xE0, 0x00, + 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x1F, + 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF0, 0x00, + 0xF8, 0x00, 0x3C, 0x00, 0x1F, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x78, 0x00, + 0x3E, 0x00, 0x1E, 0x7C, 0x00, 0x7E, 0x00, 0x3E, 0x7C, 0x00, 0x7E, 0x00, + 0x3E, 0x3C, 0x00, 0x7E, 0x00, 0x3C, 0x3C, 0x00, 0xFF, 0x00, 0x3C, 0x3E, + 0x00, 0xFF, 0x00, 0x3C, 0x3E, 0x00, 0xF7, 0x00, 0x7C, 0x1E, 0x00, 0xF7, + 0x80, 0x78, 0x1E, 0x01, 0xE7, 0x80, 0x78, 0x1E, 0x01, 0xE7, 0x80, 0x78, + 0x1F, 0x01, 0xE3, 0x80, 0xF8, 0x0F, 0x01, 0xC3, 0xC0, 0xF0, 0x0F, 0x03, + 0xC3, 0xC0, 0xF0, 0x0F, 0x03, 0xC3, 0xC0, 0xF0, 0x0F, 0x83, 0xC1, 0xC0, + 0xF0, 0x07, 0x87, 0x81, 0xE1, 0xF0, 0x07, 0x87, 0x81, 0xE1, 0xE0, 0x07, + 0x87, 0x80, 0xE1, 0xE0, 0x07, 0x87, 0x00, 0xF1, 0xE0, 0x03, 0xCF, 0x00, + 0xF3, 0xE0, 0x03, 0xCF, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x73, 0xC0, + 0x03, 0xDE, 0x00, 0x7B, 0xC0, 0x03, 0xDE, 0x00, 0x7B, 0xC0, 0x01, 0xFE, + 0x00, 0x7B, 0x80, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x3F, + 0x80, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x00, 0xFC, 0x00, 0x1F, 0x00, 0x00, + 0xF8, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, + 0x1F, 0x00, 0x7C, 0x00, 0x07, 0xE7, 0xC0, 0x00, 0xF8, 0xF8, 0x00, 0x3E, + 0x0F, 0x80, 0x07, 0xC1, 0xF8, 0x01, 0xF0, 0x1F, 0x00, 0x7E, 0x01, 0xF0, + 0x0F, 0x80, 0x3E, 0x03, 0xE0, 0x03, 0xE0, 0x7C, 0x00, 0x3E, 0x1F, 0x00, + 0x07, 0xC7, 0xC0, 0x00, 0x7C, 0xF8, 0x00, 0x0F, 0xBE, 0x00, 0x00, 0xFF, + 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, 0x80, 0x00, + 0x03, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x07, 0xFE, + 0x00, 0x01, 0xF7, 0xC0, 0x00, 0x3E, 0x7C, 0x00, 0x0F, 0x8F, 0xC0, 0x03, + 0xE0, 0xF8, 0x00, 0x7C, 0x0F, 0x80, 0x1F, 0x01, 0xF8, 0x07, 0xE0, 0x1F, + 0x00, 0xF8, 0x01, 0xF0, 0x3E, 0x00, 0x3E, 0x07, 0xC0, 0x03, 0xE1, 0xF0, + 0x00, 0x7E, 0x7C, 0x00, 0x07, 0xDF, 0x80, 0x00, 0x7C, 0xFC, 0x00, 0x01, + 0xF7, 0xC0, 0x00, 0x3E, 0x3E, 0x00, 0x07, 0xC3, 0xE0, 0x00, 0x7C, 0x1F, + 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x0F, 0x80, 0x1F, 0x00, 0xF8, 0x01, + 0xF0, 0x07, 0xC0, 0x3E, 0x00, 0x7C, 0x03, 0xE0, 0x03, 0xE0, 0x7C, 0x00, + 0x1E, 0x07, 0xC0, 0x01, 0xF0, 0xF8, 0x00, 0x0F, 0x0F, 0x80, 0x00, 0xF9, + 0xF0, 0x00, 0x07, 0x9E, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0x3F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x00, + 0xF0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF0, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x3E, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, + 0x03, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, + 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x03, + 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, + 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, + 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, + 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, + 0x7F, 0xFF, 0xFF, 0xFF, 0xF8, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0x80, 0x01, + 0xE0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x1E, + 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x01, 0xE0, + 0x00, 0x78, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x1E, 0x00, + 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, + 0x78, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x07, + 0x80, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x78, + 0x00, 0x1E, 0x00, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x78, 0x3C, + 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, + 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, + 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, + 0x1E, 0x0F, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0xC0, 0x03, 0xC0, + 0x07, 0xC0, 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0xF0, 0x0F, 0xF0, 0x1E, 0x70, + 0x1E, 0x78, 0x1C, 0x78, 0x3C, 0x3C, 0x3C, 0x3C, 0x78, 0x1C, 0x78, 0x1E, + 0x78, 0x1E, 0xF0, 0x0F, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFC, 0x0F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, + 0xE0, 0x3C, 0x03, 0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, + 0x7E, 0x07, 0xE7, 0x80, 0x3E, 0xF8, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, + 0xE0, 0x00, 0x1E, 0x03, 0xFF, 0xE0, 0xFF, 0xFE, 0x3F, 0xFF, 0xE7, 0xFF, + 0xFE, 0xFE, 0x01, 0xEF, 0x80, 0x1E, 0xF0, 0x01, 0xEF, 0x00, 0x1E, 0xF0, + 0x01, 0xEF, 0x80, 0x3E, 0xFC, 0x0F, 0xE7, 0xFF, 0xFE, 0x3F, 0xFF, 0xF1, + 0xFF, 0x9F, 0x07, 0xE0, 0xF0, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, + 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, + 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x3F, 0x81, 0xE7, 0xFF, + 0x0F, 0x7F, 0xFC, 0x7F, 0xFF, 0xF3, 0xFC, 0x1F, 0x9F, 0x80, 0x7E, 0xF8, + 0x01, 0xF7, 0x80, 0x07, 0xBC, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x00, 0x07, + 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, + 0x07, 0xFC, 0x00, 0x3F, 0xE0, 0x01, 0xEF, 0x80, 0x1F, 0x7E, 0x01, 0xFB, + 0xFC, 0x1F, 0x9F, 0xFF, 0xFC, 0xF7, 0xFF, 0xC7, 0x9F, 0xFC, 0x3C, 0x3F, + 0x80, 0x00, 0xFE, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xF0, 0x3F, 0xFF, 0xC3, + 0xF8, 0x3F, 0x1F, 0x00, 0xF9, 0xF0, 0x03, 0xEF, 0x00, 0x0F, 0x78, 0x00, + 0x7F, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, + 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x03, + 0xDF, 0x00, 0x1E, 0x7C, 0x01, 0xF3, 0xF8, 0x3F, 0x0F, 0xFF, 0xF0, 0x3F, + 0xFF, 0x00, 0xFF, 0xF0, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, + 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x7E, 0x1E, + 0x0F, 0xFC, 0xF0, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0xFE, 0x0F, 0xE7, 0xC0, + 0x1F, 0x7C, 0x00, 0x7B, 0xE0, 0x03, 0xDE, 0x00, 0x1E, 0xF0, 0x00, 0xFF, + 0x80, 0x07, 0xFC, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0x00, 0x0F, 0xF8, 0x00, + 0x7B, 0xC0, 0x03, 0xDE, 0x00, 0x1E, 0xF8, 0x00, 0xF7, 0xC0, 0x07, 0x9F, + 0x00, 0x7C, 0xFE, 0x0F, 0xE3, 0xFF, 0xFF, 0x0F, 0xFF, 0xF8, 0x3F, 0xFB, + 0xC0, 0x7F, 0x1E, 0x00, 0xFC, 0x00, 0x1F, 0xFC, 0x03, 0xFF, 0xF0, 0x3F, + 0xFF, 0xC3, 0xF0, 0x3F, 0x1F, 0x00, 0xF9, 0xF0, 0x03, 0xCF, 0x00, 0x0F, + 0x78, 0x00, 0x7F, 0xC0, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x1F, 0x00, 0x08, 0x7C, 0x00, 0xE3, 0xF8, 0x1F, 0x8F, 0xFF, + 0xF8, 0x3F, 0xFF, 0x80, 0xFF, 0xF8, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x03, + 0xFC, 0x0F, 0xF8, 0x3F, 0xF0, 0x7C, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0x80, + 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x07, 0xFF, 0xEF, 0xFF, 0xDF, 0xFF, 0xBF, + 0xFF, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, + 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, + 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, + 0x00, 0x3C, 0x00, 0x78, 0x00, 0x01, 0xF8, 0x78, 0x3F, 0xF3, 0xC7, 0xFF, + 0xDE, 0x3F, 0xFF, 0xF3, 0xF0, 0x3F, 0xBF, 0x00, 0xFD, 0xF0, 0x03, 0xEF, + 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xC0, 0x03, 0xFC, 0x00, 0x1F, 0xE0, 0x00, + 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFF, 0x00, 0x0F, 0xF8, + 0x00, 0x7B, 0xC0, 0x03, 0xDF, 0x00, 0x3E, 0xFC, 0x03, 0xF3, 0xF0, 0x3F, + 0x8F, 0xFF, 0xFC, 0x7F, 0xFD, 0xE0, 0xFF, 0xCF, 0x01, 0xF8, 0x78, 0x00, + 0x03, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF1, 0x00, 0x0F, 0x1C, 0x00, 0xF9, + 0xF8, 0x1F, 0x87, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, 0x3F, 0xF8, 0x00, 0x7F, + 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, + 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, + 0x80, 0x00, 0xF8, 0x7E, 0x0F, 0x9F, 0xF8, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, + 0xFF, 0x07, 0xEF, 0xC0, 0x1E, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x00, + 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0xFF, 0x80, + 0x0F, 0xF8, 0x00, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0xFF, 0x80, 0x0F, 0xF8, + 0x00, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0xFF, + 0x80, 0x0F, 0xF8, 0x00, 0xF0, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x03, 0x81, 0xF0, 0x7C, 0x1F, 0x03, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, + 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, + 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, + 0x07, 0x81, 0xE0, 0x78, 0x3E, 0xFF, 0xBF, 0xCF, 0xF3, 0xF0, 0xF0, 0x00, + 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, + 0x3C, 0x00, 0x01, 0xE0, 0x07, 0xEF, 0x00, 0x7C, 0x78, 0x07, 0xC3, 0xC0, + 0x7C, 0x1E, 0x07, 0xC0, 0xF0, 0x7E, 0x07, 0x87, 0xE0, 0x3C, 0x7E, 0x01, + 0xE3, 0xE0, 0x0F, 0x3E, 0x00, 0x7B, 0xE0, 0x03, 0xFF, 0x80, 0x1F, 0xFE, + 0x00, 0xFF, 0xF0, 0x07, 0xE7, 0xC0, 0x3E, 0x1F, 0x01, 0xE0, 0xF8, 0x0F, + 0x03, 0xE0, 0x78, 0x0F, 0x83, 0xC0, 0x3E, 0x1E, 0x01, 0xF0, 0xF0, 0x07, + 0xC7, 0x80, 0x1F, 0x3C, 0x00, 0x7D, 0xE0, 0x03, 0xF0, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF0, 0xFE, 0x01, 0xFC, 0x1E, 0x7F, 0xF0, 0xFF, 0xE3, + 0xDF, 0xFF, 0x3F, 0xFE, 0x7F, 0xFF, 0xEF, 0xFF, 0xEF, 0xE0, 0x7F, 0xE0, + 0xFD, 0xF8, 0x07, 0xF0, 0x07, 0xBE, 0x00, 0x7C, 0x00, 0xFF, 0x80, 0x0F, + 0x80, 0x0F, 0xF0, 0x01, 0xF0, 0x01, 0xFE, 0x00, 0x3E, 0x00, 0x3F, 0xC0, + 0x07, 0xC0, 0x07, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0x00, 0x1F, + 0xE0, 0x03, 0xE0, 0x03, 0xFC, 0x00, 0x7C, 0x00, 0x7F, 0x80, 0x0F, 0x80, + 0x0F, 0xF0, 0x01, 0xF0, 0x01, 0xFE, 0x00, 0x3E, 0x00, 0x3F, 0xC0, 0x07, + 0xC0, 0x07, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0x00, 0x1F, 0xE0, + 0x03, 0xE0, 0x03, 0xFC, 0x00, 0x7C, 0x00, 0x7F, 0x80, 0x0F, 0x80, 0x0F, + 0xF0, 0x01, 0xF0, 0x01, 0xE0, 0xF0, 0x7E, 0x0F, 0x1F, 0xF8, 0xF7, 0xFF, + 0xCF, 0xFF, 0xFE, 0xFF, 0x07, 0xEF, 0xC0, 0x3E, 0xF8, 0x01, 0xFF, 0x80, + 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, + 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, + 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, + 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xF0, 0x00, 0xFE, 0x00, 0x07, + 0xFF, 0x00, 0x3F, 0xFF, 0x80, 0xFF, 0xFF, 0x83, 0xF8, 0x3F, 0x07, 0xC0, + 0x1F, 0x1F, 0x00, 0x1F, 0x3E, 0x00, 0x3E, 0x78, 0x00, 0x3D, 0xF0, 0x00, + 0x7F, 0xE0, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x07, + 0xFE, 0x00, 0x0F, 0xFC, 0x00, 0x1F, 0x78, 0x00, 0x3C, 0xF8, 0x00, 0xF9, + 0xF0, 0x01, 0xF1, 0xF0, 0x07, 0xC3, 0xF8, 0x3F, 0x83, 0xFF, 0xFE, 0x03, + 0xFF, 0xF8, 0x01, 0xFF, 0xC0, 0x00, 0xFE, 0x00, 0xF0, 0xFC, 0x07, 0x9F, + 0xF8, 0x3D, 0xFF, 0xF1, 0xFF, 0xFF, 0xCF, 0xE0, 0x7E, 0x7E, 0x01, 0xFB, + 0xE0, 0x07, 0xDE, 0x00, 0x1E, 0xF0, 0x00, 0xFF, 0x80, 0x07, 0xFC, 0x00, + 0x1F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFE, + 0x00, 0x1F, 0xF0, 0x00, 0xFF, 0x80, 0x07, 0xBE, 0x00, 0x7D, 0xF8, 0x07, + 0xEF, 0xE0, 0x7E, 0x7F, 0xFF, 0xF3, 0xDF, 0xFF, 0x1E, 0x7F, 0xF0, 0xF0, + 0xFE, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, + 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, + 0x00, 0x3C, 0x00, 0x00, 0x01, 0xF8, 0x78, 0x3F, 0xFB, 0xC3, 0xFF, 0xFE, + 0x3F, 0xFF, 0xF3, 0xF8, 0x3F, 0x9F, 0x00, 0x7D, 0xF0, 0x01, 0xEF, 0x80, + 0x0F, 0x78, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, 0x1F, 0xF0, 0x00, 0xFF, + 0x80, 0x07, 0xFC, 0x00, 0x3F, 0xE0, 0x01, 0xEF, 0x00, 0x0F, 0x78, 0x00, + 0x7B, 0xE0, 0x03, 0xDF, 0x00, 0x1E, 0x7C, 0x01, 0xF3, 0xF8, 0x3F, 0x8F, + 0xFF, 0xFC, 0x3F, 0xFF, 0xE0, 0xFF, 0xEF, 0x01, 0xFC, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, + 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, + 0xF0, 0xFF, 0x3F, 0xF7, 0xFF, 0xFF, 0xFE, 0x0F, 0xC0, 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, + 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, + 0xF8, 0x00, 0x03, 0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, + 0x7E, 0x07, 0xE7, 0xC0, 0x3E, 0x78, 0x01, 0xE7, 0x80, 0x1F, 0x7C, 0x00, + 0x07, 0xF8, 0x00, 0x3F, 0xF8, 0x01, 0xFF, 0xE0, 0x07, 0xFF, 0x80, 0x0F, + 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x3E, 0x00, 0x01, 0xFF, 0x00, 0x0F, 0xF8, + 0x01, 0xF7, 0xC0, 0x1F, 0x7E, 0x07, 0xE3, 0xFF, 0xFE, 0x1F, 0xFF, 0xC0, + 0xFF, 0xF0, 0x03, 0xFC, 0x00, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, + 0x07, 0x80, 0x1E, 0x0F, 0xFF, 0xBF, 0xFE, 0xFF, 0xFB, 0xFF, 0xE0, 0x78, + 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, + 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, + 0x80, 0x1E, 0x00, 0x7C, 0x01, 0xFF, 0x07, 0xFC, 0x0F, 0xF0, 0x0F, 0xC0, + 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, + 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, + 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x1F, 0xF0, + 0x01, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xF7, + 0x80, 0x3F, 0x7E, 0x0F, 0xF7, 0xFF, 0xFF, 0x3F, 0xFE, 0xF1, 0xFF, 0xCF, + 0x07, 0xF0, 0xF0, 0xF0, 0x00, 0xFF, 0xC0, 0x07, 0x9E, 0x00, 0x3C, 0xF0, + 0x01, 0xE7, 0xC0, 0x1E, 0x1E, 0x00, 0xF0, 0xF0, 0x07, 0x83, 0xC0, 0x78, + 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x03, 0xC1, 0xE0, 0x1E, 0x0F, 0x00, 0xF0, + 0x78, 0x03, 0xC7, 0x80, 0x1E, 0x3C, 0x00, 0xF1, 0xC0, 0x03, 0xDE, 0x00, + 0x1E, 0xF0, 0x00, 0x77, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x7C, + 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0x70, 0x00, 0xF0, 0x01, 0xC0, + 0x07, 0xF8, 0x01, 0xF0, 0x07, 0xDE, 0x00, 0xF8, 0x03, 0xCF, 0x00, 0x7C, + 0x01, 0xE7, 0x80, 0x7F, 0x00, 0xF3, 0xC0, 0x3F, 0x80, 0xF0, 0xF0, 0x1D, + 0xC0, 0x78, 0x78, 0x1E, 0xE0, 0x3C, 0x3C, 0x0F, 0x78, 0x1E, 0x0F, 0x07, + 0x3C, 0x1E, 0x07, 0x87, 0x8E, 0x0F, 0x03, 0xC3, 0xC7, 0x87, 0x81, 0xE1, + 0xC3, 0xC3, 0x80, 0x78, 0xE0, 0xE3, 0xC0, 0x3C, 0xF0, 0x79, 0xE0, 0x1E, + 0x70, 0x3C, 0xF0, 0x07, 0x38, 0x0E, 0x70, 0x03, 0xFC, 0x07, 0xF8, 0x01, + 0xFE, 0x03, 0xFC, 0x00, 0xFE, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x7E, 0x00, + 0x1F, 0x80, 0x3F, 0x00, 0x0F, 0x80, 0x0F, 0x80, 0x03, 0xC0, 0x07, 0x80, + 0x01, 0xE0, 0x03, 0xC0, 0x00, 0xF8, 0x00, 0xFB, 0xE0, 0x0F, 0x8F, 0x80, + 0x78, 0x7C, 0x07, 0xC1, 0xF0, 0x7C, 0x07, 0x83, 0xC0, 0x3E, 0x3E, 0x00, + 0xF9, 0xE0, 0x03, 0xDE, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0x00, 0x01, 0xF0, + 0x00, 0x0F, 0x80, 0x00, 0x7E, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0xC0, 0x03, + 0xDF, 0x00, 0x3C, 0x78, 0x03, 0xE3, 0xE0, 0x1E, 0x0F, 0x81, 0xF0, 0x3C, + 0x1F, 0x01, 0xF0, 0xF0, 0x07, 0xCF, 0x80, 0x3E, 0xF8, 0x00, 0xF8, 0xF8, + 0x00, 0x7D, 0xF0, 0x01, 0xE7, 0xC0, 0x0F, 0x8F, 0x00, 0x3C, 0x3E, 0x00, + 0xF0, 0xF8, 0x07, 0xC1, 0xE0, 0x1E, 0x07, 0xC0, 0x78, 0x1F, 0x03, 0xE0, + 0x3C, 0x0F, 0x00, 0xF8, 0x3C, 0x01, 0xE1, 0xF0, 0x07, 0x87, 0x80, 0x1F, + 0x1E, 0x00, 0x3C, 0x78, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x07, 0xB8, + 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, + 0x0F, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3E, 0x00, + 0x0F, 0xF0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xE0, 0x00, 0x00, + 0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0x00, 0x07, + 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, + 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, + 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, + 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF0, 0x00, 0x18, 0x03, 0xC0, 0x3E, 0x03, 0xE0, 0x3C, 0x03, + 0xE0, 0x1E, 0x00, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, + 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x78, 0x03, 0xC0, 0x3E, 0x03, + 0xE0, 0x7E, 0x03, 0xE0, 0x1F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xC0, 0x1E, + 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, + 0x1F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF8, 0x03, 0xC0, 0x0F, 0x80, + 0x3E, 0x00, 0xF0, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x07, 0x80, 0x3E, + 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, + 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, + 0x3C, 0x01, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xFC, 0x03, 0xE0, 0x3F, 0x03, + 0xE0, 0x3E, 0x01, 0xE0, 0x0F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, + 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x03, + 0xE0, 0x3E, 0x03, 0xE0, 0x3E, 0x01, 0xE0, 0x0C, 0x00, 0x00, 0x07, 0xC0, + 0x00, 0x07, 0xFC, 0x00, 0xF3, 0xFF, 0xC0, 0x3D, 0xFF, 0xF8, 0x0F, 0x78, + 0x7F, 0x8F, 0xBC, 0x07, 0xFF, 0xEF, 0x00, 0xFF, 0xF3, 0xC0, 0x0F, 0xF8, + 0x00, 0x00, 0xF8, 0x00 }; + +const GFXglyph Roboto_Regular24pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 12, 0, 1 }, // 0x20 ' ' + { 0, 5, 34, 12, 4, -33 }, // 0x21 '!' + { 22, 10, 11, 15, 3, -34 }, // 0x22 '"' + { 36, 25, 34, 29, 3, -33 }, // 0x23 '#' + { 143, 21, 43, 26, 3, -38 }, // 0x24 '$' + { 256, 30, 34, 34, 2, -33 }, // 0x25 '%' + { 384, 27, 34, 29, 2, -33 }, // 0x26 '&' + { 499, 4, 11, 8, 2, -34 }, // 0x27 ''' + { 505, 12, 49, 16, 3, -37 }, // 0x28 '(' + { 579, 12, 49, 16, 1, -37 }, // 0x29 ')' + { 653, 19, 19, 20, 1, -33 }, // 0x2A '*' + { 699, 23, 25, 27, 2, -27 }, // 0x2B '+' + { 771, 6, 12, 9, 1, -4 }, // 0x2C ',' + { 780, 11, 4, 13, 1, -15 }, // 0x2D '-' + { 786, 6, 5, 12, 3, -4 }, // 0x2E '.' + { 790, 18, 37, 19, 0, -33 }, // 0x2F '/' + { 874, 21, 34, 26, 3, -33 }, // 0x30 '0' + { 964, 13, 34, 26, 4, -33 }, // 0x31 '1' + { 1020, 23, 34, 26, 2, -33 }, // 0x32 '2' + { 1118, 21, 34, 26, 2, -33 }, // 0x33 '3' + { 1208, 24, 34, 26, 1, -33 }, // 0x34 '4' + { 1310, 21, 34, 26, 4, -33 }, // 0x35 '5' + { 1400, 21, 34, 26, 3, -33 }, // 0x36 '6' + { 1490, 22, 34, 26, 2, -33 }, // 0x37 '7' + { 1584, 21, 34, 26, 3, -33 }, // 0x38 '8' + { 1674, 21, 34, 26, 2, -33 }, // 0x39 '9' + { 1764, 5, 25, 11, 3, -24 }, // 0x3A ':' + { 1780, 7, 32, 10, 1, -24 }, // 0x3B ';' + { 1808, 18, 21, 24, 2, -24 }, // 0x3C '<' + { 1856, 20, 14, 26, 3, -22 }, // 0x3D '=' + { 1891, 20, 21, 25, 3, -24 }, // 0x3E '>' + { 1944, 18, 34, 22, 2, -33 }, // 0x3F '?' + { 2021, 38, 43, 42, 2, -32 }, // 0x40 '@' + { 2226, 29, 34, 31, 1, -33 }, // 0x41 'A' + { 2350, 23, 34, 29, 4, -33 }, // 0x42 'B' + { 2448, 25, 34, 31, 3, -33 }, // 0x43 'C' + { 2555, 24, 34, 31, 4, -33 }, // 0x44 'D' + { 2657, 21, 34, 27, 4, -33 }, // 0x45 'E' + { 2747, 21, 34, 26, 4, -33 }, // 0x46 'F' + { 2837, 26, 34, 32, 3, -33 }, // 0x47 'G' + { 2948, 26, 34, 34, 4, -33 }, // 0x48 'H' + { 3059, 5, 34, 13, 4, -33 }, // 0x49 'I' + { 3081, 21, 34, 26, 1, -33 }, // 0x4A 'J' + { 3171, 25, 34, 29, 4, -33 }, // 0x4B 'K' + { 3278, 20, 34, 25, 4, -33 }, // 0x4C 'L' + { 3363, 33, 34, 41, 4, -33 }, // 0x4D 'M' + { 3504, 26, 34, 34, 4, -33 }, // 0x4E 'N' + { 3615, 27, 34, 32, 3, -33 }, // 0x4F 'O' + { 3730, 24, 34, 30, 4, -33 }, // 0x50 'P' + { 3832, 27, 39, 32, 2, -33 }, // 0x51 'Q' + { 3964, 24, 34, 29, 4, -33 }, // 0x52 'R' + { 4066, 24, 34, 28, 2, -33 }, // 0x53 'S' + { 4168, 26, 34, 28, 1, -33 }, // 0x54 'T' + { 4279, 24, 34, 30, 3, -33 }, // 0x55 'U' + { 4381, 28, 34, 30, 1, -33 }, // 0x56 'V' + { 4500, 40, 34, 42, 1, -33 }, // 0x57 'W' + { 4670, 27, 34, 29, 1, -33 }, // 0x58 'X' + { 4785, 28, 34, 28, 0, -33 }, // 0x59 'Y' + { 4904, 24, 34, 28, 2, -33 }, // 0x5A 'Z' + { 5006, 9, 45, 12, 3, -37 }, // 0x5B '[' + { 5057, 18, 37, 19, 1, -33 }, // 0x5C '\' + { 5141, 9, 45, 12, 0, -37 }, // 0x5D ']' + { 5192, 16, 17, 20, 2, -33 }, // 0x5E '^' + { 5226, 21, 4, 21, 0, 1 }, // 0x5F '_' + { 5237, 10, 7, 15, 1, -35 }, // 0x60 '`' + { 5246, 20, 25, 26, 3, -24 }, // 0x61 'a' + { 5309, 21, 35, 26, 3, -34 }, // 0x62 'b' + { 5401, 21, 25, 25, 2, -24 }, // 0x63 'c' + { 5467, 21, 35, 27, 2, -34 }, // 0x64 'd' + { 5559, 21, 25, 25, 2, -24 }, // 0x65 'e' + { 5625, 15, 36, 16, 1, -35 }, // 0x66 'f' + { 5693, 21, 35, 26, 2, -24 }, // 0x67 'g' + { 5785, 20, 35, 26, 3, -34 }, // 0x68 'h' + { 5873, 5, 34, 11, 3, -33 }, // 0x69 'i' + { 5895, 10, 44, 11, -2, -33 }, // 0x6A 'j' + { 5950, 21, 36, 24, 3, -35 }, // 0x6B 'k' + { 6045, 4, 36, 11, 4, -35 }, // 0x6C 'l' + { 6063, 35, 25, 41, 3, -24 }, // 0x6D 'm' + { 6173, 20, 25, 26, 3, -24 }, // 0x6E 'n' + { 6236, 23, 25, 27, 2, -24 }, // 0x6F 'o' + { 6308, 21, 35, 26, 3, -24 }, // 0x70 'p' + { 6400, 21, 35, 27, 2, -24 }, // 0x71 'q' + { 6492, 12, 25, 16, 3, -24 }, // 0x72 'r' + { 6530, 20, 25, 24, 2, -24 }, // 0x73 's' + { 6593, 14, 31, 15, 0, -30 }, // 0x74 't' + { 6648, 20, 25, 26, 3, -24 }, // 0x75 'u' + { 6711, 21, 25, 23, 1, -24 }, // 0x76 'v' + { 6777, 33, 25, 35, 1, -24 }, // 0x77 'w' + { 6881, 21, 25, 23, 1, -24 }, // 0x78 'x' + { 6947, 22, 35, 22, 0, -24 }, // 0x79 'y' + { 7044, 20, 25, 23, 2, -24 }, // 0x7A 'z' + { 7107, 13, 45, 16, 2, -36 }, // 0x7B '{' + { 7181, 3, 40, 11, 4, -33 }, // 0x7C '|' + { 7196, 13, 45, 16, 1, -36 }, // 0x7D '}' + { 7270, 26, 9, 32, 3, -17 } }; // 0x7E '~' + +const GFXfont Roboto_Regular24pt7b PROGMEM = { + (uint8_t *)Roboto_Regular24pt7bBitmaps, + (GFXglyph *)Roboto_Regular24pt7bGlyphs, + 0x20, 0x7E, 55 }; + +// Approx. 7972 bytes diff --git a/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.9pt.RUS.h b/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.9pt.RUS.h new file mode 100644 index 0000000..ba61787 --- /dev/null +++ b/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.9pt.RUS.h @@ -0,0 +1,198 @@ +const uint8_t Roboto_Regular9pt8bRUSBitmaps[] PROGMEM = { + 0x30, 0x0C, 0x02, 0x00, 0x0F, 0xFE, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x3F, + 0xD8, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xFF, 0x80, 0x22, 0x1B, 0x00, 0x1F, + 0xFC, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x7F, 0xB0, 0x18, 0x0C, 0x06, 0x03, + 0x01, 0xFF, 0xFF, 0xC0, 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x07, 0xE0, + 0x20, 0xC1, 0x02, 0x08, 0x18, 0x40, 0xC2, 0x04, 0x10, 0x60, 0x0E, 0x00, + 0x0C, 0x30, 0x40, 0x0F, 0xF0, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, + 0x20, 0x40, 0x80, 0x1F, 0x08, 0x66, 0x0B, 0x03, 0xC0, 0x30, 0x0F, 0xE3, + 0x00, 0xC0, 0x30, 0x34, 0x09, 0x86, 0x1E, 0x00, 0x3E, 0x31, 0xB0, 0x78, + 0x3C, 0x03, 0x00, 0x70, 0x0E, 0x01, 0xE0, 0xF0, 0x6C, 0x33, 0xE0, 0xFF, + 0xF8, 0x8E, 0xC0, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x01, + 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0xE0, 0xD0, 0x4C, + 0x63, 0xE0, 0x1F, 0xE0, 0x06, 0x18, 0x01, 0x86, 0x00, 0x61, 0x80, 0x18, + 0x60, 0x06, 0x1F, 0xC1, 0x86, 0x0C, 0x41, 0x83, 0x10, 0x60, 0x44, 0x18, + 0x13, 0x06, 0x0C, 0xC1, 0x83, 0xE0, 0x7F, 0x00, 0xC0, 0xC0, 0x60, 0x60, + 0x30, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x07, 0xF3, 0xFF, 0x07, 0x81, + 0x81, 0xC0, 0xC0, 0xE0, 0x60, 0x70, 0x30, 0x78, 0x18, 0x3C, 0x0F, 0xE0, + 0xFF, 0xC1, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0xFE, 0x18, 0x31, 0x83, + 0x18, 0x11, 0x81, 0x18, 0x11, 0x81, 0x18, 0x10, 0x06, 0x03, 0x01, 0x80, + 0x00, 0xC1, 0xF0, 0x6C, 0x33, 0x18, 0xCC, 0x36, 0x0F, 0x83, 0xB0, 0xC6, + 0x30, 0xCC, 0x13, 0x06, 0xC0, 0xC0, 0x30, 0x0C, 0x02, 0x00, 0x08, 0x1C, + 0x0E, 0x0F, 0x0D, 0x84, 0xC6, 0x62, 0x33, 0x1B, 0x0D, 0x07, 0x83, 0x81, + 0xC0, 0x80, 0x32, 0x07, 0x80, 0x03, 0x07, 0xC1, 0x98, 0x66, 0x30, 0x8C, + 0x36, 0x05, 0x81, 0xC0, 0x70, 0x0C, 0x02, 0x01, 0x81, 0xC0, 0x80, 0xC0, + 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x1F, + 0xF8, 0x40, 0x20, 0x10, 0x06, 0x00, 0x60, 0x0F, 0x00, 0x90, 0x09, 0x01, + 0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, 0x30, + 0xFF, 0x60, 0x30, 0x18, 0x0C, 0x07, 0xF3, 0x07, 0x83, 0xC0, 0xE0, 0x70, + 0x78, 0x3F, 0xE0, 0xFE, 0x61, 0xB0, 0x78, 0x3C, 0x1E, 0x1B, 0xF9, 0x83, + 0xC1, 0xE0, 0xF0, 0x78, 0x3F, 0xE0, 0xFF, 0x02, 0x04, 0x08, 0x10, 0x20, + 0x40, 0x81, 0x02, 0x04, 0x08, 0x00, 0x1F, 0xE1, 0x06, 0x10, 0x61, 0x06, + 0x10, 0x61, 0x06, 0x10, 0x63, 0x06, 0x30, 0x63, 0x06, 0x20, 0x66, 0x06, + 0xFF, 0xF8, 0x01, 0x80, 0x18, 0x01, 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06, + 0x03, 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, 0x61, 0x83, 0x21, + 0x86, 0x31, 0x8C, 0x19, 0x8C, 0x19, 0x98, 0x0D, 0x90, 0x0F, 0xF0, 0x0D, + 0x98, 0x19, 0x98, 0x11, 0x8C, 0x31, 0x86, 0x61, 0x86, 0xE1, 0x83, 0x3E, + 0x31, 0xB0, 0x78, 0x30, 0x18, 0x18, 0x78, 0x02, 0x01, 0xE0, 0xF0, 0x6C, + 0x63, 0xE0, 0x81, 0xC0, 0xE0, 0xF0, 0xD8, 0x4C, 0x66, 0x23, 0x31, 0xB0, + 0xD0, 0x78, 0x38, 0x1C, 0x08, 0x22, 0x0E, 0x00, 0x10, 0x38, 0x1C, 0x1E, + 0x1B, 0x09, 0x8C, 0xC4, 0x66, 0x36, 0x1A, 0x0F, 0x07, 0x03, 0x81, 0x81, + 0xA0, 0xC8, 0x62, 0x30, 0x9C, 0x26, 0x0F, 0x82, 0x60, 0x8C, 0x21, 0x88, + 0x32, 0x0C, 0x81, 0xC0, 0x3F, 0xCC, 0x13, 0x04, 0xC1, 0x30, 0x4C, 0x13, + 0x04, 0xC1, 0x30, 0x48, 0x12, 0x05, 0x81, 0xC0, 0x40, 0xE0, 0x1F, 0x01, + 0xFC, 0x0F, 0xE0, 0x5D, 0x06, 0xEC, 0x27, 0x23, 0x39, 0x99, 0xCC, 0x8E, + 0x2C, 0x71, 0xC3, 0x86, 0x1C, 0x30, 0x80, 0xC0, 0x70, 0x1C, 0x07, 0x01, + 0xC0, 0x70, 0x1F, 0xFF, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x40, + 0x1E, 0x08, 0x66, 0x0F, 0x03, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, + 0x36, 0x0C, 0x86, 0x1F, 0x00, 0xFF, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, + 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x08, 0xFE, 0x30, 0x6C, 0x0B, + 0x02, 0xC0, 0xF0, 0x2C, 0x1B, 0xFC, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, + 0x00, 0x1F, 0x08, 0x66, 0x0B, 0x03, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, + 0x30, 0x34, 0x08, 0x86, 0x1E, 0x00, 0xFF, 0xC1, 0x00, 0x40, 0x10, 0x04, + 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x00, 0xC1, + 0xF0, 0x66, 0x19, 0x8C, 0x23, 0x0D, 0x81, 0x60, 0x70, 0x1C, 0x03, 0x00, + 0x80, 0x60, 0x70, 0x00, 0x06, 0x00, 0x60, 0x1F, 0x86, 0x66, 0xC6, 0x3C, + 0x63, 0x86, 0x18, 0x61, 0xC6, 0x3C, 0x63, 0x66, 0x61, 0xF8, 0x06, 0x00, + 0x60, 0xC1, 0xD0, 0x66, 0x30, 0xCC, 0x36, 0x07, 0x00, 0xC0, 0x70, 0x36, + 0x0C, 0xC6, 0x33, 0x06, 0xC0, 0xC0, 0x80, 0x90, 0x12, 0x02, 0x40, 0x48, + 0x09, 0x01, 0x20, 0x24, 0x04, 0x80, 0x90, 0x12, 0x02, 0x40, 0x4F, 0xFE, + 0x00, 0xC0, 0x10, 0x02, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x36, + 0x0C, 0xFF, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x82, 0x0C, 0x10, + 0x60, 0x83, 0x04, 0x18, 0x20, 0xC1, 0x06, 0x08, 0x30, 0x41, 0x82, 0x0C, + 0x10, 0x60, 0x83, 0x04, 0x1F, 0xFF, 0x80, 0x82, 0x09, 0x04, 0x12, 0x08, + 0x24, 0x10, 0x48, 0x20, 0x90, 0x41, 0x20, 0x82, 0x41, 0x04, 0x82, 0x09, + 0x04, 0x12, 0x08, 0x24, 0x10, 0x4F, 0xFF, 0xE0, 0x00, 0xC0, 0x01, 0x80, + 0x03, 0xFC, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x07, 0xF0, 0x30, + 0xC1, 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x60, 0xFE, 0x00, 0x80, + 0x38, 0x03, 0x80, 0x38, 0x03, 0x80, 0x3F, 0xE3, 0x83, 0x38, 0x1B, 0x81, + 0xB8, 0x1B, 0x81, 0xB8, 0x33, 0xFE, 0x30, 0xC0, 0x60, 0x30, 0x18, 0x0C, + 0x07, 0xF3, 0x07, 0x83, 0xC0, 0xE0, 0x70, 0x78, 0x3F, 0xE0, 0x1E, 0x18, + 0x64, 0x0B, 0x03, 0x00, 0xC0, 0x31, 0xFC, 0x03, 0x00, 0xF0, 0x34, 0x09, + 0x86, 0x1E, 0x00, 0x83, 0xE4, 0x31, 0xA3, 0x07, 0x30, 0x39, 0x80, 0xCC, + 0x07, 0xE0, 0x33, 0x01, 0x98, 0x0C, 0x40, 0xE3, 0x07, 0x0C, 0x68, 0x3E, + 0x00, 0x3F, 0xB0, 0xF0, 0x78, 0x3C, 0x1E, 0x0D, 0x86, 0x7F, 0x31, 0xB0, + 0xD8, 0x78, 0x3C, 0x18, 0x3C, 0x66, 0xC2, 0x03, 0x3F, 0x43, 0xC3, 0xC3, + 0xC7, 0x7B, 0x03, 0x0E, 0x3C, 0x60, 0x40, 0xFC, 0xE3, 0xC3, 0xC1, 0xC1, + 0xC1, 0xC3, 0x62, 0x3C, 0xFE, 0xC3, 0xC3, 0xC3, 0xFC, 0xC3, 0xC1, 0xC1, + 0xC3, 0xFE, 0xFF, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x00, 0x1F, 0x86, + 0x61, 0x98, 0x46, 0x11, 0x84, 0x61, 0x18, 0xC6, 0x21, 0xBF, 0xFC, 0x07, + 0x01, 0xC0, 0x40, 0x3C, 0x62, 0x43, 0xC3, 0xFF, 0xC0, 0xC0, 0xC2, 0x63, + 0x3E, 0x63, 0x18, 0x8C, 0xC3, 0x32, 0x06, 0xD8, 0x0F, 0xC0, 0x6D, 0x83, + 0x32, 0x0C, 0xCC, 0x63, 0x1B, 0x8C, 0x70, 0x7D, 0x8E, 0x18, 0x33, 0xC0, + 0xC0, 0xC1, 0xC6, 0xF8, 0xC3, 0xC7, 0xC7, 0xCF, 0xCB, 0xDB, 0xF3, 0xF3, + 0xE3, 0xC3, 0x22, 0x1C, 0x00, 0xC3, 0xC7, 0xC7, 0xCF, 0xCB, 0xDB, 0xF3, + 0xF3, 0xE3, 0xC3, 0xC3, 0x63, 0x33, 0x1B, 0x0F, 0x86, 0x43, 0x31, 0x8C, + 0xC6, 0x61, 0xC0, 0x3F, 0x98, 0xCC, 0x66, 0x33, 0x19, 0x8C, 0xC6, 0x43, + 0x21, 0xE0, 0xC0, 0xE0, 0x7C, 0x1F, 0xC3, 0xF8, 0xFD, 0x1F, 0xB2, 0xF2, + 0xDE, 0x73, 0xC6, 0x78, 0x8C, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC3, 0x3C, 0x66, 0xC3, 0x81, 0x81, 0x81, 0x81, 0xC3, 0x66, + 0x3C, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xDC, + 0xE6, 0xC3, 0xC3, 0xC1, 0xC1, 0xC3, 0xC3, 0xE6, 0xDC, 0xC0, 0xC0, 0xC0, + 0xC0, 0x3C, 0x46, 0xC2, 0x81, 0x80, 0x80, 0x80, 0xC3, 0x46, 0x3C, 0xFF, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xC1, 0xB1, 0x98, + 0xC4, 0x43, 0x61, 0xB0, 0x50, 0x38, 0x1C, 0x04, 0x02, 0x03, 0x01, 0x03, + 0x00, 0x04, 0x00, 0x80, 0x10, 0x02, 0x03, 0xF8, 0x89, 0xB1, 0x1E, 0x23, + 0x84, 0x70, 0x87, 0x11, 0xE2, 0x34, 0x44, 0x7F, 0x01, 0x00, 0x20, 0x04, + 0x00, 0x80, 0xE3, 0x31, 0x0D, 0x82, 0x81, 0xC0, 0xE0, 0x50, 0x6C, 0x63, + 0x71, 0xC0, 0xC3, 0x61, 0xB0, 0xD8, 0x6C, 0x36, 0x1B, 0x0D, 0x86, 0xC3, + 0x7F, 0xC0, 0x20, 0x10, 0x08, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x7F, 0x03, + 0x03, 0x03, 0x03, 0xC6, 0x1C, 0x61, 0xC6, 0x1C, 0x61, 0xC6, 0x1C, 0x61, + 0xC6, 0x1C, 0x61, 0xC6, 0x1F, 0xFF, 0xC6, 0x36, 0x31, 0xB1, 0x8D, 0x8C, + 0x6C, 0x63, 0x63, 0x1B, 0x18, 0xD8, 0xC6, 0xC6, 0x37, 0xFF, 0xC0, 0x02, + 0x00, 0x10, 0x00, 0x80, 0xF8, 0x03, 0x00, 0x60, 0x0F, 0xC1, 0x8C, 0x30, + 0x86, 0x18, 0xC2, 0x18, 0xC3, 0xF0, 0xC0, 0x38, 0x07, 0x00, 0xFE, 0x1C, + 0x23, 0x86, 0x70, 0xCE, 0x19, 0xC2, 0x3F, 0x84, 0x81, 0x02, 0x07, 0xE8, + 0x70, 0xE1, 0xC3, 0x87, 0xF8, 0x3C, 0x46, 0xC2, 0x03, 0x1F, 0x03, 0x03, + 0xC2, 0x46, 0x3C, 0x83, 0xC8, 0xC6, 0x8C, 0x38, 0x83, 0xF8, 0x39, 0x83, + 0x88, 0x38, 0xC3, 0x84, 0x68, 0x3C, 0x3F, 0xB0, 0xD8, 0x6C, 0x36, 0x19, + 0xFC, 0xC6, 0x63, 0x61, 0xE0, 0xC0 }; + +const GFXglyph Roboto_Regular9pt8bRUSGlyphs[] PROGMEM = { + { 0, 9, 17, 10, 1, -16 }, // 0x400 + { 20, 9, 16, 10, 1, -15 }, // 0x401 + { 38, 13, 13, 13, 0, -12 }, // 0x402 + { 60, 7, 17, 10, 2, -16 }, // 0x403 + { 75, 10, 13, 12, 1, -12 }, // 0x404 + { 92, 9, 13, 11, 1, -12 }, // 0x405 + { 107, 1, 13, 5, 2, -12 }, // 0x406 + { 109, 5, 16, 5, 0, -15 }, // 0x407 + { 119, 9, 13, 10, 0, -12 }, // 0x408 + { 134, 18, 13, 19, 0, -12 }, // 0x409 + { 164, 17, 13, 19, 1, -12 }, // 0x40A + { 192, 12, 13, 15, 1, -12 }, // 0x40B + { 212, 10, 17, 11, 1, -16 }, // 0x40C + { 234, 9, 17, 13, 2, -16 }, // 0x40D + { 254, 10, 16, 11, 1, -15 }, // 0x40E + { 274, 9, 16, 13, 2, -12 }, // 0x40F + { 292, 12, 13, 12, 0, -12 }, // 0x410 + { 312, 9, 13, 11, 1, -12 }, // 0x411 + { 327, 9, 13, 11, 1, -12 }, // 0x412 + { 342, 7, 13, 10, 2, -12 }, // 0x413 + { 354, 12, 16, 14, 1, -12 }, // 0x414 + { 378, 9, 13, 10, 1, -12 }, // 0x415 + { 393, 16, 13, 16, 0, -12 }, // 0x416 + { 419, 9, 13, 11, 1, -12 }, // 0x417 + { 434, 9, 13, 13, 2, -12 }, // 0x418 + { 449, 9, 16, 13, 2, -15 }, // 0x419 + { 467, 10, 13, 12, 2, -12 }, // 0x41A + { 484, 10, 13, 13, 1, -12 }, // 0x41B + { 501, 13, 13, 16, 1, -12 }, // 0x41C + { 523, 10, 13, 13, 1, -12 }, // 0x41D + { 540, 10, 13, 12, 1, -12 }, // 0x41E + { 557, 9, 13, 13, 2, -12 }, // 0x41F + { 572, 10, 13, 11, 1, -12 }, // 0x420 + { 589, 10, 13, 12, 1, -12 }, // 0x421 + { 606, 10, 13, 11, 0, -12 }, // 0x422 + { 623, 10, 13, 11, 1, -12 }, // 0x423 + { 640, 12, 14, 14, 1, -12 }, // 0x424 + { 661, 10, 13, 11, 1, -12 }, // 0x425 + { 678, 11, 16, 13, 2, -12 }, // 0x426 + { 700, 10, 13, 12, 1, -12 }, // 0x427 + { 717, 13, 13, 17, 2, -12 }, // 0x428 + { 739, 15, 16, 17, 2, -12 }, // 0x429 + { 769, 13, 13, 14, 0, -12 }, // 0x42A + { 791, 12, 13, 16, 2, -12 }, // 0x42B + { 811, 9, 13, 11, 1, -12 }, // 0x42C + { 826, 10, 13, 12, 1, -12 }, // 0x42D + { 843, 13, 13, 16, 2, -12 }, // 0x42E + { 865, 9, 13, 11, 1, -12 }, // 0x42F + { 880, 8, 10, 10, 1, -9 }, // 0x430 + { 890, 8, 14, 10, 1, -13 }, // 0x431 + { 904, 8, 10, 10, 1, -9 }, // 0x432 + { 914, 6, 10, 8, 1, -9 }, // 0x433 + { 922, 10, 13, 11, 0, -9 }, // 0x434 + { 939, 8, 10, 10, 1, -9 }, // 0x435 + { 949, 14, 10, 14, 0, -9 }, // 0x436 + { 967, 7, 10, 9, 1, -9 }, // 0x437 + { 976, 8, 10, 10, 1, -9 }, // 0x438 + { 986, 8, 13, 10, 1, -12 }, // 0x439 + { 999, 9, 10, 10, 1, -9 }, // 0x43A + { 1011, 9, 10, 10, 0, -9 }, // 0x43B + { 1023, 11, 10, 13, 1, -9 }, // 0x43C + { 1037, 8, 10, 10, 1, -9 }, // 0x43D + { 1047, 8, 10, 10, 1, -9 }, // 0x43E + { 1057, 8, 10, 10, 1, -9 }, // 0x43F + { 1067, 8, 14, 10, 1, -9 }, // 0x440 + { 1081, 8, 10, 9, 1, -9 }, // 0x441 + { 1091, 8, 10, 9, 0, -9 }, // 0x442 + { 1101, 9, 14, 9, 0, -9 }, // 0x443 + { 1117, 11, 18, 13, 1, -13 }, // 0x444 + { 1142, 9, 10, 9, 0, -9 }, // 0x445 + { 1154, 9, 13, 11, 1, -9 }, // 0x446 + { 1169, 8, 10, 10, 1, -9 }, // 0x447 + { 1179, 12, 10, 15, 1, -9 }, // 0x448 + { 1194, 13, 13, 15, 1, -9 }, // 0x449 + { 1216, 11, 10, 11, 0, -9 }, // 0x44A + { 1230, 11, 10, 14, 1, -9 }, // 0x44B + { 1244, 7, 10, 10, 2, -9 }, // 0x44C + { 1253, 8, 10, 10, 1, -9 }, // 0x44D + { 1263, 12, 10, 15, 2, -9 }, // 0x44E + { 1278, 9, 10, 10, 0, -9 } }; // 0x44F + +const GFXfont Roboto_Regular9pt8bRUS PROGMEM = { + (uint8_t *)Roboto_Regular9pt8bRUSBitmaps, + (GFXglyph *)Roboto_Regular9pt8bRUSGlyphs, + 0x400, 0x44F, 21 }; + +// Approx. 1857 bytes diff --git a/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.9pt.h b/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.9pt.h new file mode 100644 index 0000000..21979ba --- /dev/null +++ b/examples/demo-menu/src/UTF8-fonts/Roboto-Regular.ttf.9pt.h @@ -0,0 +1,198 @@ +const uint8_t Roboto_Regular9pt7bBitmaps[] PROGMEM = { + 0xFD, 0x55, 0x41, 0xC0, 0x99, 0x99, 0x09, 0x82, 0x61, 0x90, 0x64, 0x7F, + 0xC4, 0xC1, 0x30, 0xC8, 0xFF, 0x88, 0x82, 0x60, 0x98, 0x64, 0x00, 0x08, + 0x08, 0x3C, 0x62, 0x43, 0xC3, 0x40, 0x60, 0x38, 0x06, 0x03, 0xC1, 0xC3, + 0x43, 0x3E, 0x18, 0x18, 0x70, 0x11, 0x12, 0x26, 0x44, 0x88, 0xA0, 0xE4, + 0x01, 0x00, 0x6E, 0x0B, 0x22, 0x44, 0x48, 0x91, 0x90, 0x1C, 0x3C, 0x19, + 0x86, 0x21, 0x98, 0x6C, 0x0E, 0x03, 0x81, 0xB2, 0xCC, 0xB1, 0xEC, 0x31, + 0x0E, 0x3C, 0xC0, 0xF0, 0x08, 0x88, 0xC4, 0x23, 0x18, 0xC6, 0x31, 0x84, + 0x21, 0x84, 0x10, 0x40, 0x82, 0x08, 0x61, 0x0C, 0x63, 0x18, 0xC6, 0x31, + 0x88, 0xC4, 0x44, 0x00, 0x18, 0x18, 0x9A, 0xFE, 0x19, 0x3C, 0x64, 0x46, + 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x6D, 0x60, 0xF8, + 0xF0, 0x06, 0x08, 0x10, 0x60, 0x83, 0x04, 0x08, 0x30, 0x41, 0x83, 0x04, + 0x18, 0x00, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0x66, 0x3C, 0x17, 0x91, 0x11, 0x11, 0x11, 0x11, 0x10, 0x3C, 0x46, + 0xC3, 0x83, 0x03, 0x02, 0x06, 0x0C, 0x18, 0x30, 0x20, 0x40, 0xFF, 0x3C, + 0x46, 0xC3, 0xC3, 0x03, 0x06, 0x3C, 0x06, 0x03, 0x83, 0xC3, 0xC2, 0x3C, + 0x03, 0x01, 0xC0, 0x70, 0x3C, 0x1B, 0x04, 0xC3, 0x30, 0x8C, 0x63, 0x3F, + 0xF0, 0x30, 0x0C, 0x03, 0x00, 0x7F, 0x60, 0x60, 0x60, 0x7E, 0x63, 0x03, + 0x01, 0x01, 0xC1, 0x43, 0x63, 0x3C, 0x0C, 0x30, 0x60, 0x40, 0xDC, 0xE2, + 0xC3, 0xC1, 0xC1, 0xC1, 0x43, 0x62, 0x3C, 0xFF, 0x03, 0x03, 0x02, 0x06, + 0x04, 0x0C, 0x08, 0x18, 0x18, 0x30, 0x30, 0x60, 0x3C, 0x66, 0xC3, 0xC3, + 0xC3, 0x66, 0x3C, 0x42, 0xC3, 0xC3, 0xC3, 0x43, 0x3C, 0x3C, 0x66, 0xC2, + 0xC3, 0x83, 0xC3, 0xC3, 0x67, 0x3B, 0x02, 0x06, 0x0C, 0x38, 0xF0, 0x00, + 0xF0, 0x6C, 0x00, 0x00, 0x6D, 0x60, 0x02, 0x1D, 0xE7, 0x0E, 0x0F, 0x03, + 0x81, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xF0, 0x3C, 0x07, 0x07, 0x3C, + 0xF0, 0x80, 0x79, 0x8A, 0x18, 0x30, 0x61, 0x86, 0x18, 0x30, 0x00, 0x01, + 0x83, 0x00, 0x07, 0xC0, 0x60, 0xC3, 0x00, 0x98, 0x02, 0x43, 0xC5, 0x19, + 0x1C, 0x44, 0x63, 0x11, 0x88, 0x46, 0x23, 0x18, 0x8C, 0x73, 0x32, 0x47, + 0x71, 0x00, 0x02, 0x00, 0x0C, 0x10, 0x0F, 0xC0, 0x06, 0x00, 0x60, 0x0F, + 0x00, 0x90, 0x09, 0x01, 0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, + 0x66, 0x06, 0xC0, 0x30, 0xFE, 0x61, 0xB0, 0x78, 0x3C, 0x1E, 0x1B, 0xF9, + 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3F, 0xE0, 0x1F, 0x08, 0x66, 0x0B, 0x03, + 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x34, 0x08, 0x86, 0x1E, 0x00, + 0xFE, 0x30, 0xCC, 0x1B, 0x02, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, + 0x2C, 0x1B, 0x0C, 0xFE, 0x00, 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06, 0x03, + 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, 0xFF, 0xC0, 0xC0, 0xC0, + 0xC0, 0xC0, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x1F, 0x18, 0x66, + 0x0F, 0x03, 0xC0, 0x30, 0x0C, 0x03, 0x1F, 0xC0, 0xF0, 0x36, 0x0C, 0xC3, + 0x1F, 0x00, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1F, 0xFF, 0x01, + 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x40, 0xFF, 0xF8, 0x01, 0x80, 0xC0, + 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0xE0, 0xD0, 0x4C, 0x63, 0xE0, + 0xC1, 0xF0, 0x6C, 0x33, 0x18, 0xCC, 0x36, 0x0F, 0x83, 0xB0, 0xC6, 0x30, + 0xCC, 0x13, 0x06, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xE0, 0x1F, 0x01, 0xFC, 0x0F, 0xE0, + 0x5D, 0x06, 0xEC, 0x27, 0x23, 0x39, 0x99, 0xCC, 0x8E, 0x2C, 0x71, 0xC3, + 0x86, 0x1C, 0x30, 0x80, 0xC0, 0xE0, 0x78, 0x36, 0x1B, 0x0C, 0xC6, 0x23, + 0x19, 0x86, 0xC1, 0x60, 0xF0, 0x38, 0x18, 0x1E, 0x08, 0x66, 0x0F, 0x03, + 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x36, 0x0C, 0x86, 0x1F, 0x00, + 0xFE, 0x30, 0x6C, 0x0B, 0x02, 0xC0, 0xF0, 0x2C, 0x1B, 0xFC, 0xC0, 0x30, + 0x0C, 0x03, 0x00, 0xC0, 0x00, 0x1E, 0x18, 0x64, 0x0B, 0x03, 0xC0, 0xE0, + 0x38, 0x0E, 0x03, 0xC0, 0xF0, 0x34, 0x09, 0x86, 0x1F, 0x00, 0x70, 0x08, + 0xFE, 0x30, 0x6C, 0x1B, 0x06, 0xC1, 0xB0, 0x4F, 0xE3, 0x18, 0xC3, 0x30, + 0xCC, 0x1B, 0x06, 0xC0, 0xC0, 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x03, 0x00, + 0x70, 0x0E, 0x01, 0xE0, 0xF0, 0x6C, 0x33, 0xE0, 0xFF, 0xC1, 0x00, 0x40, + 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, + 0x00, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, + 0xF0, 0x34, 0x09, 0x86, 0x1E, 0x00, 0xC0, 0x68, 0x09, 0x83, 0x30, 0x62, + 0x08, 0x63, 0x0C, 0x60, 0x88, 0x1B, 0x03, 0x60, 0x28, 0x07, 0x00, 0x40, + 0x83, 0x07, 0x86, 0x0B, 0x0C, 0x36, 0x3C, 0x64, 0x68, 0xC8, 0x91, 0x19, + 0x36, 0x36, 0x6C, 0x28, 0x58, 0x50, 0xA0, 0xA1, 0xC1, 0xC1, 0x81, 0x03, + 0x00, 0xC1, 0xD0, 0x66, 0x30, 0xCC, 0x36, 0x07, 0x00, 0xC0, 0x70, 0x36, + 0x0C, 0xC6, 0x33, 0x06, 0xC0, 0xC0, 0xC0, 0xEC, 0x19, 0x86, 0x18, 0xC1, + 0x30, 0x36, 0x03, 0x80, 0x70, 0x04, 0x00, 0x80, 0x10, 0x02, 0x00, 0x40, + 0xFF, 0x81, 0x80, 0xC0, 0xC0, 0x60, 0x60, 0x60, 0x30, 0x30, 0x30, 0x18, + 0x18, 0x0F, 0xF8, 0xFC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, + 0xC0, 0x81, 0x81, 0x03, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x30, 0x20, 0x60, + 0x40, 0xE4, 0x92, 0x49, 0x24, 0x92, 0x49, 0x3C, 0x30, 0xC7, 0x92, 0xCF, + 0x30, 0xFF, 0xC9, 0x80, 0x3C, 0x66, 0xC2, 0x03, 0x3F, 0x43, 0xC3, 0xC3, + 0xC7, 0x7B, 0xC0, 0xC0, 0xC0, 0xC0, 0xDC, 0xE2, 0xC3, 0xC3, 0xC1, 0xC1, + 0xC3, 0xC3, 0xE2, 0xDC, 0x3C, 0x46, 0xC2, 0x81, 0x80, 0x80, 0x80, 0xC3, + 0x46, 0x3C, 0x03, 0x03, 0x03, 0x03, 0x3B, 0x67, 0xC3, 0xC3, 0x83, 0x83, + 0xC3, 0xC3, 0x67, 0x3B, 0x3C, 0x62, 0x43, 0xC3, 0xFF, 0xC0, 0xC0, 0xC2, + 0x63, 0x3E, 0x1C, 0xC3, 0x0C, 0xFC, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, + 0xC0, 0x3B, 0x67, 0xC3, 0xC3, 0x83, 0x83, 0xC3, 0xC3, 0x67, 0x3B, 0x03, + 0x83, 0x46, 0x3C, 0xC0, 0xC0, 0xC0, 0xC0, 0xDE, 0xE2, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xF0, 0xFF, 0xFF, 0xF0, 0x33, 0x00, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x3E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC7, 0xCC, + 0xC8, 0xD8, 0xF0, 0xD8, 0xCC, 0xC4, 0xC6, 0xC3, 0xFF, 0xFF, 0xFF, 0xF0, + 0xDE, 0x73, 0x8A, 0x2C, 0x30, 0xF0, 0xC3, 0xC3, 0x0F, 0x0C, 0x3C, 0x30, + 0xF0, 0xC3, 0xC3, 0x0F, 0x0C, 0x30, 0xDE, 0xE2, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC3, 0xC3, 0x3C, 0x66, 0xC3, 0x81, 0x81, 0x81, 0x81, 0xC3, + 0x66, 0x3C, 0xDC, 0xE6, 0xC3, 0xC3, 0xC1, 0xC1, 0xC3, 0xC3, 0xE6, 0xDC, + 0xC0, 0xC0, 0xC0, 0xC0, 0x3B, 0x67, 0xC3, 0x83, 0x83, 0x83, 0x83, 0xC3, + 0x67, 0x3B, 0x03, 0x03, 0x03, 0x03, 0xDF, 0x31, 0x8C, 0x63, 0x18, 0xC6, + 0x00, 0x7D, 0x8F, 0x1E, 0x06, 0x03, 0x81, 0xC1, 0xC6, 0xF8, 0x31, 0xBE, + 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x30, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0x47, 0x7B, 0xC1, 0xB1, 0x98, 0xC4, 0x43, 0x61, 0xB0, 0x50, + 0x28, 0x1C, 0x04, 0x00, 0x86, 0x1C, 0x63, 0xC6, 0x34, 0xF2, 0x49, 0x26, + 0x96, 0x79, 0xE3, 0x1C, 0x30, 0xC3, 0x0C, 0xE3, 0x31, 0x0D, 0x82, 0x81, + 0xC0, 0xE0, 0x50, 0x6C, 0x63, 0x71, 0xC0, 0xC1, 0xB1, 0x98, 0xC4, 0x43, + 0x61, 0xB0, 0x50, 0x38, 0x1C, 0x04, 0x02, 0x03, 0x01, 0x03, 0x00, 0xFE, + 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x30, 0xC1, 0xFC, 0x19, 0x88, 0xC6, 0x31, + 0x8C, 0xC3, 0x18, 0xC6, 0x30, 0x86, 0x18, 0xFF, 0xFE, 0xC3, 0x08, 0x63, + 0x18, 0xC6, 0x09, 0x8C, 0x63, 0x18, 0x8C, 0xC0, 0x78, 0x73, 0x38, 0x78 }; + +const GFXglyph Roboto_Regular9pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 4, 0, 1 }, // 0x20 ' ' + { 0, 2, 13, 5, 1, -12 }, // 0x21 '!' + { 4, 4, 4, 6, 1, -13 }, // 0x22 '"' + { 6, 10, 13, 11, 1, -12 }, // 0x23 '#' + { 23, 8, 17, 10, 1, -14 }, // 0x24 '$' + { 40, 11, 13, 13, 1, -12 }, // 0x25 '%' + { 58, 10, 13, 11, 1, -12 }, // 0x26 '&' + { 75, 1, 4, 3, 1, -13 }, // 0x27 ''' + { 76, 5, 18, 6, 1, -13 }, // 0x28 '(' + { 88, 5, 18, 6, 0, -13 }, // 0x29 ')' + { 100, 8, 8, 8, 0, -12 }, // 0x2A '*' + { 108, 8, 9, 10, 1, -10 }, // 0x2B '+' + { 117, 3, 4, 4, 0, -1 }, // 0x2C ',' + { 119, 5, 1, 5, 0, -5 }, // 0x2D '-' + { 120, 2, 2, 5, 1, -1 }, // 0x2E '.' + { 121, 7, 14, 7, 0, -12 }, // 0x2F '/' + { 134, 8, 13, 10, 1, -12 }, // 0x30 '0' + { 147, 4, 13, 10, 2, -12 }, // 0x31 '1' + { 154, 8, 13, 10, 1, -12 }, // 0x32 '2' + { 167, 8, 13, 10, 1, -12 }, // 0x33 '3' + { 180, 10, 13, 10, 0, -12 }, // 0x34 '4' + { 197, 8, 13, 10, 1, -12 }, // 0x35 '5' + { 210, 8, 13, 10, 1, -12 }, // 0x36 '6' + { 223, 8, 13, 10, 1, -12 }, // 0x37 '7' + { 236, 8, 13, 10, 1, -12 }, // 0x38 '8' + { 249, 8, 13, 10, 1, -12 }, // 0x39 '9' + { 262, 2, 10, 4, 1, -9 }, // 0x3A ':' + { 265, 3, 12, 4, 0, -9 }, // 0x3B ';' + { 270, 7, 8, 9, 1, -9 }, // 0x3C '<' + { 277, 8, 5, 10, 1, -8 }, // 0x3D '=' + { 282, 8, 8, 9, 1, -9 }, // 0x3E '>' + { 290, 7, 13, 9, 1, -12 }, // 0x3F '?' + { 302, 14, 17, 16, 1, -12 }, // 0x40 '@' + { 332, 12, 13, 12, 0, -12 }, // 0x41 'A' + { 352, 9, 13, 11, 1, -12 }, // 0x42 'B' + { 367, 10, 13, 12, 1, -12 }, // 0x43 'C' + { 384, 10, 13, 12, 1, -12 }, // 0x44 'D' + { 401, 9, 13, 10, 1, -12 }, // 0x45 'E' + { 416, 8, 13, 10, 1, -12 }, // 0x46 'F' + { 429, 10, 13, 12, 1, -12 }, // 0x47 'G' + { 446, 10, 13, 13, 1, -12 }, // 0x48 'H' + { 463, 1, 13, 5, 2, -12 }, // 0x49 'I' + { 465, 9, 13, 10, 0, -12 }, // 0x4A 'J' + { 480, 10, 13, 11, 1, -12 }, // 0x4B 'K' + { 497, 8, 13, 10, 1, -12 }, // 0x4C 'L' + { 510, 13, 13, 16, 1, -12 }, // 0x4D 'M' + { 532, 9, 13, 13, 2, -12 }, // 0x4E 'N' + { 547, 10, 13, 12, 1, -12 }, // 0x4F 'O' + { 564, 10, 13, 11, 1, -12 }, // 0x50 'P' + { 581, 10, 15, 12, 1, -12 }, // 0x51 'Q' + { 600, 10, 13, 11, 1, -12 }, // 0x52 'R' + { 617, 9, 13, 11, 1, -12 }, // 0x53 'S' + { 632, 10, 13, 11, 0, -12 }, // 0x54 'T' + { 649, 10, 13, 12, 1, -12 }, // 0x55 'U' + { 666, 11, 13, 11, 0, -12 }, // 0x56 'V' + { 684, 15, 13, 16, 1, -12 }, // 0x57 'W' + { 709, 10, 13, 11, 1, -12 }, // 0x58 'X' + { 726, 11, 13, 11, 0, -12 }, // 0x59 'Y' + { 744, 9, 13, 11, 1, -12 }, // 0x5A 'Z' + { 759, 4, 18, 5, 1, -14 }, // 0x5B '[' + { 768, 7, 14, 7, 0, -12 }, // 0x5C '\' + { 781, 3, 18, 5, 0, -14 }, // 0x5D ']' + { 788, 6, 6, 8, 1, -12 }, // 0x5E '^' + { 793, 8, 1, 8, 0, 1 }, // 0x5F '_' + { 794, 3, 3, 6, 1, -13 }, // 0x60 '`' + { 796, 8, 10, 10, 1, -9 }, // 0x61 'a' + { 806, 8, 14, 10, 1, -13 }, // 0x62 'b' + { 820, 8, 10, 9, 1, -9 }, // 0x63 'c' + { 830, 8, 14, 10, 1, -13 }, // 0x64 'd' + { 844, 8, 10, 10, 1, -9 }, // 0x65 'e' + { 854, 6, 14, 6, 0, -13 }, // 0x66 'f' + { 865, 8, 14, 10, 1, -9 }, // 0x67 'g' + { 879, 8, 14, 10, 1, -13 }, // 0x68 'h' + { 893, 2, 14, 4, 1, -13 }, // 0x69 'i' + { 897, 4, 18, 4, -1, -13 }, // 0x6A 'j' + { 906, 8, 14, 9, 1, -13 }, // 0x6B 'k' + { 920, 2, 14, 4, 1, -13 }, // 0x6C 'l' + { 924, 14, 10, 16, 1, -9 }, // 0x6D 'm' + { 942, 8, 10, 10, 1, -9 }, // 0x6E 'n' + { 952, 8, 10, 10, 1, -9 }, // 0x6F 'o' + { 962, 8, 14, 10, 1, -9 }, // 0x70 'p' + { 976, 8, 14, 10, 1, -9 }, // 0x71 'q' + { 990, 5, 10, 6, 1, -9 }, // 0x72 'r' + { 997, 7, 10, 9, 1, -9 }, // 0x73 's' + { 1006, 5, 12, 6, 0, -11 }, // 0x74 't' + { 1014, 8, 10, 10, 1, -9 }, // 0x75 'u' + { 1024, 9, 10, 9, 0, -9 }, // 0x76 'v' + { 1036, 12, 10, 14, 1, -9 }, // 0x77 'w' + { 1051, 9, 10, 9, 0, -9 }, // 0x78 'x' + { 1063, 9, 14, 9, 0, -9 }, // 0x79 'y' + { 1079, 7, 10, 9, 1, -9 }, // 0x7A 'z' + { 1088, 5, 17, 6, 1, -13 }, // 0x7B '{' + { 1099, 1, 15, 4, 2, -12 }, // 0x7C '|' + { 1101, 5, 17, 6, 0, -13 }, // 0x7D '}' + { 1112, 10, 3, 12, 1, -6 } }; // 0x7E '~' + +const GFXfont Roboto_Regular9pt7b PROGMEM = { + (uint8_t *)Roboto_Regular9pt7bBitmaps, + (GFXglyph *)Roboto_Regular9pt7bGlyphs, + 0x20, 0x7E, 21 }; + +// Approx. 1788 bytes diff --git a/examples/demo-menu/src/UTF8-fonts/customfonts.h b/examples/demo-menu/src/UTF8-fonts/customfonts.h new file mode 100644 index 0000000..4ab039f --- /dev/null +++ b/examples/demo-menu/src/UTF8-fonts/customfonts.h @@ -0,0 +1,11 @@ +#pragma once + +#include "Roboto-Bold.ttf.9pt.h" +#include "Roboto-Bold.ttf.9pt.RUS.h" + +#include "Roboto-Regular.ttf.9pt.h" +#include "Roboto-Regular.ttf.9pt.RUS.h" +#include "Roboto-Regular.ttf.12pt.h" +#include "Roboto-Regular.ttf.12pt.RUS.h" +#include "Roboto-Regular.ttf.24pt.h" +#include "Roboto-Regular.ttf.24pt.RUS.h" diff --git a/library.properties b/library.properties index 702a02f..941b9dc 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=ESP8266 emGUI -version=1.0.0 +version=2.0.0 author=romansavrulin , MikhailNatalenko maintainer=romansavrulin , MikhailNatalenko sentence=GUI for ESP8266 embedded devices