16e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
26e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// Copyright 2006-2008 Adobe Systems Incorporated
36e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// All Rights Reserved.
46e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim//
56e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// NOTICE:  Adobe permits you to use, modify, and distribute this file in
66e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim// accordance with the terms of the Adobe license agreement accompanying it.
76e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
86e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
96e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_pixel_buffer.h#1 $ */
106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $DateTime: 2012/05/30 13:28:51 $ */
116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $Change: 832332 $ */
126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/* $Author: tknoll $ */
136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/** \file
156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim * Support for holding buffers of sample data.
166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim */
176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#ifndef __dng_pixel_buffer__
216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#define __dng_pixel_buffer__
226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_assertions.h"
266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_rect.h"
276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_safe_arithmetic.h"
286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#include "dng_tag_types.h"
296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// Compute best set of step values for a given source and destination area and stride.
336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid OptimizeOrder (const void *&sPtr,
356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					void *&dPtr,
366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					uint32 sPixelSize,
376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					uint32 dPixelSize,
386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					uint32 &count0,
396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					uint32 &count1,
406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					uint32 &count2,
416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					int32 &sStep0,
426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					int32 &sStep1,
436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					int32 &sStep2,
446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					int32 &dStep0,
456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					int32 &dStep1,
466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					int32 &dStep2);
476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid OptimizeOrder (const void *&sPtr,
496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					uint32 sPixelSize,
506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					uint32 &count0,
516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					uint32 &count1,
526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					uint32 &count2,
536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					int32 &sStep0,
546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					int32 &sStep1,
556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					int32 &sStep2);
566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimvoid OptimizeOrder (void *&dPtr,
586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					uint32 dPixelSize,
596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					uint32 &count0,
606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					uint32 &count1,
616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					uint32 &count2,
626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					int32 &dStep0,
636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					int32 &dStep1,
646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					int32 &dStep2);
656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#define qDebugPixelType 0
696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#if qDebugPixelType
716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#define ASSERT_PIXEL_TYPE(typeVal) CheckPixelType (typeVal)
736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#else
756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#define ASSERT_PIXEL_TYPE(typeVal) DNG_ASSERT (fPixelType == typeVal, "Pixel type access mismatch")
776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#endif
796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// \brief Holds a buffer of pixel data with "pixel geometry" metadata.
836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim///
846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// The pixel geometry describes the layout in terms of how many planes, rows and columns
856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/// plus the steps (in bytes) between each column, row and plane.
866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakimclass dng_pixel_buffer
886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	{
896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	public:
916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Area this buffer holds.
936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_rect fArea;
956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Range of planes this buffer holds.
976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 fPlane;
996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 fPlanes;
1006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Steps between pixels.
1026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		int32 fRowStep;
1046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		int32 fColStep;
1056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		int32 fPlaneStep;
1066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Basic pixel type (TIFF tag type code).
1086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 fPixelType;
1106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Size of pixel type in bytes.
1126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 fPixelSize;
1146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Pointer to buffer's data.
1166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void *fData;
1186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		// Do we have write-access to this data?
1206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool fDirty;
1226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	private:
1246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void * InternalPixel (int32 row,
1266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim							  int32 col,
1276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					  	      uint32 plane = 0) const
1286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
129c89552e7ed1e0ea69c69addf2bb5de011188d297Florian Kriener
1306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			// Ensure pixel to be accessed lies inside valid area.
1316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			if (row < fArea.t || row >= fArea.b ||
1326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				col < fArea.l || col >= fArea.r ||
1336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				plane < fPlane || (plane - fPlane) >= fPlanes)
1346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
1356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				ThrowProgramError ("Out-of-range pixel access");
1366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				}
1376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			// Compute offset of pixel.
1396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			const int64 rowOffset = SafeInt64Mult(fRowStep,
1406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				static_cast<int64> (row) - static_cast<int64> (fArea.t));
1416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			const int64 colOffset = SafeInt64Mult(fColStep,
1426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				static_cast<int64> (col) - static_cast<int64> (fArea.l));
1436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			const int64 planeOffset = SafeInt64Mult(fPlaneStep,
1446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				static_cast<int64> (plane - fPlane));
1456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			const int64 offset = SafeInt64Mult(static_cast<int64>(fPixelSize),
1466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				SafeInt64Add(SafeInt64Add(rowOffset, colOffset), planeOffset));
1476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			// Add offset to buffer base address.
1496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return static_cast<void *> (static_cast<uint8 *> (fData) + offset);
1506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
1526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		#if qDebugPixelType
1546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void CheckPixelType (uint32 pixelType) const;
1566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		#endif
1586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	public:
1606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_pixel_buffer ();
1626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Note: This constructor is for internal use only and should not be
1646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// considered part of the DNG SDK API.
1656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		///
1666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Initialize the pixel buffer according to the given parameters (see
1676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// below). May throw an error if arithmetic overflow occurs when
1686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// computing the row, column or plane step, or if an invalid value was
1696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// passed for planarConfiguration.
1706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		///
1716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param size Area covered by the pixel buffer
1726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Index of the first plane
1736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param planes Number of planes
1746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param pixelType Pixel data type (one of the values defined in
1756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		///        dng_tag_types.h)
1766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param planarConfiguration Layout of the pixel planes in memory: One
1776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		///        of pcInterleaved, pcPlanar, or pcRowInterleaved (defined in
1786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		///        dng_tag_values.h)
1796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param data Pointer to the pixel data
1806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_pixel_buffer (const dng_rect &area, uint32 plane, uint32 planes,
1816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						  uint32 pixelType, uint32 planarConfiguration,
1826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						  void *data);
1836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_pixel_buffer (const dng_pixel_buffer &buffer);
1856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		dng_pixel_buffer & operator= (const dng_pixel_buffer &buffer);
1876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		virtual ~dng_pixel_buffer ();
1896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get the range of pixel values.
1916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Range of value a pixel can take. (Meaning [0, max] for unsigned case. Signed case is biased so [-32768, max - 32768].)
1926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 PixelRange () const;
1946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get extent of pixels in buffer
1966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Rectangle giving valid extent of buffer.
1976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
1986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const dng_rect & Area () const
1996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
2006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fArea;
2016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
2026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Number of planes of image data.
2046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Number of planes held in buffer.
2056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 Planes () const
2076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
2086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fPlanes;
2096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
2106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Step, in pixels not bytes, between rows of data in buffer.
2126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval row step in pixels. May be negative.
2136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		int32 RowStep () const
2156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
2166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fRowStep;
2176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
2186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Step, in pixels not bytes, between planes of data in buffer.
2206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval plane step in pixels. May be negative.
2216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		int32 PlaneStep () const
2236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
2246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return fPlaneStep;
2256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
2266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get read-only untyped (void *) pointer to pixel data starting at a specific pixel in the buffer.
2286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param row Start row for buffer pointer.
2296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param col Start column for buffer pointer.
2306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Start plane for buffer pointer.
2316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Pointer to pixel data as void *.
2326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const void * ConstPixel (int32 row,
2346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					  			 int32 col,
2356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					  			 uint32 plane = 0) const
2366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
2376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return InternalPixel (row, col, plane);
2396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
2416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get a writable untyped (void *) pointer to pixel data starting at a specific pixel in the buffer.
2436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param row Start row for buffer pointer.
2446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param col Start column for buffer pointer.
2456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Start plane for buffer pointer.
2466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Pointer to pixel data as void *.
2476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void * DirtyPixel (int32 row,
2496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					  	   int32 col,
2506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					  	   uint32 plane = 0)
2516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
2526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			DNG_ASSERT (fDirty, "Dirty access to const pixel buffer");
2546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return InternalPixel (row, col, plane);
2566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
2586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get read-only uint8 * to pixel data starting at a specific pixel in the buffer.
2606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param row Start row for buffer pointer.
2616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param col Start column for buffer pointer.
2626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Start plane for buffer pointer.
2636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Pointer to pixel data as uint8 *.
2646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const uint8 * ConstPixel_uint8 (int32 row,
2666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										int32 col,
2676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										uint32 plane = 0) const
2686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
2696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			ASSERT_PIXEL_TYPE (ttByte);
2716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return (const uint8 *) ConstPixel (row, col, plane);
2736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
2756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get a writable uint8 * to pixel data starting at a specific pixel in the buffer.
2776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param row Start row for buffer pointer.
2786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param col Start column for buffer pointer.
2796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Start plane for buffer pointer.
2806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Pointer to pixel data as uint8 *.
2816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint8 * DirtyPixel_uint8 (int32 row,
2836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  int32 col,
2846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  uint32 plane = 0)
2856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
2866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			ASSERT_PIXEL_TYPE (ttByte);
2886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return (uint8 *) DirtyPixel (row, col, plane);
2906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
2926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get read-only int8 * to pixel data starting at a specific pixel in the buffer.
2946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param row Start row for buffer pointer.
2956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param col Start column for buffer pointer.
2966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Start plane for buffer pointer.
2976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Pointer to pixel data as int8 *.
2986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
2996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const int8 * ConstPixel_int8 (int32 row,
3006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									  int32 col,
3016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									  uint32 plane = 0) const
3026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			ASSERT_PIXEL_TYPE (ttSByte);
3056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return (const int8 *) ConstPixel (row, col, plane);
3076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get a writable int8 * to pixel data starting at a specific pixel in the buffer.
3116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param row Start row for buffer pointer.
3126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param col Start column for buffer pointer.
3136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Start plane for buffer pointer.
3146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Pointer to pixel data as int8 *.
3156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		int8 * DirtyPixel_int8 (int32 row,
3176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								int32 col,
3186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								uint32 plane = 0)
3196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			ASSERT_PIXEL_TYPE (ttSByte);
3226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return (int8 *) DirtyPixel (row, col, plane);
3246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get read-only uint16 * to pixel data starting at a specific pixel in the buffer.
3286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param row Start row for buffer pointer.
3296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param col Start column for buffer pointer.
3306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Start plane for buffer pointer.
3316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Pointer to pixel data as uint16 *.
3326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const uint16 * ConstPixel_uint16 (int32 row,
3346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										  int32 col,
3356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										  uint32 plane = 0) const
3366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			ASSERT_PIXEL_TYPE (ttShort);
3396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return (const uint16 *) ConstPixel (row, col, plane);
3416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get a writable uint16 * to pixel data starting at a specific pixel in the buffer.
3456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param row Start row for buffer pointer.
3466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param col Start column for buffer pointer.
3476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Start plane for buffer pointer.
3486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Pointer to pixel data as uint16 *.
3496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint16 * DirtyPixel_uint16 (int32 row,
3516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								    int32 col,
3526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								    uint32 plane = 0)
3536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			ASSERT_PIXEL_TYPE (ttShort);
3566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return (uint16 *) DirtyPixel (row, col, plane);
3586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get read-only int16 * to pixel data starting at a specific pixel in the buffer.
3626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param row Start row for buffer pointer.
3636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param col Start column for buffer pointer.
3646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Start plane for buffer pointer.
3656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Pointer to pixel data as int16 *.
3666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const int16 * ConstPixel_int16 (int32 row,
3686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										int32 col,
3696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										uint32 plane = 0) const
3706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			ASSERT_PIXEL_TYPE (ttSShort);
3736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return (const int16 *) ConstPixel (row, col, plane);
3756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get a writable int16 * to pixel data starting at a specific pixel in the buffer.
3796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param row Start row for buffer pointer.
3806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param col Start column for buffer pointer.
3816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Start plane for buffer pointer.
3826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Pointer to pixel data as int16 *.
3836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		int16 * DirtyPixel_int16 (int32 row,
3856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  int32 col,
3866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  uint32 plane = 0)
3876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
3886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			ASSERT_PIXEL_TYPE (ttSShort);
3906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return (int16 *) DirtyPixel (row, col, plane);
3926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
3946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
3956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get read-only uint32 * to pixel data starting at a specific pixel in the buffer.
3966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param row Start row for buffer pointer.
3976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param col Start column for buffer pointer.
3986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Start plane for buffer pointer.
3996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Pointer to pixel data as uint32 *.
4006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const uint32 * ConstPixel_uint32 (int32 row,
4026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										  int32 col,
4036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										  uint32 plane = 0) const
4046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
4056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			ASSERT_PIXEL_TYPE (ttLong);
4076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return (const uint32 *) ConstPixel (row, col, plane);
4096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
4116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get a writable uint32 * to pixel data starting at a specific pixel in the buffer.
4136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param row Start row for buffer pointer.
4146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param col Start column for buffer pointer.
4156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Start plane for buffer pointer.
4166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Pointer to pixel data as uint32 *.
4176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		uint32 * DirtyPixel_uint32 (int32 row,
4196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								    int32 col,
4206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								    uint32 plane = 0)
4216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
4226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			ASSERT_PIXEL_TYPE (ttLong);
4246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return (uint32 *) DirtyPixel (row, col, plane);
4266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
4286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get read-only int32 * to pixel data starting at a specific pixel in the buffer.
4306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param row Start row for buffer pointer.
4316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param col Start column for buffer pointer.
4326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Start plane for buffer pointer.
4336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Pointer to pixel data as int32 *.
4346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const int32 * ConstPixel_int32 (int32 row,
4366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										int32 col,
4376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										uint32 plane = 0) const
4386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
4396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			ASSERT_PIXEL_TYPE (ttSLong);
4416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return (const int32 *) ConstPixel (row, col, plane);
4436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
4456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get a writable int32 * to pixel data starting at a specific pixel in the buffer.
4476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param row Start row for buffer pointer.
4486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param col Start column for buffer pointer.
4496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Start plane for buffer pointer.
4506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Pointer to pixel data as int32 *.
4516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		int32 * DirtyPixel_int32 (int32 row,
4536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  int32 col,
4546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  uint32 plane = 0)
4556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
4566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			ASSERT_PIXEL_TYPE (ttSLong);
4586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return (int32 *) DirtyPixel (row, col, plane);
4606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
4626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get read-only real32 * to pixel data starting at a specific pixel in the buffer.
4646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param row Start row for buffer pointer.
4656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param col Start column for buffer pointer.
4666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Start plane for buffer pointer.
4676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Pointer to pixel data as real32 *.
4686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		const real32 * ConstPixel_real32 (int32 row,
4706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										  int32 col,
4716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim										  uint32 plane = 0) const
4726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
4736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			ASSERT_PIXEL_TYPE (ttFloat);
4756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return (const real32 *) ConstPixel (row, col, plane);
4776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
4796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Get a writable real32 * to pixel data starting at a specific pixel in the buffer.
4816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param row Start row for buffer pointer.
4826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param col Start column for buffer pointer.
4836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Start plane for buffer pointer.
4846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval Pointer to pixel data as real32 *.
4856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real32 * DirtyPixel_real32 (int32 row,
4876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									int32 col,
4886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim									uint32 plane = 0)
4896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
4906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			ASSERT_PIXEL_TYPE (ttFloat);
4926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			return (real32 *) DirtyPixel (row, col, plane);
4946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
4966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
4976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Initialize a rectangular area of pixel buffer to a constant.
4986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param area Rectangle of pixel buffer to set.
4996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Plane to start filling on.
5006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param planes Number of planes to fill.
5016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param value Constant value to set pixels to.
5026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetConstant (const dng_rect &area,
5046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					      uint32 plane,
5056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					      uint32 planes,
5066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					      uint32 value);
5076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Initialize a rectangular area of pixel buffer to a constant unsigned 8-bit value.
5096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param area Rectangle of pixel buffer to set.
5106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Plane to start filling on.
5116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param planes Number of planes to fill.
5126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param value Constant uint8 value to set pixels to.
5136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetConstant_uint8 (const dng_rect &area,
5156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								uint32 plane,
5166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								uint32 planes,
5176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								uint8 value)
5186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
5196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			DNG_ASSERT (fPixelType == ttByte, "Mismatched pixel type");
5216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SetConstant (area, plane, planes, (uint32) value);
5236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
5256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Initialize a rectangular area of pixel buffer to a constant unsigned 16-bit value.
5276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param area Rectangle of pixel buffer to set.
5286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Plane to start filling on.
5296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param planes Number of planes to fill.
5306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param value Constant uint16 value to set pixels to.
5316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetConstant_uint16 (const dng_rect &area,
5336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 uint32 plane,
5346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 uint32 planes,
5356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 uint16 value)
5366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
5376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			DNG_ASSERT (fPixelType == ttShort, "Mismatched pixel type");
5396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SetConstant (area, plane, planes, (uint32) value);
5416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
5436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Initialize a rectangular area of pixel buffer to a constant signed 16-bit value.
5456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param area Rectangle of pixel buffer to set.
5466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Plane to start filling on.
5476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param planes Number of planes to fill.
5486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param value Constant int16 value to set pixels to.
5496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetConstant_int16 (const dng_rect &area,
5516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								uint32 plane,
5526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								uint32 planes,
5536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								int16 value)
5546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
5556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			DNG_ASSERT (fPixelType == ttSShort, "Mismatched pixel type");
5576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SetConstant (area, plane, planes, (uint32) (uint16) value);
5596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
5616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Initialize a rectangular area of pixel buffer to a constant unsigned 32-bit value.
5636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param area Rectangle of pixel buffer to set.
5646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Plane to start filling on.
5656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param planes Number of planes to fill.
5666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param value Constant uint32 value to set pixels to.
5676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetConstant_uint32 (const dng_rect &area,
5696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 uint32 plane,
5706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 uint32 planes,
5716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 uint32 value)
5726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
5736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			DNG_ASSERT (fPixelType == ttLong, "Mismatched pixel type");
5756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SetConstant (area, plane, planes, value);
5776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
5796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Initialize a rectangular area of pixel buffer to a constant real 32-bit value.
5816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param area Rectangle of pixel buffer to set.
5826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Plane to start filling on.
5836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param planes Number of planes to fill.
5846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param value Constant real32 value to set pixels to.
5856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetConstant_real32 (const dng_rect &area,
5876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 uint32 plane,
5886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 uint32 planes,
5896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								 real32 value)
5906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
5916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			DNG_ASSERT (fPixelType == ttFloat, "Mismatched pixel type");
5936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
5946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			union
5956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				{
5966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				uint32 i;
5976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				real32 f;
5986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim				} x;
5996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			x.f = value;
6016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			SetConstant (area, plane, planes, x.i);
6036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
6056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Initialize a rectangular area of pixel buffer to zeros.
6076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param area Rectangle of pixel buffer to zero.
6086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param area Area to zero
6096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Plane to start filling on.
6106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param planes Number of planes to fill.
6116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void SetZero (const dng_rect &area,
6136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					  uint32 plane,
6146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					  uint32 planes);
6156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Copy image data from an area of one pixel buffer to same area of another.
6176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param src Buffer to copy from.
6186e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param area Rectangle of pixel buffer to copy.
6196e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param srcPlane Plane to start copy in src.
6206e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param dstPlane Plane to start copy in dst.
6216e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param planes Number of planes to copy.
6226e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6236e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void CopyArea (const dng_pixel_buffer &src,
6246e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   const dng_rect &area,
6256e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   uint32 srcPlane,
6266e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   uint32 dstPlane,
6276e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   uint32 planes);
6286e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6296e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Copy image data from an area of one pixel buffer to same area of another.
6306e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param src Buffer to copy from.
6316e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param area Rectangle of pixel buffer to copy.
6326e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Plane to start copy in src and this.
6336e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param planes Number of planes to copy.
6346e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6356e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void CopyArea (const dng_pixel_buffer &src,
6366e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   const dng_rect &area,
6376e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   uint32 plane,
6386e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   uint32 planes)
6396e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			{
6406e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6416e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			CopyArea (src, area, plane, plane, planes);
6426e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6436e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim			}
6446e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6456e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Calculate the offset phase of destination rectangle relative to source rectangle.
6466e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Phase is based on a 0,0 origin and the notion of repeating srcArea across dstArea.
6476e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// It is the number of pixels into srcArea to start repeating from when tiling dstArea.
6486e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval dng_point containing horizontal and vertical phase.
6496e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6506e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		static dng_point RepeatPhase (const dng_rect &srcArea,
6516e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					   			   	  const dng_rect &dstArea);
6526e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6536e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Repeat the image data in srcArea across dstArea.
6546e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// (Generally used for padding operations.)
6556e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param srcArea Area to repeat from.
6566e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param dstArea Area to fill with data from srcArea.
6576e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6586e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void RepeatArea (const dng_rect &srcArea,
6596e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						 const dng_rect &dstArea);
6606e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6616e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Replicates a sub-area of a buffer to fill the entire buffer.
6626e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6636e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void RepeatSubArea (const dng_rect subArea,
6646e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						    uint32 repeatV = 1,
6656e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim						    uint32 repeatH = 1);
6666e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6676e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Apply a right shift (C++ oerpator >>) to all pixel values. Only implemented for 16-bit (signed or unsigned) pixel buffers.
6686e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param shift Number of bits by which to right shift each pixel value.
6696e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6706e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void ShiftRight (uint32 shift);
6716e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6726e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Change metadata so pixels are iterated in opposite horizontal order.
6736e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// This operation does not require movement of actual pixel data.
6746e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6756e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void FlipH ();
6766e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6776e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Change metadata so pixels are iterated in opposite vertical order.
6786e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// This operation does not require movement of actual pixel data.
6796e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6806e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void FlipV ();
6816e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6826e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Change metadata so pixels are iterated in opposite plane order.
6836e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// This operation does not require movement of actual pixel data.
6846e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6856e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		void FlipZ ();	// Flip planes
6866e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6876e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Return true if the contents of an area of the pixel buffer area are the same as those of another.
6886e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param rhs Buffer to compare against.
6896e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param area Rectangle of pixel buffer to test.
6906e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Plane to start comparing.
6916e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param planes Number of planes to compare.
6926e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval bool true if areas are equal, false otherwise.
6936e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6946e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		bool EqualArea (const dng_pixel_buffer &rhs,
6956e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					    const dng_rect &area,
6966e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					    uint32 plane,
6976e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim					    uint32 planes) const;
6986e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
6996e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// Return the absolute value of the maximum difference between two pixel buffers. Used for comparison testing with tolerance
7006e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param rhs Buffer to compare against.
7016e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param area Rectangle of pixel buffer to test.
7026e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param plane Plane to start comparing.
7036e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \param planes Number of planes to compare.
7046e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		/// \retval larges absolute value difference between the corresponding pixels each buffer across area.
7056e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7066e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim		real64 MaximumDifference (const dng_pixel_buffer &rhs,
7076e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  const dng_rect &area,
7086e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  uint32 plane,
7096e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim								  uint32 planes) const;
7106e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7116e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim	};
7126e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7136e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
7146e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7156e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim#endif
7166e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim
7176e09dfbee0b1643a5cb2b32d0399c1a0c69551a0Kinan Hakim/*****************************************************************************/
718