ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/tonemap.h
Revision: 3.21
Committed: Tue Nov 15 06:53:00 2005 UTC (18 years, 5 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 3.20: +6 -1 lines
Log Message:
Added tmCvLuminance() call

File Contents

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