mkfn: unify freetype and stb support
[fbpad_mkfn.git] / mkfn.c
blob34314ca7f175052cc1131f3b20ffa1db06896156
1 /*
2 * fbpad_mkfn - generate fbpad fonts from truetype fonts
4 * Copyright (C) 2009-2016 Ali Gholami Rudi <ali at rudi dot ir>
6 * This program is released under the Modified BSD license.
7 */
8 #include <ctype.h>
9 #include <fcntl.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <unistd.h>
14 #include "chars.h"
15 #include "mkfn.h"
17 #define NGLYPHS (1 << 14)
19 static int rows, cols;
21 static int fn_glyphs(int *glyphs)
23 int i, j;
24 int n = 0;
25 for (i = 0; i < sizeof(chars) / sizeof(chars[0]); i++) {
26 for (j = chars[i][0]; j <= chars[i][1] && n < NGLYPHS; j++) {
27 if (!mkfn_bitmap(NULL, j, rows, cols))
28 glyphs[n++] = j;
29 if (!mkfn_bitmap(NULL, j, rows, cols) && isdw(j))
30 glyphs[n++] = DWCHAR | j;
33 return n;
36 static int intcmp(void *v1, void *v2)
38 return *(int *) v1 - *(int *) v2;
42 * This tinyfont header is followed by:
44 * glyphs[n] unicode character codes (int)
45 * bitmaps[n] character bitmaps (char[rows * cols])
47 struct tinyfont {
48 char sig[8]; /* tinyfont signature; "tinyfont" */
49 int ver; /* version; 0 */
50 int n; /* number of glyphs */
51 int rows, cols; /* glyph dimensions */
54 /* generate the output tinyfont font */
55 static void output(int fd)
57 char *sig = "tinyfont";
58 struct tinyfont head;
59 int glyphs[NGLYPHS];
60 char *buf = malloc(rows * cols);
61 int i;
62 memcpy(head.sig, sig, strlen(sig));
63 head.ver = 0;
64 head.rows = rows;
65 head.cols = cols;
66 head.n = fn_glyphs(glyphs);
67 qsort(glyphs, head.n, sizeof(glyphs[0]), (void *) intcmp);
68 write(fd, &head, sizeof(head));
69 write(fd, glyphs, sizeof(*glyphs) * head.n);
70 for (i = 0; i < head.n; i++) {
71 mkfn_bitmap(buf, glyphs[i], rows, cols);
72 write(fd, buf, rows * cols);
74 fprintf(stderr, "tinyfont[%5d]: height=%2d width=%2d\n",
75 head.n, rows, cols);
76 free(buf);
79 static char *usage =
80 "usage: mkfn [options] font1.ttf:size ... >font.tf\n"
81 "\noptions:\n"
82 " -h n \t\t set glyph height\n"
83 " -w n \t\t set glyph width\n";
85 int main(int argc, char *argv[])
87 int i;
88 char *wdiff = NULL;
89 char *hdiff = NULL;
90 for (i = 1; i < argc && argv[i][0] == '-'; i++) {
91 if (argv[i][1] == 'w')
92 wdiff = argv[i][2] ? argv[i] + 2 : argv[++i];
93 else if (argv[i][1] == 'h')
94 hdiff = argv[i][2] ? argv[i] + 2 : argv[++i];
95 else
96 fprintf(stderr, usage);
98 mkfn_init();
99 for (; i < argc; i++) {
100 char *name = argv[i];
101 char *spec = NULL;
102 if (strchr(name, ':')) {
103 spec = strrchr(name, ':') + 1;
104 strrchr(name, ':')[0] = '\0';
106 if (mkfn_font(name, spec)) {
107 fprintf(stderr, "mkfn: failed to load <%s>\n", name);
108 return 1;
111 mkfn_dim(&rows, &cols);
112 if (hdiff)
113 rows = strchr("-+", hdiff[0]) ? rows + atoi(hdiff) : atoi(hdiff);
114 if (wdiff)
115 cols = strchr("-+", wdiff[0]) ? cols + atoi(wdiff) : atoi(wdiff);
116 output(1);
117 mkfn_free();
118 return 0;