| 1 | < | /* Copyright (c) 1997 Silicon Graphics, Inc. */ | 
| 1 | > | /* Copyright (c) 1998 Silicon Graphics, Inc. */ | 
| 2 |  |  | 
| 3 |  | #ifndef lint | 
| 4 |  | static char SCCSid[] = "$SunId$ SGI"; | 
| 96 |  | char  *id; | 
| 97 |  | { | 
| 98 |  | extern char  *getenv(); | 
| 99 | < | char  *gv; | 
| 99 | > | static RGBPRIMS myprims = STDPRIMS; | 
| 100 | > | char  *ev; | 
| 101 |  | double  gamval = GAMMA; | 
| 102 | + | RGBPRIMP        dpri = stdprims; | 
| 103 |  | int  nplanes; | 
| 104 |  | XSetWindowAttributes    ourwinattr; | 
| 105 |  | XWMHints  ourxwmhints; | 
| 132 |  | ourwhite = WhitePixel(ourdisplay,ourscreen); | 
| 133 |  | } | 
| 134 |  | /* set gamma and tone mapping */ | 
| 135 | < | if ((gv = XGetDefault(ourdisplay, "radiance", "gamma")) != NULL | 
| 136 | < | || (gv = getenv("DISPLAY_GAMMA")) != NULL) | 
| 137 | < | gamval = atof(gv); | 
| 138 | < | if (tmInit(mytmflags(), stdprims, gamval) == NULL) | 
| 135 | > | if ((ev = XGetDefault(ourdisplay, "radiance", "gamma")) != NULL | 
| 136 | > | || (ev = getenv("DISPLAY_GAMMA")) != NULL) | 
| 137 | > | gamval = atof(ev); | 
| 138 | > | if ((ev = getenv("DISPLAY_PRIMARIES")) != NULL && | 
| 139 | > | sscanf(ev, "%f %f %f %f %f %f %f %f", | 
| 140 | > | &myprims[RED][CIEX],&myprims[RED][CIEY], | 
| 141 | > | &myprims[GRN][CIEX],&myprims[GRN][CIEY], | 
| 142 | > | &myprims[BLU][CIEX],&myprims[BLU][CIEY], | 
| 143 | > | &myprims[WHT][CIEX],&myprims[WHT][CIEY]) >= 6) | 
| 144 | > | dpri = myprims; | 
| 145 | > | if (tmInit(mytmflags(), dpri, gamval) == NULL) | 
| 146 |  | error(SYSTEM, "not enough memory in dev_open"); | 
| 147 |  | /* open window */ | 
| 148 |  | ourwinattr.background_pixel = ourblack; | 
| 183 |  | dev_input();                    /* sets size and view angles */ | 
| 184 |  | /* allocate our leaf pile */ | 
| 185 |  | if (!qtAllocLeaves(DisplayWidth(ourdisplay,ourscreen) * | 
| 186 | < | DisplayHeight(ourdisplay,ourscreen) / | 
| 187 | < | (qtMinNodesiz*qtMinNodesiz))) | 
| 186 | > | DisplayHeight(ourdisplay,ourscreen) * 3 / | 
| 187 | > | (qtMinNodesiz*qtMinNodesiz*2))) | 
| 188 |  | error(SYSTEM, "insufficient memory for leaf storage"); | 
| 189 |  | odev.name = id; | 
| 190 |  | odev.ifd = ConnectionNumber(ourdisplay); | 
| 208 |  | } | 
| 209 |  |  | 
| 210 |  |  | 
| 211 | + |  | 
| 212 | + | dev_clear()                     /* clear our quadtree */ | 
| 213 | + | { | 
| 214 | + | qtCompost(100); | 
| 215 | + | if (ncolors > 0) | 
| 216 | + | new_ctab(ncolors); | 
| 217 | + | rayqleft = 0;                   /* hold off update */ | 
| 218 | + | } | 
| 219 | + |  | 
| 220 | + |  | 
| 221 |  | int | 
| 222 |  | dev_view(nv)                    /* assign new driver view */ | 
| 223 |  | VIEW    *nv; | 
| 265 |  | } | 
| 266 |  |  | 
| 267 |  |  | 
| 268 | + | dev_auxcom(cmd, args)           /* process an auxiliary command */ | 
| 269 | + | char    *cmd, *args; | 
| 270 | + | { | 
| 271 | + | sprintf(errmsg, "%s: unknown command", cmd); | 
| 272 | + | error(COMMAND, errmsg); | 
| 273 | + | } | 
| 274 | + |  | 
| 275 | + |  | 
| 276 | + | VIEW * | 
| 277 | + | dev_auxview(n, hvres)           /* return nth auxiliary view */ | 
| 278 | + | int     n; | 
| 279 | + | int     hvres[2]; | 
| 280 | + | { | 
| 281 | + | if (n) | 
| 282 | + | return(NULL); | 
| 283 | + | hvres[0] = odev.hres; hvres[1] = odev.vres; | 
| 284 | + | return(&odev.v); | 
| 285 | + | } | 
| 286 | + |  | 
| 287 | + |  | 
| 288 |  | int | 
| 289 |  | dev_input()                     /* get X11 input */ | 
| 290 |  | { | 
| 293 |  | do | 
| 294 |  | getevent(); | 
| 295 |  |  | 
| 296 | < | while (XQLength(ourdisplay) > 0); | 
| 296 | > | while (XPending(ourdisplay) > 0); | 
| 297 |  |  | 
| 298 | + | odev.inpready = 0; | 
| 299 | + |  | 
| 300 |  | return(inpresflags); | 
| 301 |  | } | 
| 302 |  |  | 
| 324 |  | { | 
| 325 |  | qtUpdate(); | 
| 326 |  | rayqleft = RAYQLEN; | 
| 327 | < | return(XPending(ourdisplay)); | 
| 327 | > | return(odev.inpready = XPending(ourdisplay)); | 
| 328 |  | } | 
| 329 |  |  | 
| 330 |  |  | 
| 464 |  | int     dp[2][2]; | 
| 465 |  | FVECT   wp[2]; | 
| 466 |  | { | 
| 467 | < | static FVECT    vmin = {0.,0.,0.}, vmax = {1.,1.,FHUGE}; | 
| 468 | < | FVECT   ip[2]; | 
| 469 | < | /* not exactly right, but who cares? */ | 
| 470 | < | viewloc(ip[0], &odev.v, wp[0]); | 
| 471 | < | viewloc(ip[1], &odev.v, wp[1]); | 
| 467 | > | static FVECT    vmin = {0.,0.,0.}, vmax = {1.-FTINY,1.-FTINY,FHUGE}; | 
| 468 | > | FVECT   wpc[2], ip[2]; | 
| 469 | > | double  d, d0, d1; | 
| 470 | > | /* check for points behind view */ | 
| 471 | > | d = DOT(odev.v.vp, odev.v.vdir); | 
| 472 | > | d0 = DOT(wp[0], odev.v.vdir) - d; | 
| 473 | > | d1 = DOT(wp[1], odev.v.vdir) - d; | 
| 474 | > | /* work on copy of world points */ | 
| 475 | > | if (d0 <= d1) { | 
| 476 | > | VCOPY(wpc[0], wp[0]); VCOPY(wpc[1], wp[1]); | 
| 477 | > | } else { | 
| 478 | > | d = d0; d0 = d1; d1 = d; | 
| 479 | > | VCOPY(wpc[1], wp[0]); VCOPY(wpc[0], wp[1]); | 
| 480 | > | } | 
| 481 | > | if (d0 <= FTINY) { | 
| 482 | > | if (d1 <= FTINY) return(0); | 
| 483 | > | VSUB(wpc[0], wpc[0], wpc[1]); | 
| 484 | > | d = .99*d1/(d1-d0); | 
| 485 | > | VSUM(wpc[0], wpc[1], wpc[0], d); | 
| 486 | > | } | 
| 487 | > | /* get view coordinates and clip to window */ | 
| 488 | > | viewloc(ip[0], &odev.v, wpc[0]); | 
| 489 | > | viewloc(ip[1], &odev.v, wpc[1]); | 
| 490 |  | if (!clip(ip[0], ip[1], vmin, vmax)) | 
| 491 |  | return(0); | 
| 492 |  | dp[0][0] = ip[0][0]*odev.hres; | 
| 517 |  | static BYTE     gridrgb[3] = {0x0, 0xff, 0xff}; | 
| 518 |  | unsigned long  pixel; | 
| 519 |  |  | 
| 461 | – | if (!mapped) | 
| 462 | – | return; | 
| 520 |  | if (ncolors > 0) | 
| 521 |  | pixel = pixval[get_pixel(gridrgb, xnewcolr)]; | 
| 522 |  | else | 
| 661 |  | if (ncolors > 0) | 
| 662 |  | new_ctab(ncolors); | 
| 663 |  | inpresflags |= DFL(DC_REDRAW);  /* resend values from server */ | 
| 664 | + | rayqleft = 0;                   /* hold off update */ | 
| 665 |  | return; | 
| 666 |  | case 'K':                       /* kill rtrace process(es) */ | 
| 667 |  | inpresflags |= DFL(DC_KILL); |