ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/tonemap.h
Revision: 3.19
Committed: Fri Jan 7 22:05:30 2005 UTC (19 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R7P2, rad3R7P1
Changes since 3.18: +4 -2 lines
Log Message:
Added client data pointer to tmSetSpace() call

File Contents

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