|
|
1.1 root 1: #ifndef lint
2: static char rcsid[] =
3: "@(#) $Header: vtobdf.c,v 1.1 87/09/11 08:16:28 toddb Exp $ (LBL)";
4: #endif
5:
6: #include <stdio.h>
7: #include <strings.h>
8: #include <ctype.h>
9: #include <sys/file.h>
10: /*
11: #include <sys/param.h>
12: */
13: #include <sys/types.h>
14: #include <sys/stat.h>
15: #include <vfont.h>
16:
17: #define SPACE 32 /* space index */
18: #define DELETE 127 /* delete index */
19: #define LAST_CHAR 127 /* delete */
20: #define FIRST_CHAR 0 /* null */
21: #define NUM_CHAR 128 /* total number of characters */
22:
23: static void
24: punt(str)
25: caddr_t str;
26: {
27: fprintf(stderr, "%s\n", str);
28: perror("vtobdf");
29: exit(1);
30: }
31:
32: static void
33: vtobdf(vfile, bdffile, bdfname)
34: FILE *vfile, *bdffile;
35: char *bdfname;
36: {
37: int i;
38: int j;
39: struct stat stb;
40: struct header header;
41: struct dispatch dispatch[NUM_DISPATCH];
42: int bitmapWidth;
43: int maxUp, maxDown, maxWidth, maxHeight;
44: int fixed;
45: int fontsize;
46: register char *cp;
47: char buf[2048];
48: int num_chars;
49:
50: #define FONTBASE (sizeof(header) + sizeof(dispatch))
51:
52: /* read vfont header */
53: if (read(fileno(vfile), (caddr_t) &header, sizeof(header)) != sizeof(header))
54: punt("Error reading vfont header.");
55:
56: /* check magic number */
57: if (header.magic != VFONT_MAGIC)
58: punt("Not VFONT_MAGIC.");
59:
60: /* read vfont dispatch */
61: if (read(fileno(vfile), (caddr_t) dispatch, sizeof(dispatch)) !=
62: sizeof(dispatch))
63: punt("Error reading vfont dispatch table.");
64:
65: /* stat the file descriptor to check file size */
66: if (fstat(fileno(vfile), &stb) < 0) {
67: perror(vfile);
68: exit(1);
69: }
70:
71: /* check file size */
72: if (stb.st_size != FONTBASE + header.size)
73: punt("Invalid file size.");
74:
75: /* Figure out font size */
76: fontsize = 6; /* default */
77: cp = rindex(bdfname, '-');
78: if (cp) {
79: cp++;
80: if (sscanf(cp, "%d", &i) == 1 && i > 0)
81: fontsize = i;
82: }
83:
84: /* initialize */
85: num_chars = maxWidth = maxUp = maxDown = 0;
86: /* determine maximum width, up and down for font */
87: for (i = 0, bitmapWidth = 0, fixed = 0; i < NUM_CHAR; i++) {
88: register struct dispatch *d;
89: register int width;
90:
91: d = &dispatch[i + FIRST_CHAR];
92:
93: if (d->nbytes)
94: num_chars++;
95:
96: width = d->left + d->right;
97: if (i == 0)
98: fixed = width;
99: else if (width != fixed)
100: fixed = 0;
101: if (width > maxWidth)
102: maxWidth = width;
103: if (d->up > maxUp)
104: maxUp = d->up;
105: if (d->down > maxDown)
106: maxDown = d->down;
107: bitmapWidth += width;
108: }
109: maxHeight = maxUp + maxDown;
110:
111: /* Start spewing stuff out */
112: fprintf(bdffile, "STARTFONT 2.1\n");
113: fprintf(bdffile, "FONT %s\n", bdfname);
114: fprintf(bdffile, "SIZE %d 78 78\n", fontsize);
115: fprintf(bdffile, "FONTBOUNDINGBOX %d %d %d %d\n",
116: header.maxx, header.maxy, 0, -maxDown);
117: fprintf(bdffile, "STARTPROPERTIES 3\n");
118: fprintf(bdffile, "FONT_ASCENT %d\n", maxUp);
119: fprintf(bdffile, "FONT_DESCENT %d\n", maxDown);
120: fprintf(bdffile, "DEFAULT_CHAR %d\n", 040);
121: fprintf(bdffile, "ENDPROPERTIES\n");
122: fprintf(bdffile, "CHARS %d\n", num_chars);
123:
124: for (i = 0; i < NUM_CHAR; i++) {
125: struct dispatch *d;
126: int width, height;
127:
128: /* entry in dispatch array */
129: d = &dispatch[i + FIRST_CHAR];
130:
131: /* check to see if this character is defined */
132: if (d->nbytes == 0)
133: continue;
134:
135: if (isprint(i) && !isspace(i))
136: fprintf(bdffile, "STARTCHAR %c\n", i);
137: else
138: fprintf(bdffile, "STARTCHAR C%03o\n", i);
139: fprintf(bdffile, "ENCODING %d\n", i);
140:
141: /* width in pixels */
142: width = d->left + d->right;
143:
144: fprintf(bdffile, "SWIDTH %d %d\n", fontsize * width, 0);
145: fprintf(bdffile, "DWIDTH %d %d\n", width, 0);
146:
147: /* height in pixels */
148: height = d->up + d->down;
149:
150: fprintf(bdffile, "BBX %d %d %d %d\n",
151: width, height, d->left, -d->down);
152:
153: fprintf(bdffile, "BITMAP\n");
154:
155: if (d->addr > sizeof(buf)) {
156: fprintf(stderr, "d->addr is %d, bufsize is %d",
157: d->addr, sizeof(buf));
158: punt("foo");
159: }
160: if (lseek(fileno(vfile), FONTBASE + d->addr, 0) < 0)
161: punt("Can't seek in vfont file.");
162: if (read(fileno(vfile), buf, d->nbytes) != d->nbytes)
163: punt("Error reading vfont data.");
164: cp = buf;
165: for (j = d->nbytes; j > 0; j--) {
166: int k;
167: k = (unsigned char)*cp;
168: cp++;
169: fprintf(bdffile, "%02x\n", k);
170: }
171:
172: fprintf(bdffile, "ENDCHAR\n");
173: }
174:
175: fprintf(bdffile, "ENDFONT\n");
176:
177: }
178:
179: main(argc, argv)
180: int argc;
181: char **argv;
182: {
183: char *vname, *bdfname;
184: FILE *vfile, *bdffile;
185:
186: if (argc != 3) {
187: fprintf(stderr, "vtobdf: vname bdfname\n");
188: exit(1);
189: }
190:
191: vname = argv[1];
192: bdfname = argv[2];
193:
194: if ((vfile = fopen(vname, "r")) == NULL) {
195: perror(vname);
196: exit(1);
197: }
198:
199: if ((bdffile = fopen(bdfname, "w")) == NULL) {
200: perror(bdfname);
201: exit(1);
202: }
203:
204: vtobdf(vfile, bdffile, bdfname);
205:
206: fclose(vfile);
207: fclose(bdffile);
208:
209: exit(0);
210: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.