xref: /csrg-svn/old/vpr/vtools/vfontinfo.c (revision 3820)
1*3820Smark static char *sccsid = "@(#)vfontinfo.c	4.1 (Berkeley) 10/1/80";
21153Sbill /* Font Information for VCat-style fonts
3*3820Smark  *      Andy Hertzfeld  4/79
41153Sbill  *
51153Sbill  *	Modified to print Ascii chars 1/80 by Mark Horton
6*3820Smark  *	Zoom option added 5/81 by Steve Stone with tables from Mark Horton.
71153Sbill  */
81153Sbill #include <stdio.h>
91153Sbill #include <ctype.h>
101153Sbill #include <vfont.h>
111153Sbill 
121153Sbill struct header FontHeader;
131153Sbill struct dispatch disptable[256] ;
141153Sbill 
151153Sbill char	IName[100];
161153Sbill char *	rdchar();
171153Sbill long	fbase;
181153Sbill 
191153Sbill char	defascii[256];
201153Sbill char	*charswanted = defascii;
211153Sbill int	verbose;
221153Sbill char	charbits[4000];
231153Sbill int	H, W, WB;
24*3820Smark int 	zoom = -1;
251153Sbill 
261153Sbill main(argc,argv)
271153Sbill int argc;
281153Sbill char **argv;
291153Sbill 
301153Sbill {
311153Sbill 	int FID,i,j;
321153Sbill 
33*3820Smark 	while (argc > 1 && argv[1][0] == '-') {
341153Sbill 		switch(argv[1][1]) {
351153Sbill 		case 'v':
361153Sbill 			verbose++;
371153Sbill 			break;
38*3820Smark 		case 'z':
39*3820Smark 			zoom = argv[1][2] - '0';
40*3820Smark 			break;
411153Sbill 		default:
421153Sbill 			printf("Bad flag: %s\n", argv[1]);
431153Sbill 		}
441153Sbill 		argc--; argv++;
451153Sbill 	}
461153Sbill 	if (argc < 2) {
471153Sbill 		fprintf(stderr,"Usage: %s filename", argv[0]);
481153Sbill 		exit(2);
491153Sbill 	}
501153Sbill 
511153Sbill 	for (i=0; i<128; i++)
521153Sbill 		defascii[i] = i;
531153Sbill 	if (argc >= 3)
541153Sbill 		charswanted = argv[2];
551153Sbill 
561153Sbill 	sprintf(IName,"/usr/lib/vfont/%s",argv[1]);
571153Sbill 	if ((FID = open(argv[1],0)) < 0)
581153Sbill 		if ((FID = open(IName,0)) < 0) {
591153Sbill 			printf("Can't find %s\n",argv[1]);
601153Sbill 			exit(8);
611153Sbill 		};
621153Sbill 
631153Sbill 	if (read(FID,&FontHeader,sizeof FontHeader) != sizeof FontHeader)
641153Sbill 		error("Bad header in Font file.");
651153Sbill 
661153Sbill 	if (read(FID,&disptable[0],sizeof disptable) != sizeof disptable)
671153Sbill 		error("Bad dispatch table in Font file");
681153Sbill 
691153Sbill 	fbase = sizeof FontHeader + sizeof disptable;
701153Sbill 
711153Sbill 	if (FontHeader.magic != 0436)
721153Sbill 	printf("Magic number %o wrong\n", FontHeader.magic);
731153Sbill 	printf("Font %s, ",argv[1]);
741153Sbill 	printf("raster size %d, ",FontHeader.size);
751153Sbill 	printf("max width %d, max height %d, xtend %d\n",
761153Sbill 		FontHeader.maxx, FontHeader.maxy,FontHeader.xtend);
77*3820Smark 	printf("\n ASCII     offset    size  left    right   up     down    width \n");
781153Sbill 
791153Sbill 	for (i=0; i<256; i++) {
801153Sbill 		j = charswanted[i];
811153Sbill 		if (i>0 && j==0)
821153Sbill 			break;
831153Sbill 		if (disptable[j].nbytes != 0) {
84*3820Smark 			printf("  %3o %2s     %4d   %4d   %4d   %4d   %4d   %4d   %5d\n",
851153Sbill 				j, rdchar(j),
861153Sbill 				disptable[j].addr,
871153Sbill 				disptable[j].nbytes,
881153Sbill 				disptable[j].left,
891153Sbill 				disptable[j].right,
901153Sbill 				disptable[j].up,
911153Sbill 				disptable[j].down,
921153Sbill 				disptable[j].width);
931153Sbill 			if (verbose) {
941153Sbill 				int len = disptable[j].nbytes;
951153Sbill 				int k, l, last;
961153Sbill 
971153Sbill 				lseek(FID, fbase+disptable[j].addr, 0);
981153Sbill 				read(FID, charbits, len);
991153Sbill 				H = (disptable[j].up) + (disptable[j].down);
1001153Sbill 				W = (disptable[j].left) + (disptable[j].right);
1011153Sbill 				WB = (W+7)/8;
102*3820Smark 				if (zoom < 0) {
103*3820Smark 					for (k=0; k<H; k++) {
104*3820Smark 						for (last=W-1; last >= 0; last--)
105*3820Smark 							if (fbit(k, last))
106*3820Smark 								break;
107*3820Smark 						for (l=0; l<=W-1; l++) {
108*3820Smark 							printf("%c", fbit(k,l)?'M':' ');
109*3820Smark 						}
110*3820Smark 						printf("\n");
1111153Sbill 					}
1121153Sbill 					printf("\n");
113*3820Smark 				} else
114*3820Smark 					shozoom();
1151153Sbill 			}
1161153Sbill 		}
117*3820Smark 	}
1181153Sbill }
1191153Sbill 
1201153Sbill error(string)
1211153Sbill char *string;
1221153Sbill 
1231153Sbill {
1241153Sbill 	printf("\nvfontinfo: %s\n",string);
1251153Sbill 	exit(8);
1261153Sbill };
1271153Sbill 
1281153Sbill char *rdchar(c)
1291153Sbill char c;
1301153Sbill {
1311153Sbill 	static char ret[3];
1321153Sbill 	ret[0] = isprint(c) ? ' ' : '^';
1331153Sbill 	ret[1] = isprint(c) ?  c  : c^0100;
1341153Sbill 	ret[2] = 0;
1351153Sbill 	return (ret);
1361153Sbill }
1371153Sbill 
1381153Sbill int
1391153Sbill fbit(row, col)
1401153Sbill int row, col;
1411153Sbill {
1421153Sbill 	int thisbyte, thisbit, ret;
1431153Sbill 
144*3820Smark 	if (row>=H || col>=W) return(0);
1451153Sbill 	thisbyte = charbits[row*WB + (col>>3)] & 0xff;
1461153Sbill 	thisbit = 0x80 >> (col&7);
1471153Sbill 	ret = thisbyte & thisbit;
1481153Sbill 	return (ret != 0);
1491153Sbill }
150*3820Smark 
151*3820Smark 
152*3820Smark /*
153*3820Smark The implementation would work like this:
154*3820Smark 	zoom level	method
155*3820Smark 	0		2 chars/pixel, 1 is "[]", 0 is "  ".
156*3820Smark 	1		2 pixels/char 2x1, using " " "," "'" "|"
157*3820Smark 	2		8 pixels/char 4x2, using 16x16 table
158*3820Smark 	3		32 pixels/char 8x4, mapped into (2)
159*3820Smark 	4 and up	similar, mapped into (2)
160*3820Smark 
161*3820Smark The 16x16 table maps a 4x2 pattern into a printing ascii character which
162*3820Smark most closely approximates that pattern, e.g. the pattern
163*3820Smark 	|'
164*3820Smark 	''
165*3820Smark would be represented by the character "[".  I have such a table worked out.
166*3820Smark 
167*3820Smark Grainer zoom levels would take the rule of reducing it into a smaller bitmap,
168*3820Smark or-ing the bits together.  (e.g. level 3 would take a 2x2 chunk and map it
169*3820Smark into a single pixel: 0 if all 4 are 0, 1 otherwise.)  These pixels would be
170*3820Smark displayed as in 2.
171*3820Smark */
172*3820Smark 
173*3820Smark /*
174*3820Smark  * graphtab: a table for rudimentary graphics on ordinary terminals.
175*3820Smark  * For each 4x2 bit pattern of the form:
176*3820Smark  *	ae
177*3820Smark  *	bf
178*3820Smark  *	cg
179*3820Smark  *	dh
180*3820Smark  * form the 4 bit quantities abcd and efgh and get table entry
181*3820Smark  *	graphtab[abcd][efgh]
182*3820Smark  * to display in that character position.
183*3820Smark  *
184*3820Smark  * General philosophies: the dh bits are intended for descenders where
185*3820Smark  * possible.  Characters with radically different appearance on different
186*3820Smark  * terminals (e.g. _ and ^) are avoided.
187*3820Smark  *
188*3820Smark  * Version 1.0, March 1981, Mark Horton.
189*3820Smark  */
190*3820Smark 
191*3820Smark char tab1[4] = {
192*3820Smark 	' ', ',', '\'', '|'
193*3820Smark };
194*3820Smark 
195*3820Smark char graphtab[16][16] = {
196*3820Smark ' ', '.', '.', ',', '.', ';', ':', 'j', '\'', ':', ':', ';', '\'', ';', '!', '|',
197*3820Smark '.', '.', ':', ',', ';', ';', ';', 'j', '/', ';', ';', ';', 'j', 'j', 'j', 'j',
198*3820Smark '.', ',', '~', ',', 'r', '<', 'j', 'q', '/', ';', 'I', ';', '/', '|', 'I', '|',
199*3820Smark ',', ',', 'r', 'x', '/', '/', '/', 'd', '/', '/', '/', 'd', '/', '/', '/', 'd',
200*3820Smark '.', ':', '\\', ';', '-', '=', 'v', 'q', '\'', ':', '<', '|', '\'', ':', '+', '+',
201*3820Smark ';', ';', '>', ';', '=', '=', 'g', 'g', '\'', ':', 'S', 'S', '/', '/', '/', '+',
202*3820Smark ':', '\\', '\\', '\\', 'r', '<', 'w', 'q', '/', '<', '6', '4', '/', '/', 'd', '+',
203*3820Smark 'l', 'L', '+', 'b', 'y', '[', 'p', 'g', '/', '<', '/', '6', '/', '/', '/', '+',
204*3820Smark '`', ':', ':', ';', '`', '\\', '\\', '\\', '"', ':', ':', ';', '`', '\\', 'Y', 'T',
205*3820Smark ';', ';', ';', ';', '`', '2', '>', '\\', ':', '=', ';', ';', '?', '?', ']', ']',
206*3820Smark ':', ';', ';', ';', '>', '2', '>', '\\', 'F', ';', 'O', ';', '7', '?', ']', '7',
207*3820Smark ';', ';', ';', ';', '?', '2', '>', 'b', ';', ';', ';', ';', '?', '?', ']', '#',
208*3820Smark '\'', '\\', '\\', '\\', '`', '\\', '\\', '\\', '\'', '\'', '<', '5', '"', '"', 'v', 'q',
209*3820Smark ';', '\\', '\\', '\\', '`', '=', '\\', '\\', '\'', '\'', '5', '5', '"', '?', 'g', 'g',
210*3820Smark 'I', 'L', 'L', 'L', 'D', '\\', 'b', 'f', 'F', '[', '[', '[', 'P', '?', '#', 'M',
211*3820Smark '|', '|', '|', '|', '|', '#', '+', '#', 'T', '[', 'F', 'F', 'P', '?', 'P', 'M'
212*3820Smark };
213*3820Smark 
214*3820Smark 
215*3820Smark shozoom()
216*3820Smark {
217*3820Smark 	register i;
218*3820Smark 
219*3820Smark 	if (zoom == 0)
220*3820Smark 		sho0();
221*3820Smark 	else if (zoom == 1)
222*3820Smark 		sho1();
223*3820Smark 	else if (zoom == 2)
224*3820Smark 		sho2();
225*3820Smark }
226*3820Smark 
227*3820Smark sho0()
228*3820Smark {
229*3820Smark 	register k,l;
230*3820Smark 
231*3820Smark 	for (k=0; k<H; k++) {
232*3820Smark 		for (l=0; l<W; l++)
233*3820Smark 			printf("%s", fbit(k,l)?"[]": "  ");
234*3820Smark 		printf("\n");
235*3820Smark 	}
236*3820Smark 	printf("\n");
237*3820Smark }
238*3820Smark 
239*3820Smark sho1()
240*3820Smark {
241*3820Smark 	register i,k,l;
242*3820Smark 
243*3820Smark 	k = 0;
244*3820Smark 	while (k < H) {
245*3820Smark 		for(l=0;l<W;l++) {
246*3820Smark 			i = fbit(k,l)*2 + fbit(k+1,l);
247*3820Smark 			printf("%c",tab1[i]);
248*3820Smark 			l++;
249*3820Smark 		}
250*3820Smark 		printf("\n");
251*3820Smark 		k += 2;
252*3820Smark 	}
253*3820Smark 	printf("\n");
254*3820Smark }
255*3820Smark 
256*3820Smark sho2()
257*3820Smark {
258*3820Smark 	register i,j,k,l;
259*3820Smark 
260*3820Smark 	k = 0;
261*3820Smark 	while (k < H) {
262*3820Smark 		l = 0;
263*3820Smark 		while (l<W) {
264*3820Smark 			i = fbit(k,l)*8 + fbit(k+1,l)*4 +
265*3820Smark 			    fbit(k+2,l)*2 + fbit(k+3,l);
266*3820Smark 			l++;
267*3820Smark 			j = fbit(k,l)*8 + fbit(k+1,l)*4 +
268*3820Smark 			    fbit(k+2,l)*2 + fbit(k+3,l);
269*3820Smark 
270*3820Smark 			printf("%c",graphtab[i][j]);
271*3820Smark 			l++;
272*3820Smark 		}
273*3820Smark 		printf("\n");
274*3820Smark 		k += 4;
275*3820Smark 	}
276*3820Smark 	printf("\n");
277*3820Smark }
278