Annotation of researchv10no/cmd/picasso/fonts.c, revision 1.1.1.1

1.1       root        1: /*     Copyright (c) 1988 AT&T
                      2:         All Rights Reserved
                      3:         THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T
                      4:         The copyright notice above does not evidence any
                      5:         actual or intended publication of such source code.
                      6: 
                      7:         Author:  Chi Chung Choy
                      8:        Revised: Michael Siemon
                      9:        Revised: Donald Knudsen
                     10: */
                     11: 
                     12: /*     @(#)picasso:fonts.c     1.0     */
                     13: 
                     14: #include "font.h"
                     15: #include "picasso.h"
                     16: 
                     17: extern char    *fontdir;
                     18: 
                     19: extern FILE    *fopen();
                     20: extern int     fread(),        fclose();
                     21: 
                     22: int    devres = 720;
                     23: int    unitwidth = 10;
                     24: int    nfonts = 0;
                     25: char   **lfonts = NULL;
                     26: 
                     27: TrFont *curfont;               /* not used in batch picasso */
                     28: 
                     29: int    fontcount =  0;
                     30: 
                     31: static char    devfontpath[1024];
                     32: 
                     33: #define        NAMEMIN 6
                     34: char   *troffname[] = {
                     35:                        "R",    "Times-Roman",
                     36:                        "I",    "Times-Italic",
                     37:                        "B",    "Times-Bold",
                     38:                        "BI",   "Times-BoldItalic",
                     39:                        "H",    "Helvetica",
                     40:                        "HI",   "Helvetica-Oblique",
                     41:                        "HB",   "Helvetica-Bold",
                     42:                        "HX",   "Helvetica-BoldOblique",
                     43:                        "CW",   "Courier",
                     44:                        "CI",   "Courier-Oblique",
                     45:                        "CB",   "Courier-Bold",
                     46:                        "CX",   "Courier-BoldOblique",
                     47:                        "PA",   "Palatino-Roman",
                     48:                        "PI",   "Palatino-Italic",
                     49:                        "PB",   "Palatino-Bold",
                     50:                        "PX",   "Palatino-BoldItalic",
                     51:                        "Hr",   "Helvetica-Narrow",
                     52:                        "Hi",   "Helvetica-Narrow-Oblique",
                     53:                        "Hb",   "Helvetica-Narrow-Bold",
                     54:                        "Hx",   "Helvetica-Narrow-BoldOblique",
                     55:                        "KR",   "Bookman-Light",
                     56:                        "KI",   "Bookman-LightItalic",
                     57:                        "KB",   "Bookman-Demi",
                     58:                        "KX",   "Bookman-DemiItalic",
                     59:                        "AR",   "AvantGarde-Book",
                     60:                        "AI",   "AvantGarde-BookOblique",
                     61:                        "AB",   "AvantGarde-Demi",
                     62:                        "AX",   "AvantGarde-DemiOblique",
                     63:                        "NR",   "NewCenturySchlbk-Roman",
                     64:                        "NI",   "NewCenturySchlbk-Italic",
                     65:                        "NB",   "NewCenturySchlbk-Bold",
                     66:                        "NX",   "NewCenturySchlbk-BoldItalic",
                     67:                        "ZD",   "ZapfDingbats",
                     68:                        "ZI",   "ZapfChancery-MediumItalic",
                     69:                        "GR",   "Symbol",
                     70:                        (char *)0, (char *)0
                     71:               };
                     72: 
                     73: #define        NDEFWID 96
                     74: static int     defaultwidthtab[NDEFWID] = {
                     75:        25,     33,     41,     50,     50,     83,
                     76:        78,     33,     33,     33,     50,     56,
                     77:        25,     33,     25,     28,     50,     50,
                     78:        50,     50,     50,     50,     50,     50,
                     79:        50,     50,     28,     28,     56,     56,
                     80:        56,     44,     92,     72,     67,     67,
                     81:        72,     61,     56,     72,     72,     33,
                     82:        39,     72,     61,     89,     72,     72,
                     83:        56,     72,     67,     56,     61,     72,
                     84:        72,     94,     72,     72,     61,     33,
                     85:        28,     33,     47,     50,     33,     44,
                     86:        50,     44,     50,     44,     33,     50,
                     87:        50,     28,     28,     50,     28,     78,
                     88:        50,     50,     50,     50,     33,     39,
                     89:        28,     50,     50,     72,     50,     50,
                     90:        44,     48,     20,     48,     54,     0
                     91: };
                     92: 
                     93: static void            /* initialize with Times-Roman */
                     94: initdefaultfont()
                     95: {
                     96:        int i;
                     97:        extern  int     fcount, mcount;         /* fake with these */
                     98: 
                     99:        fontinit(tostring(troffname[0]));
                    100:        if (fontcount == 0)     {       /* normal initialization failed */
                    101:                mount[0]->name = tostring(troffname[0]);
                    102:                mount[0]->fontname = tostring(troffname[1]);
                    103:                mount[0]->nchars = NDEFWID;
                    104:                mount[0]->state = INMEMORY;
                    105:                mount[0]->mounted++;
                    106:                mount[0]->wp = (Chwid *)malloc(NDEFWID*sizeof(Chwid));
                    107:                for (i = 0; i < NDEFWID; i++) {
                    108:                        mount[0]->wp[i].wid = defaultwidthtab[i];
                    109:                        mount[0]->wp[i].num = i + 32;
                    110:                }
                    111:                fontcount = 1;
                    112:                fcount = mcount = 1;
                    113:        }
                    114: }
                    115: 
                    116: int
                    117: devinit(devname)               /* -1  means error; 1 means success */
                    118:        char    *devname;
                    119: {
                    120:        char    filename[1024];
                    121:        int     n;
                    122: 
                    123:        strcpy(filename, fontdir);
                    124:        strcat(filename, "/dev");
                    125:        strcat(filename, devname);
                    126:        strcpy(devfontpath, filename);
                    127:        strcat(filename, "/DESC");      /* "{FONTDIR}/dev{devname}/DESC" */
                    128:        if (getdesc(filename) == -1) {
                    129:                unitwidth = 10;
                    130:                devres = 720;
                    131:                initdefaultfont();
                    132:                return -1;
                    133:        }
                    134:        initdefaultfont();
                    135:        for (n = 1; n < nfonts; n++)
                    136:                fontinit(lfonts[n]);
                    137:        return(1);
                    138: }
                    139: 
                    140: double
                    141: checkfont(f)
                    142:        double  f;
                    143: {
                    144:        if (f < 0 || f > fontcount-1) {
                    145:                if (f != (int)f) {
                    146:                        yyerror("%g is not a valid font index", f);
                    147:                }
                    148:                return 0.;
                    149:        }
                    150:        return f;
                    151: }
                    152: 
                    153: double
                    154: setfont(fontname)              /* accepts either troff or (some) PostScript */
                    155:        char    *fontname;      /* fontname, and initializes (mounts) it.    */
                    156: {
                    157:        int     i;
                    158: 
                    159:        if (fontname == NULL || *fontname == '\0')
                    160:                return 0.;
                    161:        if (strlen(fontname) >= NAMEMIN)
                    162:                for (i = 1; troffname[i] != (char *)0; i += 2)
                    163:                        if (strcmp(fontname, troffname[i]) == 0) {
                    164:                                free(fontname);
                    165:                                fontname = tostring(troffname[i-1]);
                    166:                                break;
                    167:                        }
                    168:        for (i = 0; i < fontcount; i++)    /* linear search */
                    169:                if (strcmp(mount[i]->name, fontname) == 0)
                    170:                        break;
                    171:        if (i == fontcount)
                    172:                if ((i = fontinit(fontname)) == -1) {
                    173:                        yyerror("font %s not found", fontname);
                    174:                        i = (int)getfval("textfont");
                    175:                }
                    176:        free(fontname);
                    177:        return (double)i;
                    178: }
                    179: 
                    180: static int
                    181: fontinit(fontname)     /* 0 if there is error and default font will be used;
                    182:                                1+ is the fontinfo index used */
                    183:        char    *fontname;
                    184: {
                    185:        char    filename[1024];
                    186: 
                    187:        if (fontcount == MAXFONTS)      /* reuse the last fontinfo slot */
                    188:                fontcount--;            /* if all the slots are used.   */
                    189:                                        /* (may want a yyerror msg here)*/
                    190:        strcpy(filename, devfontpath);
                    191:        strcat(filename, "/");
                    192:        strcat(filename, fontname);     /* "{devfontpath}/{fontname}" */
                    193:        if (mountfont(filename, fontcount) == -1)
                    194:                return 0;
                    195:        fontcount++;
                    196:        return(fontcount-1);
                    197: }
                    198: 
                    199: double
                    200: getstringwidth(s, fontnum, ptsize)     /* assumes no font or size changes */
                    201:        char    *s;
                    202:        int     fontnum, ptsize;
                    203: {
                    204:        double  width = 0.0;
                    205:        int     pos;
                    206: 
                    207:        fontnum = abs(fontnum);         /* negatives imply font or size attrs */
                    208:        ptsize  = abs(ptsize);          /* positives imply troff-style escapes*/
                    209:        curfont = mount[fontnum];
                    210:        for(; *s; ++s)
                    211:                if (*s > 31 && (pos = onfont(*s, fontnum)) != -1)
                    212:                        width += chwidth(pos, fontnum);
                    213:        return width * ptsize / (unitwidth * devres);
                    214: }

unix.superglobalmegacorp.com

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