ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/tonemap.h
Revision: 3.17
Committed: Fri Jan 7 20:33:02 2005 UTC (19 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 3.16: +40 -59 lines
Log Message:
Modernized tone-mapping routines with structure pointer r.t. stack

File Contents

# User Rev Content
1 greg 3.17 /* RCSid $Id: tonemap.h,v 3.16 2003/07/14 22:23:59 schorsch 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 gregl 3.6 extern int tmLastError; /* last error incurred by library */
70     extern char *tmLastFunction; /* error-generating function name */
71 greg 3.1
72     typedef short TMbright; /* encoded luminance type */
73    
74     /* basic tone mapping data structure */
75 greg 3.17 typedef struct tmStruct {
76 greg 3.1 int flags; /* flags of what to do */
77     RGBPRIMP monpri; /* monitor RGB primaries */
78     double mongam; /* monitor gamma value (approx.) */
79     COLOR clf; /* computed luminance coefficients */
80 greg 3.4 int cdiv[3]; /* computed color divisors */
81 greg 3.1 RGBPRIMP inppri; /* current input primaries */
82     double inpsf; /* current input scalefactor */
83     COLORMAT cmat; /* color conversion matrix */
84 gregl 3.7 TMbright hbrmin, hbrmax; /* histogram brightness limits */
85 greg 3.1 int *histo; /* input histogram */
86 gregl 3.7 TMbright mbrmin, mbrmax; /* mapped brightness limits */
87 greg 3.1 unsigned short *lumap; /* computed luminance map */
88 greg 3.4 MEM_PTR pd[TM_MAXPKG]; /* pointers to private data */
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     returns - 0 on success, TM_E_* on error.
179     */
180    
181     extern int
182 greg 3.17 tmComputeMapping(TMstruct *tms, double gamval, double Lddyn, double Ldmax);
183 greg 3.1 /*
184 greg 3.11 Compute tone mapping function from the current histogram.
185     This mapping will be used in subsequent calls to tmMapPixels()
186     until a new tone mapping is computed.
187     I.e., calls to tmAddHisto() have no immediate effect.
188 greg 3.1
189 greg 3.17 tms - tone mapping structure pointer.
190 greg 3.1 gamval - display gamma response (0. for default).
191     Lddyn - the display's dynamic range (0. for default).
192     Ldmax - maximum display luminance in cd/m^2 (0. for default).
193    
194     returns - 0 on success, TM_E_* on failure.
195     */
196    
197     extern int
198 greg 3.17 tmMapPixels(TMstruct *tms, BYTE *ps, TMbright *ls, BYTE *cs, int len);
199 greg 3.1 /*
200     Apply tone mapping function to pixel values.
201    
202 greg 3.17 tms - tone mapping structure pointer.
203 greg 3.1 ps - returned pixel values (Note 2).
204     ls - encoded luminance values.
205     cs - encoded chrominance values (Note 2).
206     len - number of pixels.
207    
208     returns - 0 on success, TM_E_* on failure.
209     */
210    
211 greg 3.17 extern TMstruct *
212     tmDup(TMstruct *orig);
213 greg 3.3 /*
214 greg 3.17 Duplicate the given tone mapping into a new struct.
215 greg 3.3
216 greg 3.17 orig - tone mapping structure to duplicate.
217     returns - pointer to new struct, or NULL on error.
218 greg 3.3 */
219    
220 greg 3.1 extern void
221 greg 3.17 tmDone(TMstruct *tms);
222 greg 3.1 /*
223     Free data associated with the given tone mapping structure.
224    
225     tms - tone mapping structure to free.
226     */
227    
228 greg 3.11 extern int
229 greg 3.17 tmCvColors(TMstruct *tms, TMbright *ls, BYTE *cs, COLOR *scan, int len);
230 greg 3.11 /*
231     Convert RGB/XYZ float scanline to encoded luminance and chrominance.
232    
233 greg 3.17 tms - tone mapping structure pointer.
234 greg 3.11 ls - returned encoded luminance values.
235     cs - returned encoded chrominance values (Note 2).
236     scan - input scanline.
237     len - scanline length.
238    
239     returns - 0 on success, TM_E_* on error.
240     */
241    
242     extern int
243 greg 3.17 tmCvGrays(TMstruct *tms, TMbright *ls, float *scan, int len);
244 greg 3.11 /*
245     Convert gray float scanline to encoded luminance.
246    
247 greg 3.17 tms - tone mapping structure pointer.
248 greg 3.11 ls - returned encoded luminance values.
249     scan - input scanline.
250     len - scanline length.
251    
252     returns - 0 on success, TM_E_* on error.
253     */
254    
255     extern int
256 greg 3.17 tmCvColrs(TMstruct *tms, TMbright *ls, BYTE *cs, COLR *scan, int len);
257 greg 3.11 /*
258     Convert RGBE/XYZE scanline to encoded luminance and chrominance.
259    
260 greg 3.17 tms - tone mapping structure pointer.
261 greg 3.11 ls - returned encoded luminance values.
262     cs - returned encoded chrominance values (Note 2).
263     scan - input scanline.
264     len - scanline length.
265    
266     returns - 0 on success, TM_E_* on error.
267     */
268    
269     extern int
270 greg 3.17 tmLoadPicture(TMstruct *tms, TMbright **lpp, BYTE **cpp, int *xp, int *yp,
271 greg 3.11 char *fname, FILE *fp);
272     /*
273     Load Radiance picture and convert to tone mapping representation.
274     Memory for the luminance and chroma arrays is allocated using
275     malloc(3), and should be freed with free(3) when no longer needed.
276     Calls tmSetSpace() to calibrate input color space.
277    
278 greg 3.17 tms - tone mapping structure pointer.
279 greg 3.11 lpp - returned array of encoded luminances, picture ordering.
280     cpp - returned array of encoded chrominances (Note 2).
281     xp, yp - returned picture dimensions.
282     fname - picture file name.
283     fp - pointer to open file (Note 3).
284    
285     returns - 0 on success, TM_E_* on failure.
286     */
287    
288     extern int
289     tmMapPicture(BYTE **psp, int *xp, int *yp, int flags,
290     RGBPRIMP monpri, double gamval, double Lddyn, double Ldmax,
291     char *fname, FILE *fp);
292     /*
293     Load and apply tone mapping to Radiance picture.
294     If fp is TM_GETFILE and (flags&TM_F_UNIMPL)!=0, tmMapPicture()
295     calls pcond to perform the actual conversion, which takes
296     longer but gives access to all the TM_F_* features.
297     Memory for the final pixel array is allocated using malloc(3),
298     and should be freed with free(3) when it is no longer needed.
299    
300     psp - returned array of tone mapped pixels, picture ordering.
301     xp, yp - returned picture dimensions.
302     flags - TM_F_* flags indicating what is to be done.
303     monpri - display monitor primaries (Note 1).
304     gamval - display gamma response.
305     Lddyn - the display's dynamic range (0. for default).
306     Ldmax - maximum display luminance in cd/m^2 (0. for default).
307     fname - picture file name.
308     fp - pointer to open file (Note 3).
309    
310     returns - 0 on success, TM_E_* on failure.
311     */
312    
313 greg 3.15 extern int
314 greg 3.17 tmCvRGB48(TMstruct *tms, TMbright *ls, BYTE *cs, uint16 (*scan)[3],
315     int len, double gv);
316 greg 3.15 /*
317     Convert 48-bit RGB scanline to encoded luminance and chrominance.
318    
319 greg 3.17 tms - tone mapping structure pointer.
320 greg 3.15 ls - returned encoded luminance values.
321     cs - returned encoded chrominance values (Note 2).
322     scan - input scanline.
323     len - scanline length.
324     gv - input gamma value.
325    
326     returns - 0 on success, TM_E_* on error.
327     */
328    
329     extern int
330 greg 3.17 tmCvGray16(TMstruct *tms, TMbright *ls, uint16 *scan, int len, double gv);
331 greg 3.15 /*
332     Convert 16-bit gray scanline to encoded luminance.
333    
334 greg 3.17 tms - tone mapping structure pointer.
335 greg 3.15 ls - returned encoded luminance values.
336     scan - input scanline.
337     len - scanline length.
338     gv - input gamma value.
339 greg 3.4
340 greg 3.15 returns - 0 on success, TM_E_* on error.
341     */
342 greg 3.4
343 greg 3.1 /**** Notes ****/
344     /*
345     General:
346    
347     The usual sequence after calling tmInit() is to convert some
348     pixel values to chroma and luminance encodings, which can
349     be passed to tmAddHisto() to put into the tone mapping histogram.
350     This histogram is then used along with the display parameters
351 greg 3.5 by tmComputeMapping() to compute the luminance mapping function.
352 greg 3.1 (Colors are tone-mapped as they are converted if TM_F_MESOPIC
353     is set.) The encoded chroma and luminance values may then be
354     passed to tmMapPixels() to apply the computed tone mapping in
355     a second pass.
356    
357     Especially for RGBE colors in the same color space as the
358     target display, the conversion to chroma and luminance values
359     is fast enough that it may be recomputed on the second pass
360     if memory is at a premium. (Since the chroma values are only
361     used during final mapping, setting the cs parameter to TM_NOCHROM
362     on the first pass will save time.) Another memory saving option
363     if third and subsequent passes are not needed is to use the
364 greg 3.3 same array to store the mapped pixels as used to store
365 greg 3.1 the encoded chroma values. This way, only two extra bytes
366     for storing encoded luminances are required per pixel. This
367     is the method employed by tmMapPicture(), for example.
368     */
369     /*
370     Note 1:
371    
372     All RGBPRIMP values should be pointers to static structures.
373     I.e., the same pointer should be used for the same primaries,
374     and those primaries should not change from one call to the next.
375     This is because the routines use the pointer value to identify
376     computed conversion matrices, so the matrices do not have to be
377     rebuilt each time. If you are using the standard primaries,
378     use the standard primary pointer, stdprims.
379    
380     To indicate a set of input primaries are actually CIE XYZ,
381     the TM_XYZPRIM macro may be passed. If the input primaries
382     are unknown, it is wisest to pass tmTop->monpri to tmSetSpace().
383     By default, the input primaries equal the monitor primaries
384     and the scalefactor is set to WHTEFFICACY in tmInit().
385     */
386     /*
387     Note 2:
388    
389     Chrominance is optional in most of these routines, whether
390     TM_F_BW is set or not. Passing a value of TM_NOCHROM (or
391     TM_NOCHROMP for picture reading) indicates that returned
392     color values are not desired.
393    
394     If TM_NOCHROM is passed to a mapping routine expecting chroma
395     input, it will do without it and return luminance channel
396     rather than RGB pixel values. Otherwise, the array for
397     returned pixel values may be the same array used to pass
398     encoded chrominances if no other mappings are desired.
399     */
400     /*
401     Note 3:
402    
403     Picture files may either be opened by the calling routine or by
404     the library function. If opened by the calling routine, the
405     pointer to the stream is passed, which may be a pipe or other
406     non-seekable input as it is only read once. It must be
407     positioned at the beginning when the function is called, and it
408     will be positioned at the end on return. It will not be closed.
409     If the passed stream pointer is TM_GETFILE, then the library
410     function will open the file, read its contents and close it
411     before returning, whether or not an error was encountered.
412     */
413 greg 3.11
414     #ifdef __cplusplus
415     }
416     #endif
417 schorsch 3.13 #endif /* _RAD_TONEMAP_H_ */
418