ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/tonemap.h
Revision: 3.32
Committed: Sat Jan 15 16:57:46 2022 UTC (2 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, HEAD
Changes since 3.31: +6 -9 lines
Log Message:
refactor: eliminated use of MEM_PTR and (char *) for untyped memory

File Contents

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