/*****************************************************************************/
// 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
/*****************************************************************************/