--- ray/src/px/ra_xyze.c 2004/01/02 12:47:01 2.8 +++ ray/src/px/ra_xyze.c 2006/08/22 21:38:22 2.10 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: ra_xyze.c,v 2.8 2004/01/02 12:47:01 schorsch Exp $"; +static const char RCSid[] = "$Id: ra_xyze.c,v 2.10 2006/08/22 21:38:22 greg Exp $"; #endif /* * Program to convert between RADIANCE RGBE and XYZE formats @@ -16,22 +16,20 @@ static const char RCSid[] = "$Id: ra_xyze.c,v 2.8 2004 #include "resolu.h" int rgbinp = -1; /* input is RGBE? */ - int rgbout = 0; /* output should be RGBE? */ - RGBPRIMS inprims = STDPRIMS; /* input primaries */ - RGBPRIMS outprims = STDPRIMS; /* output primaries */ - double expcomp = 1.0; /* exposure compensation */ - int doflat = -1; /* produce flat file? */ - +double origexp = -1.0; /* original exposure */ char *progname; static gethfunc headline; +static void quiterr(char *err); +static void convert(void); + static int headline( /* process header line */ char *s, @@ -49,6 +47,10 @@ headline( /* process header line */ rgbinp = -2; return(0); /* don't echo */ } + if (origexp > 0.0 && isexpos(s)) { + origexp *= exposval(s); + return(0); /* don't echo */ + } if (isprims(s)) { /* get input primaries */ primsval(inprims, s); return(0); /* don't echo */ @@ -58,9 +60,8 @@ headline( /* process header line */ } -main(argc, argv) -int argc; -char *argv[]; +int +main(int argc, char *argv[]) { int i; SET_DEFAULT_BINARY(); @@ -92,6 +93,9 @@ char *argv[]; outprims[WHT][CIEX] = atof(argv[++i]); outprims[WHT][CIEY] = atof(argv[++i]); break; + case 'o': /* original exposure */ + origexp = 1.0; + break; case 'e': /* exposure compensation */ expcomp = atof(argv[++i]); if (argv[i][0] == '+' || argv[i][0] == '-') @@ -126,14 +130,16 @@ char *argv[]; convert(); /* convert picture */ exit(0); userr: - fprintf(stderr, "Usage: %s [-r][-e exp][-c|-u]", progname); + fprintf(stderr, "Usage: %s [-r][-o][-e exp][-c|-u]", progname); fprintf(stderr, "[-p rx ry gx gy bx by wx wy] [input [output]]\n"); exit(1); } -quiterr(err) /* print message and exit */ -char *err; +static void +quiterr( /* print message and exit */ + char *err +) { if (err != NULL) { fprintf(stderr, "%s: %s\n", progname, err); @@ -143,28 +149,39 @@ char *err; } -convert() /* convert to XYZE or RGBE picture */ +static void +convert(void) /* convert to XYZE or RGBE picture */ { int order; int xmax, ymax; COLORMAT xfm; register COLOR *scanin; register COLR *scanout; - double ourexp = expcomp; + double exp2do = expcomp; + double exp2report = expcomp; int y; register int x; + /* recover original? */ + if (origexp > 0.0) + exp2do /= origexp; /* compute transform */ if (rgbout) { if (rgbinp) { /* RGBE -> RGBE */ comprgb2rgbWBmat(xfm, inprims, outprims); } else { /* XYZE -> RGBE */ compxyz2rgbWBmat(xfm, outprims); - ourexp *= WHTEFFICACY; + if (origexp > 0.0) + exp2do /= WHTEFFICACY; + else + exp2report *= WHTEFFICACY; } } else { if (rgbinp) { /* RGBE -> XYZE */ comprgb2xyzWBmat(xfm, inprims); - ourexp /= WHTEFFICACY; + if (origexp > 0.0) + exp2do *= WHTEFFICACY; + else + exp2report /= WHTEFFICACY; } else { /* XYZE -> XYZE */ for (y = 0; y < 3; y++) for (x = 0; x < 3; x++) @@ -173,13 +190,13 @@ convert() /* convert to XYZE or RGBE picture */ } for (y = 0; y < 3; y++) for (x = 0; x < 3; x++) - xfm[y][x] *= expcomp; + xfm[y][x] *= exp2do; /* get input resolution */ if ((order = fgetresolu(&xmax, &ymax, stdin)) < 0) quiterr("bad picture format"); /* complete output header */ - if (ourexp < 0.99 || ourexp > 1.01) - fputexpos(ourexp, stdout); + if ((exp2report < 0.99) | (exp2report > 1.01)) + fputexpos(exp2report, stdout); if (rgbout) { fputprims(outprims, stdout); fputformat(COLRFMT, stdout);