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
34class 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
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
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
79		const dng_point_real64 & Origin () const
80			{
81			return fOrigin;
82			}
83
84		/// The number of color planes.
85
86		uint32 Planes () const
87			{
88			return fPlanes;
89			}
90
91		/// Getter for a gain map sample (specified by row, column, and plane).
92
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
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
156class 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
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
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