From b2c79497479cbbeb85bb0b88dcbfe61e30993210 Mon Sep 17 00:00:00 2001 From: Dan Fuhry Date: Tue, 3 May 2016 09:46:25 -0400 Subject: [PATCH] ScrollingText: code cleanup * Reduce buffer size and number of global variables * Use strlen_P to eliminate need for nul byte at end of string * Create font_char_t type to improve code readability and better separate glyph and width --- examples/ScrollingText/ScrollingText.ino | 120 +++-- examples/ScrollingText/font_bold.h | 591 +++++++++++++++++++---- examples/ScrollingText/font_thin.h | 591 +++++++++++++++++++---- 3 files changed, 1041 insertions(+), 261 deletions(-) diff --git a/examples/ScrollingText/ScrollingText.ino b/examples/ScrollingText/ScrollingText.ino index 20f4927..ba6c17c 100644 --- a/examples/ScrollingText/ScrollingText.ino +++ b/examples/ScrollingText/ScrollingText.ino @@ -1,6 +1,7 @@ /* * ScrollingText.ino - Scrolling text example using the Petduino library - * Copyright (c) 2015 Circuitbeard + * Copyright (c) 2016 Circuitbeard + * Portions contributed by Dan Fuhry * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -24,89 +25,86 @@ * OTHER DEALINGS IN THE SOFTWARE. */ -#include +#include #include #include #include "font_thin.h" +#define CHAR_WIDTH 8 #define CHAR_HEIGHT 8 -#define BUFFER_SIZE CHAR_HEIGHT*2 -#define SCROLL_SPEED 75 -#define MIN_CHAR 0x20 -#define MAX_CHAR 0x7f +#define TIMESTEP 35 -const unsigned char scrollText[] PROGMEM = {"HELLO WORLD #CIRCUITBEARD 2015 \0"}; // Make sure you have enough space on the end to fill the buffer and ensure all chars scroll across screen -unsigned long charBuffer[BUFFER_SIZE] = {0}; +const char displaystr[] PROGMEM = { "HELLO WORLD #CIRCUITBEARD 2016 " }; +font_char_t glyph; +byte buf[CHAR_HEIGHT]; + +int charptr, colptr; Petduino pet = Petduino(); void setup() { - - // Setup Petduino pet.begin(); - + charptr = colptr = 0; } void loop() { + int i; + int fontidx; + byte letter; - // Call pet loop pet.update(); + + // shift every current column one pixel to the left, blanking + // the rightmost column + for (i = 0; i < CHAR_HEIGHT; i++) { + buf[i] <<= 1; + } - // Scroll message - scrollMessage(scrollText); + // which character are we working on? + letter = pgm_read_byte_near(&(displaystr[charptr])); + fontidx = letter - FONT_CHAR_BASE; -} + // safety check, ensure we are not out of bounds + if (letter < FONT_CHAR_BASE || fontidx > sizeof(font)) { + // if out of bounds, print a space + letter = FONT_CHAR_BASE; + } + + // fetch glyph from program memory + for (i = 0; i < CHAR_HEIGHT; i++) { + glyph.glyph[i] = pgm_read_byte_near(&(font[fontidx].glyph[i])); + } + glyph.width = pgm_read_byte_near(&(font[fontidx].width)); -// Scroll Message -void scrollMessage(const unsigned char *messageString) { - int counter = 0; - int myChar=0; - do { - // read back a char - myChar = pgm_read_byte_near(messageString + counter); - if (myChar != 0){ - loadCharIntoBuffer(myChar); - } - counter++; + // kerning data may instruct us to draw a character with a width + // of 9 px, but that's beyond the glyph buffer width so the logic + // here exists to draw blank columns when out of bounds from the + // glyph width. + if ( colptr < CHAR_WIDTH ) { + for (i = 0; i < CHAR_HEIGHT; i++) { + // shift the current column all the way to the right, compute + // a "1" or "0" and set the rightmost column on the display + // as appropriate. + buf[i] |= (glyph.glyph[i] >> (CHAR_WIDTH-1 - colptr)) & 1; } - while (myChar != 0); -} - -// Load character into buffer -void loadCharIntoBuffer(int ascii){ - if (ascii >= MIN_CHAR && ascii <= MAX_CHAR){ - for (int a=0; a= glyph.width) { + colptr = 0; + ++charptr; } -} -// Display Buffer on screen -void drawBuffer(){ - for (int a=0; a - -const unsigned char font[] PROGMEM = { -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 5, // -0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 3, //! -0xD8, 0xD8, 0xD8, 0xD8, 0x00, 0x00, 0x00, 0x00, 6, //" -0x66, 0xFF, 0xFF, 0x66, 0x66, 0xFF, 0xFF, 0x66, 9, //# -0x7F, 0xFF, 0xD8, 0xFE, 0x7F, 0x1B, 0xFF, 0xFE, 9, //$ -0xE3, 0xE7, 0xEE, 0x1C, 0x38, 0x77, 0xE7, 0xC7, 9, //% -0x70, 0xF8, 0xD8, 0x73, 0xFF, 0xDE, 0xFF, 0x7B, 9, //& -0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 3, //' -0x70, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0x70, 5, //( -0xE0, 0xF0, 0x30, 0x30, 0x30, 0x30, 0xF0, 0xE0, 5, //) -0xDB, 0xFF, 0x7E, 0x3C, 0x3C, 0x7E, 0xFF, 0xDB, 9, //* -0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18, 9, //+ -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 3, //, -0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 9, //- -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 3, //. -0x03, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0xC0, 9, /// -0x7E, 0xFF, 0xC3, 0xDB, 0xDB, 0xC3, 0xFF, 0x7E, 9, //0 -0xE0, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 5, //1 -0xFE, 0xFF, 0x03, 0x7F, 0xFE, 0xC0, 0xFF, 0xFF, 9, //2 -0xFE, 0xFF, 0x03, 0x7E, 0x7F, 0x03, 0xFF, 0xFE, 9, //3 -0xC3, 0xC3, 0xC3, 0xFF, 0x7F, 0x03, 0x03, 0x03, 9, //4 -0xFF, 0xFF, 0xC0, 0xFE, 0xFF, 0x03, 0xFF, 0xFE, 9, //5 -0x7F, 0xFF, 0xC0, 0xFE, 0xFF, 0xC3, 0xFF, 0x7E, 9, //6 -0x7E, 0xFF, 0xC3, 0xC3, 0x03, 0x03, 0x03, 0x03, 9, //7 -0x7E, 0xFF, 0xC3, 0x7E, 0xFF, 0xC3, 0xFF, 0x7E, 9, //8 -0x7E, 0xFF, 0xC3, 0xFF, 0x7F, 0x03, 0xFF, 0xFE, 9, //9 -0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 3, //: -0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x40, 3, //; -0x18, 0x38, 0x70, 0xE0, 0xE0, 0x70, 0x38, 0x18, 6, //< -0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 9, //= -0xC0, 0xE0, 0x70, 0x38, 0x38, 0x70, 0xE0, 0xC0, 6, //> -0x7E, 0xFF, 0xC3, 0x1F, 0x1E, 0x00, 0x18, 0x18, 9, //? -0x7E, 0xFF, 0xC3, 0xDF, 0xDF, 0xDB, 0xFF, 0x7F, 9, //@ -0x7E, 0xFF, 0xC3, 0xFF, 0xFF, 0xC3, 0xC3, 0xC3, 9, //A -0xFE, 0xFF, 0xC3, 0xFE, 0xFF, 0xC3, 0xFF, 0xFE, 9, //B -0x7E, 0xFF, 0xC3, 0xC0, 0xC0, 0xC3, 0xFF, 0x7E, 9, //C -0xFE, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFE, 9, //D -0x7F, 0xFF, 0xC0, 0xFE, 0xFE, 0xC0, 0xFF, 0x7F, 9, //E -0x7F, 0xFF, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 9, //F -0x7F, 0xFF, 0xC0, 0xDF, 0xDF, 0xC3, 0xFF, 0x7F, 9, //G -0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC3, 0xC3, 0xC3, 9, //H -0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 3, //I -0x03, 0x03, 0x03, 0x03, 0xC3, 0xC3, 0xFF, 0x7E, 9, //J -0xC3, 0xC3, 0xC3, 0xFE, 0xFF, 0xC3, 0xC3, 0xC3, 9, //K -0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 9, //L -0x7E, 0xFF, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 9, //M -0x7E, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 9, //N -0x7E, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0x7E, 9, //O -0xFE, 0xFF, 0xC3, 0xFF, 0xFE, 0xC0, 0xC0, 0xC0, 9, //P -0x7E, 0xFF, 0xC3, 0xC3, 0xCF, 0xCF, 0xFF, 0x7F, 9, //Q -0xFE, 0xFF, 0xC3, 0xFF, 0xFE, 0xC3, 0xC3, 0xC3, 9, //R -0x7F, 0xFF, 0xC0, 0xFE, 0x7F, 0x03, 0xFF, 0xFE, 9, //S -0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 9, //T -0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0x7E, 9, //U -0xC3, 0xC3, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x18, 9, //V -0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xFF, 0x7E, 9, //W -0xC3, 0xC3, 0xC3, 0x7E, 0xFF, 0xC3, 0xC3, 0xC3, 9, //X -0xC3, 0xC3, 0xC3, 0xFF, 0x7E, 0x18, 0x18, 0x18, 9, //Y -0xFF, 0xFF, 0x03, 0x7F, 0xFE, 0xC0, 0xFF, 0xFF, 9, //Z -0xF0, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0xF0, 5, //[ -0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 9, //(Backslash) -0xF0, 0xF0, 0x30, 0x30, 0x30, 0x30, 0xF0, 0xF0, 5, //] -0x70, 0xF8, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 6, //^ -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 9, //_ -0xC0, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 4, //` -0x7E, 0xFF, 0xC3, 0xFF, 0xFF, 0xC3, 0xC3, 0xC3, 9, //a -0xFE, 0xFF, 0xC3, 0xFE, 0xFF, 0xC3, 0xFF, 0xFE, 9, //b -0x7E, 0xFF, 0xC3, 0xC0, 0xC0, 0xC3, 0xFF, 0x7E, 9, //c -0xFE, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFE, 9, //d -0x7F, 0xFF, 0xC0, 0xFE, 0xFE, 0xC0, 0xFF, 0x7F, 9, //e -0x7F, 0xFF, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 9, //f -0x7F, 0xFF, 0xC0, 0xDF, 0xDF, 0xC3, 0xFF, 0x7F, 9, //g -0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC3, 0xC3, 0xC3, 9, //h -0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 3, //i -0x03, 0x03, 0x03, 0x03, 0xC3, 0xC3, 0xFF, 0x7E, 9, //j -0xC3, 0xC3, 0xC3, 0xFE, 0xFF, 0xC3, 0xC3, 0xC3, 9, //k -0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 9, //l -0x7E, 0xFF, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 9, //m -0x7E, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 9, //n -0x7E, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0x7E, 9, //o -0xFE, 0xFF, 0xC3, 0xFF, 0xFE, 0xC0, 0xC0, 0xC0, 9, //p -0x7E, 0xFF, 0xC3, 0xC3, 0xCF, 0xCF, 0xFF, 0x7F, 9, //q -0xFE, 0xFF, 0xC3, 0xFF, 0xFE, 0xC3, 0xC3, 0xC3, 9, //r -0x7F, 0xFF, 0xC0, 0xFE, 0x7F, 0x03, 0xFF, 0xFE, 9, //s -0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 9, //t -0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0x7E, 9, //u -0xC3, 0xC3, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x18, 9, //v -0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xFF, 0x7E, 9, //w -0xC3, 0xC3, 0xC3, 0x7E, 0xFF, 0xC3, 0xC3, 0xC3, 9, //x -0xC3, 0xC3, 0xC3, 0xFF, 0x7E, 0x18, 0x18, 0x18, 9, //y -0xFF, 0xFF, 0x03, 0x7F, 0xFE, 0xC0, 0xFF, 0xFF, 9, //z -0x38, 0x78, 0x60, 0xE0, 0xE0, 0x60, 0x78, 0x38, 6, //{ -0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 3, //| -0xE0, 0xF0, 0x30, 0x38, 0x38, 0x30, 0xF0, 0xE0, 6, //} -0x76, 0xFE, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 8, //~ -0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 3 // -}; +#include + +#define FONT_CHAR_BASE 0x20 + +typedef struct { + byte glyph[8]; + uint8_t width; +} font_char_t; + +const font_char_t font[] PROGMEM = { + { + // space + .glyph = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + .width = 5, + }, + { + // ! + .glyph = { 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0 }, + .width = 3, + }, + { + // " + .glyph = { 0xD8, 0xD8, 0xD8, 0xD8, 0x00, 0x00, 0x00, 0x00 }, + .width = 6, + }, + { + // # + .glyph = { 0x66, 0xFF, 0xFF, 0x66, 0x66, 0xFF, 0xFF, 0x66 }, + .width = 9, + }, + { + // $ + .glyph = { 0x7F, 0xFF, 0xD8, 0xFE, 0x7F, 0x1B, 0xFF, 0xFE }, + .width = 9, + }, + { + // % + .glyph = { 0xE3, 0xE7, 0xEE, 0x1C, 0x38, 0x77, 0xE7, 0xC7 }, + .width = 9, + }, + { + // & + .glyph = { 0x70, 0xF8, 0xD8, 0x73, 0xFF, 0xDE, 0xFF, 0x7B }, + .width = 9, + }, + { + // ' + .glyph = { 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00 }, + .width = 3, + }, + { + // ( + .glyph = { 0x70, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0x70 }, + .width = 5, + }, + { + // ) + .glyph = { 0xE0, 0xF0, 0x30, 0x30, 0x30, 0x30, 0xF0, 0xE0 }, + .width = 5, + }, + { + // * + .glyph = { 0xDB, 0xFF, 0x7E, 0x3C, 0x3C, 0x7E, 0xFF, 0xDB }, + .width = 9, + }, + { + // + + .glyph = { 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18 }, + .width = 9, + }, + { + // , + .glyph = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0 }, + .width = 3, + }, + { + // - + .glyph = { 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00 }, + .width = 9, + }, + { + // . + .glyph = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0 }, + .width = 3, + }, + { + // / + .glyph = { 0x03, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0xC0 }, + .width = 9, + }, + { + // 0 + .glyph = { 0x7E, 0xFF, 0xC3, 0xDB, 0xDB, 0xC3, 0xFF, 0x7E }, + .width = 9, + }, + { + // 1 + .glyph = { 0xE0, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30 }, + .width = 5, + }, + { + // 2 + .glyph = { 0xFE, 0xFF, 0x03, 0x7F, 0xFE, 0xC0, 0xFF, 0xFF }, + .width = 9, + }, + { + // 3 + .glyph = { 0xFE, 0xFF, 0x03, 0x7E, 0x7F, 0x03, 0xFF, 0xFE }, + .width = 9, + }, + { + // 4 + .glyph = { 0xC3, 0xC3, 0xC3, 0xFF, 0x7F, 0x03, 0x03, 0x03 }, + .width = 9, + }, + { + // 5 + .glyph = { 0xFF, 0xFF, 0xC0, 0xFE, 0xFF, 0x03, 0xFF, 0xFE }, + .width = 9, + }, + { + // 6 + .glyph = { 0x7F, 0xFF, 0xC0, 0xFE, 0xFF, 0xC3, 0xFF, 0x7E }, + .width = 9, + }, + { + // 7 + .glyph = { 0x7E, 0xFF, 0xC3, 0xC3, 0x03, 0x03, 0x03, 0x03 }, + .width = 9, + }, + { + // 8 + .glyph = { 0x7E, 0xFF, 0xC3, 0x7E, 0xFF, 0xC3, 0xFF, 0x7E }, + .width = 9, + }, + { + // 9 + .glyph = { 0x7E, 0xFF, 0xC3, 0xFF, 0x7F, 0x03, 0xFF, 0xFE }, + .width = 9, + }, + { + // : + .glyph = { 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00 }, + .width = 3, + }, + { + // ; + .glyph = { 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x40 }, + .width = 3, + }, + { + // < + .glyph = { 0x18, 0x38, 0x70, 0xE0, 0xE0, 0x70, 0x38, 0x18 }, + .width = 6, + }, + { + // = + .glyph = { 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00 }, + .width = 9, + }, + { + // > + .glyph = { 0xC0, 0xE0, 0x70, 0x38, 0x38, 0x70, 0xE0, 0xC0 }, + .width = 6, + }, + { + // ? + .glyph = { 0x7E, 0xFF, 0xC3, 0x1F, 0x1E, 0x00, 0x18, 0x18 }, + .width = 9, + }, + { + // @ + .glyph = { 0x7E, 0xFF, 0xC3, 0xDF, 0xDF, 0xDB, 0xFF, 0x7F }, + .width = 9, + }, + { + // A + .glyph = { 0x7E, 0xFF, 0xC3, 0xFF, 0xFF, 0xC3, 0xC3, 0xC3 }, + .width = 9, + }, + { + // B + .glyph = { 0xFE, 0xFF, 0xC3, 0xFE, 0xFF, 0xC3, 0xFF, 0xFE }, + .width = 9, + }, + { + // C + .glyph = { 0x7E, 0xFF, 0xC3, 0xC0, 0xC0, 0xC3, 0xFF, 0x7E }, + .width = 9, + }, + { + // D + .glyph = { 0xFE, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFE }, + .width = 9, + }, + { + // E + .glyph = { 0x7F, 0xFF, 0xC0, 0xFE, 0xFE, 0xC0, 0xFF, 0x7F }, + .width = 9, + }, + { + // F + .glyph = { 0x7F, 0xFF, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0 }, + .width = 9, + }, + { + // G + .glyph = { 0x7F, 0xFF, 0xC0, 0xDF, 0xDF, 0xC3, 0xFF, 0x7F }, + .width = 9, + }, + { + // H + .glyph = { 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC3, 0xC3, 0xC3 }, + .width = 9, + }, + { + // I + .glyph = { 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0 }, + .width = 3, + }, + { + // J + .glyph = { 0x03, 0x03, 0x03, 0x03, 0xC3, 0xC3, 0xFF, 0x7E }, + .width = 9, + }, + { + // K + .glyph = { 0xC3, 0xC3, 0xC3, 0xFE, 0xFF, 0xC3, 0xC3, 0xC3 }, + .width = 9, + }, + { + // L + .glyph = { 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF }, + .width = 9, + }, + { + // M + .glyph = { 0x7E, 0xFF, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB }, + .width = 9, + }, + { + // N + .glyph = { 0x7E, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3 }, + .width = 9, + }, + { + // O + .glyph = { 0x7E, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0x7E }, + .width = 9, + }, + { + // P + .glyph = { 0xFE, 0xFF, 0xC3, 0xFF, 0xFE, 0xC0, 0xC0, 0xC0 }, + .width = 9, + }, + { + // Q + .glyph = { 0x7E, 0xFF, 0xC3, 0xC3, 0xCF, 0xCF, 0xFF, 0x7F }, + .width = 9, + }, + { + // R + .glyph = { 0xFE, 0xFF, 0xC3, 0xFF, 0xFE, 0xC3, 0xC3, 0xC3 }, + .width = 9, + }, + { + // S + .glyph = { 0x7F, 0xFF, 0xC0, 0xFE, 0x7F, 0x03, 0xFF, 0xFE }, + .width = 9, + }, + { + // T + .glyph = { 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, + .width = 9, + }, + { + // U + .glyph = { 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0x7E }, + .width = 9, + }, + { + // V + .glyph = { 0xC3, 0xC3, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x18 }, + .width = 9, + }, + { + // W + .glyph = { 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xFF, 0x7E }, + .width = 9, + }, + { + // X + .glyph = { 0xC3, 0xC3, 0xC3, 0x7E, 0xFF, 0xC3, 0xC3, 0xC3 }, + .width = 9, + }, + { + // Y + .glyph = { 0xC3, 0xC3, 0xC3, 0xFF, 0x7E, 0x18, 0x18, 0x18 }, + .width = 9, + }, + { + // Z + .glyph = { 0xFF, 0xFF, 0x03, 0x7F, 0xFE, 0xC0, 0xFF, 0xFF }, + .width = 9, + }, + { + // [ + .glyph = { 0xF0, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0xF0 }, + .width = 5, + }, + { + // (Backslash) + .glyph = { 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03 }, + .width = 9, + }, + { + // ] + .glyph = { 0xF0, 0xF0, 0x30, 0x30, 0x30, 0x30, 0xF0, 0xF0 }, + .width = 5, + }, + { + // ^ + .glyph = { 0x70, 0xF8, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00 }, + .width = 6, + }, + { + // _ + .glyph = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF }, + .width = 9, + }, + { + // ` + .glyph = { 0xC0, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00 }, + .width = 4, + }, + { + // a + .glyph = { 0x7E, 0xFF, 0xC3, 0xFF, 0xFF, 0xC3, 0xC3, 0xC3 }, + .width = 9, + }, + { + // b + .glyph = { 0xFE, 0xFF, 0xC3, 0xFE, 0xFF, 0xC3, 0xFF, 0xFE }, + .width = 9, + }, + { + // c + .glyph = { 0x7E, 0xFF, 0xC3, 0xC0, 0xC0, 0xC3, 0xFF, 0x7E }, + .width = 9, + }, + { + // d + .glyph = { 0xFE, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFE }, + .width = 9, + }, + { + // e + .glyph = { 0x7F, 0xFF, 0xC0, 0xFE, 0xFE, 0xC0, 0xFF, 0x7F }, + .width = 9, + }, + { + // f + .glyph = { 0x7F, 0xFF, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0 }, + .width = 9, + }, + { + // g + .glyph = { 0x7F, 0xFF, 0xC0, 0xDF, 0xDF, 0xC3, 0xFF, 0x7F }, + .width = 9, + }, + { + // h + .glyph = { 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC3, 0xC3, 0xC3 }, + .width = 9, + }, + { + // i + .glyph = { 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0 }, + .width = 3, + }, + { + // j + .glyph = { 0x03, 0x03, 0x03, 0x03, 0xC3, 0xC3, 0xFF, 0x7E }, + .width = 9, + }, + { + // k + .glyph = { 0xC3, 0xC3, 0xC3, 0xFE, 0xFF, 0xC3, 0xC3, 0xC3 }, + .width = 9, + }, + { + // l + .glyph = { 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF }, + .width = 9, + }, + { + // m + .glyph = { 0x7E, 0xFF, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB }, + .width = 9, + }, + { + // n + .glyph = { 0x7E, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3 }, + .width = 9, + }, + { + // o + .glyph = { 0x7E, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0x7E }, + .width = 9, + }, + { + // p + .glyph = { 0xFE, 0xFF, 0xC3, 0xFF, 0xFE, 0xC0, 0xC0, 0xC0 }, + .width = 9, + }, + { + // q + .glyph = { 0x7E, 0xFF, 0xC3, 0xC3, 0xCF, 0xCF, 0xFF, 0x7F }, + .width = 9, + }, + { + // r + .glyph = { 0xFE, 0xFF, 0xC3, 0xFF, 0xFE, 0xC3, 0xC3, 0xC3 }, + .width = 9, + }, + { + // s + .glyph = { 0x7F, 0xFF, 0xC0, 0xFE, 0x7F, 0x03, 0xFF, 0xFE }, + .width = 9, + }, + { + // t + .glyph = { 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, + .width = 9, + }, + { + // u + .glyph = { 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0x7E }, + .width = 9, + }, + { + // v + .glyph = { 0xC3, 0xC3, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x18 }, + .width = 9, + }, + { + // w + .glyph = { 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xFF, 0x7E }, + .width = 9, + }, + { + // x + .glyph = { 0xC3, 0xC3, 0xC3, 0x7E, 0xFF, 0xC3, 0xC3, 0xC3 }, + .width = 9, + }, + { + // y + .glyph = { 0xC3, 0xC3, 0xC3, 0xFF, 0x7E, 0x18, 0x18, 0x18 }, + .width = 9, + }, + { + // z + .glyph = { 0xFF, 0xFF, 0x03, 0x7F, 0xFE, 0xC0, 0xFF, 0xFF }, + .width = 9, + }, + { + // { + .glyph = { 0x38, 0x78, 0x60, 0xE0, 0xE0, 0x60, 0x78, 0x38 }, + .width = 6, + }, + { + // | + .glyph = { 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0 }, + .width = 3, + }, + { + // } + .glyph = { 0xE0, 0xF0, 0x30, 0x38, 0x38, 0x30, 0xF0, 0xE0 }, + .width = 6, + }, + { + // ~ + .glyph = { 0x76, 0xFE, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00 }, + .width = 8, + }, + { + // + .glyph = { 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00 }, + .width = 3, + }, +}; diff --git a/examples/ScrollingText/font_thin.h b/examples/ScrollingText/font_thin.h index 0704903..ab77599 100644 --- a/examples/ScrollingText/font_thin.h +++ b/examples/ScrollingText/font_thin.h @@ -1,100 +1,491 @@ -#include - -const unsigned char font[] PROGMEM = { -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 5, // -0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 2, //! -0xA0, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 4, //" -0x50, 0x50, 0xF8, 0x50, 0x50, 0xF8, 0x50, 0x50, 6, //# -0x20, 0x70, 0xA8, 0x70, 0x28, 0xA8, 0x70, 0x20, 6, //$ -0xC8, 0xD0, 0x10, 0x20, 0x20, 0x40, 0x58, 0x98, 6, //% -0x60, 0x90, 0xA0, 0x40, 0xA0, 0x90, 0x98, 0x60, 6, //& -0xC0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 3, //' -0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x20, 4, //( -0x80, 0x40, 0x20, 0x20, 0x20, 0x20, 0x40, 0x80, 4, //) -0x00, 0x00, 0x20, 0xA8, 0x70, 0xA8, 0x20, 0x00, 6, //* -0x00, 0x00, 0x20, 0x20, 0xF8, 0x20, 0x20, 0x00, 6, //+ -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 2, //, -0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 6, //- -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 2, //. -0x08, 0x08, 0x10, 0x20, 0x20, 0x40, 0x80, 0x80, 6, /// -0x70, 0x88, 0x98, 0xA8, 0xA8, 0xC8, 0x88, 0x70, 6, //0 -0x40, 0xC0, 0x40, 0x40, 0x40, 0x40, 0x40, 0xE0, 4, //1 -0x70, 0x88, 0x08, 0x30, 0x40, 0x80, 0x80, 0xF8, 6, //2 -0xF8, 0x10, 0x20, 0x10, 0x08, 0x88, 0x88, 0x70, 6, //3 -0x10, 0x30, 0x50, 0x90, 0x90, 0xF8, 0x10, 0x10, 6, //4 -0xF8, 0x80, 0xF0, 0x08, 0x08, 0x88, 0x88, 0x70, 6, //5 -0x70, 0x88, 0x80, 0xF0, 0x88, 0x88, 0x88, 0x70, 6, //6 -0xF8, 0x08, 0x10, 0x20, 0x40, 0x40, 0x40, 0x40, 6, //7 -0x70, 0x88, 0x88, 0x70, 0x88, 0x88, 0x88, 0x70, 6, //8 -0x70, 0x88, 0x88, 0x78, 0x08, 0x08, 0x10, 0x60, 6, //9 -0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 2, //: -0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 2, //; -0x10, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x10, 5, //< -0x00, 0x00, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x00, 6, //= -0x80, 0x40, 0x20, 0x10, 0x10, 0x20, 0x40, 0x80, 5, //> -0x70, 0x88, 0x08, 0x08, 0x30, 0x20, 0x00, 0x20, 6, //? -0x70, 0x88, 0xB8, 0xA8, 0xA8, 0xB8, 0x80, 0x70, 6, //@ -0x70, 0x88, 0x88, 0xF8, 0x88, 0x88, 0x88, 0x88, 6, //A -0xF0, 0x88, 0x88, 0xF0, 0x88, 0x88, 0x88, 0xF0, 6, //B -0x70, 0x88, 0x80, 0x80, 0x80, 0x80, 0x88, 0x70, 6, //C -0xF0, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xF0, 6, //D -0xF8, 0x80, 0x80, 0xF0, 0x80, 0x80, 0x80, 0xF8, 6, //E -0xF8, 0x80, 0x80, 0xF0, 0x80, 0x80, 0x80, 0x80, 6, //F -0x70, 0x88, 0x80, 0x80, 0xB8, 0x88, 0x88, 0x78, 6, //G -0x88, 0x88, 0x88, 0xF8, 0x88, 0x88, 0x88, 0x88, 6, //H -0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xE0, 4, //I -0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x90, 0x60, 6, //J -0x88, 0x90, 0xA0, 0xC0, 0xA0, 0x90, 0x88, 0x88, 6, //K -0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xF8, 6, //L -0x88, 0xD8, 0xA8, 0xA8, 0x88, 0x88, 0x88, 0x88, 6, //M -0x88, 0x88, 0xC8, 0xA8, 0x98, 0x88, 0x88, 0x88, 6, //N -0x70, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 6, //O -0xF0, 0x88, 0x88, 0x88, 0xF0, 0x80, 0x80, 0x80, 6, //P -0x70, 0x88, 0x88, 0x88, 0x88, 0xA8, 0x90, 0x68, 6, //Q -0xF0, 0x88, 0x88, 0xF0, 0xA0, 0x90, 0x88, 0x88, 6, //R -0x70, 0x88, 0x80, 0x70, 0x08, 0x08, 0x88, 0x70, 6, //S -0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 6, //T -0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 6, //U -0x88, 0x88, 0x88, 0x88, 0x88, 0x50, 0x50, 0x20, 6, //V -0x88, 0x88, 0x88, 0xA8, 0xA8, 0xA8, 0xA8, 0x50, 6, //W -0x88, 0x88, 0x50, 0x20, 0x50, 0x88, 0x88, 0x88, 6, //X -0x88, 0x88, 0x88, 0x50, 0x20, 0x20, 0x20, 0x20, 6, //Y -0xF8, 0x08, 0x10, 0x20, 0x20, 0x40, 0x80, 0xF8, 6, //Z -0xE0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xE0, 4, //[ -0x80, 0x80, 0x40, 0x20, 0x20, 0x10, 0x08, 0x08, 6, //(Backslash) -0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xE0, 4, //] -0x20, 0x50, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 6, //^ -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 6, //_ -0xC0, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 3, //` -0x00, 0x00, 0x00, 0x70, 0x08, 0x78, 0x88, 0x78, 6, //a -0x80, 0x80, 0x80, 0xF0, 0x88, 0x88, 0x88, 0xF0, 6, //b -0x00, 0x00, 0x00, 0x78, 0x80, 0x80, 0x80, 0x78, 6, //c -0x08, 0x08, 0x08, 0x78, 0x88, 0x88, 0x88, 0x78, 6, //d -0x00, 0x00, 0x00, 0x70, 0x88, 0xF8, 0x80, 0x70, 6, //e -0x30, 0x40, 0x40, 0xF0, 0x40, 0x40, 0x40, 0x40, 5, //f -0x00, 0x00, 0x00, 0x78, 0x88, 0x78, 0x08, 0x70, 6, //g -0x80, 0x80, 0x80, 0xB0, 0xC8, 0x88, 0x88, 0x88, 6, //h -0x00, 0x40, 0x00, 0xC0, 0x40, 0x40, 0x40, 0xE0, 4, //i -0x00, 0x10, 0x00, 0x30, 0x10, 0x10, 0x90, 0x60, 5, //j -0x80, 0x80, 0x80, 0x90, 0xA0, 0xC0, 0xA0, 0x90, 5, //k -0xC0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xE0, 4, //l -0x00, 0x00, 0x00, 0xF0, 0xA8, 0xA8, 0xA8, 0xA8, 6, //m -0x00, 0x00, 0x00, 0xA0, 0xD0, 0x90, 0x90, 0x90, 5, //n -0x00, 0x00, 0x00, 0x70, 0x88, 0x88, 0x88, 0x70, 6, //o -0x00, 0x00, 0x00, 0xF0, 0x88, 0xF0, 0x80, 0x80, 6, //p -0x00, 0x00, 0x00, 0x78, 0x88, 0x78, 0x08, 0x08, 6, //q -0x00, 0x00, 0x00, 0xB0, 0xC0, 0x80, 0x80, 0x80, 5, //r -0x00, 0x00, 0x00, 0x78, 0x80, 0x70, 0x08, 0xF0, 6, //s -0x00, 0x40, 0x40, 0xE0, 0x40, 0x40, 0x40, 0x20, 4, //t -0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x98, 0x68, 6, //u -0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x50, 0x20, 6, //v -0x00, 0x00, 0x00, 0x88, 0x88, 0xA8, 0xA8, 0x50, 6, //w -0x00, 0x00, 0x00, 0x88, 0x50, 0x20, 0x50, 0x88, 6, //x -0x00, 0x00, 0x00, 0x88, 0x88, 0x78, 0x08, 0x70, 6, //y -0x00, 0x00, 0x00, 0xF8, 0x10, 0x20, 0x40, 0xF8, 6, //z -0x30, 0x40, 0x40, 0x80, 0x40, 0x40, 0x40, 0x30, 5, //{ -0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 2, //| -0xC0, 0x20, 0x20, 0x10, 0x20, 0x20, 0x20, 0xC0, 5, //} -0x00, 0x00, 0x00, 0x50, 0xA8, 0x00, 0x00, 0x00, 6, //~ -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 5 // -}; +#include + +#define FONT_CHAR_BASE 0x20 + +typedef struct { + byte glyph[8]; + uint8_t width; +} font_char_t; + +const font_char_t font[] PROGMEM = { + { + // + .glyph = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + .width = 5, + }, + { + // ! + .glyph = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80 }, + .width = 2, + }, + { + // " + .glyph = { 0xA0, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00 }, + .width = 4, + }, + { + // # + .glyph = { 0x50, 0x50, 0xF8, 0x50, 0x50, 0xF8, 0x50, 0x50 }, + .width = 6, + }, + { + // $ + .glyph = { 0x20, 0x70, 0xA8, 0x70, 0x28, 0xA8, 0x70, 0x20 }, + .width = 6, + }, + { + // % + .glyph = { 0xC8, 0xD0, 0x10, 0x20, 0x20, 0x40, 0x58, 0x98 }, + .width = 6, + }, + { + // & + .glyph = { 0x60, 0x90, 0xA0, 0x40, 0xA0, 0x90, 0x98, 0x60 }, + .width = 6, + }, + { + // ' + .glyph = { 0xC0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00 }, + .width = 3, + }, + { + // ( + .glyph = { 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x20 }, + .width = 4, + }, + { + // ) + .glyph = { 0x80, 0x40, 0x20, 0x20, 0x20, 0x20, 0x40, 0x80 }, + .width = 4, + }, + { + // * + .glyph = { 0x00, 0x00, 0x20, 0xA8, 0x70, 0xA8, 0x20, 0x00 }, + .width = 6, + }, + { + // + + .glyph = { 0x00, 0x00, 0x20, 0x20, 0xF8, 0x20, 0x20, 0x00 }, + .width = 6, + }, + { + // , + .glyph = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80 }, + .width = 2, + }, + { + // - + .glyph = { 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00 }, + .width = 6, + }, + { + // . + .glyph = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 }, + .width = 2, + }, + { + // / + .glyph = { 0x08, 0x08, 0x10, 0x20, 0x20, 0x40, 0x80, 0x80 }, + .width = 6, + }, + { + // 0 + .glyph = { 0x70, 0x88, 0x98, 0xA8, 0xA8, 0xC8, 0x88, 0x70 }, + .width = 6, + }, + { + // 1 + .glyph = { 0x40, 0xC0, 0x40, 0x40, 0x40, 0x40, 0x40, 0xE0 }, + .width = 4, + }, + { + // 2 + .glyph = { 0x70, 0x88, 0x08, 0x30, 0x40, 0x80, 0x80, 0xF8 }, + .width = 6, + }, + { + // 3 + .glyph = { 0xF8, 0x10, 0x20, 0x10, 0x08, 0x88, 0x88, 0x70 }, + .width = 6, + }, + { + // 4 + .glyph = { 0x10, 0x30, 0x50, 0x90, 0x90, 0xF8, 0x10, 0x10 }, + .width = 6, + }, + { + // 5 + .glyph = { 0xF8, 0x80, 0xF0, 0x08, 0x08, 0x88, 0x88, 0x70 }, + .width = 6, + }, + { + // 6 + .glyph = { 0x70, 0x88, 0x80, 0xF0, 0x88, 0x88, 0x88, 0x70 }, + .width = 6, + }, + { + // 7 + .glyph = { 0xF8, 0x08, 0x10, 0x20, 0x40, 0x40, 0x40, 0x40 }, + .width = 6, + }, + { + // 8 + .glyph = { 0x70, 0x88, 0x88, 0x70, 0x88, 0x88, 0x88, 0x70 }, + .width = 6, + }, + { + // 9 + .glyph = { 0x70, 0x88, 0x88, 0x78, 0x08, 0x08, 0x10, 0x60 }, + .width = 6, + }, + { + // : + .glyph = { 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00 }, + .width = 2, + }, + { + // ; + .glyph = { 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80 }, + .width = 2, + }, + { + // < + .glyph = { 0x10, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x10 }, + .width = 5, + }, + { + // = + .glyph = { 0x00, 0x00, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x00 }, + .width = 6, + }, + { + // > + .glyph = { 0x80, 0x40, 0x20, 0x10, 0x10, 0x20, 0x40, 0x80 }, + .width = 5, + }, + { + // ? + .glyph = { 0x70, 0x88, 0x08, 0x08, 0x30, 0x20, 0x00, 0x20 }, + .width = 6, + }, + { + // @ + .glyph = { 0x70, 0x88, 0xB8, 0xA8, 0xA8, 0xB8, 0x80, 0x70 }, + .width = 6, + }, + { + // A + .glyph = { 0x70, 0x88, 0x88, 0xF8, 0x88, 0x88, 0x88, 0x88 }, + .width = 6, + }, + { + // B + .glyph = { 0xF0, 0x88, 0x88, 0xF0, 0x88, 0x88, 0x88, 0xF0 }, + .width = 6, + }, + { + // C + .glyph = { 0x70, 0x88, 0x80, 0x80, 0x80, 0x80, 0x88, 0x70 }, + .width = 6, + }, + { + // D + .glyph = { 0xF0, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xF0 }, + .width = 6, + }, + { + // E + .glyph = { 0xF8, 0x80, 0x80, 0xF0, 0x80, 0x80, 0x80, 0xF8 }, + .width = 6, + }, + { + // F + .glyph = { 0xF8, 0x80, 0x80, 0xF0, 0x80, 0x80, 0x80, 0x80 }, + .width = 6, + }, + { + // G + .glyph = { 0x70, 0x88, 0x80, 0x80, 0xB8, 0x88, 0x88, 0x78 }, + .width = 6, + }, + { + // H + .glyph = { 0x88, 0x88, 0x88, 0xF8, 0x88, 0x88, 0x88, 0x88 }, + .width = 6, + }, + { + // I + .glyph = { 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xE0 }, + .width = 4, + }, + { + // J + .glyph = { 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x90, 0x60 }, + .width = 6, + }, + { + // K + .glyph = { 0x88, 0x90, 0xA0, 0xC0, 0xA0, 0x90, 0x88, 0x88 }, + .width = 6, + }, + { + // L + .glyph = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xF8 }, + .width = 6, + }, + { + // M + .glyph = { 0x88, 0xD8, 0xA8, 0xA8, 0x88, 0x88, 0x88, 0x88 }, + .width = 6, + }, + { + // N + .glyph = { 0x88, 0x88, 0xC8, 0xA8, 0x98, 0x88, 0x88, 0x88 }, + .width = 6, + }, + { + // O + .glyph = { 0x70, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70 }, + .width = 6, + }, + { + // P + .glyph = { 0xF0, 0x88, 0x88, 0x88, 0xF0, 0x80, 0x80, 0x80 }, + .width = 6, + }, + { + // Q + .glyph = { 0x70, 0x88, 0x88, 0x88, 0x88, 0xA8, 0x90, 0x68 }, + .width = 6, + }, + { + // R + .glyph = { 0xF0, 0x88, 0x88, 0xF0, 0xA0, 0x90, 0x88, 0x88 }, + .width = 6, + }, + { + // S + .glyph = { 0x70, 0x88, 0x80, 0x70, 0x08, 0x08, 0x88, 0x70 }, + .width = 6, + }, + { + // T + .glyph = { 0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }, + .width = 6, + }, + { + // U + .glyph = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70 }, + .width = 6, + }, + { + // V + .glyph = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x50, 0x50, 0x20 }, + .width = 6, + }, + { + // W + .glyph = { 0x88, 0x88, 0x88, 0xA8, 0xA8, 0xA8, 0xA8, 0x50 }, + .width = 6, + }, + { + // X + .glyph = { 0x88, 0x88, 0x50, 0x20, 0x50, 0x88, 0x88, 0x88 }, + .width = 6, + }, + { + // Y + .glyph = { 0x88, 0x88, 0x88, 0x50, 0x20, 0x20, 0x20, 0x20 }, + .width = 6, + }, + { + // Z + .glyph = { 0xF8, 0x08, 0x10, 0x20, 0x20, 0x40, 0x80, 0xF8 }, + .width = 6, + }, + { + // [ + .glyph = { 0xE0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xE0 }, + .width = 4, + }, + { + // (Backslash) + .glyph = { 0x80, 0x80, 0x40, 0x20, 0x20, 0x10, 0x08, 0x08 }, + .width = 6, + }, + { + // ] + .glyph = { 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xE0 }, + .width = 4, + }, + { + // ^ + .glyph = { 0x20, 0x50, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00 }, + .width = 6, + }, + { + // _ + .glyph = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8 }, + .width = 6, + }, + { + // ` + .glyph = { 0xC0, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00 }, + .width = 3, + }, + { + // a + .glyph = { 0x00, 0x00, 0x00, 0x70, 0x08, 0x78, 0x88, 0x78 }, + .width = 6, + }, + { + // b + .glyph = { 0x80, 0x80, 0x80, 0xF0, 0x88, 0x88, 0x88, 0xF0 }, + .width = 6, + }, + { + // c + .glyph = { 0x00, 0x00, 0x00, 0x78, 0x80, 0x80, 0x80, 0x78 }, + .width = 6, + }, + { + // d + .glyph = { 0x08, 0x08, 0x08, 0x78, 0x88, 0x88, 0x88, 0x78 }, + .width = 6, + }, + { + // e + .glyph = { 0x00, 0x00, 0x00, 0x70, 0x88, 0xF8, 0x80, 0x70 }, + .width = 6, + }, + { + // f + .glyph = { 0x30, 0x40, 0x40, 0xF0, 0x40, 0x40, 0x40, 0x40 }, + .width = 5, + }, + { + // g + .glyph = { 0x00, 0x00, 0x00, 0x78, 0x88, 0x78, 0x08, 0x70 }, + .width = 6, + }, + { + // h + .glyph = { 0x80, 0x80, 0x80, 0xB0, 0xC8, 0x88, 0x88, 0x88 }, + .width = 6, + }, + { + // i + .glyph = { 0x00, 0x40, 0x00, 0xC0, 0x40, 0x40, 0x40, 0xE0 }, + .width = 4, + }, + { + // j + .glyph = { 0x00, 0x10, 0x00, 0x30, 0x10, 0x10, 0x90, 0x60 }, + .width = 5, + }, + { + // k + .glyph = { 0x80, 0x80, 0x80, 0x90, 0xA0, 0xC0, 0xA0, 0x90 }, + .width = 5, + }, + { + // l + .glyph = { 0xC0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xE0 }, + .width = 4, + }, + { + // m + .glyph = { 0x00, 0x00, 0x00, 0xF0, 0xA8, 0xA8, 0xA8, 0xA8 }, + .width = 6, + }, + { + // n + .glyph = { 0x00, 0x00, 0x00, 0xA0, 0xD0, 0x90, 0x90, 0x90 }, + .width = 5, + }, + { + // o + .glyph = { 0x00, 0x00, 0x00, 0x70, 0x88, 0x88, 0x88, 0x70 }, + .width = 6, + }, + { + // p + .glyph = { 0x00, 0x00, 0x00, 0xF0, 0x88, 0xF0, 0x80, 0x80 }, + .width = 6, + }, + { + // q + .glyph = { 0x00, 0x00, 0x00, 0x78, 0x88, 0x78, 0x08, 0x08 }, + .width = 6, + }, + { + // r + .glyph = { 0x00, 0x00, 0x00, 0xB0, 0xC0, 0x80, 0x80, 0x80 }, + .width = 5, + }, + { + // s + .glyph = { 0x00, 0x00, 0x00, 0x78, 0x80, 0x70, 0x08, 0xF0 }, + .width = 6, + }, + { + // t + .glyph = { 0x00, 0x40, 0x40, 0xE0, 0x40, 0x40, 0x40, 0x20 }, + .width = 4, + }, + { + // u + .glyph = { 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x98, 0x68 }, + .width = 6, + }, + { + // v + .glyph = { 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x50, 0x20 }, + .width = 6, + }, + { + // w + .glyph = { 0x00, 0x00, 0x00, 0x88, 0x88, 0xA8, 0xA8, 0x50 }, + .width = 6, + }, + { + // x + .glyph = { 0x00, 0x00, 0x00, 0x88, 0x50, 0x20, 0x50, 0x88 }, + .width = 6, + }, + { + // y + .glyph = { 0x00, 0x00, 0x00, 0x88, 0x88, 0x78, 0x08, 0x70 }, + .width = 6, + }, + { + // z + .glyph = { 0x00, 0x00, 0x00, 0xF8, 0x10, 0x20, 0x40, 0xF8 }, + .width = 6, + }, + { + // { + .glyph = { 0x30, 0x40, 0x40, 0x80, 0x40, 0x40, 0x40, 0x30 }, + .width = 5, + }, + { + // | + .glyph = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }, + .width = 2, + }, + { + // } + .glyph = { 0xC0, 0x20, 0x20, 0x10, 0x20, 0x20, 0x20, 0xC0 }, + .width = 5, + }, + { + // ~ + .glyph = { 0x00, 0x00, 0x00, 0x50, 0xA8, 0x00, 0x00, 0x00 }, + .width = 6, + }, + { + // + .glyph = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + .width = 5 + } +};