1 /*****************************************************************************/ 2 // Copyright 2006-2007 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_resample.h#1 $ */ 10 /* $DateTime: 2012/05/30 13:28:51 $ */ 11 /* $Change: 832332 $ */ 12 /* $Author: tknoll $ */ 13 14 /*****************************************************************************/ 15 16 #ifndef __dng_resample__ 17 #define __dng_resample__ 18 19 /*****************************************************************************/ 20 21 #include "dng_assertions.h" 22 #include "dng_auto_ptr.h" 23 #include "dng_classes.h" 24 #include "dng_memory.h" 25 #include "dng_point.h" 26 #include "dng_types.h" 27 28 /*****************************************************************************/ 29 30 class dng_resample_function 31 { 32 33 public: 34 dng_resample_function()35 dng_resample_function () 36 { 37 } 38 ~dng_resample_function()39 virtual ~dng_resample_function () 40 { 41 } 42 43 virtual real64 Extent () const = 0; 44 45 virtual real64 Evaluate (real64 x) const = 0; 46 47 }; 48 49 /*****************************************************************************/ 50 51 class dng_resample_bicubic: public dng_resample_function 52 { 53 54 public: 55 56 virtual real64 Extent () const; 57 58 virtual real64 Evaluate (real64 x) const; 59 60 static const dng_resample_function & Get (); 61 62 }; 63 64 /******************************************************************************/ 65 66 const uint32 kResampleSubsampleBits = 7; 67 const uint32 kResampleSubsampleCount = 1 << kResampleSubsampleBits; 68 const uint32 kResampleSubsampleMask = kResampleSubsampleCount - 1; 69 70 /*****************************************************************************/ 71 72 class dng_resample_coords 73 { 74 75 protected: 76 77 int32 fOrigin; 78 79 AutoPtr<dng_memory_block> fCoords; 80 81 public: 82 83 dng_resample_coords (); 84 85 virtual ~dng_resample_coords (); 86 87 void Initialize (int32 srcOrigin, 88 int32 dstOrigin, 89 uint32 srcCount, 90 uint32 dstCount, 91 dng_memory_allocator &allocator); 92 Coords(int32 index)93 const int32 * Coords (int32 index) const 94 { 95 return fCoords->Buffer_int32 () + (index - fOrigin); 96 } 97 Pixel(int32 index)98 const int32 Pixel (int32 index) const 99 { 100 return Coords (index) [0] >> kResampleSubsampleBits; 101 } 102 103 }; 104 105 /*****************************************************************************/ 106 107 class dng_resample_weights 108 { 109 110 protected: 111 112 uint32 fRadius; 113 114 uint32 fWeightStep; 115 116 AutoPtr<dng_memory_block> fWeights32; 117 AutoPtr<dng_memory_block> fWeights16; 118 119 public: 120 121 dng_resample_weights (); 122 123 virtual ~dng_resample_weights (); 124 125 void Initialize (real64 scale, 126 const dng_resample_function &kernel, 127 dng_memory_allocator &allocator); 128 Radius()129 uint32 Radius () const 130 { 131 return fRadius; 132 } 133 Width()134 uint32 Width () const 135 { 136 return fRadius * 2; 137 } 138 Offset()139 int32 Offset () const 140 { 141 return 1 - (int32) fRadius; 142 } 143 Step()144 uint32 Step () const 145 { 146 return fWeightStep; 147 } 148 Weights32(uint32 fract)149 const real32 *Weights32 (uint32 fract) const 150 { 151 152 DNG_ASSERT (fWeights32->Buffer (), "Weights32 is NULL"); 153 154 if (fract >= kResampleSubsampleCount) 155 { 156 157 ThrowBadFormat (); 158 159 } 160 161 return fWeights32->Buffer_real32 () + fract * fWeightStep; 162 163 } 164 Weights16(uint32 fract)165 const int16 *Weights16 (uint32 fract) const 166 { 167 168 DNG_ASSERT (fWeights16->Buffer (), "Weights16 is NULL"); 169 170 if (fract >= kResampleSubsampleCount) 171 { 172 173 ThrowBadFormat (); 174 175 } 176 177 return fWeights16->Buffer_int16 () + fract * fWeightStep; 178 179 } 180 181 }; 182 183 /*****************************************************************************/ 184 185 const uint32 kResampleSubsampleBits2D = 5; 186 const uint32 kResampleSubsampleCount2D = 1 << kResampleSubsampleBits2D; 187 const uint32 kResampleSubsampleMask2D = kResampleSubsampleCount2D - 1; 188 189 /*****************************************************************************/ 190 191 class dng_resample_weights_2d 192 { 193 194 protected: 195 196 uint32 fRadius; 197 198 uint32 fRowStep; 199 uint32 fColStep; 200 201 AutoPtr<dng_memory_block> fWeights32; 202 AutoPtr<dng_memory_block> fWeights16; 203 204 public: 205 206 dng_resample_weights_2d (); 207 208 virtual ~dng_resample_weights_2d (); 209 210 void Initialize (const dng_resample_function &kernel, 211 dng_memory_allocator &allocator); 212 Radius()213 uint32 Radius () const 214 { 215 return fRadius; 216 } 217 Width()218 uint32 Width () const 219 { 220 return fRadius * 2; 221 } 222 Offset()223 int32 Offset () const 224 { 225 return 1 - (int32) fRadius; 226 } 227 RowStep()228 uint32 RowStep () const 229 { 230 return fRowStep; 231 } 232 ColStep()233 uint32 ColStep () const 234 { 235 return fColStep; 236 } 237 Weights32(dng_point fract)238 const real32 *Weights32 (dng_point fract) const 239 { 240 241 DNG_ASSERT (fWeights32->Buffer (), "Weights32 is NULL"); 242 243 if (fract.v < 0 || fract.h < 0 244 || fract.v >= static_cast<int32>(kResampleSubsampleCount2D) 245 || fract.h >= static_cast<int32>(kResampleSubsampleCount2D)) 246 { 247 248 ThrowBadFormat (); 249 250 } 251 252 const uint32 offset = fract.v * fRowStep + fract.h * fColStep; 253 254 return fWeights32->Buffer_real32 () + offset; 255 256 } 257 Weights16(dng_point fract)258 const int16 *Weights16 (dng_point fract) const 259 { 260 261 DNG_ASSERT (fWeights16->Buffer (), "Weights16 is NULL"); 262 263 if (fract.v < 0 || fract.h < 0 264 || fract.v >= static_cast<int32>(kResampleSubsampleCount2D) 265 || fract.h >= static_cast<int32>(kResampleSubsampleCount2D)) 266 { 267 268 ThrowBadFormat (); 269 270 } 271 272 const uint32 offset = fract.v * fRowStep + fract.h * fColStep; 273 274 return fWeights16->Buffer_int16 () + offset; 275 276 } 277 278 }; 279 280 /*****************************************************************************/ 281 282 void ResampleImage (dng_host &host, 283 const dng_image &srcImage, 284 dng_image &dstImage, 285 const dng_rect &srcBounds, 286 const dng_rect &dstBounds, 287 const dng_resample_function &kernel); 288 289 /*****************************************************************************/ 290 291 #endif 292 293 /*****************************************************************************/ 294