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 
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*/
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 
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