/* set input/output format */ static void setformat(const char *fmt) { switch (fmt[0]) { case 'f': case 'd': SET_FILE_BINARY(stdin); /* fall through */ case 'a': inpfmt = fmt[0]; break; default: goto fmterr; } switch (fmt[1]) { case '\0': outfmt = inpfmt; return; case 'a': case 'f': case 'd': case 'c': outfmt = fmt[1]; break; default: goto fmterr; } if (!fmt[2]) return; fmterr: sprintf(errmsg, "Illegal i/o format: -f%s", fmt); error(USER, errmsg); }
static void initambfile( /* initialize ambient file */ int cre8 ) { extern char *progname, *octname; static char *mybuf = NULL; #ifdef F_SETLKW aflock(cre8 ? F_WRLCK : F_RDLCK); #endif SET_FILE_BINARY(ambfp); if (mybuf == NULL) mybuf = (char *)bmalloc(BUFSIZ+8); setbuf(ambfp, mybuf); if (cre8) { /* new file */ newheader("RADIANCE", ambfp); fprintf(ambfp, "%s -av %g %g %g -aw %d -ab %d -aa %g ", progname, colval(ambval,RED), colval(ambval,GRN), colval(ambval,BLU), ambvwt, ambounce, ambacc); fprintf(ambfp, "-ad %d -as %d -ar %d ", ambdiv, ambssamp, ambres); if (octname != NULL) fputs(octname, ambfp); fputc('\n', ambfp); fprintf(ambfp, "SOFTWARE= %s\n", VersionID); fputnow(ambfp); fputformat(AMBFMT, ambfp); fputc('\n', ambfp); putambmagic(ambfp); } else if (checkheader(ambfp, AMBFMT, NULL) < 0 || !hasambmagic(ambfp)) error(USER, "bad ambient file"); }
void writepict( /* write the picture to a file */ char *s ) { static char buf[128]; char *fname; FILE *fp; COLR *scanline; int y; /* XXX relies on words.c 2.11 behavior */ if (nextword(buf, sizeof(buf), s) == NULL && !buf[0]) { error(COMMAND, "no file"); return; } if ((fname = getpath(buf, NULL, 0)) == NULL || (fp = fopen(fname, "w")) == NULL) { sprintf(errmsg, "cannot open \"%s\"", buf); error(COMMAND, errmsg); return; } SET_FILE_BINARY(fp); (*dev->comout)("writing \""); (*dev->comout)(fname); (*dev->comout)("\"...\n"); /* write header */ newheader("RADIANCE", fp); fputs(progname, fp); fprintview(&ourview, fp); if (octname != NULL) fprintf(fp, " %s\n", octname); else putc('\n', fp); fprintf(fp, "SOFTWARE= %s\n", VersionID); fputnow(fp); if (exposure != 1.0) fputexpos(exposure, fp); if (dev->pixaspect != 1.0) fputaspect(dev->pixaspect, fp); fputformat(COLRFMT, fp); putc('\n', fp); fprtresolu(hresolu, vresolu, fp); scanline = (COLR *)malloc(hresolu*sizeof(COLR)); if (scanline == NULL) { error(COMMAND, "not enough memory!"); fclose(fp); unlink(fname); return; } for (y = vresolu-1; y >= 0; y--) { getpictcolrs(y, scanline, &ptrunk, hresolu, vresolu); if (fwritecolrs(scanline, hresolu, fp) < 0) break; } free((void *)scanline); if (fclose(fp) < 0) error(COMMAND, "write error"); }
int main(int argc, char *argv[]) { char *ospec; int i; progname = argv[0]; for (i = 1; i < argc; i++) if (argv[i][0] == '-') switch (argv[i][1]) { case 'r': doflat = !doflat; break; case 'e': if (argv[i+1][0] != '+' && argv[i+1][0] != '-') goto userr; bradj = atoi(argv[++i]); break; case 'n': findframe = atoi(argv[++i]); break; case 'f': force++; break; case '\0': goto gotfile; default: goto userr; } else break; gotfile: if (i < argc-2) goto userr; if (i <= argc-1 && strcmp(argv[i], "-") && freopen(argv[i], "r", stdin) == NULL) { fprintf(stderr, "%s: can't open input \"%s\"\n", progname, argv[i]); exit(1); } SET_FILE_BINARY(stdin); ospec = i==argc-2 ? argv[i+1] : (char *)NULL; while (transfer(ospec)) ; exit(0); userr: fprintf(stderr, "Usage: %s [-r][-e +/-stops][-f][-n frame] [input [outspec]]\n", progname); exit(1); }
static PICTURE * openpicture( /* open/check Radiance picture file */ char *fname ) { FILE *fp; register PICTURE *pp; register char *cp; /* check filename suffix */ if (fname == NULL) return(NULL); for (cp = fname; *cp; cp++) ; while (cp > fname && cp[-1] != '.') if (*--cp == '/') { cp = fname; break; } if (cp > fname && !strncmp(cp, "tif", 3)) return(NULL); /* assume it's a TIFF */ /* else try opening it */ if ((fp = fopen(fname, "r")) == NULL) return(NULL); SET_FILE_BINARY(fp); /* allocate struct */ if ((pp = (PICTURE *)malloc(sizeof(PICTURE))) == NULL) return(NULL); /* serious error -- should exit? */ pp->fp = fp; pp->fmt[0] = '\0'; pp->pa = 1.; /* load header */ if (getheader(fp, headline, pp) < 0) { closepicture(pp); return(NULL); } if (!pp->fmt[0]) /* assume RGBE if unspecified */ strcpy(pp->fmt, COLRFMT); if (!globmatch(PICFMT, pp->fmt) || !fgetsresolu(&pp->rs, fp)) { closepicture(pp); /* failed test -- close file */ return(NULL); } rewind(fp); /* passed test -- rewind file */ return(pp); }
/* Allocate and load a matrix from the given input (or stdin if NULL) */ CMATRIX * cm_load(const char *inspec, int nrows, int ncols, int dtype) { const int ROWINC = 2048; FILE *fp = stdin; CMATRIX *cm; if (inspec == NULL) inspec = "<stdin>"; else if (inspec[0] == '!') { fp = popen(inspec+1, "r"); if (fp == NULL) { sprintf(errmsg, "cannot start command '%s'", inspec); error(SYSTEM, errmsg); } } else if ((fp = fopen(inspec, "r")) == NULL) { sprintf(errmsg, "cannot open file '%s'", inspec); error(SYSTEM, errmsg); } #ifdef getc_unlocked flockfile(fp); #endif if (dtype != DTascii) SET_FILE_BINARY(fp); /* doesn't really work */ if (!dtype | !ncols) { /* expecting header? */ char *err = cm_getheader(&dtype, &nrows, &ncols, fp); if (err != NULL) error(USER, err); if (ncols <= 0) error(USER, "unspecified number of columns"); } switch (dtype) { case DTascii: case DTfloat: case DTdouble: break; default: error(USER, "unexpected data type in cm_load()"); } if (nrows <= 0) { /* don't know length? */ int guessrows = 147; /* usually big enough */ if ((dtype != DTascii) & (fp != stdin) & (inspec[0] != '!')) { long startpos = ftell(fp); if (fseek(fp, 0L, SEEK_END) == 0) { long endpos = ftell(fp); long elemsiz = 3*(dtype==DTfloat ? sizeof(float) : sizeof(double)); if ((endpos - startpos) % (ncols*elemsiz)) { sprintf(errmsg, "improper length for binary file '%s'", inspec); error(USER, errmsg); } guessrows = (endpos - startpos)/(ncols*elemsiz); if (fseek(fp, startpos, SEEK_SET) < 0) { sprintf(errmsg, "fseek() error on file '%s'", inspec); error(SYSTEM, errmsg); } nrows = guessrows; /* we're confident */ } } cm = cm_alloc(guessrows, ncols); } else cm = cm_alloc(nrows, ncols); if (cm == NULL) /* XXX never happens */ return(NULL); if (dtype == DTascii) { /* read text file */ int maxrow = (nrows > 0 ? nrows : 32000); int r, c; for (r = 0; r < maxrow; r++) { if (r >= cm->nrows) /* need more space? */ cm = cm_resize(cm, cm->nrows+ROWINC); for (c = 0; c < ncols; c++) { COLORV *cv = cm_lval(cm,r,c); if (fscanf(fp, COLSPEC, cv, cv+1, cv+2) != 3) { if ((nrows <= 0) & (r > 0) & !c) { cm = cm_resize(cm, maxrow=r); break; } else goto EOFerror; } } } while ((c = getc(fp)) != EOF) if (!isspace(c)) { sprintf(errmsg, "unexpected data at end of ascii input '%s'", inspec); error(WARNING, errmsg); break; } } else { /* read binary file */ if (sizeof(COLOR) == cm_elem_size[dtype]) { int nread = 0; do { /* read all we can */ nread += getbinary(cm->cmem + 3*nread, sizeof(COLOR), cm->nrows*cm->ncols - nread, fp); if (nrows <= 0) { /* unknown length */ if (nread == cm->nrows*cm->ncols) /* need more space? */ cm = cm_resize(cm, cm->nrows+ROWINC); else if (nread && !(nread % cm->ncols)) /* seem to be done */ cm = cm_resize(cm, nread/cm->ncols); else /* ended mid-row */ goto EOFerror; } else if (nread < cm->nrows*cm->ncols) goto EOFerror; } while (nread < cm->nrows*cm->ncols); } else if (dtype == DTdouble) { double dc[3]; /* load from double */ COLORV *cvp = cm->cmem; int n = nrows*ncols; if (n <= 0) goto not_handled; while (n--) { if (getbinary(dc, sizeof(double), 3, fp) != 3) goto EOFerror; copycolor(cvp, dc); cvp += 3; } } else /* dtype == DTfloat */ { float fc[3]; /* load from float */ COLORV *cvp = cm->cmem; int n = nrows*ncols; if (n <= 0) goto not_handled; while (n--) { if (getbinary(fc, sizeof(float), 3, fp) != 3) goto EOFerror; copycolor(cvp, fc); cvp += 3; } } if (fgetc(fp) != EOF) { sprintf(errmsg, "unexpected data at end of binary input '%s'", inspec); error(WARNING, errmsg); } } if (fp != stdin) { if (inspec[0] != '!') fclose(fp); else if (pclose(fp)) { sprintf(errmsg, "error running command '%s'", inspec); error(WARNING, errmsg); } } #ifdef getc_unlocked else funlockfile(fp); #endif return(cm); EOFerror: sprintf(errmsg, "unexpected EOF reading %s", inspec); error(USER, errmsg); not_handled: error(INTERNAL, "unhandled data size or length in cm_load()"); return(NULL); /* gratis return */ }
int main(int argc, char *argv[]) { #define check(ol,al) if (argv[i][ol] || \ badarg(argc-i-1,argv+i+1,al)) \ goto badopt #define bool(olen,var) switch (argv[i][olen]) { \ case '\0': var = !var; break; \ case 'y': case 'Y': case 't': case 'T': \ case '+': case '1': var = 1; break; \ case 'n': case 'N': case 'f': case 'F': \ case '-': case '0': var = 0; break; \ default: goto badopt; } char *err; char *recover = NULL; char *outfile = NULL; char *zfile = NULL; int loadflags = ~IO_FILES; int seqstart = 0; int persist = 0; int duped1 = -1; int rval; int i; /* record start time */ tstart = time((time_t *)NULL); /* global program name */ progname = argv[0] = fixargv0(argv[0]); /* option city */ for (i = 1; i < argc; i++) { /* expand arguments */ while ((rval = expandarg(&argc, &argv, i)) > 0) ; if (rval < 0) { sprintf(errmsg, "cannot expand '%s'", argv[i]); error(SYSTEM, errmsg); } if (argv[i] == NULL || argv[i][0] != '-') break; /* break from options */ if (!strcmp(argv[i], "-version")) { puts(VersionID); quit(0); } if (!strcmp(argv[i], "-defaults") || !strcmp(argv[i], "-help")) { printdefaults(); quit(0); } rval = getrenderopt(argc-i, argv+i); if (rval >= 0) { i += rval; continue; } rval = getviewopt(&ourview, argc-i, argv+i); if (rval >= 0) { i += rval; continue; } /* rpict options */ switch (argv[i][1]) { case 'v': /* view file */ if (argv[i][2] != 'f') goto badopt; check(3,"s"); rval = viewfile(argv[++i], &ourview, NULL); if (rval < 0) { sprintf(errmsg, "cannot open view file \"%s\"", argv[i]); error(SYSTEM, errmsg); } else if (rval == 0) { sprintf(errmsg, "bad view file \"%s\"", argv[i]); error(USER, errmsg); } break; case 'p': /* pixel */ switch (argv[i][2]) { case 's': /* sample */ check(3,"i"); psample = atoi(argv[++i]); break; case 't': /* threshold */ check(3,"f"); maxdiff = atof(argv[++i]); break; case 'j': /* jitter */ check(3,"f"); dstrpix = atof(argv[++i]); break; case 'a': /* aspect */ check(3,"f"); pixaspect = atof(argv[++i]); break; case 'm': /* motion */ check(3,"f"); mblur = atof(argv[++i]); break; case 'd': /* aperture */ check(3,"f"); dblur = atof(argv[++i]); break; default: goto badopt; } break; case 'x': /* x resolution */ check(2,"i"); hresolu = atoi(argv[++i]); break; case 'y': /* y resolution */ check(2,"i"); vresolu = atoi(argv[++i]); break; case 'S': /* slave index */ check(2,"i"); seqstart = atoi(argv[++i]); break; case 'o': /* output file */ check(2,"s"); outfile = argv[++i]; break; case 'z': /* z file */ check(2,"s"); zfile = argv[++i]; break; case 'r': /* recover file */ if (argv[i][2] == 'o') { /* +output */ check(3,"s"); outfile = argv[i+1]; } else check(2,"s"); recover = argv[++i]; break; case 't': /* timer */ check(2,"i"); ralrm = atoi(argv[++i]); break; #ifdef PERSIST case 'P': /* persist file */ if (argv[i][2] == 'P') { check(3,"s"); persist = PARALLEL; } else { check(2,"s"); persist = PERSIST; } persistfile(argv[++i]); break; #endif case 'w': /* warnings */ rval = erract[WARNING].pf != NULL; bool(2,rval); if (rval) erract[WARNING].pf = wputs; else erract[WARNING].pf = NULL; break; case 'e': /* error file */ check(2,"s"); errfile = argv[++i]; break; default: goto badopt; } } err = setview(&ourview); /* set viewing parameters */ if (err != NULL) error(USER, err); /* initialize object types */ initotypes(); /* initialize urand */ if (rand_samp) { srandom((long)time(0)); initurand(0); } else { srandom(0L); initurand(2048); } /* set up signal handling */ sigdie(SIGINT, "Interrupt"); #ifdef SIGHUP sigdie(SIGHUP, "Hangup"); #endif sigdie(SIGTERM, "Terminate"); #ifdef SIGPIPE sigdie(SIGPIPE, "Broken pipe"); #endif #ifdef SIGALRM sigdie(SIGALRM, "Alarm clock"); #endif #ifdef SIGXCPU sigdie(SIGXCPU, "CPU limit exceeded"); sigdie(SIGXFSZ, "File size exceeded"); #endif /* open error file */ if (errfile != NULL) { if (freopen(errfile, "a", stderr) == NULL) quit(2); fprintf(stderr, "**************\n*** PID %5d: ", getpid()); printargs(argc, argv, stderr); putc('\n', stderr); fflush(stderr); } #ifdef NICE nice(NICE); /* lower priority */ #endif /* get octree */ if (i == argc) octname = NULL; else if (i == argc-1) octname = argv[i]; else goto badopt; if (seqstart > 0 && octname == NULL) error(USER, "missing octree argument"); /* set up output */ #ifdef PERSIST if (persist) { if (recover != NULL) error(USER, "persist option used with recover file"); if (seqstart <= 0) error(USER, "persist option only for sequences"); if (outfile == NULL) duped1 = dup(fileno(stdout)); /* don't lose our output */ openheader(); } else #endif if (outfile != NULL) openheader(); #ifdef _WIN32 SET_FILE_BINARY(stdout); if (octname == NULL) SET_FILE_BINARY(stdin); #endif readoct(octname, loadflags, &thescene, NULL); nsceneobjs = nobjects; if (loadflags & IO_INFO) { /* print header */ printargs(i, argv, stdout); printf("SOFTWARE= %s\n", VersionID); } marksources(); /* find and mark sources */ setambient(); /* initialize ambient calculation */ #ifdef PERSIST if (persist) { fflush(stdout); if (outfile == NULL) { /* reconnect stdout */ dup2(duped1, fileno(stdout)); close(duped1); } if (persist == PARALLEL) { /* multiprocessing */ preload_objs(); /* preload scene */ shm_boundary = (char *)malloc(16); strcpy(shm_boundary, "SHM_BOUNDARY"); while ((rval=fork()) == 0) { /* keep on forkin' */ pflock(1); pfhold(); tstart = time((time_t *)NULL); ambsync(); /* load new values */ } if (rval < 0) error(SYSTEM, "cannot fork child for persist function"); pfdetach(); /* parent will run then exit */ } } runagain: if (persist) { if (outfile == NULL) /* if out to stdout */ dupheader(); /* send header */ else /* if out to file */ duped1 = dup(fileno(stdout)); /* hang onto pipe */ } #endif /* batch render picture(s) */ rpict(seqstart, outfile, zfile, recover); /* flush ambient file */ ambsync(); #ifdef PERSIST if (persist == PERSIST) { /* first run-through */ if ((rval=fork()) == 0) { /* child loops until killed */ pflock(1); persist = PCHILD; } else { /* original process exits */ if (rval < 0) error(SYSTEM, "cannot fork child for persist function"); pfdetach(); /* parent exits */ } } if (persist == PCHILD) { /* wait for a signal then go again */ if (outfile != NULL) close(duped1); /* release output handle */ pfhold(); tstart = time((time_t *)NULL); /* reinitialize */ raynum = nrays = 0; goto runagain; } #endif quit(0); badopt: sprintf(errmsg, "command line error at '%s'", argv[i]); error(USER, errmsg); return 1; /* pro forma return */ #undef check #undef bool }
int readoct( /* read in octree file or stream */ char *inpspec, int load, CUBE *scene, char *ofn[] ) { char sbuf[512]; int nf; int i; long m; if (inpspec == NULL) { infn = "standard input"; infp = stdin; } else if (inpspec[0] == '!') { infn = inpspec; if ((infp = popen(inpspec+1, "r")) == NULL) { sprintf(errmsg, "cannot execute \"%s\"", inpspec); error(SYSTEM, errmsg); } } else { infn = inpspec; if ((infp = fopen(inpspec, "r")) == NULL) { sprintf(errmsg, "cannot open octree file \"%s\"", inpspec); error(SYSTEM, errmsg); } } SET_FILE_BINARY(infp); /* get header */ if (checkheader(infp, OCTFMT, load&IO_INFO ? stdout : (FILE *)NULL) < 0) octerror(USER, "not an octree"); /* check format */ if ((objsize = ogetint(2)-OCTMAGIC) <= 0 || objsize > MAXOBJSIZ || objsize > sizeof(long)) octerror(USER, "incompatible octree format"); /* get boundaries */ if (load & IO_BOUNDS) { for (i = 0; i < 3; i++) scene->cuorg[i] = atof(ogetstr(sbuf)); scene->cusize = atof(ogetstr(sbuf)); } else { for (i = 0; i < 4; i++) ogetstr(sbuf); } objorig = nobjects; /* set object offset */ nf = 0; /* get object files */ while (*ogetstr(sbuf)) { if (load & IO_SCENE) readobj(sbuf); if (load & IO_FILES) ofn[nf] = savqstr(sbuf); nf++; } if (load & IO_FILES) ofn[nf] = NULL; /* get number of objects */ fnobjects = m = ogetint(objsize); if (fnobjects != m) octerror(USER, "too many objects"); if (load & IO_TREE) /* get the octree */ scene->cutree = gettree(); else if (load & IO_SCENE && nf == 0) skiptree(); if (load & IO_SCENE) { /* get the scene */ if (nf == 0) { /* load binary scene data */ readscene(infp, objsize); } else { /* consistency checks */ /* check object count */ if (nobjects != objorig+fnobjects) octerror(USER, "bad object count; octree stale?"); /* check for non-surfaces */ if (nonsurfintree(scene->cutree)) octerror(USER, "modifier in tree; octree stale?"); } } /* close the input */ if (infn[0] == '!') pclose(infp); else fclose(infp); return(nf); }
static int transfer( /* transfer a Radiance picture */ char *ospec ) { char oname[PATH_MAX]; FILE *fp; int order; int xmax, ymax; COLR *scanin; int y; /* get header info. */ if (!(y = loadheader(stdin))) return(0); if (y < 0 || (order = fgetresolu(&xmax, &ymax, stdin)) < 0) { fprintf(stderr, "%s: bad input format\n", progname); exit(1); } /* did we pass the target frame? */ if (findframe && findframe < frameno) return(0); /* allocate scanline */ scanin = (COLR *)tempbuffer(xmax*sizeof(COLR)); if (scanin == NULL) { perror(progname); exit(1); } /* skip frame? */ if (findframe > frameno) { for (y = ymax; y--; ) if (freadcolrs(scanin, xmax, stdin) < 0) { fprintf(stderr, "%s: error reading input picture\n", progname); exit(1); } return(1); } /* open output file/command */ if (ospec == NULL) { strcpy(oname, "<stdout>"); fp = stdout; } else { sprintf(oname, ospec, frameno); if (oname[0] == '!') { if ((fp = popen(oname+1, "w")) == NULL) { fprintf(stderr, "%s: cannot start \"%s\"\n", progname, oname); exit(1); } } else { if (!force && access(oname, 0) >= 0) { fprintf(stderr, "%s: output file \"%s\" exists\n", progname, oname); exit(1); } if ((fp = fopen(oname, "w")) == NULL) { fprintf(stderr, "%s: ", progname); perror(oname); exit(1); } } } SET_FILE_BINARY(fp); dumpheader(fp); /* put out header */ fputs(progname, fp); if (bradj) fprintf(fp, " -e %+d", bradj); if (!doflat) fputs(" -r", fp); fputc('\n', fp); if (bradj) fputexpos(pow(2.0, (double)bradj), fp); fputc('\n', fp); fputresolu(order, xmax, ymax, fp); /* transfer picture */ for (y = ymax; y--; ) { if (freadcolrs(scanin, xmax, stdin) < 0) { fprintf(stderr, "%s: error reading input picture\n", progname); exit(1); } if (bradj) shiftcolrs(scanin, xmax, bradj); if (doflat) putbinary((char *)scanin, sizeof(COLR), xmax, fp); else fwritecolrs(scanin, xmax, fp); if (ferror(fp)) { fprintf(stderr, "%s: error writing output to \"%s\"\n", progname, oname); exit(1); } } /* clean up */ if (oname[0] == '!') pclose(fp); else if (ospec != NULL) fclose(fp); return(1); }
int main( int argc, char **argv ) { int i; progname = argv[0]; for (i = 1; i < argc && argv[i][0] == '-'; i++) switch (argv[i][1]) { case 'd': /* debug output */ i++; if (badarg(argc-i, argv+i, "s")) goto userr; if ((debugfp = fopen(argv[i], "w")) == NULL) { perror(argv[i]); exit(1); } SET_FILE_BINARY(debugfp); newheader("RADIANCE", debugfp); /* start */ printargs(argc, argv, debugfp); /* header */ break; case 'p': /* picture position */ if (badarg(argc-i-1, argv+i+1, "iiiiiiii")) goto userr; bounds[0][0] = atoi(argv[++i]); bounds[0][1] = atoi(argv[++i]); bounds[1][0] = atoi(argv[++i]); bounds[1][1] = atoi(argv[++i]); bounds[2][0] = atoi(argv[++i]); bounds[2][1] = atoi(argv[++i]); bounds[3][0] = atoi(argv[++i]); bounds[3][1] = atoi(argv[++i]); scanning = 2; break; case 'P': /* pick position */ scanning = 3; break; case 'i': /* irradiance factor */ i++; if (badarg(argc-i, argv+i, "f")) goto userr; irrad = atof(argv[i]); break; case 'm': /* raw map output */ rawmap = 1; break; case 'c': /* color input */ scanning = 0; break; default: goto userr; } /* open files */ if (i < argc && freopen(argv[i], "r", stdin) == NULL) { perror(argv[i]); exit(1); } if (i+1 < argc && freopen(argv[i+1], "w", stdout) == NULL) { perror(argv[i+1]); exit(1); } if (scanning) { /* load input picture header */ SET_FILE_BINARY(stdin); if (checkheader(stdin, COLRFMT, NULL) < 0 || fgetresolu(&xmax, &ymax, stdin) < 0) { fprintf(stderr, "%s: bad input picture\n", progname); exit(1); } if (scanning == 3) { if (i >= argc) goto userr; pickchartpos(argv[i]); scanning = 2; } } else { /* else set default xmax and ymax */ xmax = 512; ymax = 2*512/3; } if (scanning != 2) { /* use default boundaries */ bounds[0][0] = bounds[2][0] = .029*xmax + .5; bounds[0][1] = bounds[1][1] = .956*ymax + .5; bounds[1][0] = bounds[3][0] = .971*xmax + .5; bounds[2][1] = bounds[3][1] = .056*ymax + .5; } init(); /* initialize */ if (scanning) /* get picture colors */ getpicture(); else getcolors(); compute(); /* compute color mapping */ if (rawmap) { /* print out raw correspondence */ register int j; printf("# Color correspondence produced by:\n#\t\t"); printargs(argc, argv, stdout); printf("#\tUsage: pcwarp %s uncorrected.hdr > corrected.hdr\n", i+1 < argc ? argv[i+1] : "{this_file}"); printf("#\t Or: pcond [options] -m %s orig.hdr > output.hdr\n", i+1 < argc ? argv[i+1] : "{this_file}"); for (j = 0; j < 24; j++) printf("%f %f %f %f %f %f\n", colval(inpRGB[j],RED), colval(inpRGB[j],GRN), colval(inpRGB[j],BLU), colval(mbRGB[j],RED), colval(mbRGB[j],GRN), colval(mbRGB[j],BLU)); if (scanning && debugfp != NULL) cwarp(); /* color warp for debugging */ } else { /* print color mapping */ /* print header */ printf("{\n\tColor correction file computed by:\n\t\t"); printargs(argc, argv, stdout); printf("\n\tUsage: pcomb -f %s uncorrected.hdr > corrected.hdr\n", i+1 < argc ? argv[i+1] : "{this_file}"); if (!scanning) printf("\t Or: pcond [options] -f %s orig.hdr > output.hdr\n", i+1 < argc ? argv[i+1] : "{this_file}"); printf("}\n"); putmapping(); /* put out color mapping */ } if (debugfp != NULL) { /* put out debug picture */ if (scanning) picdebug(); else clrdebug(); } exit(0); userr: fprintf(stderr, "Usage: %s [-d dbg.hdr][-P | -p xul yul xur yur xll yll xlr ylr][-i irrad][-m] input.hdr [output.{cal|cwp}]\n", progname); fprintf(stderr, " or: %s [-d dbg.hdr][-i irrad][-m] -c [xyY.dat [output.{cal|cwp}]]\n", progname); exit(1); return 1; /* pro forma return */ }
int main( int argc, char *argv[] ) { static RGBPRIMS outprimS; int i; #define bool(flg) switch (argv[i][2]) { \ case '\0': what2do ^= flg; break; \ case 'y': case 'Y': case 't': case 'T': \ case '+': case '1': what2do |= flg; break; \ case 'n': case 'N': case 'f': case 'F': \ case '-': case '0': what2do &= ~(flg); break; \ default: goto userr; } progname = argv[0]; for (i = 1; i < argc && argv[i][0] == '-'; i++) switch (argv[i][1]) { case 'h': bool(DO_HUMAN); break; case 'a': bool(DO_ACUITY); break; case 'v': bool(DO_VEIL); break; case 's': bool(DO_HSENS); break; case 'c': bool(DO_COLOR); break; case 'w': bool(DO_CWEIGHT); break; case 'i': if (i+1 >= argc) goto userr; fixfrac = atof(argv[++i]); if (fixfrac > FTINY) what2do |= DO_FIXHIST; else what2do &= ~DO_FIXHIST; break; case 'I': bool(DO_PREHIST); break; case 'l': bool(DO_LINEAR); break; case 'p': if (i+8 >= argc) goto userr; outprimS[RED][CIEX] = atof(argv[++i]); outprimS[RED][CIEY] = atof(argv[++i]); outprimS[GRN][CIEX] = atof(argv[++i]); outprimS[GRN][CIEY] = atof(argv[++i]); outprimS[BLU][CIEX] = atof(argv[++i]); outprimS[BLU][CIEY] = atof(argv[++i]); outprimS[WHT][CIEX] = atof(argv[++i]); outprimS[WHT][CIEY] = atof(argv[++i]); outprims = outprimS; break; case 'e': if (i+1 >= argc) goto userr; scalef = atof(argv[++i]); if ((argv[i][0] == '+') | (argv[i][0] == '-')) scalef = pow(2.0, scalef); what2do |= DO_LINEAR; break; case 'f': if (i+1 >= argc) goto userr; mbcalfile = argv[++i]; break; case 'm': if (i+1 >= argc) goto userr; cwarpfile = argv[++i]; break; case 'u': if (i+1 >= argc) goto userr; ldmax = atof(argv[++i]); if (ldmax <= FTINY) goto userr; break; case 'd': if (i+1 >= argc) goto userr; lddyn = atof(argv[++i]); break; case 'x': if (i+1 >= argc) goto userr; if ((mapfp = fopen(argv[++i], "w")) == NULL) { fprintf(stderr, "%s: cannot open for writing\n", argv[i]); exit(1); } break; default: goto userr; } if ((what2do & (DO_FIXHIST|DO_PREHIST)) == (DO_FIXHIST|DO_PREHIST)) { fprintf(stderr, "%s: only one of -i or -I option\n", progname); exit(1); } if ((mbcalfile != NULL) + (cwarpfile != NULL) + (outprims != stdprims) > 1) { fprintf(stderr, "%s: only one of -p, -m or -f option supported\n", progname); exit(1); } if ((outprims == stdprims) & (inprims != stdprims)) outprims = inprims; Bldmin = Bl(ldmax/lddyn); Bldmax = Bl(ldmax); if (i >= argc || i+2 < argc) goto userr; /* open input file */ if ((infp = fopen(infn=argv[i], "r")) == NULL) syserror(infn); /* open output file */ if (i+2 == argc && freopen(argv[i+1], "w", stdout) == NULL) syserror(argv[i+1]); SET_FILE_BINARY(infp); SET_FILE_BINARY(stdout); getahead(); /* load input header */ printargs(argc, argv, stdout); /* add to output header */ if ((mbcalfile == NULL) & (outprims != stdprims)) fputprims(outprims, stdout); if ((what2do & (DO_PREHIST|DO_VEIL|DO_ACUITY)) != DO_PREHIST) getfovimg(); /* get foveal sample image? */ if (what2do&DO_PREHIST) /* get histogram? */ gethisto(stdin); else if (what2do&DO_FIXHIST) /* get fixation history? */ getfixations(stdin); mapimage(); /* map the picture */ if (mapfp != NULL) /* write out basic mapping */ putmapping(mapfp); exit(0); userr: fprintf(stderr, "Usage: %s [-{h|a|v|s|c|l|w}[+-]][-I|-i ffrac][-e ev][-p xr yr xg yg xb yb xw yw|-f mbf.cal|-m rgb.cwp][-u Ldmax][-d Lddyn][-x mapfile] inpic [outpic]\n", progname); exit(1); return 1; /* pro forma return */ #undef bool }
static int execute( /* compute result */ char *fname ) { double inpval[MAXCOL]; double tally[MAXCOL]; short rsign[MAXCOL]; double result[MAXCOL]; int n; int nread, ncol; long nlin, ltotal; FILE *fp; /* open file */ if (fname == NULL) fp = stdin; else if ((fp = fopen(fname, "r")) == NULL) { fprintf(stderr, "%s: cannot open\n", fname); return(-1); } if (nbicols) SET_FILE_BINARY(fp); #ifdef getc_unlocked /* avoid lock/unlock overhead */ flockfile(fp); #endif ltotal = 0; while (!feof(fp)) { if (ltotal == 0) { /* initialize */ if (func == MULT) /* special case */ for (n = 0; n < MAXCOL; n++) { tally[n] = 0.0; rsign[n] = 1; } else for (n = 0; n < MAXCOL; n++) tally[n] = init_val[func]; } ncol = 0; for (nlin = 0; (count <= 0 || nlin < count) && (nread = getrecord(inpval, fp)) > 0; nlin++) { /* compute */ for (n = 0; n < nread; n++) switch (func) { case ADD: if (inpval[n] == 0.0) break; if (power != 0.0) tally[n] += pow(fabs(inpval[n]),power); else tally[n] += inpval[n]; break; case MULT: if (inpval[n] == 0.0) rsign[n] = 0; else if (inpval[n] < 0.0) { rsign[n] = -rsign[n]; inpval[n] = -inpval[n]; } if (rsign[n]) tally[n] += log(inpval[n]); break; case MAX: if (inpval[n] > tally[n]) tally[n] = inpval[n]; break; case MIN: if (inpval[n] < tally[n]) tally[n] = inpval[n]; break; } if (nread > ncol) ncol = nread; } if (nlin == 0) break; /* compute and print */ ltotal += nlin; for (n = 0; n < ncol; n++) { result[n] = tally[n]; if (mean) { result[n] /= (double)ltotal; if (func == ADD && power != 0.0 && result[n] != 0.0) result[n] = pow(result[n], 1.0/power); } if (func == MULT) result[n] = rsign[n] * exp(result[n]); } putrecord(result, ncol, stdout); if (!subtotal) ltotal = 0; } /* close input */ return(fclose(fp)); }
int main( int argc, char *argv[] ) { int status; int a; for (a = 1; a < argc; a++) if (argv[a][0] == '-') if (argv[a][1] >= '0' && argv[a][1] <= '9') count = atoi(argv[a]+1); else switch (argv[a][1]) { case 'm': mean = !mean; break; case 'p': func = MULT; break; case 's': func = ADD; power = atof(argv[a]+2); break; case 'u': func = MAX; break; case 'l': func = MIN; break; case 't': tabc = argv[a][2]; break; case 'r': subtotal = !subtotal; break; case 'i': switch (argv[a][2]) { case 'a': nbicols = 0; break; case 'd': if (isdigit(argv[a][3])) nbicols = atoi(argv[a]+3); else nbicols = 1; if (nbicols > MAXCOL) { fprintf(stderr, "%s: too many input columns\n", argv[0]); exit(1); } break; case 'f': if (isdigit(argv[a][3])) nbicols = -atoi(argv[a]+3); else nbicols = -1; if (-nbicols > MAXCOL) { fprintf(stderr, "%s: too many input columns\n", argv[0]); exit(1); } break; default: goto userr; } break; case 'o': switch (argv[a][2]) { case 'a': bocols = 0; break; case 'd': bocols = 1; break; case 'f': bocols = -1; break; default: goto userr; } break; default:; userr: fprintf(stderr, "Usage: %s [-m][-sE|p|u|l][-tC][-i{f|d}[N]][-o{f|d}][-count [-r]] [file..]\n", argv[0]); exit(1); } else break; if (mean) { if (func == MAX) { fprintf(stderr, "%s: average maximum?!\n", argv[0]); exit(1); } if (func == MIN) { fprintf(stderr, "%s: average minimum?!\n", argv[0]); exit(1); } } if (bocols) SET_FILE_BINARY(stdout); status = 0; if (a >= argc) status = execute(NULL) == -1 ? 1 : status; else for ( ; a < argc; a++) status = execute(argv[a]) == -1 ? 2 : status; exit(status); }
int main( /* compile a .OBJ file into a mesh */ int argc, char *argv[] ) { int nmatf = 0; char pathnames[12800]; char *pns = pathnames; char *matinp[128]; char *cp; int i, j; progname = argv[0]; ofun[OBJ_FACE].funp = o_face; for (i = 1; i < argc && argv[i][0] == '-'; i++) switch (argv[i][1]) { case 'n': /* set limit */ objlim = atoi(argv[++i]); break; case 'r': /* resolution limit */ resolu = atoi(argv[++i]); break; case 'a': /* material file */ matinp[nmatf++] = argv[++i]; break; case 'l': /* library material */ cp = getpath(argv[++i], getrlibpath(), R_OK); if (cp == NULL) { sprintf(errmsg, "cannot find library material: '%s'", argv[i]); error(USER, errmsg); } matinp[nmatf++] = strcpy(pns, cp); while (*pns++) ; break; case 'w': /* supress warnings */ nowarn = 1; break; default: sprintf(errmsg, "unknown option: '%s'", argv[i]); error(USER, errmsg); break; } if (i < argc-2) error(USER, "too many file arguments"); /* initialize mesh */ cvinit(i==argc-2 ? argv[i+1] : "<stdout>"); /* load material input */ for (j = 0; j < nmatf; j++) readobj(matinp[j]); /* read .OBJ file into triangles */ if (i == argc) wfreadobj(NULL); else wfreadobj(argv[i]); cvmeshbounds(); /* set octree boundaries */ if (i == argc-2) /* open output file */ if (freopen(argv[i+1], "w", stdout) == NULL) error(SYSTEM, "cannot open output file"); SET_FILE_BINARY(stdout); newheader("RADIANCE", stdout); /* new binary file header */ printargs(i<argc ? i+1 : argc, argv, stdout); fputformat(MESHFMT, stdout); fputc('\n', stdout); mincusize = ourmesh->mcube.cusize / resolu - FTINY; for (i = 0; i < nobjects; i++) /* add triangles to octree */ if (objptr(i)->otype == OBJ_FACE) addface(&ourmesh->mcube, i); /* optimize octree */ ourmesh->mcube.cutree = combine(ourmesh->mcube.cutree); if (ourmesh->mcube.cutree == EMPTY) error(WARNING, "mesh is empty"); cvmesh(); /* convert mesh and leaf nodes */ writemesh(ourmesh, stdout); /* write mesh to output */ /* printmeshstats(ourmesh, stderr); */ quit(0); return 0; /* pro forma return */ }
int main( int argc, char *argv[] ) { struct hdStruct head; int dither = 1; int reverse = 0; int ncolors = 256; int greyscale = 0; int i; SET_DEFAULT_BINARY(); SET_FILE_BINARY(stdin); SET_FILE_BINARY(stdout); progname = argv[0]; samplefac = 0; for (i = 1; i < argc; i++) if (argv[i][0] == '-') switch (argv[i][1]) { case 'd': dither = !dither; break; case 'g': gamv = atof(argv[++i]); break; case 'r': reverse = !reverse; break; case 'b': greyscale = 1; break; case 'e': if (argv[i+1][0] != '+' && argv[i+1][0] != '-') goto userr; bradj = atoi(argv[++i]); break; case 'c': ncolors = atoi(argv[++i]); break; case 'n': samplefac = atoi(argv[++i]); break; default: goto userr; } else break; if (i < argc-2) goto userr; if (i <= argc-1 && freopen(argv[i], "r", stdin) == NULL) { sprintf(errmsg, "cannot open input \"%s\"", argv[i]); quiterr(errmsg); } if (i == argc-2 && freopen(argv[i+1], "w", stdout) == NULL) { sprintf(errmsg, "cannot open output \"%s\"", argv[i+1]); quiterr(errmsg); } if (reverse) { /* get header */ if (getthead(&head, NULL, stdin) < 0) quiterr("bad targa file"); if (!goodpic(&head)) quiterr("incompatible format"); xmax = head.x; ymax = head.y; /* put header */ newheader("RADIANCE", stdout); printargs(i, argv, stdout); fputformat(COLRFMT, stdout); putchar('\n'); fprtresolu(xmax, ymax, stdout); /* convert file */ tg2ra(&head); } else { if (getrhead(&head, stdin) < 0) quiterr("bad Radiance input"); /* write header */ putthead(&head, NULL, stdout); /* convert file */ if (greyscale) getgrey(ncolors); else getmapped(ncolors, dither); /* write data */ writetarga(&head, tarData, stdout); } quiterr(NULL); userr: fprintf(stderr, "Usage: %s [-d][-n samp][-c ncolors][-b][-g gamv][-e +/-stops] input [output]\n", progname); fprintf(stderr, " Or: %s -r [-g gamv][-e +/-stops] [input [output]]\n", progname); exit(1); }
int main( int argc, char **argv ) { double d, expval = 1.0; int i; progname = argv[0]; mybright = &rgb_bright; /* default */ for (i = 1; i < argc; i++) if (argv[i][0] == '-' || argv[i][0] == '+') switch (argv[i][1]) { case 'h': /* header */ header = argv[i][0] == '+'; break; case 'H': /* resolution string */ resolution = argv[i][0] == '+'; break; case 's': /* skip bytes in header */ skipbytes = atol(argv[++i]); break; case 'u': /* unique values */ uniq = argv[i][0] == '-'; break; case 'o': /* original values */ original = argv[i][0] == '-'; break; case 'g': /* gamma correction */ gamcor = atof(argv[i+1]); if (argv[i][0] == '+') gamcor = 1.0/gamcor; i++; break; case 'e': /* exposure correction */ d = atof(argv[i+1]); if (argv[i+1][0] == '-' || argv[i+1][0] == '+') d = pow(2.0, d); if (argv[i][0] == '-') expval *= d; scalecolor(exposure, d); doexposure++; i++; break; case 'R': /* reverse byte sequence */ if (argv[i][0] == '-') { ord[0]=BLU; ord[1]=GRN; ord[2]=RED; } else { ord[0]=RED; ord[1]=GRN; ord[2]=BLU; } break; case 'r': /* reverse conversion */ reverse = argv[i][0] == '-'; break; case 'n': /* non-interleaved RGB */ interleave = argv[i][0] == '+'; break; case 'b': /* brightness values */ putprim = argv[i][0] == '-' ? BRIGHT : ALL; break; case 'p': /* primary controls */ switch (argv[i][2]) { /* these two options affect -r conversion */ case '\0': myprims[RED][CIEX] = atof(argv[++i]); myprims[RED][CIEY] = atof(argv[++i]); myprims[GRN][CIEX] = atof(argv[++i]); myprims[GRN][CIEY] = atof(argv[++i]); myprims[BLU][CIEX] = atof(argv[++i]); myprims[BLU][CIEY] = atof(argv[++i]); myprims[WHT][CIEX] = atof(argv[++i]); myprims[WHT][CIEY] = atof(argv[++i]); outprims = myprims; break; case 'x': case 'X': outprims = NULL; break; /* the following options affect +r only */ case 'r': case 'R': putprim = RED; break; case 'g': case 'G': putprim = GRN; break; case 'b': case 'B': putprim = BLU; break; default: goto unkopt; } break; case 'd': /* data only (no indices) */ dataonly = argv[i][0] == '-'; switch (argv[i][2]) { case '\0': case 'a': /* ascii */ format = 'a'; fmtid = "ascii"; break; case 'i': /* integer */ format = 'i'; fmtid = "ascii"; break; case 'b': /* byte */ dataonly = 1; format = 'b'; fmtid = "byte"; break; case 'W': /* 16-bit swapped */ swapbytes = 1; case 'w': /* 16-bit */ dataonly = 1; format = 'w'; fmtid = "16-bit"; break; case 'F': /* swapped floats */ swapbytes = 1; case 'f': /* float */ dataonly = 1; format = 'f'; fmtid = "float"; break; case 'D': /* swapped doubles */ swapbytes = 1; case 'd': /* double */ dataonly = 1; format = 'd'; fmtid = "double"; break; default: goto unkopt; } break; case 'x': /* x resolution */ case 'X': /* x resolution */ resolution = 0; if (argv[i][0] == '-') picres.rt |= XDECR; picres.xr = atoi(argv[++i]); break; case 'y': /* y resolution */ case 'Y': /* y resolution */ resolution = 0; if (argv[i][0] == '-') picres.rt |= YDECR; if (picres.xr == 0) picres.rt |= YMAJOR; picres.yr = atoi(argv[++i]); break; default: unkopt: fprintf(stderr, "%s: unknown option: %s\n", progname, argv[i]); quit(1); break; } else break; /* recognize special formats */ if (dataonly && format == 'b') { if (putprim == ALL) fmtid = "24-bit_rgb"; else fmtid = "8-bit_grey"; } if (dataonly && format == 'w') { if (putprim == ALL) fmtid = "48-bit_rgb"; else fmtid = "16-bit_grey"; } /* assign reverse ordering */ rord[ord[0]] = 0; rord[ord[1]] = 1; rord[ord[2]] = 2; /* get input */ if (i == argc) { fin = stdin; } else if (i < argc) { if ((fin = fopen(argv[i], "r")) == NULL) { fprintf(stderr, "%s: can't open file \"%s\"\n", progname, argv[i]); quit(1); } if (reverse && putprim != BRIGHT && i == argc-3) { if ((fin2 = fopen(argv[i+1], "r")) == NULL) { fprintf(stderr, "%s: can't open file \"%s\"\n", progname, argv[i+1]); quit(1); } if ((fin3 = fopen(argv[i+2], "r")) == NULL) { fprintf(stderr, "%s: can't open file \"%s\"\n", progname, argv[i+2]); quit(1); } interleave = -1; } else if (i != argc-1) fin = NULL; if (reverse && putprim != BRIGHT && !interleave) { fin2 = fopen(argv[i], "r"); fin3 = fopen(argv[i], "r"); } if (skipbytes && (fseek(fin, skipbytes, 0) || (fin2 != NULL && (fseek(fin2, skipbytes, 0) || fseek(fin3, skipbytes, 0))))) { fprintf(stderr, "%s: cannot skip %ld bytes on input\n", progname, skipbytes); quit(1); } } if (fin == NULL) { fprintf(stderr, "%s: bad # file arguments\n", progname); quit(1); } if (reverse) { #ifdef _WIN32 SET_FILE_BINARY(stdout); if (format != 'a' && format != 'i') SET_FILE_BINARY(fin); #endif /* get header */ if (header) { if (checkheader(fin, fmtid, stdout) < 0) { fprintf(stderr, "%s: wrong input format\n", progname); quit(1); } if (fin2 != NULL) { getheader(fin2, NULL, NULL); getheader(fin3, NULL, NULL); } } else newheader("RADIANCE", stdout); /* get resolution */ if ((resolution && !fgetsresolu(&picres, fin)) || picres.xr <= 0 || picres.yr <= 0) { fprintf(stderr, "%s: missing resolution\n", progname); quit(1); } if (resolution && fin2 != NULL) { RESOLU pres2; if (!fgetsresolu(&pres2, fin2) || pres2.rt != picres.rt || pres2.xr != picres.xr || pres2.yr != picres.yr || !fgetsresolu(&pres2, fin3) || pres2.rt != picres.rt || pres2.xr != picres.xr || pres2.yr != picres.yr) { fprintf(stderr, "%s: resolution mismatch\n", progname); quit(1); } } /* add to header */ printargs(i, argv, stdout); if (expval < .99 || expval > 1.01) fputexpos(expval, stdout); if (outprims != NULL) { if (outprims != stdprims) fputprims(outprims, stdout); fputformat(COLRFMT, stdout); } else /* XYZ data */ fputformat(CIEFMT, stdout); putchar('\n'); fputsresolu(&picres, stdout); /* always put resolution */ valtopix(); } else { #ifdef _WIN32 SET_FILE_BINARY(fin); if (format != 'a' && format != 'i') SET_FILE_BINARY(stdout); #endif /* get header */ getheader(fin, checkhead, NULL); if (wrongformat) { fprintf(stderr, "%s: input not a Radiance RGBE picture\n", progname); quit(1); } if (!fgetsresolu(&picres, fin)) { fprintf(stderr, "%s: missing resolution\n", progname); quit(1); } if (header) { printargs(i, argv, stdout); if (expval < .99 || expval > 1.01) fputexpos(expval, stdout); fputformat(fmtid, stdout); putchar('\n'); } if (resolution) /* put resolution */ fputsresolu(&picres, stdout); pixtoval(); } quit(0); return 0; /* pro forma return */ }
int main(int argc, char *argv[]) { int i; double d; progname = argv[0]; for (i = 1; i < argc; i++) if (argv[i][0] == '-') switch (argv[i][1]) { case 'b': /* produce b&w PostScript */ docolor = 0; break; case 'c': /* produce color PostScript */ docolor = 1; break; case 'A': /* standard ASCII encoding */ putprim = Aputprim; break; case 'B': /* standard binary encoding */ putprim = Bputprim; break; case 'C': /* compressed ASCII encoding */ putprim = Cputprim; break; case 'd': /* print density */ dpi = atof(argv[++i]); break; case 'g': /* device gamma adjustment */ devgam = atof(argv[++i]); break; case 'p': /* paper size */ parsepaper(argv[++i]); break; case 'm': /* margin */ d = atof(argv[i+1]); d *= unit2inch(argv[i+1]); switch (argv[i][2]) { case '\0': hmarg = vmarg = d; break; case 'h': hmarg = d; break; case 'v': vmarg = d; break; default: goto userr; } i++; break; case 'e': /* exposure adjustment */ if (argv[i+1][0] != '+' && argv[i+1][0] != '-') goto userr; bradj = atoi(argv[++i]); break; case 'n': /* number of copies */ ncopies = atoi(argv[++i]); break; default: goto userr; } else break; if (i < argc-2) goto userr; if (i <= argc-1 && freopen(argv[i], "r", stdin) == NULL) { fprintf(stderr, "%s: can't open input \"%s\"\n", progname, argv[i]); exit(1); } if (i == argc-2 && freopen(argv[i+1], "w", stdout) == NULL) { fprintf(stderr, "%s: can't open output \"%s\"\n", progname, argv[i+1]); exit(1); } SET_FILE_BINARY(stdin); /* get our header */ getheader(stdin, headline, NULL); if (wrongformat || fgetresolu(&xmax, &ymax, stdin) < 0) quiterr("bad picture format"); /* gamma compression */ if (devgam <= 0.05) devgam = docolor ? DEFCGAM : DEFGGAM; if (putprim == Cputprim) setcolrgam(CODE6GAM); else if (devgam != 1.) setcolrgam(devgam); /* write header */ PSheader(argc, argv); /* convert file */ ra2ps(); /* write trailer */ PStrailer(); exit(0); userr: fprintf(stderr, "Usage: %s [-b|c][-A|B|C][-e +/-stops][-p paper][-m[h|v] margin][-d dpi][-g gamma] [input [output]]\n", progname); exit(1); }
/* Read in BSDF and interpolate as Klems matrix representation */ int main(int argc, char *argv[]) { int dofwd = 0, dobwd = 1; char buf[2048]; char *cp; int i, na; progname = argv[0]; esupport |= E_VARIABLE|E_FUNCTION|E_RCONST; esupport &= ~(E_INCHAN|E_OUTCHAN); scompile("PI:3.14159265358979323846", NULL, 0); biggerlib(); for (i = 1; i < argc && (argv[i][0] == '-') | (argv[i][0] == '+'); i++) switch (argv[i][1]) { /* get options */ case 'n': npsamps = atoi(argv[++i]); if (npsamps <= 0) goto userr; break; case 'e': scompile(argv[++i], NULL, 0); single_plane_incident = 0; break; case 'f': if (!argv[i][2]) { if (strchr(argv[++i], '=') != NULL) { add_wbsdf("-f", 1); add_wbsdf(argv[i], 1); } else { char *fpath = getpath(argv[i], getrlibpath(), 0); if (fpath == NULL) { fprintf(stderr, "%s: cannot find file '%s'\n", argv[0], argv[i]); return(1); } fcompile(fpath); single_plane_incident = 0; } } else dofwd = (argv[i][0] == '+'); break; case 'b': dobwd = (argv[i][0] == '+'); break; case 'h': kbasis = klems_half; add_wbsdf("-a", 1); add_wbsdf("kh", 1); break; case 'q': kbasis = klems_quarter; add_wbsdf("-a", 1); add_wbsdf("kq", 1); break; case 'l': lobe_lim = atoi(argv[++i]); break; case 'p': do_prog = atoi(argv[i]+2); break; case 'C': add_wbsdf(argv[i], 1); add_wbsdf(argv[++i], 1); break; default: goto userr; } if (kbasis == klems_full) { /* default (full) basis? */ add_wbsdf("-a", 1); add_wbsdf("kf", 1); } strcpy(buf, "File produced by: "); if (convert_commandline(buf+18, sizeof(buf)-18, argv) != NULL) { add_wbsdf("-C", 1); add_wbsdf(buf, 0); } if (single_plane_incident >= 0) { /* function-based BSDF? */ if (i != argc-1 || fundefined(argv[i]) < 3) { fprintf(stderr, "%s: need single function with 6 arguments: bsdf(ix,iy,iz,ox,oy,oz)\n", progname); fprintf(stderr, "\tor 3 arguments using Dx,Dy,Dz: bsdf(ix,iy,iz)\n"); goto userr; } ++eclock; if (dofwd) { input_orient = -1; output_orient = -1; prog_start("Evaluating outside reflectance"); eval_function(argv[i]); output_orient = 1; prog_start("Evaluating outside->inside transmission"); eval_function(argv[i]); } if (dobwd) { input_orient = 1; output_orient = 1; prog_start("Evaluating inside reflectance"); eval_function(argv[i]); output_orient = -1; prog_start("Evaluating inside->outside transmission"); eval_function(argv[i]); } return(wrap_up()); } /* XML input? */ if (i == argc-1 && (cp = argv[i]+strlen(argv[i])-4) > argv[i] && !strcasecmp(cp, ".xml")) { eval_bsdf(argv[i]); /* load & resample BSDF */ return(wrap_up()); } if (i < argc) { /* open input files if given */ int nbsdf = 0; for ( ; i < argc; i++) { /* interpolate each component */ char pbuf[256]; FILE *fpin = fopen(argv[i], "rb"); if (fpin == NULL) { fprintf(stderr, "%s: cannot open BSDF interpolant '%s'\n", progname, argv[i]); return(1); } if (!load_bsdf_rep(fpin)) return(1); fclose(fpin); sprintf(pbuf, "Interpolating component '%s'", argv[i]); prog_start(pbuf); eval_rbf(); } return(wrap_up()); } SET_FILE_BINARY(stdin); /* load from stdin */ if (!load_bsdf_rep(stdin)) return(1); prog_start("Interpolating from standard input"); eval_rbf(); /* resample dist. */ return(wrap_up()); userr: fprintf(stderr, "Usage: %s [-n spp][-h|-q][-l maxlobes] [bsdf.sir ..] > bsdf.xml\n", progname); fprintf(stderr, " or: %s [-n spp][-h|-q] bsdf_in.xml > bsdf_out.xml\n", progname); fprintf(stderr, " or: %s [-n spp][-h|-q][{+|-}for[ward]][{+|-}b[ackward]][-e expr][-f file] bsdf_func > bsdf.xml\n", progname); return(1); }
int main( int argc, char *argv[] ) { char inpbuf[2]; int gryflag = 0; int binflag = 1; int reverse = 0; int ptype; int i; progname = argv[0]; for (i = 1; i < argc; i++) if (argv[i][0] == '-') switch (argv[i][1]) { case 's': maxval = atoi(argv[++i]) & 0xffff; break; case 'b': gryflag = 1; break; case 'g': gamcor = atof(argv[++i]); break; case 'e': if (argv[i+1][0] != '+' && argv[i+1][0] != '-') goto userr; bradj = atoi(argv[++i]); break; case 'a': binflag = 0; break; case 'r': reverse = !reverse; break; default: goto userr; } else break; if (i < argc-2) goto userr; if (i <= argc-1 && freopen(argv[i], "r", stdin) == NULL) { fprintf(stderr, "%s: can't open input \"%s\"\n", progname, argv[i]); exit(1); } if (i == argc-2 && freopen(argv[i+1], "w", stdout) == NULL) { fprintf(stderr, "%s: can't open output \"%s\"\n", progname, argv[i+1]); exit(1); } if (maxval < 256) setcolrgam(gamcor); if (reverse) { /* get header */ if (read(fileno(stdin), inpbuf, 2) != 2 || inpbuf[0] != 'P') quiterr("input not a Poskanzer Pixmap"); ptype = inpbuf[1]; #ifdef _WIN32 if (ptype > 4) SET_FILE_BINARY(stdin); SET_FILE_BINARY(stdout); #endif xmax = scanint(stdin); ymax = scanint(stdin); maxval = scanint(stdin); /* put header */ newheader("RADIANCE", stdout); printargs(i, argv, stdout); fputformat(COLRFMT, stdout); putchar('\n'); fprtresolu(xmax, ymax, stdout); /* convert file */ if (maxval >= 256) switch (ptype) { case '2': ppm2ra2(agryscan2); break; case '5': ppm2ra2(bgryscan2); break; case '3': ppm2ra2(aclrscan2); break; case '6': ppm2ra2(bclrscan2); break; default: quiterr("unsupported Pixmap type"); } else switch (ptype) { case '2': ppm2ra(agryscan); break; case '5': ppm2ra(bgryscan); break; case '3': ppm2ra(aclrscan); break; case '6': ppm2ra(bclrscan); break; default: quiterr("unsupported Pixmap type"); } } else { #ifdef _WIN32 SET_FILE_BINARY(stdin); if (binflag) SET_FILE_BINARY(stdout); #endif /* get header info. */ if (checkheader(stdin, COLRFMT, NULL) < 0 || fgetresolu(&xmax, &ymax, stdin) < 0) quiterr("bad picture format"); /* write PPM header */ printf("P%1d\n%d %d\n%u\n", (gryflag?2:3)+(binflag?3:0), xmax, ymax, maxval); /* convert file */ if (maxval >= 256) ra2ppm2(binflag, gryflag); else ra2ppm(binflag, gryflag); } exit(0); userr: fprintf(stderr, "Usage: %s [-r][-a][-b][-s maxv][-g gamma][-e +/-stops] [input [output]]\n", progname); exit(1); }
int main( int argc, char **argv ) { int dim = 0; FILE *fp; int i; if (argc > 1 && !strcmp(argv[1], "-d")) { argc--; argv++; dim = 1; SET_FILE_BINARY(stdin); } else if (argc > 2 && !strcmp(argv[1], "-c")) { SET_FILE_BINARY(stdin); SET_FILE_BINARY(stdout); setvbuf(stdin, NULL, _IONBF, 2); getheader(stdin, (gethfunc *)fputs, stdout); printargs(argc-2, argv+2, stdout); fputc('\n', stdout); fflush(stdout); execvp(argv[2], argv+2); perror(argv[2]); return 1; } else if (argc > 2 && !strcmp(argv[1], "-a")) { SET_FILE_BINARY(stdin); SET_FILE_BINARY(stdout); getheader(stdin, (gethfunc *)fputs, stdout); for (i = 2; i < argc; i++) { int len = strlen(argv[i]); if (!len) continue; fputs(argv[i], stdout); if (argv[i][len-1] != '\n') fputc('\n', stdout); } fputc('\n', stdout); copycat(); return 0; } else if (argc == 2 && !strcmp(argv[1], "-")) { SET_FILE_BINARY(stdin); SET_FILE_BINARY(stdout); getheader(stdin, NULL, NULL); copycat(); return 0; } for (i = 1; i < argc; i++) { fputs(argv[i], stdout); if ((fp = fopen(argv[i], "r")) == NULL) fputs(": cannot open\n", stdout); else { if (dim) { fputs(": ", stdout); getdim(fp); } else { tabstr(":\n", NULL); getheader(fp, tabstr, NULL); fputc('\n', stdout); } fclose(fp); } } if (argc == 1) { if (dim) { getdim(stdin); } else { getheader(stdin, (gethfunc *)fputs, stdout); fputc('\n', stdout); } } return 0; }
/* Read in BSDF and interpolate as Klems matrix representation */ int main(int argc, char *argv[]) { int dofwd = 0, dobwd = 1; char *cp; int i, na; progname = argv[0]; esupport |= E_VARIABLE|E_FUNCTION|E_RCONST; esupport &= ~(E_INCHAN|E_OUTCHAN); scompile("PI:3.14159265358979323846", NULL, 0); biggerlib(); for (i = 1; i < argc && (argv[i][0] == '-') | (argv[i][0] == '+'); i++) switch (argv[i][1]) { /* get options */ case 'n': npsamps = atoi(argv[++i]); if (npsamps <= 0) goto userr; break; case 'e': scompile(argv[++i], NULL, 0); single_plane_incident = 0; break; case 'f': if (!argv[i][2]) { fcompile(argv[++i]); single_plane_incident = 0; } else dofwd = (argv[i][0] == '+'); break; case 'b': dobwd = (argv[i][0] == '+'); break; case 'h': kbasis = "LBNL/Klems Half"; break; case 'q': kbasis = "LBNL/Klems Quarter"; break; default: goto userr; } if (single_plane_incident >= 0) { /* function-based BSDF? */ if (i != argc-1 || fundefined(argv[i]) != 6) { fprintf(stderr, "%s: need single function with 6 arguments: bsdf(ix,iy,iz,ox,oy,oz)\n", progname); fprintf(stderr, "\tor 3 arguments using Dx,Dy,Dz: bsdf(ix,iy,iz)\n", progname); goto userr; } ++eclock; xml_header(argc, argv); /* start XML output */ xml_prologue(NULL); if (dofwd) { input_orient = -1; output_orient = -1; eval_function(argv[i]); /* outside reflectance */ output_orient = 1; eval_function(argv[i]); /* outside -> inside */ } if (dobwd) { input_orient = 1; output_orient = 1; eval_function(argv[i]); /* inside reflectance */ output_orient = -1; eval_function(argv[i]); /* inside -> outside */ } xml_epilogue(); /* finish XML output & exit */ return(0); } /* XML input? */ if (i == argc-1 && (cp = argv[i]+strlen(argv[i])-4) > argv[i] && !strcasecmp(cp, ".xml")) { xml_header(argc, argv); /* start XML output */ eval_bsdf(argv[i]); /* load & resample BSDF */ xml_epilogue(); /* finish XML output & exit */ return(0); } if (i < argc) { /* open input files if given */ int nbsdf = 0; for ( ; i < argc; i++) { /* interpolate each component */ FILE *fpin = fopen(argv[i], "rb"); if (fpin == NULL) { fprintf(stderr, "%s: cannot open BSDF interpolant '%s'\n", progname, argv[i]); return(1); } if (!load_bsdf_rep(fpin)) return(1); fclose(fpin); if (!nbsdf++) { /* start XML on first dist. */ xml_header(argc, argv); xml_prologue(NULL); } eval_rbf(); } xml_epilogue(); /* finish XML output & exit */ return(0); } SET_FILE_BINARY(stdin); /* load from stdin */ if (!load_bsdf_rep(stdin)) return(1); xml_header(argc, argv); /* start XML output */ xml_prologue(NULL); eval_rbf(); /* resample dist. */ xml_epilogue(); /* finish XML output & exit */ return(0); userr: fprintf(stderr, "Usage: %s [-n spp][-h|-q][bsdf.sir ..] > bsdf.xml\n", progname); fprintf(stderr, " or: %s [-n spp][-h|-q] bsdf_in.xml > bsdf_out.xml\n", progname); fprintf(stderr, " or: %s [-n spp][-h|-q][{+|-}for[ward]][{+|-}b[ackward]][-e expr][-f file] bsdf_func > bsdf.xml\n", progname); return(1); }
int main(int argc, char *argv[]) { int bitsperpix; int i; SET_DEFAULT_BINARY(); SET_FILE_BINARY(stdin); SET_FILE_BINARY(stdout); progname = argv[0]; samplefac = 0; for (i = 1; i < argc; i++) if (argv[i][0] == '-') switch (argv[i][1]) { case 'g': gamv = atof(argv[++i]); break; case 'b': greyscale = 1; break; case 'd': dither = !dither; break; case 'c': ncolors = atoi(argv[++i]); break; case 'e': if (argv[i+1][0] != '+' && argv[i+1][0] != '-') goto userr; bradj = atoi(argv[++i]); break; case 'n': samplefac = atoi(argv[++i]); break; default: goto userr; } else break; if (i < argc-2) goto userr; if (i <= argc-1 && freopen(argv[i], "r", stdin) == NULL) { fprintf(stderr, "%s: cannot open input \"%s\"\n", progname, argv[i]); exit(1); } if (i == argc-2 && freopen(argv[i+1], "w", stdout) == NULL) { fprintf(stderr, "%s: cannot open output \"%s\"\n", progname, argv[i+1]); exit(1); } if (checkheader(stdin, COLRFMT, NULL) < 0 || fgetresolu(&xmax, &ymax, stdin) < 0) { fprintf(stderr, "%s: bad picture format\n", progname); exit(1); } picstart = ftell(stdin); currow = -1; scanln = (COLR *)malloc(xmax*sizeof(COLR)); if (scanln == NULL) { fprintf(stderr, "%s: out of memory\n", progname); exit(1); } /* set up gamma correction */ setcolrgam(gamv); /* figure out the bits per pixel */ if ((ncolors < 2) | (ncolors > MAXCOLORS)) ncolors = MAXCOLORS; for (bitsperpix = 1; ncolors > 1<<bitsperpix; bitsperpix++) ; /* compute color map */ if (greyscale) mkgrymap(ncolors); else mkclrmap(ncolors); /* convert image */ GIFEncode(stdout, xmax, ymax, 0, 0, bitsperpix, rmap, gmap, bmap, getgifpix); exit(0); userr: fprintf(stderr, "Usage: %s [-b][-d][-n samp][-c ncolors][-g gamv][-e +/-stops] input [output]\n", progname); exit(1); }
int main( int argc, char *argv[] ) { int i; esupport |= E_VARIABLE|E_FUNCTION|E_INCHAN|E_OUTCHAN|E_RCONST; esupport &= ~(E_REDEFW); #ifdef BIGGERLIB biggerlib(); #endif varset("PI", ':', 3.14159265358979323846); funset("in", 1, '=', &l_in); for (i = 1; i < argc && argv[i][0] == '-'; i++) switch (argv[i][1]) { case 'b': blnkeq = !blnkeq; break; case 'l': igneol = !igneol; break; case 'p': passive = !passive; break; case 't': sepchar = argv[i][2]; break; case 's': svpreset(argv[++i]); break; case 'f': fcompile(argv[++i]); break; case 'e': scompile(argv[++i], NULL, 0); break; case 'n': noinput = 1; break; case 'i': switch (argv[i][2]) { case '\0': itype = 'a'; nbicols = 0; readfmt(argv[++i], 0); break; case 'a': itype = 'a'; nbicols = 0; break; case 'd': case 'D': itype = argv[i][2]; if (isdigit(argv[i][3])) nbicols = atoi(argv[i]+3); else nbicols = 1; if (nbicols*sizeof(double) > INBSIZ) { eputs(argv[0]); eputs(": too many input columns\n"); quit(1); } break; case 'f': case 'F': itype = argv[i][2]; if (isdigit(argv[i][3])) nbicols = atoi(argv[i]+3); else nbicols = 1; if (nbicols*sizeof(float) > INBSIZ) { eputs(argv[0]); eputs(": too many input columns\n"); quit(1); } break; default: goto userr; } break; case 'o': switch (argv[i][2]) { case '\0': otype = 'a'; readfmt(argv[++i], 1); break; case 'a': otype = 'a'; break; case 'd': case 'D': case 'f': case 'F': otype = argv[i][2]; break; default: goto userr; } break; case 'w': nowarn = !nowarn; break; case 'u': unbuff = !unbuff; break; default:; userr: eputs("Usage: "); eputs(argv[0]); eputs(" [-b][-l][-n][-p][-w][-u][-tS][-s svar=sval][-e expr][-f source][-i infmt][-o outfmt] [file]\n"); quit(1); } if (otype != 'a') SET_FILE_BINARY(stdout); if (noinput) { /* produce a single output record */ if (i < argc) { eputs(argv[0]); eputs(": file argument(s) incompatible with -n\n"); quit(1); } eclock++; putout(); quit(0); } if (itype != 'a') SET_FILE_BINARY(stdin); if (blnkeq) /* for efficiency */ nbsynch(); if (i == argc) /* from stdin */ execute(NULL); else /* from one or more files */ for ( ; i < argc; i++) execute(argv[i]); quit(0); return 0; /* pro forma return */ }
/* Get output stream pointer (open and write header if new and noopen==0) */ STREAMOUT * getostream(const char *ospec, const char *mname, int bn, int noopen) { static STREAMOUT stdos; char info[1024]; int ofl; char oname[1024]; LUENT *lep; STREAMOUT *sop; char *cp; if (ospec == NULL) { /* use stdout? */ if (!noopen & !using_stdout) { if (outfmt != 'a') SET_FILE_BINARY(stdout); if (header) { cp = info; if (yres > 0) { sprintf(cp, "NROWS=%d\n", yres * (xres + !xres) ); while (*cp) ++cp; } if ((xres <= 0) | (stdos.reclen > 1)) sprintf(cp, "NCOLS=%d\n", stdos.reclen); printheader(stdout, info); } if (stdos.reclen == 1) printresolu(stdout, xres, yres); if (waitflush > 0) fflush(stdout); stdos.xr = xres; stdos.yr = yres; #ifdef getc_unlocked flockfile(stdout); /* avoid lock/unlock overhead */ #endif using_stdout = 1; } stdos.ofp = stdout; stdos.reclen += noopen; return(&stdos); } ofl = ofname(oname, ospec, mname, bn); /* get output name */ if (ofl < 0) { sprintf(errmsg, "bad output format '%s'", ospec); error(USER, errmsg); } lep = lu_find(&ofiletab, oname); /* look it up */ if (lep->key == NULL) /* new entry */ lep->key = strcpy((char *)malloc(strlen(oname)+1), oname); sop = (STREAMOUT *)lep->data; if (sop == NULL) { /* allocate stream */ sop = (STREAMOUT *)malloc(sizeof(STREAMOUT)); if (sop == NULL) error(SYSTEM, "out of memory in getostream"); sop->outpipe = oname[0] == '!'; sop->reclen = 0; sop->ofp = NULL; /* open iff noopen==0 */ sop->xr = xres; sop->yr = yres; lep->data = (char *)sop; if (!sop->outpipe & !force_open & !recover && access(oname, F_OK) == 0) { errno = EEXIST; /* file exists */ goto openerr; } } if (!noopen && sop->ofp == NULL) { /* open output stream */ if (oname[0] == '!') /* output to command */ sop->ofp = popen(oname+1, "w"); else /* else open file */ sop->ofp = fopen(oname, "w"); if (sop->ofp == NULL) goto openerr; if (outfmt != 'a') SET_FILE_BINARY(sop->ofp); #ifdef getc_unlocked flockfile(sop->ofp); /* avoid lock/unlock overhead */ #endif if (accumulate > 0) { /* global resolution */ sop->xr = xres; sop->yr = yres; } if (header) { cp = info; if (ofl & OF_MODIFIER || sop->reclen == 1) { sprintf(cp, "MODIFIER=%s\n", mname); while (*cp) ++cp; } if (ofl & OF_BIN) { sprintf(cp, "BIN=%d\n", bn); while (*cp) ++cp; } if (sop->yr > 0) { sprintf(cp, "NROWS=%d\n", sop->yr * (sop->xr + !sop->xr) ); while (*cp) ++cp; } if ((sop->xr <= 0) | (sop->reclen > 1)) sprintf(cp, "NCOLS=%d\n", sop->reclen); printheader(sop->ofp, info); } if (sop->reclen == 1) printresolu(sop->ofp, sop->xr, sop->yr); if (waitflush > 0) fflush(sop->ofp); } sop->reclen += noopen; /* add to length if noopen */ return(sop); /* return output stream */ openerr: sprintf(errmsg, "cannot open '%s' for writing", oname); error(SYSTEM, errmsg); return(NULL); /* pro forma return */ }
int main(int argc, char *argv[]) { #define check(ol,al) if (argv[i][ol] || \ badarg(argc-i-1,argv+i+1,al)) \ goto badopt #define check_bool(olen,var) switch (argv[i][olen]) { \ case '\0': var = !var; break; \ case 'y': case 'Y': case 't': case 'T': \ case '+': case '1': var = 1; break; \ case 'n': case 'N': case 'f': case 'F': \ case '-': case '0': var = 0; break; \ default: goto badopt; } char *octnm = NULL; char *err; int rval; int i; /* global program name */ progname = argv[0] = fixargv0(argv[0]); /* set our defaults */ shadthresh = .1; shadcert = .25; directrelay = 0; vspretest = 128; srcsizerat = 0.; specthresh = .3; specjitter = 1.; maxdepth = 6; minweight = 1e-2; ambacc = 0.3; ambres = 32; ambdiv = 256; ambssamp = 64; /* option city */ for (i = 1; i < argc; i++) { /* expand arguments */ while ((rval = expandarg(&argc, &argv, i)) > 0) ; if (rval < 0) { sprintf(errmsg, "cannot expand '%s'", argv[i]); error(SYSTEM, errmsg); } if (argv[i] == NULL || argv[i][0] != '-') break; /* break from options */ if (!strcmp(argv[i], "-version")) { puts(VersionID); quit(0); } if (!strcmp(argv[i], "-defaults") || !strcmp(argv[i], "-help")) { printdefaults(); quit(0); } if (!strcmp(argv[i], "-devices")) { printdevices(); quit(0); } rval = getrenderopt(argc-i, argv+i); if (rval >= 0) { i += rval; continue; } rval = getviewopt(&ourview, argc-i, argv+i); if (rval >= 0) { i += rval; continue; } switch (argv[i][1]) { case 'n': /* # processes */ check(2,"i"); nproc = atoi(argv[++i]); if (nproc <= 0) error(USER, "bad number of processes"); break; case 'v': /* view file */ if (argv[i][2] != 'f') goto badopt; check(3,"s"); rval = viewfile(argv[++i], &ourview, NULL); if (rval < 0) { sprintf(errmsg, "cannot open view file \"%s\"", argv[i]); error(SYSTEM, errmsg); } else if (rval == 0) { sprintf(errmsg, "bad view file \"%s\"", argv[i]); error(USER, errmsg); } break; case 'b': /* grayscale */ check_bool(2,greyscale); break; case 'p': /* pixel */ switch (argv[i][2]) { case 's': /* sample */ check(3,"i"); psample = atoi(argv[++i]); break; case 't': /* threshold */ check(3,"f"); maxdiff = atof(argv[++i]); break; case 'e': /* exposure */ check(3,"f"); exposure = atof(argv[++i]); if (argv[i][0] == '+' || argv[i][0] == '-') exposure = pow(2.0, exposure); break; default: goto badopt; } break; case 'w': /* warnings */ rval = erract[WARNING].pf != NULL; check_bool(2,rval); if (rval) erract[WARNING].pf = wputs; else erract[WARNING].pf = NULL; break; case 'e': /* error file */ check(2,"s"); errfile = argv[++i]; break; case 'o': /* output device */ check(2,"s"); dvcname = argv[++i]; break; case 'R': /* render input file */ check(2,"s"); strcpy(rifname, argv[++i]); break; default: goto badopt; } } err = setview(&ourview); /* set viewing parameters */ if (err != NULL) error(USER, err); /* set up signal handling */ sigdie(SIGINT, "Interrupt"); sigdie(SIGTERM, "Terminate"); #if !defined(_WIN32) && !defined(_WIN64) sigdie(SIGHUP, "Hangup"); sigdie(SIGPIPE, "Broken pipe"); sigdie(SIGALRM, "Alarm clock"); #endif /* open error file */ if (errfile != NULL) { if (freopen(errfile, "a", stderr) == NULL) quit(2); fprintf(stderr, "**************\n*** PID %5d: ", getpid()); printargs(argc, argv, stderr); putc('\n', stderr); fflush(stderr); } #ifdef NICE nice(NICE); /* lower priority */ #endif /* get octree */ if (i == argc) octnm = NULL; else if (i == argc-1) octnm = argv[i]; else goto badopt; if (octnm == NULL) error(USER, "missing octree argument"); /* set up output & start process(es) */ SET_FILE_BINARY(stdout); ray_init(octnm); /* also calls ray_init_pmap() */ /* temporary shortcut, until winrview is refactored into a "device" */ #ifndef WIN_RVIEW rview(); /* run interactive viewer */ devclose(); /* close output device */ #endif /* PMAP: free photon maps */ ray_done_pmap(); #ifdef WIN_RVIEW return 1; #endif quit(0); badopt: sprintf(errmsg, "command line error at '%s'", argv[i]); error(USER, errmsg); return 1; /* pro forma return */ #undef check #undef check_bool }
int main( /* convert object files to an octree */ int argc, char *argv[] ) { FVECT bbmin, bbmax; char *infile = NULL; int inpfrozen = 0; int outflags = IO_ALL; OBJECT startobj; int i; progname = argv[0] = fixargv0(argv[0]); ot_initotypes(); for (i = 1; i < argc && argv[i][0] == '-'; i++) switch (argv[i][1]) { case '\0': /* scene from stdin */ goto breakopt; case 'i': /* input octree */ infile = argv[++i]; break; case 'b': /* bounding cube */ thescene.cuorg[0] = atof(argv[++i]) - OMARGIN; thescene.cuorg[1] = atof(argv[++i]) - OMARGIN; thescene.cuorg[2] = atof(argv[++i]) - OMARGIN; thescene.cusize = atof(argv[++i]) + 2*OMARGIN; break; case 'n': /* set limit */ objlim = atoi(argv[++i]); break; case 'r': /* resolution limit */ resolu = atoi(argv[++i]); break; case 'f': /* freeze octree */ outflags &= ~IO_FILES; break; case 'w': /* supress warnings */ nowarn = 1; break; default: sprintf(errmsg, "unknown option: '%s'", argv[i]); error(USER, errmsg); break; } breakopt: SET_FILE_BINARY(stdout); if (infile != NULL) { /* get old octree & objects */ if (thescene.cusize > FTINY) error(USER, "only one of '-b' or '-i'"); nfiles = readoct(infile, IO_ALL, &thescene, ofname); if (nfiles == 0) inpfrozen++; } else newheader("RADIANCE", stdout); /* new binary file header */ printargs(argc, argv, stdout); fputformat(OCTFMT, stdout); printf("\n"); startobj = nobjects; /* previous objects already converted */ for ( ; i < argc; i++) /* read new scene descriptions */ if (!strcmp(argv[i], "-")) { /* from stdin */ readobj(NULL); outflags &= ~IO_FILES; } else { /* from file */ if (nfiles >= MAXOBJFIL) error(INTERNAL, "too many scene files"); readobj(ofname[nfiles++] = argv[i]); } ofname[nfiles] = NULL; if (inpfrozen && outflags & IO_FILES) { error(WARNING, "frozen octree"); outflags &= ~IO_FILES; } /* find bounding box */ bbmin[0] = bbmin[1] = bbmin[2] = FHUGE; bbmax[0] = bbmax[1] = bbmax[2] = -FHUGE; for (i = startobj; i < nobjects; i++) add2bbox(objptr(i), bbmin, bbmax); /* set/check cube */ if (thescene.cusize == 0.0) { if (bbmin[0] <= bbmax[0]) { for (i = 0; i < 3; i++) { bbmin[i] -= OMARGIN; bbmax[i] += OMARGIN; } for (i = 0; i < 3; i++) if (bbmax[i] - bbmin[i] > thescene.cusize) thescene.cusize = bbmax[i] - bbmin[i]; for (i = 0; i < 3; i++) thescene.cuorg[i] = (bbmax[i]+bbmin[i]-thescene.cusize)*.5; } } else { for (i = 0; i < 3; i++) if (bbmin[i] < thescene.cuorg[i] || bbmax[i] > thescene.cuorg[i] + thescene.cusize) error(USER, "boundary does not encompass scene"); } mincusize = thescene.cusize / resolu - FTINY; for (i = startobj; i < nobjects; i++) /* add new objects */ addobject(&thescene, i); thescene.cutree = combine(thescene.cutree); /* optimize */ writeoct(outflags, &thescene, ofname); /* write structures to stdout */ quit(0); return 0; /* pro forma return */ }
int main( int argc, char *argv[] ) { static char picfmt[MAXFMTLEN] = PICFMT; int rval; FILE *fin; SET_DEFAULT_BINARY(); SET_FILE_BINARY(stdout); progname = argv[0]; while (argc > 2 && argv[1][0] == '-') { switch (argv[1][1]) { case 'c': correctorder = 1; break; case 'r': ccw = 1; break; default: goto userr; } argc--; argv++; } if (argc != 2 && argc != 3) goto userr; if ((fin = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "%s: cannot open\n", argv[1]); exit(1); } if (argc == 3 && freopen(argv[2], "w", stdout) == NULL) { fprintf(stderr, "%s: cannot open\n", argv[2]); exit(1); } /* transfer header */ if ((rval = checkheader(fin, picfmt, stdout)) < 0) { fprintf(stderr, "%s: not a Radiance picture\n", progname); exit(1); } if (rval) fputformat(picfmt, stdout); /* add new header info. */ fputs(progname, stdout); if (ccw) fputs(" -r", stdout); if (correctorder) fputs(" -c", stdout); fputs("\n\n", stdout); /* get picture size */ if ((order = fgetresolu(&xres, &yres, fin)) < 0) { fprintf(stderr, "%s: bad picture size\n", progname); exit(1); } /* write new picture size */ fputresolu(neworder(), yres, xres, stdout); /* compute buffer capacity */ nrows = sizeof(buf)/sizeof(COLR)/yres; if (ccw) /* rotate the image */ rotateccw(fin); else rotatecw(fin); exit(0); userr: fprintf(stderr, "Usage: %s [-r][-c] infile [outfile]\n", progname); exit(1); }
int main( int argc, char *argv[] ) { int ncolumns = 0; int autolabel = 0; int curcol = 0, x0 = 0, curx = 0, cury = 0, spacing = 0; int xsgn, ysgn; char *thislabel; int an; SET_DEFAULT_BINARY(); SET_FILE_BINARY(stdin); SET_FILE_BINARY(stdout); progname = argv[0]; for (an = 1; an < argc && argv[an][0] == '-'; an++) switch (argv[an][1]) { case 'h': echoheader = !echoheader; break; case 'x': xsiz = atoi(argv[++an]); break; case 'y': ysiz = atoi(argv[++an]); break; case 'b': setcolr(bgcolr, atof(argv[an+1]), atof(argv[an+2]), atof(argv[an+3])); an += 3; break; case 'a': ncolumns = atoi(argv[++an]); break; case 's': spacing = atoi(argv[++an]); break; case 'o': curx = x0 = atoi(argv[++an]); cury = atoi(argv[++an]); break; case 'l': switch (argv[an][2]) { case 'a': autolabel++; break; case 'h': labelht = atoi(argv[++an]); break; case '\0': goto dofiles; default: goto userr; } break; case '\0': case 't': goto dofiles; default: goto userr; } dofiles: newheader("RADIANCE", stdout); fputnow(stdout); for (nfile = 0; an < argc; nfile++) { if (nfile >= MAXFILE) goto toomany; thislabel = NULL; input[nfile].flags = 0; xsgn = ysgn = '-'; while (an < argc && (argv[an][0] == '-' || argv[an][0] == '+' || argv[an][0] == '=')) { switch (argv[an][1]) { case 't': checkthresh = 1; if (argv[an][0] == '-') { input[nfile].flags |= HASMIN; input[nfile].thmin = atof(argv[an+1]); } else if (argv[an][0] == '+') { input[nfile].flags |= HASMAX; input[nfile].thmax = atof(argv[an+1]); } else goto userr; an++; break; case 'l': if (strcmp(argv[an], "-l")) goto userr; thislabel = argv[++an]; break; case '+': case '-': case '0': if (argv[an][0] != '=') goto userr; xsgn = argv[an][1]; ysgn = argv[an][2]; if (ysgn != '+' && ysgn != '-' && ysgn != '0') goto userr; break; case '\0': if (argv[an][0] == '-') goto getfile; goto userr; default: goto userr; } an++; } getfile: if (argc-an < (ncolumns ? 1 : 3)) goto userr; if (autolabel && thislabel == NULL) thislabel = argv[an]; if (!strcmp(argv[an], "-")) { input[nfile].name = StandardInput; input[nfile].fp = stdin; } else { if (argv[an][0] == '!') { input[nfile].name = Command; input[nfile].fp = popen(argv[an]+1, "r"); } else { input[nfile].name = argv[an]; input[nfile].fp = fopen(argv[an], "r"); } if (input[nfile].fp == NULL) { perror(argv[an]); quit(1); } } an++; /* get header */ if (echoheader) printf("%s:\n", input[nfile].name); getheader(input[nfile].fp, headline, NULL); if (wrongformat) { fprintf(stderr, "%s: incompatible input format\n", input[nfile].name); quit(1); } /* get picture size */ if (fgetresolu(&input[nfile].xres, &input[nfile].yres, input[nfile].fp) < 0) { fprintf(stderr, "%s: bad picture size\n", input[nfile].name); quit(1); } if (ncolumns > 0) { if (curcol >= ncolumns) { cury = ymax + spacing; curx = x0; curcol = 0; } input[nfile].xloc = curx; input[nfile].yloc = cury; curx += input[nfile].xres + spacing; curcol++; } else { input[nfile].xloc = atoi(argv[an++]); if (xsgn == '+') input[nfile].xloc -= input[nfile].xres; else if (xsgn == '0') input[nfile].xloc -= input[nfile].xres/2; input[nfile].yloc = atoi(argv[an++]); if (ysgn == '+') input[nfile].yloc -= input[nfile].yres; else if (ysgn == '0') input[nfile].yloc -= input[nfile].yres/2; } if (input[nfile].xloc < xmin) xmin = input[nfile].xloc; if (input[nfile].yloc < ymin) ymin = input[nfile].yloc; if (input[nfile].xloc+input[nfile].xres > xmax) xmax = input[nfile].xloc+input[nfile].xres; if (input[nfile].yloc+input[nfile].yres > ymax) ymax = input[nfile].yloc+input[nfile].yres; if (thislabel != NULL) { if (++nfile >= MAXFILE) goto toomany; input[nfile].name = Label; input[nfile].flags = 0; input[nfile].xres = input[nfile-1].xres; input[nfile].yres = labelht; if ((input[nfile].fp = lblopen(thislabel, &input[nfile].xres, &input[nfile].yres)) == NULL) goto labelerr; input[nfile].xloc = input[nfile-1].xloc; input[nfile].yloc = input[nfile-1].yloc + input[nfile-1].yres-input[nfile].yres; } } if (xsiz <= 0) xsiz = xmax; else if (xsiz > xmax) xmax = xsiz; if (ysiz <= 0) ysiz = ymax; else if (ysiz > ymax) ymax = ysiz; /* add new header info. */ printargs(argc, argv, stdout); if (strcmp(ourfmt, PICFMT)) fputformat(ourfmt, stdout); /* print format if known */ putchar('\n'); fprtresolu(xsiz, ysiz, stdout); compos(); quit(0); userr: fprintf(stderr, "Usage: %s [-h][-x xr][-y yr][-b r g b][-a n][-s p][-o x0 y0][-la][-lh h] ", progname); fprintf(stderr, "[-t min1][+t max1][-l lab][=SS] pic1 x1 y1 ..\n"); quit(1); toomany: fprintf(stderr, "%s: only %d files and labels allowed\n", progname, MAXFILE); quit(1); labelerr: fprintf(stderr, "%s: error opening label\n", progname); quit(1); return 1; /* pro forma return */ }
int main( int argc, char *argv[] ) { int original; double f; int a; SET_DEFAULT_BINARY(); SET_FILE_BINARY(stdin); SET_FILE_BINARY(stdout); progname = argv[0]; /* scan options */ for (a = 1; a < argc; a++) { if (argv[a][0] == '-') switch (argv[a][1]) { case 'x': case 'y': a++; continue; case 'w': nowarn = !nowarn; continue; case 'h': echoheader = !echoheader; continue; case 'f': case 'e': a++; continue; } break; } newheader("RADIANCE", stdout); /* start header */ fputnow(stdout); /* process files */ for (nfiles = 0; nfiles < MAXINP; nfiles++) { setcolor(input[nfiles].coef, 1.0, 1.0, 1.0); setcolor(input[nfiles].expos, 1.0, 1.0, 1.0); input[nfiles].vw = stdview; input[nfiles].pa = 1.0; } nfiles = 0; original = 0; for ( ; a < argc; a++) { if (nfiles >= MAXINP) { eputs(argv[0]); eputs(": too many picture files\n"); quit(1); } if (argv[a][0] == '-') switch (argv[a][1]) { case '\0': input[nfiles].name = StandardInput; input[nfiles].fp = stdin; break; case 'o': original++; continue; case 's': f = atof(argv[++a]); scalecolor(input[nfiles].coef, f); continue; case 'c': colval(input[nfiles].coef,RED)*=atof(argv[++a]); colval(input[nfiles].coef,GRN)*=atof(argv[++a]); colval(input[nfiles].coef,BLU)*=atof(argv[++a]); continue; default: goto usage; } else { if (argv[a][0] == '!') { input[nfiles].name = Command; input[nfiles].fp = popen(argv[a]+1, "r"); } else { input[nfiles].name = argv[a]; input[nfiles].fp = fopen(argv[a], "r"); } if (input[nfiles].fp == NULL) { perror(argv[a]); quit(1); } } checkfile(); if (original) { colval(input[nfiles].coef,RED) /= colval(input[nfiles].expos,RED); colval(input[nfiles].coef,GRN) /= colval(input[nfiles].expos,GRN); colval(input[nfiles].coef,BLU) /= colval(input[nfiles].expos,BLU); setcolor(input[nfiles].expos, 1.0, 1.0, 1.0); } nfiles++; original = 0; } init(); /* set constants */ /* go back and get expressions */ for (a = 1; a < argc; a++) { if (argv[a][0] == '-') switch (argv[a][1]) { case 'x': varset(vxres, ':', eval(argv[++a])); continue; case 'y': varset(vyres, ':', eval(argv[++a])); continue; case 'w': continue; case 'h': continue; case 'f': fcompile(argv[++a]); continue; case 'e': scompile(argv[++a], NULL, 0); continue; } break; } /* set/get output resolution */ if (!vardefined(vxres)) varset(vxres, ':', (double)xmax); if (!vardefined(vyres)) varset(vyres, ':', (double)ymax); xres = varvalue(vxres) + .5; yres = varvalue(vyres) + .5; if (xres <= 0 || yres <= 0) { eputs(argv[0]); eputs(": illegal output resolution\n"); quit(1); } /* complete header */ printargs(argc, argv, stdout); if (strcmp(ourfmt, PICFMT)) fputformat(ourfmt, stdout); /* print format if known */ putchar('\n'); fprtresolu(xres, yres, stdout); /* combine pictures */ combine(); quit(0); usage: eputs("Usage: "); eputs(argv[0]); eputs( " [-w][-h][-x xr][-y yr][-e expr][-f file] [ [-o][-s f][-c r g b] hdr ..]\n"); quit(1); return 1; /* pro forma return */ }