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

Comparing ray/src/util/rpiece.c (file contents):
Revision 2.9 by greg, Sun Aug 9 13:31:30 1992 UTC vs.
Revision 2.11 by greg, Sun Aug 9 23:05:17 1992 UTC

# Line 17 | Line 17 | static char SCCSid[] = "$SunId$ LBL";
17  
18                                  /* set the following to 0 to forgo forking */
19   #ifndef MAXFORK
20 < #define  MAXFORK                2       /* max. unreaped child processes */
20 > #define  MAXFORK                3       /* allotment of duped processes */
21   #endif
22  
23                                  /* rpict command */
# Line 123 | Line 123 | char  *argv[];
123          }
124          init(argc, argv);
125          rpiece();
126 <        rval = cleanup();
126 >        rval = cleanup(0);
127          exit(rval);
128   }
129  
# Line 244 | Line 244 | int  *xp, *yp;
244          if (sscanf(buf, "%d %d", xp, yp) == 2)
245                  return(1);
246          fprintf(stderr, "%s: input format error\n", progname);
247 <        exit(1);
247 >        exit(cleanup(1));
248   }
249  
250  
251   int
252 < cleanup()                       /* close rpict process and clean up */
252 > cleanup(rstat)                  /* close rpict process and clean up */
253 > int  rstat;
254   {
255 <        register int  pid;
255 <        int  status, rstat = 0;
255 >        int  status;
256  
257          free((char *)pbuf);
258          fclose(torp);
259          fclose(fromrp);
260 <        while ((pid = wait(&status)) != -1)
260 >        while (wait(&status) != -1)
261                  if (rstat == 0)
262                          rstat = status>>8 & 0xff;
263          return(rstat);
# Line 268 | Line 268 | rpiece()                       /* render picture piece by piece */
268   {
269          VIEW  pview;
270          int  xorg, yorg;
271 <        
271 >                                        /* compute view parameters */
272 >        copystruct(&pview, &ourview);
273 >        switch (ourview.type) {
274 >        case VT_PER:
275 >                pview.horiz = 2.*180./PI*atan(
276 >                                tan(PI/180./2.*ourview.horiz)/hmult );
277 >                pview.vert = 2.*180./PI*atan(
278 >                                tan(PI/180./2.*ourview.vert)/vmult );
279 >                break;
280 >        case VT_PAR:
281 >        case VT_ANG:
282 >                pview.horiz = ourview.horiz / hmult;
283 >                pview.vert = ourview.vert / vmult;
284 >                break;
285 >        case VT_HEM:
286 >                pview.horiz = 2.*180./PI*asin(
287 >                                sin(PI/180./2.*ourview.horiz)/hmult );
288 >                pview.vert = 2.*180./PI*asin(
289 >                                sin(PI/180./2.*ourview.vert)/vmult );
290 >                break;
291 >        default:
292 >                fprintf(stderr, "%s: unknown view type '-vt%c'\n",
293 >                                progname, ourview.type);
294 >                exit(cleanup(1));
295 >        }
296 >                                        /* render each piece */
297          while (nextpiece(&xorg, &yorg)) {
298 <                copystruct(&pview, &ourview);   /* compute view for piece */
299 <                switch (ourview.type) {
275 <                case VT_PER:
276 <                        pview.horiz = 2.*180./PI*atan(
277 <                                        tan(PI/180./2.*ourview.horiz)/hmult );
278 <                        pview.vert = 2.*180./PI*atan(
279 <                                        tan(PI/180./2.*ourview.vert)/vmult );
280 <                        break;
281 <                case VT_PAR:
282 <                case VT_ANG:
283 <                        pview.horiz = ourview.horiz / hmult;
284 <                        pview.vert = ourview.vert / vmult;
285 <                        break;
286 <                case VT_HEM:
287 <                        pview.horiz = 2.*180./PI*asin(
288 <                                        sin(PI/180./2.*ourview.horiz)/hmult );
289 <                        pview.vert = 2.*180./PI*asin(
290 <                                        sin(PI/180./2.*ourview.vert)/vmult );
291 <                        break;
292 <                default:
293 <                        fprintf(stderr, "%s: unknown view type '-vt%c'\n",
294 <                                        progname, ourview.type);
295 <                        exit(1);
296 <                }
297 <                pview.hoff += xorg - 0.5*(hmult-1);
298 <                pview.voff += yorg - 0.5*(vmult-1);
298 >                pview.hoff = ourview.hoff + xorg - 0.5*(hmult-1);
299 >                pview.voff = ourview.voff + yorg - 0.5*(vmult-1);
300                  fputs(VIEWSTR, torp);
301                  fprintview(&pview, torp);
302                  putc('\n', torp);
303 <                fflush(torp);                   /* assign piece to rpict */
303 >                fflush(torp);                   /* assigns piece to rpict */
304                  putpiece(xorg, yorg);           /* place piece in output */
305                  if (verbose) {                  /* notify caller */
306                          printf("%d %d done\n", xorg, yorg);
# Line 321 | Line 322 | int  xpos, ypos;
322          if (xpos < 0 | ypos < 0 | xpos >= hmult | ypos >= vmult) {
323                  fprintf(stderr, "%s: requested piece (%d,%d) out of range\n",
324                                  progname, xpos, ypos);
325 <                exit(1);
325 >                exit(cleanup(1));
326          }
327                                  /* check header from rpict */
328          getheader(fromrp, NULL);
329 <        if (fscnresolu(&hr, &vr, fromrp) < 0 || hr != hres || vr != vres) {
329 >        if (fscnresolu(&hr, &vr, fromrp) < 0 || hr != hres | vr != vres) {
330                  fprintf(stderr, "%s: resolution mismatch from %s\n",
331                                  progname, rpargv[0]);
332 <                exit(1);
332 >                exit(cleanup(1));
333          }
334                                  /* load new piece into buffer */
335          for (y = 0; y < vr; y++)
336                  if (freadcolrs(pbuf+y*hr, hr, fromrp) < 0) {
337                          fprintf(stderr, "%s: read error from %s\n",
338                                          progname, rpargv[0]);
339 <                        exit(1);
339 >                        exit(cleanup(1));
340                  }
341   #if MAXFORK
342                                  /* fork so we don't slow rpict down */
343          if ((pid = fork()) > 0) {
344 <                if (++nforked > MAXFORK) {
344 >                if (++nforked >= MAXFORK) {
345                          wait(&status);          /* reap a child */
346                          if (status)
347 <                                exit(status>>8 & 0xff);
347 >                                exit(cleanup(status>>8 & 0xff));
348                          nforked--;
349                  }
350                  return(pid);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines