ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/tonemap.h
Revision: 3.19
Committed: Fri Jan 7 22:05:30 2005 UTC (19 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R7P2, rad3R7P1
Changes since 3.18: +4 -2 lines
Log Message:
Added client data pointer to tmSetSpace() call

File Contents

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