| 1 | < | /* Copyright (c) 1991 Regents of the University of California */ | 
| 1 | > | /* Copyright (c) 1992 Regents of the University of California */ | 
| 2 |  |  | 
| 3 |  | #ifndef lint | 
| 4 |  | static char SCCSid[] = "$SunId$ LBL"; | 
| 109 |  | sprintf(errmsg, "undefined modifier \"%s\"", modname); | 
| 110 |  | objerror(m, USER, errmsg); | 
| 111 |  | } | 
| 112 | < | raytexture(r, omod); | 
| 113 | < | } else if (m->otype == PAT_BTEXT) { | 
| 112 | > | if (rayshade(r, omod)) { | 
| 113 | > | if (m->omod != OVOID) | 
| 114 | > | objerror(m, USER, "inappropriate modifier"); | 
| 115 | > | return(1); | 
| 116 | > | } | 
| 117 | > | } | 
| 118 | > | if (m->otype == PAT_BTEXT) { | 
| 119 |  | if (foreground) | 
| 120 |  | scalecolor(r->pcol, m->oargs.farg[9]); | 
| 121 |  | else | 
| 132 |  | m->oargs.farg[14]); | 
| 133 |  | multcolor(r->pcol, cval); | 
| 134 |  | } | 
| 135 | + | return(0); | 
| 136 |  | } | 
| 137 |  |  | 
| 138 |  |  | 
| 148 |  | if ((tl=(TLINE *)malloc(sizeof(TLINE)+siz)) == NULL || | 
| 149 |  | (tl->spc=(short *)malloc(siz*sizeof(short))) == NULL) | 
| 150 |  | error(SYSTEM, "out of memory in tlalloc"); | 
| 145 | – | tl->spc = NULL; | 
| 151 |  | tl->next = NULL; | 
| 152 |  | strcpy(TLSTR(tl), s); | 
| 153 |  | return(tl); | 
| 160 |  | { | 
| 161 |  | #define  R      (tm->oargs.farg+3) | 
| 162 |  | #define  D      (tm->oargs.farg+6) | 
| 163 | < | extern char  *strcpy(), *fgets(); | 
| 163 | > | extern char  *strcpy(); | 
| 164 |  | FVECT  DxR; | 
| 165 |  | double  d; | 
| 166 |  | FILE  *fp; | 
| 176 |  | if (tm->oargs.nsargs - tndx(tm) < 1 || tm->oargs.nfargs < sndx(tm)) | 
| 177 |  | objerror(tm, USER, "bad # arguments"); | 
| 178 |  | if ((t = (TEXT *)malloc(sizeof(TEXT))) == NULL) | 
| 179 | < | goto memerr; | 
| 179 | > | error(SYSTEM, "out of memory in gettext"); | 
| 180 |  | /* compute vectors */ | 
| 181 |  | fcross(DxR, D, R); | 
| 182 |  | fcross(t->right, DxR, D); | 
| 226 |  | i = sndx(tm); | 
| 227 |  | d = i < tm->oargs.nfargs ? tm->oargs.farg[i] : 0.0; | 
| 228 |  | i = d * 256.0; | 
| 229 | + | t->tl.width = 0; | 
| 230 |  | for (tlp = t->tl.next; tlp != NULL; tlp = tlp->next) { | 
| 225 | – | if ((tlp->spc = (short *)malloc( | 
| 226 | – | (strlen(TLSTR(tlp))+1)*sizeof(short))) == NULL) | 
| 227 | – | goto memerr; | 
| 231 |  | if (i < 0) | 
| 232 |  | tlp->width = squeeztext(tlp->spc, TLSTR(tlp), t->f, -i); | 
| 233 |  | else if (i > 0) | 
| 234 |  | tlp->width = proptext(tlp->spc, TLSTR(tlp), t->f, i, 3); | 
| 235 |  | else | 
| 236 |  | tlp->width = uniftext(tlp->spc, TLSTR(tlp), t->f); | 
| 237 | + | if (tlp->width > t->tl.width) | 
| 238 | + | t->tl.width = tlp->width; | 
| 239 |  | } | 
| 240 |  | /* we're done */ | 
| 241 |  | tm->os = (char *)t; | 
| 242 |  | return(t); | 
| 238 | – | memerr: | 
| 239 | – | error(SYSTEM, "out of memory in gettext"); | 
| 243 |  | #undef  R | 
| 244 |  | #undef  D | 
| 245 |  | } | 
| 254 |  | tp = (TEXT *)m->os; | 
| 255 |  | if (tp == NULL) | 
| 256 |  | return; | 
| 257 | < | for (tlp = tp->tl.next; tlp != NULL; tlp = tlp->next) { | 
| 257 | > | while ((tlp = tp->tl.next) != NULL) { | 
| 258 | > | tp->tl.next = tlp->next; | 
| 259 |  | free((char *)tlp->spc); | 
| 260 |  | free((char *)tlp); | 
| 261 |  | } | 
| 278 |  | v[0] = p[0] - m->oargs.farg[0]; | 
| 279 |  | v[1] = p[1] - m->oargs.farg[1]; | 
| 280 |  | v[2] = p[2] - m->oargs.farg[2]; | 
| 281 | < | h = x = DOT(v, tp->right)*256.; | 
| 281 | > | x = DOT(v, tp->right); | 
| 282 | > | i = sndx(m); | 
| 283 | > | if (i < m->oargs.nfargs) | 
| 284 | > | x *= tp->f->mwidth + 256.*fabs(m->oargs.farg[i]); | 
| 285 | > | else | 
| 286 | > | x *= 256.; | 
| 287 | > | h = x; | 
| 288 |  | i = y = DOT(v, tp->down); | 
| 289 |  | if (x < 0.0 || y < 0.0) | 
| 290 |  | return(0); | 
| 305 |  |  | 
| 306 |  |  | 
| 307 |  | inglyph(x, y, gl)               /* (x,y) within font glyph gl? */ | 
| 308 | < | double  x, y; | 
| 308 | > | double  x, y;           /* real coordinates in range [0,256) */ | 
| 309 |  | register GLYPH  *gl; | 
| 310 |  | { | 
| 311 |  | int  n, ncross; | 
| 312 | < | int  xtc, ytc; | 
| 312 | > | int  xlb, ylb; | 
| 313 | > | int  tv; | 
| 314 |  | register GORD  *p0, *p1; | 
| 315 |  |  | 
| 316 |  | if (gl == NULL) | 
| 317 |  | return(0); | 
| 318 | < | xtc = x + 0.5;                  /* compute test coordinates */ | 
| 319 | < | ytc = y + 0.5; | 
| 320 | < | if (gl->left > xtc || gl->right < xtc || | 
| 321 | < | gl->bottom > ytc || gl->top < ytc) | 
| 322 | < | return(0);      /* outside extent */ | 
| 318 | > | xlb = x; | 
| 319 | > | ylb = y; | 
| 320 | > | if (gl->left > xlb || gl->right <= xlb ||       /* check extent */ | 
| 321 | > | gl->bottom > ylb || gl->top <= ylb) | 
| 322 | > | return(0); | 
| 323 | > | xlb = xlb<<1 | 1;               /* add 1/2 to test points... */ | 
| 324 | > | ylb = ylb<<1 | 1;               /* ...so no equal comparisons */ | 
| 325 |  | n = gl->nverts;                 /* get # of vertices */ | 
| 326 |  | p0 = gvlist(gl) + 2*(n-1);      /* connect last to first */ | 
| 327 |  | p1 = gvlist(gl); | 
| 328 |  | ncross = 0; | 
| 329 |  | /* positive x axis cross test */ | 
| 330 |  | while (n--) { | 
| 331 | < | if ((p0[1] > ytc) ^ (p1[1] > ytc)) | 
| 332 | < | if (p0[0] > xtc && p1[0] > xtc) | 
| 331 | > | if ((p0[1]<<1 > ylb) ^ (p1[1]<<1 > ylb)) { | 
| 332 | > | tv = p0[0]<<1 > xlb | (p1[0]<<1 > xlb) << 1; | 
| 333 | > | if (tv == 03) | 
| 334 |  | ncross++; | 
| 335 | < | else if (p0[0] > xtc || p1[0] > xtc) | 
| 335 | > | else if (tv) | 
| 336 |  | ncross += (p1[1] > p0[1]) ^ | 
| 337 |  | ((p0[1]-y)*(p1[0]-x) > | 
| 338 |  | (p0[0]-x)*(p1[1]-y)); | 
| 339 | + | } | 
| 340 |  | p0 = p1; | 
| 341 |  | p1 += 2; | 
| 342 |  | } |