--- ray/src/rt/text.c 2003/07/27 22:12:03 2.23 +++ ray/src/rt/text.c 2024/12/03 19:36:58 2.30 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: text.c,v 2.23 2003/07/27 22:12:03 schorsch Exp $"; +static const char RCSid[] = "$Id: text.c,v 2.30 2024/12/03 19:36:58 greg Exp $"; #endif /* * text.c - functions for text patterns and mixtures. @@ -8,9 +8,9 @@ static const char RCSid[] = "$Id: text.c,v 2.23 2003/0 #include "copyright.h" #include "ray.h" - +#include "paths.h" #include "otypes.h" - +#include "rtotypes.h" #include "font.h" /* @@ -76,14 +76,17 @@ typedef struct { TLINE tl; /* line list */ } TEXT; -TEXT *gettext(); +static TLINE * tlalloc(char *s); +static TEXT * gettext(OBJREC *tm); +static int intext(FVECT p, OBJREC *m); +static int inglyph(double x, double y, GLYPH *gl); -TLINE *tlalloc(); - -do_text(m, r) -register OBJREC *m; -RAY *r; +int +do_text( + OBJREC *m, + RAY *r +) { FVECT v; int foreground; @@ -110,32 +113,34 @@ RAY *r; return(1); } } else if (m->otype == PAT_BTEXT) { - if (foreground) - scalecolor(r->pcol, m->oargs.farg[9]); - else - scalecolor(r->pcol, m->oargs.farg[10]); + if (foreground) { + scalescolor(r->pcol, m->oargs.farg[9]); + } else { + scalescolor(r->pcol, m->oargs.farg[10]); + } } else { /* PAT_CTEXT */ - COLOR cval; + SCOLOR scval; if (foreground) - setcolor(cval, m->oargs.farg[9], + setscolor(scval, m->oargs.farg[9], m->oargs.farg[10], m->oargs.farg[11]); else - setcolor(cval, m->oargs.farg[12], + setscolor(scval, m->oargs.farg[12], m->oargs.farg[13], m->oargs.farg[14]); - multcolor(r->pcol, cval); + smultscolor(r->pcol, scval); } return(0); } -TLINE * -tlalloc(s) /* allocate and assign text line */ -char *s; +static TLINE * +tlalloc( /* allocate and assign text line */ + char *s +) { - register int siz; - register TLINE *tl; + int siz; + TLINE *tl; siz = strlen(s) + 1; if ((tl=(TLINE *)malloc(sizeof(TLINE)+siz)) == NULL || @@ -147,9 +152,10 @@ char *s; } -TEXT * -gettext(tm) /* get text structure for material */ -register OBJREC *tm; +static TEXT * +gettext( /* get text structure for material */ + OBJREC *tm +) { #define R (tm->oargs.farg+3) #define D (tm->oargs.farg+6) @@ -158,9 +164,9 @@ register OBJREC *tm; FILE *fp; char linbuf[512]; TEXT *t; - register int i; - register TLINE *tlp; - register char *s; + int i; + TLINE *tlp; + char *s; if ((t = (TEXT *)tm->os) != NULL) return(t); @@ -199,7 +205,7 @@ register OBJREC *tm; getrlibpath(), R_OK)) == NULL) { sprintf(errmsg, "cannot find text file \"%s\"", tm->oargs.sarg[tndx(tm)]); - error(USER, errmsg); + error(SYSTEM, errmsg); } if ((fp = fopen(s, "r")) == NULL) { sprintf(errmsg, "cannot open text file \"%s\"", s); @@ -217,6 +223,8 @@ register OBJREC *tm; tlp->next = NULL; /* get the font */ t->f = getfont(tm->oargs.sarg[fndx(tm)]); + if (!t->f) + objerror(tm, USER, "font load error"); /* compute character spacing */ i = sndx(tm); d = i < tm->oargs.nfargs ? tm->oargs.farg[i] : 0.0; @@ -240,11 +248,13 @@ register OBJREC *tm; } -freetext(m) /* free text structures associated with m */ -OBJREC *m; +void +freetext( /* free text structures associated with m */ + OBJREC *m +) { - register TEXT *tp; - register TLINE *tlp; + TEXT *tp; + TLINE *tlp; tp = (TEXT *)m->os; if (tp == NULL) @@ -260,15 +270,17 @@ OBJREC *m; } -intext(p, m) /* check to see if p is in text glyph */ -FVECT p; -OBJREC *m; +static int +intext( /* check to see if p is in text glyph */ + FVECT p, + OBJREC *m +) { - register TEXT *tp; - register TLINE *tlp; + TEXT *tp; + TLINE *tlp; FVECT v; double y, x; - register int i, h; + int i, h; /* first, compute position in text */ tp = gettext(m); v[0] = p[0] - m->oargs.farg[0]; @@ -282,7 +294,7 @@ OBJREC *m; x *= 255.; h = x; i = y = DOT(v, tp->down); - if (x < 0.0 || y < 0.0) + if ((x < 0.0) | (y < 0.0)) return(0); x -= (double)h; y = ((i+1) - y)*255.; @@ -300,21 +312,24 @@ OBJREC *m; } -inglyph(x, y, gl) /* (x,y) within font glyph gl? */ -double x, y; /* real coordinates in range [0,255) */ -register GLYPH *gl; +static int +inglyph( /* (x,y) within font glyph gl? */ + double x, /* real coordinates in range [0,255) */ + double y, + GLYPH *gl +) { int n, ncross; int xlb, ylb; int tv; - register GORD *p0, *p1; + GORD *p0, *p1; if (gl == NULL) return(0); xlb = x; ylb = y; - if (gl->left > xlb || gl->right <= xlb || /* check extent */ - gl->bottom > ylb || gl->top <= ylb) + 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 */