ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/tmaptiff.c
Revision: 3.2
Committed: Tue Feb 25 02:47:22 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R5
Changes since 3.1: +1 -56 lines
Log Message:
Replaced inline copyright notice with #include "copyright.h"

File Contents

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