ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/tonemap.h
Revision: 3.21
Committed: Tue Nov 15 06:53:00 2005 UTC (18 years, 5 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 3.20: +6 -1 lines
Log Message:
Added tmCvLuminance() call

File Contents

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