summaryrefslogtreecommitdiff
path: root/gpr/source/lib/dng_sdk/dng_opcode_list.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gpr/source/lib/dng_sdk/dng_opcode_list.cpp')
-rw-r--r--gpr/source/lib/dng_sdk/dng_opcode_list.cpp274
1 files changed, 274 insertions, 0 deletions
diff --git a/gpr/source/lib/dng_sdk/dng_opcode_list.cpp b/gpr/source/lib/dng_sdk/dng_opcode_list.cpp
new file mode 100644
index 0000000..a5af89a
--- /dev/null
+++ b/gpr/source/lib/dng_sdk/dng_opcode_list.cpp
@@ -0,0 +1,274 @@
+/*****************************************************************************/
+// Copyright 2008-2009 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in
+// accordance with the terms of the Adobe license agreement accompanying it.
+/*****************************************************************************/
+
+/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_opcode_list.cpp#1 $ */
+/* $DateTime: 2012/05/30 13:28:51 $ */
+/* $Change: 832332 $ */
+/* $Author: tknoll $ */
+
+/*****************************************************************************/
+
+#include "dng_opcode_list.h"
+
+#include "dng_globals.h"
+#include "dng_host.h"
+#include "dng_memory_stream.h"
+#include "dng_negative.h"
+#include "dng_tag_values.h"
+#include "dng_utils.h"
+
+#include <algorithm>
+
+/*****************************************************************************/
+
+dng_opcode_list::dng_opcode_list (uint32 stage)
+
+ : fList ()
+ , fAlwaysApply (false)
+ , fStage (stage)
+
+ {
+
+ }
+
+/******************************************************************************/
+
+dng_opcode_list::~dng_opcode_list ()
+ {
+
+ Clear ();
+
+ }
+
+/******************************************************************************/
+
+void dng_opcode_list::Clear ()
+ {
+
+ for (size_t index = 0; index < fList.size (); index++)
+ {
+
+ if (fList [index])
+ {
+
+ delete fList [index];
+
+ fList [index] = NULL;
+
+ }
+
+ }
+
+ fList.clear ();
+
+ fAlwaysApply = false;
+
+ }
+
+/******************************************************************************/
+
+void dng_opcode_list::Swap (dng_opcode_list &otherList)
+ {
+
+ fList.swap (otherList.fList);
+
+ std::swap (fAlwaysApply, otherList.fAlwaysApply);
+
+ std::swap (fStage, otherList.fStage);
+
+ }
+
+/******************************************************************************/
+
+uint32 dng_opcode_list::MinVersion (bool includeOptional) const
+ {
+
+ uint32 result = dngVersion_None;
+
+ for (size_t index = 0; index < fList.size (); index++)
+ {
+
+ if (includeOptional || !fList [index]->Optional ())
+ {
+
+ result = Max_uint32 (result, fList [index]->MinVersion ());
+
+ }
+
+ }
+
+ return result;
+
+ }
+
+/*****************************************************************************/
+
+void dng_opcode_list::Apply (dng_host &host,
+ dng_negative &negative,
+ AutoPtr<dng_image> &image)
+ {
+
+ for (uint32 index = 0; index < Count (); index++)
+ {
+
+ dng_opcode &opcode (Entry (index));
+
+ if (opcode.AboutToApply (host, negative))
+ {
+
+ opcode.Apply (host,
+ negative,
+ image);
+
+ }
+
+ }
+
+ }
+
+/*****************************************************************************/
+
+void dng_opcode_list::Append (AutoPtr<dng_opcode> &opcode)
+ {
+
+ if (opcode->OpcodeID () == dngOpcode_Private)
+ {
+ SetAlwaysApply ();
+ }
+
+ opcode->SetStage (fStage);
+
+ fList.push_back (NULL);
+
+ fList [fList.size () - 1] = opcode.Release ();
+
+ }
+
+/*****************************************************************************/
+
+dng_memory_block * dng_opcode_list::Spool (dng_host &host) const
+ {
+
+ if (IsEmpty ())
+ {
+ return NULL;
+ }
+
+ if (AlwaysApply ())
+ {
+ ThrowProgramError ();
+ }
+
+ dng_memory_stream stream (host.Allocator ());
+
+ stream.SetBigEndian ();
+
+ stream.Put_uint32 ((uint32) fList.size ());
+
+ for (size_t index = 0; index < fList.size (); index++)
+ {
+
+ stream.Put_uint32 (fList [index]->OpcodeID ());
+ stream.Put_uint32 (fList [index]->MinVersion ());
+ stream.Put_uint32 (fList [index]->Flags ());
+
+ fList [index]->PutData (stream);
+
+ }
+
+ return stream.AsMemoryBlock (host.Allocator ());
+
+ }
+
+/*****************************************************************************/
+
+void dng_opcode_list::FingerprintToStream (dng_stream &stream) const
+ {
+
+ if (IsEmpty ())
+ {
+ return;
+ }
+
+ stream.Put_uint32 ((uint32) fList.size ());
+
+ for (size_t index = 0; index < fList.size (); index++)
+ {
+
+ stream.Put_uint32 (fList [index]->OpcodeID ());
+ stream.Put_uint32 (fList [index]->MinVersion ());
+ stream.Put_uint32 (fList [index]->Flags ());
+
+ if (fList [index]->OpcodeID () != dngOpcode_Private)
+ {
+
+ fList [index]->PutData (stream);
+
+ }
+
+ }
+
+ }
+
+/*****************************************************************************/
+
+void dng_opcode_list::Parse (dng_host &host,
+ dng_stream &stream,
+ uint32 byteCount,
+ uint64 streamOffset)
+ {
+
+ Clear ();
+
+ TempBigEndian tempBigEndian (stream);
+
+ stream.SetReadPosition (streamOffset);
+
+ uint32 count = stream.Get_uint32 ();
+
+ #if qDNGValidate
+
+ if (gVerbose)
+ {
+
+ if (count == 1)
+ {
+ printf ("1 opcode\n");
+ }
+
+ else
+ {
+ printf ("%u opcodes\n", (unsigned) count);
+ }
+
+ }
+
+ #endif
+
+ for (uint32 index = 0; index < count; index++)
+ {
+
+ uint32 opcodeID = stream.Get_uint32 ();
+
+ AutoPtr<dng_opcode> opcode (host.Make_dng_opcode (opcodeID,
+ stream));
+
+ Append (opcode);
+
+ }
+
+ if (stream.Position () != streamOffset + byteCount)
+ {
+
+ ThrowBadFormat ("Error parsing opcode list");
+
+ }
+
+ }
+
+/*****************************************************************************/