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