ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/hd/rhd_x11.c
(Generate patch)

Comparing ray/src/hd/rhd_x11.c (file contents):
Revision 3.31 by gwlarson, Fri Dec 18 11:56:10 1998 UTC vs.
Revision 3.38 by greg, Fri Jan 7 20:33:02 2005 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1998 Silicon Graphics, Inc. */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ SGI";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   * X11 driver for holodeck display.
6   * Based on rview driver.
7   */
8  
9 < #include "standard.h"
9 > #include  <stdlib.h>
10 > #include  <stdio.h>
11   #include  <X11/Xlib.h>
12   #include  <X11/cursorfont.h>
13   #include  <X11/Xutil.h>
14 + #include  <time.h>
15 +
16 + #include "platform.h"
17 + #include "rtmath.h"
18 + #include "rterror.h"
19 + #include "plocate.h"
20 + #include "rhdisp.h"
21   #include "rhd_qtree.h"
22 < #include  "x11icon.h"
22 > #include "x11icon.h"
23  
24   #ifndef RAYQLEN
25   #define RAYQLEN         50000           /* max. rays to queue before flush */
# Line 49 | Line 54 | static char SCCSid[] = "$SunId$ SGI";
54  
55   struct driver   odev;                   /* global device driver structure */
56  
57 + TMstruct        *tmGlobal;              /* global tone-mapping structure */
58 +
59   char odev_args[64];                     /* command arguments */
60  
61   static XEvent  currentevent;            /* current event */
# Line 70 | Line 77 | static int     inpresflags;            /* input result flags */
77  
78   static int      headlocked = 0;         /* lock vertical motion */
79  
73 static int  getpixels(), xnewcolr(), freepixels(), resizewindow(), getframe(),
74                getevent(), getkey(), moveview(), getmove(), fixwindow();
75 static unsigned long  true_pixel();
80  
81 + static int mytmflags(void);
82 + static void xnewcolr(int  ndx, int r, int g, int b);
83 + static int getpixels(void);
84 + static void freepixels(void);
85 + static unsigned long true_pixel(register BYTE rgb[3]);
86 + static void getevent(void);
87 + static int ilclip(int dp[2][2], FVECT wp[2]);
88 + static void draw3dline(FVECT wp[2]);
89 + static void draw_grids(void);
90 + static int moveview(int dx, int dy, int mov, int orb);
91 + static void getframe(XButtonPressedEvent *ebut);
92 + static void waitabit(void);
93 + static void getmove(XButtonPressedEvent *ebut);
94 + static void getkey(register XKeyPressedEvent *ekey);
95 + static void fixwindow(register XExposeEvent *eexp);
96 + static void resizewindow(register XConfigureEvent *ersz);
97  
98 +
99   static int
100 < mytmflags()                     /* figure out tone mapping flags */
100 > mytmflags(void)                 /* figure out tone mapping flags */
101   {
102          extern char     *progname;
103          register char   *cp, *tail;
# Line 91 | Line 112 | mytmflags()                    /* figure out tone mapping flags */
112          if (cp-tail == 4 && !strncmp(tail, "x11h", 4))
113                  return(TM_F_HUMAN|TM_F_NOSTDERR);
114          error(USER, "illegal driver name");
115 +        return 0; /* pro forma return */
116   }
117  
118  
119 < dev_open(id)                    /* initialize X11 driver */
120 < char  *id;
119 > extern void
120 > dev_open(                       /* initialize X11 driver */
121 >        char  *id
122 > )
123   {
100        extern char  *getenv();
124          static RGBPRIMS myprims = STDPRIMS;
125          char  *ev;
126          double  gamval = GAMMA;
# Line 144 | Line 167 | char  *id;
167                                  &myprims[BLU][CIEX],&myprims[BLU][CIEY],
168                                  &myprims[WHT][CIEX],&myprims[WHT][CIEY]) >= 6)
169                  dpri = myprims;
170 <        if (tmInit(mytmflags(), dpri, gamval) == NULL)
170 >        tmGlobal = tmInit(mytmflags(), dpri, gamval);
171 >        if (tmGlobal == NULL)
172                  error(SYSTEM, "not enough memory in dev_open");
173                                          /* open window */
174          ourwinattr.background_pixel = ourblack;
# Line 178 | Line 202 | char  *id;
202                          DisplayWidth(ourdisplay, ourscreen);
203          pheight = (double)DisplayHeightMM(ourdisplay, ourscreen) /
204                          DisplayHeight(ourdisplay, ourscreen);
205 <        copystruct(&odev.v, &stdview);
205 >        odev.v = stdview;
206          odev.v.type = VT_PER;
207                                          /* map the window and get its size */
208          XMapWindow(ourdisplay, gwind);
# Line 193 | Line 217 | char  *id;
217   }
218  
219  
220 < dev_close()                     /* close our display */
220 > extern void
221 > dev_close(void)                 /* close our display */
222   {
223          freepixels();
224          XFreeGC(ourdisplay, ourgc);
# Line 203 | Line 228 | dev_close()                    /* close our display */
228          XCloseDisplay(ourdisplay);
229          ourdisplay = NULL;
230          qtFreeLeaves();
231 <        tmDone(NULL);
231 >        tmDone(tmGlobal);
232          odev.v.type = 0;
233          odev.hres = odev.vres = 0;
234          odev.ifd = -1;
235   }
236  
237  
238 <
239 < dev_clear()                     /* clear our quadtree */
238 > extern void
239 > dev_clear(void)                 /* clear our quadtree */
240   {
241          qtCompost(100);
242          if (ncolors > 0)
# Line 220 | Line 245 | dev_clear()                    /* clear our quadtree */
245   }
246  
247  
248 < int
249 < dev_view(nv)                    /* assign new driver view */
250 < VIEW    *nv;
248 > extern int
249 > dev_view(                       /* assign new driver view */
250 >        VIEW    *nv
251 > )
252   {
253          if (nv->type == VT_PAR ||               /* check view legality */
254                          nv->horiz > 160. || nv->vert > 160.) {
# Line 260 | Line 286 | VIEW   *nv;
286                          XResizeWindow(ourdisplay, gwind, odev.hres, odev.vres);
287                          dev_input();    /* wait for resize event */
288                  }
289 <                copystruct(&odev.v, nv);
289 >                odev.v = *nv;
290          }
291          qtReplant();
292          return(1);
293   }
294  
295  
296 < dev_section(ofn)                /* add octree for geometry rendering */
297 < char    *ofn;
296 > extern void
297 > dev_section(            /* add octree for geometry rendering */
298 >        char    *ofn
299 > )
300   {
301          /* unimplemented */
302   }
303  
304  
305 < dev_auxcom(cmd, args)           /* process an auxiliary command */
306 < char    *cmd, *args;
305 > extern void
306 > dev_auxcom(             /* process an auxiliary command */
307 >        char    *cmd,
308 >        char    *args
309 > )
310   {
311          sprintf(errmsg, "%s: unknown command", cmd);
312          error(COMMAND, errmsg);
313   }
314  
315  
316 < VIEW *
317 < dev_auxview(n, hvres)           /* return nth auxiliary view */
318 < int     n;
319 < int     hvres[2];
316 > extern VIEW *
317 > dev_auxview(            /* return nth auxiliary view */
318 >        int     n,
319 >        int     hvres[2]
320 > )
321   {
322          if (n)
323                  return(NULL);
# Line 294 | Line 326 | int    hvres[2];
326   }
327  
328  
329 < int
330 < dev_input()                     /* get X11 input */
329 > extern int
330 > dev_input(void)                 /* get X11 input */
331   {
332          inpresflags = 0;
333  
# Line 310 | Line 342 | dev_input()                    /* get X11 input */
342   }
343  
344  
345 < dev_paintr(rgb, xmin, ymin, xmax, ymax)         /* fill a rectangle */
346 < BYTE    rgb[3];
347 < int  xmin, ymin, xmax, ymax;
345 > extern void
346 > dev_paintr(             /* fill a rectangle */
347 >        BYTE    rgb[3],
348 >        int  xmin,
349 >        int  ymin,
350 >        int  xmax,
351 >        int  ymax
352 > )
353   {
354          unsigned long  pixel;
355  
# Line 328 | Line 365 | int  xmin, ymin, xmax, ymax;
365   }
366  
367  
368 < int
369 < dev_flush()                     /* flush output */
368 > extern int
369 > dev_flush(void)                 /* flush output */
370   {
371          qtUpdate();
372          rayqleft = RAYQLEN;
# Line 337 | Line 374 | dev_flush()                    /* flush output */
374   }
375  
376  
377 < static
378 < xnewcolr(ndx, r, g, b)          /* enter a color into hardware table */
379 < int  ndx;
380 < int  r, g, b;
377 > static void
378 > xnewcolr(               /* enter a color into hardware table */
379 >        int  ndx,
380 >        int r,
381 >        int g,
382 >        int b
383 > )
384   {
385          XColor  xcolor;
386  
# Line 355 | Line 395 | int  r, g, b;
395  
396  
397   static int
398 < getpixels()                             /* get the color map */
398 > getpixels(void)                         /* get the color map */
399   {
400          XColor  thiscolor;
401          register int  i, j;
# Line 377 | Line 417 | loop:
417                          return(ncolors = 0);
418                  if (XAllocColorCells(ourdisplay,ourmap,0,NULL,0,pixval,ncolors))
419                          break;
420 <                free((char *)pixval);
420 >                free((void *)pixval);
421                  pixval = NULL;
422          }
423          if (pixval == NULL) {
# Line 406 | Line 446 | loop:
446   }
447  
448  
449 < static
450 < freepixels()                            /* free our pixels */
449 > static void
450 > freepixels(void)                                /* free our pixels */
451   {
452          if (ncolors == 0)
453                  return;
454          XFreeColors(ourdisplay,ourmap,pixval,ncolors,0L);
455 <        free((char *)pixval);
455 >        free((void *)pixval);
456          pixval = NULL;
457          ncolors = 0;
458          if (ourmap != DefaultColormap(ourdisplay,ourscreen))
# Line 422 | Line 462 | freepixels()                           /* free our pixels */
462  
463  
464   static unsigned long
465 < true_pixel(rgb)                 /* return true pixel value for color */
466 < register BYTE   rgb[3];
465 > true_pixel(                     /* return true pixel value for color */
466 >        register BYTE   rgb[3]
467 > )
468   {
469          register unsigned long  rval;
470  
# Line 434 | Line 475 | register BYTE  rgb[3];
475   }
476  
477  
478 < static
479 < getevent()                      /* get next event */
478 > static void
479 > getevent(void)                  /* get next event */
480   {
481          XNextEvent(ourdisplay, levptr(XEvent));
482          switch (levptr(XEvent)->type) {
# Line 471 | Line 512 | getevent()                     /* get next event */
512   }
513  
514  
515 < static
516 < ilclip(dp, wp)                  /* clip world coordinates to device */
517 < int     dp[2][2];
518 < FVECT   wp[2];
515 > static int
516 > ilclip(                 /* clip world coordinates to device */
517 >        int     dp[2][2],
518 >        FVECT   wp[2]
519 > )
520   {
521          static FVECT    vmin = {0.,0.,0.}, vmax = {1.-FTINY,1.-FTINY,FHUGE};
522          FVECT   wpc[2], ip[2];
# Line 509 | Line 551 | FVECT  wp[2];
551   }
552  
553  
554 < static
555 < draw3dline(wp)                  /* draw 3d line in world coordinates */
556 < FVECT   wp[2];
554 > static void
555 > draw3dline(                     /* draw 3d line in world coordinates */
556 >        FVECT   wp[2]
557 > )
558   {
559          int     dp[2][2];
560  
# Line 523 | Line 566 | FVECT  wp[2];
566   }
567  
568  
569 < static
570 < draw_grids()                    /* draw holodeck section grids */
569 > static void
570 > draw_grids(void)                        /* draw holodeck section grids */
571   {
572          static BYTE     gridrgb[3] = {0x0, 0xff, 0xff};
573          unsigned long  pixel;
# Line 539 | Line 582 | draw_grids()                   /* draw holodeck section grids */
582   }
583  
584  
585 < static
586 < moveview(dx, dy, mov, orb)      /* move our view */
587 < int     dx, dy, mov, orb;
585 > static int
586 > moveview(       /* move our view */
587 >        int     dx,
588 >        int     dy,
589 >        int     mov,
590 >        int     orb
591 > )
592   {
593          VIEW    nv;
594          FVECT   odir, v1;
595          double  d;
596          register int    li;
597                                  /* start with old view */
598 <        copystruct(&nv, &odev.v);
598 >        nv = odev.v;
599                                  /* change view direction */
600          if (mov | orb) {
601                  if ((li = qtFindLeaf(dx, dy)) < 0)
# Line 587 | Line 634 | int    dx, dy, mov, orb;
634   }
635  
636  
637 < static
638 < getframe(ebut)                          /* get focus frame */
639 < XButtonPressedEvent     *ebut;
637 > static void
638 > getframe(                               /* get focus frame */
639 >        XButtonPressedEvent     *ebut
640 > )
641   {
642          int     startx = ebut->x, starty = ebut->y;
643          int     endx, endy;
# Line 597 | Line 645 | XButtonPressedEvent    *ebut;
645          XMaskEvent(ourdisplay, ButtonReleaseMask, levptr(XEvent));
646          endx = levptr(XButtonReleasedEvent)->x;
647          endy = levptr(XButtonReleasedEvent)->y;
648 <        if (endx == startx | endy == starty) {
648 >        if ((endx == startx) | (endy == starty)) {
649                  XBell(ourdisplay, 0);
650                  return;
651          }
# Line 610 | Line 658 | XButtonPressedEvent    *ebut;
658   }
659  
660  
661 < static
662 < getmove(ebut)                           /* get view change */
615 < XButtonPressedEvent     *ebut;
661 > static void
662 > waitabit(void)                          /* pause a moment */
663   {
664 +        struct timespec ts;
665 +        ts.tv_sec = 0;
666 +        ts.tv_nsec = 100000000;
667 +        nanosleep(&ts, NULL);
668 + }
669 +
670 +
671 + static void
672 + getmove(                                /* get view change */
673 +        XButtonPressedEvent     *ebut
674 + )
675 + {
676          int     movdir = MOVDIR(ebut->button);
677          int     movorb = MOVORB(ebut->state);
678          int     oldnodesiz = qtMinNodesiz;
# Line 626 | Line 685 | XButtonPressedEvent    *ebut;
685  
686          while (!XCheckMaskEvent(ourdisplay,
687                          ButtonReleaseMask, levptr(XEvent))) {
688 <
688 >                waitabit();
689                  if (!XQueryPointer(ourdisplay, gwind, &rootw, &childw,
690                                  &rootx, &rooty, &wx, &wy, &statemask))
691                          break;          /* on another screen */
# Line 651 | Line 710 | XButtonPressedEvent    *ebut;
710   }
711  
712  
713 < static
714 < getkey(ekey)                            /* get input key */
715 < register XKeyPressedEvent  *ekey;
713 > static void
714 > getkey(                         /* get input key */
715 >        register XKeyPressedEvent  *ekey
716 > )
717   {
718          Window  rootw, childw;
719          int     rootx, rooty, wx, wy;
# Line 732 | Line 792 | register XKeyPressedEvent  *ekey;
792   }
793  
794  
795 < static
796 < fixwindow(eexp)                         /* repair damage to window */
797 < register XExposeEvent  *eexp;
795 > static void
796 > fixwindow(                              /* repair damage to window */
797 >        register XExposeEvent  *eexp
798 > )
799   {
800          if (odev.hres == 0 || odev.vres == 0) { /* first exposure */
801                  odev.hres = eexp->width;
# Line 745 | Line 806 | register XExposeEvent  *eexp;
806   }
807  
808  
809 < static
810 < resizewindow(ersz)                      /* resize window */
811 < register XConfigureEvent  *ersz;
809 > static void
810 > resizewindow(                   /* resize window */
811 >        register XConfigureEvent  *ersz
812 > )
813   {
814          if (ersz->width == odev.hres && ersz->height == odev.vres)
815                  return;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines