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