MBED Import of ADAFRUIT graphics library, BSD License

Dependents:   GP9002adafruit GP9002af_gray

Notes on this library

This was imported into MBED specifically to support the GP9002 VFD, as a result it has some "hacks" to optimize it for the GP9002.

Due to the GP9002 internal organization it draws vertical lines much faster than horizontal (assuming you orient it "landscape"). This is likely to be true of other displays that have bits in a byte arranged vertically, which seems a common theme in small GLCDs. Some types may have a more CGA-like memory organization and will draw faster horizontally.

On a vertical-organised display the graphics functions are often substantially faster if X and Y are exchanged, especially with the dot-write optimization. This is because vertical lines can be written byte-at-a-time with no need for read-modify-write, and even when individual bits are written a significant number will "land" in the byte previously written. In contrast a horizontal line would require changing one bit of each byte in turn, requiring a sequence of set-address,read,write operations for each dot in turn.

I've hacked this in the library. I forget exactly how but I believe I simply exchanged X with W in the code for drawing filled shapes.

I would like to come up with a more generic way to do this, such as having internal coordinates that are not defined as X and Y, then leaving it up to the display library to "wrap" them in the way that is best for that display.

I would like to apologize for abandoning this project, but the test harness still exists and I might return to it, though I'm more interested in TFT systems like the STM discovery now.

Fonts/TomThumb.h

Committer:
oliverb
Date:
2016-05-07
Revision:
0:3bf8ef959338

File content as of revision 0:3bf8ef959338:

/**
** The original 3x5 font is licensed under the 3-clause BSD license:
**
** Copyright 1999 Brian J. Swetland
** Copyright 1999 Vassilii Khachaturov
** Portions (of vt100.c/vt100.h) copyright Dan Marks
** 
** All rights reserved.
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions
** are met:
** 1. Redistributions of source code must retain the above copyright
**    notice, this list of conditions, and the following disclaimer.
** 2. 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.
** 3. The name of the authors may not be used to endorse or promote products
**    derived from this software without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
** 
** Modifications to Tom Thumb for improved readability are from Robey Pointer, 
** see:
** http://robey.lag.net/2010/01/23/tiny-monospace-font.html
** 
** The original author does not have any objection to relicensing of Robey 
** Pointer's modifications (in this file) in a more permissive license.  See 
** the discussion at the above blog, and also here:
** http://opengameart.org/forumtopic/how-to-submit-art-using-the-3-clause-bsd-license
**
** Feb 21, 2016: Conversion from Linux BDF --> Adafruit GFX font,
** with the help of this Python script:
** https://gist.github.com/skelliam/322d421f028545f16f6d
** William Skellenger (williamj@skellenger.net)
** Twitter: @skelliam
** 
*/

#define TOMTHUMB_USE_EXTENDED 0

const uint8_t TomThumbBitmaps[] PROGMEM = {
   0x00,                                /* 0x20 space */
   0x80, 0x80, 0x80, 0x00, 0x80,        /* 0x21 exclam */
   0xA0, 0xA0,                          /* 0x22 quotedbl */
   0xA0, 0xE0, 0xA0, 0xE0, 0xA0,        /* 0x23 numbersign */
   0x60, 0xC0, 0x60, 0xC0, 0x40,        /* 0x24 dollar */
   0x80, 0x20, 0x40, 0x80, 0x20,        /* 0x25 percent */
   0xC0, 0xC0, 0xE0, 0xA0, 0x60,        /* 0x26 ampersand */
   0x80, 0x80,                          /* 0x27 quotesingle */
   0x40, 0x80, 0x80, 0x80, 0x40,        /* 0x28 parenleft */
   0x80, 0x40, 0x40, 0x40, 0x80,        /* 0x29 parenright */
   0xA0, 0x40, 0xA0,                    /* 0x2A asterisk */
   0x40, 0xE0, 0x40,                    /* 0x2B plus */
   0x40, 0x80,                          /* 0x2C comma */
   0xE0,                                /* 0x2D hyphen */
   0x80,                                /* 0x2E period */
   0x20, 0x20, 0x40, 0x80, 0x80,        /* 0x2F slash */
   0x60, 0xA0, 0xA0, 0xA0, 0xC0,        /* 0x30 zero */
   0x40, 0xC0, 0x40, 0x40, 0x40,        /* 0x31 one */
   0xC0, 0x20, 0x40, 0x80, 0xE0,        /* 0x32 two */
   0xC0, 0x20, 0x40, 0x20, 0xC0,        /* 0x33 three */
   0xA0, 0xA0, 0xE0, 0x20, 0x20,        /* 0x34 four */
   0xE0, 0x80, 0xC0, 0x20, 0xC0,        /* 0x35 five */
   0x60, 0x80, 0xE0, 0xA0, 0xE0,        /* 0x36 six */
   0xE0, 0x20, 0x40, 0x80, 0x80,        /* 0x37 seven */
   0xE0, 0xA0, 0xE0, 0xA0, 0xE0,        /* 0x38 eight */
   0xE0, 0xA0, 0xE0, 0x20, 0xC0,        /* 0x39 nine */
   0x80, 0x00, 0x80,                    /* 0x3A colon */
   0x40, 0x00, 0x40, 0x80,              /* 0x3B semicolon */
   0x20, 0x40, 0x80, 0x40, 0x20,        /* 0x3C less */
   0xE0, 0x00, 0xE0,                    /* 0x3D equal */
   0x80, 0x40, 0x20, 0x40, 0x80,        /* 0x3E greater */
   0xE0, 0x20, 0x40, 0x00, 0x40,        /* 0x3F question */
   0x40, 0xA0, 0xE0, 0x80, 0x60,        /* 0x40 at */
   0x40, 0xA0, 0xE0, 0xA0, 0xA0,        /* 0x41 A */
   0xC0, 0xA0, 0xC0, 0xA0, 0xC0,        /* 0x42 B */
   0x60, 0x80, 0x80, 0x80, 0x60,        /* 0x43 C */
   0xC0, 0xA0, 0xA0, 0xA0, 0xC0,        /* 0x44 D */
   0xE0, 0x80, 0xE0, 0x80, 0xE0,        /* 0x45 E */
   0xE0, 0x80, 0xE0, 0x80, 0x80,        /* 0x46 F */
   0x60, 0x80, 0xE0, 0xA0, 0x60,        /* 0x47 G */
   0xA0, 0xA0, 0xE0, 0xA0, 0xA0,        /* 0x48 H */
   0xE0, 0x40, 0x40, 0x40, 0xE0,        /* 0x49 I */
   0x20, 0x20, 0x20, 0xA0, 0x40,        /* 0x4A J */
   0xA0, 0xA0, 0xC0, 0xA0, 0xA0,        /* 0x4B K */
   0x80, 0x80, 0x80, 0x80, 0xE0,        /* 0x4C L */
   0xA0, 0xE0, 0xE0, 0xA0, 0xA0,        /* 0x4D M */
   0xA0, 0xE0, 0xE0, 0xE0, 0xA0,        /* 0x4E N */
   0x40, 0xA0, 0xA0, 0xA0, 0x40,        /* 0x4F O */
   0xC0, 0xA0, 0xC0, 0x80, 0x80,        /* 0x50 P */
   0x40, 0xA0, 0xA0, 0xE0, 0x60,        /* 0x51 Q */
   0xC0, 0xA0, 0xE0, 0xC0, 0xA0,        /* 0x52 R */
   0x60, 0x80, 0x40, 0x20, 0xC0,        /* 0x53 S */
   0xE0, 0x40, 0x40, 0x40, 0x40,        /* 0x54 T */
   0xA0, 0xA0, 0xA0, 0xA0, 0x60,        /* 0x55 U */
   0xA0, 0xA0, 0xA0, 0x40, 0x40,        /* 0x56 V */
   0xA0, 0xA0, 0xE0, 0xE0, 0xA0,        /* 0x57 W */
   0xA0, 0xA0, 0x40, 0xA0, 0xA0,        /* 0x58 X */
   0xA0, 0xA0, 0x40, 0x40, 0x40,        /* 0x59 Y */
   0xE0, 0x20, 0x40, 0x80, 0xE0,        /* 0x5A Z */
   0xE0, 0x80, 0x80, 0x80, 0xE0,        /* 0x5B bracketleft */
   0x80, 0x40, 0x20,                    /* 0x5C backslash */
   0xE0, 0x20, 0x20, 0x20, 0xE0,        /* 0x5D bracketright */
   0x40, 0xA0,                          /* 0x5E asciicircum */
   0xE0,                                /* 0x5F underscore */
   0x80, 0x40,                          /* 0x60 grave */
   0xC0, 0x60, 0xA0, 0xE0,              /* 0x61 a */
   0x80, 0xC0, 0xA0, 0xA0, 0xC0,        /* 0x62 b */
   0x60, 0x80, 0x80, 0x60,              /* 0x63 c */
   0x20, 0x60, 0xA0, 0xA0, 0x60,        /* 0x64 d */
   0x60, 0xA0, 0xC0, 0x60,              /* 0x65 e */
   0x20, 0x40, 0xE0, 0x40, 0x40,        /* 0x66 f */
   0x60, 0xA0, 0xE0, 0x20, 0x40,        /* 0x67 g */
   0x80, 0xC0, 0xA0, 0xA0, 0xA0,        /* 0x68 h */
   0x80, 0x00, 0x80, 0x80, 0x80,        /* 0x69 i */
   0x20, 0x00, 0x20, 0x20, 0xA0, 0x40,  /* 0x6A j */
   0x80, 0xA0, 0xC0, 0xC0, 0xA0,        /* 0x6B k */
   0xC0, 0x40, 0x40, 0x40, 0xE0,        /* 0x6C l */
   0xE0, 0xE0, 0xE0, 0xA0,              /* 0x6D m */
   0xC0, 0xA0, 0xA0, 0xA0,              /* 0x6E n */
   0x40, 0xA0, 0xA0, 0x40,              /* 0x6F o */
   0xC0, 0xA0, 0xA0, 0xC0, 0x80,        /* 0x70 p */
   0x60, 0xA0, 0xA0, 0x60, 0x20,        /* 0x71 q */
   0x60, 0x80, 0x80, 0x80,              /* 0x72 r */
   0x60, 0xC0, 0x60, 0xC0,              /* 0x73 s */
   0x40, 0xE0, 0x40, 0x40, 0x60,        /* 0x74 t */
   0xA0, 0xA0, 0xA0, 0x60,              /* 0x75 u */
   0xA0, 0xA0, 0xE0, 0x40,              /* 0x76 v */
   0xA0, 0xE0, 0xE0, 0xE0,              /* 0x77 w */
   0xA0, 0x40, 0x40, 0xA0,              /* 0x78 x */
   0xA0, 0xA0, 0x60, 0x20, 0x40,        /* 0x79 y */
   0xE0, 0x60, 0xC0, 0xE0,              /* 0x7A z */
   0x60, 0x40, 0x80, 0x40, 0x60,        /* 0x7B braceleft */
   0x80, 0x80, 0x00, 0x80, 0x80,        /* 0x7C bar */
   0xC0, 0x40, 0x20, 0x40, 0xC0,        /* 0x7D braceright */
   0x60, 0xC0,                          /* 0x7E asciitilde */
#if (TOMTHUMB_USE_EXTENDED)
   0x80, 0x00, 0x80, 0x80, 0x80,        /* 0xA1 exclamdown */
   0x40, 0xE0, 0x80, 0xE0, 0x40,        /* 0xA2 cent */
   0x60, 0x40, 0xE0, 0x40, 0xE0,        /* 0xA3 sterling */
   0xA0, 0x40, 0xE0, 0x40, 0xA0,        /* 0xA4 currency */
   0xA0, 0xA0, 0x40, 0xE0, 0x40,        /* 0xA5 yen */
   0x80, 0x80, 0x00, 0x80, 0x80,        /* 0xA6 brokenbar */
   0x60, 0x40, 0xA0, 0x40, 0xC0,        /* 0xA7 section */
   0xA0,                                /* 0xA8 dieresis */
   0x60, 0x80, 0x60,                    /* 0xA9 copyright */
   0x60, 0xA0, 0xE0, 0x00, 0xE0,        /* 0xAA ordfeminine */
   0x40, 0x80, 0x40,                    /* 0xAB guillemotleft */
   0xE0, 0x20,                          /* 0xAC logicalnot */
   0xC0,                                /* 0xAD softhyphen */
   0xC0, 0xC0, 0xA0,                    /* 0xAE registered */
   0xE0,                                /* 0xAF macron */
   0x40, 0xA0, 0x40,                    /* 0xB0 degree */
   0x40, 0xE0, 0x40, 0x00, 0xE0,        /* 0xB1 plusminus */
   0xC0, 0x40, 0x60,                    /* 0xB2 twosuperior */
   0xE0, 0x60, 0xE0,                    /* 0xB3 threesuperior */
   0x40, 0x80,                          /* 0xB4 acute */
   0xA0, 0xA0, 0xA0, 0xC0, 0x80,        /* 0xB5 mu */
   0x60, 0xA0, 0x60, 0x60, 0x60,        /* 0xB6 paragraph */
   0xE0, 0xE0, 0xE0,                    /* 0xB7 periodcentered */
   0x40, 0x20, 0xC0,                    /* 0xB8 cedilla */
   0x80, 0x80, 0x80,                    /* 0xB9 onesuperior */
   0x40, 0xA0, 0x40, 0x00, 0xE0,        /* 0xBA ordmasculine */
   0x80, 0x40, 0x80,                    /* 0xBB guillemotright */
   0x80, 0x80, 0x00, 0x60, 0x20,        /* 0xBC onequarter */
   0x80, 0x80, 0x00, 0xC0, 0x60,        /* 0xBD onehalf */
   0xC0, 0xC0, 0x00, 0x60, 0x20,        /* 0xBE threequarters */
   0x40, 0x00, 0x40, 0x80, 0xE0,        /* 0xBF questiondown */
   0x40, 0x20, 0x40, 0xE0, 0xA0,        /* 0xC0 Agrave */
   0x40, 0x80, 0x40, 0xE0, 0xA0,        /* 0xC1 Aacute */
   0xE0, 0x00, 0x40, 0xE0, 0xA0,        /* 0xC2 Acircumflex */
   0x60, 0xC0, 0x40, 0xE0, 0xA0,        /* 0xC3 Atilde */
   0xA0, 0x40, 0xA0, 0xE0, 0xA0,        /* 0xC4 Adieresis */
   0xC0, 0xC0, 0xA0, 0xE0, 0xA0,        /* 0xC5 Aring */
   0x60, 0xC0, 0xE0, 0xC0, 0xE0,        /* 0xC6 AE */
   0x60, 0x80, 0x80, 0x60, 0x20, 0x40,  /* 0xC7 Ccedilla */
   0x40, 0x20, 0xE0, 0xC0, 0xE0,        /* 0xC8 Egrave */
   0x40, 0x80, 0xE0, 0xC0, 0xE0,        /* 0xC9 Eacute */
   0xE0, 0x00, 0xE0, 0xC0, 0xE0,        /* 0xCA Ecircumflex */
   0xA0, 0x00, 0xE0, 0xC0, 0xE0,        /* 0xCB Edieresis */
   0x40, 0x20, 0xE0, 0x40, 0xE0,        /* 0xCC Igrave */
   0x40, 0x80, 0xE0, 0x40, 0xE0,        /* 0xCD Iacute */
   0xE0, 0x00, 0xE0, 0x40, 0xE0,        /* 0xCE Icircumflex */
   0xA0, 0x00, 0xE0, 0x40, 0xE0,        /* 0xCF Idieresis */
   0xC0, 0xA0, 0xE0, 0xA0, 0xC0,        /* 0xD0 Eth */
   0xC0, 0x60, 0xA0, 0xE0, 0xA0,        /* 0xD1 Ntilde */
   0x40, 0x20, 0xE0, 0xA0, 0xE0,        /* 0xD2 Ograve */
   0x40, 0x80, 0xE0, 0xA0, 0xE0,        /* 0xD3 Oacute */
   0xE0, 0x00, 0xE0, 0xA0, 0xE0,        /* 0xD4 Ocircumflex */
   0xC0, 0x60, 0xE0, 0xA0, 0xE0,        /* 0xD5 Otilde */
   0xA0, 0x00, 0xE0, 0xA0, 0xE0,        /* 0xD6 Odieresis */
   0xA0, 0x40, 0xA0,                    /* 0xD7 multiply */
   0x60, 0xA0, 0xE0, 0xA0, 0xC0,        /* 0xD8 Oslash */
   0x80, 0x40, 0xA0, 0xA0, 0xE0,        /* 0xD9 Ugrave */
   0x20, 0x40, 0xA0, 0xA0, 0xE0,        /* 0xDA Uacute */
   0xE0, 0x00, 0xA0, 0xA0, 0xE0,        /* 0xDB Ucircumflex */
   0xA0, 0x00, 0xA0, 0xA0, 0xE0,        /* 0xDC Udieresis */
   0x20, 0x40, 0xA0, 0xE0, 0x40,        /* 0xDD Yacute */
   0x80, 0xE0, 0xA0, 0xE0, 0x80,        /* 0xDE Thorn */
   0x60, 0xA0, 0xC0, 0xA0, 0xC0, 0x80,  /* 0xDF germandbls */
   0x40, 0x20, 0x60, 0xA0, 0xE0,        /* 0xE0 agrave */
   0x40, 0x80, 0x60, 0xA0, 0xE0,        /* 0xE1 aacute */
   0xE0, 0x00, 0x60, 0xA0, 0xE0,        /* 0xE2 acircumflex */
   0x60, 0xC0, 0x60, 0xA0, 0xE0,        /* 0xE3 atilde */
   0xA0, 0x00, 0x60, 0xA0, 0xE0,        /* 0xE4 adieresis */
   0x60, 0x60, 0x60, 0xA0, 0xE0,        /* 0xE5 aring */
   0x60, 0xE0, 0xE0, 0xC0,              /* 0xE6 ae */
   0x60, 0x80, 0x60, 0x20, 0x40,        /* 0xE7 ccedilla */
   0x40, 0x20, 0x60, 0xE0, 0x60,        /* 0xE8 egrave */
   0x40, 0x80, 0x60, 0xE0, 0x60,        /* 0xE9 eacute */
   0xE0, 0x00, 0x60, 0xE0, 0x60,        /* 0xEA ecircumflex */
   0xA0, 0x00, 0x60, 0xE0, 0x60,        /* 0xEB edieresis */
   0x80, 0x40, 0x80, 0x80, 0x80,        /* 0xEC igrave */
   0x40, 0x80, 0x40, 0x40, 0x40,        /* 0xED iacute */
   0xE0, 0x00, 0x40, 0x40, 0x40,        /* 0xEE icircumflex */
   0xA0, 0x00, 0x40, 0x40, 0x40,        /* 0xEF idieresis */
   0x60, 0xC0, 0x60, 0xA0, 0x60,        /* 0xF0 eth */
   0xC0, 0x60, 0xC0, 0xA0, 0xA0,        /* 0xF1 ntilde */
   0x40, 0x20, 0x40, 0xA0, 0x40,        /* 0xF2 ograve */
   0x40, 0x80, 0x40, 0xA0, 0x40,        /* 0xF3 oacute */
   0xE0, 0x00, 0x40, 0xA0, 0x40,        /* 0xF4 ocircumflex */
   0xC0, 0x60, 0x40, 0xA0, 0x40,        /* 0xF5 otilde */
   0xA0, 0x00, 0x40, 0xA0, 0x40,        /* 0xF6 odieresis */
   0x40, 0x00, 0xE0, 0x00, 0x40,        /* 0xF7 divide */
   0x60, 0xE0, 0xA0, 0xC0,              /* 0xF8 oslash */
   0x80, 0x40, 0xA0, 0xA0, 0x60,        /* 0xF9 ugrave */
   0x20, 0x40, 0xA0, 0xA0, 0x60,        /* 0xFA uacute */
   0xE0, 0x00, 0xA0, 0xA0, 0x60,        /* 0xFB ucircumflex */
   0xA0, 0x00, 0xA0, 0xA0, 0x60,        /* 0xFC udieresis */
   0x20, 0x40, 0xA0, 0x60, 0x20, 0x40,  /* 0xFD yacute */
   0x80, 0xC0, 0xA0, 0xC0, 0x80,        /* 0xFE thorn */
   0xA0, 0x00, 0xA0, 0x60, 0x20, 0x40,  /* 0xFF ydieresis */
   0x00,                                /* 0x11D gcircumflex */
   0x60, 0xC0, 0xE0, 0xC0, 0x60,        /* 0x152 OE */
   0x60, 0xE0, 0xC0, 0xE0,              /* 0x153 oe */
   0xA0, 0x60, 0xC0, 0x60, 0xC0,        /* 0x160 Scaron */
   0xA0, 0x60, 0xC0, 0x60, 0xC0,        /* 0x161 scaron */
   0xA0, 0x00, 0xA0, 0x40, 0x40,        /* 0x178 Ydieresis */
   0xA0, 0xE0, 0x60, 0xC0, 0xE0,        /* 0x17D Zcaron */
   0xA0, 0xE0, 0x60, 0xC0, 0xE0,        /* 0x17E zcaron */
   0x00,                                /* 0xEA4 uni0EA4 */
   0x00,                                /* 0x13A0 uni13A0 */
   0x80,                                /* 0x2022 bullet */
   0xA0,                                /* 0x2026 ellipsis */
   0x60, 0xE0, 0xE0, 0xC0, 0x60,        /* 0x20AC Euro */
   0xE0, 0xA0, 0xA0, 0xA0, 0xE0,        /* 0xFFFD uniFFFD */
#endif /* (TOMTHUMB_USE_EXTENDED)  */
  };


/* {offset, width, height, advance cursor, x offset, y offset} */
const GFXglyph TomThumbGlyphs[] PROGMEM = {
   { 0, 8, 1, 2, 0, -5 },    /* 0x20 space */
   { 1, 8, 5, 2, 0, -5 },    /* 0x21 exclam */
   { 6, 8, 2, 4, 0, -5 },    /* 0x22 quotedbl */
   { 8, 8, 5, 4, 0, -5 },    /* 0x23 numbersign */
   { 13, 8, 5, 4, 0, -5 },   /* 0x24 dollar */
   { 18, 8, 5, 4, 0, -5 },   /* 0x25 percent */
   { 23, 8, 5, 4, 0, -5 },   /* 0x26 ampersand */
   { 28, 8, 2, 2, 0, -5 },   /* 0x27 quotesingle */
   { 30, 8, 5, 3, 0, -5 },   /* 0x28 parenleft */
   { 35, 8, 5, 3, 0, -5 },   /* 0x29 parenright */
   { 40, 8, 3, 4, 0, -5 },   /* 0x2A asterisk */
   { 43, 8, 3, 4, 0, -4 },   /* 0x2B plus */
   { 46, 8, 2, 3, 0, -2 },   /* 0x2C comma */
   { 48, 8, 1, 4, 0, -3 },   /* 0x2D hyphen */
   { 49, 8, 1, 2, 0, -1 },   /* 0x2E period */
   { 50, 8, 5, 4, 0, -5 },   /* 0x2F slash */
   { 55, 8, 5, 4, 0, -5 },   /* 0x30 zero */
   { 60, 8, 5, 3, 0, -5 },   /* 0x31 one */
   { 65, 8, 5, 4, 0, -5 },   /* 0x32 two */
   { 70, 8, 5, 4, 0, -5 },   /* 0x33 three */
   { 75, 8, 5, 4, 0, -5 },   /* 0x34 four */
   { 80, 8, 5, 4, 0, -5 },   /* 0x35 five */
   { 85, 8, 5, 4, 0, -5 },   /* 0x36 six */
   { 90, 8, 5, 4, 0, -5 },   /* 0x37 seven */
   { 95, 8, 5, 4, 0, -5 },   /* 0x38 eight */
   { 100, 8, 5, 4, 0, -5 },  /* 0x39 nine */
   { 105, 8, 3, 2, 0, -4 },  /* 0x3A colon */
   { 108, 8, 4, 3, 0, -4 },  /* 0x3B semicolon */
   { 112, 8, 5, 4, 0, -5 },  /* 0x3C less */
   { 117, 8, 3, 4, 0, -4 },  /* 0x3D equal */
   { 120, 8, 5, 4, 0, -5 },  /* 0x3E greater */
   { 125, 8, 5, 4, 0, -5 },  /* 0x3F question */
   { 130, 8, 5, 4, 0, -5 },  /* 0x40 at */
   { 135, 8, 5, 4, 0, -5 },  /* 0x41 A */
   { 140, 8, 5, 4, 0, -5 },  /* 0x42 B */
   { 145, 8, 5, 4, 0, -5 },  /* 0x43 C */
   { 150, 8, 5, 4, 0, -5 },  /* 0x44 D */
   { 155, 8, 5, 4, 0, -5 },  /* 0x45 E */
   { 160, 8, 5, 4, 0, -5 },  /* 0x46 F */
   { 165, 8, 5, 4, 0, -5 },  /* 0x47 G */
   { 170, 8, 5, 4, 0, -5 },  /* 0x48 H */
   { 175, 8, 5, 4, 0, -5 },  /* 0x49 I */
   { 180, 8, 5, 4, 0, -5 },  /* 0x4A J */
   { 185, 8, 5, 4, 0, -5 },  /* 0x4B K */
   { 190, 8, 5, 4, 0, -5 },  /* 0x4C L */
   { 195, 8, 5, 4, 0, -5 },  /* 0x4D M */
   { 200, 8, 5, 4, 0, -5 },  /* 0x4E N */
   { 205, 8, 5, 4, 0, -5 },  /* 0x4F O */
   { 210, 8, 5, 4, 0, -5 },  /* 0x50 P */
   { 215, 8, 5, 4, 0, -5 },  /* 0x51 Q */
   { 220, 8, 5, 4, 0, -5 },  /* 0x52 R */
   { 225, 8, 5, 4, 0, -5 },  /* 0x53 S */
   { 230, 8, 5, 4, 0, -5 },  /* 0x54 T */
   { 235, 8, 5, 4, 0, -5 },  /* 0x55 U */
   { 240, 8, 5, 4, 0, -5 },  /* 0x56 V */
   { 245, 8, 5, 4, 0, -5 },  /* 0x57 W */
   { 250, 8, 5, 4, 0, -5 },  /* 0x58 X */
   { 255, 8, 5, 4, 0, -5 },  /* 0x59 Y */
   { 260, 8, 5, 4, 0, -5 },  /* 0x5A Z */
   { 265, 8, 5, 4, 0, -5 },  /* 0x5B bracketleft */
   { 270, 8, 3, 4, 0, -4 },  /* 0x5C backslash */
   { 273, 8, 5, 4, 0, -5 },  /* 0x5D bracketright */
   { 278, 8, 2, 4, 0, -5 },  /* 0x5E asciicircum */
   { 280, 8, 1, 4, 0, -1 },  /* 0x5F underscore */
   { 281, 8, 2, 3, 0, -5 },  /* 0x60 grave */
   { 283, 8, 4, 4, 0, -4 },  /* 0x61 a */
   { 287, 8, 5, 4, 0, -5 },  /* 0x62 b */
   { 292, 8, 4, 4, 0, -4 },  /* 0x63 c */
   { 296, 8, 5, 4, 0, -5 },  /* 0x64 d */
   { 301, 8, 4, 4, 0, -4 },  /* 0x65 e */
   { 305, 8, 5, 4, 0, -5 },  /* 0x66 f */
   { 310, 8, 5, 4, 0, -4 },  /* 0x67 g */
   { 315, 8, 5, 4, 0, -5 },  /* 0x68 h */
   { 320, 8, 5, 2, 0, -5 },  /* 0x69 i */
   { 325, 8, 6, 4, 0, -5 },  /* 0x6A j */
   { 331, 8, 5, 4, 0, -5 },  /* 0x6B k */
   { 336, 8, 5, 4, 0, -5 },  /* 0x6C l */
   { 341, 8, 4, 4, 0, -4 },  /* 0x6D m */
   { 345, 8, 4, 4, 0, -4 },  /* 0x6E n */
   { 349, 8, 4, 4, 0, -4 },  /* 0x6F o */
   { 353, 8, 5, 4, 0, -4 },  /* 0x70 p */
   { 358, 8, 5, 4, 0, -4 },  /* 0x71 q */
   { 363, 8, 4, 4, 0, -4 },  /* 0x72 r */
   { 367, 8, 4, 4, 0, -4 },  /* 0x73 s */
   { 371, 8, 5, 4, 0, -5 },  /* 0x74 t */
   { 376, 8, 4, 4, 0, -4 },  /* 0x75 u */
   { 380, 8, 4, 4, 0, -4 },  /* 0x76 v */
   { 384, 8, 4, 4, 0, -4 },  /* 0x77 w */
   { 388, 8, 4, 4, 0, -4 },  /* 0x78 x */
   { 392, 8, 5, 4, 0, -4 },  /* 0x79 y */
   { 397, 8, 4, 4, 0, -4 },  /* 0x7A z */
   { 401, 8, 5, 4, 0, -5 },  /* 0x7B braceleft */
   { 406, 8, 5, 2, 0, -5 },  /* 0x7C bar */
   { 411, 8, 5, 4, 0, -5 },  /* 0x7D braceright */
   { 416, 8, 2, 4, 0, -5 },  /* 0x7E asciitilde */
#if (TOMTHUMB_USE_EXTENDED)
   { 418, 8, 5, 2, 0, -5 },  /* 0xA1 exclamdown */
   { 423, 8, 5, 4, 0, -5 },  /* 0xA2 cent */
   { 428, 8, 5, 4, 0, -5 },  /* 0xA3 sterling */
   { 433, 8, 5, 4, 0, -5 },  /* 0xA4 currency */
   { 438, 8, 5, 4, 0, -5 },  /* 0xA5 yen */
   { 443, 8, 5, 2, 0, -5 },  /* 0xA6 brokenbar */
   { 448, 8, 5, 4, 0, -5 },  /* 0xA7 section */
   { 453, 8, 1, 4, 0, -5 },  /* 0xA8 dieresis */
   { 454, 8, 3, 4, 0, -5 },  /* 0xA9 copyright */
   { 457, 8, 5, 4, 0, -5 },  /* 0xAA ordfeminine */
   { 462, 8, 3, 3, 0, -5 },  /* 0xAB guillemotleft */
   { 465, 8, 2, 4, 0, -4 },  /* 0xAC logicalnot */
   { 467, 8, 1, 3, 0, -3 },  /* 0xAD softhyphen */
   { 468, 8, 3, 4, 0, -5 },  /* 0xAE registered */
   { 471, 8, 1, 4, 0, -5 },  /* 0xAF macron */
   { 472, 8, 3, 4, 0, -5 },  /* 0xB0 degree */
   { 475, 8, 5, 4, 0, -5 },  /* 0xB1 plusminus */
   { 480, 8, 3, 4, 0, -5 },  /* 0xB2 twosuperior */
   { 483, 8, 3, 4, 0, -5 },  /* 0xB3 threesuperior */
   { 486, 8, 2, 3, 0, -5 },  /* 0xB4 acute */
   { 488, 8, 5, 4, 0, -5 },  /* 0xB5 mu */
   { 493, 8, 5, 4, 0, -5 },  /* 0xB6 paragraph */
   { 498, 8, 3, 4, 0, -4 },  /* 0xB7 periodcentered */
   { 501, 8, 3, 4, 0, -3 },  /* 0xB8 cedilla */
   { 504, 8, 3, 2, 0, -5 },  /* 0xB9 onesuperior */
   { 507, 8, 5, 4, 0, -5 },  /* 0xBA ordmasculine */
   { 512, 8, 3, 3, 0, -5 },  /* 0xBB guillemotright */
   { 515, 8, 5, 4, 0, -5 },  /* 0xBC onequarter */
   { 520, 8, 5, 4, 0, -5 },  /* 0xBD onehalf */
   { 525, 8, 5, 4, 0, -5 },  /* 0xBE threequarters */
   { 530, 8, 5, 4, 0, -5 },  /* 0xBF questiondown */
   { 535, 8, 5, 4, 0, -5 },  /* 0xC0 Agrave */
   { 540, 8, 5, 4, 0, -5 },  /* 0xC1 Aacute */
   { 545, 8, 5, 4, 0, -5 },  /* 0xC2 Acircumflex */
   { 550, 8, 5, 4, 0, -5 },  /* 0xC3 Atilde */
   { 555, 8, 5, 4, 0, -5 },  /* 0xC4 Adieresis */
   { 560, 8, 5, 4, 0, -5 },  /* 0xC5 Aring */
   { 565, 8, 5, 4, 0, -5 },  /* 0xC6 AE */
   { 570, 8, 6, 4, 0, -5 },  /* 0xC7 Ccedilla */
   { 576, 8, 5, 4, 0, -5 },  /* 0xC8 Egrave */
   { 581, 8, 5, 4, 0, -5 },  /* 0xC9 Eacute */
   { 586, 8, 5, 4, 0, -5 },  /* 0xCA Ecircumflex */
   { 591, 8, 5, 4, 0, -5 },  /* 0xCB Edieresis */
   { 596, 8, 5, 4, 0, -5 },  /* 0xCC Igrave */
   { 601, 8, 5, 4, 0, -5 },  /* 0xCD Iacute */
   { 606, 8, 5, 4, 0, -5 },  /* 0xCE Icircumflex */
   { 611, 8, 5, 4, 0, -5 },  /* 0xCF Idieresis */
   { 616, 8, 5, 4, 0, -5 },  /* 0xD0 Eth */
   { 621, 8, 5, 4, 0, -5 },  /* 0xD1 Ntilde */
   { 626, 8, 5, 4, 0, -5 },  /* 0xD2 Ograve */
   { 631, 8, 5, 4, 0, -5 },  /* 0xD3 Oacute */
   { 636, 8, 5, 4, 0, -5 },  /* 0xD4 Ocircumflex */
   { 641, 8, 5, 4, 0, -5 },  /* 0xD5 Otilde */
   { 646, 8, 5, 4, 0, -5 },  /* 0xD6 Odieresis */
   { 651, 8, 3, 4, 0, -4 },  /* 0xD7 multiply */
   { 654, 8, 5, 4, 0, -5 },  /* 0xD8 Oslash */
   { 659, 8, 5, 4, 0, -5 },  /* 0xD9 Ugrave */
   { 664, 8, 5, 4, 0, -5 },  /* 0xDA Uacute */
   { 669, 8, 5, 4, 0, -5 },  /* 0xDB Ucircumflex */
   { 674, 8, 5, 4, 0, -5 },  /* 0xDC Udieresis */
   { 679, 8, 5, 4, 0, -5 },  /* 0xDD Yacute */
   { 684, 8, 5, 4, 0, -5 },  /* 0xDE Thorn */
   { 689, 8, 6, 4, 0, -5 },  /* 0xDF germandbls */
   { 695, 8, 5, 4, 0, -5 },  /* 0xE0 agrave */
   { 700, 8, 5, 4, 0, -5 },  /* 0xE1 aacute */
   { 705, 8, 5, 4, 0, -5 },  /* 0xE2 acircumflex */
   { 710, 8, 5, 4, 0, -5 },  /* 0xE3 atilde */
   { 715, 8, 5, 4, 0, -5 },  /* 0xE4 adieresis */
   { 720, 8, 5, 4, 0, -5 },  /* 0xE5 aring */
   { 725, 8, 4, 4, 0, -4 },  /* 0xE6 ae */
   { 729, 8, 5, 4, 0, -4 },  /* 0xE7 ccedilla */
   { 734, 8, 5, 4, 0, -5 },  /* 0xE8 egrave */
   { 739, 8, 5, 4, 0, -5 },  /* 0xE9 eacute */
   { 744, 8, 5, 4, 0, -5 },  /* 0xEA ecircumflex */
   { 749, 8, 5, 4, 0, -5 },  /* 0xEB edieresis */
   { 754, 8, 5, 3, 0, -5 },  /* 0xEC igrave */
   { 759, 8, 5, 3, 0, -5 },  /* 0xED iacute */
   { 764, 8, 5, 4, 0, -5 },  /* 0xEE icircumflex */
   { 769, 8, 5, 4, 0, -5 },  /* 0xEF idieresis */
   { 774, 8, 5, 4, 0, -5 },  /* 0xF0 eth */
   { 779, 8, 5, 4, 0, -5 },  /* 0xF1 ntilde */
   { 784, 8, 5, 4, 0, -5 },  /* 0xF2 ograve */
   { 789, 8, 5, 4, 0, -5 },  /* 0xF3 oacute */
   { 794, 8, 5, 4, 0, -5 },  /* 0xF4 ocircumflex */
   { 799, 8, 5, 4, 0, -5 },  /* 0xF5 otilde */
   { 804, 8, 5, 4, 0, -5 },  /* 0xF6 odieresis */
   { 809, 8, 5, 4, 0, -5 },  /* 0xF7 divide */
   { 814, 8, 4, 4, 0, -4 },  /* 0xF8 oslash */
   { 818, 8, 5, 4, 0, -5 },  /* 0xF9 ugrave */
   { 823, 8, 5, 4, 0, -5 },  /* 0xFA uacute */
   { 828, 8, 5, 4, 0, -5 },  /* 0xFB ucircumflex */
   { 833, 8, 5, 4, 0, -5 },  /* 0xFC udieresis */
   { 838, 8, 6, 4, 0, -5 },  /* 0xFD yacute */
   { 844, 8, 5, 4, 0, -4 },  /* 0xFE thorn */
   { 849, 8, 6, 4, 0, -5 },  /* 0xFF ydieresis */
   { 855, 8, 1, 2, 0, -1 },  /* 0x11D gcircumflex */
   { 856, 8, 5, 4, 0, -5 },  /* 0x152 OE */
   { 861, 8, 4, 4, 0, -4 },  /* 0x153 oe */
   { 865, 8, 5, 4, 0, -5 },  /* 0x160 Scaron */
   { 870, 8, 5, 4, 0, -5 },  /* 0x161 scaron */
   { 875, 8, 5, 4, 0, -5 },  /* 0x178 Ydieresis */
   { 880, 8, 5, 4, 0, -5 },  /* 0x17D Zcaron */
   { 885, 8, 5, 4, 0, -5 },  /* 0x17E zcaron */
   { 890, 8, 1, 2, 0, -1 },  /* 0xEA4 uni0EA4 */
   { 891, 8, 1, 2, 0, -1 },  /* 0x13A0 uni13A0 */
   { 892, 8, 1, 2, 0, -3 },  /* 0x2022 bullet */
   { 893, 8, 1, 4, 0, -1 },  /* 0x2026 ellipsis */
   { 894, 8, 5, 4, 0, -5 },  /* 0x20AC Euro */
   { 899, 8, 5, 4, 0, -5 },  /* 0xFFFD uniFFFD */
#endif /* (TOMTHUMB_USE_EXTENDED) */
};

const GFXfont TomThumb PROGMEM = {
  (uint8_t  *)TomThumbBitmaps,
  (GFXglyph *)TomThumbGlyphs,
  0x20, 0x7E, 6 };