/*****************************************************************************/ // Copyright 2006-2011 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in // accordance with the terms of the Adobe license agreement accompanying it. /*****************************************************************************/ /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_xmp.h#1 $ */ /* $DateTime: 2012/05/30 13:28:51 $ */ /* $Change: 832332 $ */ /* $Author: tknoll $ */ /*****************************************************************************/ #ifndef __dng_xmp__ #define __dng_xmp__ #if qDNGUseXMP /*****************************************************************************/ #include "dng_classes.h" #include "dng_types.h" #include "dng_xmp_sdk.h" /*****************************************************************************/ class dng_xmp { protected: // Sync option bits. enum { ignoreXMP = 1, // Force XMP values to match non-XMP preferXMP = 2, // Prefer XMP values if conflict preferNonXMP = 4, // Prefer non-XMP values if conflict removeXMP = 8 // Remove XMP value after syncing }; dng_memory_allocator &fAllocator; dng_xmp_sdk *fSDK; public: dng_xmp (dng_memory_allocator &allocator); dng_xmp (const dng_xmp &xmp); virtual ~dng_xmp (); virtual dng_xmp * Clone () const; void Parse (dng_host &host, const void *buffer, uint32 count); dng_memory_block * Serialize (bool asPacket = false, uint32 targetBytes = 0, uint32 padBytes = 4096, bool forJPEG = false, bool compact = true) const; // Kludge: Due to a bug in Premere Elements 9, we need to pass non-compact XMP // to the host, until we drop support for this Premere version. This bug // is fixed in Premere Elements 10 and later. dng_memory_block * SerializeNonCompact () const { return Serialize (false, 0, 4096, false, false); } void PackageForJPEG (AutoPtr<dng_memory_block> &stdBlock, AutoPtr<dng_memory_block> &extBlock, dng_string &extDigest) const; void MergeFromJPEG (const dng_xmp &xmp); bool HasMeta () const; void * GetPrivateMeta (); bool Exists (const char *ns, const char *path) const; bool HasNameSpace (const char *ns) const; bool IteratePaths (IteratePathsCallback *callback, void *callbackData, const char *ns = 0, const char *path = 0); void Remove (const char *ns, const char *path); void RemoveProperties (const char *ns); void RemoveEmptyStringOrArray (const char *ns, const char *path); void RemoveEmptyStringsAndArrays (const char *ns = 0); void Set (const char *ns, const char *path, const char *text); bool GetString (const char *ns, const char *path, dng_string &s) const; void SetString (const char *ns, const char *path, const dng_string &s); bool GetStringList (const char *ns, const char *path, dng_string_list &list) const; void SetStringList (const char *ns, const char *path, const dng_string_list &list, bool isBag = false); void SetStructField (const char *ns, const char *path, const char *fieldNS, const char *fieldName, const dng_string &s); void SetStructField (const char *ns, const char *path, const char *fieldNS, const char *fieldName, const char *s); void DeleteStructField (const char *ns, const char *path, const char *fieldNS, const char *fieldName); bool GetStructField (const char *ns, const char *path, const char *fieldNS, const char *fieldName, dng_string &s) const; void SetAltLangDefault (const char *ns, const char *path, const dng_string &s); bool GetAltLangDefault (const char *ns, const char *path, dng_string &s) const; bool GetBoolean (const char *ns, const char *path, bool &x) const; void SetBoolean (const char *ns, const char *path, bool x); bool Get_int32 (const char *ns, const char *path, int32 &x) const; void Set_int32 (const char *ns, const char *path, int32 x, bool usePlus = false); bool Get_uint32 (const char *ns, const char *path, uint32 &x) const; void Set_uint32 (const char *ns, const char *path, uint32 x); bool Get_real64 (const char *ns, const char *path, real64 &x) const; void Set_real64 (const char *ns, const char *path, real64 x, uint32 places = 6, bool trim = true, bool usePlus = false); bool Get_urational (const char *ns, const char *path, dng_urational &r) const; void Set_urational (const char *ns, const char *path, const dng_urational &r); bool Get_srational (const char *ns, const char *path, dng_srational &r) const; void Set_srational (const char *ns, const char *path, const dng_srational &r); bool GetFingerprint (const char *ns, const char *path, dng_fingerprint &print) const; void SetFingerprint (const char *ns, const char *path, const dng_fingerprint &print, bool allowInvalid = false); void SetVersion2to4 (const char *ns, const char *path, uint32 version); dng_fingerprint GetIPTCDigest () const; void SetIPTCDigest (dng_fingerprint &digest); void ClearIPTCDigest (); void IngestIPTC (dng_metadata &metadata, bool xmpIsNewer = false); void RebuildIPTC (dng_metadata &metadata, dng_memory_allocator &allocator, bool padForTIFF); virtual void SyncExif (dng_exif &exif, const dng_exif *originalExif = NULL, bool doingUpdateFromXMP = false, bool removeFromXMP = false); void ValidateStringList (const char *ns, const char *path); void ValidateMetadata (); void UpdateDateTime (const dng_date_time_info &dt); void UpdateMetadataDate (const dng_date_time_info &dt); void UpdateExifDates (dng_exif &exif, bool removeFromXMP = false); bool HasOrientation () const; dng_orientation GetOrientation () const; void ClearOrientation (); void SetOrientation (const dng_orientation &orientation); void SyncOrientation (dng_negative &negative, bool xmpIsMaster); // FIX_ME_API: Backwards compatibility void SyncOrientation (dng_metadata &metadata, bool xmpIsMaster); void ClearImageInfo (); void SetImageSize (const dng_point &size); void SetSampleInfo (uint32 samplesPerPixel, uint32 bitsPerSample); void SetPhotometricInterpretation (uint32 pi); void SetResolution (const dng_resolution &res); void ComposeArrayItemPath (const char *ns, const char *arrayName, int32 itemNumber, dng_string &s) const; void ComposeStructFieldPath (const char *ns, const char *structName, const char *fieldNS, const char *fieldName, dng_string &s) const; int32 CountArrayItems (const char *ns, const char *path) const; void AppendArrayItem (const char *ns, const char *arrayName, const char *itemValue, bool isBag = true, bool propIsStruct = false); static dng_string EncodeFingerprint (const dng_fingerprint &f, bool allowInvalid = false); static dng_fingerprint DecodeFingerprint (const dng_string &s); #if qDNGXMPDocOps void DocOpsOpenXMP (const char *srcMIMI); void DocOpsPrepareForSave (const char *srcMIMI, const char *dstMIMI, bool newPath = true); void DocOpsUpdateMetadata (const char *srcMIMI); #endif protected: static void TrimDecimal (char *s); static dng_string EncodeGPSVersion (uint32 version); static uint32 DecodeGPSVersion (const dng_string &s); static dng_string EncodeGPSCoordinate (const dng_string &ref, const dng_urational *coord); static void DecodeGPSCoordinate (const dng_string &s, dng_string &ref, dng_urational *coord); static dng_string EncodeGPSDateTime (const dng_string &dateStamp, const dng_urational *timeStamp); static void DecodeGPSDateTime (const dng_string &s, dng_string &dateStamp, dng_urational *timeStamp); bool SyncString (const char *ns, const char *path, dng_string &s, uint32 options = 0); void SyncStringList (const char *ns, const char *path, dng_string_list &list, bool isBag = false, uint32 options = 0); bool SyncAltLangDefault (const char *ns, const char *path, dng_string &s, uint32 options = 0); void Sync_uint32 (const char *ns, const char *path, uint32 &x, bool isDefault = false, uint32 options = 0); void Sync_uint32_array (const char *ns, const char *path, uint32 *data, uint32 &count, uint32 maxCount, uint32 options = 0); void Sync_urational (const char *ns, const char *path, dng_urational &r, uint32 options = 0); void Sync_srational (const char *ns, const char *path, dng_srational &r, uint32 options = 0); void SyncIPTC (dng_iptc &iptc, uint32 options); void SyncFlash (uint32 &flashState, uint32 &flashMask, uint32 options); bool DateTimeIsDateOnly (const char *ns, const char *path); virtual void SyncApproximateFocusDistance (dng_exif &exif, const uint32 readOnly); private: // Hidden assignment operator. dng_xmp & operator= (const dng_xmp &xmp); }; #endif /*****************************************************************************/ #endif /*****************************************************************************/