ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/util/xglaresrc.c
Revision: 1.5
Committed: Mon Apr 22 13:41:50 1991 UTC (32 years, 11 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.4: +6 -14 lines
Log Message:
fixed window finding under twm and other obnoxious window managers

File Contents

# User Rev Content
1 greg 1.1 /* Copyright (c) 1991 Regents of the University of California */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * Circle sources in a displayed image.
9     *
10     * 18 Mar 1991 Greg Ward
11     */
12    
13     #include "standard.h"
14     #include "view.h"
15     #include <X11/Xlib.h>
16     #include <X11/Xutil.h>
17    
18     #define NSEG 30 /* number of segments per circle */
19    
20     VIEW ourview = STDVIEW; /* view for picture */
21     int xres, yres; /* picture resolution */
22    
23     char *progname; /* program name */
24    
25     Display *theDisplay = NULL; /* connection to server */
26    
27     #define rwind RootWindow(theDisplay,ourScreen)
28     #define ourScreen DefaultScreen(theDisplay)
29    
30     GC vecGC;
31     Window gwind;
32     Cursor pickcursor;
33    
34    
35     main(argc, argv)
36     int argc;
37     char *argv[];
38     {
39     FILE *fp;
40    
41     progname = argv[0];
42     if (argc < 2 || argc > 3) {
43     fprintf(stderr, "Usage: %s picture [glaresrc]\n",
44     progname);
45     exit(1);
46     }
47     init(argv[1]);
48     if (argc < 3)
49     fp = stdin;
50     else if ((fp = fopen(argv[2], "r")) == NULL) {
51     fprintf(stderr, "%s: cannot open \"%s\"\n",
52     progname, argv[2]);
53     exit(1);
54     }
55     circle_sources(fp);
56     exit(0);
57     }
58    
59    
60     init(name) /* set up vector drawing from pick */
61     char *name;
62     {
63 greg 1.5 extern Window xfindwind();
64 greg 1.1 XWindowAttributes wa;
65     XColor xc;
66     XGCValues gcv;
67     /* get the viewing parameters */
68     if (viewfile(name, &ourview, &xres, &yres) <= 0 ||
69     setview(&ourview) != NULL) {
70     fprintf(stderr, "%s: cannot get view from \"%s\"\n",
71     progname, name);
72     exit(1);
73     }
74     /* open the display */
75     if ((theDisplay = XOpenDisplay(NULL)) == NULL) {
76     fprintf(stderr,
77     "%s: cannot open display; DISPLAY variable set?\n",
78     progname);
79     exit(1);
80     }
81     /* find our window */
82 greg 1.5 gwind = xfindwind(theDisplay, rwind, name, 2);
83     if (gwind == None) {
84     fprintf(stderr, "%s: cannot find \"%s\" window\n",
85     progname, name);
86 greg 1.1 exit(1);
87     }
88 greg 1.5 XMapRaised(theDisplay, gwind);
89 greg 1.1 XGetWindowAttributes(theDisplay, gwind, &wa);
90     sleep(4);
91     if (wa.width != xres || wa.height != yres) {
92     fprintf(stderr,
93     "%s: warning -- window seems to be the wrong size!\n",
94     progname);
95     xres = wa.width;
96     yres = wa.height;
97     }
98     /* set graphics context */
99     xc.red = 65535; xc.green = 0; xc.blue = 0;
100     xc.flags = DoRed|DoGreen|DoBlue;
101     if (XAllocColor(theDisplay, wa.colormap, &xc)) {
102     gcv.foreground = xc.pixel;
103     vecGC = XCreateGC(theDisplay,gwind,GCForeground,&gcv);
104     } else {
105     gcv.function = GXinvert;
106     vecGC = XCreateGC(theDisplay,gwind,GCFunction,&gcv);
107     }
108     }
109    
110    
111     circle_sources(fp) /* circle sources listed in fp */
112     FILE *fp;
113     {
114     char linbuf[256];
115     int reading = 0;
116     FVECT dir;
117     double dom;
118    
119     while (fgets(linbuf, sizeof(linbuf), fp) != NULL)
120     if (reading) {
121     if (!strncmp(linbuf, "END", 3)) {
122     XFlush(theDisplay);
123     return;
124     }
125     if (sscanf(linbuf, "%lf %lf %lf %lf",
126     &dir[0], &dir[1], &dir[2],
127     &dom) != 4)
128     break;
129     circle(dir, dom);
130     } else if (!strcmp(linbuf, "BEGIN glare source\n"))
131     reading++;
132    
133     fprintf(stderr, "%s: error reading glare sources\n", progname);
134     exit(1);
135     }
136    
137    
138     circle(dir, dom) /* indicate a solid angle on image */
139     FVECT dir;
140     double dom;
141     {
142     FVECT start, cur;
143     XPoint pt[NSEG+1];
144     double px, py, pz;
145     register int i;
146    
147     fcross(cur, dir, ourview.vup);
148     if (normalize(cur) == 0.0)
149     goto fail;
150     spinvector(start, dir, cur, acos(1.-dom/(2.*PI)));
151     for (i = 0; i <= NSEG; i++) {
152     spinvector(cur, start, dir, 2.*PI*i/NSEG);
153     cur[0] += ourview.vp[0];
154     cur[1] += ourview.vp[1];
155     cur[2] += ourview.vp[2];
156     viewpixel(&px, &py, &pz, &ourview, cur);
157     if (pz <= 0.0)
158     goto fail;
159     pt[i].x = px*xres;
160 greg 1.2 pt[i].y = yres-1 - (int)(py*yres);
161 greg 1.1 }
162     XDrawLines(theDisplay, gwind, vecGC, pt, NSEG+1, CoordModeOrigin);
163     return;
164     fail:
165     fprintf(stderr, "%s: cannot draw source at (%f,%f,%f)\n",
166     progname, dir[0], dir[1], dir[2]);
167     }