ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/font.c
Revision: 2.1
Committed: Sat Jun 6 07:38:40 1992 UTC (31 years, 10 months ago) by greg
Content type: text/plain
Branch: MAIN
Log Message:
Initial revision

File Contents

# Content
1 /* Copyright (c) 1992 Regents of the University of California */
2
3 #ifndef lint
4 static char SCCSid[] = "$SunId$ LBL";
5 #endif
6
7 /*
8 * Polygonal font handling routines
9 */
10
11 #include "standard.h"
12
13 #include "font.h"
14
15 #define galloc(nv) (GLYPH *)malloc(sizeof(GLYPH)+2*sizeof(GORD)*(nv))
16
17
18 extern char *libpath; /* list of library directories */
19
20 static FONT *fontlist = NULL; /* list of loaded fonts */
21
22
23 FONT *
24 getfont(fname) /* return font fname */
25 char *fname;
26 {
27 char buf[16];
28 FILE *fp;
29 char *pathname, *err;
30 int gn, ngv;
31 register int gv;
32 register GLYPH *g;
33 GORD *gp;
34 register FONT *f;
35
36 for (f = fontlist; f != NULL; f = f->next)
37 if (!strcmp(f->name, fname))
38 return(f);
39 /* load the font file */
40 if ((pathname = getpath(fname, libpath, R_OK)) == NULL) {
41 sprintf(errmsg, "cannot find font file \"%s\"", fname);
42 error(USER, errmsg);
43 }
44 f = (FONT *)calloc(1, sizeof(FONT));
45 if (f == NULL)
46 goto memerr;
47 f->name = savestr(fname);
48 if ((fp = fopen(pathname, "r")) == NULL) {
49 sprintf(errmsg, "cannot open font file \"%s\"",
50 pathname);
51 error(SYSTEM, errmsg);
52 }
53 while (fgetword(buf,sizeof(buf),fp) != NULL) { /* get each glyph */
54 if (!isint(buf))
55 goto nonint;
56 gn = atoi(buf);
57 if (gn < 0 || gn > 255) {
58 err = "illegal";
59 goto fonterr;
60 }
61 if (f->fg[gn] != NULL) {
62 err = "duplicate";
63 goto fonterr;
64 }
65 if (fgetword(buf,sizeof(buf),fp) == NULL || !isint(buf) ||
66 (ngv = atoi(buf)) < 0 || ngv > 32000) {
67 err = "bad # vertices for";
68 goto fonterr;
69 }
70 g = galloc(ngv);
71 if (g == NULL)
72 goto memerr;
73 g->nverts = ngv;
74 g->start = g->width = 128;
75 ngv *= 2;
76 gp = gvlist(g);
77 while (ngv--) {
78 if (fgetword(buf,sizeof(buf),fp) == NULL ||
79 !isint(buf) ||
80 (gv = atoi(buf)) < 0 || gv > 255) {
81 err = "bad vertex for";
82 goto fonterr;
83 }
84 *gp++ = gv;
85 if (ngv & 1) /* follow x limits */
86 if (gv < g->start)
87 g->start = gv;
88 else if (gv > g->width)
89 g->width = gv;
90 }
91 g->width -= g->start;
92 f->fg[gn] = g;
93 }
94 fclose(fp);
95 f->next = fontlist;
96 return(fontlist = f);
97 nonint:
98 sprintf(errmsg, "non-integer in font file \"%s\"", pathname);
99 error(USER, errmsg);
100 fonterr:
101 sprintf(errmsg, "%s character (%d) in font file \"%s\"",
102 err, gn, pathname);
103 error(USER, errmsg);
104 memerr:
105 error(SYSTEM, "out of memory in fontglyph");
106 }