dng_gain_map.h revision ffee7a66caebb7027d7591405e8494e3c9e8517e
107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/*****************************************************************************/
207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// Copyright 2008-2009 Adobe Systems Incorporated
307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// All Rights Reserved.
407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani//
507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// NOTICE:  Adobe permits you to use, modify, and distribute this file in
607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani// accordance with the terms of the Adobe license agreement accompanying it.
707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/*****************************************************************************/
807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_gain_map.h#2 $ */
1007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/* $DateTime: 2012/07/31 22:04:34 $ */
1107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/* $Change: 840853 $ */
1207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/* $Author: tknoll $ */
1307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
1407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/** \file
1507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Opcode to fix 2D uniformity defects, such as shading.
1607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani */
1707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
1807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/*****************************************************************************/
1907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
2007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef __dng_gain_map__
2107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define __dng_gain_map__
2207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
2307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/*****************************************************************************/
2407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
2507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "dng_memory.h"
2607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "dng_misc_opcodes.h"
2707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "dng_tag_types.h"
2807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
2907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/*****************************************************************************/
3007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/// \brief Holds a discrete (i.e., sampled) 2D representation of a gain map. This is
3207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/// effectively an image containing scale factors.
3307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniclass dng_gain_map
3507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani	{
3607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani	private:
3807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani		dng_point fPoints;
4007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
4107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani		dng_point_real64 fSpacing;
4207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
4307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani		dng_point_real64 fOrigin;
4407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
4507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani		uint32 fPlanes;
4607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
4707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani		uint32 fRowStep;
4807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
4907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani		AutoPtr<dng_memory_block> fBuffer;
5007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
5107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani	public:
5207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
5307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani		/// Construct a gain map with the specified memory allocator, number of
5407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani		/// samples (points), sample spacing, origin, and number of color planes.
5507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
5607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani		dng_gain_map (dng_memory_allocator &allocator,
5707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani					  const dng_point &points,
5807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani					  const dng_point_real64 &spacing,
5907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani					  const dng_point_real64 &origin,
6007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani					  uint32 planes);
6107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
6207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani		/// The number of samples in the horizontal and vertical directions.
6307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
6407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani		const dng_point & Points () const
6507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani			{
6607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani			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