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

# User Rev Content
1 greg 2.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     }