--- ray/src/rt/text.c 1994/04/14 04:50:37 2.13 +++ ray/src/rt/text.c 2003/02/25 02:47:23 2.21 @@ -1,15 +1,12 @@ -/* Copyright (c) 1992 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: text.c,v 2.21 2003/02/25 02:47:23 greg Exp $"; #endif - /* * text.c - functions for text patterns and mixtures. - * - * 11/12/86 */ +#include "copyright.h" + #include "ray.h" #include "otypes.h" @@ -45,8 +42,10 @@ static char SCCSid[] = "$SunId$ LBL"; * [spacing] * * Colortext is identical, except colors are given rather than - * brightnesses. Mixtext has foreground and background modifiers: + * brightnesses. * + * Mixtext has foreground and background modifiers: + * * modifier mixtext id * 4+ foremod backmod fontfile text.. * 0 @@ -77,16 +76,12 @@ typedef struct { TLINE tl; /* line list */ } TEXT; -extern char *getlibpath(); - -extern char *fgetword(); - TEXT *gettext(); TLINE *tlalloc(); -text(m, r) +do_text(m, r) register OBJREC *m; RAY *r; { @@ -105,7 +100,7 @@ RAY *r; char *modname = m->oargs.sarg[foreground ? 0 : 1]; if (!strcmp(modname, VOIDID)) omod = OVOID; - else if ((omod = modifier(modname)) == OVOID) { + else if ((omod = lastmod(objndx(m), modname)) == OVOID) { sprintf(errmsg, "undefined modifier \"%s\"", modname); objerror(m, USER, errmsg); } @@ -114,8 +109,7 @@ RAY *r; objerror(m, USER, "inappropriate modifier"); return(1); } - } - if (m->otype == PAT_BTEXT) { + } else if (m->otype == PAT_BTEXT) { if (foreground) scalecolor(r->pcol, m->oargs.farg[9]); else @@ -140,7 +134,6 @@ TLINE * tlalloc(s) /* allocate and assign text line */ char *s; { - extern char *strcpy(); register int siz; register TLINE *tl; @@ -160,7 +153,6 @@ register OBJREC *tm; { #define R (tm->oargs.farg+3) #define D (tm->oargs.farg+6) - extern char *strcpy(); FVECT DxR; double d; FILE *fp; @@ -180,7 +172,10 @@ register OBJREC *tm; /* compute vectors */ fcross(DxR, D, R); fcross(t->right, DxR, D); - d = DOT(D,D)/DOT(t->right,t->right); + d = DOT(t->right,t->right); + if (d <= FTINY*FTINY*FTINY*FTINY) + objerror(tm, USER, "illegal motion vector"); + d = DOT(D,D)/d; for (i = 0; i < 3; i++) t->right[i] *= d; fcross(t->down, R, DxR); @@ -225,7 +220,7 @@ register OBJREC *tm; /* compute character spacing */ i = sndx(tm); d = i < tm->oargs.nfargs ? tm->oargs.farg[i] : 0.0; - i = d * 256.0; + i = d * 255.0; t->tl.width = 0; for (tlp = t->tl.next; tlp != NULL; tlp = tlp->next) { if (i < 0) @@ -256,10 +251,11 @@ OBJREC *m; return; while ((tlp = tp->tl.next) != NULL) { tp->tl.next = tlp->next; - free((char *)tlp->spc); - free((char *)tlp); + free((void *)tlp->spc); + free((void *)tlp); } - free((char *)tp); + freefont(tp->f); /* release font reference */ + free((void *)tp); m->os = NULL; } @@ -281,15 +277,15 @@ OBJREC *m; x = DOT(v, tp->right); i = sndx(m); if (i < m->oargs.nfargs) - x *= tp->f->mwidth + 256.*fabs(m->oargs.farg[i]); + x *= tp->f->mwidth + 255.*fabs(m->oargs.farg[i]); else - x *= 256.; + x *= 255.; h = x; i = y = DOT(v, tp->down); if (x < 0.0 || y < 0.0) return(0); x -= (double)h; - y = ((i+1) - y)*256.; + y = ((i+1) - y)*255.; /* find the line position */ for (tlp = tp->tl.next; tlp != NULL; tlp = tlp->next) if (--i < 0) @@ -297,7 +293,7 @@ OBJREC *m; if (tlp == NULL || h >= tlp->width) return(0); for (i = 0; (h -= tlp->spc[i]) >= 0; i++) - if (h < 256 && inglyph(h+x, y, + if (h < 255 && inglyph(h+x, y, tp->f->fg[TLSTR(tlp)[i]&0xff])) return(1); return(0); @@ -305,7 +301,7 @@ OBJREC *m; inglyph(x, y, gl) /* (x,y) within font glyph gl? */ -double x, y; /* real coordinates in range [0,256) */ +double x, y; /* real coordinates in range [0,255) */ register GLYPH *gl; { int n, ncross;