[SCM] exiv2 packaging branch, master, updated. debian/0.25-3.1-3734-gdcbc29a

Maximiliano Curia maxy at moszumanska.debian.org
Thu Jul 13 17:39:35 UTC 2017


Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/exiv2.git;a=commitdiff;h=f731b16

The following commit has been merged in the master branch:
commit f731b16c4f35e7e6a4e038f842bd2e5329630878
Author: Andreas Huggel <ahuggel at gmx.net>
Date:   Wed Jun 25 14:25:26 2008 +0000

    Added TiffEncoder::encodeXmp, encodeIptc
---
 src/cr2image.cpp        |  6 ++--
 src/tiffimage.cpp       |  6 ++--
 src/tiffvisitor.cpp     | 79 ++++++++++++++++++++++++++++++++++++++++++-------
 src/tiffvisitor_int.hpp | 17 +++++++++--
 4 files changed, 90 insertions(+), 18 deletions(-)

diff --git a/src/cr2image.cpp b/src/cr2image.cpp
index b04e2e7..1e1d1a7 100644
--- a/src/cr2image.cpp
+++ b/src/cr2image.cpp
@@ -211,9 +211,9 @@ namespace Exiv2 {
         { "*",         0x011a, Group::ifd0,    0, 0 },
         { "*",         0x011b, Group::ifd0,    0, 0 },
         { "*",         0x0128, Group::ifd0,    0, 0 },
-        { "*",         0x02bc, Group::ifd0,    &TiffDecoder::decodeXmp,    &TiffEncoder::encodeXmp    },
-        { "*",         0x83bb, Group::ifd0,    &TiffDecoder::decodeIptc,   &TiffEncoder::encodeIptc   },
-        { "*",         0x8649, Group::ifd0,    &TiffDecoder::decodeIptc,   &TiffEncoder::encodeIptc   }
+        { "*",         0x02bc, Group::ifd0,    &TiffDecoder::decodeXmp,    0 /*Todo*/ },
+        { "*",         0x83bb, Group::ifd0,    &TiffDecoder::decodeIptc,   0 /*Todo*/ },
+        { "*",         0x8649, Group::ifd0,    &TiffDecoder::decodeIptc,   0 /*Todo*/ }
     };
 
     DecoderFct Cr2Mapping::findDecoder(const std::string& make,
diff --git a/src/tiffimage.cpp b/src/tiffimage.cpp
index 4a9de12..0dd4520 100644
--- a/src/tiffimage.cpp
+++ b/src/tiffimage.cpp
@@ -418,9 +418,9 @@ namespace Exiv2 {
         { "*",         0x014a, Group::ifd0,    0, 0 }, // Todo: Controversial, causes problems with Exiftool
         { "*",       Tag::all, Group::sub0_0,  &TiffDecoder::decodeSubIfd,       0 /*Todo*/                         },
         { "*",       Tag::all, Group::sub0_1,  &TiffDecoder::decodeSubIfd,       0 /*Todo*/                         },
-        { "*",         0x02bc, Group::ifd0,    &TiffDecoder::decodeXmp,          &TiffEncoder::encodeXmp            },
-        { "*",         0x83bb, Group::ifd0,    &TiffDecoder::decodeIptc,         &TiffEncoder::encodeIptc           },
-        { "*",         0x8649, Group::ifd0,    &TiffDecoder::decodeIptc,         &TiffEncoder::encodeIptc           },
+        { "*",         0x02bc, Group::ifd0,    &TiffDecoder::decodeXmp,          0 /*done before the tree is traversed*/ },
+        { "*",         0x83bb, Group::ifd0,    &TiffDecoder::decodeIptc,         0 /*done before the tree is traversed*/ },
+        { "*",         0x8649, Group::ifd0,    &TiffDecoder::decodeIptc,         0 /*done before the tree is traversed*/ },
         // Minolta makernote entries which need to be encoded in big endian byte order
         { "*",       Tag::all, Group::minocso, &TiffDecoder::decodeStdTiffEntry, &TiffEncoder::encodeBigEndianEntry },
         { "*",       Tag::all, Group::minocso, &TiffDecoder::decodeStdTiffEntry, &TiffEncoder::encodeBigEndianEntry },
diff --git a/src/tiffvisitor.cpp b/src/tiffvisitor.cpp
index 51eaedc..487de8e 100644
--- a/src/tiffvisitor.cpp
+++ b/src/tiffvisitor.cpp
@@ -416,6 +416,9 @@ namespace Exiv2 {
     {
         assert(pRoot != 0);
 
+        encodeIptc();
+        encodeXmp();
+
         // Find camera make
         ExifKey key("Exif.Image.Make");
         ExifData::const_iterator pos = exifData_.findKey(key);
@@ -432,6 +435,72 @@ namespace Exiv2 {
         }
     }
 
+    void TiffEncoder::encodeIptc()
+    {
+        // Update IPTCNAA Exif tag, if it exists. Delete the tag if there
+        // is no IPTC data anymore.
+        // If there is new IPTC data and Exif.Image.ImageResources does
+        // not exist, create a new IPTCNAA Exif tag.
+        bool del = false;
+        const ExifKey iptcNaaKey("Exif.Image.IPTCNAA");
+        ExifData::iterator pos = exifData_.findKey(iptcNaaKey);
+        if (pos != exifData_.end()) {
+            exifData_.erase(pos);
+            del = true;
+        }
+        DataBuf rawIptc = IptcParser::encode(iptcData_);
+        const ExifKey irbKey("Exif.Image.ImageResources");
+        pos = exifData_.findKey(irbKey);
+        if (rawIptc.size_ != 0 && (del || pos == exifData_.end())) {
+            Value::AutoPtr value = Value::create(unsignedLong);
+            value->read(rawIptc.pData_, rawIptc.size_, byteOrder_);
+
+// Todo remove me!
+std::cerr << "Writing IPTCNAA datum, size = " << value->size() << "
";
+
+            Exifdatum iptcDatum(iptcNaaKey, value.get());
+            exifData_.add(iptcDatum);
+            pos = exifData_.findKey(irbKey); // needed after add()
+        }
+        // Also update IPTC IRB in Exif.Image.ImageResources if it exists,
+        // but don't create it if not.
+        if (pos != exifData_.end()) {
+            DataBuf irbBuf(pos->value().size());
+            pos->value().copy(irbBuf.pData_, invalidByteOrder);
+            irbBuf = Photoshop::setIptcIrb(irbBuf.pData_, irbBuf.size_, iptcData_);
+            exifData_.erase(pos);
+            if (irbBuf.size_ != 0) {
+                Value::AutoPtr value = Value::create(undefined);
+                value->read(irbBuf.pData_, irbBuf.size_, invalidByteOrder);
+                Exifdatum iptcDatum(irbKey, value.get());
+                exifData_.add(iptcDatum);
+            }
+        }
+    } // TiffEncoder::encodeIptc
+
+    void TiffEncoder::encodeXmp()
+    {
+        const ExifKey xmpKey("Exif.Image.XMLPacket");
+        // Remove any existing XMP Exif tag
+        ExifData::iterator pos = exifData_.findKey(xmpKey);
+        if (pos != exifData_.end()) {
+            exifData_.erase(pos);
+        }
+        std::string xmpPacket;
+        if (XmpParser::encode(xmpPacket, xmpData_)) {
+#ifndef SUPPRESS_WARNINGS
+            std::cerr << "Error: Failed to encode XMP metadata.
";
+#endif
+        }
+        if (!xmpPacket.empty()) {
+            // Set the XMP Exif tag to the new value
+            Value::AutoPtr value = Value::create(unsignedByte);
+            value->read(reinterpret_cast<const byte*>(&xmpPacket[0]), xmpPacket.size(), invalidByteOrder);
+            Exifdatum xmpDatum(xmpKey, value.get());
+            exifData_.add(xmpDatum);
+        }
+    } // TiffEncoder::encodeXmp
+
     void TiffEncoder::setDirty(bool flag)
     {
         dirty_ = flag;
@@ -776,16 +845,6 @@ namespace Exiv2 {
         // Todo
     }
 
-    void TiffEncoder::encodeIptc(TiffEntryBase* object, const Exifdatum* datum)
-    {
-        // Todo
-    }
-
-    void TiffEncoder::encodeXmp(TiffEntryBase* object, const Exifdatum* datum)
-    {
-        // Todo
-    }
-
     void TiffEncoder::encodeBigEndianEntry(TiffEntryBase* object, const Exifdatum* datum)
     {
         byteOrder_ = bigEndian;
diff --git a/src/tiffvisitor_int.hpp b/src/tiffvisitor_int.hpp
index 72fd6aa..60f0553 100644
--- a/src/tiffvisitor_int.hpp
+++ b/src/tiffvisitor_int.hpp
@@ -422,8 +422,6 @@ namespace Exiv2 {
 
         //! Special encoder function to encode IPTC data to an IPTCNAA or Photoshop ImageResources tag.
         void encodeIptc(TiffEntryBase* object, const Exifdatum* datum);
-        //! Special encoder function to encode an XMP packet to an XMLPacket tag.
-        void encodeXmp(TiffEntryBase* object, const Exifdatum* datum);
         //! Special encoder function for a standard TIFF entry using big endian byte order.
         void encodeBigEndianEntry(TiffEntryBase* object, const Exifdatum* datum);
         /*!
@@ -464,6 +462,21 @@ namespace Exiv2 {
         //@}
 
     private:
+        //! @name Manipulators
+        //@{
+        /*!
+          Encode IPTC data. Updates or adds tag Exif.Image.IPTCNAA, updates but
+          never adds tag Exif.Image.ImageResources.
+          This method is called from the constructor.
+         */
+        void encodeIptc();
+        /*!
+          Encode XMP data. Adds tag Exif.Image.XMLPacket with the XMP packet.
+          This method is called from the constructor.
+         */
+        void encodeXmp();
+        //@}
+
         //! @name Accessors
         //@{
         /*!

-- 
exiv2 packaging



More information about the pkg-kde-commits mailing list