ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/tonemap.h
Revision: 3.27
Committed: Wed Jan 6 19:25:00 2021 UTC (4 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 3.26: +8 -4 lines
Log Message:
refactor: added defined types for histogram and map tables

File Contents

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