1/*****************************************************************************/
2// Copyright 2008-2009 Adobe Systems Incorporated
3// All Rights Reserved.
4//
5// NOTICE: Adobe permits you to use, modify, and distribute this file in
6// accordance with the terms of the Adobe license agreement accompanying it.
7/*****************************************************************************/
8
9/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_opcode_list.h#2 $ */
10/* $DateTime: 2012/07/31 22:04:34 $ */
11/* $Change: 840853 $ */
12/* $Author: tknoll $ */
13
14/** \file
15 * List of opcodes.
16 */
17
18/*****************************************************************************/
19
20#ifndef __dng_opcode_list__
21#define __dng_opcode_list__
22
23/*****************************************************************************/
24
25#include "dng_auto_ptr.h"
26#include "dng_classes.h"
27#include "dng_memory.h"
28#include "dng_opcodes.h"
29
30#include <vector>
31
32/*****************************************************************************/
33
34/// A list of opcodes.
35
36class dng_opcode_list
37 {
38
39 private:
40
41 dng_std_vector<dng_opcode *> fList;
42
43 bool fAlwaysApply;
44
45 uint32 fStage;
46
47 public:
48
49 /// Create an empty opcode list for the specific image stage (1, 2, or 3).
50
51 dng_opcode_list (uint32 stage);
52
53 ~dng_opcode_list ();
54
55 /// Is the opcode list empty?
56
57 bool IsEmpty () const
58 {
59 return fList.size () == 0;
60 }
61
62 /// Does the list contain at least 1 opcode?
63
64 bool NotEmpty () const
65 {
66 return !IsEmpty ();
67 }
68
69 /// Should the opcode list always be applied to the image?
70
71 bool AlwaysApply () const
72 {
73 return fAlwaysApply && NotEmpty ();
74 }
75
76 /// Set internal flag to indicate this opcode list should always be
77 /// applied.
78
79 void SetAlwaysApply ()
80 {
81 fAlwaysApply = true;
82 }
83
84 /// The number of opcodes in this list.
85
86 uint32 Count () const
87 {
88 return (uint32) fList.size ();
89 }
90
91 /// Retrieve read/write opcode by index (must be in the range 0 to Count
92 /// () - 1).
93
94 dng_opcode & Entry (uint32 index)
95 {
96 return *fList [index];
97 }
98
99 /// Retrieve read-only opcode by index (must be in the range 0 to Count
100 /// () - 1).
101
102 const dng_opcode & Entry (uint32 index) const
103 {
104 return *fList [index];
105 }
106
107 /// Remove all opcodes from the list.
108
109 void Clear ();
110
111 /// Swap two opcode lists.
112
113 void Swap (dng_opcode_list &otherList);
114
115 /// Return minimum DNG version required to support all opcodes in this
116 /// list. If includeOptional is set to true, then this calculation will
117 /// include optional opcodes.
118
119 uint32 MinVersion (bool includeOptional) const;
120
121 /// Apply this opcode list to the specified image with corresponding
122 /// negative.
123
124 void Apply (dng_host &host,
125 dng_negative &negative,
126 AutoPtr<dng_image> &image);
127
128 /// Append the specified opcode to this list.
129
130 void Append (AutoPtr<dng_opcode> &opcode);
131
132 /// Serialize this opcode list to a block of memory. The caller is
133 /// responsible for deleting this block.
134
135 dng_memory_block * Spool (dng_host &host) const;
136
137 /// Write a fingerprint of this opcode list to the specified stream.
138
139 void FingerprintToStream (dng_stream &stream) const;
140
141 /// Read an opcode list from the specified stream, starting at the
142 /// specified offset (streamOffset, in bytes). byteCount is provided for
143 /// error checking purposes. A bad format exception
144 /// will be thrown if the length of the opcode stream does not exactly
145 /// match byteCount.
146
147 void Parse (dng_host &host,
148 dng_stream &stream,
149 uint32 byteCount,
150 uint64 streamOffset);
151
152 private:
153
154 // Hidden copy constructor and assignment operator.
155
156 dng_opcode_list (const dng_opcode_list &list);
157
158 dng_opcode_list & operator= (const dng_opcode_list &list);
159
160 };
161
162/*****************************************************************************/
163
164#endif
165
166/*****************************************************************************/
167