ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/tonemap.h
Revision: 3.29
Committed: Thu Jan 7 19:13:57 2021 UTC (3 years, 5 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 3.28: +4 -2 lines
Log Message:
fix: fixed issue with last change and made it so TMAP_TYP can be float

File Contents

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