--- ray/src/px/pfilt.c 1990/11/28 11:13:23 1.12 +++ ray/src/px/pfilt.c 1992/09/08 15:33:08 2.3 @@ -1,4 +1,4 @@ -/* Copyright (c) 1986 Regents of the University of California */ +/* Copyright (c) 1991 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -16,8 +16,15 @@ static char SCCSid[] = "$SunId$ LBL"; #include "color.h" +#include "resolu.h" + +#include "paths.h" + extern char *malloc(); +extern float *matchlamp(); +#define FEQ(a,b) ((a) >= .98*(b) && (a) <= 1.02*(b)) + #define CHECKRAD 1.5 /* radius to check for filtering */ COLOR exposure = WHTCOLOR; /* exposure for the frame */ @@ -40,14 +47,17 @@ int npts = 0; /* (half) number of points for stars double spread = 1e-4; /* spread for star points */ -#define TEMPLATE "/usr/tmp/pfXXXXXX" - char *tfname = NULL; +char *lampdat = "lamp.tab"; /* lamp data file */ + +int order; /* scanline ordering of input */ int xres, yres; /* resolution of input */ double inpaspect = 1.0; /* pixel aspect ratio of input */ int correctaspect = 0; /* aspect ratio correction? */ +int wrongformat = 0; + int xrad; /* x window size */ int yrad; /* y window size */ @@ -62,15 +72,16 @@ main(argc, argv) int argc; char **argv; { - extern char *mktemp(); - extern double atof(), pow(); + extern double pow(); extern long ftell(); extern int quit(), headline(); FILE *fin; + float *lampcolor; + char *lamptype = NULL; long fpos; double outaspect = 0.0; double d; - int i; + int i, j; if (signal(SIGINT, quit) == SIG_IGN) signal(SIGINT, SIG_IGN); @@ -116,6 +127,12 @@ char **argv; d = pow(2.0, atof(argv[i+1])); else d = atof(argv[i+1]); + if (d < 1e-20 || d > 1e20) { + fprintf(stderr, + "%s: exposure out of range\n", + argv[0]); + exit(1); + } switch (argv[i][2]) { case '\0': scalecolor(exposure, d); @@ -134,6 +151,12 @@ char **argv; } i++; break; + case 'f': + lampdat = argv[++i]; + break; + case 't': + lamptype = argv[++i]; + break; case '1': singlepass = 1; break; @@ -167,7 +190,20 @@ char **argv; } else break; - + /* get lamp data (if necessary) */ + if (lamptype != NULL) { + if (loadlamps(lampdat) < 0) + quit(1); + if ((lampcolor = matchlamp(lamptype)) == NULL) { + fprintf(stderr, "%s: unknown lamp type\n", lamptype); + quit(1); + } + for (i = 0; i < 3; i++) + if (lampcolor[i] > 1e-4) + colval(exposure,i) /= lampcolor[i]; + freelamps(); + } + /* open input file */ if (i == argc) { if (singlepass) fin = stdin; @@ -195,14 +231,21 @@ char **argv; quit(1); } /* get header */ - getheader(fin, headline); + getheader(fin, headline, NULL); + if (wrongformat) { + fprintf(stderr, "%s: input must be a Radiance picture\n", + progname); + quit(1); + } /* add new header info. */ printargs(i, argv, stdout); /* get picture size */ - if (fgetresolu(&xres, &yres, fin) != (YMAJOR|YDECR)) { + if ((order = fgetresolu(&xres, &yres, fin)) < 0) { fprintf(stderr, "%s: bad picture size\n", progname); quit(1); } + if (!(order & YMAJOR)) + inpaspect = 1.0/inpaspect; /* compute output resolution */ if (ncols <= 0) ncols = x_c*xres + .5; @@ -241,9 +284,15 @@ char **argv; headline(s) /* process line from header */ char *s; { + char fmt[32]; + fputs(s, stdout); /* copy to output */ if (isaspect(s)) /* get aspect ratio */ inpaspect *= aspectval(s); + else if (isformat(s)) { + formatval(fmt, s); + wrongformat = strcmp(fmt, COLRFMT); + } } @@ -342,6 +391,7 @@ FILE *in; scan2init() /* prepare scanline arrays */ { + COLOR ctmp; double d; register int i; @@ -357,7 +407,7 @@ scan2init() /* prepare scanline arrays */ initmask(); /* initialize filter table */ } - barsize = 2 * yrad; + barsize = 2*yrad + 1; scanin = (COLOR **)malloc(barsize*sizeof(COLOR *)); for (i = 0; i < barsize; i++) { scanin[i] = (COLOR *)malloc(xres*sizeof(COLOR)); @@ -371,17 +421,25 @@ scan2init() /* prepare scanline arrays */ fprintf(stderr, "%s: out of memory\n", progname); quit(1); } - /* record pixel aspect and exposure */ + /* record pixel aspect ratio */ if (!correctaspect) { - d = x_c / y_r; - if (d < .99 || d > 1.01) + d = order & YMAJOR ? x_c/y_r : y_r/x_c ; + if (!FEQ(d,1.0)) fputaspect(d, stdout); } + /* record exposure */ d = bright(exposure); - if (d < .995 || d > 1.005) + if (!FEQ(d,1.0)) fputexpos(d, stdout); + /* record color correction */ + copycolor(ctmp, exposure); + scalecolor(ctmp, 1.0/d); + if (!FEQ(colval(ctmp,RED),colval(ctmp,GRN)) || + !FEQ(colval(ctmp,GRN),colval(ctmp,BLU))) + fputcolcor(ctmp, stdout); printf("\n"); - fputresolu(YMAJOR|YDECR, ncols, nrows, stdout); /* resolution */ + /* write out resolution */ + fputresolu(order, ncols, nrows, stdout); }