ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/tonemap.h
Revision: 3.17
Committed: Fri Jan 7 20:33:02 2005 UTC (19 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 3.16: +40 -59 lines
Log Message:
Modernized tone-mapping routines with structure pointer r.t. stack

File Contents

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