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

Maximiliano Curia maxy at moszumanska.debian.org
Thu Jul 13 17:46:21 UTC 2017


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

The following commit has been merged in the master branch:
commit 06eabfdd889edbb7a9eee0e644db3f3ba0076b58
Author: Robin Mills <robin at clanmills.com>
Date:   Wed Mar 23 17:06:33 2016 +0000

    #1074.  jpgimage.cpp ICC support (Work in Progress)
---
 include/exiv2/image.hpp    | 12 ++++++++++++
 include/exiv2/jpgimage.hpp |  1 +
 src/image.cpp              | 11 +++++++++++
 src/jpgimage.cpp           | 32 ++++++++++++++++++++++++++++++++
 src/pngimage.cpp           |  5 +++--
 5 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/include/exiv2/image.hpp b/include/exiv2/image.hpp
index 8530d5c..aa67171 100644
--- a/include/exiv2/image.hpp
+++ b/include/exiv2/image.hpp
@@ -229,6 +229,17 @@ namespace Exiv2 {
          */
         virtual void clearComment();
         /*!
+          @brief Set the image iccProfile. The new profile is not written
+              to the image until the writeMetadata() method is called.
+          @param iccProfile DataBuf containing profile (binary)
+         */
+        virtual void setIccProfile(DataBuf& iccProfile);
+        /*!
+          @brief Erase iccProfile. the profile isnot not removed from
+              the actual image until the writeMetadata() method is called.
+         */
+        virtual void clearIccProfile();
+        /*!
           @brief Copy all existing metadata from source Image. The data is
               copied into internal buffers and is not written to the image
               until the writeMetadata() method is called.
@@ -422,6 +433,7 @@ namespace Exiv2 {
         ExifData          exifData_;          //!< Exif data container
         IptcData          iptcData_;          //!< IPTC data container
         XmpData           xmpData_;           //!< XMP data container
+        DataBuf           iccProfile_;        //!< ICC buffer (binary data)
         std::string       comment_;           //!< User comment
         std::string       xmpPacket_;         //!< XMP packet
         int               pixelWidth_;        //!< image pixel width
diff --git a/include/exiv2/jpgimage.hpp b/include/exiv2/jpgimage.hpp
index b61bfc7..c04f5c5 100644
--- a/include/exiv2/jpgimage.hpp
+++ b/include/exiv2/jpgimage.hpp
@@ -233,6 +233,7 @@ namespace Exiv2 {
         static const byte eoi_;                 //!< JPEG EOI marker
         static const byte app0_;                //!< JPEG APP0 marker
         static const byte app1_;                //!< JPEG APP1 marker
+        static const byte app2_;                //!< JPEG APP2 marker
         static const byte app13_;               //!< JPEG APP13 marker
         static const byte com_;                 //!< JPEG Comment marker
         static const byte sof0_;                //!< JPEG Start-Of-Frame marker
diff --git a/src/image.cpp b/src/image.cpp
index 214c52e..eceaf74 100644
--- a/src/image.cpp
+++ b/src/image.cpp
@@ -181,6 +181,7 @@ namespace Exiv2 {
         clearXmpPacket();
         clearXmpData();
         clearComment();
+        clearIccProfile();
     }
 
     ExifData& Image::exifData()
@@ -283,6 +284,16 @@ namespace Exiv2 {
         comment_ = comment;
     }
 
+    void Image::setIccProfile(Exiv2::DataBuf& iccProfile)
+    {
+        iccProfile_ = iccProfile;
+    }
+
+    void Image::clearIccProfile()
+    {
+        iccProfile_.release();
+    }
+
     void Image::setByteOrder(ByteOrder byteOrder)
     {
         byteOrder_ = byteOrder;
diff --git a/src/jpgimage.cpp b/src/jpgimage.cpp
index 90a4564..7301cce 100644
--- a/src/jpgimage.cpp
+++ b/src/jpgimage.cpp
@@ -67,6 +67,7 @@ namespace Exiv2 {
     const byte     JpegBase::eoi_      = 0xd9;
     const byte     JpegBase::app0_     = 0xe0;
     const byte     JpegBase::app1_     = 0xe1;
+    const byte     JpegBase::app2_     = 0xe2;
     const byte     JpegBase::app13_    = 0xed;
     const byte     JpegBase::com_      = 0xfe;
 
@@ -351,6 +352,7 @@ namespace Exiv2 {
         bool foundCompletePsData = false;
         bool foundExifData = false;
         bool foundXmpData = false;
+        bool foundIccProfile = false;
 
         // Read section marker
         int marker = advanceToMarker();
@@ -449,6 +451,15 @@ namespace Exiv2 {
                 }
                 --search;
             }
+            else if (   !foundIccProfile && marker == app2_ ) {
+                // Seek to beginning and read the iccProfile 
+                io_->seek(31 - bufRead, BasicIo::cur);
+                DataBuf iccProfile(size);
+                io_->read(iccProfile.pData_, iccProfile.size_);
+                if (io_->error() || io_->eof()) throw Error(14);
+                this->setIccProfile(iccProfile);
+                foundXmpData = true;
+            }
             else if (   pixelHeight_ == 0
                      && (   marker == sof0_  || marker == sof1_  || marker == sof2_
                          || marker == sof3_  || marker == sof5_  || marker == sof6_
@@ -799,6 +810,7 @@ namespace Exiv2 {
         int comPos = 0;
         int skipApp1Exif = -1;
         int skipApp1Xmp = -1;
+        int skipApp2IccProfile = -1;
         bool foundCompletePsData = false;
         std::vector<int> skipApp13Ps3;
         int skipCom = -1;
@@ -844,6 +856,12 @@ namespace Exiv2 {
                 ++search;
                 if (io_->seek(size-bufRead, BasicIo::cur)) throw Error(22);
             }
+            else if (   skipApp2IccProfile == -1 && marker == app2_) {
+                if (size < 31) throw Error(22);
+                skipApp2IccProfile = count;
+                ++search;
+                if (io_->seek(size-bufRead, BasicIo::cur)) throw Error(22);
+            }
             else if (   !foundCompletePsData
                      && marker == app13_ && memcmp(buf.pData_ + 2, Photoshop::ps3Id_, 14) == 0) {
 #ifdef DEBUG
@@ -995,6 +1013,20 @@ namespace Exiv2 {
                     if (outIo.error()) throw Error(21);
                     --search;
                 }
+                if (iccProfile_.size_ > 0) {
+                    // Write APP2 marker, size of APP2 field, and IccProfile
+                    tmpBuf[0] = 0xff;
+                    tmpBuf[1] = app2_;
+
+                    if (iccProfile_.size_ > 0xffff) throw Error(37, "IccProfile");
+                    us2Data(tmpBuf + 2, static_cast<uint16_t>(iccProfile_.size_), bigEndian);
+                    if (outIo.write(tmpBuf, 4) != 4) throw Error(21);
+
+                    // Write new iccProfile 
+                    if ( outIo.write(iccProfile_.pData_,iccProfile_.size_) != static_cast<long>(iccProfile_.size_) ) throw Error(21);
+                    if ( outIo.error() ) throw Error(21);
+                    --search;
+                }
                 if (foundCompletePsData || iptcData_.count() > 0) {
                     // Set the new IPTC IRB, keeps existing IRBs but removes the
                     // IPTC block if there is no new IPTC data to write
diff --git a/src/pngimage.cpp b/src/pngimage.cpp
index 67c316d..bc5e9b7 100644
--- a/src/pngimage.cpp
+++ b/src/pngimage.cpp
@@ -258,7 +258,8 @@ namespace Exiv2 {
 
                 if( bDump ) {
                     DataBuf   dataBuf;
-                    byte*     data     = new byte[dataOffset];
+                    byte*     data     = new byte[dataOffset+1];
+                    data[dataOffset]=0;
                     io_->read(data,dataOffset);
                     io_->seek(restore, BasicIo::beg);
                     uint32_t    name_l = (uint32_t) std::strlen((const char*)data)+1; // leading string length
@@ -308,7 +309,7 @@ namespace Exiv2 {
                             IptcData::printStructure(out,dataBuf.pData_,dataBuf.size_,depth);
                         }
                     }
-                    delete [] data;
+                    delete[] data;
                 }
                 io_->seek(dataOffset + 4 , BasicIo::cur);
                 if (io_->error()) throw Error(14);

-- 
exiv2 packaging



More information about the pkg-kde-commits mailing list