2 unibdf2hex - program to convert a BDF file into a unifont.hex file.
4 Author: Paul Hardy, January 2008
6 Note: currently this has hard-coded code points for glyphs extracted
7 from Wen Quan Yi to create the Unifont source file "wqy.hex".
9 Copyright (C) 2008, 2013 Paul Hardy
13 This program is free software: you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation, either version 2 of the License, or
16 (at your option) any later version.
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program. If not, see <http://www.gnu.org/licenses/>.
38 int rownum; /* number of lines we output in bitmap */
41 int bbxx, bbxy, bbxxoff, bbxyoff;
43 int descent=2; /* font descent wrt baseline */
44 int startrow; /* row to start glyph */
45 int rowlen; /* number of digits per row */
48 while (fgets (inbuf, MAXBUF - 1, stdin)) {
49 if (strncmp (inbuf, "ENCODING ", 9)) continue;
50 sscanf (&inbuf[9], "%d", &thispoint); /* get code point */
52 while (fgets (inbuf, MAXBUF - 1, stdin)) {
53 if (!strncmp (inbuf, "DWIDTH ", 7)) break;
55 sscanf (&inbuf[7], "%d", &rowlen);
58 /* Read bounding box values from BBX line */
59 while (fgets (inbuf, MAXBUF - 1, stdin)) {
60 if (!strncmp (inbuf, "BBX ", 4)) break;
62 sscanf (&inbuf[4], "%d %d %d %d", &bbxx, &bbxy, &bbxxoff, &bbxyoff);
64 /* Find BITMAP start */
65 while (fgets (inbuf, MAXBUF - 1, stdin)) {
66 if (!strncmp (inbuf, "BITMAP", 6)) break;
69 fprintf (stdout, "%04X:", thispoint);
71 /* Print initial blank rows */
72 startrow = descent + bbxyoff + bbxy;
74 /* Force everything to 16 pixels wide */
75 for (i = 16; i > startrow; i--) {
76 fprintf (stdout, "%0*d", rowlen, 0);
79 /* Copy bitmap until END */
80 while (fgets (inbuf, MAXBUF - 1, stdin)) {
81 if (!strncmp (inbuf, "END", 3)) break;
82 sscanf (inbuf, "%X", &rowout);
83 if (rowlen >= 4 && bbxx <= 8) rowout <<= 8; /* force 8x16 input to 16x16 grid */
85 fprintf (stdout, "%0*X", rowlen, rowout);
89 /* Pad empty lines until glyph has sufficient height */
91 fprintf (stdout, "%0*d", rowlen, 0);
94 fprintf (stdout,"\n");