ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/tonemap.h
Revision: 3.18
Committed: Fri Jan 7 21:41:06 2005 UTC (19 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 3.17: +5 -3 lines
Log Message:
Moved error codes inside passed TMstruct

File Contents

# User Rev Content
1 greg 3.18 /* RCSid $Id: tonemap.h,v 3.17 2005/01/07 20:33:02 greg Exp $ */
2 greg 3.1 /*
3     * Header file for tone mapping functions.
4 gwlarson 3.8 *
5     * Include after "color.h"
6 greg 3.1 */
7 schorsch 3.13 #ifndef _RAD_TONEMAP_H_
8     #define _RAD_TONEMAP_H_
9 schorsch 3.16
10     #include "tifftypes.h"
11    
12 greg 3.11 #ifdef __cplusplus
13     extern "C" {
14     #endif
15 greg 3.15
16 greg 3.1 /**** Argument Macros ****/
17     /* Flags of what to do */
18     #define TM_F_HCONTR 01 /* human contrast sensitivity */
19     #define TM_F_MESOPIC 02 /* mesopic color sensitivity */
20     #define TM_F_LINEAR 04 /* linear brightness mapping */
21     #define TM_F_ACUITY 010 /* acuity adjustment */
22     #define TM_F_VEIL 020 /* veiling glare */
23     #define TM_F_CWEIGHT 040 /* center weighting */
24     #define TM_F_FOVEAL 0100 /* use foveal sample size */
25     #define TM_F_BW 0200 /* luminance only */
26 greg 3.2 #define TM_F_NOSTDERR 0400 /* don't report errors to stderr */
27 greg 3.1 /* combined modes */
28     #define TM_F_CAMERA 0
29     #define TM_F_HUMAN (TM_F_HCONTR|TM_F_MESOPIC|TM_F_VEIL|\
30     TM_F_ACUITY|TM_F_FOVEAL)
31     #define TM_F_UNIMPL (TM_F_CWEIGHT|TM_F_VEIL|TM_F_ACUITY|TM_F_FOVEAL)
32    
33     /* special pointer values */
34     #define TM_XYZPRIM (RGBPRIMP)NULL /* indicate XYZ primaries (Note 1) */
35     #define TM_NOCHROM (BYTE *)NULL /* indicate no chrominance */
36     #define TM_NOCHROMP (BYTE **)NULL /* indicate no chrominances */
37     #define TM_GETFILE (FILE *)NULL /* indicate file must be opened */
38 gwlarson 3.8
39 greg 3.1
40     /**** Error Return Values ****/
41    
42     #define TM_E_OK 0 /* normal return status */
43     #define TM_E_NOMEM 1 /* out of memory */
44     #define TM_E_ILLEGAL 2 /* illegal argument value */
45     #define TM_E_TMINVAL 3 /* no valid tone mapping */
46     #define TM_E_TMFAIL 4 /* cannot compute tone mapping */
47     #define TM_E_BADFILE 5 /* cannot open or understand file */
48 greg 3.4 #define TM_E_CODERR1 6 /* code consistency error 1 */
49     #define TM_E_CODERR2 7 /* code consistency error 2 */
50 greg 3.1
51 greg 3.4
52 greg 3.1 /**** Conversion Constants and Table Sizes ****/
53    
54     #define TM_BRTSCALE 128 /* brightness scale factor (integer) */
55    
56 gwlarson 3.10 #define TM_NOBRT (-1<<15) /* bogus brightness value */
57 greg 3.11 #define TM_NOLUM (1e-17) /* ridiculously small luminance */
58 gwlarson 3.10
59 greg 3.4 #define TM_MAXPKG 8 /* maximum number of color formats */
60 greg 3.1
61    
62 greg 3.4 /**** Global Data Types and Structures ****/
63    
64     #ifndef MEM_PTR
65     #define MEM_PTR void *
66     #endif
67    
68 greg 3.1 extern char *tmErrorMessage[]; /* error messages */
69    
70     typedef short TMbright; /* encoded luminance type */
71    
72     /* basic tone mapping data structure */
73 greg 3.17 typedef struct tmStruct {
74 greg 3.1 int flags; /* flags of what to do */
75     RGBPRIMP monpri; /* monitor RGB primaries */
76     double mongam; /* monitor gamma value (approx.) */
77     COLOR clf; /* computed luminance coefficients */
78 greg 3.4 int cdiv[3]; /* computed color divisors */
79 greg 3.1 RGBPRIMP inppri; /* current input primaries */
80     double inpsf; /* current input scalefactor */
81     COLORMAT cmat; /* color conversion matrix */
82 gregl 3.7 TMbright hbrmin, hbrmax; /* histogram brightness limits */
83 greg 3.1 int *histo; /* input histogram */
84 gregl 3.7 TMbright mbrmin, mbrmax; /* mapped brightness limits */
85 greg 3.1 unsigned short *lumap; /* computed luminance map */
86 greg 3.4 MEM_PTR pd[TM_MAXPKG]; /* pointers to private data */
87 greg 3.18 int lastError; /* last error incurred */
88     const char *lastFunc; /* error-generating function name */
89 greg 3.17 } TMstruct;
90 greg 3.4
91     /* conversion package functions */
92     struct tmPackage {
93 greg 3.17 MEM_PTR (*Init)(TMstruct *tms);
94     void (*NewSpace)(TMstruct *tms);
95 greg 3.4 void (*Free)(MEM_PTR pp);
96     };
97     /* our list of conversion packages */
98     extern struct tmPackage *tmPkg[TM_MAXPKG];
99     extern int tmNumPkgs; /* number of registered packages */
100    
101    
102 greg 3.1 /**** Useful Macros ****/
103    
104 greg 3.4 /* compute luminance from encoded value */
105 greg 3.11 #define tmLuminance(li) exp((li)*(1./TM_BRTSCALE))
106 greg 3.1
107 greg 3.4 /* does tone mapping need color matrix? */
108     #define tmNeedMatrix(t) ((t)->monpri != (t)->inppri)
109    
110     /* register a conversion package */
111     #define tmRegPkg(pf) ( tmNumPkgs >= TM_MAXPKG ? -1 : \
112     (tmPkg[tmNumPkgs] = (pf), tmNumPkgs++) )
113    
114     /* get the specific package's data */
115     #define tmPkgData(t,i) ((t)->pd[i]!=NULL ? (t)->pd[i] : (*tmPkg[i]->Init)(t))
116    
117    
118 greg 3.1 /**** Library Function Calls ****/
119    
120    
121 greg 3.17 extern TMstruct *
122 greg 3.1 tmInit(int flags, RGBPRIMP monpri, double gamval);
123     /*
124 greg 3.17 Allocate and initialize new tone mapping.
125 greg 3.1
126     flags - TM_F_* flags indicating what is to be done.
127     monpri - display monitor primaries (Note 1).
128     gamval - display gamma response (can be approximate).
129    
130 greg 3.17 returns - new tone-mapping pointer, or NULL if no memory.
131 greg 3.1 */
132    
133     extern int
134 greg 3.17 tmSetSpace(TMstruct *tms, RGBPRIMP pri, double sf);
135 greg 3.1 /*
136     Set color primaries and scale factor for incoming scanlines.
137    
138 greg 3.17 tms - tone mapping structure pointer.
139 greg 3.1 pri - RGB color input primaries (Note 1).
140     sf - scale factor to get to luminance in cd/m^2.
141    
142     returns - 0 on success, TM_E_* code on failure.
143     */
144    
145     extern void
146 greg 3.17 tmClearHisto(TMstruct *tms);
147 greg 3.1 /*
148     Clear histogram for current tone mapping.
149 greg 3.17
150     tms - tone mapping structure pointer.
151 greg 3.1 */
152    
153     extern int
154 greg 3.17 tmAddHisto(TMstruct *tms, TMbright *ls, int len, int wt);
155 greg 3.1 /*
156     Add brightness values to current histogram.
157    
158 greg 3.17 tms - tone mapping structure pointer.
159 greg 3.1 ls - encoded luminance values.
160     len - number of luminance values.
161     wt - integer weight to use for each value (usually 1 or -1).
162    
163     returns - 0 on success, TM_E_* on error.
164     */
165    
166     extern int
167 greg 3.17 tmFixedMapping(TMstruct *tms, double expmult, double gamval);
168 greg 3.11 /*
169     Assign a fixed, linear tone-mapping using the given multiplier,
170     which is the ratio of maximum output to uncalibrated input.
171     This mapping will be used in subsequent calls to tmMapPixels()
172     until a new tone mapping is computed.
173     Only the min. and max. values are used from the histogram.
174    
175 greg 3.17 tms - tone mapping structure pointer.
176 greg 3.11 expmult - the fixed exposure multiplier to use.
177     gamval - display gamma response (0. for default).
178 greg 3.18
179 greg 3.11 returns - 0 on success, TM_E_* on error.
180     */
181    
182     extern int
183 greg 3.17 tmComputeMapping(TMstruct *tms, double gamval, double Lddyn, double Ldmax);
184 greg 3.1 /*
185 greg 3.11 Compute tone mapping function from the current histogram.
186     This mapping will be used in subsequent calls to tmMapPixels()
187     until a new tone mapping is computed.
188     I.e., calls to tmAddHisto() have no immediate effect.
189 greg 3.1
190 greg 3.17 tms - tone mapping structure pointer.
191 greg 3.1 gamval - display gamma response (0. for default).
192     Lddyn - the display's dynamic range (0. for default).
193     Ldmax - maximum display luminance in cd/m^2 (0. for default).
194    
195     returns - 0 on success, TM_E_* on failure.
196     */
197    
198     extern int
199 greg 3.17 tmMapPixels(TMstruct *tms, BYTE *ps, TMbright *ls, BYTE *cs, int len);
200 greg 3.1 /*
201     Apply tone mapping function to pixel values.
202    
203 greg 3.17 tms - tone mapping structure pointer.
204 greg 3.1 ps - returned pixel values (Note 2).
205     ls - encoded luminance values.
206     cs - encoded chrominance values (Note 2).
207     len - number of pixels.
208    
209     returns - 0 on success, TM_E_* on failure.
210     */
211    
212 greg 3.17 extern TMstruct *
213     tmDup(TMstruct *orig);
214 greg 3.3 /*
215 greg 3.17 Duplicate the given tone mapping into a new struct.
216 greg 3.3
217 greg 3.17 orig - tone mapping structure to duplicate.
218 greg 3.18
219 greg 3.17 returns - pointer to new struct, or NULL on error.
220 greg 3.3 */
221    
222 greg 3.1 extern void
223 greg 3.17 tmDone(TMstruct *tms);
224 greg 3.1 /*
225     Free data associated with the given tone mapping structure.
226    
227     tms - tone mapping structure to free.
228     */
229    
230 greg 3.11 extern int
231 greg 3.17 tmCvColors(TMstruct *tms, TMbright *ls, BYTE *cs, COLOR *scan, int len);
232 greg 3.11 /*
233     Convert RGB/XYZ float scanline to encoded luminance and chrominance.
234    
235 greg 3.17 tms - tone mapping structure pointer.
236 greg 3.11 ls - returned encoded luminance values.
237     cs - returned encoded chrominance values (Note 2).
238     scan - input scanline.
239     len - scanline length.
240    
241     returns - 0 on success, TM_E_* on error.
242     */
243    
244     extern int
245 greg 3.17 tmCvGrays(TMstruct *tms, TMbright *ls, float *scan, int len);
246 greg 3.11 /*
247     Convert gray float scanline to encoded luminance.
248    
249 greg 3.17 tms - tone mapping structure pointer.
250 greg 3.11 ls - returned encoded luminance values.
251     scan - input scanline.
252     len - scanline length.
253    
254     returns - 0 on success, TM_E_* on error.
255     */
256    
257     extern int
258 greg 3.17 tmCvColrs(TMstruct *tms, TMbright *ls, BYTE *cs, COLR *scan, int len);
259 greg 3.11 /*
260     Convert RGBE/XYZE scanline to encoded luminance and chrominance.
261    
262 greg 3.17 tms - tone mapping structure pointer.
263 greg 3.11 ls - returned encoded luminance values.
264     cs - returned encoded chrominance values (Note 2).
265     scan - input scanline.
266     len - scanline length.
267    
268     returns - 0 on success, TM_E_* on error.
269     */
270    
271     extern int
272 greg 3.17 tmLoadPicture(TMstruct *tms, TMbright **lpp, BYTE **cpp, int *xp, int *yp,
273 greg 3.11 char *fname, FILE *fp);
274     /*
275     Load Radiance picture and convert to tone mapping representation.
276     Memory for the luminance and chroma arrays is allocated using
277     malloc(3), and should be freed with free(3) when no longer needed.
278     Calls tmSetSpace() to calibrate input color space.
279    
280 greg 3.17 tms - tone mapping structure pointer.
281 greg 3.11 lpp - returned array of encoded luminances, picture ordering.
282     cpp - returned array of encoded chrominances (Note 2).
283     xp, yp - returned picture dimensions.
284     fname - picture file name.
285     fp - pointer to open file (Note 3).
286    
287     returns - 0 on success, TM_E_* on failure.
288     */
289    
290     extern int
291     tmMapPicture(BYTE **psp, int *xp, int *yp, int flags,
292     RGBPRIMP monpri, double gamval, double Lddyn, double Ldmax,
293     char *fname, FILE *fp);
294     /*
295     Load and apply tone mapping to Radiance picture.
296     If fp is TM_GETFILE and (flags&TM_F_UNIMPL)!=0, tmMapPicture()
297     calls pcond to perform the actual conversion, which takes
298     longer but gives access to all the TM_F_* features.
299     Memory for the final pixel array is allocated using malloc(3),
300     and should be freed with free(3) when it is no longer needed.
301    
302     psp - returned array of tone mapped pixels, picture ordering.
303     xp, yp - returned picture dimensions.
304     flags - TM_F_* flags indicating what is to be done.
305     monpri - display monitor primaries (Note 1).
306     gamval - display gamma response.
307     Lddyn - the display's dynamic range (0. for default).
308     Ldmax - maximum display luminance in cd/m^2 (0. for default).
309     fname - picture file name.
310     fp - pointer to open file (Note 3).
311    
312     returns - 0 on success, TM_E_* on failure.
313     */
314    
315 greg 3.15 extern int
316 greg 3.17 tmCvRGB48(TMstruct *tms, TMbright *ls, BYTE *cs, uint16 (*scan)[3],
317     int len, double gv);
318 greg 3.15 /*
319     Convert 48-bit RGB scanline to encoded luminance and chrominance.
320    
321 greg 3.17 tms - tone mapping structure pointer.
322 greg 3.15 ls - returned encoded luminance values.
323     cs - returned encoded chrominance values (Note 2).
324     scan - input scanline.
325     len - scanline length.
326     gv - input gamma value.
327    
328     returns - 0 on success, TM_E_* on error.
329     */
330    
331     extern int
332 greg 3.17 tmCvGray16(TMstruct *tms, TMbright *ls, uint16 *scan, int len, double gv);
333 greg 3.15 /*
334     Convert 16-bit gray scanline to encoded luminance.
335    
336 greg 3.17 tms - tone mapping structure pointer.
337 greg 3.15 ls - returned encoded luminance values.
338     scan - input scanline.
339     len - scanline length.
340     gv - input gamma value.
341 greg 3.4
342 greg 3.15 returns - 0 on success, TM_E_* on error.
343     */
344 greg 3.4
345 greg 3.1 /**** Notes ****/
346     /*
347     General:
348    
349     The usual sequence after calling tmInit() is to convert some
350     pixel values to chroma and luminance encodings, which can
351     be passed to tmAddHisto() to put into the tone mapping histogram.
352     This histogram is then used along with the display parameters
353 greg 3.5 by tmComputeMapping() to compute the luminance mapping function.
354 greg 3.1 (Colors are tone-mapped as they are converted if TM_F_MESOPIC
355     is set.) The encoded chroma and luminance values may then be
356     passed to tmMapPixels() to apply the computed tone mapping in
357     a second pass.
358    
359     Especially for RGBE colors in the same color space as the
360     target display, the conversion to chroma and luminance values
361     is fast enough that it may be recomputed on the second pass
362     if memory is at a premium. (Since the chroma values are only
363     used during final mapping, setting the cs parameter to TM_NOCHROM
364     on the first pass will save time.) Another memory saving option
365     if third and subsequent passes are not needed is to use the
366 greg 3.3 same array to store the mapped pixels as used to store
367 greg 3.1 the encoded chroma values. This way, only two extra bytes
368     for storing encoded luminances are required per pixel. This
369     is the method employed by tmMapPicture(), for example.
370     */
371     /*
372     Note 1:
373    
374     All RGBPRIMP values should be pointers to static structures.
375     I.e., the same pointer should be used for the same primaries,
376     and those primaries should not change from one call to the next.
377     This is because the routines use the pointer value to identify
378     computed conversion matrices, so the matrices do not have to be
379     rebuilt each time. If you are using the standard primaries,
380     use the standard primary pointer, stdprims.
381    
382     To indicate a set of input primaries are actually CIE XYZ,
383     the TM_XYZPRIM macro may be passed. If the input primaries
384     are unknown, it is wisest to pass tmTop->monpri to tmSetSpace().
385     By default, the input primaries equal the monitor primaries
386     and the scalefactor is set to WHTEFFICACY in tmInit().
387     */
388     /*
389     Note 2:
390    
391     Chrominance is optional in most of these routines, whether
392     TM_F_BW is set or not. Passing a value of TM_NOCHROM (or
393     TM_NOCHROMP for picture reading) indicates that returned
394     color values are not desired.
395    
396     If TM_NOCHROM is passed to a mapping routine expecting chroma
397     input, it will do without it and return luminance channel
398     rather than RGB pixel values. Otherwise, the array for
399     returned pixel values may be the same array used to pass
400     encoded chrominances if no other mappings are desired.
401     */
402     /*
403     Note 3:
404    
405     Picture files may either be opened by the calling routine or by
406     the library function. If opened by the calling routine, the
407     pointer to the stream is passed, which may be a pipe or other
408     non-seekable input as it is only read once. It must be
409     positioned at the beginning when the function is called, and it
410     will be positioned at the end on return. It will not be closed.
411     If the passed stream pointer is TM_GETFILE, then the library
412     function will open the file, read its contents and close it
413     before returning, whether or not an error was encountered.
414     */
415 greg 3.11
416     #ifdef __cplusplus
417     }
418     #endif
419 schorsch 3.13 #endif /* _RAD_TONEMAP_H_ */
420