Home | History | Annotate | Download | only in source
      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 
     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 
    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 
    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