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