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