18e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
28e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// Copyright 2008 Adobe Systems Incorporated
38e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// All Rights Reserved.
48e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener//
58e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// NOTICE:  Adobe permits you to use, modify, and distribute this file in
68e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener// accordance with the terms of the Adobe license agreement accompanying it.
78e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
88e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
98e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_opcodes.cpp#1 $ */
108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $DateTime: 2012/05/30 13:28:51 $ */
118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Change: 832332 $ */
128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/* $Author: tknoll $ */
138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_opcodes.h"
178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_bottlenecks.h"
198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_exceptions.h"
208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_filter_task.h"
218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_globals.h"
228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_host.h"
238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_image.h"
248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_negative.h"
258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_parse_utils.h"
268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_stream.h"
278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener#include "dng_tag_values.h"
288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
318e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_opcode::dng_opcode (uint32 opcodeID,
328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener						uint32 minVersion,
338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener						uint32 flags)
348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	:	fOpcodeID          (opcodeID)
368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	,	fMinVersion        (minVersion)
378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	,	fFlags             (flags)
388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	,	fWasReadFromStream (false)
398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	,	fStage             (0)
408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
478e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_opcode::dng_opcode (uint32 opcodeID,
488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					    dng_stream &stream,
498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener						const char *name)
508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	:	fOpcodeID          (opcodeID)
528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	,	fMinVersion        (0)
538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	,	fFlags             (0)
548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	,	fWasReadFromStream (true)
558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	,	fStage             (0)
568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	fMinVersion = stream.Get_uint32 ();
608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	fFlags      = stream.Get_uint32 ();
618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	#if qDNGValidate
638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	if (gVerbose)
658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		{
668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		printf ("\nOpcode: ");
688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		if (name)
708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			printf ("%s", name);
728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		else
748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			printf ("Unknown (%u)", (unsigned) opcodeID);
768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		printf (", minVersion = %u.%u.%u.%u",
798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				(unsigned) ((fMinVersion >> 24) & 0x0FF),
808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				(unsigned) ((fMinVersion >> 16) & 0x0FF),
818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				(unsigned) ((fMinVersion >>  8) & 0x0FF),
828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				(unsigned) ((fMinVersion      ) & 0x0FF));
838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		printf (", flags = %u\n", (unsigned) fFlags);
858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		}
878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	#else
898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	(void) name;
918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	#endif
938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
988e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_opcode::~dng_opcode ()
998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
1008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
1028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
1048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1058e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid dng_opcode::PutData (dng_stream &stream) const
1068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
1078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	// No data by default
1098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	stream.Put_uint32 (0);
1118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
1138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
1158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1168e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerbool dng_opcode::AboutToApply (dng_host &host,
1178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							   dng_negative &negative)
1188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
1198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	if (SkipIfPreview () && host.ForPreview ())
1218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		{
1228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		negative.SetIsPreview (true);
1248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		}
1268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	else if (MinVersion () > dngVersion_Current &&
1288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			 WasReadFromStream ())
1298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		{
1308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		if (!Optional ())
1328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			// Somebody screwed up computing the DNGBackwardVersion...
1358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			ThrowBadFormat ();
1378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		}
1418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	else if (!IsValidForNegative (negative))
1438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		{
1448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		ThrowBadFormat ();
1468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		}
1488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	else if (!IsNOP ())
1508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		{
1518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		return true;
1538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		}
1558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	return false;
1578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
1598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
1618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1628e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_opcode_Unknown::dng_opcode_Unknown (dng_host &host,
1638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener										uint32 opcodeID,
1648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener										dng_stream &stream)
1658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	:	dng_opcode (opcodeID,
1678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					stream,
1688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					NULL)
1698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	,	fData ()
1718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
1738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	uint32 size = stream.Get_uint32 ();
1758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	if (size)
1778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		{
1788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		fData.Reset (host.Allocate (size));
1808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		stream.Get (fData->Buffer      (),
1828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					fData->LogicalSize ());
1838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		#if qDNGValidate
1858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		if (gVerbose)
1878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
1888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			DumpHexAscii (fData->Buffer_uint8 (),
1908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener						  fData->LogicalSize  ());
1918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
1938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		#endif
1958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		}
1978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
1988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
1998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
2018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2028e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid dng_opcode_Unknown::PutData (dng_stream &stream) const
2038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
2048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	if (fData.Get ())
2068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		{
2078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		stream.Put_uint32 (fData->LogicalSize ());
2098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		stream.Put (fData->Buffer      (),
2118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					fData->LogicalSize ());
2128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		}
2148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	else
2168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		{
2178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		stream.Put_uint32 (0);
2198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		}
2218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
2238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
2258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2268e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid dng_opcode_Unknown::Apply (dng_host & /* host */,
2278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							    dng_negative & /* negative */,
2288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							    AutoPtr<dng_image> & /* image */)
2298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
2308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	// We should never need to apply an unknown opcode.
2328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	if (!Optional ())
2348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		{
2358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		ThrowBadFormat ();
2378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		}
2398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
2418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
2438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2448e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerclass dng_filter_opcode_task: public dng_filter_task
2458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
2468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	private:
2488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_filter_opcode &fOpcode;
2508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_negative &fNegative;
2528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	public:
2548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_filter_opcode_task (dng_filter_opcode &opcode,
2568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								dng_negative &negative,
2578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								const dng_image &srcImage,
2588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener						 		dng_image &dstImage)
2598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			:	dng_filter_task (srcImage,
2618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								 dstImage)
2628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			,	fOpcode   (opcode)
2648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			,	fNegative (negative)
2658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
2678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fSrcPixelType = fOpcode.BufferPixelType (srcImage.PixelType ());
2698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fDstPixelType = fSrcPixelType;
2718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fSrcRepeat = opcode.SrcRepeat ();
2738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
2758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual dng_rect SrcArea (const dng_rect &dstArea)
2778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
2788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fOpcode.SrcArea (dstArea,
2808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									fDstImage.Bounds ());
2818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
2838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual dng_point SrcTileSize (const dng_point &dstTileSize)
2858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
2868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			return fOpcode.SrcTileSize (dstTileSize,
2888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener										fDstImage.Bounds ());
2898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
2918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual void ProcessArea (uint32 threadIndex,
2938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								  dng_pixel_buffer &srcBuffer,
2948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								  dng_pixel_buffer &dstBuffer)
2958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
2968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
2978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fOpcode.ProcessArea (fNegative,
2988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								 threadIndex,
2998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								 srcBuffer,
3008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								 dstBuffer,
3018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								 dstBuffer.Area (),
3028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								 fDstImage.Bounds ());
3038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual void Start (uint32 threadCount,
3078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							const dng_point &tileSize,
3088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							dng_memory_allocator *allocator,
3098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							dng_abort_sniffer *sniffer)
3108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
3118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			dng_filter_task::Start (threadCount,
3138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									tileSize,
3148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									allocator,
3158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									sniffer);
3168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fOpcode.Prepare (fNegative,
3188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							 threadCount,
3198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener						     tileSize,
3208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							 fDstImage.Bounds (),
3218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							 fDstImage.Planes (),
3228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							 fDstPixelType,
3238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener						     *allocator);
3248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	};
3288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
3308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3318e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_filter_opcode::dng_filter_opcode (uint32 opcodeID,
3328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									  uint32 minVersion,
3338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									  uint32 flags)
3348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	:	dng_opcode (opcodeID,
3368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					minVersion,
3378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					flags)
3388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
3408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
3428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
3448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3458e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_filter_opcode::dng_filter_opcode (uint32 opcodeID,
3468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									  dng_stream &stream,
3478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									  const char *name)
3488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	:	dng_opcode (opcodeID,
3508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					stream,
3518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					name)
3528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
3548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
3568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
3588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3598e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid dng_filter_opcode::Apply (dng_host &host,
3608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							   dng_negative &negative,
3618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							   AutoPtr<dng_image> &image)
3628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
3638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	dng_rect modifiedBounds = ModifiedBounds (image->Bounds ());
3658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	if (modifiedBounds.NotEmpty ())
3678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		{
3688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Allocate destination image.
3708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		AutoPtr<dng_image> dstImage;
3728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// If we are processing the entire image, allocate an
3748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// undefined image.
3758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		if (modifiedBounds == image->Bounds ())
3778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
3788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			dstImage.Reset (host.Make_dng_image (image->Bounds	  (),
3808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener												 image->Planes	  (),
3818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener												 image->PixelType ()));
3828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Else start with a clone of the existing image.
3868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		else
3888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
3898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			dstImage.Reset (image->Clone ());
3918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
3938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Filter the image.
3958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
3968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_filter_opcode_task task (*this,
3978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									 negative,
3988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									 *image,
3998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									 *dstImage);
4008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		host.PerformAreaTask (task,
4028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							  modifiedBounds);
4038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		// Return the new image.
4058e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		image.Reset (dstImage.Release ());
4078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		}
4098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
4118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
4138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4148e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerclass dng_inplace_opcode_task: public dng_area_task
4158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
4168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	private:
4188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4198e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_inplace_opcode &fOpcode;
4208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_negative &fNegative;
4228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_image &fImage;
4248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		uint32 fPixelType;
4268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		AutoPtr<dng_memory_block> fBuffer [kMaxMPThreads];
4288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	public:
4308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_inplace_opcode_task (dng_inplace_opcode &opcode,
4328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								 dng_negative &negative,
4338e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener						 		 dng_image &image)
4348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			:	dng_area_task ()
4368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			,	fOpcode    (opcode)
4388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			,	fNegative  (negative)
4398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			,	fImage     (image)
4408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			,	fPixelType (opcode.BufferPixelType (image.PixelType ()))
4418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
4438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
4458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual void Start (uint32 threadCount,
4478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							const dng_point &tileSize,
4488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							dng_memory_allocator *allocator,
4498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							dng_abort_sniffer * /* sniffer */)
4508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
4518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			uint32 bufferSize = ComputeBufferSize(fPixelType, tileSize,
4538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener												  fImage.Planes(), pad16Bytes);
4548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4558e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			for (uint32 threadIndex = 0; threadIndex < threadCount; threadIndex++)
4568e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				{
4578e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4588e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				fBuffer [threadIndex] . Reset (allocator->Allocate (bufferSize));
4598e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4608e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener				}
4618e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4628e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fOpcode.Prepare (fNegative,
4638e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							 threadCount,
4648e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener						     tileSize,
4658e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							 fImage.Bounds (),
4668e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							 fImage.Planes (),
4678e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							 fPixelType,
4688e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener						     *allocator);
4698e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4708e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
4718e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4728e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		virtual void Process (uint32 threadIndex,
4738e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							  const dng_rect &tile,
4748e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							  dng_abort_sniffer * /* sniffer */)
4758e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			{
4768e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4778e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			// Setup buffer.
4788e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4798e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			dng_pixel_buffer buffer(tile, 0, fImage.Planes (), fPixelType,
4808e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									pcRowInterleavedAlign16,
4818e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									fBuffer [threadIndex]->Buffer ());
4828e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4838e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			// Get source pixels.
4848e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4858e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fImage.Get (buffer);
4868e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4878e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			// Process area.
4888e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4898e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fOpcode.ProcessArea (fNegative,
4908e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								 threadIndex,
4918e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								 buffer,
4928e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								 tile,
4938e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener								 fImage.Bounds ());
4948e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4958e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			// Save result pixels.
4968e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4978e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			fImage.Put (buffer);
4988e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
4998e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener			}
5008e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5018e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	};
5028e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5038e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
5048e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5058e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_inplace_opcode::dng_inplace_opcode (uint32 opcodeID,
5068e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									    uint32 minVersion,
5078e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									    uint32 flags)
5088e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5098e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	:	dng_opcode (opcodeID,
5108e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					minVersion,
5118e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					flags)
5128e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5138e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
5148e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5158e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
5168e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5178e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
5188e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5198e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienerdng_inplace_opcode::dng_inplace_opcode (uint32 opcodeID,
5208e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									    dng_stream &stream,
5218e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									    const char *name)
5228e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5238e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	:	dng_opcode (opcodeID,
5248e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					stream,
5258e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener					name)
5268e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5278e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
5288e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5298e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
5308e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5318e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
5328e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5338e8939fc10ad63576a2785ba1333a23726b7e164Florian Krienervoid dng_inplace_opcode::Apply (dng_host &host,
5348e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							    dng_negative &negative,
5358e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							    AutoPtr<dng_image> &image)
5368e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	{
5378e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5388e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	dng_rect modifiedBounds = ModifiedBounds (image->Bounds ());
5398e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5408e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	if (modifiedBounds.NotEmpty ())
5418e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		{
5428e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5438e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		dng_inplace_opcode_task task (*this,
5448e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									  negative,
5458e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener									  *image);
5468e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5478e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		host.PerformAreaTask (task,
5488e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener							  modifiedBounds);
5498e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5508e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener		}
5518e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5528e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener	}
5538e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener
5548e8939fc10ad63576a2785ba1333a23726b7e164Florian Kriener/*****************************************************************************/
555