10b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
20b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// Copyright 2008-2009 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_misc_opcodes.h#2 $ */
100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $DateTime: 2012/08/02 06:09:06 $ */
110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Change: 841096 $ */
120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Author: erichan $ */
130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/** \file
150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener * Miscellaneous DNG opcodes.
160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener */
170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#ifndef __dng_misc_opcodes__
210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#define __dng_misc_opcodes__
220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_opcodes.h"
260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief Opcode to trim image to a specified rectangle.
300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_opcode_TrimBounds: public dng_opcode
320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_rect fBounds;
370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Create opcode to trim image to the specified bounds.
410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_opcode_TrimBounds (const dng_rect &bounds);
430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_opcode_TrimBounds (dng_stream &stream);
450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void PutData (dng_stream &stream) const;
470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void Apply (dng_host &host,
490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							dng_negative &negative,
500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							AutoPtr<dng_image> &image);
510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief A class to describe an area of an image, including a pixel subrectangle,
570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// plane range, and row/column pitch (e.g., for mosaic images). Useful for
580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// specifying opcodes that only apply to specific color planes or pixel types (e.g.,
590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// only one of the two green Bayer pixels).
600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_area_spec
620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		enum
670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			kDataSize = 32
690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			};
700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_rect fArea;
740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fPlane;
760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fPlanes;
770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fRowPitch;
790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fColPitch;
800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Create an empty area.
840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_area_spec (const dng_rect &area = dng_rect (),
860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   uint32 plane = 0,
870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   uint32 planes = 1,
880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   uint32 rowPitch = 1,
890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener					   uint32 colPitch = 1)
900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			:	fArea     (area)
920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fPlane    (plane)
930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fPlanes   (planes)
940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fRowPitch (rowPitch)
950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			,	fColPitch (colPitch)
960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// The pixel area.
1010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const dng_rect & Area () const
1030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fArea;
1050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// The first plane.
1080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const uint32 Plane () const
1100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fPlane;
1120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// The total number of planes.
1150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const uint32 Planes () const
1170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fPlanes;
1190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// The row pitch (i.e., stride). A pitch of 1 means all rows.
1220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const uint32 RowPitch () const
1240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fRowPitch;
1260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// The column pitch (i.e., stride). A pitch of 1 means all columns.
1290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const uint32 ColPitch () const
1310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
1320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return fColPitch;
1330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
1340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Read area data from the specified stream.
1360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void GetData (dng_stream &stream);
1380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Write area data to the specified stream.
1400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void PutData (dng_stream &stream) const;
1420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Compute and return pixel area overlap (i.e., intersection) between this
1440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// area and the specified tile.
1450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_rect Overlap (const dng_rect &tile) const;
1470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
1490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief An opcode to apply a 1D function (represented as a 16-bit table) to an
1530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// image area.
1540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_opcode_MapTable: public dng_inplace_opcode
1560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
1570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
1590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_area_spec fAreaSpec;
1610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		AutoPtr<dng_memory_block> fTable;
1630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fCount;
1650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
1670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Create a MapTable opcode with the specified area, table, and number of
1690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// table entries.
1700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_opcode_MapTable (dng_host &host,
1720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							 const dng_area_spec &areaSpec,
1730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							 const uint16 *table,
1740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							 uint32 count = 0x10000);
1750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_opcode_MapTable (dng_host &host,
1770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							 dng_stream &stream);
1780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void PutData (dng_stream &stream) const;
1800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual uint32 BufferPixelType (uint32 imagePixelType);
1820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
1840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void ProcessArea (dng_negative &negative,
1860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  uint32 threadIndex,
1870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  dng_pixel_buffer &buffer,
1880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  const dng_rect &dstArea,
1890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  const dng_rect &imageBounds);
1900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
1920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		void ReplicateLastEntry ();
1940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
1960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief An opcode to apply a 1D function (represented as a polynomial) to an
2000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// image area.
2010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_opcode_MapPolynomial: public dng_inplace_opcode
2030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
2040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
2060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		enum
2080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
2090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			kMaxDegree = 8
2100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			};
2110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
2130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_area_spec fAreaSpec;
2150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fDegree;
2170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		real64 fCoefficient [kMaxDegree + 1];
2190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		real32 fCoefficient32 [kMaxDegree + 1];
2210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
2230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Create a MapPolynomial opcode with the specified area, polynomial
2250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// degree, and polynomial coefficients. The function that will be
2260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// applied to each pixel x is:
2270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///
2280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// f (x) = coefficient [0] + ((x	* coefficient [1]) +
2290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///							   (x^2 * coefficient [2]) +
2300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///							   (x^3 * coefficient [3]) +
2310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///							   (x^4 * coefficient [4]) ...
2320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_opcode_MapPolynomial (const dng_area_spec &areaSpec,
2340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  uint32 degree,
2350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  const real64 *coefficient);
2360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_opcode_MapPolynomial (dng_stream &stream);
2380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void PutData (dng_stream &stream) const;
2400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual uint32 BufferPixelType (uint32 imagePixelType);
2420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
2440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void ProcessArea (dng_negative &negative,
2460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  uint32 threadIndex,
2470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  dng_pixel_buffer &buffer,
2480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  const dng_rect &dstArea,
2490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  const dng_rect &imageBounds);
2500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
2520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
2540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief An opcode to apply a delta (i.e., offset) that varies per row. Within
2560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// a row, the same delta value is applied to all specified pixels.
2570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_opcode_DeltaPerRow: public dng_inplace_opcode
2590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
2600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
2620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_area_spec fAreaSpec;
2640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		AutoPtr<dng_memory_block> fTable;
2660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		real32 fScale;
2680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
2700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Create a DeltaPerRow opcode with the specified area and row deltas
2720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// (specified as a table of 32-bit floats).
2730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_opcode_DeltaPerRow (const dng_area_spec &areaSpec,
2750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								AutoPtr<dng_memory_block> &table);
2760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_opcode_DeltaPerRow (dng_host &host,
2780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								dng_stream &stream);
2790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void PutData (dng_stream &stream) const;
2810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual uint32 BufferPixelType (uint32 imagePixelType);
2830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
2850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void ProcessArea (dng_negative &negative,
2870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  uint32 threadIndex,
2880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  dng_pixel_buffer &buffer,
2890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  const dng_rect &dstArea,
2900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  const dng_rect &imageBounds);
2910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
2930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
2950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief An opcode to apply a delta (i.e., offset) that varies per column.
2970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// Within a column, the same delta value is applied to all specified pixels.
2980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
2990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_opcode_DeltaPerColumn: public dng_inplace_opcode
3000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
3010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
3030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_area_spec fAreaSpec;
3050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		AutoPtr<dng_memory_block> fTable;
3070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		real32 fScale;
3090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
3110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Create a DeltaPerColumn opcode with the specified area and column
3130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// deltas (specified as a table of 32-bit floats).
3140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_opcode_DeltaPerColumn (const dng_area_spec &areaSpec,
3160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   AutoPtr<dng_memory_block> &table);
3170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_opcode_DeltaPerColumn (dng_host &host,
3190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   dng_stream &stream);
3200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void PutData (dng_stream &stream) const;
3220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual uint32 BufferPixelType (uint32 imagePixelType);
3240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
3260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void ProcessArea (dng_negative &negative,
3280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  uint32 threadIndex,
3290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  dng_pixel_buffer &buffer,
3300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  const dng_rect &dstArea,
3310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  const dng_rect &imageBounds);
3320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
3340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
3360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief An opcode to apply a scale factor that varies per row. Within a row,
3380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// the same scale factor is applied to all specified pixels.
3390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_opcode_ScalePerRow: public dng_inplace_opcode
3410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
3420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
3440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_area_spec fAreaSpec;
3460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		AutoPtr<dng_memory_block> fTable;
3480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
3500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Create a ScalePerRow opcode with the specified area and row scale
3520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// factors (specified as a table of 32-bit floats).
3530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_opcode_ScalePerRow (const dng_area_spec &areaSpec,
3550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								AutoPtr<dng_memory_block> &table);
3560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_opcode_ScalePerRow (dng_host &host,
3580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								dng_stream &stream);
3590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void PutData (dng_stream &stream) const;
3610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual uint32 BufferPixelType (uint32 imagePixelType);
3630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
3650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void ProcessArea (dng_negative &negative,
3670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  uint32 threadIndex,
3680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  dng_pixel_buffer &buffer,
3690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  const dng_rect &dstArea,
3700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  const dng_rect &imageBounds);
3710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
3730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
3750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief An opcode to apply a scale factor that varies per column. Within a
3770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// column, the same scale factor is applied to all specified pixels.
3780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_opcode_ScalePerColumn: public dng_inplace_opcode
3800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
3810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	private:
3830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_area_spec fAreaSpec;
3850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		AutoPtr<dng_memory_block> fTable;
3870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
3890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Create a ScalePerColumn opcode with the specified area and column
3910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// scale factors (specified as a table of 32-bit floats).
3920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_opcode_ScalePerColumn (const dng_area_spec &areaSpec,
3940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   AutoPtr<dng_memory_block> &table);
3950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_opcode_ScalePerColumn (dng_host &host,
3970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								   dng_stream &stream);
3980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
3990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void PutData (dng_stream &stream) const;
4000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual uint32 BufferPixelType (uint32 imagePixelType);
4020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual dng_rect ModifiedBounds (const dng_rect &imageBounds);
4040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void ProcessArea (dng_negative &negative,
4060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  uint32 threadIndex,
4070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  dng_pixel_buffer &buffer,
4080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  const dng_rect &dstArea,
4090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  const dng_rect &imageBounds);
4100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
4120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
4140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#endif
4160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
4170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
418