1 /*****************************************************************************/
2 // Copyright 2006-2011 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_xmp.h#1 $ */
10 /* $DateTime: 2012/05/30 13:28:51 $ */
11 /* $Change: 832332 $ */
12 /* $Author: tknoll $ */
13 
14 /*****************************************************************************/
15 
16 #ifndef __dng_xmp__
17 #define __dng_xmp__
18 
19 #if qDNGUseXMP
20 
21 /*****************************************************************************/
22 
23 #include "dng_classes.h"
24 #include "dng_types.h"
25 #include "dng_xmp_sdk.h"
26 
27 /*****************************************************************************/
28 
29 class dng_xmp
30 	{
31 
32 	protected:
33 
34 		// Sync option bits.
35 
36 		enum
37 			{
38 			ignoreXMP		= 1,		// Force XMP values to match non-XMP
39 			preferXMP 		= 2,		// Prefer XMP values if conflict
40 			preferNonXMP	= 4,		// Prefer non-XMP values if conflict
41 			removeXMP		= 8			// Remove XMP value after syncing
42 			};
43 
44 		dng_memory_allocator &fAllocator;
45 
46 		dng_xmp_sdk *fSDK;
47 
48 	public:
49 
50 		dng_xmp (dng_memory_allocator &allocator);
51 
52 		dng_xmp (const dng_xmp &xmp);
53 
54 		virtual ~dng_xmp ();
55 
56 		virtual dng_xmp * Clone () const;
57 
58 		void Parse (dng_host &host,
59 					const void *buffer,
60 				    uint32 count);
61 
62 		dng_memory_block * Serialize (bool asPacket = false,
63 									  uint32 targetBytes = 0,
64 									  uint32 padBytes = 4096,
65 									  bool forJPEG = false,
66 									  bool compact = true) const;
67 
68 		// Kludge: Due to a bug in Premere Elements 9, we need to pass non-compact XMP
69 		// to the host, until we drop support for this Premere version.  This bug
70 		// is fixed in Premere Elements 10 and later.
71 
SerializeNonCompact()72 		dng_memory_block * SerializeNonCompact () const
73 			{
74 			return Serialize (false,
75 							  0,
76 							  4096,
77 							  false,
78 							  false);
79 			}
80 
81 		void PackageForJPEG (AutoPtr<dng_memory_block> &stdBlock,
82 							 AutoPtr<dng_memory_block> &extBlock,
83 							 dng_string &extDigest) const;
84 
85 		void MergeFromJPEG (const dng_xmp &xmp);
86 
87 		bool HasMeta () const;
88 
89 		void * GetPrivateMeta ();
90 
91 		bool Exists (const char *ns,
92 					 const char *path) const;
93 
94 		bool HasNameSpace (const char *ns) const;
95 
96 		bool IteratePaths (IteratePathsCallback *callback,
97 						   void *callbackData,
98 						   const char *ns = 0,
99 						   const char *path = 0);
100 
101 		void Remove (const char *ns,
102 				     const char *path);
103 
104 		void RemoveProperties (const char *ns);
105 
106 		void RemoveEmptyStringOrArray (const char *ns,
107 									   const char *path);
108 
109 		void RemoveEmptyStringsAndArrays (const char *ns = 0);
110 
111 		void Set (const char *ns,
112 				  const char *path,
113 				  const char *text);
114 
115 		bool GetString (const char *ns,
116 						const char *path,
117 						dng_string &s) const;
118 
119 		void SetString (const char *ns,
120 						const char *path,
121 						const dng_string &s);
122 
123 		bool GetStringList (const char *ns,
124 						    const char *path,
125 						    dng_string_list &list) const;
126 
127 		void SetStringList (const char *ns,
128 						    const char *path,
129 						    const dng_string_list &list,
130 						    bool isBag = false);
131 
132 		void SetStructField (const char *ns,
133 							 const char *path,
134 						     const char *fieldNS,
135 							 const char *fieldName,
136 							 const dng_string &s);
137 
138 		void SetStructField (const char *ns,
139 							 const char *path,
140 						     const char *fieldNS,
141 							 const char *fieldName,
142 							 const char *s);
143 
144 		void DeleteStructField (const char *ns,
145 								const char *path,
146 								const char *fieldNS,
147 								const char *fieldName);
148 
149 		bool GetStructField (const char *ns,
150 							 const char *path,
151 							 const char *fieldNS,
152 							 const char *fieldName,
153 							 dng_string &s) const;
154 
155 		void SetAltLangDefault (const char *ns,
156 								const char *path,
157 								const dng_string &s);
158 
159 		bool GetAltLangDefault (const char *ns,
160 								const char *path,
161 								dng_string &s) const;
162 
163 		bool GetBoolean (const char *ns,
164 						 const char *path,
165 						 bool &x) const;
166 
167 		void SetBoolean (const char *ns,
168 						 const char *path,
169 						 bool x);
170 
171 		bool Get_int32 (const char *ns,
172 						const char *path,
173 						int32 &x) const;
174 
175 		void Set_int32 (const char *ns,
176 						const char *path,
177 						int32 x,
178 						bool usePlus = false);
179 
180 		bool Get_uint32 (const char *ns,
181 						 const char *path,
182 						 uint32 &x) const;
183 
184 		void Set_uint32 (const char *ns,
185 						 const char *path,
186 						 uint32 x);
187 
188 		bool Get_real64 (const char *ns,
189 					     const char *path,
190 					     real64 &x) const;
191 
192 		void Set_real64 (const char *ns,
193 					     const char *path,
194 					     real64 x,
195 				         uint32 places = 6,
196 					     bool trim = true,
197 					     bool usePlus = false);
198 
199 		bool Get_urational (const char *ns,
200 							const char *path,
201 							dng_urational &r) const;
202 
203 		void Set_urational (const char *ns,
204 							const char *path,
205 							const dng_urational &r);
206 
207 		bool Get_srational (const char *ns,
208 							const char *path,
209 							dng_srational &r) const;
210 
211 		void Set_srational (const char *ns,
212 							const char *path,
213 							const dng_srational &r);
214 
215 		bool GetFingerprint (const char *ns,
216 							 const char *path,
217 							 dng_fingerprint &print) const;
218 
219 		void SetFingerprint (const char *ns,
220 							 const char *path,
221 							 const dng_fingerprint &print,
222 							 bool allowInvalid = false);
223 
224 		void SetVersion2to4 (const char *ns,
225 							 const char *path,
226 							 uint32 version);
227 
228 		dng_fingerprint GetIPTCDigest () const;
229 
230 		void SetIPTCDigest (dng_fingerprint &digest);
231 
232 		void ClearIPTCDigest ();
233 
234 		void IngestIPTC (dng_metadata &metadata,
235 					     bool xmpIsNewer = false);
236 
237 		void RebuildIPTC (dng_metadata &metadata,
238 						  dng_memory_allocator &allocator,
239 						  bool padForTIFF);
240 
241 		virtual void SyncExif (dng_exif &exif,
242 							   const dng_exif *originalExif = NULL,
243 							   bool doingUpdateFromXMP = false,
244 							   bool removeFromXMP = false);
245 
246 		void ValidateStringList (const char *ns,
247 							     const char *path);
248 
249 		void ValidateMetadata ();
250 
251 		void UpdateDateTime (const dng_date_time_info &dt);
252 
253 		void UpdateMetadataDate (const dng_date_time_info &dt);
254 
255 		void UpdateExifDates (dng_exif &exif,
256 							  bool removeFromXMP = false);
257 
258 		bool HasOrientation () const;
259 
260 		dng_orientation GetOrientation () const;
261 
262 		void ClearOrientation ();
263 
264 		void SetOrientation (const dng_orientation &orientation);
265 
266 		void SyncOrientation (dng_negative &negative,
267 					   		  bool xmpIsMaster);
268 			// FIX_ME_API: Backwards compatibility
269 
270 		void SyncOrientation (dng_metadata &metadata,
271 					   		  bool xmpIsMaster);
272 
273 		void ClearImageInfo ();
274 
275 		void SetImageSize (const dng_point &size);
276 
277 		void SetSampleInfo (uint32 samplesPerPixel,
278 							uint32 bitsPerSample);
279 
280 		void SetPhotometricInterpretation (uint32 pi);
281 
282 		void SetResolution (const dng_resolution &res);
283 
284 		void ComposeArrayItemPath (const char *ns,
285 								   const char *arrayName,
286 								   int32 itemNumber,
287 								   dng_string &s) const;
288 
289 		void ComposeStructFieldPath (const char *ns,
290 								     const char *structName,
291 								     const char *fieldNS,
292 									 const char *fieldName,
293 								     dng_string &s) const;
294 
295 		int32 CountArrayItems (const char *ns,
296 		                       const char *path) const;
297 
298 		void AppendArrayItem (const char *ns,
299 							  const char *arrayName,
300 							  const char *itemValue,
301 							  bool isBag = true,
302 							  bool propIsStruct = false);
303 
304 		static dng_string EncodeFingerprint (const dng_fingerprint &f,
305 											 bool allowInvalid = false);
306 
307 		static dng_fingerprint DecodeFingerprint (const dng_string &s);
308 
309 		#if qDNGXMPDocOps
310 
311 		void DocOpsOpenXMP (const char *srcMIMI);
312 
313 		void DocOpsPrepareForSave (const char *srcMIMI,
314 								   const char *dstMIMI,
315 								   bool newPath = true);
316 
317 		void DocOpsUpdateMetadata (const char *srcMIMI);
318 
319 		#endif
320 
321 	protected:
322 
323 		static void TrimDecimal (char *s);
324 
325 		static dng_string EncodeGPSVersion (uint32 version);
326 
327 		static uint32 DecodeGPSVersion (const dng_string &s);
328 
329 		static dng_string EncodeGPSCoordinate (const dng_string &ref,
330 							   				   const dng_urational *coord);
331 
332 		static void DecodeGPSCoordinate (const dng_string &s,
333 										 dng_string &ref,
334 										 dng_urational *coord);
335 
336 		static dng_string EncodeGPSDateTime (const dng_string &dateStamp,
337 											 const dng_urational *timeStamp);
338 
339 		static void DecodeGPSDateTime (const dng_string &s,
340 									   dng_string &dateStamp,
341 									   dng_urational *timeStamp);
342 
343 		bool SyncString (const char *ns,
344 						 const char *path,
345 						 dng_string &s,
346 						 uint32 options = 0);
347 
348 		void SyncStringList (const char *ns,
349 						 	 const char *path,
350 						 	 dng_string_list &list,
351 						 	 bool isBag = false,
352 						 	 uint32 options = 0);
353 
354 		bool SyncAltLangDefault (const char *ns,
355 								 const char *path,
356 								 dng_string &s,
357 								 uint32 options = 0);
358 
359 		void Sync_uint32 (const char *ns,
360 						  const char *path,
361 						  uint32 &x,
362 						  bool isDefault = false,
363 						  uint32 options = 0);
364 
365 		void Sync_uint32_array (const char *ns,
366 						   		const char *path,
367 						   		uint32 *data,
368 						   		uint32 &count,
369 						   		uint32 maxCount,
370 						   		uint32 options = 0);
371 
372 		void Sync_urational (const char *ns,
373 							 const char *path,
374 							 dng_urational &r,
375 							 uint32 options = 0);
376 
377 		void Sync_srational (const char *ns,
378 							 const char *path,
379 							 dng_srational &r,
380 							 uint32 options = 0);
381 
382 		void SyncIPTC (dng_iptc &iptc,
383 					   uint32 options);
384 
385 		void SyncFlash (uint32 &flashState,
386 						uint32 &flashMask,
387 						uint32 options);
388 
389 		bool DateTimeIsDateOnly (const char *ns,
390 							     const char *path);
391 
392 		virtual void SyncApproximateFocusDistance (dng_exif &exif,
393 												   const uint32 readOnly);
394 
395 	private:
396 
397 		// Hidden assignment operator.
398 
399 		dng_xmp & operator= (const dng_xmp &xmp);
400 
401 	};
402 
403 #endif
404 
405 /*****************************************************************************/
406 
407 #endif
408 
409 /*****************************************************************************/
410