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

# Content
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 #include "copyright.h"
11
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 }