• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*****************************************************************************/
2 // Copyright 2006-2007 Adobe Systems Incorporated
3 // All Rights Reserved.
4 //
5 // NOTICE:  Adobe permits you to use, modify, and distribute this file in
6 // accordance with the terms of the Adobe license agreement accompanying it.
7 /*****************************************************************************/
8 
9 /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_render.h#2 $ */
10 /* $DateTime: 2012/07/31 22:04:34 $ */
11 /* $Change: 840853 $ */
12 /* $Author: tknoll $ */
13 
14 /** \file
15  * Classes for conversion of RAW data to final image.
16  */
17 
18 /*****************************************************************************/
19 
20 #ifndef __dng_render__
21 #define __dng_render__
22 
23 /*****************************************************************************/
24 
25 #include "dng_1d_function.h"
26 #include "dng_auto_ptr.h"
27 #include "dng_classes.h"
28 #include "dng_spline.h"
29 #include "dng_xy_coord.h"
30 
31 /******************************************************************************/
32 
33 /// \brief Curve for pre-exposure-compensation adjustment based on noise floor,
34 /// shadows, and highlight level.
35 
36 class dng_function_exposure_ramp: public dng_1d_function
37 	{
38 
39 	public:
40 
41 		real64 fSlope;		// Slope of straight segment.
42 
43 		real64 fBlack;		// Intercept of straight segment.
44 
45 		real64 fRadius;		// Rounding radius.
46 
47 		real64 fQScale;		// Quadradic scale.
48 
49 	public:
50 
51 		dng_function_exposure_ramp (real64 white,
52 				   					real64 black,
53 				   					real64 minBlack);
54 
55 		virtual real64 Evaluate (real64 x) const;
56 
57 	};
58 
59 /******************************************************************************/
60 
61 /// \brief Exposure compensation curve for a given compensation amount in stops using
62 /// quadric for roll-off.
63 
64 class dng_function_exposure_tone: public dng_1d_function
65 	{
66 
67 	protected:
68 
69 		bool fIsNOP;		// Is this a NOP function?
70 
71 		real64 fSlope;		// Slope for lower part of curve.
72 
73 		real64 a;			// Quadradic parameters for upper two f-stops.
74 		real64 b;
75 		real64 c;
76 
77 	public:
78 
79 		dng_function_exposure_tone (real64 exposure);
80 
81 		/// Returns output value for a given input tone.
82 
83 		virtual real64 Evaluate (real64 x) const;
84 
85 	};
86 
87 /*****************************************************************************/
88 
89 /// Default ACR3 tone curve.
90 
91 class dng_tone_curve_acr3_default: public dng_1d_function
92 	{
93 
94 	public:
95 
96 		/// Returns output value for a given input tone.
97 
98 		virtual real64 Evaluate (real64 x) const;
99 
100 		/// Returns nearest input value for a given output tone.
101 
102 		virtual real64 EvaluateInverse (real64 x) const;
103 
104 		static const dng_1d_function & Get ();
105 
106 	};
107 
108 /*****************************************************************************/
109 
110 /// \brief Encoding gamma curve for a given color space.
111 
112 class dng_function_gamma_encode: public dng_1d_function
113 	{
114 
115 	protected:
116 
117 		const dng_color_space &fSpace;
118 
119 	public:
120 
121 		dng_function_gamma_encode (const dng_color_space &space);
122 
123 		virtual real64 Evaluate (real64 x) const;
124 
125 	};
126 
127 /*****************************************************************************/
128 
129 /// \brief Class used to render digital negative to displayable image.
130 
131 class dng_render
132 	{
133 
134 	protected:
135 
136 		dng_host &fHost;
137 
138 		const dng_negative &fNegative;
139 
140 		dng_xy_coord fWhiteXY;
141 
142 		real64 fExposure;
143 
144 		real64 fShadows;
145 
146 		const dng_1d_function *fToneCurve;
147 
148 		const dng_color_space *fFinalSpace;
149 
150 		uint32 fFinalPixelType;
151 
152 		uint32 fMaximumSize;
153 
154 	private:
155 
156 		AutoPtr<dng_spline_solver> fProfileToneCurve;
157 
158 	public:
159 
160 		/// Construct a rendering instance that will be used to convert a given digital negative.
161 		/// \param host The host to use for memory allocation, progress updates, and abort testing.
162 		/// \param negative The digital negative to convert to a displayable image.
163 
164 		dng_render (dng_host &host,
165 					const dng_negative &negative);
166 
~dng_render()167 		virtual ~dng_render ()
168 			{
169 			}
170 
171 		/// Set the white point to be used for conversion.
172 		/// \param white White point to use.
173 
SetWhiteXY(const dng_xy_coord & white)174 		void SetWhiteXY (const dng_xy_coord &white)
175 			{
176 			fWhiteXY = white;
177 			}
178 
179 		/// Get the white point to be used for conversion.
180 		/// \retval White point to use.
181 
WhiteXY()182 		const dng_xy_coord WhiteXY () const
183 			{
184 			return fWhiteXY;
185 			}
186 
187 		/// Set exposure compensation.
188 		/// \param exposure Compensation value in stops, positive or negative.
189 
SetExposure(real64 exposure)190 		void SetExposure (real64 exposure)
191 			{
192 			fExposure = exposure;
193 			}
194 
195 		/// Get exposure compensation.
196 		/// \retval Compensation value in stops, positive or negative.
197 
Exposure()198 		real64 Exposure () const
199 			{
200 			return fExposure;
201 			}
202 
203 		/// Set shadow clip amount.
204 		/// \param shadows Shadow clip amount.
205 
SetShadows(real64 shadows)206 		void SetShadows (real64 shadows)
207 			{
208 			fShadows = shadows;
209 			}
210 
211 		/// Get shadow clip amount.
212 		/// \retval Shadow clip amount.
213 
Shadows()214 		real64 Shadows () const
215 			{
216 			return fShadows;
217 			}
218 
219 		/// Set custom tone curve for conversion.
220 		/// \param curve 1D function that defines tone mapping to use during conversion.
221 
SetToneCurve(const dng_1d_function & curve)222 		void SetToneCurve (const dng_1d_function &curve)
223 			{
224 			fToneCurve = &curve;
225 			}
226 
227 		/// Get custom tone curve for conversion.
228 		/// \retval 1D function that defines tone mapping to use during conversion.
229 
ToneCurve()230 		const dng_1d_function & ToneCurve () const
231 			{
232 			return *fToneCurve;
233 			}
234 
235 		/// Set final color space in which resulting image data should be represented.
236 		/// (See dng_color_space.h for possible values.)
237 		/// \param space Color space to use.
238 
SetFinalSpace(const dng_color_space & space)239 		void SetFinalSpace (const dng_color_space &space)
240 			{
241 			fFinalSpace = &space;
242 			}
243 
244 		/// Get final color space in which resulting image data should be represented.
245 		/// \retval Color space to use.
246 
FinalSpace()247 		const dng_color_space & FinalSpace () const
248 			{
249 			return *fFinalSpace;
250 			}
251 
252 		/// Set pixel type of final image data.
253 		/// Can be ttByte (default), ttShort, or ttFloat.
254 		/// \param type Pixel type to use.
255 
SetFinalPixelType(uint32 type)256 		void SetFinalPixelType (uint32 type)
257 			{
258 			fFinalPixelType = type;
259 			}
260 
261 		/// Get pixel type of final image data.
262 		/// Can be ttByte (default), ttShort, or ttFloat.
263 		/// \retval Pixel type to use.
264 
FinalPixelType()265 		uint32 FinalPixelType () const
266 			{
267 			return fFinalPixelType;
268 			}
269 
270 		/// Set maximum dimension, in pixels, of resulting image.
271 		/// If final image would have either dimension larger than maximum, the larger
272 		/// of the two dimensions is set to this maximum size and the smaller dimension
273 		/// is adjusted to preserve aspect ratio.
274 		/// \param size Maximum size to allow.
275 
SetMaximumSize(uint32 size)276 		void SetMaximumSize (uint32 size)
277 			{
278 			fMaximumSize = size;
279 			}
280 
281 		/// Get maximum dimension, in pixels, of resulting image.
282 		/// If the final image would have either dimension larger than this maximum, the larger
283 		/// of the two dimensions is set to this maximum size and the smaller dimension
284 		/// is adjusted to preserve the image's aspect ratio.
285 		/// \retval Maximum allowed size.
286 
MaximumSize()287 		uint32 MaximumSize () const
288 			{
289 			return fMaximumSize;
290 			}
291 
292 		/// Actually render a digital negative to a displayable image.
293 		/// Input digital negative is passed to the constructor of this dng_render class.
294 		/// \retval The final resulting image.
295 
296 		virtual dng_image * Render ();
297 
298 	private:
299 
300 		// Hidden copy constructor and assignment operator.
301 
302 		dng_render (const dng_render &render);
303 
304 		dng_render & operator= (const dng_render &render);
305 
306 	};
307 
308 /*****************************************************************************/
309 
310 #endif
311 
312 /*****************************************************************************/
313