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

Maximiliano Curia maxy at moszumanska.debian.org
Thu Jul 13 17:47:06 UTC 2017


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

The following commit has been merged in the master branch:
commit cf284286d865c8be1bd8a9a32303fe3292b5ef0e
Author: Robin Mills <robin at clanmills.com>
Date:   Wed Sep 28 16:43:15 2016 +0000

    #1234 Fix submitted.  Passes test suite littleEndian.  To be tested on Mac Powerbook PPC bigEndian.
---
 include/exiv2/pgfimage.hpp |  3 +-
 src/pgfimage.cpp           | 72 ++++++++++++++++++++++++++++++++++++++++------
 2 files changed, 65 insertions(+), 10 deletions(-)

diff --git a/include/exiv2/pgfimage.hpp b/include/exiv2/pgfimage.hpp
index 1c0f743..70f6d0a 100644
--- a/include/exiv2/pgfimage.hpp
+++ b/include/exiv2/pgfimage.hpp
@@ -93,6 +93,7 @@ namespace Exiv2
         //@}
 
     private:
+        bool bSwap_; // true for bigEndian hardware, else false
         //! @name NOT implemented
         //@{
         //! Copy constructor
@@ -112,7 +113,7 @@ namespace Exiv2
         //! Read PGF Header size encoded in 32 bits integer.
         uint32_t readPgfHeaderSize(BasicIo& iIo);
         //! Read header structure.
-        DataBuf readPgfHeaderStructure(BasicIo& iIo, int* width, int* height);
+        DataBuf readPgfHeaderStructure(BasicIo& iIo, int& width,int & height);
         //@}
 
     }; // class PgfImage
diff --git a/src/pgfimage.cpp b/src/pgfimage.cpp
index d32ce8b..15b8358 100644
--- a/src/pgfimage.cpp
+++ b/src/pgfimage.cpp
@@ -58,12 +58,65 @@ const unsigned char pgfBlank[] = { 0x50,0x47,0x46,0x36,0x10,0x00,0x00,0x00,0x01,
                                    0x00,0x78,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00
                                  };
 
+
 // *****************************************************************************
 // class member definitions
+
 namespace Exiv2 {
 
+	// http://en.wikipedia.org/wiki/Endianness
+	static bool isBigEndian()
+	{
+		union {
+			uint32_t i;
+			char c[4];
+		} e = { 0x01000000 };
+
+		return e.c[0]?true:false;
+	}
+	// static bool isLittleEndian() { return !isBigEndian(); }
+
+	static uint32_t byteSwap(uint32_t value,bool bSwap)
+	{
+		uint32_t result = 0;
+		result |= (value & 0x000000FF) << 24;
+		result |= (value & 0x0000FF00) << 8;
+		result |= (value & 0x00FF0000) >> 8;
+		result |= (value & 0xFF000000) >> 24;
+		return bSwap ? result : value;
+	}
+/*
+	static uint16_t byteSwap(uint16_t value,bool bSwap)
+	{
+		uint16_t result = 0;
+		result |= (value & 0x00FF) << 8;
+		result |= (value & 0xFF00) >> 8;
+		return bSwap ? result : value;
+	}
+
+	static uint16_t byteSwap2(Exiv2::DataBuf& buf,size_t offset,bool bSwap)
+	{
+		uint16_t v;
+		char*    p = (char*) &v;
+		p[0] = buf.pData_[offset];
+		p[1] = buf.pData_[offset+1];
+		return byteSwap(v,bSwap);
+	}
+*/
+	static uint32_t byteSwap(Exiv2::DataBuf& buf,size_t offset,bool bSwap)
+	{
+		uint32_t v;
+		char*    p = (char*) &v;
+		p[0] = buf.pData_[offset];
+		p[1] = buf.pData_[offset+1];
+		p[2] = buf.pData_[offset+2];
+		p[3] = buf.pData_[offset+3];
+		return byteSwap(v,bSwap);
+	}
+
     PgfImage::PgfImage(BasicIo::AutoPtr io, bool create)
             : Image(ImageType::pgf, mdExif | mdIptc| mdXmp | mdComment, io)
+            , bSwap_(isBigEndian())
     {
         if (create)
         {
@@ -104,8 +157,9 @@ namespace Exiv2 {
         readPgfMagicNumber(*io_);
 
         uint32_t headerSize = readPgfHeaderSize(*io_);
+        headerSize = byteSwap(headerSize,bSwap_);
 
-        readPgfHeaderStructure(*io_, &pixelWidth_, &pixelHeight_);
+        readPgfHeaderStructure(*io_, pixelWidth_, pixelHeight_);
 
         // And now, the most interresting, the user data byte array where metadata are stored as small image.
 
@@ -171,7 +225,7 @@ namespace Exiv2 {
         readPgfHeaderSize(*io_);
 
         int w, h;
-        DataBuf header      = readPgfHeaderStructure(*io_, &w, &h);
+        DataBuf header      = readPgfHeaderStructure(*io_, w, h);
 
         Image::AutoPtr img  = ImageFactory::create(ImageType::png);
 
@@ -179,8 +233,8 @@ namespace Exiv2 {
         img->setIptcData(iptcData_);
         img->setXmpData(xmpData_);
         img->writeMetadata();
-        int imgSize    = img->io().size();
-        DataBuf imgBuf = img->io().read(imgSize);
+        int     imgSize  = img->io().size();
+        DataBuf imgBuf   = img->io().read(imgSize);
 
 #ifdef DEBUG
         std::cout << "Exiv2::PgfImage::doWriteMetadata: Creating image to host metadata (" << imgSize << " bytes)
";
@@ -198,6 +252,7 @@ namespace Exiv2 {
         uint32_t newHeaderSize = header.size_ + imgSize;
         DataBuf buffer(4);
         memcpy (buffer.pData_, &newHeaderSize, 4);
+        byteSwap(buffer,0,bSwap_);
         if (outIo.write(buffer.pData_, 4) != 4) throw Error(21);
 
 #ifdef DEBUG
@@ -250,8 +305,7 @@ namespace Exiv2 {
         if (iIo.error()) throw Error(14);
         if (bufRead != buffer.size_) throw Error(20);
 
-        uint32_t headerSize = 0;
-        memcpy (&headerSize, buffer.pData_, 4);      // TODO : check endianness.
+        int headerSize = (int) byteSwap(buffer,0,bSwap_);
         if (headerSize <= 0 ) throw Error(22);
 
 #ifdef DEBUG
@@ -261,15 +315,15 @@ namespace Exiv2 {
         return headerSize;
     } // PgfImage::readPgfHeaderSize
 
-    DataBuf PgfImage::readPgfHeaderStructure(BasicIo& iIo, int* width, int* height)
+    DataBuf PgfImage::readPgfHeaderStructure(BasicIo& iIo, int& width, int& height)
     {
         DataBuf header(16);
         long bufRead = iIo.read(header.pData_, header.size_);
         if (iIo.error()) throw Error(14);
         if (bufRead != header.size_) throw Error(20);
 
-        memcpy(width,  &header.pData_[0], 4);      // TODO : check endianness.
-        memcpy(height, &header.pData_[4], 4);      // TODO : check endianness.
+        width  = byteSwap(header,0,bSwap_);
+        height = byteSwap(header,4,bSwap_);
 
         /* NOTE: properties not yet used
         byte nLevels  = buffer.pData_[8];

-- 
exiv2 packaging



More information about the pkg-kde-commits mailing list