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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines