10b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
20b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// Copyright 2006-2008 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_image.h#1 $ */
100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $DateTime: 2012/05/30 13:28:51 $ */
110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Change: 832332 $ */
120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Author: tknoll $ */
130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/** \file
150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener *  Support for working with image data in DNG SDK.
160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener */
170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#ifndef __dng_image__
210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#define __dng_image__
220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_assertions.h"
260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_classes.h"
270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_pixel_buffer.h"
280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_point.h"
290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_rect.h"
300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_tag_types.h"
310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_types.h"
320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief Class to get resource acquisition is instantiation behavior for tile
360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// buffers. Can be dirty or constant tile access.
370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_tile_buffer: public dng_pixel_buffer
390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const dng_image &fImage;
440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void *fRefData;
460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Obtain a tile from an image.
500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param image Image tile will come from.
510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param tile Rectangle denoting extent of tile.
520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param dirty Flag indicating whether this is read-only or read-write acesss.
530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_tile_buffer (const dng_image &image,
550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 const dng_rect &tile,
560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 bool dirty);
570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~dng_tile_buffer ();
590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetRefData (void *refData)
630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			fRefData = refData;
650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void * GetRefData () const
680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fRefData;
700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// Hidden copy constructor and assignment operator.
750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_tile_buffer (const dng_tile_buffer &buffer);
770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_tile_buffer & operator= (const dng_tile_buffer &buffer);
790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief Class to get resource acquisition is instantiation behavior for
850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// constant (read-only) tile buffers.
860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_const_tile_buffer: public dng_tile_buffer
880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Obtain a read-only tile from an image.
930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param image Image tile will come from.
940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param tile Rectangle denoting extent of tile.
950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_const_tile_buffer (const dng_image &image,
970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   const dng_rect &tile);
980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~dng_const_tile_buffer ();
1000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
1020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief Class to get resource acquisition is instantiation behavior for
1060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// dirty (writable) tile buffers.
1070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_dirty_tile_buffer: public dng_tile_buffer
1090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
1120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Obtain a writable tile from an image.
1140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param image Image tile will come from.
1150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param tile Rectangle denoting extent of tile.
1160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_dirty_tile_buffer (dng_image &image,
1180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							   const dng_rect &tile);
1190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~dng_dirty_tile_buffer ();
1210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
1230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief Base class for holding image data in DNG SDK. See dng_simple_image
1270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// for derived class most often used in DNG SDK.
1280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_image
1300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	friend class dng_tile_buffer;
1330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
1350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// Bounds for this image.
1370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_rect fBounds;
1390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// Number of image planes.
1410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fPlanes;
1430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// Basic pixel type (TIFF tag type code).
1450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fPixelType;
1470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
1490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// How to handle requests to get image areas outside the image bounds.
1510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		enum edge_option
1530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			/// Leave edge pixels unchanged.
1560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			edge_none,
1580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			/// Pad with zeros.
1600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			edge_zero,
1620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			/// Repeat edge pixels.
1640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			edge_repeat,
1660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			/// Repeat edge pixels, except for last plane which is zero padded.
1680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			edge_repeat_zero_last
1700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			};
1720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
1740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_image (const dng_rect &bounds,
1760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				   uint32 planes,
1770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				   uint32 pixelType);
1780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
1800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~dng_image ();
1820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual dng_image * Clone () const;
1840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Getter method for bounds of an image.
1860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const dng_rect & Bounds () const
1880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fBounds;
1900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Getter method for size of an image.
1930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_point Size () const
1950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return Bounds ().Size ();
1970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Getter method for width of an image.
2000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 Width () const
2020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return Bounds ().W ();
2040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Getter method for height of an image.
2070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 Height () const
2090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return Bounds ().H ();
2110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Getter method for number of planes in an image.
2140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 Planes () const
2160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fPlanes;
2180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Getter for pixel type.
2210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \retval See dng_tagtypes.h . Valid values are ttByte, ttShort, ttSShort,
2220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// ttLong, ttFloat .
2230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 PixelType () const
2250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fPixelType;
2270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
2280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Setter for pixel type.
2300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param pixelType The new pixel type .
2310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void SetPixelType (uint32 pixelType);
2330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Getter for pixel size.
2350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \retval Size, in bytes, of pixel type for this image .
2360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 PixelSize () const;
2380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Getter for pixel range.
2400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// For unsigned types, range is 0 to return value.
2410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// For signed types, range is return value - 0x8000U.
2420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// For ttFloat type, pixel range is 0.0 to 1.0 and this routine returns 1.
2430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 PixelRange () const;
2450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Getter for best "tile stride" for accessing image.
2470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual dng_rect RepeatingTile () const;
2490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Get a pixel buffer of data on image with proper edge padding.
2510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param buffer Receives resulting pixel buffer.
2520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param edgeOption edge_option describing how to pad edges.
2530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param repeatV Amount of repeated padding needed in vertical for
2540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// edge_repeat and edge_repeat_zero_last edgeOption cases.
2550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param repeatH Amount of repeated padding needed in horizontal for
2560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// edge_repeat and edge_repeat_zero_last edgeOption cases.
2570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void Get (dng_pixel_buffer &buffer,
2590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				  edge_option edgeOption = edge_none,
2600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				  uint32 repeatV = 1,
2610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				  uint32 repeatH = 1) const;
2620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Put a pixel buffer into image.
2640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param buffer Pixel buffer to copy from.
2650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void Put (const dng_pixel_buffer &buffer);
2670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Shrink bounds of image to given rectangle.
2690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param r Rectangle to crop to.
2700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void Trim (const dng_rect &r);
2720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Rotate image to reflect given orientation change.
2740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param orientation Directive to rotate image in a certain way.
2750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void Rotate (const dng_orientation &orientation);
2770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Copy image data from an area of one image to same area of another.
2790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param src Image to copy from.
2800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param area Rectangle of images to copy.
2810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param srcPlane Plane to start copying in src.
2820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param dstPlane Plane to start copying in this.
2830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param planes Number of planes to copy.
2840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void CopyArea (const dng_image &src,
2860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   const dng_rect &area,
2870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   uint32 srcPlane,
2880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   uint32 dstPlane,
2890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   uint32 planes);
2900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Copy image data from an area of one image to same area of another.
2920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param src Image to copy from.
2930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param area Rectangle of images to copy.
2940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param plane Plane to start copying in src and this.
2950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param planes Number of planes to copy.
2960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void CopyArea (const dng_image &src,
2980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   const dng_rect &area,
2990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   uint32 plane,
3000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   uint32 planes)
3010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
3020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			CopyArea (src, area, plane, plane, planes);
3040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
3060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Return true if the contents of an area of the image are the same as those of another.
3080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param rhs Image to compare against.
3090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param area Rectangle of image to test.
3100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param plane Plane to start comparing.
3110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param planes Number of planes to compare.
3120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		bool EqualArea (const dng_image &rhs,
3140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						const dng_rect &area,
3150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						uint32 plane,
3160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						uint32 planes) const;
3170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		// Routines to set the entire image to a constant value.
3190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetConstant_uint8 (uint8 value,
3210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								const dng_rect &area)
3220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
3230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			DNG_ASSERT (fPixelType == ttByte, "Mismatched pixel type");
3250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			SetConstant ((uint32) value, area);
3270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
3290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetConstant_uint8 (uint8 value)
3310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
3320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			SetConstant (value, Bounds ());
3330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
3340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetConstant_uint16 (uint16 value,
3360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								 const dng_rect &area)
3370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
3380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			DNG_ASSERT (fPixelType == ttShort, "Mismatched pixel type");
3400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			SetConstant ((uint32) value, area);
3420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
3440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetConstant_uint16 (uint16 value)
3460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
3470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			SetConstant_uint16 (value, Bounds ());
3480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
3490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetConstant_int16 (int16 value,
3510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								const dng_rect &area)
3520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
3530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			DNG_ASSERT (fPixelType == ttSShort, "Mismatched pixel type");
3550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			SetConstant ((uint32) (uint16) value, area);
3570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
3590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetConstant_int16 (int16 value)
3610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
3620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			SetConstant_int16 (value, Bounds ());
3630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
3640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetConstant_uint32 (uint32 value,
3660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								 const dng_rect &area)
3670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
3680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			DNG_ASSERT (fPixelType == ttLong, "Mismatched pixel type");
3700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			SetConstant (value, area);
3720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
3740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetConstant_uint32 (uint32 value)
3760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
3770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			SetConstant_uint32 (value, Bounds ());
3780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
3790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetConstant_real32 (real32 value,
3810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								 const dng_rect &area)
3820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
3830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			DNG_ASSERT (fPixelType == ttFloat, "Mismatched pixel type");
3850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			union
3870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				{
3880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				uint32 i;
3890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				real32 f;
3900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener				} x;
3910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			x.f = value;
3930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			SetConstant (x.i, area);
3950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
3970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void SetConstant_real32 (real32 value)
3990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
4000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			SetConstant_real32 (value, Bounds ());
4010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
4020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void GetRepeat (dng_pixel_buffer &buffer,
4040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								const dng_rect &srcArea,
4050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								const dng_rect &dstArea) const;
4060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
4080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void AcquireTileBuffer (dng_tile_buffer &buffer,
4100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener										const dng_rect &area,
4110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener										bool dirty) const;
4120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void ReleaseTileBuffer (dng_tile_buffer &buffer) const;
4140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void DoGet (dng_pixel_buffer &buffer) const;
4160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void DoPut (const dng_pixel_buffer &buffer);
4180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void GetEdge (dng_pixel_buffer &buffer,
4200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					  edge_option edgeOption,
4210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					  const dng_rect &srcArea,
4220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					  const dng_rect &dstArea) const;
4230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void SetConstant (uint32 value,
4250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  const dng_rect &area);
4260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
4280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
4300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#endif
4320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
434