ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/tmaptiff.c
Revision: 3.3
Committed: Sat Feb 22 02:07:28 2003 UTC (22 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 3.2: +0 -0 lines
State: FILE REMOVED
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

# User Rev Content
1 gwlarson 3.1 /* Copyright (c) 1998 Silicon Graphics, Inc. */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ SGI";
5     #endif
6    
7     /*
8     * Perform tone mapping on TIFF input.
9     */
10    
11     #include <stdio.h>
12     #include "tiffio.h"
13     #include "tmprivat.h"
14    
15    
16     int
17     tmLoadTIFF(lpp, cpp, xp, yp, fname, tp) /* load and convert TIFF */
18     TMbright **lpp;
19     BYTE **cpp;
20     int *xp, *yp;
21     char *fname;
22     TIFF *tp;
23     {
24     char *funcName = fname==NULL ? "tmLoadTIFF" : fname;
25     TIFF *tif;
26     int err;
27 gwlarson 3.2 union {uint16 *w; uint32 *l; MEM_PTR p;} sl;
28 gwlarson 3.1 uint16 comp, phot, pconf;
29     uint32 width, height;
30     double stonits;
31     int y;
32     /* check arguments */
33     if (tmTop == NULL)
34     returnErr(TM_E_TMINVAL);
35     if (lpp == NULL | xp == NULL | yp == NULL |
36     (fname == NULL & tp == NULL))
37     returnErr(TM_E_ILLEGAL);
38     /* check/get TIFF tags */
39     sl.p = NULL; *lpp = NULL;
40     if (cpp != TM_NOCHROMP) *cpp = TM_NOCHROM;
41     err = TM_E_BADFILE;
42     if ((tif = tp) == NULL && (tif = TIFFOpen(fname, "r")) == NULL)
43     returnErr(TM_E_BADFILE);
44     TIFFGetFieldDefaulted(tif, TIFFTAG_PHOTOMETRIC, &phot);
45     TIFFGetFieldDefaulted(tif, TIFFTAG_COMPRESSION, &comp);
46     if (!TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width) ||
47     !TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height))
48     goto done;
49     *xp = width; *yp = height;
50     TIFFGetFieldDefaulted(tif, TIFFTAG_PLANARCONFIG, &pconf);
51     if (pconf != PLANARCONFIG_CONTIG)
52     goto done;
53     if (!TIFFGetField(tif, TIFFTAG_STONITS, &stonits))
54     stonits = 1.;
55     if (phot == PHOTOMETRIC_LOGLUV) {
56     if (comp != COMPRESSION_SGILOG && comp != COMPRESSION_SGILOG24)
57     goto done;
58     TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_RAW);
59     sl.l = (uint32 *)malloc(width*sizeof(uint32));
60     if (cpp != TM_NOCHROMP) {
61     *cpp = (BYTE *)malloc(width*height*3*sizeof(BYTE));
62     if (*cpp == NULL) {
63     err = TM_E_NOMEM;
64     goto done;
65     }
66     }
67     } else if (phot == PHOTOMETRIC_LOGL) {
68     if (comp != COMPRESSION_SGILOG)
69     goto done;
70     TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_16BIT);
71     sl.w = (uint16 *)malloc(width*sizeof(uint16));
72     } else
73     goto done;
74     *lpp = (TMbright *)malloc(width*height*sizeof(TMbright));
75     if (sl.p == NULL | *lpp == NULL) {
76     err = TM_E_NOMEM;
77     goto done;
78     }
79     /* set input color space */
80     tmSetSpace(TM_XYZPRIM, stonits);
81     /* read and convert each scanline */
82     for (y = 0; y < height; y++) {
83     if (TIFFReadScanline(tif, sl.p, y, 0) < 0) {
84     err = TM_E_BADFILE;
85     break;
86     }
87     if (phot == PHOTOMETRIC_LOGL)
88     err = tmCvL16(*lpp + y*width, sl.w, width);
89     else if (comp == COMPRESSION_SGILOG24)
90     err = tmCvLuv24(*lpp + y*width,
91     cpp==TM_NOCHROMP ? TM_NOCHROM : *cpp+y*3*width,
92     sl.l, width);
93     else
94     err = tmCvLuv32(*lpp + y*width,
95     cpp==TM_NOCHROMP ? TM_NOCHROM : *cpp+y*3*width,
96     sl.l, width);
97     if (err != TM_E_OK)
98     break;
99     }
100     done: /* clean up */
101     if (tp == NULL)
102     TIFFClose(tif);
103     if (sl.p != NULL)
104     free(sl.p);
105     if (err != TM_E_OK) { /* free buffers on error */
106     if (*lpp != NULL)
107     free((MEM_PTR)*lpp);
108     *lpp = NULL;
109     if (cpp != TM_NOCHROMP) {
110     if (*cpp != TM_NOCHROM)
111     free((MEM_PTR)*cpp);
112     *cpp = NULL;
113     }
114     *xp = *yp = 0;
115     returnErr(err);
116     }
117     returnOK;
118     }
119    
120    
121     /*
122     * Load and tone-map a SGILOG TIFF.
123     * Beware of greyscale input -- you must check the PHOTOMETRIC tag to
124     * determine that the returned array contains only grey values, not RGB.
125     * As in tmMapPicture(), grey values are also returned if flags&TM_F_BW.
126     */
127     int
128     tmMapTIFF(psp, xp, yp, flags, monpri, gamval, Lddyn, Ldmax, fname, tp)
129     BYTE **psp;
130     int *xp, *yp;
131     int flags;
132     RGBPRIMP monpri;
133     double gamval, Lddyn, Ldmax;
134     char *fname;
135     TIFF *tp;
136     {
137     char *funcName = fname==NULL ? "tmMapTIFF" : fname;
138     TMbright *lp;
139     BYTE *cp;
140     int err;
141     /* check arguments */
142     if (psp == NULL | xp == NULL | yp == NULL | monpri == NULL |
143     (fname == NULL & tp == NULL))
144     returnErr(TM_E_ILLEGAL);
145     if (gamval < MINGAM) gamval = DEFGAM;
146     if (Lddyn < MINLDDYN) Lddyn = DEFLDDYN;
147     if (Ldmax < MINLDMAX) Ldmax = DEFLDMAX;
148     if (flags & TM_F_BW) monpri = stdprims;
149     /* initialize tone mapping */
150     if (tmInit(flags, monpri, gamval) == NULL)
151     returnErr(TM_E_NOMEM);
152     /* load and convert TIFF */
153     cp = TM_NOCHROM;
154     err = tmLoadTIFF(&lp, flags&TM_F_BW ? TM_NOCHROMP : &cp,
155     xp, yp, fname, tp);
156     if (err != TM_E_OK) {
157     tmDone(NULL);
158     return(err);
159     }
160     if (cp == TM_NOCHROM) {
161     *psp = (BYTE *)malloc(*xp * *yp * sizeof(BYTE));
162     if (*psp == NULL) {
163     free((MEM_PTR)lp);
164     tmDone(NULL);
165     returnErr(TM_E_NOMEM);
166     }
167     } else
168     *psp = cp;
169     /* compute color mapping */
170     err = tmAddHisto(lp, *xp * *yp, 1);
171     if (err != TM_E_OK)
172     goto done;
173     err = tmComputeMapping(gamval, Lddyn, Ldmax);
174     if (err != TM_E_OK)
175     goto done;
176     /* map pixels */
177     err = tmMapPixels(*psp, lp, cp, *xp * *yp);
178    
179     done: /* clean up */
180     free((MEM_PTR)lp);
181     tmDone(NULL);
182     if (err != TM_E_OK) { /* free memory on error */
183     free((MEM_PTR)*psp);
184     *psp = NULL;
185     *xp = *yp = 0;
186     returnErr(err);
187     }
188     returnOK;
189     }