--- ray/src/util/rpiece.c 1995/11/30 09:26:20 2.31 +++ ray/src/util/rpiece.c 2003/10/20 16:01:55 2.42 @@ -1,13 +1,11 @@ -/* Copyright (c) 1995 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: rpiece.c,v 2.42 2003/10/20 16:01:55 greg Exp $"; #endif - /* * Generate sections of a picture. */ +#include "platform.h" #include "standard.h" #ifndef F_SETLKW @@ -23,9 +21,10 @@ char *argv[]; #else #include + #include "color.h" #include "view.h" -#include "resolu.h" +#include "rtprocess.h" #ifndef NFS #define NFS 1 @@ -47,10 +46,12 @@ char *argv[]; #define guard_io() 0 #define unguard() 0 #endif + +extern char *strerror(); + /* rpict command */ char *rpargv[128] = {"rpict", "-S", "1"}; int rpargc = 3; -int rpd[3]; FILE *torp, *fromrp; COLR *pbuf; /* our view parameters */ @@ -72,10 +73,8 @@ int verbose = 0; unsigned timelim = 0; int rvrlim = -1; -extern long lseek(), ftell(); - int gotalrm = 0; -int onalrm() { gotalrm++; } +void onalrm(int i) { gotalrm++; } main(argc, argv) @@ -87,12 +86,13 @@ char *argv[]; progname = argv[0]; for (i = 1; i < argc; i++) { /* expand arguments */ - while (rval = expandarg(&argc, &argv, i)) - if (rval < 0) { - fprintf(stderr, "%s: cannot expand '%s'", - argv[0], argv[i]); - exit(1); - } + while ((rval = expandarg(&argc, &argv, i)) > 0) + ; + if (rval < 0) { + fprintf(stderr, "%s: cannot expand '%s'", + argv[0], argv[i]); + exit(1); + } if (argv[i][0] == '-') switch (argv[i][1]) { case 'v': @@ -119,7 +119,7 @@ char *argv[]; case 'p': /* pixel aspect ratio? */ if (argv[i][2] != 'a' || argv[i][3]) break; - pixaspect = atof(argv[i+1]); + pixaspect = atof(argv[++i]); continue; case 'T': /* time limit (hours) */ if (argv[i][2]) @@ -193,12 +193,11 @@ int fd; int ltyp; { static struct flock fls; /* static so initialized to zeroes */ - extern char *sys_errlist[]; fls.l_type = ltyp; if (fcntl(fd, F_SETLKW, &fls) < 0) { fprintf(stderr, "%s: cannot lock/unlock file: %s\n", - progname, sys_errlist[errno]); + progname, strerror(errno)); exit(1); } } @@ -213,6 +212,7 @@ char **av; char *err; FILE *fp; int hr, vr; + SUBPROC rpd; /* since we don't close_process(), this can be local */ /* set up view */ if ((err = setview(&ourview)) != NULL) { fprintf(stderr, "%s: %s\n", progname, err); @@ -271,12 +271,12 @@ char **av; goto filerr; dolock(outfd, F_UNLCK); /* start rpict process */ - if (open_process(rpd, rpargv) <= 0) { + if (open_process(&rpd, rpargv) <= 0) { fprintf(stderr, "%s: cannot start %s\n", progname, rpargv[0]); exit(1); } - if ((fromrp = fdopen(rpd[0], "r")) == NULL || - (torp = fdopen(rpd[1], "w")) == NULL) { + if ((fromrp = fdopen(rpd.r, "r")) == NULL || + (torp = fdopen(rpd.w, "w")) == NULL) { fprintf(stderr, "%s: cannot open stream to %s\n", progname, rpargv[0]); exit(1); @@ -402,7 +402,7 @@ rpiece() /* render picture piece by piece */ VIEW pview; int xorg, yorg; /* compute view parameters */ - copystruct(&pview, &ourview); + pview = ourview; switch (ourview.type) { case VT_PER: pview.horiz = 2.*180./PI*atan( @@ -415,6 +415,11 @@ rpiece() /* render picture piece by piece */ pview.horiz = ourview.horiz / hmult; pview.vert = ourview.vert / vmult; break; + case VT_CYL: + pview.horiz = ourview.horiz / hmult; + pview.vert = 2.*180./PI*atan( + tan(PI/180./2.*ourview.vert)/vmult ); + break; case VT_HEM: pview.horiz = 2.*180./PI*asin( sin(PI/180./2.*ourview.horiz)/hmult ); @@ -428,8 +433,8 @@ rpiece() /* render picture piece by piece */ } /* render each piece */ while (nextpiece(&xorg, &yorg)) { - pview.hoff = ourview.hoff + xorg - 0.5*(hmult-1); - pview.voff = ourview.voff + yorg - 0.5*(vmult-1); + pview.hoff = ourview.hoff*hmult + xorg - 0.5*(hmult-1); + pview.voff = ourview.voff*vmult + yorg - 0.5*(vmult-1); fputs(VIEWSTR, torp); fprintview(&pview, torp); putc('\n', torp); @@ -448,7 +453,7 @@ int xpos, ypos; int hr, vr; register int y; /* check bounds */ - if (xpos < 0 | ypos < 0 | xpos >= hmult | ypos >= vmult) { + if ((xpos < 0) | (ypos < 0) | (xpos >= hmult) | (ypos >= vmult)) { fprintf(stderr, "%s: requested piece (%d,%d) out of range\n", progname, xpos, ypos); exit(cleanup(1)); @@ -456,7 +461,7 @@ int xpos, ypos; /* check header from rpict */ guard_io(); getheader(fromrp, NULL, NULL); - if (!fscnresolu(&hr, &vr, fromrp) || hr != hres | vr != vres) { + if (!fscnresolu(&hr, &vr, fromrp) || (hr != hres) | (vr != vres)) { fprintf(stderr, "%s: resolution mismatch from %s\n", progname, rpargv[0]); exit(cleanup(1)); @@ -501,7 +506,7 @@ int xpos, ypos; filerr("lock"); #endif /* write new piece to file */ - if (lseek(outfd, fls.l_start, 0) == -1) + if (lseek(outfd, (off_t)fls.l_start, SEEK_SET) < 0) filerr("seek"); if (hmult == 1) { if (writebuf(outfd, (char *)pbuf, @@ -513,8 +518,8 @@ int xpos, ypos; hr*sizeof(COLR)) != hr*sizeof(COLR)) filerr("write"); if (y < vr-1 && lseek(outfd, - (long)(hmult-1)*hr*sizeof(COLR), - 1) == -1) + (off_t)(hmult-1)*hr*sizeof(COLR), + SEEK_CUR) < 0) filerr("seek"); } #if NFS @@ -522,6 +527,10 @@ int xpos, ypos; if (fcntl(outfd, F_SETLKW, &fls) < 0) filerr("lock"); #endif + if (verbose) { /* notify caller */ + printf("%d %d done\n", xpos, ypos); + fflush(stdout); + } if (syncfp != NULL) { /* record what's been done */ sflock(F_WRLCK); fseek(syncfp, 0L, 2); /* append index */ @@ -530,10 +539,6 @@ int xpos, ypos; /*** Unlock not necessary, since sflock(F_UNLCK); _exit() or nextpiece() is next ***/ } - if (verbose) { /* notify caller */ - printf("%d %d done\n", xpos, ypos); - fflush(stdout); - } if (pid == -1) /* didn't fork or fork failed */ return(0); _exit(0); /* else exit child process (releasing locks) */ @@ -543,10 +548,8 @@ int xpos, ypos; filerr(t) /* report file error and exit */ char *t; { - extern char *sys_errlist[]; - fprintf(stderr, "%s: %s error on file \"%s\": %s\n", - progname, t, outfile, sys_errlist[errno]); + progname, t, outfile, strerror(errno)); _exit(1); }