Home | History | Annotate | Download | only in source
      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 
     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