ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/tonemap.h
Revision: 3.18
Committed: Fri Jan 7 21:41:06 2005 UTC (19 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 3.17: +5 -3 lines
Log Message:
Moved error codes inside passed TMstruct

File Contents

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