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