V10/cmd/picasso/fonts.c
/* Copyright (c) 1988 AT&T
All Rights Reserved
THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T
The copyright notice above does not evidence any
actual or intended publication of such source code.
Author: Chi Chung Choy
Revised: Michael Siemon
Revised: Donald Knudsen
*/
/* @(#)picasso:fonts.c 1.0 */
#include "font.h"
#include "picasso.h"
extern char *fontdir;
extern FILE *fopen();
extern int fread(), fclose();
int devres = 720;
int unitwidth = 10;
int nfonts = 0;
char **lfonts = NULL;
TrFont *curfont; /* not used in batch picasso */
int fontcount = 0;
static char devfontpath[1024];
#define NAMEMIN 6
char *troffname[] = {
"R", "Times-Roman",
"I", "Times-Italic",
"B", "Times-Bold",
"BI", "Times-BoldItalic",
"H", "Helvetica",
"HI", "Helvetica-Oblique",
"HB", "Helvetica-Bold",
"HX", "Helvetica-BoldOblique",
"CW", "Courier",
"CI", "Courier-Oblique",
"CB", "Courier-Bold",
"CX", "Courier-BoldOblique",
"PA", "Palatino-Roman",
"PI", "Palatino-Italic",
"PB", "Palatino-Bold",
"PX", "Palatino-BoldItalic",
"Hr", "Helvetica-Narrow",
"Hi", "Helvetica-Narrow-Oblique",
"Hb", "Helvetica-Narrow-Bold",
"Hx", "Helvetica-Narrow-BoldOblique",
"KR", "Bookman-Light",
"KI", "Bookman-LightItalic",
"KB", "Bookman-Demi",
"KX", "Bookman-DemiItalic",
"AR", "AvantGarde-Book",
"AI", "AvantGarde-BookOblique",
"AB", "AvantGarde-Demi",
"AX", "AvantGarde-DemiOblique",
"NR", "NewCenturySchlbk-Roman",
"NI", "NewCenturySchlbk-Italic",
"NB", "NewCenturySchlbk-Bold",
"NX", "NewCenturySchlbk-BoldItalic",
"ZD", "ZapfDingbats",
"ZI", "ZapfChancery-MediumItalic",
"GR", "Symbol",
(char *)0, (char *)0
};
#define NDEFWID 96
static int defaultwidthtab[NDEFWID] = {
25, 33, 41, 50, 50, 83,
78, 33, 33, 33, 50, 56,
25, 33, 25, 28, 50, 50,
50, 50, 50, 50, 50, 50,
50, 50, 28, 28, 56, 56,
56, 44, 92, 72, 67, 67,
72, 61, 56, 72, 72, 33,
39, 72, 61, 89, 72, 72,
56, 72, 67, 56, 61, 72,
72, 94, 72, 72, 61, 33,
28, 33, 47, 50, 33, 44,
50, 44, 50, 44, 33, 50,
50, 28, 28, 50, 28, 78,
50, 50, 50, 50, 33, 39,
28, 50, 50, 72, 50, 50,
44, 48, 20, 48, 54, 0
};
static void /* initialize with Times-Roman */
initdefaultfont()
{
int i;
extern int fcount, mcount; /* fake with these */
fontinit(tostring(troffname[0]));
if (fontcount == 0) { /* normal initialization failed */
mount[0]->name = tostring(troffname[0]);
mount[0]->fontname = tostring(troffname[1]);
mount[0]->nchars = NDEFWID;
mount[0]->state = INMEMORY;
mount[0]->mounted++;
mount[0]->wp = (Chwid *)malloc(NDEFWID*sizeof(Chwid));
for (i = 0; i < NDEFWID; i++) {
mount[0]->wp[i].wid = defaultwidthtab[i];
mount[0]->wp[i].num = i + 32;
}
fontcount = 1;
fcount = mcount = 1;
}
}
int
devinit(devname) /* -1 means error; 1 means success */
char *devname;
{
char filename[1024];
int n;
strcpy(filename, fontdir);
strcat(filename, "/dev");
strcat(filename, devname);
strcpy(devfontpath, filename);
strcat(filename, "/DESC"); /* "{FONTDIR}/dev{devname}/DESC" */
if (getdesc(filename) == -1) {
unitwidth = 10;
devres = 720;
initdefaultfont();
return -1;
}
initdefaultfont();
for (n = 1; n < nfonts; n++)
fontinit(lfonts[n]);
return(1);
}
double
checkfont(f)
double f;
{
if (f < 0 || f > fontcount-1) {
if (f != (int)f) {
yyerror("%g is not a valid font index", f);
}
return 0.;
}
return f;
}
double
setfont(fontname) /* accepts either troff or (some) PostScript */
char *fontname; /* fontname, and initializes (mounts) it. */
{
int i;
if (fontname == NULL || *fontname == '\0')
return 0.;
if (strlen(fontname) >= NAMEMIN)
for (i = 1; troffname[i] != (char *)0; i += 2)
if (strcmp(fontname, troffname[i]) == 0) {
free(fontname);
fontname = tostring(troffname[i-1]);
break;
}
for (i = 0; i < fontcount; i++) /* linear search */
if (strcmp(mount[i]->name, fontname) == 0)
break;
if (i == fontcount)
if ((i = fontinit(fontname)) == -1) {
yyerror("font %s not found", fontname);
i = (int)getfval("textfont");
}
free(fontname);
return (double)i;
}
static int
fontinit(fontname) /* 0 if there is error and default font will be used;
1+ is the fontinfo index used */
char *fontname;
{
char filename[1024];
if (fontcount == MAXFONTS) /* reuse the last fontinfo slot */
fontcount--; /* if all the slots are used. */
/* (may want a yyerror msg here)*/
strcpy(filename, devfontpath);
strcat(filename, "/");
strcat(filename, fontname); /* "{devfontpath}/{fontname}" */
if (mountfont(filename, fontcount) == -1)
return 0;
fontcount++;
return(fontcount-1);
}
double
getstringwidth(s, fontnum, ptsize) /* assumes no font or size changes */
char *s;
int fontnum, ptsize;
{
double width = 0.0;
int pos;
fontnum = abs(fontnum); /* negatives imply font or size attrs */
ptsize = abs(ptsize); /* positives imply troff-style escapes*/
curfont = mount[fontnum];
for(; *s; ++s)
if (*s > 31 && (pos = onfont(*s, fontnum)) != -1)
width += chwidth(pos, fontnum);
return width * ptsize / (unitwidth * devres);
}