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 30class dng_resample_function 31 { 32 33 public: 34 35 dng_resample_function () 36 { 37 } 38 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 51class 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 66const uint32 kResampleSubsampleBits = 7; 67const uint32 kResampleSubsampleCount = 1 << kResampleSubsampleBits; 68const uint32 kResampleSubsampleMask = kResampleSubsampleCount - 1; 69 70/*****************************************************************************/ 71 72class 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 93 const int32 * Coords (int32 index) const 94 { 95 return fCoords->Buffer_int32 () + (index - fOrigin); 96 } 97 98 const int32 Pixel (int32 index) const 99 { 100 return Coords (index) [0] >> kResampleSubsampleBits; 101 } 102 103 }; 104 105/*****************************************************************************/ 106 107class 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 129 uint32 Radius () const 130 { 131 return fRadius; 132 } 133 134 uint32 Width () const 135 { 136 return fRadius * 2; 137 } 138 139 int32 Offset () const 140 { 141 return 1 - (int32) fRadius; 142 } 143 144 uint32 Step () const 145 { 146 return fWeightStep; 147 } 148 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 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 185const uint32 kResampleSubsampleBits2D = 5; 186const uint32 kResampleSubsampleCount2D = 1 << kResampleSubsampleBits2D; 187const uint32 kResampleSubsampleMask2D = kResampleSubsampleCount2D - 1; 188 189/*****************************************************************************/ 190 191class 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 213 uint32 Radius () const 214 { 215 return fRadius; 216 } 217 218 uint32 Width () const 219 { 220 return fRadius * 2; 221 } 222 223 int32 Offset () const 224 { 225 return 1 - (int32) fRadius; 226 } 227 228 uint32 RowStep () const 229 { 230 return fRowStep; 231 } 232 233 uint32 ColStep () const 234 { 235 return fColStep; 236 } 237 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 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 282void 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