tchapi / adafruit-gfx-font-customiser Goto Github PK
View Code? Open in Web Editor NEWA little utility to customise pixel fonts for the Adafruit GFX library
Home Page: https://tchapi.github.io/Adafruit-GFX-Font-Customiser/
License: MIT License
A little utility to customise pixel fonts for the Adafruit GFX library
Home Page: https://tchapi.github.io/Adafruit-GFX-Font-Customiser/
License: MIT License
Rows/Cols +/- buttons are adding/removing one row/column on the right/bottom side. I encountered several times the problem, when I had to extend the character on the left or top side. The only way to do so now, is to extend and shift the whole character, pixel by pixel erasing and redrawing it.
As solution I recommend to split the + / - Row button vertically to 2 (horizontally for Cols), to make extension possible the other side. These splits save space and also intuitively gives the user the desired extension direction.
Another, more intuitive GUI solution idea is adding arrow buttons around the character and also the pixel editor area. First set is for extending, second for x/y offset. I always have to try both directions when I offset a character. This would be more intuitive for the user for all 4 controls, but also a lot more difficult to implement.
Hi all, thanx for this great utility! I hope it can help me to add german "umlaut" characters (0xc4, 0xd6, 0xdc, 0xdf, 0xe4, 0xf6, 0xfc) to a given font.
Since this seems to be rather complicated, I intend to backup a new header file after each character added, and reimport it before adding the next character. Unfortunately, when reimporting a previously stored header into the form, the next-to-last character gets lost, and the previously added character is displayed at its position, being marked as inprintable.
That means that after having reimported a font with e.g. the 0xc4, the entry for 0xc3, which should be empty, shows the omage of the added 0xc4 character (yet still being marked as inprintable!), and the entry for the 0xc4 character is lost.
Beside the problem, I would like to ask if it a copy-character function could be added - this would come in very handy for special charcters requiring only some pixels being added to an existing character and could help for many (not only german) umlauts.
Thanx a lot in advance!
if you create a font with
./fontconvert xxx.ttf 10 32 252 > xxx10pt8b.h
and you try to modify the columns and/or rows (+/-) it messes up the character.
Hi,
I created a font at http://oleddisplay.squix.ch with the folowing parameters:
Preview Display: TFT 2.4" (240x320)
Font Family: Monospaced
Style: Bold
Size: 11
Library Version: Adafruit GFX Font
and pasted the output to the "Original font file" text input.
Unfortunately nothing happens if i press "Extract".
I also tried it locally. The test fonts are extracted, but not that (and others I created with the online "Font Converter". The format does't look different from that of the test fonts.
Any ideas?
Regards, Thorsten
Hello ^^
This project is the best.
However, if the content increases
It takes too long.
It seems to stop when there are many glyphs.
Here is what I used.
Why? Is it stopping?
Map of characters seems like this:
The \ character at the very end of line means "next line to be appended here".
So next line is appended - as a part of commentary.
So character 0x5D is not defined - after 0x5C follows the definition od 0x5E. All subsequent characters are off-by-one and if you try to render last character (0x7e), random data occures.
What do you think about XOR compression ?
Real font example with graphics in comments (v1, now there is improved v2).
https://github.com/eltomjan/ETEhomeTools/blob/master/ArduinoSimulator/Font_big.h
PR for original LCD
adafruit/Adafruit_ILI9340#19
Here graphical demo showing these blocks inside real font
https://eltomjan.github.io/JStoolsSPAdemos/FontPacker/webLog.htm
Log created by a demo C processing text font https://github.com/eltomjan/ETEhomeTools/tree/master/TextFontPackerDemo
I can create PR, but page is quite complex and not sure if there are any "global" changes already ?
Also do not know where to add it to UI - options could be checkbox(-es), new buttons, auto import of packed/plain, etc. ?
PC simulation
https://github.com/eltomjan/ETEhomeTools/tree/master/ArduinoSimulator
Old C# packer to generate fonts (now updated to improved v2)
https://github.com/eltomjan/ETEhomeTools/tree/master/CSharp/GFXpack
Some older generator / list of compression results
https://github.com/eltomjan/ETEhomeTools/blob/02c368e44a83ed0c4cb7ae59315b8c681f98fe11/gfxXorPacker.cpp#L332
Thanks for this awesome tool! Right now the pixels are not displayed as squares but as rectangles. Is there any option to enable this?
For oblique glyphs, the xAdvance can be to the left of the right side of the glyph's bitmap bounding box. I'm including a test example which is just the SOLIDUS glyph from the FreeMonoBoldOblique24pt7b font. Clicking on the "+xAdv" input element of the Customizer page will reveal more of the glyph bitmap. But then the xAdv is being incorrectly set.
(I have my own diagnostic scripts for annotating the GFXfonts which I'm using to draw the bitmaps inline in the headers, as shown).
const uint8_t FreeMonoBoldOblique24pt7bBitmaps[] PROGMEM = {
0x00,0x00,0x00,0x60,0x00,0x00,0x0F,0x00,
0x00,0x01,0xF0,0x00,0x00,0x3E,0x00,0x00,
0x03,0xE0,0x00,0x00,0x7C,0x00,0x00,0x0F,
0x80,0x00,0x00,0xF8,0x00,0x00,0x1F,0x00,
0x00,0x03,0xE0,0x00,0x00,0x3E,0x00,0x00,
0x07,0xC0,0x00,0x00,0xF8,0x00,0x00,0x1F,
0x80,0x00,0x01,0xF0,0x00,0x00,0x3E,0x00,
0x00,0x07,0xE0,0x00,0x00,0x7C,0x00,0x00,
0x0F,0x80,0x00,0x01,0xF8,0x00,0x00,0x1F,
0x00,0x00,0x03,0xE0,0x00,0x00,0x7C,0x00,
0x00,0x07,0xC0,0x00,0x00,0xF8,0x00,0x00,
0x1F,0x00,0x00,0x01,0xF0,0x00,0x00,0x3E,
0x00,0x00,0x07,0xC0,0x00,0x00,0xFC,0x00,
0x00,0x0F,0x80,0x00,0x01,0xF0,0x00,0x00,
0x3F,0x00,0x00,0x03,0xE0,0x00,0x00,0x7C,
0x00,0x00,0x07,0xC0,0x00,0x00,0xF8,0x00,
0x00,0x07,0x00,0x00,0x00, // 0x2F '/' (28 x 38) @(3,-32) +28
// [ .........................**.]
// [ ........................****]
// [ .......................*****]
// [ ......................*****.]
// [ ......................*****.]
// [ .....................*****..]
// [ ....................*****...]
// [ ....................*****...]
// [ ...................*****....]
// [ ..................*****.....]
// [ ..................*****.....]
// [ .................*****......]
// [ ................*****.......]
// [ ...............******.......]
// [ ...............*****........]
// [ ..............*****.........]
// [ .............******.........]
// [ .............*****..........]
// [ ............*****...........]
// [ ...........******...........]
// [ ...........*****............]
// [ ..........*****.............]
// [ .........*****..............]
// [ .........*****..............]
// [ ........*****...............]
// [ .......*****................]
// [ .......*****................]
// [ ......*****.................]
// [ .....*****..................]
// [ ....******..................]
// [ ....*****...................]
// [ ...*****....................]
// [0 ..******.................>..]
// [ ..*****.....................]
// [ .*****......................]
// [ .*****......................]
// [ *****.......................]
// [ .***........................]
};
const GFXglyph FreeMonoBoldOblique24pt7bGlyphs[] PROGMEM = {
{0, 28, 38, 28, 3, -32} // 0x2F '/':SOLIDUS
};
const GFXfont FreeMonoBoldOblique24pt7b PROGMEM = {
(uint8_t *)FreeMonoBoldOblique24pt7bBitmaps,
(GFXglyph *)FreeMonoBoldOblique24pt7bGlyphs,
0x2F, 0x2F, 47
};
Great little program - as fontconvert can produce some very ugly results and needs a lot of cleaning up. I'm wondering if it would be hard to adapt your code to all us to add/remove glyphs?
Not a bug, but visually hard to distinguish between where a character editor box starts and ends. In mozilla the rows have no gaps in between rows, only a very small rounding of a character box shows the top/bottom of a character editor box. A small, fixed gap would help a lot visually.
When I extract font with big characters (attached), the UI is rendered incorrectly and font can't be edited.
Chrome, Windows 10
Font file:
IconsFont2.h.txt
What a fun JS tool!
I tried it on a few of the Fonts/*.h files. Failed to parse the TomThumb.h file. At least one problem I can see is the regex that tries to extract a size from the font's name.
This works for the fontconvert.c -generated Fonts/ files, but TomThumb isn't one of those. There are a few others of that kind in there, like Org_01.h, and PicoPixel.h
Adafruit-GFX-Font-Customiser/index.html
Line 222 in 8d1b9f0
I've got this font:
https://lovecka.info/tmp/YanoneKaffeesatz-SemiBold13pt8b.h
When I load it into app, characters shows croped from bottom.
The data are there - if I click "-base", character rolls up and it contains all the missing parts:
I think app computes character boundary wrong...
App can be used for editing of this font - just move every character up by -base, edit and then move down by base+. Font data are not destroyed.
Hello tchap, congratulations for your excellent job. As a suggestion I wonder if there is a single character edit function, with a large screen and large pixels... Do you think it would be usefull ?
Hello, I created a font from http://oleddisplay.squix.ch/#/home. Since the German umlauts ä, Ä, ö, Ö, ü, Ü were missing, I wanted to expand them with the font customizer.
But there's a problem. When I import the adapted font into my project, the words are cut off at the umlaut or the letter is simply left out.
When I read the changed font back into the font customizer, my letters were suddenly shifted 1 to the left.
Original Font:
` // Created by http://oleddisplay.squix.ch/ Consider a donation
// In case of problems make sure that you are using the font file with the correct version!
const uint8_t Roboto_11Bitmaps[] PROGMEM = {
// Bitmap Data:
0x00, // ' '
0xAA,0xA2, // '!'
0xDB,0x00, // '"'
0x28,0x93,0xF2,0x85,0x1F,0x14,0x48, // '#'
0x21,0xC9,0x22,0xC0,0xC0,0xA6,0xF0,0x80, // '$'
0xC0,0xA8,0xB0,0xD0,0x2C,0x52,0x52,0x0C, // '%'
0x71,0x22,0x43,0x0A,0x93,0x26,0x7E, // '&'
0x90, // '''
0x46,0x88,0x88,0x88,0x88,0x42, // '('
0x84,0x42,0x22,0x22,0x24,0x48, // ')'
0x22,0xC6,0x94, // '*'
0x10,0x23,0xF0,0x81,0x00, // '+'
0x4A,0x00, // ','
0xE0, // '-'
0x80, // '.'
0x10,0x88,0x42,0x21,0x10,0x80, // '/'
0x72,0x48,0xA2,0x8A,0x49,0x1C, // '0'
0x6A,0x22,0x22,0x22, // '1'
0xF2,0x41,0x04,0x21,0x08,0x3E, // '2'
0xF4,0x84,0xC1,0x0A,0x5E, // '3'
0x18,0x30,0xA2,0x44,0x9F,0x82,0x04, // '4'
0xFA,0x08,0x3C,0x18,0x29,0x9C, // '5'
0x73,0x08,0x3C,0x9A,0x29,0x1C, // '6'
0xFC,0x10,0x20,0x81,0x02,0x08,0x30, // '7'
0xF2,0x49,0x18,0x92,0x29,0x3C, // '8'
0xE4,0xA5,0x2F,0x08,0x4C, // '9'
0x80,0x20, // ':'
0x40,0x00,0x94, // ';'
0x08,0xCC,0x1C,0x08, // '<'
0xF0,0x3C, // '='
0x83,0x04,0xC8,0x00, // '>'
0x73,0x20,0x84,0x20,0x80,0x08, // '?'
0x3C,0x21,0x27,0x54,0xAA,0x55,0x2A,0xB5,0x6C,0x40,0x1E,0x00, // '@'
0x10,0x28,0x28,0x28,0x44,0x7C,0x44,0x82, // 'A'
0xF2,0x28,0xBC,0x8A,0x28,0xBC, // 'B'
0x79,0x12,0x14,0x08,0x10,0xA2,0x3C, // 'C'
0xF1,0x12,0x24,0x28,0x51,0x22,0x78, // 'D'
0xFA,0x08,0x3C,0x82,0x08,0x3E, // 'E'
0xFA,0x08,0x20,0xF2,0x08,0x20, // 'F'
0x79,0x12,0x14,0x09,0xD0,0xB1,0x3C, // 'G'
0x85,0x0A,0x17,0xE8,0x50,0xA1,0x42, // 'H'
0xAA,0xAA, // 'I'
0x08,0x20,0x82,0x08,0x2C,0x9C, // 'J'
0x8D,0x22,0x87,0x0E,0x12,0x22,0x46, // 'K'
0x82,0x08,0x20,0x82,0x08,0x3E, // 'L'
0x83,0x61,0xB1,0x54,0xAA,0x55,0x4A,0x65,0x22, // 'M'
0x85,0x8B,0x95,0x29,0x53,0xA3,0x42, // 'N'
0x79,0x12,0x14,0x28,0x50,0xA2,0x3C, // 'O'
0xF9,0x12,0x14,0x4F,0x90,0x20,0x40, // 'P'
0x79,0x9A,0x14,0x28,0x50,0xB3,0x3C,0x04, // 'Q'
0xF1,0x12,0x24,0x4F,0x12,0x22,0x46, // 'R'
0x72,0x28,0x18,0x18,0x28,0x9C, // 'S'
0xFC,0x20,0x40,0x81,0x02,0x04,0x08, // 'T'
0x8A,0x28,0xA2,0x8A,0x28,0x9C, // 'U'
0x82,0x44,0x44,0x44,0x28,0x28,0x30,0x10, // 'V'
0x8C,0xC9,0x91,0x32,0x2A,0x45,0x30,0x66,0x0C,0xC1,0x08, // 'W'
0xC6,0x4C,0x28,0x10,0x10,0x28,0x4C,0xC6, // 'X'
0xC6,0x44,0x68,0x28,0x10,0x10,0x10,0x10, // 'Y'
0x7C,0x18,0x20,0x82,0x04,0x10,0x7E, // 'Z'
0xD2,0x49,0x24,0x93,0x00, // '['
0x82,0x10,0x82,0x10,0x42,0x10, // '\'
0xC9,0x24,0x92,0x4B,0x00, // ']'
0x4C,0xAA, // '^'
0xF8, // '_'
0xC6, // '`'
0xF0,0xBD,0x29,0x78, // 'a'
0x82,0x0F,0x24,0x8A,0x29,0x3C, // 'b'
0x72,0x48,0xA0,0x99,0xC0, // 'c'
0x08,0x27,0x92,0x8A,0x24,0x9E, // 'd'
0x72,0x4F,0xA0,0x91,0xC0, // 'e'
0x32,0x11,0xE4,0x21,0x08,0x40, // 'f'
0x79,0x28,0xA2,0x49,0xE0,0x9E, // 'g'
0x84,0x3D,0x29,0x4A,0x52, // 'h'
0x8A,0xAA, // 'i'
0x41,0x24,0x92,0x58, // 'j'
0x82,0x08,0x24,0xA3,0x0A,0x28,0x98, // 'k'
0xAA,0xAA,0x80, // 'l'
0xF7,0x4C,0xA4,0x52,0x29,0x14,0x88, // 'm'
0xF4,0xA5,0x29,0x48, // 'n'
0x78,0x92,0x14,0x24,0x8F,0x00, // 'o'
0xF2,0x48,0xA2,0x93,0xC8,0x20, // 'p'
0x79,0x28,0xA2,0x49,0xE0,0x82, // 'q'
0xE8,0x88,0x88, // 'r'
0xF4,0xB8,0x29,0x78, // 's'
0x4E,0x44,0x44,0x20, // 't'
0x94,0xA5,0x29,0x78, // 'u'
0x8A,0x45,0x14,0x60,0x80, // 'v'
0x99,0x4D,0x16,0x8D,0x46,0x61,0x20, // 'w'
0xC9,0x43,0x0C,0x53,0x20, // 'x'
0x89,0x45,0x14,0x20,0x82,0x30, // 'y'
0x78,0x43,0x08,0x43,0xE0, // 'z'
0x31,0x08,0x44,0x61,0x04,0x21,0x0C, // '{'
0xAA,0xAA,0x80, // '|'
0x82,0x10,0x86,0x19,0x88,0x42,0x20 // '}'
};
const GFXglyph Roboto_11Glyphs[] PROGMEM = {
// bitmapOffset, width, height, xAdvance, xOffset, yOffset
{ 0, 1, 1, 4, 0, 0 }, // ' '
{ 1, 2, 8, 4, 1, -8 }, // '!'
{ 3, 3, 3, 5, 1, -8 }, // '"'
{ 5, 7, 8, 8, 1, -8 }, // '#'
{ 12, 6, 10, 7, 1, -9 }, // '$'
{ 20, 8, 8, 9, 1, -8 }, // '%'
{ 28, 7, 8, 8, 1, -8 }, // '&'
{ 35, 3, 2, 3, 0, -8 }, // '''
{ 36, 4, 12, 5, 1, -9 }, // '('
{ 42, 4, 12, 5, 0, -9 }, // ')'
{ 48, 6, 4, 6, 0, -8 }, // '*'
{ 51, 7, 5, 7, 0, -6 }, // '+'
{ 56, 3, 3, 3, 0, -1 }, // ','
{ 58, 4, 1, 4, 0, -4 }, // '-'
{ 59, 2, 1, 4, 1, -1 }, // '.'
{ 60, 5, 9, 6, 0, -8 }, // '/'
{ 66, 6, 8, 7, 1, -8 }, // '0'
{ 72, 4, 8, 7, 1, -8 }, // '1'
{ 76, 6, 8, 7, 1, -8 }, // '2'
{ 82, 5, 8, 7, 1, -8 }, // '3'
{ 87, 7, 8, 7, 0, -8 }, // '4'
{ 94, 6, 8, 7, 1, -8 }, // '5'
{ 100, 6, 8, 7, 1, -8 }, // '6'
{ 106, 7, 8, 7, 0, -8 }, // '7'
{ 113, 6, 8, 7, 1, -8 }, // '8'
{ 119, 5, 8, 7, 1, -8 }, // '9'
{ 124, 2, 6, 4, 1, -6 }, // ':'
{ 126, 3, 8, 3, 0, -6 }, // ';'
{ 129, 6, 5, 7, 0, -6 }, // '<'
{ 133, 5, 3, 7, 1, -5 }, // '='
{ 135, 5, 5, 7, 1, -6 }, // '>'
{ 139, 6, 8, 6, 0, -8 }, // '?'
{ 145, 9, 10, 11, 1, -8 }, // '@'
{ 157, 8, 8, 8, 0, -8 }, // 'A'
{ 165, 6, 8, 8, 1, -8 }, // 'B'
{ 171, 7, 8, 8, 1, -8 }, // 'C'
{ 178, 7, 8, 8, 1, -8 }, // 'D'
{ 185, 6, 8, 7, 1, -8 }, // 'E'
{ 191, 6, 8, 7, 1, -8 }, // 'F'
{ 197, 7, 8, 9, 1, -8 }, // 'G'
{ 204, 7, 8, 9, 1, -8 }, // 'H'
{ 211, 2, 8, 4, 1, -8 }, // 'I'
{ 213, 6, 8, 7, 0, -8 }, // 'J'
{ 219, 7, 8, 8, 1, -8 }, // 'K'
{ 226, 6, 8, 7, 1, -8 }, // 'L'
{ 232, 9, 8, 11, 1, -8 }, // 'M'
{ 241, 7, 8, 9, 1, -8 }, // 'N'
{ 248, 7, 8, 9, 1, -8 }, // 'O'
{ 255, 7, 8, 8, 1, -8 }, // 'P'
{ 262, 7, 9, 9, 1, -8 }, // 'Q'
{ 270, 7, 8, 8, 1, -8 }, // 'R'
{ 277, 6, 8, 8, 1, -8 }, // 'S'
{ 283, 7, 8, 8, 0, -8 }, // 'T'
{ 290, 6, 8, 8, 1, -8 }, // 'U'
{ 296, 8, 8, 8, 0, -8 }, // 'V'
{ 304, 11, 8, 11, 0, -8 }, // 'W'
{ 315, 8, 8, 8, 0, -8 }, // 'X'
{ 323, 8, 8, 8, 0, -8 }, // 'Y'
{ 331, 7, 8, 8, 0, -8 }, // 'Z'
{ 338, 3, 11, 4, 1, -9 }, // '['
{ 343, 5, 9, 6, 0, -8 }, // ''
{ 349, 3, 11, 4, 0, -9 }, // ']'
{ 354, 4, 4, 6, 1, -8 }, // '^'
{ 356, 6, 1, 6, 0, 0 }, // '_'
{ 357, 4, 2, 4, 0, -9 }, // '' { 358, 5, 6, 7, 1, -6 }, // 'a' { 362, 6, 8, 7, 1, -8 }, // 'b' { 368, 6, 6, 7, 1, -6 }, // 'c' { 373, 6, 8, 7, 0, -8 }, // 'd' { 379, 6, 6, 7, 1, -6 }, // 'e' { 384, 5, 9, 5, 0, -9 }, // 'f' { 390, 6, 8, 7, 0, -6 }, // 'g' { 396, 5, 8, 7, 1, -8 }, // 'h' { 401, 2, 8, 4, 1, -8 }, // 'i' { 403, 3, 10, 4, 0, -8 }, // 'j' { 407, 6, 9, 7, 1, -9 }, // 'k' { 414, 2, 9, 4, 1, -9 }, // 'l' { 417, 9, 6, 11, 1, -6 }, // 'm' { 424, 5, 6, 7, 1, -6 }, // 'n' { 428, 7, 6, 7, 0, -6 }, // 'o' { 434, 6, 8, 7, 1, -6 }, // 'p' { 440, 6, 8, 7, 0, -6 }, // 'q' { 446, 4, 6, 5, 1, -6 }, // 'r' { 449, 5, 6, 7, 1, -6 }, // 's' { 453, 4, 7, 5, 0, -7 }, // 't' { 457, 5, 6, 7, 1, -6 }, // 'u' { 461, 6, 6, 6, 0, -6 }, // 'v' { 466, 9, 6, 9, 0, -6 }, // 'w' { 473, 6, 6, 6, 0, -6 }, // 'x' { 478, 6, 8, 6, 0, -6 }, // 'y' { 484, 6, 6, 6, 0, -6 }, // 'z' { 489, 5, 11, 5, 0, -9 }, // '{' { 496, 2, 9, 4, 1, -8 }, // '|' { 499, 5, 11, 5, 0, -9 } // '}' }; const GFXfont Roboto_11 PROGMEM = { (uint8_t *)Roboto_11Bitmaps,(GFXglyph *)Roboto_11Glyphs,0x20, 0x7E, 14};
changed Font:
` const uint8_t Roboto_11Bitmaps[] PROGMEM = {
0x00, 0xAA, 0xA2, 0xDB, 0x00, 0x28, 0x93, 0xF2, 0x85, 0x1F, 0x14, 0x48,
0x21, 0xC9, 0x22, 0xC0, 0xC0, 0xA6, 0xF0, 0x80, 0xC0, 0xA8, 0xB0, 0xD0,
0x2C, 0x52, 0x52, 0x0C, 0x71, 0x22, 0x43, 0x0A, 0x93, 0x26, 0x7E, 0x90,
0x46, 0x88, 0x88, 0x88, 0x88, 0x42, 0x84, 0x42, 0x22, 0x22, 0x24, 0x48,
0x22, 0xC6, 0x94, 0x10, 0x23, 0xF0, 0x81, 0x00, 0x4A, 0x00, 0xE0, 0x80,
0x10, 0x88, 0x42, 0x21, 0x10, 0x80, 0x72, 0x48, 0xA2, 0x8A, 0x49, 0x1C,
0x6A, 0x22, 0x22, 0x22, 0xF2, 0x41, 0x04, 0x21, 0x08, 0x3E, 0xF4, 0x84,
0xC1, 0x0A, 0x5E, 0x18, 0x30, 0xA2, 0x44, 0x9F, 0x82, 0x04, 0xFA, 0x08,
0x3C, 0x18, 0x29, 0x9C, 0x73, 0x08, 0x3C, 0x9A, 0x29, 0x1C, 0xFC, 0x10,
0x20, 0x81, 0x02, 0x08, 0x30, 0xF2, 0x49, 0x18, 0x92, 0x29, 0x3C, 0xE4,
0xA5, 0x2F, 0x08, 0x4C, 0x80, 0x20, 0x40, 0x00, 0x94, 0x08, 0xCC, 0x1C,
0x08, 0xF0, 0x3C, 0x83, 0x04, 0xC8, 0x00, 0x73, 0x20, 0x84, 0x20, 0x80,
0x08, 0x3C, 0x21, 0x27, 0x54, 0xAA, 0x55, 0x2A, 0xB5, 0x6C, 0x40, 0x1E,
0x00, 0x10, 0x28, 0x28, 0x28, 0x44, 0x7C, 0x44, 0x82, 0xF2, 0x28, 0xBC,
0x8A, 0x28, 0xBC, 0x79, 0x12, 0x14, 0x08, 0x10, 0xA2, 0x3C, 0xF1, 0x12,
0x24, 0x28, 0x51, 0x22, 0x78, 0xFA, 0x08, 0x3C, 0x82, 0x08, 0x3E, 0xFA,
0x08, 0x20, 0xF2, 0x08, 0x20, 0x79, 0x12, 0x14, 0x09, 0xD0, 0xB1, 0x3C,
0x85, 0x0A, 0x17, 0xE8, 0x50, 0xA1, 0x42, 0xAA, 0xAA, 0x08, 0x20, 0x82,
0x08, 0x2C, 0x9C, 0x8D, 0x22, 0x87, 0x0E, 0x12, 0x22, 0x46, 0x82, 0x08,
0x20, 0x82, 0x08, 0x3E, 0x83, 0x61, 0xB1, 0x54, 0xAA, 0x55, 0x4A, 0x65,
0x22, 0x85, 0x8B, 0x95, 0x29, 0x53, 0xA3, 0x42, 0x79, 0x12, 0x14, 0x28,
0x50, 0xA2, 0x3C, 0xF9, 0x12, 0x14, 0x4F, 0x90, 0x20, 0x40, 0x79, 0x9A,
0x14, 0x28, 0x50, 0xB3, 0x3C, 0x04, 0xF1, 0x12, 0x24, 0x4F, 0x12, 0x22,
0x46, 0x72, 0x28, 0x18, 0x18, 0x28, 0x9C, 0xFC, 0x20, 0x40, 0x81, 0x02,
0x04, 0x08, 0x8A, 0x28, 0xA2, 0x8A, 0x28, 0x9C, 0x82, 0x44, 0x44, 0x44,
0x28, 0x28, 0x30, 0x10, 0x8C, 0xC9, 0x91, 0x32, 0x2A, 0x45, 0x30, 0x66,
0x0C, 0xC1, 0x08, 0xC6, 0x4C, 0x28, 0x10, 0x10, 0x28, 0x4C, 0xC6, 0xC6,
0x44, 0x68, 0x28, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x18, 0x20, 0x82, 0x04,
0x10, 0x7E, 0xD2, 0x49, 0x24, 0x93, 0x00, 0x82, 0x10, 0x82, 0x10, 0x42,
0x10, 0xC9, 0x24, 0x92, 0x4B, 0x00, 0x4C, 0xAA, 0xF8, 0xC6, 0xF0, 0xBD,
0x29, 0x78, 0x82, 0x0F, 0x24, 0x8A, 0x29, 0x3C, 0x72, 0x48, 0xA0, 0x99,
0xC0, 0x08, 0x27, 0x92, 0x8A, 0x24, 0x9E, 0x72, 0x4F, 0xA0, 0x91, 0xC0,
0x32, 0x11, 0xE4, 0x21, 0x08, 0x40, 0x79, 0x28, 0xA2, 0x49, 0xE0, 0x9E,
0x84, 0x3D, 0x29, 0x4A, 0x52, 0x8A, 0xAA, 0x41, 0x24, 0x92, 0x58, 0x82,
0x08, 0x24, 0xA3, 0x0A, 0x28, 0x98, 0xAA, 0xAA, 0x80, 0xF7, 0x4C, 0xA4,
0x52, 0x29, 0x14, 0x88, 0xF4, 0xA5, 0x29, 0x48, 0x78, 0x92, 0x14, 0x24,
0x8F, 0x00, 0xF2, 0x48, 0xA2, 0x93, 0xC8, 0x20, 0x79, 0x28, 0xA2, 0x49,
0xE0, 0x82, 0xE8, 0x88, 0x88, 0xF4, 0xB8, 0x29, 0x78, 0x4E, 0x44, 0x44,
0x20, 0x94, 0xA5, 0x29, 0x78, 0x8A, 0x45, 0x14, 0x60, 0x80, 0x99, 0x4D,
0x16, 0x8D, 0x46, 0x61, 0x20, 0xC9, 0x43, 0x0C, 0x53, 0x20, 0x89, 0x45,
0x14, 0x20, 0x82, 0x30, 0x78, 0x43, 0x08, 0x43, 0xE0, 0x31, 0x08, 0x44,
0x61, 0x04, 0x21, 0x0C, 0xAA, 0xAA, 0x80, 0x82, 0x10, 0x86, 0x19, 0x88,
0x42, 0x20, 0x50, 0x3C, 0x21, 0x7A, 0x52, 0xF0, 0x00, 0x00, 0x90, 0x03,
0xC4, 0x90, 0xA1, 0x24, 0x78, 0x00, 0x90, 0x25, 0x29, 0x4A, 0x5E
};
const GFXglyph Roboto_11Glyphs[] PROGMEM = {
{ 0, 1, 1, 4, 0, 0 }, // 0x20 ' '
{ 1, 2, 8, 4, 1, -8 }, // 0x21 '!'
{ 3, 3, 3, 5, 1, -8 }, // 0x22 '"'
{ 5, 7, 8, 8, 1, -8 }, // 0x23 '#'
{ 12, 6, 10, 7, 1, -9 }, // 0x24 '$'
{ 20, 8, 8, 9, 1, -8 }, // 0x25 '%'
{ 28, 7, 8, 8, 1, -8 }, // 0x26 '&'
{ 35, 3, 2, 3, 0, -8 }, // 0x27 '''
{ 36, 4, 12, 5, 1, -9 }, // 0x28 '('
{ 42, 4, 12, 5, 0, -9 }, // 0x29 ')'
{ 48, 6, 4, 6, 0, -8 }, // 0x2A '*'
{ 51, 7, 5, 7, 0, -6 }, // 0x2B '+'
{ 56, 3, 3, 3, 0, -1 }, // 0x2C ','
{ 58, 4, 1, 4, 0, -4 }, // 0x2D '-'
{ 59, 2, 1, 4, 1, -1 }, // 0x2E '.'
{ 60, 5, 9, 6, 0, -8 }, // 0x2F '/'
{ 66, 6, 8, 7, 1, -8 }, // 0x30 '0'
{ 72, 4, 8, 7, 1, -8 }, // 0x31 '1'
{ 76, 6, 8, 7, 1, -8 }, // 0x32 '2'
{ 82, 5, 8, 7, 1, -8 }, // 0x33 '3'
{ 87, 7, 8, 7, 0, -8 }, // 0x34 '4'
{ 94, 6, 8, 7, 1, -8 }, // 0x35 '5'
{ 100, 6, 8, 7, 1, -8 }, // 0x36 '6'
{ 106, 7, 8, 7, 0, -8 }, // 0x37 '7'
{ 113, 6, 8, 7, 1, -8 }, // 0x38 '8'
{ 119, 5, 8, 7, 1, -8 }, // 0x39 '9'
{ 124, 2, 6, 4, 1, -6 }, // 0x3A ':'
{ 126, 3, 8, 3, 0, -6 }, // 0x3B ';'
{ 129, 6, 5, 7, 0, -6 }, // 0x3C '<'
{ 133, 5, 3, 7, 1, -5 }, // 0x3D '='
{ 135, 5, 5, 7, 1, -6 }, // 0x3E '>'
{ 139, 6, 8, 6, 0, -8 }, // 0x3F '?'
{ 145, 9, 10, 11, 1, -8 }, // 0x40 '@'
{ 157, 8, 8, 8, 0, -8 }, // 0x41 'A'
{ 165, 6, 8, 8, 1, -8 }, // 0x42 'B'
{ 171, 7, 8, 8, 1, -8 }, // 0x43 'C'
{ 178, 7, 8, 8, 1, -8 }, // 0x44 'D'
{ 185, 6, 8, 7, 1, -8 }, // 0x45 'E'
{ 191, 6, 8, 7, 1, -8 }, // 0x46 'F'
{ 197, 7, 8, 9, 1, -8 }, // 0x47 'G'
{ 204, 7, 8, 9, 1, -8 }, // 0x48 'H'
{ 211, 2, 8, 4, 1, -8 }, // 0x49 'I'
{ 213, 6, 8, 7, 0, -8 }, // 0x4A 'J'
{ 219, 7, 8, 8, 1, -8 }, // 0x4B 'K'
{ 226, 6, 8, 7, 1, -8 }, // 0x4C 'L'
{ 232, 9, 8, 11, 1, -8 }, // 0x4D 'M'
{ 241, 7, 8, 9, 1, -8 }, // 0x4E 'N'
{ 248, 7, 8, 9, 1, -8 }, // 0x4F 'O'
{ 255, 7, 8, 8, 1, -8 }, // 0x50 'P'
{ 262, 7, 9, 9, 1, -8 }, // 0x51 'Q'
{ 270, 7, 8, 8, 1, -8 }, // 0x52 'R'
{ 277, 6, 8, 8, 1, -8 }, // 0x53 'S'
{ 283, 7, 8, 8, 0, -8 }, // 0x54 'T'
{ 290, 6, 8, 8, 1, -8 }, // 0x55 'U'
{ 296, 8, 8, 8, 0, -8 }, // 0x56 'V'
{ 304, 11, 8, 11, 0, -8 }, // 0x57 'W'
{ 315, 8, 8, 8, 0, -8 }, // 0x58 'X'
{ 323, 8, 8, 8, 0, -8 }, // 0x59 'Y'
{ 331, 7, 8, 8, 0, -8 }, // 0x5A 'Z'
{ 338, 3, 11, 4, 1, -9 }, // 0x5B '['
{ 343, 5, 9, 6, 0, -8 }, // 0x5C ''
{ 349, 3, 11, 4, 0, -9 }, // 0x5D ']'
{ 354, 4, 4, 6, 1, -8 }, // 0x5E '^'
{ 356, 6, 1, 6, 0, 0 }, // 0x5F '_'
{ 357, 4, 2, 4, 0, -9 }, // 0x60 '`'
{ 358, 5, 6, 7, 1, -6 }, // 0x61 'a'
{ 362, 6, 8, 7, 1, -8 }, // 0x62 'b'
{ 368, 6, 6, 7, 1, -6 }, // 0x63 'c'
{ 373, 6, 8, 7, 0, -8 }, // 0x64 'd'
{ 379, 6, 6, 7, 1, -6 }, // 0x65 'e'
{ 384, 5, 9, 5, 0, -9 }, // 0x66 'f'
{ 390, 6, 8, 7, 0, -6 }, // 0x67 'g'
{ 396, 5, 8, 7, 1, -8 }, // 0x68 'h'
{ 401, 2, 8, 4, 1, -8 }, // 0x69 'i'
{ 403, 3, 10, 4, 0, -8 }, // 0x6A 'j'
{ 407, 6, 9, 7, 1, -9 }, // 0x6B 'k'
{ 414, 2, 9, 4, 1, -9 }, // 0x6C 'l'
{ 417, 9, 6, 11, 1, -6 }, // 0x6D 'm'
{ 424, 5, 6, 7, 1, -6 }, // 0x6E 'n'
{ 428, 7, 6, 7, 0, -6 }, // 0x6F 'o'
{ 434, 6, 8, 7, 1, -6 }, // 0x70 'p'
{ 440, 6, 8, 7, 0, -6 }, // 0x71 'q'
{ 446, 4, 6, 5, 1, -6 }, // 0x72 'r'
{ 449, 5, 6, 7, 1, -6 }, // 0x73 's'
{ 453, 4, 7, 5, 0, -7 }, // 0x74 't'
{ 457, 5, 6, 7, 1, -6 }, // 0x75 'u'
{ 461, 6, 6, 6, 0, -6 }, // 0x76 'v'
{ 466, 9, 6, 9, 0, -6 }, // 0x77 'w'
{ 473, 6, 6, 6, 0, -6 }, // 0x78 'x'
{ 478, 6, 8, 6, 0, -6 }, // 0x79 'y'
{ 484, 6, 6, 6, 0, -6 }, // 0x7A 'z'
{ 489, 5, 11, 5, 0, -9 }, // 0x7B '{'
{ 496, 2, 9, 4, 1, -8 }, // 0x7C '|'
{ 499, 5, 11, 5, 0, -9 }, // 0x7D '}'
{ 0, 0, 0, 0, 0, 0 }, // 0x7F 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x80 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x81 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x82 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x83 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x84 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x85 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x86 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x87 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x88 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x89 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x8A 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x8B 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x8C 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x8D 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x8E 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x8F 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x90 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x91 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x92 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x93 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x94 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x95 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x96 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x97 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x98 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x99 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x9A 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x9B 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x9C 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x9D 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x9E 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0x9F 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0xA0 ' '
{ 0, 0, 0, 0, 0, 0 }, // 0xA1 '¡'
{ 0, 0, 0, 0, 0, 0 }, // 0xA2 '¢'
{ 0, 0, 0, 0, 0, 0 }, // 0xA3 '£'
{ 0, 0, 0, 0, 0, 0 }, // 0xA4 '¤'
{ 0, 0, 0, 0, 0, 0 }, // 0xA5 '¥'
{ 0, 0, 0, 0, 0, 0 }, // 0xA6 '¦'
{ 0, 0, 0, 0, 0, 0 }, // 0xA7 '§'
{ 0, 0, 0, 0, 0, 0 }, // 0xA8 '¨'
{ 0, 0, 0, 0, 0, 0 }, // 0xA9 '©'
{ 0, 0, 0, 0, 0, 0 }, // 0xAA 'ª'
{ 0, 0, 0, 0, 0, 0 }, // 0xAB '«'
{ 0, 0, 0, 0, 0, 0 }, // 0xAC '¬'
{ 0, 0, 0, 0, 0, 0 }, // 0xAD 'non-printable'
{ 0, 0, 0, 0, 0, 0 }, // 0xAE '®'
{ 0, 0, 0, 0, 0, 0 }, // 0xAF '¯'
{ 0, 0, 0, 0, 0, 0 }, // 0xB0 '°'
{ 0, 0, 0, 0, 0, 0 }, // 0xB1 '±'
{ 0, 0, 0, 0, 0, 0 }, // 0xB2 '²'
{ 0, 0, 0, 0, 0, 0 }, // 0xB3 '³'
{ 0, 0, 0, 0, 0, 0 }, // 0xB4 '´'
{ 0, 0, 0, 0, 0, 0 }, // 0xB5 'µ'
{ 0, 0, 0, 0, 0, 0 }, // 0xB6 '¶'
{ 0, 0, 0, 0, 0, 0 }, // 0xB7 '·'
{ 0, 0, 0, 0, 0, 0 }, // 0xB8 '¸'
{ 0, 0, 0, 0, 0, 0 }, // 0xB9 '¹'
{ 0, 0, 0, 0, 0, 0 }, // 0xBA 'º'
{ 0, 0, 0, 0, 0, 0 }, // 0xBB '»'
{ 0, 0, 0, 0, 0, 0 }, // 0xBC '¼'
{ 0, 0, 0, 0, 0, 0 }, // 0xBD '½'
{ 0, 0, 0, 0, 0, 0 }, // 0xBE '¾'
{ 0, 0, 0, 0, 0, 0 }, // 0xBF '¿'
{ 0, 0, 0, 0, 0, 0 }, // 0xC0 'À'
{ 0, 0, 0, 0, 0, 0 }, // 0xC1 'Á'
{ 0, 0, 0, 0, 0, 0 }, // 0xC2 'Â'
{ 0, 0, 0, 0, 0, 0 }, // 0xC3 'Ã'
{ 0, 0, 0, 0, 0, 0 }, // 0xC4 'Ä'
{ 0, 0, 0, 0, 0, 0 }, // 0xC5 'Å'
{ 0, 0, 0, 0, 0, 0 }, // 0xC6 'Æ'
{ 0, 0, 0, 0, 0, 0 }, // 0xC7 'Ç'
{ 0, 0, 0, 0, 0, 0 }, // 0xC8 'È'
{ 0, 0, 0, 0, 0, 0 }, // 0xC9 'É'
{ 0, 0, 0, 0, 0, 0 }, // 0xCA 'Ê'
{ 0, 0, 0, 0, 0, 0 }, // 0xCB 'Ë'
{ 0, 0, 0, 0, 0, 0 }, // 0xCC 'Ì'
{ 0, 0, 0, 0, 0, 0 }, // 0xCD 'Í'
{ 0, 0, 0, 0, 0, 0 }, // 0xCE 'Î'
{ 0, 0, 0, 0, 0, 0 }, // 0xCF 'Ï'
{ 0, 0, 0, 0, 0, 0 }, // 0xD0 'Ð'
{ 0, 0, 0, 0, 0, 0 }, // 0xD1 'Ñ'
{ 0, 0, 0, 0, 0, 0 }, // 0xD2 'Ò'
{ 0, 0, 0, 0, 0, 0 }, // 0xD3 'Ó'
{ 0, 0, 0, 0, 0, 0 }, // 0xD4 'Ô'
{ 0, 0, 0, 0, 0, 0 }, // 0xD5 'Õ'
{ 0, 0, 0, 0, 0, 0 }, // 0xD6 'Ö'
{ 0, 0, 0, 0, 0, 0 }, // 0xD7 '×'
{ 0, 0, 0, 0, 0, 0 }, // 0xD8 'Ø'
{ 0, 0, 0, 0, 0, 0 }, // 0xD9 'Ù'
{ 0, 0, 0, 0, 0, 0 }, // 0xDA 'Ú'
{ 0, 0, 0, 0, 0, 0 }, // 0xDB 'Û'
{ 0, 0, 0, 0, 0, 0 }, // 0xDC 'Ü'
{ 0, 0, 0, 0, 0, 0 }, // 0xDD 'Ý'
{ 0, 0, 0, 0, 0, 0 }, // 0xDE 'Þ'
{ 0, 0, 0, 0, 0, 0 }, // 0xDF 'ß'
{ 0, 0, 0, 0, 0, 0 }, // 0xE0 'à'
{ 0, 0, 0, 0, 0, 0 }, // 0xE1 'á'
{ 0, 0, 0, 0, 0, 0 }, // 0xE2 'â'
{ 0, 0, 0, 0, 0, 0 }, // 0xE3 'ã'
{ 506, 5, 9, 6, 0, -9 }, // 0xE4 'ä'
{ 0, 0, 0, 0, 0, 0 }, // 0xE5 'å'
{ 0, 0, 0, 0, 0, 0 }, // 0xE6 'æ'
{ 0, 0, 0, 0, 0, 0 }, // 0xE7 'ç'
{ 0, 0, 0, 0, 0, 0 }, // 0xE8 'è'
{ 0, 0, 0, 0, 0, 0 }, // 0xE9 'é'
{ 0, 0, 0, 0, 0, 0 }, // 0xEA 'ê'
{ 0, 0, 0, 0, 0, 0 }, // 0xEB 'ë'
{ 0, 0, 0, 0, 0, 0 }, // 0xEC 'ì'
{ 0, 0, 0, 0, 0, 0 }, // 0xED 'í'
{ 0, 0, 0, 0, 0, 0 }, // 0xEE 'î'
{ 0, 0, 0, 0, 0, 0 }, // 0xEF 'ï'
{ 0, 0, 0, 0, 0, 0 }, // 0xF0 'ð'
{ 0, 0, 0, 0, 0, 0 }, // 0xF1 'ñ'
{ 0, 0, 0, 0, 0, 0 }, // 0xF2 'ò'
{ 0, 0, 0, 0, 0, 0 }, // 0xF3 'ó'
{ 0, 0, 0, 0, 0, 0 }, // 0xF4 'ô'
{ 0, 0, 0, 0, 0, 0 }, // 0xF5 'õ'
{ 513, 7, 9, 7, 0, -9 }, // 0xF6 'ö'
{ 0, 0, 0, 0, 0, 0 }, // 0xF7 '÷'
{ 0, 0, 0, 0, 0, 0 }, // 0xF8 'ø'
{ 0, 0, 0, 0, 0, 0 }, // 0xF9 'ù'
{ 0, 0, 0, 0, 0, 0 }, // 0xFA 'ú'
{ 0, 0, 0, 0, 0, 0 }, // 0xFB 'û'
{ 522, 5, 8, 6, 0, -8 } // 0xFC 'ü'
};
const GFXfont Roboto_11 PROGMEM = {
(uint8_t *)Roboto_11Bitmaps, (GFXglyph *)Roboto_11Glyphs, 0x20, 0xFC, 14}; `
Hope someone can help me
does not work anymore since
Remove yAdvance guessing, parse max glyph height inc. offsets
Example read in:
const GFXfont MyFontIcons PROGMEM = {
(uint8_t *)MyFontIconsBitmaps,
(GFXglyph *)MyFontIconsGlyphs, 32, 80, 24};
Example output, bug 0x32 and 0x80 instead of 32 and 80:
const GFXfont MyFontIcons PROGMEM = {
(uint8_t *)MyFontIconsBitmaps,
(GFXglyph *)MyFontIconsGlyphs, 0x32, 0x80, 24};
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.