• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*****************************************************************************/
2 // Copyright 2008-2009 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_gain_map.h#2 $ */
10 /* $DateTime: 2012/07/31 22:04:34 $ */
11 /* $Change: 840853 $ */
12 /* $Author: tknoll $ */
13 
14 /** \file
15  * Opcode to fix 2D uniformity defects, such as shading.
16  */
17 
18 /*****************************************************************************/
19 
20 #ifndef __dng_gain_map__
21 #define __dng_gain_map__
22 
23 /*****************************************************************************/
24 
25 #include "dng_memory.h"
26 #include "dng_misc_opcodes.h"
27 #include "dng_tag_types.h"
28 
29 /*****************************************************************************/
30 
31 /// \brief Holds a discrete (i.e., sampled) 2D representation of a gain map. This is
32 /// effectively an image containing scale factors.
33 
34 class dng_gain_map
35 	{
36 
37 	private:
38 
39 		dng_point fPoints;
40 
41 		dng_point_real64 fSpacing;
42 
43 		dng_point_real64 fOrigin;
44 
45 		uint32 fPlanes;
46 
47 		uint32 fRowStep;
48 
49 		AutoPtr<dng_memory_block> fBuffer;
50 
51 	public:
52 
53 		/// Construct a gain map with the specified memory allocator, number of
54 		/// samples (points), sample spacing, origin, and number of color planes.
55 
56 		dng_gain_map (dng_memory_allocator &allocator,
57 					  const dng_point &points,
58 					  const dng_point_real64 &spacing,
59 					  const dng_point_real64 &origin,
60 					  uint32 planes);
61 
62 		/// The number of samples in the horizontal and vertical directions.
63 
Points()64 		const dng_point & Points () const
65 			{
66 			return fPoints;
67 			}
68 
69 		/// The space between adjacent samples in the horizontal and vertical
70 		/// directions.
71 
Spacing()72 		const dng_point_real64 & Spacing () const
73 			{
74 			return fSpacing;
75 			}
76 
77 		/// The 2D coordinate for the first (i.e., top-left-most) sample.
78 
Origin()79 		const dng_point_real64 & Origin () const
80 			{
81 			return fOrigin;
82 			}
83 
84 		/// The number of color planes.
85 
Planes()86 		uint32 Planes () const
87 			{
88 			return fPlanes;
89 			}
90 
91 		/// Getter for a gain map sample (specified by row, column, and plane).
92 
Entry(uint32 rowIndex,uint32 colIndex,uint32 plane)93 		real32 & Entry (uint32 rowIndex,
94 						uint32 colIndex,
95 						uint32 plane)
96 			{
97 
98 			return *(fBuffer->Buffer_real32 () +
99 				     rowIndex * fRowStep +
100 				     colIndex * fPlanes  +
101 				     plane);
102 
103 			}
104 
105 		/// Getter for a gain map sample (specified by row index, column index, and
106 		/// plane index).
107 
Entry(uint32 rowIndex,uint32 colIndex,uint32 plane)108 		const real32 & Entry (uint32 rowIndex,
109 							  uint32 colIndex,
110 							  uint32 plane) const
111 			{
112 
113 			return *(fBuffer->Buffer_real32 () +
114 				     rowIndex * fRowStep +
115 				     colIndex * fPlanes  +
116 				     plane);
117 
118 			}
119 
120 		/// Compute the interpolated gain (i.e., scale factor) at the specified pixel
121 		/// position and color plane, within the specified image bounds (in pixels).
122 
123 		real32 Interpolate (int32 row,
124 							int32 col,
125 							uint32 plane,
126 							const dng_rect &bounds) const;
127 
128 		/// The number of bytes needed to hold the gain map data.
129 
130 		uint32 PutStreamSize () const;
131 
132 		/// Write the gain map to the specified stream.
133 
134 		void PutStream (dng_stream &stream) const;
135 
136 		/// Read a gain map from the specified stream.
137 
138 		static dng_gain_map * GetStream (dng_host &host,
139 										 dng_stream &stream);
140 
141 	private:
142 
143 		// Hidden copy constructor and assignment operator.
144 
145 		dng_gain_map (const dng_gain_map &map);
146 
147 		dng_gain_map & operator= (const dng_gain_map &map);
148 
149 	};
150 
151 /*****************************************************************************/
152 
153 /// \brief An opcode to fix 2D spatially-varying light falloff or color casts (i.e.,
154 /// uniformity issues). This is commonly due to shading.
155 
156 class dng_opcode_GainMap: public dng_inplace_opcode
157 	{
158 
159 	private:
160 
161 		dng_area_spec fAreaSpec;
162 
163 		AutoPtr<dng_gain_map> fGainMap;
164 
165 	public:
166 
167 		/// Construct a GainMap opcode for the specified image area and the specified
168 		/// gain map.
169 
170 		dng_opcode_GainMap (const dng_area_spec &areaSpec,
171 							AutoPtr<dng_gain_map> &gainMap);
172 
173 		/// Construct a GainMap opcode from the specified stream.
174 
175 		dng_opcode_GainMap (dng_host &host,
176 							dng_stream &stream);
177 
178 		/// Write the opcode to the specified stream.
179 
180 		virtual void PutData (dng_stream &stream) const;
181 
182 		/// The pixel data type of this opcode.
183 
BufferPixelType(uint32)184 		virtual uint32 BufferPixelType (uint32 /* imagePixelType */)
185 			{
186 			return ttFloat;
187 			}
188 
189 		/// The adjusted bounds (processing area) of this opcode. It is limited to
190 		/// the intersection of the specified image area and the GainMap area.
191 
ModifiedBounds(const dng_rect & imageBounds)192 		virtual dng_rect ModifiedBounds (const dng_rect &imageBounds)
193 			{
194 			return fAreaSpec.Overlap (imageBounds);
195 			}
196 
197 		/// Apply the gain map.
198 
199 		virtual void ProcessArea (dng_negative &negative,
200 								  uint32 threadIndex,
201 								  dng_pixel_buffer &buffer,
202 								  const dng_rect &dstArea,
203 								  const dng_rect &imageBounds);
204 
205 	private:
206 
207 		// Hidden copy constructor and assignment operator.
208 
209 		dng_opcode_GainMap (const dng_opcode_GainMap &opcode);
210 
211 		dng_opcode_GainMap & operator= (const dng_opcode_GainMap &opcode);
212 
213 	};
214 
215 /*****************************************************************************/
216 
217 #endif
218 
219 /*****************************************************************************/
220