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.12 by greg, Fri Aug 21 12:31:27 1992 UTC vs.
Revision 2.24 by greg, Fri Aug 6 12:58:43 1993 UTC

# Line 1 | Line 1
1 < /* Copyright (c) 1992 Regents of the University of California */
1 > /* Copyright (c) 1993 Regents of the University of California */
2  
3   #ifndef lint
4   static char SCCSid[] = "$SunId$ LBL";
# Line 10 | Line 10 | static char SCCSid[] = "$SunId$ LBL";
10  
11   #include "standard.h"
12   #include <fcntl.h>
13 +
14 + #ifndef F_SETLKW
15 +
16 + main(argc, argv)
17 + int argc;
18 + char *argv[];
19 + {
20 +        fprintf(stderr, "%s: no NFS lock manager on this machine\n", argv[0]);
21 +        exit(1);
22 + }
23 +
24 + #else
25 +
26   #include <signal.h>
27   #include "color.h"
28   #include "view.h"
# Line 26 | Line 39 | static char SCCSid[] = "$SunId$ LBL";
39   #define  MAXFORK                0
40   #endif
41   #endif
42 <
42 >                                        /* protection from SYSV signals(!) */
43 > #if defined(sgi) || defined(hpux)
44 > #define guard_io()      sighold(SIGALRM)
45 > #define unguard()       sigrelse(SIGALRM)
46 > #endif
47 > #ifndef guard_io
48 > #define guard_io()      0
49 > #define unguard()       0
50 > #endif
51                                  /* rpict command */
52 < char  *rpargv[128] = {"rpict", "-S", "1", "-x", "512", "-y", "512", "-pa", "1"};
53 < int  rpargc = 9;
52 > char  *rpargv[128] = {"rpict", "-S", "1"};
53 > int  rpargc = 3;
54   int  rpd[3];
55   FILE  *torp, *fromrp;
56   COLR  *pbuf;
57                                  /* our view parameters */
58   VIEW  ourview = STDVIEW;
59   double  pixaspect = 1.0;
60 < int  hres = 512, vres = 512, hmult = 2, vmult = 2;
60 > int  hres = 1024, vres = 1024, hmult = 4, vmult = 4;
61                                  /* output file */
62   char  *outfile = NULL;
63   int  outfd;
# Line 61 | Line 82 | char  *argv[];
82          
83          progname = argv[0];
84          for (i = 1; i < argc; i++) {
85 +                                                /* expand arguments */
86 +                while (rval = expandarg(&argc, &argv, i))
87 +                        if (rval < 0) {
88 +                                fprintf(stderr, "%s: cannot expand '%s'",
89 +                                                argv[0], argv[i]);
90 +                                exit(1);
91 +                        }
92                  if (argv[i][0] == '-')
93                          switch (argv[i][1]) {
94                          case 'v':
# Line 85 | Line 113 | char  *argv[];
113                                  }
114                                  break;
115                          case 'p':               /* pixel aspect ratio? */
116 <                                if (argv[i][2] == 'a' && !argv[i][3])
117 <                                        pixaspect = atof(argv[i+1]);
118 <                                break;
119 <                        case 'x':               /* piece x resolution */
120 <                                if (!argv[i][2])
121 <                                        hres = atoi(argv[i+1]);
122 <                                break;
123 <                        case 'y':               /* piece y resolution */
124 <                                if (!argv[i][2])
125 <                                        vres = atoi(argv[i+1]);
126 <                                break;
116 >                                if (argv[i][2] != 'a' || argv[i][3])
117 >                                        break;
118 >                                pixaspect = atof(argv[i+1]);
119 >                                continue;
120 >                        case 'x':               /* overall x resolution */
121 >                                if (argv[i][2])
122 >                                        break;
123 >                                hres = atoi(argv[++i]);
124 >                                continue;
125 >                        case 'y':               /* overall y resolution */
126 >                                if (argv[i][2])
127 >                                        break;
128 >                                vres = atoi(argv[++i]);
129 >                                continue;
130                          case 'X':               /* horizontal multiplier */
131                                  if (argv[i][2])
132                                          break;
# Line 109 | Line 140 | char  *argv[];
140                          case 'F':               /* syncronization file */
141                                  if (argv[i][2])
142                                          break;
143 <                                if ((syncfd = open(argv[++i], O_RDWR)) < 0) {
143 >                                if ((syncfd = open(argv[++i],
144 >                                                O_RDWR|O_CREAT, 0666)) < 0) {
145                                          fprintf(stderr, "%s: cannot open\n",
146                                                          argv[i]);
147                                          exit(1);
148                                  }
149                                  continue;
150 +                        case 'z':               /* z-file ist verbotten */
151 +                                fprintf(stderr, "%s: -z option not allowed\n",
152 +                                                argv[0]);
153 +                                exit(1);
154                          case 'o':               /* output file */
155                                  if (argv[i][2])
156                                          break;
157                                  outfile = argv[++i];
158                                  continue;
159 <                        }
159 >                        } else if (i >= argc-1)
160 >                                break;
161                  rpargv[rpargc++] = argv[i];
162          }
163 <        rpargv[rpargc] = NULL;
163 >        if (i >= argc) {
164 >                fprintf(stderr, "%s: missing octree argument\n", argv[0]);
165 >                exit(1);
166 >        }
167          if (outfile == NULL) {
168                  fprintf(stderr, "%s: missing output file\n", argv[0]);
169                  exit(1);
170          }
171          init(argc, argv);
172          rpiece();
173 <        rval = cleanup(0);
134 <        exit(rval);
173 >        exit(cleanup(0));
174   }
175  
176  
# Line 139 | Line 178 | init(ac, av)                   /* set up output file and start rpict *
178   int  ac;
179   char  **av;
180   {
181 +        static char  hrbuf[16], vrbuf[16];
182          extern char  VersionID[];
183          char  *err;
184          FILE  *fp;
# Line 153 | Line 193 | char  **av;
193                  buf[read(syncfd, buf, sizeof(buf)-1)] = '\0';
194                  sscanf(buf, "%d %d", &hmult, &vmult);
195          }
196 +                                        /* compute piece size */
197 +        hres /= hmult;
198 +        vres /= vmult;
199          normaspect(viewaspect(&ourview)*hmult/vmult, &pixaspect, &hres, &vres);
200 +        sprintf(hrbuf, "%d", hres);
201 +        rpargv[rpargc++] = "-x"; rpargv[rpargc++] = hrbuf;
202 +        sprintf(vrbuf, "%d", vres);
203 +        rpargv[rpargc++] = "-y"; rpargv[rpargc++] = vrbuf;
204 +        rpargv[rpargc++] = "-pa"; rpargv[rpargc++] = "0";
205 +        rpargv[rpargc++] = av[ac-1];
206 +        rpargv[rpargc] = NULL;
207                                          /* open output file */
208          if ((outfd = open(outfile, O_WRONLY|O_CREAT|O_EXCL, 0666)) >= 0) {
209                  if ((fp = fdopen(dup(outfd), "w")) == NULL)
# Line 171 | Line 221 | char  **av;
221          } else if ((outfd = open(outfile, O_RDWR)) >= 0) {
222                  if ((fp = fdopen(dup(outfd), "r+")) == NULL)
223                          goto filerr;
224 <                getheader(fp, NULL);            /* skip header */
225 <                if (fscnresolu(&hr, &vr, fp) < 0 ||     /* check resolution */
224 >                getheader(fp, NULL, NULL);      /* skip header */
225 >                if (!fscnresolu(&hr, &vr, fp) ||        /* check resolution */
226                                  hr != hres*hmult || vr != vres*vmult) {
227                          fprintf(stderr, "%s: resolution mismatch on file \"%s\"\n",
228                                          progname, outfile);
# Line 200 | Line 250 | char  **av;
250                                  progname, rpargv[0]);
251                  exit(1);
252          }
253 <        if ((pbuf = (COLR *)malloc(hres*vres*sizeof(COLR))) == NULL) {
253 >        if ((pbuf = (COLR *)bmalloc(hres*vres*sizeof(COLR))) == NULL) {
254                  fprintf(stderr, "%s: out of memory\n", progname);
255                  exit(1);
256          }
# Line 216 | Line 266 | int
266   nextpiece(xp, yp)               /* get next piece assignment */
267   int  *xp, *yp;
268   {
219        extern char  *fgets();
269          struct flock  fls;
270          char  buf[64];
271  
# Line 241 | Line 290 | int  *xp, *yp;
290                                  return(0);
291                          }
292                  }
293 <                sprintf(buf, "%d %d\n%d %d\n", hmult, vmult, *xp, *yp);
293 >                sprintf(buf, "%4d %4d\n%4d %4d\n", hmult, vmult, *xp, *yp);
294                  lseek(syncfd, 0L, 0);           /* write new position */
295                  write(syncfd, buf, strlen(buf));
296                  fls.l_type = F_UNLCK;           /* release sync file */
# Line 263 | Line 312 | int  rstat;
312   {
313          int  status;
314  
315 <        free((char *)pbuf);
315 >        bfree((char *)pbuf, hres*vres*sizeof(COLR));
316          fclose(torp);
317          fclose(fromrp);
318          while (wait(&status) != -1)
# Line 311 | Line 360 | rpiece()                       /* render picture piece by piece */
360                  putc('\n', torp);
361                  fflush(torp);                   /* assigns piece to rpict */
362                  putpiece(xorg, yorg);           /* place piece in output */
314                if (verbose) {                  /* notify caller */
315                        printf("%d %d done\n", xorg, yorg);
316                        fflush(stdout);
317                }
363          }
364   }
365  
# Line 334 | Line 379 | int  xpos, ypos;
379                  exit(cleanup(1));
380          }
381                                  /* check header from rpict */
382 <        getheader(fromrp, NULL);
383 <        if (fscnresolu(&hr, &vr, fromrp) < 0 || hr != hres | vr != vres) {
382 >        guard_io();
383 >        getheader(fromrp, NULL, NULL);
384 >        if (!fscnresolu(&hr, &vr, fromrp) || hr != hres | vr != vres) {
385                  fprintf(stderr, "%s: resolution mismatch from %s\n",
386                                  progname, rpargv[0]);
387                  exit(cleanup(1));
388          }
389 +        if (verbose) {                          /* notify caller */
390 +                printf("%d %d begun\n", xpos, ypos);
391 +                fflush(stdout);
392 +        }
393 +        unguard();
394                                  /* load new piece into buffer */
395 <        for (y = 0; y < vr; y++)
395 >        for (y = 0; y < vr; y++) {
396 >                guard_io();
397                  if (freadcolrs(pbuf+y*hr, hr, fromrp) < 0) {
398                          fprintf(stderr, "%s: read error from %s\n",
399                                          progname, rpargv[0]);
400                          exit(cleanup(1));
401                  }
402 +                unguard();
403 +        }
404   #if MAXFORK
405                                  /* fork so we don't slow rpict down */
406          if ((pid = fork()) > 0) {
# Line 361 | Line 415 | int  xpos, ypos;
415   #else
416          pid = -1;               /* no forking */
417   #endif
418 +        fls.l_start = scanorig +
419 +                ((long)(vmult-1-ypos)*vres*hmult+xpos)*hres*sizeof(COLR);
420   #if NFS
421 +        fls.l_len = ((long)(vres-1)*hmult+1)*hres*sizeof(COLR);
422                                  /* lock file section so NFS doesn't mess up */
423          fls.l_whence = 0;
367        fls.l_len = (long)vres*hmult*hres*sizeof(COLR);
368        fls.l_start = scanorig + (vmult-1-ypos)*fls.l_len;
424          fls.l_type = F_WRLCK;
425          fcntl(outfd, F_SETLKW, &fls);
426   #endif
427                                  /* write new piece to file */
428 <        if (lseek(outfd, fls.l_start+(long)xpos*hres*sizeof(COLR), 0) == -1)
428 >        if (lseek(outfd, fls.l_start, 0) == -1)
429                  goto seekerr;
430          if (hmult == 1) {
431                  if (writebuf(outfd, (char *)pbuf,
# Line 386 | Line 441 | int  xpos, ypos;
441                                          1) == -1)
442                                  goto seekerr;
443                  }
444 <        if (pid == -1) {        /* fork failed */
444 >        if (verbose) {                          /* notify caller */
445 >                printf("%d %d done\n", xpos, ypos);
446 >                fflush(stdout);
447 >        }
448 >        if (pid == -1) {        /* didn't fork or fork failed */
449   #if NFS
450                  fls.l_type = F_UNLCK;           /* release lock */
451                  fcntl(outfd, F_SETLKW, &fls);
# Line 401 | Line 460 | writerr:
460          fprintf(stderr, "%s: write error on file \"%s\"\n", progname, outfile);
461          _exit(1);
462   }
463 +
464 + #endif

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines