--- ray/src/rt/text.c 1992/06/19 13:07:48 2.4 +++ ray/src/rt/text.c 1994/04/14 04:50:37 2.13 @@ -1,4 +1,4 @@ -/* Copyright (c) 1991 Regents of the University of California */ +/* Copyright (c) 1992 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -77,7 +77,7 @@ typedef struct { TLINE tl; /* line list */ } TEXT; -extern char *libpath; +extern char *getlibpath(); extern char *fgetword(); @@ -109,8 +109,13 @@ RAY *r; sprintf(errmsg, "undefined modifier \"%s\"", modname); objerror(m, USER, errmsg); } - raytexture(r, omod); - } else if (m->otype == PAT_BTEXT) { + if (rayshade(r, omod)) { + if (m->omod != OVOID) + objerror(m, USER, "inappropriate modifier"); + return(1); + } + } + if (m->otype == PAT_BTEXT) { if (foreground) scalecolor(r->pcol, m->oargs.farg[9]); else @@ -127,6 +132,7 @@ RAY *r; m->oargs.farg[14]); multcolor(r->pcol, cval); } + return(0); } @@ -142,7 +148,6 @@ char *s; if ((tl=(TLINE *)malloc(sizeof(TLINE)+siz)) == NULL || (tl->spc=(short *)malloc(siz*sizeof(short))) == NULL) error(SYSTEM, "out of memory in tlalloc"); - tl->spc = NULL; tl->next = NULL; strcpy(TLSTR(tl), s); return(tl); @@ -155,7 +160,7 @@ register OBJREC *tm; { #define R (tm->oargs.farg+3) #define D (tm->oargs.farg+6) - extern char *strcpy(), *fgets(); + extern char *strcpy(); FVECT DxR; double d; FILE *fp; @@ -171,7 +176,7 @@ register OBJREC *tm; if (tm->oargs.nsargs - tndx(tm) < 1 || tm->oargs.nfargs < sndx(tm)) objerror(tm, USER, "bad # arguments"); if ((t = (TEXT *)malloc(sizeof(TEXT))) == NULL) - goto memerr; + error(SYSTEM, "out of memory in gettext"); /* compute vectors */ fcross(DxR, D, R); fcross(t->right, DxR, D); @@ -196,7 +201,7 @@ register OBJREC *tm; tlp = tlp->next; } else { /* text file */ if ((s = getpath(tm->oargs.sarg[tndx(tm)], - libpath, R_OK)) == NULL) { + getlibpath(), R_OK)) == NULL) { sprintf(errmsg, "cannot find text file \"%s\"", tm->oargs.sarg[tndx(tm)]); error(USER, errmsg); @@ -221,22 +226,20 @@ register OBJREC *tm; i = sndx(tm); d = i < tm->oargs.nfargs ? tm->oargs.farg[i] : 0.0; i = d * 256.0; + t->tl.width = 0; for (tlp = t->tl.next; tlp != NULL; tlp = tlp->next) { - if ((tlp->spc = (short *)malloc( - (strlen(TLSTR(tlp))+1)*sizeof(short))) == NULL) - goto memerr; if (i < 0) tlp->width = squeeztext(tlp->spc, TLSTR(tlp), t->f, -i); else if (i > 0) tlp->width = proptext(tlp->spc, TLSTR(tlp), t->f, i, 3); else tlp->width = uniftext(tlp->spc, TLSTR(tlp), t->f); + if (tlp->width > t->tl.width) + t->tl.width = tlp->width; } /* we're done */ tm->os = (char *)t; return(t); -memerr: - error(SYSTEM, "out of memory in gettext"); #undef R #undef D } @@ -251,7 +254,8 @@ OBJREC *m; tp = (TEXT *)m->os; if (tp == NULL) return; - for (tlp = tp->tl.next; tlp != NULL; tlp = tlp->next) { + while ((tlp = tp->tl.next) != NULL) { + tp->tl.next = tlp->next; free((char *)tlp->spc); free((char *)tlp); } @@ -274,7 +278,13 @@ OBJREC *m; v[0] = p[0] - m->oargs.farg[0]; v[1] = p[1] - m->oargs.farg[1]; v[2] = p[2] - m->oargs.farg[2]; - h = x = DOT(v, tp->right)*256.; + x = DOT(v, tp->right); + i = sndx(m); + if (i < m->oargs.nfargs) + x *= tp->f->mwidth + 256.*fabs(m->oargs.farg[i]); + else + x *= 256.; + h = x; i = y = DOT(v, tp->down); if (x < 0.0 || y < 0.0) return(0); @@ -295,33 +305,38 @@ OBJREC *m; inglyph(x, y, gl) /* (x,y) within font glyph gl? */ -double x, y; +double x, y; /* real coordinates in range [0,256) */ register GLYPH *gl; { int n, ncross; - int xtc, ytc; + int xlb, ylb; + int tv; register GORD *p0, *p1; if (gl == NULL) return(0); - xtc = x + 0.5; /* compute test coordinates */ - ytc = y + 0.5; - if (gl->left > xtc || gl->right < xtc || - gl->bottom > ytc || gl->top < ytc) - return(0); /* outside extent */ + xlb = x; + ylb = y; + if (gl->left > xlb || gl->right <= xlb || /* check extent */ + gl->bottom > ylb || gl->top <= ylb) + return(0); + xlb = xlb<<1 | 1; /* add 1/2 to test points... */ + ylb = ylb<<1 | 1; /* ...so no equal comparisons */ n = gl->nverts; /* get # of vertices */ p0 = gvlist(gl) + 2*(n-1); /* connect last to first */ p1 = gvlist(gl); ncross = 0; /* positive x axis cross test */ while (n--) { - if ((p0[1] > ytc) ^ (p1[1] > ytc)) - if (p0[0] > xtc && p1[0] > xtc) + if ((p0[1]<<1 > ylb) ^ (p1[1]<<1 > ylb)) { + tv = p0[0]<<1 > xlb | (p1[0]<<1 > xlb) << 1; + if (tv == 03) ncross++; - else if (p0[0] > xtc || p1[0] > xtc) + else if (tv) ncross += (p1[1] > p0[1]) ^ ((p0[1]-y)*(p1[0]-x) > (p0[0]-x)*(p1[1]-y)); + } p0 = p1; p1 += 2; }