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

Comparing ray/src/util/xglaresrc.c (file contents):
Revision 1.6 by greg, Fri May 3 10:06:04 1991 UTC vs.
Revision 2.8 by greg, Tue Nov 11 16:24:06 2003 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1991 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   *  Circle sources in a displayed image.
6   *
# Line 12 | Line 9 | static char SCCSid[] = "$SunId$ LBL";
9  
10   #include "standard.h"
11   #include "view.h"
12 + #include <signal.h>
13   #include <X11/Xlib.h>
14   #include <X11/Xutil.h>
15  
16 + #define XIM             "ximage"
17 +
18   #define NSEG            30              /* number of segments per circle */
19  
20 + #define  FONTNAME       "8x13"          /* text font we'll use */
21 +
22 + float   col[3] = {1.,0.,0.};            /* color */
23 +
24   VIEW    ourview = STDVIEW;              /* view for picture */
25 < int     xres, yres;                     /* picture resolution */
25 > RESOLU  pres;                           /* picture resolution */
26  
27   char    *progname;                      /* program name */
28  
# Line 27 | Line 31 | Display        *theDisplay = NULL;             /* connection to server *
31   #define rwind           RootWindow(theDisplay,ourScreen)
32   #define ourScreen       DefaultScreen(theDisplay)
33  
34 < GC      vecGC;
34 > GC      vecGC, strGC;
35   Window  gwind;
32 Cursor  pickcursor;
36  
37  
38   main(argc, argv)
39   int     argc;
40   char    *argv[];
41   {
42 +        char    *windowname = NULL;
43          FILE    *fp;
44  
45 <        progname = argv[0];
46 <        if (argc < 2 || argc > 3) {
47 <                fprintf(stderr, "Usage: %s picture [glaresrc]\n",
45 >        progname = *argv++; argc--;
46 >        while (argc > 0 && argv[0][0] == '-') {
47 >                switch (argv[0][1]) {
48 >                case 'n':
49 >                        windowname = *++argv;
50 >                        argc--;
51 >                        break;
52 >                case 'c':
53 >                        col[0] = atof(*++argv);
54 >                        col[1] = atof(*++argv);
55 >                        col[2] = atof(*++argv);
56 >                        argc -= 3;
57 >                        break;
58 >                }
59 >                argv++; argc--;
60 >        }
61 >        if (argc < 1 || argc > 2) {
62 >                fprintf(stderr,
63 >                "Usage: %s [-n windowname][-c color] picture [glaresrc]\n",
64                                  progname);
65                  exit(1);
66          }
67 <        init(argv[1]);
68 <        if (argc < 3)
67 >        init(argv[0], windowname);
68 >        if (argc < 2)
69                  fp = stdin;
70 <        else if ((fp = fopen(argv[2], "r")) == NULL) {
71 <                fprintf(stderr, "%s: cannot open \"%s\"\n",
52 <                                progname, argv[2]);
70 >        else if ((fp = fopen(argv[1], "r")) == NULL) {
71 >                fprintf(stderr, "%s: cannot open \"%s\"\n", progname, argv[1]);
72                  exit(1);
73          }
74          circle_sources(fp);
# Line 57 | Line 76 | char   *argv[];
76   }
77  
78  
79 < init(name)                      /* set up vector drawing from pick */
80 < char    *name;
79 > init(pname, wname)              /* get view and find window */
80 > char    *pname, *wname;
81   {
82          extern Window   xfindwind();
83          XWindowAttributes       wa;
84          XColor  xc;
85          XGCValues       gcv;
86 +        register int    i;
87                                          /* get the viewing parameters */
88 <        if (viewfile(name, &ourview, &xres, &yres) <= 0 ||
88 >        if (viewfile(pname, &ourview, &pres) <= 0 ||
89                          setview(&ourview) != NULL) {
90                  fprintf(stderr, "%s: cannot get view from \"%s\"\n",
91 <                                progname, name);
91 >                                progname, pname);
92                  exit(1);
93          }
94                                          /* open the display */
# Line 79 | Line 99 | char   *name;
99                  exit(1);
100          }
101                                          /* find our window */
102 <        gwind = xfindwind(theDisplay, rwind, name, 2);
102 >        if (wname == NULL) {
103 >                                /* remove directory prefix from name */
104 >                for (i = strlen(pname); i-- > 0; )
105 >                        if (pname[i] == '/')
106 >                                break;
107 >                wname = pname+i+1;
108 >                i = 0;
109 >        } else
110 >                i = 1;
111 >        gwind = xfindwind(theDisplay, rwind, wname, 4);
112          if (gwind == None) {
113 <                fprintf(stderr, "%s: cannot find \"%s\" window\n",
114 <                                progname, name);
115 <                exit(2);
116 <        }
117 <        XMapRaised(theDisplay, gwind);
118 <        XGetWindowAttributes(theDisplay, gwind, &wa);
119 <        sleep(4);
120 <        if (wa.width != xres || wa.height != yres) {
113 >                if (i) {
114 >                        fprintf(stderr, "%s: cannot find \"%s\" window\n",
115 >                                        progname, wname);
116 >                        exit(2);
117 >                }
118 >                                        /* start ximage */
119 >                if (fork() == 0) {
120 >                        execlp(XIM, XIM, "-c", "256", pname, 0);
121 >                        perror(XIM);
122 >                        fprintf(stderr, "%s: cannot start %s\n",
123 >                                        progname, XIM);
124 >                        kill(getppid(), SIGPIPE);
125 >                        _exit(1);
126 >                }
127 >                do
128 >                        sleep(8);
129 >                while ((gwind=xfindwind(theDisplay,rwind,wname,4)) == None);
130 >        } else
131 >                XMapRaised(theDisplay, gwind);
132 >        do {
133 >                XGetWindowAttributes(theDisplay, gwind, &wa);
134 >                sleep(6);
135 >        } while (wa.map_state != IsViewable);
136 >        if (wa.width != scanlen(&pres) || wa.height != numscans(&pres)) {
137                  fprintf(stderr,
138                  "%s: warning -- window seems to be the wrong size!\n",
139                                  progname);
140 <                xres = wa.width;
141 <                yres = wa.height;
140 >                if (pres.rt & YMAJOR) {
141 >                        pres.xr = wa.width;
142 >                        pres.yr = wa.height;
143 >                } else {
144 >                        pres.xr = wa.height;
145 >                        pres.yr = wa.width;
146 >                }
147          }
148                                          /* set graphics context */
149 <        xc.red = 65535; xc.green = 0; xc.blue = 0;
149 >        gcv.font = XLoadFont(theDisplay, FONTNAME);
150 >        if (gcv.font == 0) {
151 >                fprintf(stderr, "%s: cannot load font \"%s\"\n",
152 >                                progname, FONTNAME);
153 >                exit(1);
154 >        }
155 >        xc.red = col[0] >= 1.0 ? 65535 : (unsigned)(65536*col[0]);
156 >        xc.green = col[1] >= 1.0 ? 65535 : (unsigned)(65536*col[1]);
157 >        xc.blue = col[2] >= 1.0 ? 65535 : (unsigned)(65536*col[2]);
158          xc.flags = DoRed|DoGreen|DoBlue;
159 +        gcv.background = xc.green >= 32768 ?
160 +                        BlackPixel(theDisplay,DefaultScreen(theDisplay)) :
161 +                        WhitePixel(theDisplay,DefaultScreen(theDisplay)) ;
162          if (XAllocColor(theDisplay, wa.colormap, &xc)) {
163                  gcv.foreground = xc.pixel;
164 <                vecGC = XCreateGC(theDisplay,gwind,GCForeground,&gcv);
164 >                vecGC = XCreateGC(theDisplay,gwind,
165 >                                GCForeground|GCBackground|GCFont,&gcv);
166 >                strGC = vecGC;
167          } else {
168                  gcv.function = GXinvert;
169                  vecGC = XCreateGC(theDisplay,gwind,GCFunction,&gcv);
170 +                gcv.foreground = xc.green < 32768 ?
171 +                        BlackPixel(theDisplay,DefaultScreen(theDisplay)) :
172 +                        WhitePixel(theDisplay,DefaultScreen(theDisplay)) ;
173 +                strGC = XCreateGC(theDisplay,gwind,
174 +                                GCForeground|GCBackground|GCFont,&gcv);
175          }
176   }
177  
# Line 114 | Line 182 | FILE   *fp;
182          char    linbuf[256];
183          int     reading = 0;
184          FVECT   dir;
185 <        double  dom;
185 >        double  dom, lum;
186  
187          while (fgets(linbuf, sizeof(linbuf), fp) != NULL)
188                  if (reading) {
# Line 122 | Line 190 | FILE   *fp;
190                                  XFlush(theDisplay);
191                                  return;
192                          }
193 <                        if (sscanf(linbuf, "%lf %lf %lf %lf",
193 >                        if (sscanf(linbuf, "%lf %lf %lf %lf %lf",
194                                          &dir[0], &dir[1], &dir[2],
195 <                                        &dom) != 4)
195 >                                        &dom, &lum) != 5)
196                                  break;
197                          circle(dir, dom);
198 +                        value(dir, lum);
199                  } else if (!strcmp(linbuf, "BEGIN glare source\n"))
200                          reading++;
201  
# Line 141 | Line 210 | double dom;
210   {
211          FVECT   start, cur;
212          XPoint  pt[NSEG+1];
213 <        double  px, py, pz;
213 >        FVECT   pp;
214 >        int     ip[2];
215          register int    i;
216  
217          fcross(cur, dir, ourview.vup);
# Line 153 | Line 223 | double dom;
223                  cur[0] += ourview.vp[0];
224                  cur[1] += ourview.vp[1];
225                  cur[2] += ourview.vp[2];
226 <                viewpixel(&px, &py, &pz, &ourview, cur);
227 <                if (pz <= 0.0)
226 >                viewloc(pp, &ourview, cur);
227 >                if (pp[2] <= 0.0)
228                          goto fail;
229 <                pt[i].x = px*xres;
230 <                pt[i].y = yres-1 - (int)(py*yres);
229 >                loc2pix(ip, &pres, pp[0], pp[1]);
230 >                pt[i].x = ip[0];
231 >                pt[i].y = ip[1];
232          }
233          XDrawLines(theDisplay, gwind, vecGC, pt, NSEG+1, CoordModeOrigin);
234          return;
235   fail:
236          fprintf(stderr, "%s: cannot draw source at (%f,%f,%f)\n",
237                          progname, dir[0], dir[1], dir[2]);
238 + }
239 +
240 +
241 + value(dir, v)                   /* print value on image */
242 + FVECT   dir;
243 + double  v;
244 + {
245 +        FVECT   pos;
246 +        FVECT   pp;
247 +        int     ip[2];
248 +        char    buf[32];
249 +
250 +        pos[0] = ourview.vp[0] + dir[0];
251 +        pos[1] = ourview.vp[1] + dir[1];
252 +        pos[2] = ourview.vp[2] + dir[2];
253 +        viewloc(pp, &ourview, pos);
254 +        if (pp[2] <= 0.0)
255 +                return;
256 +        loc2pix(ip, &pres, pp[0], pp[1]);
257 +        sprintf(buf, "%.0f", v);
258 +        XDrawImageString(theDisplay, gwind, strGC,
259 +                        ip[0], ip[1], buf, strlen(buf));
260   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines