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, 3 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

# Content
1 /* RCSid $Id: tonemap.h,v 3.31 2021/03/18 16:56:03 greg Exp $ */
2 /*
3 * Header file for tone mapping functions.
4 *
5 * Include after "color.h"
6 */
7 #ifndef _RAD_TONEMAP_H_
8 #define _RAD_TONEMAP_H_
9
10 #include "tiff.h" /* needed for int32, etc. */
11
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15
16 /**** 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 #define TM_F_NOSTDERR 0400 /* don't report errors to stderr */
27 /* 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 (uby8 *)NULL /* indicate no chrominance */
36 #define TM_NOCHROMP (uby8 **)NULL /* indicate no chrominances */
37 #define TM_GETFILE (FILE *)NULL /* indicate file must be opened */
38
39
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 #define TM_E_CODERR1 6 /* code consistency error 1 */
49 #define TM_E_CODERR2 7 /* code consistency error 2 */
50
51
52 /**** Conversion Constants and Table Sizes ****/
53
54 #define TM_BRTSCALE 256 /* brightness scale factor (integer) */
55
56 #define TM_NOBRT (~0x7fff) /* bogus brightness value */
57 #define TM_NOLUM (1e-17) /* ridiculously small luminance */
58
59 #define TM_BRES 4096 /* luminance tone-map resolution */
60
61 #define TM_MAXPKG 8 /* maximum number of color formats */
62
63
64 /**** Global Data Types and Structures ****/
65
66 #ifndef HIST_TYP
67 #define HIST_TYP unsigned long
68 #endif
69 #ifndef TMAP_TYP
70 #define TMAP_TYP uint16
71 #endif
72
73 extern char *tmErrorMessage[]; /* error messages */
74
75 typedef short TMbright; /* encoded luminance type */
76
77 /* basic tone mapping data structure */
78 typedef struct {
79 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 int cdiv[3]; /* computed color divisors */
84 RGBPRIMP inppri; /* current input primaries */
85 double inpsf; /* current input scalefactor */
86 void *inpdat; /* current input client data */
87 COLORMAT cmat; /* color conversion matrix */
88 TMbright hbrmin, hbrmax; /* histogram brightness limits */
89 HIST_TYP *histo; /* input histogram */
90 TMbright mbrmin, mbrmax; /* mapped brightness limits */
91 TMAP_TYP *lumap; /* computed luminance map */
92 void *pd[TM_MAXPKG]; /* pointers to private data */
93 int lastError; /* last error incurred */
94 const char *lastFunc; /* error-generating function name */
95 } TMstruct;
96
97 /* conversion package functions */
98 struct tmPackage {
99 void * (*Init)(TMstruct *tms);
100 void (*NewSpace)(TMstruct *tms);
101 void (*Free)(void *pp);
102 };
103 /* our list of conversion packages */
104 extern struct tmPackage *tmPkg[TM_MAXPKG];
105 extern int tmNumPkgs; /* number of registered packages */
106
107
108 /**** Useful Macros ****/
109
110 /* compute luminance from encoded value */
111 #define tmLuminance(li) exp((li)*(1./TM_BRTSCALE))
112
113 /* 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 /**** Library Function Calls ****/
125
126 extern TMbright
127 tmCvLuminance(double lum);
128 /*
129 Convert a single luminance value to an encoded brightness value.
130 */
131
132 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 extern TMstruct *
145 tmInit(int flags, RGBPRIMP monpri, double gamval);
146 /*
147 Allocate and initialize new tone mapping.
148
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 returns - new tone-mapping pointer, or NULL if no memory.
154 */
155
156 extern int
157 tmSetSpace(TMstruct *tms, RGBPRIMP pri, double sf, void *dat);
158 /*
159 Set color primaries and scale factor for incoming scanlines.
160
161 tms - tone mapping structure pointer.
162 pri - RGB color input primaries (Note 1).
163 sf - scale factor to get to luminance in cd/m^2.
164 dat - application-specific data (NULL if not needed)
165
166 returns - 0 on success, TM_E_* code on failure.
167 */
168
169 extern void
170 tmClearHisto(TMstruct *tms);
171 /*
172 Clear histogram for current tone mapping.
173
174 tms - tone mapping structure pointer.
175 */
176
177 extern int
178 tmAddHisto(TMstruct *tms, TMbright *ls, int len, int wt);
179 /*
180 Add brightness values to current histogram.
181
182 tms - tone mapping structure pointer.
183 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 tmFixedMapping(TMstruct *tms, double expmult, double gamval, double Lddyn);
192 /*
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 tms - tone mapping structure pointer.
200 expmult - the fixed exposure multiplier to use.
201 gamval - display gamma response (0. for default).
202 Lddyn - the display's dynamic range (0. for default).
203
204 returns - 0 on success, TM_E_* on error.
205 */
206
207 extern int
208 tmComputeMapping(TMstruct *tms, double gamval, double Lddyn, double Ldmax);
209 /*
210 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
215 tms - tone mapping structure pointer.
216 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 tmMapPixels(TMstruct *tms, uby8 *ps, TMbright *ls, uby8 *cs, int len);
225 /*
226 Apply tone mapping function to pixel values.
227
228 tms - tone mapping structure pointer.
229 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 extern TMstruct *
238 tmDup(TMstruct *orig);
239 /*
240 Duplicate the given tone mapping into a new struct.
241
242 orig - tone mapping structure to duplicate.
243
244 returns - pointer to new struct, or NULL on error.
245 */
246
247 extern void
248 tmDone(TMstruct *tms);
249 /*
250 Free data associated with the given tone mapping structure.
251
252 tms - tone mapping structure to free.
253 */
254
255 extern int
256 tmCvGrays(TMstruct *tms, TMbright *ls, float *scan, int len);
257 /*
258 Convert gray float scanline to encoded luminance.
259
260 tms - tone mapping structure pointer.
261 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 tmCvColors(TMstruct *tms, TMbright *ls, uby8 *cs, COLOR *scan, int len);
270 /*
271 Convert RGB/XYZ float scanline to encoded luminance and chrominance.
272
273 tms - tone mapping structure pointer.
274 ls - returned encoded luminance values.
275 cs - returned encoded chrominance values (Note 2).
276 scan - input scanline.
277 len - scanline length.
278
279 returns - 0 on success, TM_E_* on error.
280 */
281
282 extern int
283 tmCvColrs(TMstruct *tms, TMbright *ls, uby8 *cs, COLR *scan, int len);
284 /*
285 Convert RGBE/XYZE scanline to encoded luminance and chrominance.
286
287 tms - tone mapping structure pointer.
288 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 tmLoadPicture(TMstruct *tms, TMbright **lpp, uby8 **cpp, int *xp, int *yp,
298 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 tms - tone mapping structure pointer.
306 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 tmMapPicture(uby8 **psp, int *xp, int *yp, int flags,
317 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 extern int
341 tmCvRGB48(TMstruct *tms, TMbright *ls, uby8 *cs, uint16 (*scan)[3],
342 int len, double gv);
343 /*
344 Convert 48-bit RGB scanline to encoded luminance and chrominance.
345
346 tms - tone mapping structure pointer.
347 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 tmCvGray16(TMstruct *tms, TMbright *ls, uint16 *scan, int len, double gv);
358 /*
359 Convert 16-bit gray scanline to encoded luminance.
360
361 tms - tone mapping structure pointer.
362 ls - returned encoded luminance values.
363 scan - input scanline.
364 len - scanline length.
365 gv - input gamma value.
366
367 returns - 0 on success, TM_E_* on error.
368 */
369
370 /**** 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 by tmComputeMapping() to compute the luminance mapping function.
379 (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 same array to store the mapped pixels as used to store
392 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
441 #ifdef __cplusplus
442 }
443 #endif
444 #endif /* _RAD_TONEMAP_H_ */
445