Annotation of researchv10no/cmd/picasso/fonts.c, revision 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.