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 36 class 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 IsEmpty()57 bool IsEmpty () const 58 { 59 return fList.size () == 0; 60 } 61 62 /// Does the list contain at least 1 opcode? 63 NotEmpty()64 bool NotEmpty () const 65 { 66 return !IsEmpty (); 67 } 68 69 /// Should the opcode list always be applied to the image? 70 AlwaysApply()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 SetAlwaysApply()79 void SetAlwaysApply () 80 { 81 fAlwaysApply = true; 82 } 83 84 /// The number of opcodes in this list. 85 Count()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 Entry(uint32 index)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 Entry(uint32 index)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