1 |
< |
/* Copyright (c) 1986 Regents of the University of California */ |
1 |
> |
/* Copyright (c) 1990 Regents of the University of California */ |
2 |
|
|
3 |
|
#ifndef lint |
4 |
|
static char SCCSid[] = "$SunId$ LBL"; |
65 |
|
struct font *next; /* next font in list */ |
66 |
|
} FONT; |
67 |
|
|
68 |
+ |
extern char *fgetword(); |
69 |
+ |
|
70 |
|
extern GLYPH *getglyph(); |
71 |
|
|
72 |
|
extern FONT *getfont(); |
91 |
|
|
92 |
|
/* first, discover position in text */ |
93 |
|
ap = m->oargs.farg; |
94 |
< |
multp3(v, r->rop, r->robx); |
94 |
> |
if (r->rox != NULL) |
95 |
> |
multp3(v, r->rop, r->rox->b.xfm); |
96 |
> |
else |
97 |
> |
VCOPY(v, r->rop); |
98 |
|
v[0] -= ap[0]; |
99 |
|
v[1] -= ap[1]; |
100 |
|
v[2] -= ap[2]; |
206 |
|
getfont(fname) /* return font fname */ |
207 |
|
char *fname; |
208 |
|
{ |
209 |
+ |
char buf[16]; |
210 |
|
FILE *fp; |
211 |
|
char *pathname, *err; |
212 |
|
int gn, ngv, gv; |
230 |
|
pathname); |
231 |
|
error(SYSTEM, errmsg); |
232 |
|
} |
233 |
< |
while (fscanf(fp, "%d", &gn) == 1) { /* get each glyph */ |
233 |
> |
while (fgetword(buf,sizeof(buf),fp) != NULL) { /* get each glyph */ |
234 |
> |
if (!isint(buf)) |
235 |
> |
goto nonint; |
236 |
> |
gn = atoi(buf); |
237 |
|
if (gn < 0 || gn > 255) { |
238 |
|
err = "illegal"; |
239 |
|
goto fonterr; |
242 |
|
err = "duplicate"; |
243 |
|
goto fonterr; |
244 |
|
} |
245 |
< |
if (fscanf(fp, "%d", &ngv) != 1 || |
246 |
< |
ngv < 0 || ngv > 255) { |
245 |
> |
if (fgetword(buf,sizeof(buf),fp) == NULL || !isint(buf) || |
246 |
> |
(ngv = atoi(buf)) < 0 || ngv > 255) { |
247 |
|
err = "bad # vertices for"; |
248 |
|
goto fonterr; |
249 |
|
} |
254 |
|
*g++ = ngv; |
255 |
|
ngv *= 2; |
256 |
|
while (ngv--) { |
257 |
< |
if (fscanf(fp, "%d", &gv) != 1 || |
258 |
< |
gv < 0 || gv > 255) { |
257 |
> |
if (fgetword(buf,sizeof(buf),fp) == NULL || |
258 |
> |
!isint(buf) || |
259 |
> |
(gv = atoi(buf)) < 0 || gv > 255) { |
260 |
|
err = "bad vertex for"; |
261 |
|
goto fonterr; |
262 |
|
} |
266 |
|
fclose(fp); |
267 |
|
f->next = fontlist; |
268 |
|
return(fontlist = f); |
269 |
+ |
nonint: |
270 |
+ |
sprintf(errmsg, "non-integer in font file \"%s\"", pathname); |
271 |
+ |
error(USER, errmsg); |
272 |
|
fonterr: |
273 |
|
sprintf(errmsg, "%s character (%d) in font file \"%s\"", |
274 |
|
err, gn, pathname); |
288 |
|
|
289 |
|
if (x < 0.0 || y < 0.0) |
290 |
|
return(0); |
291 |
< |
xlb = x *= 255.0; /* get glyph coordinates */ |
292 |
< |
ylb = y *= 255.0; |
291 |
> |
x *= 256.0; /* get glyph coordinates */ |
292 |
> |
y *= 256.0; |
293 |
> |
xlb = x + 0.5; |
294 |
> |
ylb = y + 0.5; |
295 |
|
n = *gl++; /* get # of vertices */ |
296 |
|
p0 = gl + 2*(n-1); /* connect last to first */ |
297 |
|
p1 = gl; |