1 /* vft2ch.c (Berkeley) 1.3 85/07/03
2 *
3 * Font translation for vfont-style fonts to character format.
4 *
5 * Use: vft2ch fontfile [ character_list ]
6 *
7 * Reads "fontfile" from current directory (or if not found,
8 * from BITDIR defined below) and converts it to a character font format
9 * editable by real people, and convertable BACK to vfont format by the
10 * ch2vft program. Output goes to stdout.
11 */
12
13 #include <stdio.h>
14 #include <vfont.h>
15
16
17 #define DIRSIZ 256
18 #define MAGICNO 0436
19 #ifndef BITDIR
20 #define BITDIR "/usr/lib/vfont"
21 #endif
22
23
24 struct header FontHeader;
25 struct dispatch disptable[DIRSIZ];
26
27 char IName[100];
28 long fbase;
29
30 unsigned char defascii[DIRSIZ];
31 unsigned char *charswanted = defascii;
32 char charbits[20000];
33 int height, width, bwidth;
34
35
main(argc,argv)36 main(argc, argv)
37 int argc;
38 char **argv;
39 {
40 register int FID;
41 register int i;
42 register int j;
43
44 if (argc < 2 || argc > 3)
45 error("usage: %s filename [ character-list ]", argv[0]);
46
47 for (i = 0; i < DIRSIZ; i++)
48 defascii[i] = i;
49 if (argc >= 3)
50 charswanted = (unsigned char *) argv[2];
51
52 ++argv;
53 sprintf(IName, "%s/%s", BITDIR, *argv);
54 if ((FID = open(*argv, 0)) < 0)
55 if ((FID = open(IName, 0)) < 0)
56 error("Can't find %s", *argv);
57
58 if (read(FID, &FontHeader,sizeof FontHeader) != sizeof FontHeader)
59 error("bad header in Font file.");
60 if (FontHeader.magic != MAGICNO)
61 error("magic number %o wrong", FontHeader.magic);
62 if (read(FID,&disptable[0],sizeof disptable) != sizeof disptable)
63 error("bad dispatch table in Font file");
64 fbase = sizeof FontHeader + sizeof disptable;
65
66 while (**argv && (**argv < '0' || **argv > '9'))
67 (*argv)++;
68 printf("fontheader\nsize 46\n");
69 if (**argv)
70 printf("mag 1000\ndesiz %d\n", atoi(*argv));
71 printf("rot 0\ncadv 0\nladv 1\nid 0\nres 200\n");
72
73 for (i = 0; i < DIRSIZ; i++) {
74 j = charswanted[i];
75 if (i > 0 && j == 0)
76 break;
77 if (disptable[j].nbytes != 0) {
78 register int k, l;
79 register int left = disptable[j].left;
80 register int right = disptable[j].right;
81 register int up = disptable[j].up;
82 register int down = disptable[j].down;
83
84
85 printf(":%d, width = %d.00\n", j, disptable[j].width);
86
87 lseek(FID, fbase + disptable[j].addr, 0);
88 read(FID, charbits, disptable[j].nbytes);
89 height = up + down;
90 width = left + right;
91 #ifdef sun
92 bwidth = ((width + 15) / 16) * 2;
93 #else
94 bwidth = (width + 7) / 8;
95 #endif
96 for (k = up; k < 0; k++) {
97 for (l = left; l < 0; l++)
98 pbit(l, k, l==left && k==up);
99 for (l = 0; l <= left; l++)
100 pbit(l, k, l==left && k==up);
101 while (l < width)
102 pbit(l++, k, 0);
103 printf("\n");
104 }
105 for (k = 0; k <= up; k++) {
106 for (l = left; l < 0; l++)
107 pbit(l, k, l==left && k==up);
108 for (l = 0; l <= left; l++)
109 pbit(l, k, l==left && k==up);
110 while (l < width)
111 pbit(l++, k, 0);
112 printf("\n");
113 }
114 while (k < height) {
115 for (l = left; l < 0; l++)
116 pbit(l, k, 0);
117 for (l = 0; l <= left; l++)
118 pbit(l, k, 0);
119 while (l < width)
120 pbit(l++, k, 0);
121 printf("\n");
122 k++;
123 }
124 printf("\n");
125 }
126 }
127 exit(0);
128 }
129
130
131 /*----------------------------------------------------------------------------*
132 | Routine: error (format_string, argument1, argument2.... )
133 |
134 | Results: fprints a message to standard error, then exits with error
135 | code 1
136 |
137 | Side Efct: This routine does NOT return
138 *----------------------------------------------------------------------------*/
139
140 /*VARARGS1*/
error(string,a1,a2,a3,a4)141 error(string, a1, a2, a3, a4)
142 char *string;
143 {
144 fprintf(stderr, "vft2ch: ");
145 fprintf(stderr, string, a1, a2, a3, a4);
146 fprintf(stderr, "\n");
147 exit(1);
148 }
149
150
151 /*----------------------------------------------------------------------------*
152 | Routine: pbit (column, row, reference_point_flag)
153 |
154 | Results: prints, to standard output, the appropriate representation
155 | for the dot at (row, column), given a flag noting whether
156 | or not the dot is the reference point. Column and row need
157 | not be within the bounds of the bit-map rectangle (delimited
158 | by the global variables height and width).
159 *----------------------------------------------------------------------------*/
160
pbit(col,row,flag)161 pbit(col, row, flag)
162 int col, row, flag;
163 {
164 if (col < 0 || row < 0 || row >= height || col >= width) {
165 printf(flag ? "x" : ".");
166 return;
167 }
168 if ((charbits[row * bwidth + (col >> 3)] & 0xff) & (0x80 >> (col & 7)))
169 printf(flag ? "X" : "@");
170 else
171 printf(flag ? "x" : ".");
172 }
173