Annotation of 43BSDReno/old/vpr/vtools/fcvt.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1983 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char sccsid[] = "@(#)fcvt.c     5.1 (Berkeley) 5/15/85";
                      9: #endif not lint
                     10: 
                     11: /*
                     12:  * Convert from the SAIL font format to the Unix font format.
                     13:  * Usage: fcvt sailfile unixfile
                     14:  */
                     15: 
                     16: #include <stdio.h>
                     17: #include <vfont.h>
                     18: 
                     19: int    sws;                    /* sail word size in 36 bit words */
                     20: char   b[40000], u[2000];
                     21: long   left(), right();
                     22: 
                     23: struct header vheader;
                     24: struct dispatch disptable[256];
                     25: 
                     26: long rightbits[19] = {
                     27:        0,      1,      03,     07,     017,    037,
                     28:        077,    0177,   0377,   0777,   01777,  03777,
                     29:        07777,  017777, 037777, 077777, 0177777,0377777,0777777
                     30: };
                     31: 
                     32: main(argc, argv)
                     33:        int argc;
                     34:        char *argv[];
                     35: {
                     36:        int infd = open(argv[1], 0);
                     37:        int outfd = creat(argv[2], 0666);
                     38:        int n;
                     39:        long lh, rh;
                     40:        int base, nb, ncol, nleft, r, i;
                     41:        int c, p;
                     42:        /* Sail counters and things */
                     43:        int height, maxwidth, baseline;
                     44:        int charwidth, rastwidth, charcode, wordcount;
                     45:        int leftkern, rowsfromtop, datarowcount;
                     46:        /* Unix counters and things */
                     47:        int rastrows, rastcols;
                     48:        int curaddr;
                     49:        int packed;     /* true if sail packed format for this glyph */
                     50:        int nperword;
                     51: 
                     52:        if (infd < 0 || outfd < 0) {
                     53:                printf("Usage: fcvt sailfile unixfile\n");
                     54:                exit(1);
                     55:        }
                     56:        n = read(infd, b, sizeof b);
                     57:        sws = 2 * n / 9;
                     58:        if (n == sizeof b) {
                     59:                printf("Font larger than %d bytes - recompile me\n", n);
                     60:                exit(1);
                     61:        }
                     62:        close(infd);
                     63: 
                     64:        height = right(0201);
                     65:        maxwidth = right(0202);
                     66:        baseline = right(0203);
                     67: 
                     68:        vheader.magic = 0436;
                     69:        /* size gets done later */
                     70:        vheader.maxx = height;
                     71:        vheader.maxy = maxwidth;
                     72:        /* I don't know what xtnd would map to */
                     73: 
                     74:        lseek(outfd, (long) sizeof vheader + sizeof disptable, 0);
                     75:        curaddr = 0;
                     76: 
                     77:        /* Look at each char */
                     78:        for (c=0; c<0200; c++) {
                     79:                /* Find Sail info */
                     80:                base = right(c);
                     81:                if (base == 0)
                     82:                        continue;
                     83:                charwidth = left(c);
                     84:                rastwidth = (left(base) >> 9) & 0777;
                     85:                if (rastwidth == 0)
                     86:                        rastwidth = charwidth;
                     87:                charcode = left(base) & 0777;
                     88:                if (charcode != c)
                     89:                        printf("bad char code %o(%c) != %o(%c)\n", charcode, charcode, c, c);
                     90:                wordcount = right(base);
                     91:                if (base+wordcount > sws) {
                     92:                        printf("Bad range %o-%o > %o glyph %o\n", base, base+wordcount, sws, c);
                     93:                        continue;
                     94:                }
                     95:                leftkern = (left(base+1) >> 9) & 0777;
                     96:                rowsfromtop = left(base+1) & 0777;
                     97:                datarowcount = right(base+1);
                     98: 
                     99:                rastrows = datarowcount;
                    100:                rastcols = (rastwidth + 35) / 36 * 36;
                    101: 
                    102:                /* Unix disptable stuff */
                    103:                disptable[c].addr = curaddr;
                    104:                nb = rastrows * ((rastcols + 7) >> 3);
                    105:                disptable[c].nbytes = nb;
                    106:                curaddr += nb;
                    107:                disptable[c].left = leftkern;
                    108:                disptable[c].right = rastcols - leftkern;
                    109:                disptable[c].up = baseline - rowsfromtop;
                    110:                disptable[c].down = rastrows - disptable[c].up;
                    111:                disptable[c].width = charwidth;
                    112:                packed = (datarowcount > wordcount);
                    113:                nperword = 36 / rastwidth;
                    114: 
                    115:                /* Now get the raster rows themselves */
                    116:                p = 0;
                    117:                ncol = rastcols / 36;
                    118:                nleft = ((rastwidth-1) % 36 + 1);
                    119:                base += 2;
                    120:                for (r=0; r<rastrows; r++) {
                    121:                        if (!packed) {
                    122:                                for (i=0; i<ncol; i++) {
                    123:                                        lh = left(base); rh = right(base++);
                    124:                                        /* compensate for garbage in SAIL fonts */
                    125:                                        if (i == ncol-1) {
                    126:                                                if (nleft <= 18) {
                    127:                                                        rh = 0;
                    128:                                                        lh &= ~rightbits[18-nleft];
                    129:                                                } else
                    130:                                                        rh &= ~rightbits[36-nleft];
                    131:                                        }
                    132:                                        if (i%2) {
                    133:                                                u[p-1] |= (lh>>14) & 017;
                    134:                                                u[p++] = lh >> 6;
                    135:                                                u[p++] = ((lh&077)<<2) | ((rh>>16)&03);
                    136:                                                u[p++] = rh >> 8;
                    137:                                                u[p++] = rh;
                    138:                                        } else {
                    139:                                                u[p++] = lh >> 10;
                    140:                                                u[p++] = lh >> 2;
                    141:                                                u[p++] = ((lh&03)<<6) | (rh>>12);
                    142:                                                u[p++] = rh >> 4;
                    143:                                                u[p++] = (rh & 017) << 4;
                    144:                                        }
                    145:                                }
                    146:                        } else {
                    147:                                put(r % nperword, rastwidth, left(base+r/nperword), right(base+r/nperword), u+p);
                    148:                                p += 5; /* 5 8 bit bytes per 36 bit word */
                    149:                        }
                    150:                }
                    151:                write(outfd, u, p);
                    152:        }
                    153:        lseek(outfd, 0, 0);
                    154:        vheader.size = curaddr;
                    155:        write(outfd, &vheader, sizeof vheader);
                    156:        write(outfd, disptable, sizeof disptable);
                    157:        close(outfd);
                    158:        exit(0);
                    159: }
                    160: 
                    161: /*
                    162:  * put a pdp-10 style variable size byte into 8 bit Unix bytes starting
                    163:  * at location dest.  The byte is bytesize bits, and is the bytenumth byte
                    164:  * in the 36 bit word (lh,,rh).
                    165:  */
                    166: put(bytenum, bytesize, lh, rh, dest)
                    167:        int bytenum, bytesize;
                    168:        long lh, rh;
                    169:        char *dest;
                    170: {
                    171:        register int i;
                    172: 
                    173:        for (i=0; i<5; i++)
                    174:                dest[i] = 0;
                    175:        for (i=0; i<bytenum; i++) {
                    176:                lh <<= bytesize;
                    177:                lh |= (rh >> 18-bytesize) & rightbits[bytesize];
                    178:                rh <<= bytesize;
                    179:        }
                    180:        lh &= ~rightbits[18-bytesize];
                    181:        /* We now have the byte we want left justified in lh */
                    182:        lh <<= 14;
                    183:        /* lh is now the byte we want, left justified in 32 bit word */
                    184:        for (i=0; i<bytesize; i += 8) {
                    185:                *dest++ = (lh >> 24) & 0377;
                    186:                lh <<= 8;
                    187:        }
                    188: }
                    189: 
                    190: /*
                    191:  * Return the left half (18 bits) of pdp-10 word p.
                    192:  */
                    193: long
                    194: left(p)
                    195:        int p;
                    196: {
                    197:        register int lp, odd;
                    198:        register long retval;
                    199: 
                    200:        odd = p%2;
                    201:        lp = 9*p/2;
                    202:        if (p >= sws) {
                    203:                return(0);
                    204:        }
                    205:        if (odd) {
                    206:                retval  = (b[lp++] & 0017) << 14;
                    207:                retval |= (b[lp++] & 0377) << 6;
                    208:                retval |= (b[lp] >> 2) & 63;
                    209:        } else {
                    210:                retval  = (b[lp++] & 0377) << 10;
                    211:                retval |= (b[lp++] & 0377) << 2;
                    212:                retval |= (b[lp] >> 6) & 3;
                    213:        }
                    214:        return retval;
                    215: }
                    216: 
                    217: /*
                    218:  * Return the right half of 36 bit word #p.
                    219:  */
                    220: long
                    221: right(p)
                    222:        int p;
                    223: {
                    224:        register int lp, odd;
                    225:        register long retval;
                    226: 
                    227:        odd = p%2;
                    228:        lp = 9*p/2 + 2;
                    229:        if (p >= sws) {
                    230:                return(0);
                    231:        }
                    232:        if (odd) {
                    233:                retval  = (b[lp++] & 0003) << 16;
                    234:                retval |= (b[lp++] & 0377) << 8;
                    235:                retval |= (b[lp]   & 0377);
                    236:        } else {
                    237:                retval  = (b[lp++] & 0077) << 12;
                    238:                retval |= (b[lp++] & 0377) << 4;
                    239:                retval |= (b[lp] >> 4) & 017;
                    240:        }
                    241:        return retval;
                    242: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.