--- ray/src/rt/text.c 1989/07/27 22:25:17 1.3 +++ ray/src/rt/text.c 1991/07/22 13:02:27 1.6 @@ -1,4 +1,4 @@ -/* Copyright (c) 1986 Regents of the University of California */ +/* Copyright (c) 1990 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -65,6 +65,8 @@ typedef struct font { struct font *next; /* next font in list */ } FONT; +extern char *fgetword(); + extern GLYPH *getglyph(); extern FONT *getfont(); @@ -89,7 +91,10 @@ RAY *r; /* first, discover position in text */ ap = m->oargs.farg; - multp3(v, r->rop, r->robx); + if (r->rox != NULL) + multp3(v, r->rop, r->rox->b.xfm); + else + VCOPY(v, r->rop); v[0] -= ap[0]; v[1] -= ap[1]; v[2] -= ap[2]; @@ -201,6 +206,7 @@ FONT * getfont(fname) /* return font fname */ char *fname; { + char buf[16]; FILE *fp; char *pathname, *err; int gn, ngv, gv; @@ -224,7 +230,10 @@ char *fname; pathname); error(SYSTEM, errmsg); } - while (fscanf(fp, "%d", &gn) == 1) { /* get each glyph */ + while (fgetword(buf,sizeof(buf),fp) != NULL) { /* get each glyph */ + if (!isint(buf)) + goto nonint; + gn = atoi(buf); if (gn < 0 || gn > 255) { err = "illegal"; goto fonterr; @@ -233,8 +242,8 @@ char *fname; err = "duplicate"; goto fonterr; } - if (fscanf(fp, "%d", &ngv) != 1 || - ngv < 0 || ngv > 255) { + if (fgetword(buf,sizeof(buf),fp) == NULL || !isint(buf) || + (ngv = atoi(buf)) < 0 || ngv > 255) { err = "bad # vertices for"; goto fonterr; } @@ -245,8 +254,9 @@ char *fname; *g++ = ngv; ngv *= 2; while (ngv--) { - if (fscanf(fp, "%d", &gv) != 1 || - gv < 0 || gv > 255) { + if (fgetword(buf,sizeof(buf),fp) == NULL || + !isint(buf) || + (gv = atoi(buf)) < 0 || gv > 255) { err = "bad vertex for"; goto fonterr; } @@ -256,6 +266,9 @@ char *fname; fclose(fp); f->next = fontlist; return(fontlist = f); +nonint: + sprintf(errmsg, "non-integer in font file \"%s\"", pathname); + error(USER, errmsg); fonterr: sprintf(errmsg, "%s character (%d) in font file \"%s\"", err, gn, pathname); @@ -275,8 +288,10 @@ GLYPH *gl; if (x < 0.0 || y < 0.0) return(0); - xlb = x *= 255.0; /* get glyph coordinates */ - ylb = y *= 255.0; + x *= 256.0; /* get glyph coordinates */ + y *= 256.0; + xlb = x + 0.5; + ylb = y + 0.5; n = *gl++; /* get # of vertices */ p0 = gl + 2*(n-1); /* connect last to first */ p1 = gl;