diff --git a/lib/font.c b/lib/font.c new file mode 100644 index 0000000..a0a9ae6 --- /dev/null +++ b/lib/font.c @@ -0,0 +1,337 @@ +/* This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +/** monospace pixel fonts collection (code) + * @file + * @author King Kévin + * @date 2018 + */ +#include // standard integer types +#include "font.h" // own definitions + +/** 8x5 px monospace bitmap font */ +const uint16_t font_king8[FONT_GLYPH_NUMBERS * 5] = { + 0x00, 0x00, 0x00, 0x00, 0x00, // ' ' + 0x00, 0x00, 0xfa, 0x00, 0x00, // '!' + 0x00, 0xc0, 0x00, 0xc0, 0x00, // '"' + 0x28, 0x7c, 0x28, 0x7c, 0x28, // '#' + 0x24, 0x54, 0xfe, 0x54, 0x48, // '$' + 0xc6, 0xc8, 0x10, 0x26, 0xc6, // '%' + 0x6c, 0x92, 0x6a, 0x04, 0x0a, // '&' + 0x00, 0xc0, 0x00, 0x00, 0x00, // ''' + 0x00, 0x3c, 0x42, 0x81, 0x00, // '(' + 0x00, 0x81, 0x42, 0x3c, 0x00, // ')' + 0x54, 0x38, 0x7c, 0x38, 0x54, // '*' + 0x10, 0x10, 0x7c, 0x10, 0x10, // '+' + 0x00, 0x02, 0x0c, 0x00, 0x00, // ',' + 0x00, 0x10, 0x10, 0x10, 0x00, // '-' + 0x00, 0x00, 0x0c, 0x00, 0x00, // '.' + 0x06, 0x08, 0x10, 0x20, 0xc0, // '/' + 0x7c, 0x8a, 0x92, 0xa2, 0x7c, // '0' + 0x00, 0x42, 0xfe, 0x02, 0x00, // '1' + 0x00, 0x86, 0x8a, 0x92, 0x62, // '2' + 0x00, 0x82, 0x92, 0x92, 0x6c, // '3' + 0x18, 0x28, 0x48, 0xfe, 0x08, // '4' + 0xe4, 0xa2, 0xa2, 0xa2, 0x9c, // '5' + 0x7c, 0x92, 0x92, 0x92, 0x0c, // '6' + 0x80, 0x8e, 0x90, 0xa0, 0xc0, // '7' + 0x6c, 0x92, 0x92, 0x92, 0x6c, // '8' + 0x60, 0x92, 0x92, 0x92, 0x7c, // '9' + 0x00, 0x00, 0x6c, 0x00, 0x00, // ':' + 0x00, 0x02, 0x6c, 0x00, 0x00, // ';' + 0x00, 0x10, 0x28, 0x44, 0x00, // '<' + 0x00, 0x28, 0x28, 0x28, 0x00, // '=' + 0x00, 0x44, 0x28, 0x10, 0x00, // '>' + 0x40, 0x80, 0x9a, 0xa0, 0x40, // '?' + 0x7c, 0x82, 0xba, 0xaa, 0x7a, // '@' + 0x7e, 0x90, 0x90, 0x90, 0x7e, // 'A' + 0xfe, 0x92, 0x92, 0x92, 0x6c, // 'B' + 0x7c, 0x82, 0x82, 0x82, 0x82, // 'C' + 0xfe, 0x82, 0x82, 0x82, 0x7c, // 'D' + 0xfe, 0x92, 0x92, 0x92, 0x82, // 'E' + 0xfe, 0x90, 0x90, 0x90, 0x80, // 'F' + 0x7c, 0x82, 0x82, 0x92, 0x9c, // 'G' + 0xfe, 0x10, 0x10, 0x10, 0xfe, // 'H' + 0x00, 0x82, 0xfe, 0x82, 0x00, // 'I' + 0x00, 0x82, 0x82, 0xfc, 0x00, // 'J' + 0xfe, 0x10, 0x28, 0x44, 0x82, // 'K' + 0xfe, 0x02, 0x02, 0x02, 0x02, // 'L' + 0xfe, 0x40, 0x20, 0x40, 0xfe, // 'M' + 0xfe, 0x20, 0x10, 0x08, 0xfe, // 'N' + 0x7c, 0x82, 0x82, 0x82, 0x7c, // 'O' + 0xfe, 0x90, 0x90, 0x90, 0x60, // 'P' + 0x7c, 0x82, 0x8a, 0x84, 0x7a, // 'Q' + 0xfe, 0x90, 0x98, 0x94, 0x62, // 'R' + 0x62, 0x92, 0x92, 0x92, 0x8c, // 'S' + 0x80, 0x80, 0xfe, 0x80, 0x80, // 'T' + 0xfc, 0x02, 0x02, 0x02, 0xfc, // 'U' + 0xe0, 0x18, 0x06, 0x18, 0xe0, // 'V' + 0xf8, 0x06, 0x18, 0x06, 0xf8, // 'W' + 0xc6, 0x28, 0x10, 0x28, 0xc6, // 'X' + 0xc0, 0x20, 0x1e, 0x20, 0xc0, // 'Y' + 0x86, 0x8a, 0x92, 0xa2, 0xc2, // 'Z' + 0x00, 0xfe, 0x82, 0x82, 0x00, // '[' + 0xc0, 0x20, 0x10, 0x08, 0x06, // '\' + 0x00, 0x82, 0x82, 0xfe, 0x00, // ']' + 0x00, 0x20, 0x40, 0x20, 0x00, // '^' + 0x02, 0x02, 0x02, 0x02, 0x02, // '_' + 0x00, 0x40, 0x20, 0x00, 0x00, // '`' + 0x04, 0x2a, 0x2a, 0x1e, 0x00, // 'a' + 0x7e, 0x12, 0x12, 0x0c, 0x00, // 'b' + 0x1c, 0x22, 0x22, 0x22, 0x00, // 'c' + 0x0c, 0x12, 0x12, 0x7e, 0x00, // 'd' + 0x1c, 0x2a, 0x2a, 0x18, 0x00, // 'e' + 0x10, 0x3e, 0x50, 0x40, 0x00, // 'f' + 0x18, 0x25, 0x25, 0x1e, 0x00, // 'g' + 0x7e, 0x10, 0x10, 0x0e, 0x00, // 'h' + 0x00, 0x10, 0x5e, 0x00, 0x00, // 'i' + 0x01, 0x01, 0x5e, 0x00, 0x00, // 'j' + 0x7e, 0x08, 0x14, 0x22, 0x00, // 'k' + 0x00, 0x40, 0x7c, 0x02, 0x00, // 'l' + 0x3e, 0x20, 0x1e, 0x20, 0x1e, // 'm' + 0x00, 0x3e, 0x20, 0x1e, 0x00, // 'n' + 0x1c, 0x22, 0x22, 0x1c, 0x00, // 'o' + 0x3f, 0x24, 0x24, 0x18, 0x00, // 'p' + 0x18, 0x24, 0x24, 0x3f, 0x00, // 'q' + 0x3e, 0x10, 0x20, 0x10, 0x00, // 'r' + 0x12, 0x2a, 0x2a, 0x24, 0x00, // 's' + 0x7c, 0x12, 0x12, 0x02, 0x00, // 't' + 0x3c, 0x02, 0x02, 0x3e, 0x00, // 'u' + 0x38, 0x04, 0x02, 0x04, 0x38, // 'v' + 0x3c, 0x02, 0x0c, 0x02, 0x3c, // 'w' + 0x36, 0x08, 0x08, 0x36, 0x00, // 'x' + 0x30, 0x09, 0x09, 0x3e, 0x00, // 'y' + 0x26, 0x2a, 0x2a, 0x32, 0x00, // 'z' + 0x10, 0x6c, 0x82, 0x00, 0x00, // '{' + 0x00, 0x00, 0xfe, 0x00, 0x00, // '|' + 0x00, 0x82, 0x6c, 0x10, 0x00, // '}' + 0x20, 0x40, 0x60, 0x20, 0x40, // '~' +}; + +/** 10x6 px monospace bitmap font */ +static const uint16_t font_king10[FONT_GLYPH_NUMBERS * 6] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // ' ' + 0x0000, 0x0000, 0x01f6, 0x0000, 0x0000, 0x0000, // '!' + 0x0000, 0x0180, 0x0000, 0x0180, 0x0000, 0x0000, // '"' + 0x0028, 0x00fe, 0x0028, 0x00fe, 0x0028, 0x0000, // '#' + 0x00c4, 0x0124, 0x03fe, 0x0124, 0x0118, 0x0000, // '$' + 0x00c6, 0x00c8, 0x0010, 0x0020, 0x004c, 0x018c, // '%' + 0x00dc, 0x0122, 0x0122, 0x00d2, 0x000c, 0x0012, // '&' + 0x0000, 0x0000, 0x0180, 0x0000, 0x0000, 0x0000, // ''' + 0x0000, 0x0078, 0x0186, 0x0201, 0x0000, 0x0000, // '(' + 0x0000, 0x0201, 0x0186, 0x0078, 0x0000, 0x0000, // ')' + 0x0090, 0x0060, 0x00f0, 0x0060, 0x0090, 0x0000, // '*' + 0x0020, 0x0020, 0x00f8, 0x0020, 0x0020, 0x0000, // '+' + 0x0000, 0x0000, 0x0001, 0x0006, 0x0000, 0x0000, // ',' + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0000, // '-' + 0x0000, 0x0000, 0x0000, 0x0006, 0x0000, 0x0000, // '.' + 0x0003, 0x000c, 0x0030, 0x00c0, 0x0300, 0x0000, // '/' + 0x01fc, 0x0212, 0x0222, 0x0242, 0x0282, 0x01fc, // '0' + 0x0000, 0x0040, 0x0080, 0x0100, 0x03fe, 0x0000, // '1' + 0x0102, 0x0206, 0x020a, 0x0212, 0x0222, 0x01c2, // '2' + 0x0202, 0x0202, 0x0222, 0x0222, 0x0222, 0x01dc, // '3' + 0x0030, 0x0050, 0x0090, 0x0110, 0x03fe, 0x0010, // '4' + 0x03c4, 0x0242, 0x0242, 0x0242, 0x0242, 0x023c, // '5' + 0x01fc, 0x0222, 0x0222, 0x0222, 0x0222, 0x001c, // '6' + 0x0200, 0x0200, 0x023e, 0x0240, 0x0280, 0x0300, // '7' + 0x01dc, 0x0222, 0x0222, 0x0222, 0x0222, 0x01dc, // '8' + 0x01c0, 0x0222, 0x0222, 0x0222, 0x0222, 0x01fc, // '9' + 0x0000, 0x0000, 0x00cc, 0x0000, 0x0000, 0x0000, // ':' + 0x0000, 0x0002, 0x00cc, 0x0000, 0x0000, 0x0000, // ';' + 0x0000, 0x0020, 0x0050, 0x0088, 0x0104, 0x0000, // '<' + 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0000, // '=' + 0x0000, 0x0104, 0x0088, 0x0050, 0x0020, 0x0000, // '>' + 0x0100, 0x0200, 0x021a, 0x0220, 0x0240, 0x0180, // '?' + 0x0078, 0x0084, 0x0132, 0x014a, 0x014a, 0x00fa, // '@' + 0x01fe, 0x0220, 0x0220, 0x0220, 0x0220, 0x01fe, // 'A' + 0x03fe, 0x0222, 0x0222, 0x0222, 0x0222, 0x01dc, // 'B' + 0x01fc, 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, // 'C' + 0x03fe, 0x0202, 0x0202, 0x0202, 0x0202, 0x01fc, // 'D' + 0x03fe, 0x0222, 0x0222, 0x0222, 0x0222, 0x0202, // 'E' + 0x03fe, 0x0220, 0x0220, 0x0220, 0x0220, 0x0200, // 'F' + 0x01fc, 0x0202, 0x0202, 0x0202, 0x0222, 0x023c, // 'G' + 0x03fe, 0x0020, 0x0020, 0x0020, 0x0020, 0x03fe, // 'H' + 0x0202, 0x0202, 0x03fe, 0x0202, 0x0202, 0x0000, // 'I' + 0x0202, 0x0202, 0x0202, 0x0204, 0x03f8, 0x0000, // 'J' + 0x03fe, 0x0020, 0x0050, 0x0088, 0x0104, 0x0202, // 'K' + 0x03fe, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, // 'L' + 0x03fe, 0x0100, 0x0080, 0x0080, 0x0100, 0x03fe, // 'M' + 0x03fe, 0x0080, 0x0040, 0x0020, 0x0010, 0x03fe, // 'N' + 0x01fc, 0x0202, 0x0202, 0x0202, 0x0202, 0x01fc, // 'O' + 0x03fe, 0x0220, 0x0220, 0x0220, 0x0220, 0x01c0, // 'P' + 0x01fc, 0x0202, 0x0202, 0x020a, 0x0204, 0x01fa, // 'Q' + 0x03fe, 0x0220, 0x0230, 0x0228, 0x0224, 0x01c2, // 'R' + 0x01c2, 0x0222, 0x0222, 0x0222, 0x0222, 0x021c, // 'S' + 0x0200, 0x0200, 0x03fe, 0x0200, 0x0200, 0x0000, // 'T' + 0x03fc, 0x0002, 0x0002, 0x0002, 0x0002, 0x03fc, // 'U' + 0x03e0, 0x0018, 0x0006, 0x0006, 0x0018, 0x03e0, // 'V' + 0x03fc, 0x0002, 0x000c, 0x000c, 0x0002, 0x03fc, // 'W' + 0x038e, 0x0050, 0x0020, 0x0020, 0x0050, 0x038e, // 'X' + 0x0380, 0x0040, 0x003e, 0x0040, 0x0380, 0x0000, // 'Y' + 0x020e, 0x0212, 0x0222, 0x0242, 0x0282, 0x0302, // 'Z' + 0x0000, 0x03fe, 0x0202, 0x0202, 0x0202, 0x0000, // '[' + 0x0000, 0x0300, 0x00c0, 0x0030, 0x000c, 0x0003, // '\' + 0x0000, 0x0202, 0x0202, 0x0202, 0x03fe, 0x0000, // ']' + 0x0040, 0x0080, 0x0100, 0x0080, 0x0040, 0x0000, // '^' + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, // '_' + 0x0000, 0x0100, 0x0080, 0x0040, 0x0000, 0x0000, // '`' + 0x0004, 0x002a, 0x002a, 0x002a, 0x001e, 0x0000, // 'a' + 0x01fe, 0x0022, 0x0022, 0x0022, 0x001c, 0x0000, // 'b' + 0x001c, 0x0022, 0x0022, 0x0022, 0x0022, 0x0000, // 'c' + 0x001c, 0x0022, 0x0022, 0x0022, 0x01fe, 0x0000, // 'd' + 0x001c, 0x002a, 0x002a, 0x002a, 0x0018, 0x0000, // 'e' + 0x0020, 0x00fe, 0x0120, 0x0120, 0x0100, 0x0000, // 'f' + 0x0018, 0x0025, 0x0025, 0x0025, 0x001e, 0x0000, // 'g' + 0x01fe, 0x0020, 0x0020, 0x0020, 0x001e, 0x0000, // 'h' + 0x0000, 0x0020, 0x00be, 0x0000, 0x0000, 0x0000, // 'i' + 0x0000, 0x0001, 0x0021, 0x00be, 0x0000, 0x0000, // 'j' + 0x01fe, 0x0010, 0x0028, 0x0046, 0x0000, 0x0000, // 'k' + 0x0000, 0x0100, 0x01fc, 0x0002, 0x0000, 0x0000, // 'l' + 0x003e, 0x0020, 0x001e, 0x0020, 0x001e, 0x0000, // 'm' + 0x0000, 0x003e, 0x0020, 0x0020, 0x001e, 0x0000, // 'n' + 0x001c, 0x0022, 0x0022, 0x0022, 0x001c, 0x0000, // 'o' + 0x003f, 0x0024, 0x0024, 0x0024, 0x0018, 0x0000, // 'p' + 0x0018, 0x0024, 0x0024, 0x0024, 0x003f, 0x0000, // 'q' + 0x003e, 0x0010, 0x0020, 0x0020, 0x0010, 0x0000, // 'r' + 0x0012, 0x002a, 0x002a, 0x002a, 0x0024, 0x0000, // 's' + 0x0000, 0x01fc, 0x0042, 0x0042, 0x0002, 0x0000, // 't' + 0x003c, 0x0002, 0x0002, 0x0002, 0x003e, 0x0000, // 'u' + 0x0030, 0x000c, 0x0002, 0x000c, 0x0030, 0x0000, // 'v' + 0x003c, 0x0002, 0x001c, 0x0002, 0x003c, 0x0000, // 'w' + 0x0022, 0x0014, 0x0008, 0x0014, 0x0022, 0x0000, // 'x' + 0x0038, 0x0005, 0x0005, 0x0005, 0x003e, 0x0000, // 'y' + 0x0022, 0x0026, 0x002a, 0x0032, 0x0022, 0x0000, // 'z' + 0x0000, 0x0020, 0x01dc, 0x0202, 0x0000, 0x0000, // '{' + 0x0000, 0x0000, 0x03fe, 0x0000, 0x0000, 0x0000, // '|' + 0x0000, 0x0202, 0x01dc, 0x0020, 0x0000, 0x0000, // '}' + 0x0020, 0x0040, 0x0040, 0x0020, 0x0020, 0x0040, // '~' +}; + +/** 14*9 px monospace bitmap font */ +static const uint16_t font_king14[FONT_GLYPH_NUMBERS * 9] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // ' ' + 0x0000, 0x0000, 0x0000, 0x1fe6, 0x1fe6, 0x0000, 0x0000, 0x0000, 0x0000, // '!' + 0x0000, 0x0e00, 0x0e00, 0x0000, 0x0000, 0x0e00, 0x0e00, 0x0000, 0x0000, // '"' + 0x0330, 0x0ffc, 0x0ffc, 0x0330, 0x0330, 0x0ffc, 0x0ffc, 0x0330, 0x0000, // '#' + 0x0718, 0x0f9c, 0x1dce, 0x18c6, 0x3fff, 0x18c6, 0x1cee, 0x0e7c, 0x0638, // '$' + 0x041e, 0x0e3e, 0x1b70, 0x0ee0, 0x05d0, 0x03b8, 0x076c, 0x3e38, 0x3c10, // '%' + 0x0e78, 0x1ffe, 0x3186, 0x3186, 0x1fce, 0x0e7c, 0x0038, 0x006c, 0x00c6, // '&' + 0x0000, 0x0000, 0x0000, 0x0e00, 0x0e00, 0x0000, 0x0000, 0x0000, 0x0000, // ''' + 0x0000, 0x0000, 0x07f8, 0x0ffc, 0x1c0e, 0x3807, 0x3003, 0x0000, 0x0000, // '(' + 0x0000, 0x0000, 0x3003, 0x3807, 0x1c0e, 0x0ffc, 0x03f0, 0x0000, 0x0000, // ')' + 0x0ccc, 0x06d8, 0x03f0, 0x0ffc, 0x0ffc, 0x03f0, 0x06d8, 0x0ccc, 0x0000, // '*' + 0x0000, 0x01c0, 0x01c0, 0x07f0, 0x07f0, 0x07f0, 0x01c0, 0x01c0, 0x0000, // '+' + 0x0000, 0x0000, 0x0003, 0x0007, 0x001e, 0x001c, 0x0000, 0x0000, 0x0000, // ',' + 0x0000, 0x00c0, 0x00c0, 0x00c0, 0x00c0, 0x00c0, 0x00c0, 0x00c0, 0x0000, // '-' + 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x0000, 0x0000, 0x0000, 0x0000, // '.' + 0x0003, 0x000f, 0x003c, 0x00f0, 0x03c0, 0x0f00, 0x3c00, 0x3000, 0x0000, // '/' + 0x0ffc, 0x1ffe, 0x3033, 0x3063, 0x30c3, 0x3183, 0x3303, 0x1ffe, 0x0ffc, // '0' + 0x0000, 0x0000, 0x0600, 0x0e00, 0x1e00, 0x3fff, 0x3fff, 0x0000, 0x0000, // '1' + 0x0c07, 0x1c0f, 0x381f, 0x303b, 0x3073, 0x30e3, 0x39c3, 0x1f83, 0x0f03, // '2' + 0x3003, 0x3003, 0x30c3, 0x30c3, 0x30c3, 0x30c3, 0x39e7, 0x1ffe, 0x0f3c, // '3' + 0x00f0, 0x01f0, 0x03b0, 0x0730, 0x0e30, 0x1c30, 0x3fff, 0x3fff, 0x0030, // '4' + 0x3f1c, 0x3f1e, 0x3307, 0x3303, 0x3303, 0x3303, 0x3387, 0x31fe, 0x30fc, // '5' + 0x0ffc, 0x1ffe, 0x39c7, 0x3183, 0x3183, 0x3183, 0x31c7, 0x30fe, 0x007c, // '6' + 0x3000, 0x3000, 0x3000, 0x30ff, 0x31ff, 0x3380, 0x3700, 0x3e00, 0x3c00, // '7' + 0x0f7c, 0x1ffe, 0x39e7, 0x30c3, 0x30c3, 0x30c3, 0x39e7, 0x1ffe, 0x0f3c, // '8' + 0x0f80, 0x1fc3, 0x38e3, 0x3063, 0x3063, 0x3063, 0x38e7, 0x1ffe, 0x0ffc, // '9' + 0x0000, 0x0000, 0x0000, 0x071c, 0x071c, 0x0000, 0x0000, 0x0000, 0x0000, // ':' + 0x0000, 0x0000, 0x0003, 0x0007, 0x071e, 0x071c, 0x0000, 0x0000, 0x0000, // ';' + 0x0000, 0x01c0, 0x03e0, 0x0770, 0x0e38, 0x1c1c, 0x380e, 0x3006, 0x0000, // '<' + 0x0000, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0000, // '=' + 0x0000, 0x3006, 0x380e, 0x1c1c, 0x0e38, 0x0770, 0x03e0, 0x01c0, 0x0000, // '>' + 0x0c00, 0x1c00, 0x3800, 0x303b, 0x307b, 0x30e0, 0x39c0, 0x1f80, 0x0f00, // '?' + 0x07f8, 0x0ffc, 0x1c0e, 0x19e6, 0x1bf6, 0x1b36, 0x1f36, 0x0ff6, 0x07e6, // '@' + 0x0fff, 0x1fff, 0x38c0, 0x30c0, 0x30c0, 0x30c0, 0x38c0, 0x1fff, 0x0fff, // 'A' + 0x3fff, 0x3fff, 0x30c3, 0x30c3, 0x30c3, 0x30c3, 0x39e7, 0x1ffe, 0x0f3c, // 'B' + 0x0ffc, 0x1ffe, 0x3807, 0x3003, 0x3003, 0x3003, 0x3003, 0x3003, 0x3003, // 'C' + 0x3fff, 0x3fff, 0x3003, 0x3003, 0x3003, 0x3807, 0x1c0e, 0x0ffc, 0x07f8, // 'D' + 0x3fff, 0x3fff, 0x30c3, 0x30c3, 0x30c3, 0x30c3, 0x30c3, 0x3003, 0x3003, // 'E' + 0x3fff, 0x3fff, 0x3180, 0x3180, 0x3180, 0x3180, 0x3180, 0x3000, 0x3000, // 'F' + 0x1ffe, 0x3fff, 0x3807, 0x3003, 0x3003, 0x30c3, 0x30c3, 0x38ff, 0x18fe, // 'G' + 0x3fff, 0x3fff, 0x00c0, 0x00c0, 0x00c0, 0x00c0, 0x00c0, 0x3fff, 0x3fff, // 'H' + 0x3003, 0x3003, 0x3003, 0x3fff, 0x3fff, 0x3003, 0x3003, 0x3003, 0x0000, // 'I' + 0x0000, 0x3003, 0x3007, 0x300e, 0x301c, 0x3ff8, 0x3ff0, 0x0000, 0x0000, // 'J' + 0x3fff, 0x3fff, 0x01e0, 0x03f0, 0x0738, 0x0e1c, 0x1c0e, 0x3807, 0x3003, // 'K' + 0x3fff, 0x3fff, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, // 'L' + 0x3fff, 0x3fff, 0x1c00, 0x0e00, 0x0700, 0x0e00, 0x1c00, 0x3fff, 0x3fff, // 'M' + 0x3fff, 0x3fff, 0x0700, 0x0380, 0x01c0, 0x00e0, 0x0070, 0x3fff, 0x3fff, // 'N' + 0x0ffc, 0x1ffe, 0x3807, 0x3003, 0x3003, 0x3003, 0x3807, 0x1ffe, 0x0ffc, // 'O' + 0x3fff, 0x3fff, 0x3060, 0x3060, 0x3060, 0x3060, 0x38e0, 0x1fc0, 0x0f80, // 'P' + 0x0ffc, 0x1ffe, 0x3003, 0x3003, 0x301b, 0x301f, 0x300e, 0x1fff, 0x0ffb, // 'Q' + 0x3fff, 0x3fff, 0x30e0, 0x30f0, 0x30f8, 0x30dc, 0x39ce, 0x1f87, 0x0f03, // 'R' + 0x0f03, 0x1f83, 0x39c3, 0x30c3, 0x30c3, 0x30c3, 0x30e7, 0x307e, 0x303c, // 'S' + 0x3000, 0x3000, 0x3000, 0x3fff, 0x3fff, 0x3fff, 0x3000, 0x3000, 0x3000, // 'T' + 0x3ffc, 0x3ffe, 0x0007, 0x0003, 0x0003, 0x0003, 0x0007, 0x3ffe, 0x3ffc, // 'U' + 0x3ff0, 0x3ff8, 0x003c, 0x001e, 0x000f, 0x001e, 0x003c, 0x3ff8, 0x3ff0, // 'V' + 0x3ffc, 0x3ffe, 0x000f, 0x001e, 0x003c, 0x001e, 0x000f, 0x3ffe, 0x3ffc, // 'W' + 0x3e1f, 0x3f3f, 0x03f0, 0x01e0, 0x00c0, 0x01e0, 0x03f0, 0x3f3f, 0x3e1f, // 'X' + 0x3f00, 0x3f80, 0x01c0, 0x00ff, 0x007f, 0x00ff, 0x01c0, 0x3f80, 0x3f00, // 'Y' + 0x300f, 0x301f, 0x303b, 0x3073, 0x30e3, 0x31c3, 0x3383, 0x3f03, 0x3e03, // 'Z' + 0x0000, 0x0000, 0x3fff, 0x3fff, 0x3003, 0x3003, 0x3003, 0x3003, 0x0000, // '[' + 0x3000, 0x3c00, 0x0f00, 0x03c0, 0x00f0, 0x003c, 0x000f, 0x0003, 0x0000, // '\' + 0x0000, 0x0000, 0x3003, 0x3003, 0x3003, 0x3003, 0x3fff, 0x3fff, 0x0000, // ']' + 0x0000, 0x0380, 0x0700, 0x0e00, 0x1c00, 0x0e00, 0x0700, 0x0380, 0x0000, // '^' + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, // '_' + 0x0000, 0x0000, 0x1800, 0x1c00, 0x0e00, 0x0700, 0x0300, 0x0000, 0x0000, // '`' + 0x0000, 0x001c, 0x01be, 0x01b6, 0x01b6, 0x01b6, 0x01fe, 0x00fe, 0x0000, // 'a' + 0x0000, 0x0ffe, 0x0ffe, 0x00c6, 0x00c6, 0x00c6, 0x00fe, 0x007c, 0x0000, // 'b' + 0x0000, 0x00fc, 0x01fe, 0x0186, 0x0186, 0x0186, 0x0186, 0x0186, 0x0000, // 'c' + 0x0000, 0x007c, 0x00fe, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x0ffe, 0x0ffe, // 'd' + 0x0000, 0x00fc, 0x01fe, 0x01b6, 0x01b6, 0x01b6, 0x01f6, 0x00e0, 0x0000, // 'e' + 0x0000, 0x00c0, 0x00c0, 0x07fe, 0x0ffe, 0x0cc0, 0x0cc0, 0x0c00, 0x0000, // 'f' + 0x0000, 0x01e0, 0x03f3, 0x0333, 0x0333, 0x0333, 0x03ff, 0x01fe, 0x0000, // 'g' + 0x0000, 0x0ffe, 0x0ffe, 0x00c0, 0x00c0, 0x00c0, 0x00fe, 0x007e, 0x0000, // 'h' + 0x0000, 0x0000, 0x0000, 0x00c0, 0x06fe, 0x06fe, 0x0000, 0x0000, 0x0000, // 'i' + 0x0000, 0x0000, 0x0003, 0x0187, 0x0dfe, 0x0dfc, 0x0000, 0x0000, 0x0000, // 'j' + 0x0000, 0x0ffe, 0x0ffe, 0x0078, 0x00fc, 0x01ce, 0x0186, 0x0102, 0x0000, // 'k' + 0x0000, 0x0800, 0x0ffc, 0x0ffe, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, // 'l' + 0x0000, 0x01fe, 0x01fe, 0x0180, 0x00fe, 0x0180, 0x01fe, 0x00fe, 0x0000, // 'm' + 0x0000, 0x01fe, 0x01fe, 0x0180, 0x0180, 0x0180, 0x01fe, 0x00fe, 0x0000, // 'n' + 0x0000, 0x00fc, 0x01fe, 0x0186, 0x0186, 0x0186, 0x01fe, 0x00fc, 0x0000, // 'o' + 0x0000, 0x03ff, 0x03ff, 0x0318, 0x0318, 0x0318, 0x03f8, 0x01f0, 0x0000, // 'p' + 0x0000, 0x01f0, 0x03f8, 0x0318, 0x0318, 0x0318, 0x03ff, 0x03ff, 0x0000, // 'q' + 0x0000, 0x01fe, 0x01fe, 0x00c0, 0x0180, 0x0180, 0x01c0, 0x00c0, 0x0000, // 'r' + 0x0000, 0x00e6, 0x01f6, 0x01b6, 0x01b6, 0x01b6, 0x01be, 0x019c, 0x0000, // 's' + 0x0000, 0x0000, 0x0ffc, 0x0ffe, 0x00c6, 0x00c6, 0x00c6, 0x0006, 0x0000, // 't' + 0x0000, 0x01fc, 0x01fe, 0x0006, 0x0006, 0x0006, 0x01fe, 0x01fe, 0x0000, // 'u' + 0x0000, 0x01f0, 0x01f8, 0x001c, 0x000e, 0x001c, 0x01f8, 0x01f0, 0x0000, // 'v' + 0x0000, 0x01fc, 0x01fe, 0x0006, 0x007c, 0x0006, 0x01fe, 0x01fc, 0x0000, // 'w' + 0x0000, 0x01c6, 0x01ee, 0x007c, 0x0038, 0x007c, 0x01ee, 0x01c6, 0x0000, // 'x' + 0x0000, 0x01f0, 0x01fb, 0x001b, 0x001b, 0x001b, 0x01ff, 0x01fe, 0x0000, // 'y' + 0x0000, 0x0186, 0x018e, 0x019e, 0x01b6, 0x01e6, 0x01c6, 0x0186, 0x0000, // 'z' + 0x0000, 0x00c0, 0x01e0, 0x0ffc, 0x1f3e, 0x3807, 0x3003, 0x0000, 0x0000, // '{' + 0x0000, 0x0000, 0x0000, 0x1fff, 0x1fff, 0x0000, 0x0000, 0x0000, 0x0000, // '|' + 0x0000, 0x3003, 0x3807, 0x1f3e, 0x0ffc, 0x01e0, 0x00c0, 0x0000, 0x0000, // '}' + 0x0180, 0x0380, 0x0700, 0x0700, 0x0300, 0x0380, 0x0380, 0x0700, 0x0600, // '~' +}; + +/** list of all available fonts */ +const struct font_s fonts[FONT_MAX] = { + [FONT_KING8] = { + .width = sizeof(font_king8) / sizeof(font_king8[0]) / FONT_GLYPH_NUMBERS, // 5 + .height = 8, + .glyphs = font_king8, + }, + [FONT_KING10] = { + .width = sizeof(font_king10) / sizeof(font_king10[0]) / FONT_GLYPH_NUMBERS, // 6 + .height = 10, + .glyphs = font_king10, + }, + [FONT_KING14] = { + .width = sizeof(font_king14) / sizeof(font_king14[0]) / FONT_GLYPH_NUMBERS, // 9 + .height = 14, + .glyphs = font_king14, + }, +}; diff --git a/lib/font.h b/lib/font.h new file mode 100644 index 0000000..b70a802 --- /dev/null +++ b/lib/font.h @@ -0,0 +1,41 @@ +/* This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +/** monospace pixel fonts collection (API) + * @file + * @author King Kévin + * @date 2018 + */ +#pragma once + +/** list of available font names */ +enum font_name { + FONT_KING8, /**< custom 8x5 monospace font */ + FONT_KING10, /**< custom 10x6 monospace font */ + FONT_KING14, /**< custom 14x9 monospace font */ + FONT_MAX, /**< number of fonts available */ +}; + +/** font structure containing all properties */ +struct font_s { + uint8_t width; /**< font width in pixels */ + uint8_t height; /**< font height in pixels (max 16) */ + const uint16_t* glyphs; /**< font glyphs: width glyph columns (left to right) times FONT_GLYPH_NUMBERS (MSb is glyph top pixel) */ +}; + +/** number of available glyphs (starting with ' ' and ending with '~') */ +#define FONT_GLYPH_NUMBERS 95 + +/** list of all available fonts */ +extern const struct font_s fonts[FONT_MAX];