xref: /aosp_15_r20/external/dng_sdk/source/dng_opcodes.cpp (revision fd1fabb72dbdf09ea7034f531e6f8e9f57334c8d)
1*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
2*fd1fabb7SAndroid Build Coastguard Worker // Copyright 2008 Adobe Systems Incorporated
3*fd1fabb7SAndroid Build Coastguard Worker // All Rights Reserved.
4*fd1fabb7SAndroid Build Coastguard Worker //
5*fd1fabb7SAndroid Build Coastguard Worker // NOTICE:  Adobe permits you to use, modify, and distribute this file in
6*fd1fabb7SAndroid Build Coastguard Worker // accordance with the terms of the Adobe license agreement accompanying it.
7*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
8*fd1fabb7SAndroid Build Coastguard Worker 
9*fd1fabb7SAndroid Build Coastguard Worker /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_opcodes.cpp#1 $ */
10*fd1fabb7SAndroid Build Coastguard Worker /* $DateTime: 2012/05/30 13:28:51 $ */
11*fd1fabb7SAndroid Build Coastguard Worker /* $Change: 832332 $ */
12*fd1fabb7SAndroid Build Coastguard Worker /* $Author: tknoll $ */
13*fd1fabb7SAndroid Build Coastguard Worker 
14*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
15*fd1fabb7SAndroid Build Coastguard Worker 
16*fd1fabb7SAndroid Build Coastguard Worker #include "dng_opcodes.h"
17*fd1fabb7SAndroid Build Coastguard Worker 
18*fd1fabb7SAndroid Build Coastguard Worker #include "dng_bottlenecks.h"
19*fd1fabb7SAndroid Build Coastguard Worker #include "dng_exceptions.h"
20*fd1fabb7SAndroid Build Coastguard Worker #include "dng_filter_task.h"
21*fd1fabb7SAndroid Build Coastguard Worker #include "dng_globals.h"
22*fd1fabb7SAndroid Build Coastguard Worker #include "dng_host.h"
23*fd1fabb7SAndroid Build Coastguard Worker #include "dng_image.h"
24*fd1fabb7SAndroid Build Coastguard Worker #include "dng_negative.h"
25*fd1fabb7SAndroid Build Coastguard Worker #include "dng_parse_utils.h"
26*fd1fabb7SAndroid Build Coastguard Worker #include "dng_stream.h"
27*fd1fabb7SAndroid Build Coastguard Worker #include "dng_tag_values.h"
28*fd1fabb7SAndroid Build Coastguard Worker 
29*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
30*fd1fabb7SAndroid Build Coastguard Worker 
dng_opcode(uint32 opcodeID,uint32 minVersion,uint32 flags)31*fd1fabb7SAndroid Build Coastguard Worker dng_opcode::dng_opcode (uint32 opcodeID,
32*fd1fabb7SAndroid Build Coastguard Worker 						uint32 minVersion,
33*fd1fabb7SAndroid Build Coastguard Worker 						uint32 flags)
34*fd1fabb7SAndroid Build Coastguard Worker 
35*fd1fabb7SAndroid Build Coastguard Worker 	:	fOpcodeID          (opcodeID)
36*fd1fabb7SAndroid Build Coastguard Worker 	,	fMinVersion        (minVersion)
37*fd1fabb7SAndroid Build Coastguard Worker 	,	fFlags             (flags)
38*fd1fabb7SAndroid Build Coastguard Worker 	,	fWasReadFromStream (false)
39*fd1fabb7SAndroid Build Coastguard Worker 	,	fStage             (0)
40*fd1fabb7SAndroid Build Coastguard Worker 
41*fd1fabb7SAndroid Build Coastguard Worker 	{
42*fd1fabb7SAndroid Build Coastguard Worker 
43*fd1fabb7SAndroid Build Coastguard Worker 	}
44*fd1fabb7SAndroid Build Coastguard Worker 
45*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
46*fd1fabb7SAndroid Build Coastguard Worker 
dng_opcode(uint32 opcodeID,dng_stream & stream,const char * name)47*fd1fabb7SAndroid Build Coastguard Worker dng_opcode::dng_opcode (uint32 opcodeID,
48*fd1fabb7SAndroid Build Coastguard Worker 					    dng_stream &stream,
49*fd1fabb7SAndroid Build Coastguard Worker 						const char *name)
50*fd1fabb7SAndroid Build Coastguard Worker 
51*fd1fabb7SAndroid Build Coastguard Worker 	:	fOpcodeID          (opcodeID)
52*fd1fabb7SAndroid Build Coastguard Worker 	,	fMinVersion        (0)
53*fd1fabb7SAndroid Build Coastguard Worker 	,	fFlags             (0)
54*fd1fabb7SAndroid Build Coastguard Worker 	,	fWasReadFromStream (true)
55*fd1fabb7SAndroid Build Coastguard Worker 	,	fStage             (0)
56*fd1fabb7SAndroid Build Coastguard Worker 
57*fd1fabb7SAndroid Build Coastguard Worker 	{
58*fd1fabb7SAndroid Build Coastguard Worker 
59*fd1fabb7SAndroid Build Coastguard Worker 	fMinVersion = stream.Get_uint32 ();
60*fd1fabb7SAndroid Build Coastguard Worker 	fFlags      = stream.Get_uint32 ();
61*fd1fabb7SAndroid Build Coastguard Worker 
62*fd1fabb7SAndroid Build Coastguard Worker 	#if qDNGValidate
63*fd1fabb7SAndroid Build Coastguard Worker 
64*fd1fabb7SAndroid Build Coastguard Worker 	if (gVerbose)
65*fd1fabb7SAndroid Build Coastguard Worker 		{
66*fd1fabb7SAndroid Build Coastguard Worker 
67*fd1fabb7SAndroid Build Coastguard Worker 		printf ("\nOpcode: ");
68*fd1fabb7SAndroid Build Coastguard Worker 
69*fd1fabb7SAndroid Build Coastguard Worker 		if (name)
70*fd1fabb7SAndroid Build Coastguard Worker 			{
71*fd1fabb7SAndroid Build Coastguard Worker 			printf ("%s", name);
72*fd1fabb7SAndroid Build Coastguard Worker 			}
73*fd1fabb7SAndroid Build Coastguard Worker 		else
74*fd1fabb7SAndroid Build Coastguard Worker 			{
75*fd1fabb7SAndroid Build Coastguard Worker 			printf ("Unknown (%u)", (unsigned) opcodeID);
76*fd1fabb7SAndroid Build Coastguard Worker 			}
77*fd1fabb7SAndroid Build Coastguard Worker 
78*fd1fabb7SAndroid Build Coastguard Worker 		printf (", minVersion = %u.%u.%u.%u",
79*fd1fabb7SAndroid Build Coastguard Worker 				(unsigned) ((fMinVersion >> 24) & 0x0FF),
80*fd1fabb7SAndroid Build Coastguard Worker 				(unsigned) ((fMinVersion >> 16) & 0x0FF),
81*fd1fabb7SAndroid Build Coastguard Worker 				(unsigned) ((fMinVersion >>  8) & 0x0FF),
82*fd1fabb7SAndroid Build Coastguard Worker 				(unsigned) ((fMinVersion      ) & 0x0FF));
83*fd1fabb7SAndroid Build Coastguard Worker 
84*fd1fabb7SAndroid Build Coastguard Worker 		printf (", flags = %u\n", (unsigned) fFlags);
85*fd1fabb7SAndroid Build Coastguard Worker 
86*fd1fabb7SAndroid Build Coastguard Worker 		}
87*fd1fabb7SAndroid Build Coastguard Worker 
88*fd1fabb7SAndroid Build Coastguard Worker 	#else
89*fd1fabb7SAndroid Build Coastguard Worker 
90*fd1fabb7SAndroid Build Coastguard Worker 	(void) name;
91*fd1fabb7SAndroid Build Coastguard Worker 
92*fd1fabb7SAndroid Build Coastguard Worker 	#endif
93*fd1fabb7SAndroid Build Coastguard Worker 
94*fd1fabb7SAndroid Build Coastguard Worker 	}
95*fd1fabb7SAndroid Build Coastguard Worker 
96*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
97*fd1fabb7SAndroid Build Coastguard Worker 
~dng_opcode()98*fd1fabb7SAndroid Build Coastguard Worker dng_opcode::~dng_opcode ()
99*fd1fabb7SAndroid Build Coastguard Worker 	{
100*fd1fabb7SAndroid Build Coastguard Worker 
101*fd1fabb7SAndroid Build Coastguard Worker 	}
102*fd1fabb7SAndroid Build Coastguard Worker 
103*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
104*fd1fabb7SAndroid Build Coastguard Worker 
PutData(dng_stream & stream) const105*fd1fabb7SAndroid Build Coastguard Worker void dng_opcode::PutData (dng_stream &stream) const
106*fd1fabb7SAndroid Build Coastguard Worker 	{
107*fd1fabb7SAndroid Build Coastguard Worker 
108*fd1fabb7SAndroid Build Coastguard Worker 	// No data by default
109*fd1fabb7SAndroid Build Coastguard Worker 
110*fd1fabb7SAndroid Build Coastguard Worker 	stream.Put_uint32 (0);
111*fd1fabb7SAndroid Build Coastguard Worker 
112*fd1fabb7SAndroid Build Coastguard Worker 	}
113*fd1fabb7SAndroid Build Coastguard Worker 
114*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
115*fd1fabb7SAndroid Build Coastguard Worker 
AboutToApply(dng_host & host,dng_negative & negative)116*fd1fabb7SAndroid Build Coastguard Worker bool dng_opcode::AboutToApply (dng_host &host,
117*fd1fabb7SAndroid Build Coastguard Worker 							   dng_negative &negative)
118*fd1fabb7SAndroid Build Coastguard Worker 	{
119*fd1fabb7SAndroid Build Coastguard Worker 
120*fd1fabb7SAndroid Build Coastguard Worker 	if (SkipIfPreview () && host.ForPreview ())
121*fd1fabb7SAndroid Build Coastguard Worker 		{
122*fd1fabb7SAndroid Build Coastguard Worker 
123*fd1fabb7SAndroid Build Coastguard Worker 		negative.SetIsPreview (true);
124*fd1fabb7SAndroid Build Coastguard Worker 
125*fd1fabb7SAndroid Build Coastguard Worker 		}
126*fd1fabb7SAndroid Build Coastguard Worker 
127*fd1fabb7SAndroid Build Coastguard Worker 	else if (MinVersion () > dngVersion_Current &&
128*fd1fabb7SAndroid Build Coastguard Worker 			 WasReadFromStream ())
129*fd1fabb7SAndroid Build Coastguard Worker 		{
130*fd1fabb7SAndroid Build Coastguard Worker 
131*fd1fabb7SAndroid Build Coastguard Worker 		if (!Optional ())
132*fd1fabb7SAndroid Build Coastguard Worker 			{
133*fd1fabb7SAndroid Build Coastguard Worker 
134*fd1fabb7SAndroid Build Coastguard Worker 			// Somebody screwed up computing the DNGBackwardVersion...
135*fd1fabb7SAndroid Build Coastguard Worker 
136*fd1fabb7SAndroid Build Coastguard Worker 			ThrowBadFormat ();
137*fd1fabb7SAndroid Build Coastguard Worker 
138*fd1fabb7SAndroid Build Coastguard Worker 			}
139*fd1fabb7SAndroid Build Coastguard Worker 
140*fd1fabb7SAndroid Build Coastguard Worker 		}
141*fd1fabb7SAndroid Build Coastguard Worker 
142*fd1fabb7SAndroid Build Coastguard Worker 	else if (!IsValidForNegative (negative))
143*fd1fabb7SAndroid Build Coastguard Worker 		{
144*fd1fabb7SAndroid Build Coastguard Worker 
145*fd1fabb7SAndroid Build Coastguard Worker 		ThrowBadFormat ();
146*fd1fabb7SAndroid Build Coastguard Worker 
147*fd1fabb7SAndroid Build Coastguard Worker 		}
148*fd1fabb7SAndroid Build Coastguard Worker 
149*fd1fabb7SAndroid Build Coastguard Worker 	else if (!IsNOP ())
150*fd1fabb7SAndroid Build Coastguard Worker 		{
151*fd1fabb7SAndroid Build Coastguard Worker 
152*fd1fabb7SAndroid Build Coastguard Worker 		return true;
153*fd1fabb7SAndroid Build Coastguard Worker 
154*fd1fabb7SAndroid Build Coastguard Worker 		}
155*fd1fabb7SAndroid Build Coastguard Worker 
156*fd1fabb7SAndroid Build Coastguard Worker 	return false;
157*fd1fabb7SAndroid Build Coastguard Worker 
158*fd1fabb7SAndroid Build Coastguard Worker 	}
159*fd1fabb7SAndroid Build Coastguard Worker 
160*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
161*fd1fabb7SAndroid Build Coastguard Worker 
dng_opcode_Unknown(dng_host & host,uint32 opcodeID,dng_stream & stream)162*fd1fabb7SAndroid Build Coastguard Worker dng_opcode_Unknown::dng_opcode_Unknown (dng_host &host,
163*fd1fabb7SAndroid Build Coastguard Worker 										uint32 opcodeID,
164*fd1fabb7SAndroid Build Coastguard Worker 										dng_stream &stream)
165*fd1fabb7SAndroid Build Coastguard Worker 
166*fd1fabb7SAndroid Build Coastguard Worker 	:	dng_opcode (opcodeID,
167*fd1fabb7SAndroid Build Coastguard Worker 					stream,
168*fd1fabb7SAndroid Build Coastguard Worker 					NULL)
169*fd1fabb7SAndroid Build Coastguard Worker 
170*fd1fabb7SAndroid Build Coastguard Worker 	,	fData ()
171*fd1fabb7SAndroid Build Coastguard Worker 
172*fd1fabb7SAndroid Build Coastguard Worker 	{
173*fd1fabb7SAndroid Build Coastguard Worker 
174*fd1fabb7SAndroid Build Coastguard Worker 	uint32 size = stream.Get_uint32 ();
175*fd1fabb7SAndroid Build Coastguard Worker 
176*fd1fabb7SAndroid Build Coastguard Worker 	if (size)
177*fd1fabb7SAndroid Build Coastguard Worker 		{
178*fd1fabb7SAndroid Build Coastguard Worker 
179*fd1fabb7SAndroid Build Coastguard Worker 		fData.Reset (host.Allocate (size));
180*fd1fabb7SAndroid Build Coastguard Worker 
181*fd1fabb7SAndroid Build Coastguard Worker 		stream.Get (fData->Buffer      (),
182*fd1fabb7SAndroid Build Coastguard Worker 					fData->LogicalSize ());
183*fd1fabb7SAndroid Build Coastguard Worker 
184*fd1fabb7SAndroid Build Coastguard Worker 		#if qDNGValidate
185*fd1fabb7SAndroid Build Coastguard Worker 
186*fd1fabb7SAndroid Build Coastguard Worker 		if (gVerbose)
187*fd1fabb7SAndroid Build Coastguard Worker 			{
188*fd1fabb7SAndroid Build Coastguard Worker 
189*fd1fabb7SAndroid Build Coastguard Worker 			DumpHexAscii (fData->Buffer_uint8 (),
190*fd1fabb7SAndroid Build Coastguard Worker 						  fData->LogicalSize  ());
191*fd1fabb7SAndroid Build Coastguard Worker 
192*fd1fabb7SAndroid Build Coastguard Worker 			}
193*fd1fabb7SAndroid Build Coastguard Worker 
194*fd1fabb7SAndroid Build Coastguard Worker 		#endif
195*fd1fabb7SAndroid Build Coastguard Worker 
196*fd1fabb7SAndroid Build Coastguard Worker 		}
197*fd1fabb7SAndroid Build Coastguard Worker 
198*fd1fabb7SAndroid Build Coastguard Worker 	}
199*fd1fabb7SAndroid Build Coastguard Worker 
200*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
201*fd1fabb7SAndroid Build Coastguard Worker 
PutData(dng_stream & stream) const202*fd1fabb7SAndroid Build Coastguard Worker void dng_opcode_Unknown::PutData (dng_stream &stream) const
203*fd1fabb7SAndroid Build Coastguard Worker 	{
204*fd1fabb7SAndroid Build Coastguard Worker 
205*fd1fabb7SAndroid Build Coastguard Worker 	if (fData.Get ())
206*fd1fabb7SAndroid Build Coastguard Worker 		{
207*fd1fabb7SAndroid Build Coastguard Worker 
208*fd1fabb7SAndroid Build Coastguard Worker 		stream.Put_uint32 (fData->LogicalSize ());
209*fd1fabb7SAndroid Build Coastguard Worker 
210*fd1fabb7SAndroid Build Coastguard Worker 		stream.Put (fData->Buffer      (),
211*fd1fabb7SAndroid Build Coastguard Worker 					fData->LogicalSize ());
212*fd1fabb7SAndroid Build Coastguard Worker 
213*fd1fabb7SAndroid Build Coastguard Worker 		}
214*fd1fabb7SAndroid Build Coastguard Worker 
215*fd1fabb7SAndroid Build Coastguard Worker 	else
216*fd1fabb7SAndroid Build Coastguard Worker 		{
217*fd1fabb7SAndroid Build Coastguard Worker 
218*fd1fabb7SAndroid Build Coastguard Worker 		stream.Put_uint32 (0);
219*fd1fabb7SAndroid Build Coastguard Worker 
220*fd1fabb7SAndroid Build Coastguard Worker 		}
221*fd1fabb7SAndroid Build Coastguard Worker 
222*fd1fabb7SAndroid Build Coastguard Worker 	}
223*fd1fabb7SAndroid Build Coastguard Worker 
224*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
225*fd1fabb7SAndroid Build Coastguard Worker 
Apply(dng_host &,dng_negative &,AutoPtr<dng_image> &)226*fd1fabb7SAndroid Build Coastguard Worker void dng_opcode_Unknown::Apply (dng_host & /* host */,
227*fd1fabb7SAndroid Build Coastguard Worker 							    dng_negative & /* negative */,
228*fd1fabb7SAndroid Build Coastguard Worker 							    AutoPtr<dng_image> & /* image */)
229*fd1fabb7SAndroid Build Coastguard Worker 	{
230*fd1fabb7SAndroid Build Coastguard Worker 
231*fd1fabb7SAndroid Build Coastguard Worker 	// We should never need to apply an unknown opcode.
232*fd1fabb7SAndroid Build Coastguard Worker 
233*fd1fabb7SAndroid Build Coastguard Worker 	if (!Optional ())
234*fd1fabb7SAndroid Build Coastguard Worker 		{
235*fd1fabb7SAndroid Build Coastguard Worker 
236*fd1fabb7SAndroid Build Coastguard Worker 		ThrowBadFormat ();
237*fd1fabb7SAndroid Build Coastguard Worker 
238*fd1fabb7SAndroid Build Coastguard Worker 		}
239*fd1fabb7SAndroid Build Coastguard Worker 
240*fd1fabb7SAndroid Build Coastguard Worker 	}
241*fd1fabb7SAndroid Build Coastguard Worker 
242*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
243*fd1fabb7SAndroid Build Coastguard Worker 
244*fd1fabb7SAndroid Build Coastguard Worker class dng_filter_opcode_task: public dng_filter_task
245*fd1fabb7SAndroid Build Coastguard Worker 	{
246*fd1fabb7SAndroid Build Coastguard Worker 
247*fd1fabb7SAndroid Build Coastguard Worker 	private:
248*fd1fabb7SAndroid Build Coastguard Worker 
249*fd1fabb7SAndroid Build Coastguard Worker 		dng_filter_opcode &fOpcode;
250*fd1fabb7SAndroid Build Coastguard Worker 
251*fd1fabb7SAndroid Build Coastguard Worker 		dng_negative &fNegative;
252*fd1fabb7SAndroid Build Coastguard Worker 
253*fd1fabb7SAndroid Build Coastguard Worker 	public:
254*fd1fabb7SAndroid Build Coastguard Worker 
dng_filter_opcode_task(dng_filter_opcode & opcode,dng_negative & negative,const dng_image & srcImage,dng_image & dstImage)255*fd1fabb7SAndroid Build Coastguard Worker 		dng_filter_opcode_task (dng_filter_opcode &opcode,
256*fd1fabb7SAndroid Build Coastguard Worker 								dng_negative &negative,
257*fd1fabb7SAndroid Build Coastguard Worker 								const dng_image &srcImage,
258*fd1fabb7SAndroid Build Coastguard Worker 						 		dng_image &dstImage)
259*fd1fabb7SAndroid Build Coastguard Worker 
260*fd1fabb7SAndroid Build Coastguard Worker 			:	dng_filter_task (srcImage,
261*fd1fabb7SAndroid Build Coastguard Worker 								 dstImage)
262*fd1fabb7SAndroid Build Coastguard Worker 
263*fd1fabb7SAndroid Build Coastguard Worker 			,	fOpcode   (opcode)
264*fd1fabb7SAndroid Build Coastguard Worker 			,	fNegative (negative)
265*fd1fabb7SAndroid Build Coastguard Worker 
266*fd1fabb7SAndroid Build Coastguard Worker 			{
267*fd1fabb7SAndroid Build Coastguard Worker 
268*fd1fabb7SAndroid Build Coastguard Worker 			fSrcPixelType = fOpcode.BufferPixelType (srcImage.PixelType ());
269*fd1fabb7SAndroid Build Coastguard Worker 
270*fd1fabb7SAndroid Build Coastguard Worker 			fDstPixelType = fSrcPixelType;
271*fd1fabb7SAndroid Build Coastguard Worker 
272*fd1fabb7SAndroid Build Coastguard Worker 			fSrcRepeat = opcode.SrcRepeat ();
273*fd1fabb7SAndroid Build Coastguard Worker 
274*fd1fabb7SAndroid Build Coastguard Worker 			}
275*fd1fabb7SAndroid Build Coastguard Worker 
SrcArea(const dng_rect & dstArea)276*fd1fabb7SAndroid Build Coastguard Worker 		virtual dng_rect SrcArea (const dng_rect &dstArea)
277*fd1fabb7SAndroid Build Coastguard Worker 			{
278*fd1fabb7SAndroid Build Coastguard Worker 
279*fd1fabb7SAndroid Build Coastguard Worker 			return fOpcode.SrcArea (dstArea,
280*fd1fabb7SAndroid Build Coastguard Worker 									fDstImage.Bounds ());
281*fd1fabb7SAndroid Build Coastguard Worker 
282*fd1fabb7SAndroid Build Coastguard Worker 			}
283*fd1fabb7SAndroid Build Coastguard Worker 
SrcTileSize(const dng_point & dstTileSize)284*fd1fabb7SAndroid Build Coastguard Worker 		virtual dng_point SrcTileSize (const dng_point &dstTileSize)
285*fd1fabb7SAndroid Build Coastguard Worker 			{
286*fd1fabb7SAndroid Build Coastguard Worker 
287*fd1fabb7SAndroid Build Coastguard Worker 			return fOpcode.SrcTileSize (dstTileSize,
288*fd1fabb7SAndroid Build Coastguard Worker 										fDstImage.Bounds ());
289*fd1fabb7SAndroid Build Coastguard Worker 
290*fd1fabb7SAndroid Build Coastguard Worker 			}
291*fd1fabb7SAndroid Build Coastguard Worker 
ProcessArea(uint32 threadIndex,dng_pixel_buffer & srcBuffer,dng_pixel_buffer & dstBuffer)292*fd1fabb7SAndroid Build Coastguard Worker 		virtual void ProcessArea (uint32 threadIndex,
293*fd1fabb7SAndroid Build Coastguard Worker 								  dng_pixel_buffer &srcBuffer,
294*fd1fabb7SAndroid Build Coastguard Worker 								  dng_pixel_buffer &dstBuffer)
295*fd1fabb7SAndroid Build Coastguard Worker 			{
296*fd1fabb7SAndroid Build Coastguard Worker 
297*fd1fabb7SAndroid Build Coastguard Worker 			fOpcode.ProcessArea (fNegative,
298*fd1fabb7SAndroid Build Coastguard Worker 								 threadIndex,
299*fd1fabb7SAndroid Build Coastguard Worker 								 srcBuffer,
300*fd1fabb7SAndroid Build Coastguard Worker 								 dstBuffer,
301*fd1fabb7SAndroid Build Coastguard Worker 								 dstBuffer.Area (),
302*fd1fabb7SAndroid Build Coastguard Worker 								 fDstImage.Bounds ());
303*fd1fabb7SAndroid Build Coastguard Worker 
304*fd1fabb7SAndroid Build Coastguard Worker 			}
305*fd1fabb7SAndroid Build Coastguard Worker 
Start(uint32 threadCount,const dng_point & tileSize,dng_memory_allocator * allocator,dng_abort_sniffer * sniffer)306*fd1fabb7SAndroid Build Coastguard Worker 		virtual void Start (uint32 threadCount,
307*fd1fabb7SAndroid Build Coastguard Worker 							const dng_point &tileSize,
308*fd1fabb7SAndroid Build Coastguard Worker 							dng_memory_allocator *allocator,
309*fd1fabb7SAndroid Build Coastguard Worker 							dng_abort_sniffer *sniffer)
310*fd1fabb7SAndroid Build Coastguard Worker 			{
311*fd1fabb7SAndroid Build Coastguard Worker 
312*fd1fabb7SAndroid Build Coastguard Worker 			dng_filter_task::Start (threadCount,
313*fd1fabb7SAndroid Build Coastguard Worker 									tileSize,
314*fd1fabb7SAndroid Build Coastguard Worker 									allocator,
315*fd1fabb7SAndroid Build Coastguard Worker 									sniffer);
316*fd1fabb7SAndroid Build Coastguard Worker 
317*fd1fabb7SAndroid Build Coastguard Worker 			fOpcode.Prepare (fNegative,
318*fd1fabb7SAndroid Build Coastguard Worker 							 threadCount,
319*fd1fabb7SAndroid Build Coastguard Worker 						     tileSize,
320*fd1fabb7SAndroid Build Coastguard Worker 							 fDstImage.Bounds (),
321*fd1fabb7SAndroid Build Coastguard Worker 							 fDstImage.Planes (),
322*fd1fabb7SAndroid Build Coastguard Worker 							 fDstPixelType,
323*fd1fabb7SAndroid Build Coastguard Worker 						     *allocator);
324*fd1fabb7SAndroid Build Coastguard Worker 
325*fd1fabb7SAndroid Build Coastguard Worker 			}
326*fd1fabb7SAndroid Build Coastguard Worker 
327*fd1fabb7SAndroid Build Coastguard Worker 	};
328*fd1fabb7SAndroid Build Coastguard Worker 
329*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
330*fd1fabb7SAndroid Build Coastguard Worker 
dng_filter_opcode(uint32 opcodeID,uint32 minVersion,uint32 flags)331*fd1fabb7SAndroid Build Coastguard Worker dng_filter_opcode::dng_filter_opcode (uint32 opcodeID,
332*fd1fabb7SAndroid Build Coastguard Worker 									  uint32 minVersion,
333*fd1fabb7SAndroid Build Coastguard Worker 									  uint32 flags)
334*fd1fabb7SAndroid Build Coastguard Worker 
335*fd1fabb7SAndroid Build Coastguard Worker 	:	dng_opcode (opcodeID,
336*fd1fabb7SAndroid Build Coastguard Worker 					minVersion,
337*fd1fabb7SAndroid Build Coastguard Worker 					flags)
338*fd1fabb7SAndroid Build Coastguard Worker 
339*fd1fabb7SAndroid Build Coastguard Worker 	{
340*fd1fabb7SAndroid Build Coastguard Worker 
341*fd1fabb7SAndroid Build Coastguard Worker 	}
342*fd1fabb7SAndroid Build Coastguard Worker 
343*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
344*fd1fabb7SAndroid Build Coastguard Worker 
dng_filter_opcode(uint32 opcodeID,dng_stream & stream,const char * name)345*fd1fabb7SAndroid Build Coastguard Worker dng_filter_opcode::dng_filter_opcode (uint32 opcodeID,
346*fd1fabb7SAndroid Build Coastguard Worker 									  dng_stream &stream,
347*fd1fabb7SAndroid Build Coastguard Worker 									  const char *name)
348*fd1fabb7SAndroid Build Coastguard Worker 
349*fd1fabb7SAndroid Build Coastguard Worker 	:	dng_opcode (opcodeID,
350*fd1fabb7SAndroid Build Coastguard Worker 					stream,
351*fd1fabb7SAndroid Build Coastguard Worker 					name)
352*fd1fabb7SAndroid Build Coastguard Worker 
353*fd1fabb7SAndroid Build Coastguard Worker 	{
354*fd1fabb7SAndroid Build Coastguard Worker 
355*fd1fabb7SAndroid Build Coastguard Worker 	}
356*fd1fabb7SAndroid Build Coastguard Worker 
357*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
358*fd1fabb7SAndroid Build Coastguard Worker 
Apply(dng_host & host,dng_negative & negative,AutoPtr<dng_image> & image)359*fd1fabb7SAndroid Build Coastguard Worker void dng_filter_opcode::Apply (dng_host &host,
360*fd1fabb7SAndroid Build Coastguard Worker 							   dng_negative &negative,
361*fd1fabb7SAndroid Build Coastguard Worker 							   AutoPtr<dng_image> &image)
362*fd1fabb7SAndroid Build Coastguard Worker 	{
363*fd1fabb7SAndroid Build Coastguard Worker 
364*fd1fabb7SAndroid Build Coastguard Worker 	dng_rect modifiedBounds = ModifiedBounds (image->Bounds ());
365*fd1fabb7SAndroid Build Coastguard Worker 
366*fd1fabb7SAndroid Build Coastguard Worker 	if (modifiedBounds.NotEmpty ())
367*fd1fabb7SAndroid Build Coastguard Worker 		{
368*fd1fabb7SAndroid Build Coastguard Worker 
369*fd1fabb7SAndroid Build Coastguard Worker 		// Allocate destination image.
370*fd1fabb7SAndroid Build Coastguard Worker 
371*fd1fabb7SAndroid Build Coastguard Worker 		AutoPtr<dng_image> dstImage;
372*fd1fabb7SAndroid Build Coastguard Worker 
373*fd1fabb7SAndroid Build Coastguard Worker 		// If we are processing the entire image, allocate an
374*fd1fabb7SAndroid Build Coastguard Worker 		// undefined image.
375*fd1fabb7SAndroid Build Coastguard Worker 
376*fd1fabb7SAndroid Build Coastguard Worker 		if (modifiedBounds == image->Bounds ())
377*fd1fabb7SAndroid Build Coastguard Worker 			{
378*fd1fabb7SAndroid Build Coastguard Worker 
379*fd1fabb7SAndroid Build Coastguard Worker 			dstImage.Reset (host.Make_dng_image (image->Bounds	  (),
380*fd1fabb7SAndroid Build Coastguard Worker 												 image->Planes	  (),
381*fd1fabb7SAndroid Build Coastguard Worker 												 image->PixelType ()));
382*fd1fabb7SAndroid Build Coastguard Worker 
383*fd1fabb7SAndroid Build Coastguard Worker 			}
384*fd1fabb7SAndroid Build Coastguard Worker 
385*fd1fabb7SAndroid Build Coastguard Worker 		// Else start with a clone of the existing image.
386*fd1fabb7SAndroid Build Coastguard Worker 
387*fd1fabb7SAndroid Build Coastguard Worker 		else
388*fd1fabb7SAndroid Build Coastguard Worker 			{
389*fd1fabb7SAndroid Build Coastguard Worker 
390*fd1fabb7SAndroid Build Coastguard Worker 			dstImage.Reset (image->Clone ());
391*fd1fabb7SAndroid Build Coastguard Worker 
392*fd1fabb7SAndroid Build Coastguard Worker 			}
393*fd1fabb7SAndroid Build Coastguard Worker 
394*fd1fabb7SAndroid Build Coastguard Worker 		// Filter the image.
395*fd1fabb7SAndroid Build Coastguard Worker 
396*fd1fabb7SAndroid Build Coastguard Worker 		dng_filter_opcode_task task (*this,
397*fd1fabb7SAndroid Build Coastguard Worker 									 negative,
398*fd1fabb7SAndroid Build Coastguard Worker 									 *image,
399*fd1fabb7SAndroid Build Coastguard Worker 									 *dstImage);
400*fd1fabb7SAndroid Build Coastguard Worker 
401*fd1fabb7SAndroid Build Coastguard Worker 		host.PerformAreaTask (task,
402*fd1fabb7SAndroid Build Coastguard Worker 							  modifiedBounds);
403*fd1fabb7SAndroid Build Coastguard Worker 
404*fd1fabb7SAndroid Build Coastguard Worker 		// Return the new image.
405*fd1fabb7SAndroid Build Coastguard Worker 
406*fd1fabb7SAndroid Build Coastguard Worker 		image.Reset (dstImage.Release ());
407*fd1fabb7SAndroid Build Coastguard Worker 
408*fd1fabb7SAndroid Build Coastguard Worker 		}
409*fd1fabb7SAndroid Build Coastguard Worker 
410*fd1fabb7SAndroid Build Coastguard Worker 	}
411*fd1fabb7SAndroid Build Coastguard Worker 
412*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
413*fd1fabb7SAndroid Build Coastguard Worker 
414*fd1fabb7SAndroid Build Coastguard Worker class dng_inplace_opcode_task: public dng_area_task
415*fd1fabb7SAndroid Build Coastguard Worker 	{
416*fd1fabb7SAndroid Build Coastguard Worker 
417*fd1fabb7SAndroid Build Coastguard Worker 	private:
418*fd1fabb7SAndroid Build Coastguard Worker 
419*fd1fabb7SAndroid Build Coastguard Worker 		dng_inplace_opcode &fOpcode;
420*fd1fabb7SAndroid Build Coastguard Worker 
421*fd1fabb7SAndroid Build Coastguard Worker 		dng_negative &fNegative;
422*fd1fabb7SAndroid Build Coastguard Worker 
423*fd1fabb7SAndroid Build Coastguard Worker 		dng_image &fImage;
424*fd1fabb7SAndroid Build Coastguard Worker 
425*fd1fabb7SAndroid Build Coastguard Worker 		uint32 fPixelType;
426*fd1fabb7SAndroid Build Coastguard Worker 
427*fd1fabb7SAndroid Build Coastguard Worker 		AutoPtr<dng_memory_block> fBuffer [kMaxMPThreads];
428*fd1fabb7SAndroid Build Coastguard Worker 
429*fd1fabb7SAndroid Build Coastguard Worker 	public:
430*fd1fabb7SAndroid Build Coastguard Worker 
dng_inplace_opcode_task(dng_inplace_opcode & opcode,dng_negative & negative,dng_image & image)431*fd1fabb7SAndroid Build Coastguard Worker 		dng_inplace_opcode_task (dng_inplace_opcode &opcode,
432*fd1fabb7SAndroid Build Coastguard Worker 								 dng_negative &negative,
433*fd1fabb7SAndroid Build Coastguard Worker 						 		 dng_image &image)
434*fd1fabb7SAndroid Build Coastguard Worker 
435*fd1fabb7SAndroid Build Coastguard Worker 			:	dng_area_task ()
436*fd1fabb7SAndroid Build Coastguard Worker 
437*fd1fabb7SAndroid Build Coastguard Worker 			,	fOpcode    (opcode)
438*fd1fabb7SAndroid Build Coastguard Worker 			,	fNegative  (negative)
439*fd1fabb7SAndroid Build Coastguard Worker 			,	fImage     (image)
440*fd1fabb7SAndroid Build Coastguard Worker 			,	fPixelType (opcode.BufferPixelType (image.PixelType ()))
441*fd1fabb7SAndroid Build Coastguard Worker 
442*fd1fabb7SAndroid Build Coastguard Worker 			{
443*fd1fabb7SAndroid Build Coastguard Worker 
444*fd1fabb7SAndroid Build Coastguard Worker 			}
445*fd1fabb7SAndroid Build Coastguard Worker 
Start(uint32 threadCount,const dng_point & tileSize,dng_memory_allocator * allocator,dng_abort_sniffer *)446*fd1fabb7SAndroid Build Coastguard Worker 		virtual void Start (uint32 threadCount,
447*fd1fabb7SAndroid Build Coastguard Worker 							const dng_point &tileSize,
448*fd1fabb7SAndroid Build Coastguard Worker 							dng_memory_allocator *allocator,
449*fd1fabb7SAndroid Build Coastguard Worker 							dng_abort_sniffer * /* sniffer */)
450*fd1fabb7SAndroid Build Coastguard Worker 			{
451*fd1fabb7SAndroid Build Coastguard Worker 
452*fd1fabb7SAndroid Build Coastguard Worker 			uint32 bufferSize = ComputeBufferSize(fPixelType, tileSize,
453*fd1fabb7SAndroid Build Coastguard Worker 												  fImage.Planes(), pad16Bytes);
454*fd1fabb7SAndroid Build Coastguard Worker 
455*fd1fabb7SAndroid Build Coastguard Worker 			for (uint32 threadIndex = 0; threadIndex < threadCount; threadIndex++)
456*fd1fabb7SAndroid Build Coastguard Worker 				{
457*fd1fabb7SAndroid Build Coastguard Worker 
458*fd1fabb7SAndroid Build Coastguard Worker 				fBuffer [threadIndex] . Reset (allocator->Allocate (bufferSize));
459*fd1fabb7SAndroid Build Coastguard Worker 
460*fd1fabb7SAndroid Build Coastguard Worker 				}
461*fd1fabb7SAndroid Build Coastguard Worker 
462*fd1fabb7SAndroid Build Coastguard Worker 			fOpcode.Prepare (fNegative,
463*fd1fabb7SAndroid Build Coastguard Worker 							 threadCount,
464*fd1fabb7SAndroid Build Coastguard Worker 						     tileSize,
465*fd1fabb7SAndroid Build Coastguard Worker 							 fImage.Bounds (),
466*fd1fabb7SAndroid Build Coastguard Worker 							 fImage.Planes (),
467*fd1fabb7SAndroid Build Coastguard Worker 							 fPixelType,
468*fd1fabb7SAndroid Build Coastguard Worker 						     *allocator);
469*fd1fabb7SAndroid Build Coastguard Worker 
470*fd1fabb7SAndroid Build Coastguard Worker 			}
471*fd1fabb7SAndroid Build Coastguard Worker 
Process(uint32 threadIndex,const dng_rect & tile,dng_abort_sniffer *)472*fd1fabb7SAndroid Build Coastguard Worker 		virtual void Process (uint32 threadIndex,
473*fd1fabb7SAndroid Build Coastguard Worker 							  const dng_rect &tile,
474*fd1fabb7SAndroid Build Coastguard Worker 							  dng_abort_sniffer * /* sniffer */)
475*fd1fabb7SAndroid Build Coastguard Worker 			{
476*fd1fabb7SAndroid Build Coastguard Worker 
477*fd1fabb7SAndroid Build Coastguard Worker 			// Setup buffer.
478*fd1fabb7SAndroid Build Coastguard Worker 
479*fd1fabb7SAndroid Build Coastguard Worker 			dng_pixel_buffer buffer(tile, 0, fImage.Planes (), fPixelType,
480*fd1fabb7SAndroid Build Coastguard Worker 									pcRowInterleavedAlign16,
481*fd1fabb7SAndroid Build Coastguard Worker 									fBuffer [threadIndex]->Buffer ());
482*fd1fabb7SAndroid Build Coastguard Worker 
483*fd1fabb7SAndroid Build Coastguard Worker 			// Get source pixels.
484*fd1fabb7SAndroid Build Coastguard Worker 
485*fd1fabb7SAndroid Build Coastguard Worker 			fImage.Get (buffer);
486*fd1fabb7SAndroid Build Coastguard Worker 
487*fd1fabb7SAndroid Build Coastguard Worker 			// Process area.
488*fd1fabb7SAndroid Build Coastguard Worker 
489*fd1fabb7SAndroid Build Coastguard Worker 			fOpcode.ProcessArea (fNegative,
490*fd1fabb7SAndroid Build Coastguard Worker 								 threadIndex,
491*fd1fabb7SAndroid Build Coastguard Worker 								 buffer,
492*fd1fabb7SAndroid Build Coastguard Worker 								 tile,
493*fd1fabb7SAndroid Build Coastguard Worker 								 fImage.Bounds ());
494*fd1fabb7SAndroid Build Coastguard Worker 
495*fd1fabb7SAndroid Build Coastguard Worker 			// Save result pixels.
496*fd1fabb7SAndroid Build Coastguard Worker 
497*fd1fabb7SAndroid Build Coastguard Worker 			fImage.Put (buffer);
498*fd1fabb7SAndroid Build Coastguard Worker 
499*fd1fabb7SAndroid Build Coastguard Worker 			}
500*fd1fabb7SAndroid Build Coastguard Worker 
501*fd1fabb7SAndroid Build Coastguard Worker 	};
502*fd1fabb7SAndroid Build Coastguard Worker 
503*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
504*fd1fabb7SAndroid Build Coastguard Worker 
dng_inplace_opcode(uint32 opcodeID,uint32 minVersion,uint32 flags)505*fd1fabb7SAndroid Build Coastguard Worker dng_inplace_opcode::dng_inplace_opcode (uint32 opcodeID,
506*fd1fabb7SAndroid Build Coastguard Worker 									    uint32 minVersion,
507*fd1fabb7SAndroid Build Coastguard Worker 									    uint32 flags)
508*fd1fabb7SAndroid Build Coastguard Worker 
509*fd1fabb7SAndroid Build Coastguard Worker 	:	dng_opcode (opcodeID,
510*fd1fabb7SAndroid Build Coastguard Worker 					minVersion,
511*fd1fabb7SAndroid Build Coastguard Worker 					flags)
512*fd1fabb7SAndroid Build Coastguard Worker 
513*fd1fabb7SAndroid Build Coastguard Worker 	{
514*fd1fabb7SAndroid Build Coastguard Worker 
515*fd1fabb7SAndroid Build Coastguard Worker 	}
516*fd1fabb7SAndroid Build Coastguard Worker 
517*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
518*fd1fabb7SAndroid Build Coastguard Worker 
dng_inplace_opcode(uint32 opcodeID,dng_stream & stream,const char * name)519*fd1fabb7SAndroid Build Coastguard Worker dng_inplace_opcode::dng_inplace_opcode (uint32 opcodeID,
520*fd1fabb7SAndroid Build Coastguard Worker 									    dng_stream &stream,
521*fd1fabb7SAndroid Build Coastguard Worker 									    const char *name)
522*fd1fabb7SAndroid Build Coastguard Worker 
523*fd1fabb7SAndroid Build Coastguard Worker 	:	dng_opcode (opcodeID,
524*fd1fabb7SAndroid Build Coastguard Worker 					stream,
525*fd1fabb7SAndroid Build Coastguard Worker 					name)
526*fd1fabb7SAndroid Build Coastguard Worker 
527*fd1fabb7SAndroid Build Coastguard Worker 	{
528*fd1fabb7SAndroid Build Coastguard Worker 
529*fd1fabb7SAndroid Build Coastguard Worker 	}
530*fd1fabb7SAndroid Build Coastguard Worker 
531*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
532*fd1fabb7SAndroid Build Coastguard Worker 
Apply(dng_host & host,dng_negative & negative,AutoPtr<dng_image> & image)533*fd1fabb7SAndroid Build Coastguard Worker void dng_inplace_opcode::Apply (dng_host &host,
534*fd1fabb7SAndroid Build Coastguard Worker 							    dng_negative &negative,
535*fd1fabb7SAndroid Build Coastguard Worker 							    AutoPtr<dng_image> &image)
536*fd1fabb7SAndroid Build Coastguard Worker 	{
537*fd1fabb7SAndroid Build Coastguard Worker 
538*fd1fabb7SAndroid Build Coastguard Worker 	dng_rect modifiedBounds = ModifiedBounds (image->Bounds ());
539*fd1fabb7SAndroid Build Coastguard Worker 
540*fd1fabb7SAndroid Build Coastguard Worker 	if (modifiedBounds.NotEmpty ())
541*fd1fabb7SAndroid Build Coastguard Worker 		{
542*fd1fabb7SAndroid Build Coastguard Worker 
543*fd1fabb7SAndroid Build Coastguard Worker 		dng_inplace_opcode_task task (*this,
544*fd1fabb7SAndroid Build Coastguard Worker 									  negative,
545*fd1fabb7SAndroid Build Coastguard Worker 									  *image);
546*fd1fabb7SAndroid Build Coastguard Worker 
547*fd1fabb7SAndroid Build Coastguard Worker 		host.PerformAreaTask (task,
548*fd1fabb7SAndroid Build Coastguard Worker 							  modifiedBounds);
549*fd1fabb7SAndroid Build Coastguard Worker 
550*fd1fabb7SAndroid Build Coastguard Worker 		}
551*fd1fabb7SAndroid Build Coastguard Worker 
552*fd1fabb7SAndroid Build Coastguard Worker 	}
553*fd1fabb7SAndroid Build Coastguard Worker 
554*fd1fabb7SAndroid Build Coastguard Worker /*****************************************************************************/
555