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