10b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
20b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// Copyright 2006-2007 Adobe Systems Incorporated
30b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// All Rights Reserved.
40b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener//
50b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// NOTICE:  Adobe permits you to use, modify, and distribute this file in
60b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// accordance with the terms of the Adobe license agreement accompanying it.
70b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
80b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
90b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_resample.h#1 $ */
100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $DateTime: 2012/05/30 13:28:51 $ */
110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Change: 832332 $ */
120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Author: tknoll $ */
130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#ifndef __dng_resample__
170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#define __dng_resample__
180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_assertions.h"
220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_auto_ptr.h"
230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_classes.h"
240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_memory.h"
250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_point.h"
260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_types.h"
270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_resample_function
310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_resample_function ()
360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~dng_resample_function ()
400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual real64 Extent () const = 0;
440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual real64 Evaluate (real64 x) const = 0;
460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_resample_bicubic: public dng_resample_function
520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual real64 Extent () const;
570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual real64 Evaluate (real64 x) const;
590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		static const dng_resample_function & Get ();
610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/******************************************************************************/
650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerconst uint32 kResampleSubsampleBits  = 7;
670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerconst uint32 kResampleSubsampleCount = 1 << kResampleSubsampleBits;
680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerconst uint32 kResampleSubsampleMask  = kResampleSubsampleCount - 1;
690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_resample_coords
730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		int32 fOrigin;
780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		AutoPtr<dng_memory_block> fCoords;
800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_resample_coords ();
840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~dng_resample_coords ();
860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void Initialize (int32 srcOrigin,
880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 int32 dstOrigin,
890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 uint32 srcCount,
900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 uint32 dstCount,
910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 dng_memory_allocator &allocator);
920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const int32 * Coords (int32 index) const
940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fCoords->Buffer_int32 () + (index - fOrigin);
960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const int32 Pixel (int32 index) const
990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return Coords (index) [0] >> kResampleSubsampleBits;
1010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
1040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_resample_weights
1080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
1110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fRadius;
1130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fWeightStep;
1150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		AutoPtr<dng_memory_block> fWeights32;
1170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		AutoPtr<dng_memory_block> fWeights16;
1180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
1200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_resample_weights ();
1220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~dng_resample_weights ();
1240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void Initialize (real64 scale,
1260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 const dng_resample_function &kernel,
1270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 dng_memory_allocator &allocator);
1280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 Radius () const
1300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fRadius;
1320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 Width () const
1350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fRadius * 2;
1370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		int32 Offset () const
1400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return 1 - (int32) fRadius;
1420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 Step () const
1450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fWeightStep;
1470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const real32 *Weights32 (uint32 fract) const
1500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			DNG_ASSERT (fWeights32->Buffer (), "Weights32 is NULL");
1530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			if (fract >= kResampleSubsampleCount)
1550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				{
1560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				ThrowBadFormat ();
1580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				}
1600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fWeights32->Buffer_real32 () + fract * fWeightStep;
1620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const int16 *Weights16 (uint32 fract) const
1660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			DNG_ASSERT (fWeights16->Buffer (), "Weights16 is NULL");
1690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			if (fract >= kResampleSubsampleCount)
1710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				{
1720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				ThrowBadFormat ();
1740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				}
1760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fWeights16->Buffer_int16 () + fract * fWeightStep;
1780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
1820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerconst uint32 kResampleSubsampleBits2D  = 5;
1860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerconst uint32 kResampleSubsampleCount2D = 1 << kResampleSubsampleBits2D;
1870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerconst uint32 kResampleSubsampleMask2D  = kResampleSubsampleCount2D - 1;
1880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_resample_weights_2d
1920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
1950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fRadius;
1970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fRowStep;
1990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fColStep;
2000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		AutoPtr<dng_memory_block> fWeights32;
2020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		AutoPtr<dng_memory_block> fWeights16;
2030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
2050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_resample_weights_2d ();
2070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~dng_resample_weights_2d ();
2090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void Initialize (const dng_resample_function &kernel,
2110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 dng_memory_allocator &allocator);
2120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 Radius () const
2140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fRadius;
2160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 Width () const
2190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fRadius * 2;
2210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		int32 Offset () const
2240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return 1 - (int32) fRadius;
2260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 RowStep () const
2290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fRowStep;
2310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 ColStep () const
2340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fColStep;
2360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const real32 *Weights32 (dng_point fract) const
2390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			DNG_ASSERT (fWeights32->Buffer (), "Weights32 is NULL");
2420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			if (fract.v < 0 || fract.h < 0
2440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				 || fract.v >= static_cast<int32>(kResampleSubsampleCount2D)
2450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				 || fract.h >= static_cast<int32>(kResampleSubsampleCount2D))
2460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				{
2470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				ThrowBadFormat ();
2490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				}
2510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			const uint32 offset = fract.v * fRowStep + fract.h * fColStep;
253c89552e7ed1e0ea69c69addf2bb5de011188d297Florian Kriener
2540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fWeights32->Buffer_real32 () + offset;
2550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const int16 *Weights16 (dng_point fract) const
2590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			DNG_ASSERT (fWeights16->Buffer (), "Weights16 is NULL");
2620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			if (fract.v < 0 || fract.h < 0
2640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				 || fract.v >= static_cast<int32>(kResampleSubsampleCount2D)
2650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				 || fract.h >= static_cast<int32>(kResampleSubsampleCount2D))
2660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				{
2670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				ThrowBadFormat ();
2690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				}
2710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			const uint32 offset = fract.v * fRowStep + fract.h * fColStep;
2730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fWeights16->Buffer_int16 () + offset;
2750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
2790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
2810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienervoid ResampleImage (dng_host &host,
2830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					const dng_image &srcImage,
2840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					dng_image &dstImage,
2850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					const dng_rect &srcBounds,
2860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					const dng_rect &dstBounds,
2870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					const dng_resample_function &kernel);
2880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
2900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#endif
2920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
294