--- ray/src/px/normtiff.c 1998/10/26 17:05:28 3.1 +++ ray/src/px/normtiff.c 2003/07/14 04:56:54 3.5 @@ -1,18 +1,13 @@ -/* Copyright (c) 1998 Silicon Graphics, Inc. */ - #ifndef lint -static char SCCSid[] = "$SunId$ SGI"; +static const char RCSid[] = "$Id: normtiff.c,v 3.5 2003/07/14 04:56:54 greg Exp $"; #endif - /* * Tone map SGILOG TIFF or Radiance picture and output 24-bit RGB TIFF */ -#undef NOPROTO -#define NOPROTO 1 - #include #include +#include #include "tiffio.h" #include "color.h" #include "tonemap.h" @@ -38,16 +33,25 @@ short ortab[8] = { /* orientation conversion table */ 0 }; -extern FILE *openpicture(); +typedef struct { + FILE *fp; /* file pointer */ + char fmt[32]; /* picture format */ + double pa; /* pixel aspect ratio */ + RESOLU rs; /* picture resolution */ +} PICTURE; +extern PICTURE *openpicture(); +#define closepicture(p) (fclose((p)->fp),free((void *)(p))) + + main(argc, argv) int argc; char *argv[]; { - FILE *fin = NULL; + PICTURE *pin = NULL; TIFF *tin = NULL; - int i; + int i, rval; for (i = 1; i < argc && argv[i][0] == '-'; i++) switch (argv[i][1]) { @@ -94,7 +98,7 @@ char *argv[]; goto userr; } if (argc-i < 2) goto userr; - if ((fin = openpicture(argv[i])) == NULL && + if ((pin = openpicture(argv[i])) == NULL && (tin = TIFFOpen(argv[i], "r")) == NULL) { fprintf(stderr, "%s: cannot open or interpret file \"%s\"\n", argv[0], argv[i]); @@ -105,15 +109,15 @@ char *argv[]; argv[0], argv[i+1]); exit(1); } - if (fin != NULL) { - tmap_picture(argv[i], fin); - fclose(fin); + if (pin != NULL) { + rval = tmap_picture(argv[i], pin); + closepicture(pin); } else { - tmap_tiff(argv[i], tin); + rval = tmap_tiff(argv[i], tin); TIFFClose(tin); } TIFFClose(tifout); - exit(0); + exit(rval==0 ? 0 : 1); userr: fprintf(stderr, "Usage: %s [-h][-s][-c][-l][-b][-g gv][-d ld][-u lm][-p xr yr xg yg xb yb xw yw] input.{tif|pic} output.tif\n", @@ -122,13 +126,30 @@ userr: } -FILE * +int +headline(s, pp) /* process line from header */ +char *s; +register PICTURE *pp; +{ + register char *cp; + + for (cp = s; *cp; cp++) + if (*cp & 0x80) + return(-1); /* non-ascii in header */ + if (isaspect(s)) + pp->pa *= aspectval(s); + else + formatval(pp->fmt, s); + return(0); +} + + +PICTURE * openpicture(fname) /* open/check Radiance picture file */ char *fname; { FILE *fp; - char inpfmt[32]; - int xsiz, ysiz; + register PICTURE *pp; register char *cp; /* check filename suffix */ if (fname == NULL) return(NULL); @@ -144,55 +165,50 @@ char *fname; /* else try opening it */ if ((fp = fopen(fname, "r")) == NULL) return(NULL); - /* check format */ - strcpy(inpfmt, PICFMT); - if (checkheader(fp, inpfmt, NULL) < 0 || - fgetresolu(&xsiz, &ysiz, fp) < 0) { - fclose(fp); /* failed test -- close file */ + /* 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, (char *)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(fp); + return(pp); } -getpixrat(s, pr) /* get pixel aspect ratio */ -char *s; -double *pr; -{ - if (isaspect(s)) - *pr *= aspectval(s); -} - - -tmap_picture(fname, fp) /* tone map Radiance picture */ +int +tmap_picture(fname, pp) /* tone map Radiance picture */ char *fname; -FILE *fp; +register PICTURE *pp; { - double pixrat; - int ord; uint16 orient; int xsiz, ysiz; BYTE *pix; /* read and tone map picture */ if (tmMapPicture(&pix, &xsiz, &ysiz, flags, - rgbp, gamv, lddyn, ldmax, fname, fp) != TM_E_OK) - exit(1); - /* get relevant header info. */ - rewind(fp); - pixrat = 1.; - getheader(fp, getpixrat, &pixrat); - if ((ord = fgetresolu(&xsiz, &ysiz, fp)) < 0) - orient = 0; - else - for (orient = 8; --orient; ) - if (ortab[orient] == ord) - break; + rgbp, gamv, lddyn, ldmax, fname, pp->fp) != TM_E_OK) + return(-1); + /* figure out TIFF orientation */ + for (orient = 8; --orient; ) + if (ortab[orient] == pp->rs.rt) + break; orient++; /* put out our image */ - putimage(orient, (uint32)xsiz, (uint32)ysiz, 72., 72./pixrat, 2, pix); + if (putimage(orient, (uint32)xsiz, (uint32)ysiz, + 72., 72./pp->pa, 2, pix) != 0) + return(-1); /* free data and we're done */ - free((char *)pix); + free((void *)pix); + return(0); } @@ -206,25 +222,24 @@ TIFF *tp; BYTE *pix; /* check to make sure it's SGILOG */ TIFFGetFieldDefaulted(tp, TIFFTAG_PHOTOMETRIC, &phot); - if (phot != PHOTOMETRIC_LOGLUV && phot != PHOTOMETRIC_LOGL) { - fprintf(stderr, "%s: TIFF must be in SGILOG format\n", fname); - exit(1); - } - if (phot == PHOTOMETRIC_LOGL) + if (phot == PHOTOMETRIC_LOGL | phot == PHOTOMETRIC_MINISBLACK) flags |= TM_F_BW; /* read and tone map TIFF */ if (tmMapTIFF(&pix, &xsiz, &ysiz, flags, rgbp, gamv, lddyn, ldmax, fname, tp) != TM_E_OK) - exit(1); + return(-1); /* get relevant tags */ TIFFGetFieldDefaulted(tp, TIFFTAG_RESOLUTIONUNIT, &resunit); TIFFGetFieldDefaulted(tp, TIFFTAG_XRESOLUTION, &xres); TIFFGetFieldDefaulted(tp, TIFFTAG_YRESOLUTION, &yres); TIFFGetFieldDefaulted(tp, TIFFTAG_ORIENTATION, &orient); /* put out our image */ - putimage(orient, (uint32)xsiz, (uint32)ysiz, xres, yres, resunit, pix); + if (putimage(orient, (uint32)xsiz, (uint32)ysiz, + xres, yres, resunit, pix) != 0) + return(-1); /* free data and we're done */ - free((char *)pix); + free((void *)pix); + return(0); } @@ -274,8 +289,8 @@ BYTE *pd; if (TIFFWriteScanline(tifout, pd + y*3*xs, y, 0) < 0) goto writerr; } - return; /* all done! */ + return(0); /* all done! */ writerr: fputs("Error writing TIFF output\n", stderr); - exit(2); + return(-1); }