Repository navigation
Expand file tree
/
Copy pathfont.c
More file actions
99 lines (93 loc) · 4.85 KB
/
Copy pathfont.c
File metadata and controls
99 lines (93 loc) · 4.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include "font.h"
#include <ctype.h>
#include <string.h>
typedef struct {
char character;
const char *rows;
} glyph_t;
/* clang-format off */
static const glyph_t GLYPHS[] = {
{' ', "....." "....." "....." "....." "....." "....." "....."},
{'A', ".###." "#...#" "#...#" "#####" "#...#" "#...#" "#...#"},
{'B', "####." "#...#" "#...#" "####." "#...#" "#...#" "####."},
{'C', ".###." "#...#" "#...." "#...." "#...." "#...#" ".###."},
{'D', "####." "#...#" "#...#" "#...#" "#...#" "#...#" "####."},
{'E', "#####" "#...." "#...." "####." "#...." "#...." "#####"},
{'F', "#####" "#...." "#...." "####." "#...." "#...." "#...."},
{'G', ".###." "#...#" "#...." "#..##" "#...#" "#...#" ".###."},
{'H', "#...#" "#...#" "#...#" "#####" "#...#" "#...#" "#...#"},
{'I', "#####" "..#.." "..#.." "..#.." "..#.." "..#.." "#####"},
{'J', "..###" "...#." "...#." "...#." "...#." "#..#." ".##.."},
{'K', "#...#" "#..#." "#.#.." "##..." "#.#.." "#..#." "#...#"},
{'L', "#...." "#...." "#...." "#...." "#...." "#...." "#####"},
{'M', "#...#" "##.##" "#.#.#" "#...#" "#...#" "#...#" "#...#"},
{'N', "#...#" "##..#" "#.#.#" "#..##" "#...#" "#...#" "#...#"},
{'O', ".###." "#...#" "#...#" "#...#" "#...#" "#...#" ".###."},
{'P', "####." "#...#" "#...#" "####." "#...." "#...." "#...."},
{'Q', ".###." "#...#" "#...#" "#...#" "#.#.#" "#..#." ".##.#"},
{'R', "####." "#...#" "#...#" "####." "#.#.." "#..#." "#...#"},
{'S', ".####" "#...." "#...." ".###." "....#" "....#" "####."},
{'T', "#####" "..#.." "..#.." "..#.." "..#.." "..#.." "..#.."},
{'U', "#...#" "#...#" "#...#" "#...#" "#...#" "#...#" ".###."},
{'V', "#...#" "#...#" "#...#" "#...#" "#...#" ".#.#." "..#.."},
{'W', "#...#" "#...#" "#...#" "#.#.#" "#.#.#" "##.##" "#...#"},
{'X', "#...#" "#...#" ".#.#." "..#.." ".#.#." "#...#" "#...#"},
{'Y', "#...#" "#...#" ".#.#." "..#.." "..#.." "..#.." "..#.."},
{'Z', "#####" "....#" "...#." "..#.." ".#..." "#...." "#####"},
{'0', ".###." "#...#" "#..##" "#.#.#" "##..#" "#...#" ".###."},
{'1', "..#.." ".##.." "..#.." "..#.." "..#.." "..#.." ".###."},
{'2', ".###." "#...#" "....#" "...#." "..#.." ".#..." "#####"},
{'3', "#####" "...#." "..#.." "...#." "....#" "#...#" ".###."},
{'4', "...#." "..##." ".#.#." "#..#." "#####" "...#." "...#."},
{'5', "#####" "#...." "####." "....#" "....#" "#...#" ".###."},
{'6', "..##." ".#..." "#...." "####." "#...#" "#...#" ".###."},
{'7', "#####" "....#" "...#." "..#.." ".#..." ".#..." ".#..."},
{'8', ".###." "#...#" "#...#" ".###." "#...#" "#...#" ".###."},
{'9', ".###." "#...#" "#...#" ".####" "....#" "...#." ".##.."},
{'.', "....." "....." "....." "....." "....." ".##.." ".##.."},
{',', "....." "....." "....." "....." ".##.." ".##.." "..#.."},
{'!', "..#.." "..#.." "..#.." "..#.." "..#.." "....." "..#.."},
{'?', ".###." "#...#" "....#" "...#." "..#.." "....." "..#.."},
{'\'', "..#.." "..#.." "....." "....." "....." "....." "....."},
{'-', "....." "....." "....." "#####" "....." "....." "....."},
{'+', "....." "..#.." "..#.." "#####" "..#.." "..#.." "....."},
{'=', "....." "....." "#####" "....." "#####" "....." "....."},
{':', "....." "..#.." "..#.." "....." "..#.." "..#.." "....."},
{'/', "....#" "....#" "...#." "..#.." ".#..." "#...." "#...."},
{'(', "...#." "..#.." ".#..." ".#..." ".#..." "..#.." "...#."},
{')', ".#..." "..#.." "...#." "...#." "...#." "..#.." ".#..."},
{'*', "....." "#...#" ".#.#." "#####" ".#.#." "#...#" "....."},
{'<', "...#." "..#.." ".#..." "#...." ".#..." "..#.." "...#."},
{'>', ".#..." "..#.." "...#." "....#" "...#." "..#.." ".#..."},
{'#', ".#.#." ".#.#." "#####" ".#.#." "#####" ".#.#." ".#.#."},
{'@', ".###." "#...#" "#.###" "#.#.#" "#.###" "#...." ".###."},
{'%', "#...#" "#..#." "..#.." ".#..." "..#.." ".#..#" "#...#"},
{'&', ".##.." "#..#." "#.#.." ".#..." "#.#.#" "#..#." ".##.#"},
{'_', "....." "....." "....." "....." "....." "....." "#####"},
};
/* clang-format on */
enum { GLYPH_COUNT = sizeof(GLYPHS) / sizeof(*GLYPHS) };
const char *font_glyph(char character) {
char wanted = (char)toupper((unsigned char)character);
for (int i = 0; i < GLYPH_COUNT; i++)
if (GLYPHS[i].character == wanted) return GLYPHS[i].rows;
return NULL;
}
int font_text_cells(const char *text) {
int cells = 0;
if (text == NULL) return 0;
for (const char *c = text; *c != '\0'; c++) {
const char *rows = font_glyph(*c);
if (rows == NULL) continue;
for (int i = 0; i < FONT_WIDTH * FONT_HEIGHT; i++)
if (rows[i] == '#') cells++;
}
return cells;
}
int font_text_width(const char *text) {
int glyphs = 0;
if (text == NULL) return 0;
for (const char *c = text; *c != '\0'; c++)
if (font_glyph(*c) != NULL) glyphs++;
return glyphs > 0 ? glyphs * FONT_ADVANCE - 1 : 0;
}