summaryrefslogtreecommitdiff
path: root/XMPFiles/source/FormatSupport/ReconcileLegacy.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'XMPFiles/source/FormatSupport/ReconcileLegacy.hpp')
-rw-r--r--XMPFiles/source/FormatSupport/ReconcileLegacy.hpp272
1 files changed, 272 insertions, 0 deletions
diff --git a/XMPFiles/source/FormatSupport/ReconcileLegacy.hpp b/XMPFiles/source/FormatSupport/ReconcileLegacy.hpp
new file mode 100644
index 0000000..16333a3
--- /dev/null
+++ b/XMPFiles/source/FormatSupport/ReconcileLegacy.hpp
@@ -0,0 +1,272 @@
+#ifndef __ReconcileLegacy_hpp__
+#define __ReconcileLegacy_hpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2006 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.
+// =================================================================================================
+
+#include "public/include/XMP_Environment.h" // ! This must be the first include.
+
+#include "XMPFiles/source/FormatSupport/TIFF_Support.hpp"
+#include "XMPFiles/source/FormatSupport/PSIR_Support.hpp"
+#include "XMPFiles/source/FormatSupport/IPTC_Support.hpp"
+
+// =================================================================================================
+/// \file ReconcileLegacy.hpp
+/// \brief Utilities to reconcile between XMP and photo metadata forms such as TIFF/Exif and IPTC.
+///
+// =================================================================================================
+
+// ImportPhotoData imports TIFF/Exif and IPTC metadata from JPEG, TIFF, and Photoshop files into
+// XMP. The caller must have already done the file specific processing to select the appropriate
+// sources of the TIFF stream, the Photoshop image resources, and the IPTC.
+//
+// The reconciliation logic used here is based on the Metadata Working Group guidelines. This is a
+// simpler approach than used previously - which was modeled after historical Photoshop behavior.
+
+enum { // Bits for the options to ImportJTPtoXMP.
+ k2XMP_FileHadXMP = 0x0001, // Set if the file had an XMP packet.
+ k2XMP_FileHadIPTC = 0x0002, // Set if the file had legacy IPTC.
+ k2XMP_FileHadExif = 0x0004 // Set if the file had legacy Exif.
+};
+
+extern void ImportPhotoData ( const TIFF_Manager & exif,
+ const IPTC_Manager & iptc,
+ const PSIR_Manager & psir,
+ int iptcDigestState,
+ SXMPMeta * xmp,
+ XMP_OptionBits options = 0 );
+
+// ExportPhotoData exports XMP into TIFF/Exif and IPTC metadata for JPEG, TIFF, and Photoshop files.
+
+extern void ExportPhotoData ( XMP_FileFormat destFormat,
+ SXMPMeta * xmp,
+ TIFF_Manager * exif, // Pass 0 if not wanted.
+ IPTC_Manager * iptc, // Pass 0 if not wanted.
+ PSIR_Manager * psir, // Pass 0 if not wanted.
+ XMP_OptionBits options = 0 );
+
+// *** Mapping notes need revision for MWG related changes.
+
+// =================================================================================================
+// Summary of TIFF/Exif mappings to XMP
+// ====================================
+//
+// The mapping for each tag is driven mainly by the tag ID, and secondarily by the type. E.g. there
+// is no blanket rule that all ASCII tags are mapped to simple strings in XMP. Some, such as
+// SubSecTime or GPSLatitudeRef, are combined with other tags; others, like Flash, are reformated.
+// However, most tags are in fact mapped in an obvious manner based on their type and count.
+//
+// Photoshop practice has been to truncate ASCII tags at the first NUL, not supporting the TIFF
+// specification's notion of multi-part ASCII values.
+//
+// Rational values are mapped to XMP as "num/denom".
+//
+// The tags of UNDEFINED type that are mapped to XMP text are either special cases like ExifVersion
+// or the strings with an explicit encoding like UserComment.
+//
+// Latitude and logitude are mapped to XMP as "DDD,MM,SSk" or "DDD,MM.mmk"; k is N, S, E, or W.
+//
+// Flash struct in XMP separates the Fired, Return, Mode, Function, and RedEyeMode portions of the
+// Exif value. Fired, Function, and RedEyeMode are Boolean; Return and Mode are integers.
+//
+// The OECF/SFR, CFA, and DeviceSettings tables are described in the XMP spec.
+//
+// Instead of iterating through all tags in the various IFDs, it is probably more efficient to have
+// explicit processing for the tags that get special treatment, and a static table listing those
+// that get mapped by type and count. The type and count processing will verify that the actual
+// type and count are as expected, if not the tag is ignored.
+//
+// Here are the primary (0th) IFD tags that get special treatment:
+//
+// 270, 33432 - ASCII mapped to alt-text['x-default']
+// 306 - DateTime master
+// 315 - ASCII mapped to text seq[1]
+//
+// Here are the primary (0th) IFD tags that get mapped by type and count:
+//
+// 256, 257, 258, 259, 262, 271, 272, 274, 277, 282, 283, 284, 296, 301, 305, 318, 319,
+// 529, 530, 531, 532
+//
+// Here are the Exif IFD tags that get special treatment:
+//
+// 34856, 41484 - OECF/SFR table
+// 36864, 40960 - 4 ASCII chars to text
+// 36867, 36868 - DateTime master
+// 37121 - 4 UInt8 to integer seq
+// 37385 - Flash struct
+// 37510 - explicitly encoded text to alt-text['x-default']
+// 41728, 41729 - UInt8 to integer
+// 41730 - CFA table
+// 41995 - DeviceSettings table
+//
+// Here are the Exif IFD tags that get mapped by type and count:
+//
+// 33434, 33437, 34850, 34852, 34855, 37122, 37377, 37378, 37379, 37380, 37381, 37382, 37383, 37384,
+// 37386, 37396, 40961, 40962, 40963, 40964, 41483, 41486, 41487, 41488, 41492, 41493, 41495, 41985,
+// 41986, 41987, 41988, 41989, 41990, 41991, 41992, 41993, 41994, 41996, 42016
+//
+// Here are the GPS IFD tags that get special treatment:
+//
+// 0 - 4 UInt8 to text "n.n.n.n"
+// 2, 4, 20, 22 - Latitude or longitude master
+// 7 - special DateTime master, the time part
+// 27, 28 - explicitly encoded text
+//
+// Here are the GPS IFD tags that get mapped by type and count:
+//
+// 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 23, 24, 25, 26, 30
+// =================================================================================================
+
+// *** What about the Camera Raw tags that MDKit maps:
+// *** 0xFDE8, 0xFDE9, 0xFDEA, 0xFE4C, 0xFE4D, 0xFE4E, 0xFE4F, 0xFE50, 0xFE51, 0xFE52, 0xFE53,
+// *** 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFE58
+
+// =================================================================================================
+// Summary of TIFF/Exif mappings from XMP
+// ======================================
+//
+// Only a small number of properties are written back from XMP to TIFF/Exif. Most of the TIFF/Exif
+// tags mapped into XMP are information about the image or capture process, not things that users
+// should be editing. The tags that can be edited and written back to TIFF/Exif are:
+//
+// 270, 274, 282, 283, 296, 305, 306, 315, 33432; 36867, 36868, 37510, 40964
+// =================================================================================================
+
+// =================================================================================================
+// Details of TIFF/Exif mappings
+// =============================
+//
+// General (primary and thumbnail, 0th and 1st) IFD tags
+// tag TIFF type count Name XMP mapping
+//
+// 256 SHORTorLONG 1 ImageWidth integer
+// 257 SHORTorLONG 1 ImageLength integer
+// 258 SHORT 3 BitsPerSample integer seq
+// 259 SHORT 1 Compression integer
+// 262 SHORT 1 PhotometricInterpretation integer
+// 270 ASCII Any ImageDescription text, dc:description['x-default']
+// 271 ASCII Any Make text
+// 272 ASCII Any Model text
+// 274 SHORT 1 Orientation integer
+// 277 SHORT 1 SamplesPerPixel integer
+// 282 RATIONAL 1 XResolution rational
+// 283 RATIONAL 1 YResolution rational
+// 284 SHORT 1 PlanarConfiguration integer
+// 296 SHORT 1 ResolutionUnit integer
+// 301 SHORT 3*256 TransferFunction integer seq
+// 305 ASCII Any Software text, xmp:CreatorTool
+// 306 ASCII 20 DateTime date, master of 37520, xmp:DateTime
+// 315 ASCII Any Artist text, dc:creator[1]
+// 318 RATIONAL 2 WhitePoint rational seq
+// 319 RATIONAL 6 PrimaryChromaticities rational seq
+// 529 RATIONAL 3 YCbCrCoefficients rational seq
+// 530 SHORT 2 YCbCrSubSampling integer seq
+// 531 SHORT 1 YCbCrPositioning integer
+// 532 RATIONAL 6 ReferenceBlackWhite rational seq
+// 33432 ASCII Any Copyright text, dc:rights['x-default']
+//
+// Exif IFD tags
+// tag TIFF type count Name XMP mapping
+//
+// 33434 RATIONAL 1 ExposureTime rational
+// 33437 RATIONAL 1 FNumber rational
+// 34850 SHORT 1 ExposureProgram integer
+// 34852 ASCII Any SpectralSensitivity text
+// 34855 SHORT Any ISOSpeedRatings integer seq
+// 34856 UNDEFINED Any OECF OECF/SFR table
+// 36864 UNDEFINED 4 ExifVersion text, Exif has 4 ASCII chars
+// 36867 ASCII 20 DateTimeOriginal date, master of 37521
+// 36868 ASCII 20 DateTimeDigitized date, master of 37522
+// 37121 UNDEFINED 4 ComponentsConfiguration integer seq, Exif has 4 UInt8
+// 37122 RATIONAL 1 CompressedBitsPerPixel rational
+// 37377 SRATIONAL 1 ShutterSpeedValue rational
+// 37378 RATIONAL 1 ApertureValue rational
+// 37379 SRATIONAL 1 BrightnessValue rational
+// 37380 SRATIONAL 1 ExposureBiasValue rational
+// 37381 RATIONAL 1 MaxApertureValue rational
+// 37382 RATIONAL 1 SubjectDistance rational
+// 37383 SHORT 1 MeteringMode integer
+// 37384 SHORT 1 LightSource integer
+// 37385 SHORT 1 Flash Flash struct
+// 37386 RATIONAL 1 FocalLength rational
+// 37396 SHORT 2..4 SubjectArea integer seq
+// 37510 UNDEFINED Any UserComment text, explicit encoding, exif:UserComment['x-default]
+// 37520 ASCII Any SubSecTime date, with 306
+// 37521 ASCII Any SubSecTimeOriginal date, with 36867
+// 37522 ASCII Any SubSecTimeDigitized date, with 36868
+// 40960 UNDEFINED 4 FlashpixVersion text, Exif has 4 ASCII chars
+// 40961 SHORT 1 ColorSpace integer
+// 40962 SHORTorLONG 1 PixelXDimension integer
+// 40963 SHORTorLONG 1 PixelYDimension integer
+// 40964 ASCII 13 RelatedSoundFile text
+// 41483 RATIONAL 1 FlashEnergy rational
+// 41484 UNDEFINED Any SpatialFrequencyResponse OECF/SFR table
+// 41486 RATIONAL 1 FocalPlaneXResolution rational
+// 41487 RATIONAL 1 FocalPlaneYResolution rational
+// 41488 SHORT 1 FocalPlaneResolutionUnit integer
+// 41492 SHORT 2 SubjectLocation integer seq
+// 41493 RATIONAL 1 ExposureIndex rational
+// 41495 SHORT 1 SensingMethod integer
+// 41728 UNDEFINED 1 FileSource integer, Exif has UInt8
+// 41729 UNDEFINED 1 SceneType integer, Exif has UInt8
+// 41730 UNDEFINED Any CFAPattern CFA table
+// 41985 SHORT 1 CustomRendered integer
+// 41986 SHORT 1 ExposureMode integer
+// 41987 SHORT 1 WhiteBalance integer
+// 41988 RATIONAL 1 DigitalZoomRatio rational
+// 41989 SHORT 1 FocalLengthIn35mmFilm integer
+// 41990 SHORT 1 SceneCaptureType integer
+// 41991 SHORT 1 GainControl integer
+// 41992 SHORT 1 Contrast integer
+// 41993 SHORT 1 Saturation integer
+// 41994 SHORT 1 Sharpness integer
+// 41995 UNDEFINED Any DeviceSettingDescription DeviceSettings table
+// 41996 SHORT 1 SubjectDistanceRange integer
+// 42016 ASCII 33 ImageUniqueID text
+//
+// GPS IFD tags
+// tag TIFF type count Name XMP mapping
+//
+// 0 BYTE 4 GPSVersionID text, "n.n.n.n", Exif has 4 UInt8
+// 1 ASCII 2 GPSLatitudeRef latitude, with 2
+// 2 RATIONAL 3 GPSLatitude latitude, master of 2
+// 3 ASCII 2 GPSLongitudeRef longitude, with 4
+// 4 RATIONAL 3 GPSLongitude longitude, master of 3
+// 5 BYTE 1 GPSAltitudeRef integer
+// 6 RATIONAL 1 GPSAltitude rational
+// 7 RATIONAL 3 GPSTimeStamp date, master of 29
+// 8 ASCII Any GPSSatellites text
+// 9 ASCII 2 GPSStatus text
+// 10 ASCII 2 GPSMeasureMode text
+// 11 RATIONAL 1 GPSDOP rational
+// 12 ASCII 2 GPSSpeedRef text
+// 13 RATIONAL 1 GPSSpeed rational
+// 14 ASCII 2 GPSTrackRef text
+// 15 RATIONAL 1 GPSTrack rational
+// 16 ASCII 2 GPSImgDirectionRef text
+// 17 RATIONAL 1 GPSImgDirection rational
+// 18 ASCII Any GPSMapDatum text
+// 19 ASCII 2 GPSDestLatitudeRef latitude, with 20
+// 20 RATIONAL 3 GPSDestLatitude latitude, master of 19
+// 21 ASCII 2 GPSDestLongitudeRef longitude, with 22
+// 22 RATIONAL 3 GPSDestLongitude logitude, master of 21
+// 23 ASCII 2 GPSDestBearingRef text
+// 24 RATIONAL 1 GPSDestBearing rational
+// 25 ASCII 2 GPSDestDistanceRef text
+// 26 RATIONAL 1 GPSDestDistance rational
+// 27 UNDEFINED Any GPSProcessingMethod text, explicit encoding
+// 28 UNDEFINED Any GPSAreaInformation text, explicit encoding
+// 29 ASCII 11 GPSDateStamp date, with 29
+// 30 SHORT 1 GPSDifferential integer
+//
+// =================================================================================================
+
+// =================================================================================================
+
+#endif // #ifndef __ReconcileLegacy_hpp__