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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines