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 (3 years, 5 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

# Content
1 /* RCSid $Id: tonemap.h,v 3.26 2011/05/20 02:06:38 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_MAXPKG 8 /* maximum number of color formats */
60
61
62 /**** Global Data Types and Structures ****/
63
64 #ifndef MEM_PTR
65 #define MEM_PTR void *
66 #endif
67 #ifndef HIST_TYP
68 #define HIST_TYP unsigned long
69 #endif
70 #define TMAP_TYP unsigned short
71
72 extern char *tmErrorMessage[]; /* error messages */
73
74 typedef short TMbright; /* encoded luminance type */
75
76 /* basic tone mapping data structure */
77 typedef struct {
78 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 int cdiv[3]; /* computed color divisors */
83 RGBPRIMP inppri; /* current input primaries */
84 double inpsf; /* current input scalefactor */
85 MEM_PTR inpdat; /* current input client data */
86 COLORMAT cmat; /* color conversion matrix */
87 TMbright hbrmin, hbrmax; /* histogram brightness limits */
88 HIST_TYP *histo; /* input histogram */
89 TMbright mbrmin, mbrmax; /* mapped brightness limits */
90 TMAP_TYP *lumap; /* computed luminance map */
91 MEM_PTR pd[TM_MAXPKG]; /* pointers to private data */
92 int lastError; /* last error incurred */
93 const char *lastFunc; /* error-generating function name */
94 } TMstruct;
95
96 /* conversion package functions */
97 struct tmPackage {
98 MEM_PTR (*Init)(TMstruct *tms);
99 void (*NewSpace)(TMstruct *tms);
100 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 /**** Useful Macros ****/
108
109 /* compute luminance from encoded value */
110 #define tmLuminance(li) exp((li)*(1./TM_BRTSCALE))
111
112 /* 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 /**** Library Function Calls ****/
124
125 extern TMbright
126 tmCvLuminance(double lum);
127 /*
128 Convert a single luminance value to an encoded brightness value.
129 */
130
131 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 extern TMstruct *
144 tmInit(int flags, RGBPRIMP monpri, double gamval);
145 /*
146 Allocate and initialize new tone mapping.
147
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 returns - new tone-mapping pointer, or NULL if no memory.
153 */
154
155 extern int
156 tmSetSpace(TMstruct *tms, RGBPRIMP pri, double sf, MEM_PTR dat);
157 /*
158 Set color primaries and scale factor for incoming scanlines.
159
160 tms - tone mapping structure pointer.
161 pri - RGB color input primaries (Note 1).
162 sf - scale factor to get to luminance in cd/m^2.
163 dat - application-specific data (NULL if not needed)
164
165 returns - 0 on success, TM_E_* code on failure.
166 */
167
168 extern void
169 tmClearHisto(TMstruct *tms);
170 /*
171 Clear histogram for current tone mapping.
172
173 tms - tone mapping structure pointer.
174 */
175
176 extern int
177 tmAddHisto(TMstruct *tms, TMbright *ls, int len, int wt);
178 /*
179 Add brightness values to current histogram.
180
181 tms - tone mapping structure pointer.
182 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 tmFixedMapping(TMstruct *tms, double expmult, double gamval);
191 /*
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 tms - tone mapping structure pointer.
199 expmult - the fixed exposure multiplier to use.
200 gamval - display gamma response (0. for default).
201
202 returns - 0 on success, TM_E_* on error.
203 */
204
205 extern int
206 tmComputeMapping(TMstruct *tms, double gamval, double Lddyn, double Ldmax);
207 /*
208 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
213 tms - tone mapping structure pointer.
214 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 tmMapPixels(TMstruct *tms, uby8 *ps, TMbright *ls, uby8 *cs, int len);
223 /*
224 Apply tone mapping function to pixel values.
225
226 tms - tone mapping structure pointer.
227 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 extern TMstruct *
236 tmDup(TMstruct *orig);
237 /*
238 Duplicate the given tone mapping into a new struct.
239
240 orig - tone mapping structure to duplicate.
241
242 returns - pointer to new struct, or NULL on error.
243 */
244
245 extern void
246 tmDone(TMstruct *tms);
247 /*
248 Free data associated with the given tone mapping structure.
249
250 tms - tone mapping structure to free.
251 */
252
253 extern int
254 tmCvGrays(TMstruct *tms, TMbright *ls, float *scan, int len);
255 /*
256 Convert gray float scanline to encoded luminance.
257
258 tms - tone mapping structure pointer.
259 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 tmCvColors(TMstruct *tms, TMbright *ls, uby8 *cs, COLOR *scan, int len);
268 /*
269 Convert RGB/XYZ float scanline to encoded luminance and chrominance.
270
271 tms - tone mapping structure pointer.
272 ls - returned encoded luminance values.
273 cs - returned encoded chrominance values (Note 2).
274 scan - input scanline.
275 len - scanline length.
276
277 returns - 0 on success, TM_E_* on error.
278 */
279
280 extern int
281 tmCvColrs(TMstruct *tms, TMbright *ls, uby8 *cs, COLR *scan, int len);
282 /*
283 Convert RGBE/XYZE scanline to encoded luminance and chrominance.
284
285 tms - tone mapping structure pointer.
286 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 tmLoadPicture(TMstruct *tms, TMbright **lpp, uby8 **cpp, int *xp, int *yp,
296 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 tms - tone mapping structure pointer.
304 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 tmMapPicture(uby8 **psp, int *xp, int *yp, int flags,
315 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 extern int
339 tmCvRGB48(TMstruct *tms, TMbright *ls, uby8 *cs, uint16 (*scan)[3],
340 int len, double gv);
341 /*
342 Convert 48-bit RGB scanline to encoded luminance and chrominance.
343
344 tms - tone mapping structure pointer.
345 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 tmCvGray16(TMstruct *tms, TMbright *ls, uint16 *scan, int len, double gv);
356 /*
357 Convert 16-bit gray scanline to encoded luminance.
358
359 tms - tone mapping structure pointer.
360 ls - returned encoded luminance values.
361 scan - input scanline.
362 len - scanline length.
363 gv - input gamma value.
364
365 returns - 0 on success, TM_E_* on error.
366 */
367
368 /**** 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 by tmComputeMapping() to compute the luminance mapping function.
377 (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 same array to store the mapped pixels as used to store
390 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
439 #ifdef __cplusplus
440 }
441 #endif
442 #endif /* _RAD_TONEMAP_H_ */
443