Initial commit
This commit is contained in:
commit
4d8e67fb75
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
.dub
|
||||
docs.json
|
||||
__dummy.html
|
||||
*.o
|
||||
*.obj
|
||||
libexempi-d.a
|
5
dub.sdl
Normal file
5
dub.sdl
Normal file
@ -0,0 +1,5 @@
|
||||
name "exempi-d"
|
||||
description "D bindings for exempi"
|
||||
authors "Les De Ridder"
|
||||
license "BSD 3-clause"
|
||||
targetType "library"
|
725
source/exempi/xmp.d
Normal file
725
source/exempi/xmp.d
Normal file
@ -0,0 +1,725 @@
|
||||
/*
|
||||
* exempi-d - exempi.xmp
|
||||
*
|
||||
* Bindings by Les De Ridder <les@lesderid.net>
|
||||
*
|
||||
* Copyright (C) 2007-2016 Hubert Figuiere
|
||||
* Copyright 2002-2007 Adobe Systems Incorporated
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1 Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2 Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3 Neither the name of the Authors, nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software wit hout specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
module exempi.xmp;
|
||||
|
||||
extern(C):
|
||||
|
||||
enum XmpOpenFileOptions {
|
||||
XMP_OPEN_NOOPTION = 0x00000000, /**< No open option */
|
||||
XMP_OPEN_READ = 0x00000001, /**< Open for read-only access. */
|
||||
XMP_OPEN_FORUPDATE = 0x00000002, /**< Open for reading and writing. */
|
||||
XMP_OPEN_ONLYXMP = 0x00000004, /**< Only the XMP is wanted,
|
||||
* allows space/time optimizations. */
|
||||
XMP_OPEN_CACHETNAIL = 0x00000008, /**< Cache thumbnail if possible,
|
||||
* GetThumbnail will be called. */
|
||||
XMP_OPEN_STRICTLY = 0x00000010, /**< Be strict about locating XMP
|
||||
* and reconciling with other forms. */
|
||||
XMP_OPEN_USESMARTHANDLER= 0x00000020, /**< Require the use of a smart
|
||||
* handler. */
|
||||
XMP_OPEN_USEPACKETSCANNING = 0x00000040, /**< Force packet scanning,
|
||||
* don't use a smart handler. */
|
||||
XMP_OPEN_LIMITSCANNING = 0x00000080, /**< Only packet scan files "known"
|
||||
* to need scanning. */
|
||||
XMP_OPEN_REPAIR_FILE = 0x00000100, /**< Attempt to repair a file opened for update,
|
||||
* default is to not open (throw an exception). */
|
||||
XMP_OPEN_INBACKGROUND = 0x10000000 /**< Set if calling from background
|
||||
* thread. */
|
||||
};
|
||||
|
||||
/** Option bits for xmp_files_close() */
|
||||
enum XmpCloseFileOptions {
|
||||
XMP_CLOSE_NOOPTION = 0x0000, /**< No close option */
|
||||
XMP_CLOSE_SAFEUPDATE = 0x0001 /**< Write into a temporary file and
|
||||
* swap for crash safety. */
|
||||
};
|
||||
|
||||
enum XmpFileType {
|
||||
|
||||
/* Public file formats. Hex used to avoid gcc warnings. */
|
||||
/* ! Leave them as big endian. There seems to be no decent way on UNIX to determine the target */
|
||||
/* ! endianness at compile time. Forcing it on the client isn't acceptable. */
|
||||
|
||||
XMP_FT_PDF = 0x50444620UL, /* 'PDF ' */
|
||||
XMP_FT_PS = 0x50532020UL, /* 'PS ', general PostScript following DSC conventions. */
|
||||
XMP_FT_EPS = 0x45505320UL, /* 'EPS ', encapsulated PostScript. */
|
||||
|
||||
XMP_FT_JPEG = 0x4A504547UL, /* 'JPEG' */
|
||||
XMP_FT_JPEG2K = 0x4A505820UL, /* 'JPX ', ISO 15444-1 */
|
||||
XMP_FT_TIFF = 0x54494646UL, /* 'TIFF' */
|
||||
XMP_FT_GIF = 0x47494620UL, /* 'GIF ' */
|
||||
XMP_FT_PNG = 0x504E4720UL, /* 'PNG ' */
|
||||
|
||||
XMP_FT_SWF = 0x53574620UL, /* 'SWF ' */
|
||||
XMP_FT_FLA = 0x464C4120UL, /* 'FLA ' */
|
||||
XMP_FT_FLV = 0x464C5620UL, /* 'FLV ' */
|
||||
|
||||
XMP_FT_MOV = 0x4D4F5620UL, /* 'MOV ', Quicktime */
|
||||
XMP_FT_AVI = 0x41564920UL, /* 'AVI ' */
|
||||
XMP_FT_CIN = 0x43494E20UL, /* 'CIN ', Cineon */
|
||||
XMP_FT_WAV = 0x57415620UL, /* 'WAV ' */
|
||||
XMP_FT_MP3 = 0x4D503320UL, /* 'MP3 ' */
|
||||
XMP_FT_SES = 0x53455320UL, /* 'SES ', Audition session */
|
||||
XMP_FT_CEL = 0x43454C20UL, /* 'CEL ', Audition loop */
|
||||
XMP_FT_MPEG = 0x4D504547UL, /* 'MPEG' */
|
||||
XMP_FT_MPEG2 = 0x4D503220UL, /* 'MP2 ' */
|
||||
XMP_FT_MPEG4 = 0x4D503420UL, /* 'MP4 ', ISO 14494-12 and -14 */
|
||||
XMP_FT_WMAV = 0x574D4156UL, /* 'WMAV', Windows Media Audio and Video */
|
||||
XMP_FT_AIFF = 0x41494646UL, /* 'AIFF' */
|
||||
|
||||
XMP_FT_HTML = 0x48544D4CUL, /* 'HTML' */
|
||||
XMP_FT_XML = 0x584D4C20UL, /* 'XML ' */
|
||||
XMP_FT_TEXT = 0x74657874UL, /* 'text' */
|
||||
|
||||
/* Adobe application file formats. */
|
||||
XMP_FT_PHOTOSHOP = 0x50534420UL, /* 'PSD ' */
|
||||
XMP_FT_ILLUSTRATOR = 0x41492020UL, /* 'AI ' */
|
||||
XMP_FT_INDESIGN = 0x494E4444UL, /* 'INDD' */
|
||||
XMP_FT_AEPROJECT = 0x41455020UL, /* 'AEP ' */
|
||||
XMP_FT_AEPROJTEMPLATE = 0x41455420UL, /* 'AET ', After Effects Project Template */
|
||||
XMP_FT_AEFILTERPRESET = 0x46465820UL, /* 'FFX ' */
|
||||
XMP_FT_ENCOREPROJECT = 0x4E434F52UL, /* 'NCOR' */
|
||||
XMP_FT_PREMIEREPROJECT = 0x5052504AUL, /* 'PRPJ' */
|
||||
XMP_FT_PREMIERETITLE = 0x5052544CUL, /* 'PRTL' */
|
||||
|
||||
/* Catch all. */
|
||||
XMP_FT_UNKNOWN = 0x20202020UL /* ' ' */
|
||||
};
|
||||
|
||||
|
||||
enum XmpFileFormatOptions {
|
||||
|
||||
XMP_FMT_CAN_INJECT_XMP = 0x00000001,
|
||||
XMP_FMT_CAN_EXPAND = 0x00000002,
|
||||
XMP_FMT_CAN_REWRITE = 0x00000004,
|
||||
XMP_FMT_PREFERS_IN_PLACE = 0x00000008,
|
||||
XMP_FMT_CAN_RECONCILE = 0x00000010,
|
||||
XMP_FMT_ALLOWS_ONLY_XMP = 0x00000020,
|
||||
XMP_FMT_RETURNS_RAW_PACKET = 0x00000040,
|
||||
XMP_FMT_HANDLER_OWNS_FILE = 0x00000100,
|
||||
XMP_FMT_ALLOW_SAFE_UPDATE = 0x00000200,
|
||||
XMP_FMT_NEEDS_READONLY_PACKET = 0x00000400,
|
||||
XMP_FMT_USE_SIDECAR_XMP = 0x00000800,
|
||||
XMP_FMT_FOLDER_BASED_FORMAT = 0x00001000,
|
||||
|
||||
_XMP_FMT_LAST
|
||||
};
|
||||
|
||||
|
||||
|
||||
enum XmpIterOptions {
|
||||
XMP_ITER_CLASSMASK = 0x00FFUL, /**< The low 8 bits are an enum of
|
||||
* what data structure to iterate. */
|
||||
XMP_ITER_PROPERTIES = 0x0000UL, /**< Iterate the property tree of
|
||||
* a TXMPMeta object. */
|
||||
XMP_ITER_ALIASES = 0x0001UL, /**< Iterate the global alias table. */
|
||||
XMP_ITER_NAMESPACES = 0x0002UL, /**< Iterate the global namespace table. */
|
||||
XMP_ITER_JUSTCHILDREN = 0x0100UL, /**< Just do the immediate children
|
||||
* of the root, default is subtree. */
|
||||
XMP_ITER_JUSTLEAFNODES = 0x0200UL, /**< Just do the leaf nodes, default
|
||||
* is all nodes in the subtree. */
|
||||
XMP_ITER_JUSTLEAFNAME = 0x0400UL, /**< Return just the leaf part of the
|
||||
* path, default is the full path. */
|
||||
XMP_ITER_INCLUDEALIASES = 0x0800UL, /**< Include aliases, default is just
|
||||
* actual properties. */
|
||||
XMP_ITER_OMITQUALIFIERS = 0x1000UL /* Omit all qualifiers. */
|
||||
};
|
||||
|
||||
enum XmpIterSkipOptions {
|
||||
XMP_ITER_SKIPSUBTREE = 0x0001UL, /**< Skip the subtree below the
|
||||
* current node. */
|
||||
XMP_ITER_SKIPSIBLINGS = 0x0002UL /**< Skip the subtree below and remaining
|
||||
* siblings of the current node. */
|
||||
};
|
||||
|
||||
|
||||
|
||||
enum XmpPropsBits {
|
||||
/** Options relating to the XML string form of the property value. */
|
||||
XMP_PROP_VALUE_IS_URI = 0x00000002UL, /**< The value is a URI, use
|
||||
* rdf:resource attribute.
|
||||
* DISCOURAGED */
|
||||
/** Options relating to qualifiers attached to a property. */
|
||||
XMP_PROP_HAS_QUALIFIERS = 0x00000010UL, /**< The property has qualifiers,
|
||||
* includes rdf:type and
|
||||
* xml:lang. */
|
||||
XMP_PROP_IS_QUALIFIER = 0x00000020UL, /**< This is a qualifier,
|
||||
* includes rdf:type and
|
||||
* xml:lang. */
|
||||
XMP_PROP_HAS_LANG = 0x00000040UL, /**< Implies XMP_PropHasQualifiers,
|
||||
* property has xml:lang. */
|
||||
XMP_PROP_HAS_TYPE = 0x00000080UL, /**< Implies XMP_PropHasQualifiers,
|
||||
* property has rdf:type. */
|
||||
|
||||
/* Options relating to the data structure form. */
|
||||
XMP_PROP_VALUE_IS_STRUCT = 0x00000100UL, /**< The value is a structure
|
||||
* with nested fields. */
|
||||
XMP_PROP_VALUE_IS_ARRAY = 0x00000200UL, /**< The value is an array
|
||||
* (RDF alt/bag/seq). */
|
||||
XMP_PROP_ARRAY_IS_UNORDERED = XMP_PROP_VALUE_IS_ARRAY, /**< The item order
|
||||
* does not matter.*/
|
||||
XMP_PROP_ARRAY_IS_ORDERED = 0x00000400UL, /**< Implies XMP_PropValueIsArray,
|
||||
* item order matters. */
|
||||
XMP_PROP_ARRAY_IS_ALT = 0x00000800UL, /**< Implies XMP_PropArrayIsOrdered,
|
||||
* items are alternates. */
|
||||
|
||||
/** Additional struct and array options. */
|
||||
XMP_PROP_ARRAY_IS_ALTTEXT = 0x00001000UL, /**< Implies kXMP_PropArrayIsAlternate,
|
||||
* items are localized text. */
|
||||
XMP_PROP_ARRAY_INSERT_BEFORE = 0x00004000UL, /**< Used by array functions. */
|
||||
XMP_PROP_ARRAY_INSERT_AFTER = 0x00008000UL, /**< Used by array functions. */
|
||||
|
||||
/* Other miscellaneous options. */
|
||||
XMP_PROP_IS_ALIAS = 0x00010000UL, /**< This property is an alias name for another property. */
|
||||
XMP_PROP_HAS_ALIASES = 0x00020000UL, /**< This property is the base value for a set of aliases. */
|
||||
XMP_PROP_IS_INTERNAL = 0x00040000UL, /**< This property is an "internal" property, owned by applications. */
|
||||
XMP_PROP_IS_STABLE = 0x00100000UL, /**< This property is not derived from the document content. */
|
||||
XMP_PROP_IS_DERIVED = 0x00200000UL, /**< This property is derived from the document content. */
|
||||
/* kXMPUtil_AllowCommas = 0x10000000UL, ! Used by TXMPUtils::CatenateArrayItems and ::SeparateArrayItems. */
|
||||
/* kXMP_DeleteExisting = 0x20000000UL, ! Used by TXMPMeta::SetXyz functions to delete any pre-existing property. */
|
||||
/* kXMP_SchemaNode = 0x80000000UL, ! Returned by iterators - #define to avoid warnings */
|
||||
|
||||
/* Masks that are multiple flags. */
|
||||
XMP_PROP_ARRAY_FORM_MASK = XMP_PROP_VALUE_IS_ARRAY | XMP_PROP_ARRAY_IS_ORDERED | XMP_PROP_ARRAY_IS_ALT | XMP_PROP_ARRAY_IS_ALTTEXT,
|
||||
XMP_PROP_COMPOSITE_MASK = XMP_PROP_VALUE_IS_STRUCT | XMP_PROP_ARRAY_FORM_MASK, /* Is it simple or composite (array or struct)? */
|
||||
XMP_IMPL_RESERVED_MASK = 0x70000000L /**< Reserved for transient use by the implementation. */
|
||||
};
|
||||
|
||||
|
||||
/* convenience macros */
|
||||
|
||||
/** set option bits */
|
||||
|
||||
//TODO: Translate these to D
|
||||
/+
|
||||
#define XMP_SET_OPTION(var,opt) var |= (opt)
|
||||
/** clear option bits */
|
||||
#define XMP_CLEAR_OPTION(var,opt) var &= ~(opt)
|
||||
/** test if option is set */
|
||||
#define XMP_TEST_OPTION_SET(var,opt) (((var) & (opt)) != 0)
|
||||
/** test if option is clear */
|
||||
#define XMP_TEST_OPTION_CLEAR(var,opt) (((var) & (opt)) == 0)
|
||||
|
||||
|
||||
#define XMP_IS_PROP_SIMPLE(opt) (((opt) & XMP_PROP_COMPOSITE_MASK) == 0)
|
||||
#define XMP_IS_PROP_STRUCT(opt) (((opt) & XMP_PROP_VALUE_IS_STRUCT) != 0)
|
||||
#define XMP_IS_PROP_ARRAY(opt) (((opt) & XMP_PROP_VALUE_IS_ARRAY) != 0)
|
||||
#define XMP_IS_ARRAY_UNORDERED(opt) (((opt) & XMP_PROP_ARRAY_IS_ORDERED) == 0)
|
||||
#define XMP_IS_ARRAY_ORDERED(opt) (((opt) & XMP_PROP_ARRAY_IS_ORDERED) != 0)
|
||||
#define XMP_IS_ARRAY_ALT(opt) (((opt) & XMP_PROP_ARRAY_IS_ALT) != 0)
|
||||
#define XMP_IS_ARRAY_ALTTEXT(opt) (((opt) & XMP_PROP_ARRAY_IS_ALTTEXT) != 0)
|
||||
|
||||
#define XMP_HAS_PROP_QUALIFIERS(opt) (((opt) & XMP_PROP_HAS_QUALIFIERS) != 0)
|
||||
#define XMP_IS_PROP_QUALIFIER(opt) (((opt) & XMP_PROP_IS_QUALIFIER) != 0)
|
||||
#define XMP_HAS_PROP_LANG(opt) (((opt) & XMP_PROP_HAS_LANG) != 0)
|
||||
|
||||
#define XMP_IS_NODE_SCHEMA(opt) (((opt) & XMP_SCHEMA_NODE) != 0)
|
||||
#define XMP_IS_PROP_ALIAS(opt) (((opt) & XMP_PROP_IS_ALIAS) != 0)
|
||||
+/
|
||||
|
||||
enum { /* Options for xmp_serialize */
|
||||
XMP_SERIAL_OMITPACKETWRAPPER = 0x0010UL, /**< Omit the XML packet
|
||||
* wrapper. */
|
||||
XMP_SERIAL_READONLYPACKET = 0x0020UL, /**< Default is a writeable
|
||||
* packet. */
|
||||
XMP_SERIAL_USECOMPACTFORMAT = 0x0040UL, /**< Use a compact form of
|
||||
* RDF. */
|
||||
|
||||
XMP_SERIAL_INCLUDETHUMBNAILPAD = 0x0100UL, /**< Include a padding allowance
|
||||
* for a thumbnail image. */
|
||||
XMP_SERIAL_EXACTPACKETLENGTH = 0x0200UL, /**< The padding parameter is
|
||||
* the overall packet length. */
|
||||
XMP_SERIAL_WRITEALIASCOMMENTS = 0x0400UL, /**< Show aliases as XML
|
||||
* comments. */
|
||||
XMP_SERIAL_OMITALLFORMATTING = 0x0800UL, /**< Omit all formatting
|
||||
* whitespace. */
|
||||
|
||||
_XMP_LITTLEENDIAN_BIT = 0x0001UL, /* ! Don't use directly, see the combined values below! */
|
||||
_XMP_UTF16_BIT = 0x0002UL,
|
||||
_XMP_UTF32_BIT = 0x0004UL,
|
||||
|
||||
XMP_SERIAL_ENCODINGMASK = 0x0007UL,
|
||||
XMP_SERIAL_ENCODEUTF8 = 0UL,
|
||||
XMP_SERIAL_ENCODEUTF16BIG = _XMP_UTF16_BIT,
|
||||
XMP_SERIAL_ENCODEUTF16LITTLE = _XMP_UTF16_BIT | _XMP_LITTLEENDIAN_BIT,
|
||||
XMP_SERIAL_ENCODEUTF32BIG = _XMP_UTF32_BIT,
|
||||
XMP_SERIAL_ENCODEUTF32LITTLE = _XMP_UTF32_BIT | _XMP_LITTLEENDIAN_BIT
|
||||
};
|
||||
|
||||
/** pointer to XMP packet. Opaque. */
|
||||
alias XmpPtr = void*;
|
||||
alias XmpFilePtr = void*;
|
||||
alias XmpStringPtr = void*;
|
||||
alias XmpIteratorPtr = void*;
|
||||
|
||||
struct XmpDateTime {
|
||||
int year;
|
||||
int month; /* 1..12 */
|
||||
int day; /* 1..31 */
|
||||
int hour; /* 0..23 */
|
||||
int minute; /* 0..59 */
|
||||
int second; /* 0..59 */
|
||||
int tzSign; /* -1..+1, 0 means UTC, -1 is west, +1 is east. */
|
||||
int tzHour; /* 0..23 */
|
||||
int tzMinute; /* 0..59 */
|
||||
int nanoSecond;
|
||||
};
|
||||
|
||||
struct XmpPacketInfo {
|
||||
/// Packet offset in the file in bytes, -1 if unknown.
|
||||
long offset;
|
||||
/// Packet length in the file in bytes, -1 if unknown.
|
||||
int length;
|
||||
/// Packet padding size in bytes, zero if unknown.
|
||||
int padSize;
|
||||
|
||||
/// Character format using the values \c kXMP_Char8Bit,
|
||||
/// \c kXMP_Char16BitBig, etc.
|
||||
ubyte charForm;
|
||||
/// True if there is a packet wrapper and the trailer says writeable
|
||||
/// by dumb packet scanners.
|
||||
bool writeable;
|
||||
/// True if there is a packet wrapper, the "<?xpacket...>"
|
||||
/// XML processing instructions.
|
||||
bool hasWrapper;
|
||||
|
||||
/// Padding to make the struct's size be a multiple 4.
|
||||
ubyte pad;
|
||||
};
|
||||
|
||||
/** Values used for tzSign field. */
|
||||
enum {
|
||||
XMP_TZ_WEST = -1, /**< West of UTC */
|
||||
XMP_TZ_UTC = 0, /**< UTC */
|
||||
XMP_TZ_EAST = +1 /**< East of UTC */
|
||||
};
|
||||
|
||||
/** Init the library. Must be called before anything else */
|
||||
bool xmp_init();
|
||||
void xmp_terminate();
|
||||
|
||||
|
||||
/** get the error code that last occurred.
|
||||
* @todo make this thread-safe. Getting the error code
|
||||
* from another thread than the on it occurred in is undefined.
|
||||
*/
|
||||
int xmp_get_error();
|
||||
|
||||
|
||||
XmpFilePtr xmp_files_new();
|
||||
XmpFilePtr xmp_files_open_new(const char *, XmpOpenFileOptions options);
|
||||
|
||||
bool xmp_files_open(XmpFilePtr xf, const char *, XmpOpenFileOptions options);
|
||||
|
||||
/** Close an XMP file. Will flush the changes
|
||||
* @param xf the file object
|
||||
* @param options the options to close.
|
||||
* @return true on succes, false on error
|
||||
* xmp_get_error() will give the error code.
|
||||
*/
|
||||
bool xmp_files_close(XmpFilePtr xf, XmpCloseFileOptions options);
|
||||
|
||||
/** Get the XMP packet from the file
|
||||
* @param xf the %XmpFilePtr to get the XMP packet from
|
||||
* @return a newly allocated XmpPtr. Use %xmp_free to release it.
|
||||
*/
|
||||
XmpPtr xmp_files_get_new_xmp(XmpFilePtr xf);
|
||||
|
||||
/** File the XMP packet from the file
|
||||
* @param xf the %XmpFilePtr to get the XMP packet from
|
||||
* @param xmp the XMP Packet to fill. Must be valid.
|
||||
*/
|
||||
bool xmp_files_get_xmp(XmpFilePtr xf, XmpPtr xmp);
|
||||
bool xmp_files_get_xmp_xmpstring(XmpFilePtr xf, XmpStringPtr xmp_packet,
|
||||
XmpPacketInfo* packet_info);
|
||||
|
||||
bool xmp_files_can_put_xmp(XmpFilePtr xf, XmpPtr xmp);
|
||||
bool xmp_files_can_put_xmp_xmpstring(XmpFilePtr xf, XmpStringPtr xmp_packet);
|
||||
bool xmp_files_can_put_xmp_cstr(XmpFilePtr xf, const char* xmp_packet,
|
||||
size_t len);
|
||||
|
||||
bool xmp_files_put_xmp(XmpFilePtr xf, XmpPtr xmp);
|
||||
bool xmp_files_put_xmp_xmpstring(XmpFilePtr xf, XmpStringPtr xmp_packet);
|
||||
bool xmp_files_put_xmp_cstr(XmpFilePtr xf, const char* xmp_packet, size_t len);
|
||||
|
||||
/** Get the file info from the open file
|
||||
* @param xf the file object
|
||||
* @param[out] filePath the file path object to store the path in. Pass NULL if not needed.
|
||||
* @param[out] options the options for open. Pass NULL if not needed.
|
||||
* @param[out] file_format the detected file format. Pass NULL if not needed.
|
||||
* @param[out] handler_flags the format options like from %xmp_files_get_format_info.
|
||||
* @return false in case of error.
|
||||
*/
|
||||
bool xmp_files_get_file_info(XmpFilePtr xf, XmpStringPtr filePath,
|
||||
XmpOpenFileOptions *options,
|
||||
XmpFileType * file_format,
|
||||
XmpFileFormatOptions *handler_flags);
|
||||
|
||||
/** Free a XmpFilePtr
|
||||
* @param xf the file ptr. Cannot be NULL
|
||||
* @return false on error.
|
||||
* Calll %xmp_get_error to retrieve the error code.
|
||||
*/
|
||||
bool xmp_files_free(XmpFilePtr xf);
|
||||
|
||||
/** Get the format info
|
||||
* @param format type identifier
|
||||
* @param options the options for the file format handler
|
||||
* @return false on error
|
||||
*/
|
||||
bool xmp_files_get_format_info(XmpFileType format,
|
||||
XmpFileFormatOptions * options);
|
||||
|
||||
/** Check the file format of a file. Use the same logic as in xmp_files_open()
|
||||
* @param filePath the path to the file
|
||||
* @return XMP_FT_UNKNOWN on error or if the file type is unknown
|
||||
*/
|
||||
XmpFileType xmp_files_check_file_format(const char *filePath);
|
||||
|
||||
/** Register a new namespace to add properties to
|
||||
* This is done automatically when reading the metadata block
|
||||
* @param namespaceURI the namespace URI to register
|
||||
* @param suggestedPrefix the suggested prefix
|
||||
* @param registeredPrefix the really registered prefix. Not necessarily
|
||||
* %suggestedPrefix.
|
||||
* @return true if success, false otherwise.
|
||||
*/
|
||||
bool xmp_register_namespace(const char *namespaceURI,
|
||||
const char *suggestedPrefix,
|
||||
XmpStringPtr registeredPrefix);
|
||||
|
||||
|
||||
/** Check is a namespace is registered
|
||||
* @param ns the namespace to check.
|
||||
* @param prefix The prefix associated if registered. Pass NULL
|
||||
* if not interested.
|
||||
* @return true if registered.
|
||||
* NEW in 2.1
|
||||
*/
|
||||
bool xmp_namespace_prefix(const char *ns, XmpStringPtr prefix);
|
||||
|
||||
/** Check if a ns prefix is registered.
|
||||
* @param prefix the prefix to check.
|
||||
* @param ns the namespace associated if registered. Pass NULL
|
||||
* if not interested.
|
||||
* @return true if registered.
|
||||
* NEW in 2.1
|
||||
*/
|
||||
bool xmp_prefix_namespace_uri(const char *prefix, XmpStringPtr ns);
|
||||
|
||||
|
||||
/** Create a new empty XMP packet
|
||||
* @return the packet pointer. Must be free with xmp_free()
|
||||
*/
|
||||
XmpPtr xmp_new_empty();
|
||||
|
||||
/** Create a new XMP packet
|
||||
* @param buffer the buffer to load data from. UTF-8 encoded.
|
||||
* @param len the buffer length in byte
|
||||
* @return the packet pointer. Must be free with xmp_free()
|
||||
*/
|
||||
XmpPtr xmp_new(const char *buffer, size_t len);
|
||||
|
||||
/** Create a new XMP packet from the one passed.
|
||||
* @param xmp the instance to copy. Can be NULL.
|
||||
* @return the packet pointer. NULL is failer (or NULL is passed).
|
||||
*/
|
||||
XmpPtr xmp_copy(XmpPtr xmp);
|
||||
|
||||
/** Free the xmp packet
|
||||
* @param xmp the xmp packet to free
|
||||
*/
|
||||
bool xmp_free(XmpPtr xmp);
|
||||
|
||||
/** Parse the XML passed through the buffer and load it.
|
||||
* @param xmp the XMP packet.
|
||||
* @param buffer the buffer.
|
||||
* @param len the length of the buffer.
|
||||
*/
|
||||
bool xmp_parse(XmpPtr xmp, const char *buffer, size_t len);
|
||||
|
||||
/** Serialize the XMP Packet to the given buffer
|
||||
* @param xmp the XMP Packet
|
||||
* @param buffer the buffer to write the XMP to
|
||||
* @param options options on how to write the XMP. See XMP_SERIAL_*
|
||||
* @param padding number of bytes of padding, useful for modifying
|
||||
* embedded XMP in place.
|
||||
* @return TRUE if success.
|
||||
*/
|
||||
bool xmp_serialize(XmpPtr xmp, XmpStringPtr buffer, uint options,
|
||||
uint padding);
|
||||
|
||||
/** Serialize the XMP Packet to the given buffer with formatting
|
||||
* @param xmp the XMP Packet
|
||||
* @param buffer the buffer to write the XMP to
|
||||
* @param options options on how to write the XMP. See XMP_SERIAL_*
|
||||
* @param padding number of bytes of padding, useful for modifying
|
||||
* embedded XMP in place.
|
||||
* @param newline the new line character to use
|
||||
* @param tab the indentation character to use
|
||||
* @param indent the initial indentation level
|
||||
* @return TRUE if success.
|
||||
*/
|
||||
bool xmp_serialize_and_format(XmpPtr xmp, XmpStringPtr buffer,
|
||||
uint options,
|
||||
uint padding, const char *newline,
|
||||
const char *tab, int indent);
|
||||
|
||||
|
||||
/** Get an XMP property and it option bits from the XMP packet
|
||||
* @param xmp the XMP packet
|
||||
* @param schema
|
||||
* @param name
|
||||
* @param property the allocated XmpStringPtr
|
||||
* @param propsBits pointer to the option bits. Pass NULL if not needed
|
||||
* @return true if found
|
||||
*/
|
||||
bool xmp_get_property(XmpPtr xmp, const char *schema,
|
||||
const char *name, XmpStringPtr property,
|
||||
uint *propsBits);
|
||||
|
||||
bool xmp_get_property_date(XmpPtr xmp, const char *schema,
|
||||
const char *name, XmpDateTime * property,
|
||||
uint *propsBits);
|
||||
bool xmp_get_property_float(XmpPtr xmp, const char *schema,
|
||||
const char *name, double * property,
|
||||
uint *propsBits);
|
||||
bool xmp_get_property_bool(XmpPtr xmp, const char *schema,
|
||||
const char *name, bool * property,
|
||||
uint *propsBits);
|
||||
bool xmp_get_property_int32(XmpPtr xmp, const char *schema,
|
||||
const char *name, int * property,
|
||||
uint *propsBits);
|
||||
bool xmp_get_property_int64(XmpPtr xmp, const char *schema,
|
||||
const char *name, long * property,
|
||||
uint *propsBits);
|
||||
|
||||
/** Get an item frpm an array property
|
||||
* @param xmp the xmp meta
|
||||
* @param schema the schema
|
||||
* @param name the property name
|
||||
* @param index the index in the array
|
||||
* @param property the property value
|
||||
* @param propsBits the property bits. Pass NULL is unwanted.
|
||||
* @return TRUE if success.
|
||||
*/
|
||||
bool xmp_get_array_item(XmpPtr xmp, const char *schema,
|
||||
const char *name, int index, XmpStringPtr property,
|
||||
uint *propsBits);
|
||||
|
||||
/** Set an XMP property in the XMP packet
|
||||
* @param xmp the XMP packet
|
||||
* @param schema
|
||||
* @param name
|
||||
* @param value 0 terminated string
|
||||
* @param optionBits
|
||||
* @return false if failure
|
||||
*/
|
||||
bool xmp_set_property(XmpPtr xmp, const char *schema,
|
||||
const char *name, const char *value,
|
||||
uint optionBits);
|
||||
|
||||
/** Set a date XMP property in the XMP packet
|
||||
* @param xmp the XMP packet
|
||||
* @param schema
|
||||
* @param name
|
||||
* @param value the date-time struct
|
||||
* @param optionBits
|
||||
* @return false if failure
|
||||
*/
|
||||
bool xmp_set_property_date(XmpPtr xmp, const char *schema,
|
||||
const char *name, const XmpDateTime *value,
|
||||
uint optionBits);
|
||||
|
||||
/** Set a float XMP property in the XMP packet
|
||||
* @param xmp the XMP packet
|
||||
* @param schema
|
||||
* @param name
|
||||
* @param value the float value
|
||||
* @param optionBits
|
||||
* @return false if failure
|
||||
*/
|
||||
bool xmp_set_property_float(XmpPtr xmp, const char *schema,
|
||||
const char *name, double value,
|
||||
uint optionBits);
|
||||
bool xmp_set_property_bool(XmpPtr xmp, const char *schema,
|
||||
const char *name, bool value,
|
||||
uint optionBits);
|
||||
bool xmp_set_property_int32(XmpPtr xmp, const char *schema,
|
||||
const char *name, int value,
|
||||
uint optionBits);
|
||||
bool xmp_set_property_int64(XmpPtr xmp, const char *schema,
|
||||
const char *name, long value,
|
||||
uint optionBits);
|
||||
|
||||
bool xmp_set_array_item(XmpPtr xmp, const char *schema,
|
||||
const char *name, int index, const char *value,
|
||||
uint optionBits);
|
||||
|
||||
/** Append a value to the XMP Property array in the XMP Packet provided
|
||||
* @param xmp the XMP packet
|
||||
* @param schema the schema of the property
|
||||
* @param name the name of the property
|
||||
* @param arrayOptions option bits of the parent array
|
||||
* @param value null-terminated string
|
||||
* @param optionBits option bits of the value itself.
|
||||
*/
|
||||
bool xmp_append_array_item(XmpPtr xmp, const char *schema, const char *name,
|
||||
uint arrayOptions, const char *value,
|
||||
uint optionBits);
|
||||
|
||||
/** Delete a property from the XMP Packet provided
|
||||
* @param xmp the XMP packet
|
||||
* @param schema the schema of the property
|
||||
* @param name the name of the property
|
||||
*/
|
||||
bool xmp_delete_property(XmpPtr xmp, const char *schema, const char *name);
|
||||
|
||||
/** Determines if a property exists in the XMP Packet provided
|
||||
* @param xmp the XMP packet
|
||||
* @param schema the schema of the property. Can't be NULL or empty.
|
||||
* @param name the name of the property. Can't be NULL or empty.
|
||||
* @return true is the property exists
|
||||
*/
|
||||
bool xmp_has_property(XmpPtr xmp, const char *schema, const char *name);
|
||||
|
||||
/** Get a localised text from a localisable property.
|
||||
* @param xmp the XMP packet
|
||||
* @param schema the schema
|
||||
* @param name the property name.
|
||||
* @param genericLang the generic language you may want as a fall back.
|
||||
* Can be NULL or empty.
|
||||
* @param specificLang the specific language you want. Can't be NULL or empty.
|
||||
* @param actualLang the actual language of the value. Can be NULL if
|
||||
* not wanted.
|
||||
* @param itemValue the localized value. Can be NULL if not wanted.
|
||||
* @param propBits the options flags describing the property. Can be NULL.
|
||||
* @return true if found, false otherwise.
|
||||
*/
|
||||
bool xmp_get_localized_text(XmpPtr xmp, const char *schema, const char *name,
|
||||
const char *genericLang, const char *specificLang,
|
||||
XmpStringPtr actualLang, XmpStringPtr itemValue,
|
||||
uint *propBits);
|
||||
|
||||
|
||||
/** Set a localised text in a localisable property.
|
||||
* @param xmp the XMP packet
|
||||
* @param schema the schema
|
||||
* @param name the property name.
|
||||
* @param genericLang the generic language you may want to set too.
|
||||
* Can be NULL or empty.
|
||||
* @param specificLang the specific language you want. Can't be NULL or empty.
|
||||
* @param value the localized value. Cannot be NULL.
|
||||
* @param optionBits the options flags describing the property.
|
||||
* @return true if set, false otherwise.
|
||||
*/
|
||||
bool xmp_set_localized_text(XmpPtr xmp, const char *schema, const char *name,
|
||||
const char *genericLang, const char *specificLang,
|
||||
const char *value, uint optionBits);
|
||||
|
||||
|
||||
|
||||
bool xmp_delete_localized_text(XmpPtr xmp, const char *schema,
|
||||
const char *name, const char *genericLang,
|
||||
const char *specificLang);
|
||||
|
||||
/** Instanciate a new string
|
||||
* @return the new instance. Must be freed with
|
||||
* xmp_string_free()
|
||||
*/
|
||||
XmpStringPtr xmp_string_new();
|
||||
|
||||
/** Free a XmpStringPtr
|
||||
* @param s the string to free
|
||||
*/
|
||||
void xmp_string_free(XmpStringPtr s);
|
||||
|
||||
/** Get the C string from the XmpStringPtr
|
||||
* @param s the string object
|
||||
* @return the const char * for the XmpStringPtr. It
|
||||
* belong to the object.
|
||||
*/
|
||||
const(char *) xmp_string_cstr(XmpStringPtr s);
|
||||
|
||||
/** Get the string length from the XmpStringPtr
|
||||
* @param s the string object
|
||||
* @return the string length. The unerlying implementation has it.
|
||||
*/
|
||||
size_t xmp_string_len(XmpStringPtr s);
|
||||
|
||||
/** Create a new iterator.
|
||||
* @param xmp the packet
|
||||
* @param schema the property schema
|
||||
* @param propName the property name
|
||||
* @param options
|
||||
* @return an iterator must be freed with % xmp_iterator_free
|
||||
*/
|
||||
XmpIteratorPtr xmp_iterator_new(XmpPtr xmp, const char * schema,
|
||||
const char * propName, XmpIterOptions options);
|
||||
|
||||
/** Free an iterator.
|
||||
* @param iter the iterator to free.
|
||||
*/
|
||||
bool xmp_iterator_free(XmpIteratorPtr iter);
|
||||
|
||||
/** Iterate to the next value
|
||||
* @param iter the iterator
|
||||
* @param schema the schema name. Pass NULL if not wanted
|
||||
* @param propName the property path. Pass NULL if not wanted
|
||||
* @param propValue the value of the property. Pass NULL if not wanted.
|
||||
* @param options the options for the property. Pass NULL if not wanted.
|
||||
* @return true if still something, false if none
|
||||
*/
|
||||
bool xmp_iterator_next(XmpIteratorPtr iter, XmpStringPtr schema,
|
||||
XmpStringPtr propName, XmpStringPtr propValue,
|
||||
uint *options);
|
||||
|
||||
|
||||
/**
|
||||
*/
|
||||
bool xmp_iterator_skip(XmpIteratorPtr iter, XmpIterSkipOptions options);
|
||||
|
||||
|
||||
/** Compare two XmpDateTime
|
||||
* @param left value
|
||||
* @param right value
|
||||
* @return if left < right, return < 0. If left > right, return > 0.
|
||||
* if left == right, return 0.
|
||||
*/
|
||||
int xmp_datetime_compare(XmpDateTime* left, XmpDateTime* right);
|
63
source/exempi/xmpconsts.d
Normal file
63
source/exempi/xmpconsts.d
Normal file
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* exempi-d - exempi.xmpconsts
|
||||
*
|
||||
* Bindings by Les De Ridder <les@lesderid.net>
|
||||
*
|
||||
* Copyright (C) 2007-2016 Hubert Figuiere
|
||||
* Copyright 2002-2007 Adobe Systems Incorporated
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1 Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2 Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3 Neither the name of the Authors, nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software wit hout specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
module exempi.xmpconsts;
|
||||
|
||||
extern(C):
|
||||
|
||||
extern __gshared const char[] NS_XMP_META;
|
||||
extern __gshared const char[] NS_RDF;
|
||||
extern __gshared const char[] NS_EXIF;
|
||||
extern __gshared const char[] NS_TIFF;
|
||||
extern __gshared const char[] NS_XAP;
|
||||
extern __gshared const char[] NS_XAP_RIGHTS;
|
||||
extern __gshared const char[] NS_DC;
|
||||
extern __gshared const char[] NS_EXIF_AUX;
|
||||
extern __gshared const char[] NS_CRS;
|
||||
extern __gshared const char[] NS_LIGHTROOM;
|
||||
extern __gshared const char[] NS_PHOTOSHOP;
|
||||
extern __gshared const char[] NS_CAMERA_RAW_SETTINGS;
|
||||
extern __gshared const char[] NS_CAMERA_RAW_SAVED_SETTINGS;
|
||||
extern __gshared const char[] NS_IPTC4XMP;
|
||||
extern __gshared const char[] NS_TPG;
|
||||
extern __gshared const char[] NS_DIMENSIONS_TYPE;
|
||||
/** Creative Commons namespace */
|
||||
extern __gshared const char[] NS_CC;
|
||||
/* Added in Exempi 2.1 */
|
||||
extern __gshared const char[] NS_PDF;
|
87
source/exempi/xmperrors.d
Normal file
87
source/exempi/xmperrors.d
Normal file
@ -0,0 +1,87 @@
|
||||
/*
|
||||
* exempi-d - exempi.xmperrors
|
||||
*
|
||||
* Bindings by Les De Ridder <les@lesderid.net>
|
||||
*
|
||||
* Copyright (C) 2007-2016 Hubert Figuiere
|
||||
* Copyright 2002-2007 Adobe Systems Incorporated
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1 Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2 Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3 Neither the name of the Authors, nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software wit hout specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
module exempi.xmperrors;
|
||||
|
||||
extern(C):
|
||||
|
||||
enum {
|
||||
/* More or less generic error codes. */
|
||||
XMPErr_Unknown = 0,
|
||||
XMPErr_TBD = -1,
|
||||
XMPErr_Unavailable = -2,
|
||||
XMPErr_BadObject = -3,
|
||||
XMPErr_BadParam = -4,
|
||||
XMPErr_BadValue = -5,
|
||||
XMPErr_AssertFailure = -6,
|
||||
XMPErr_EnforceFailure = -7,
|
||||
XMPErr_Unimplemented = -8,
|
||||
XMPErr_InternalFailure = -9,
|
||||
XMPErr_Deprecated = -10,
|
||||
XMPErr_ExternalFailure = -11,
|
||||
XMPErr_UserAbort = -12,
|
||||
XMPErr_StdException = -13,
|
||||
XMPErr_UnknownException = -14,
|
||||
XMPErr_NoMemory = -15,
|
||||
|
||||
/* More specific parameter error codes. */
|
||||
XMPErr_BadSchema = -101,
|
||||
XMPErr_BadXPath = -102,
|
||||
XMPErr_BadOptions = -103,
|
||||
XMPErr_BadIndex = -104,
|
||||
XMPErr_BadIterPosition = -105,
|
||||
XMPErr_BadParse = -106,
|
||||
XMPErr_BadSerialize = -107,
|
||||
XMPErr_BadFileFormat = -108,
|
||||
XMPErr_NoFileHandler = -109,
|
||||
XMPErr_TooLargeForJPEG = -110,
|
||||
|
||||
/* File format and internal structure error codes. */
|
||||
XMPErr_BadXML = -201,
|
||||
XMPErr_BadRDF = -202,
|
||||
XMPErr_BadXMP = -203,
|
||||
XMPErr_EmptyIterator = -204,
|
||||
XMPErr_BadUnicode = -205,
|
||||
XMPErr_BadTIFF = -206,
|
||||
XMPErr_BadJPEG = -207,
|
||||
XMPErr_BadPSD = -208,
|
||||
XMPErr_BadPSIR = -209,
|
||||
XMPErr_BadIPTC = -210,
|
||||
XMPErr_BadMPEG = -211
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user