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

Maximiliano Curia maxy at moszumanska.debian.org
Thu Jul 13 17:36:12 UTC 2017


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

The following commit has been merged in the master branch:
commit a0a42b148e0273742be36a242342416048e2ab03
Author: Andreas Huggel <ahuggel at gmx.net>
Date:   Mon Mar 22 08:51:07 2004 +0000

    Added Thumbnail class hierarchy and support to erase thumbnails
---
 src/exif.cpp | 553 +++++++++++++++++++++++++++++++----------------------------
 src/exif.hpp | 243 +++++++++++++++++---------
 2 files changed, 448 insertions(+), 348 deletions(-)

diff --git a/src/exif.cpp b/src/exif.cpp
index 9f003e8..1cb19a3 100644
--- a/src/exif.cpp
+++ b/src/exif.cpp
@@ -20,14 +20,14 @@
  */
 /*
   File:      exif.cpp
-  Version:   $Name:  $ $Revision: 1.31 $
+  Version:   $Name:  $ $Revision: 1.32 $
   Author(s): Andreas Huggel (ahu) <ahuggel at gmx.net>
   History:   26-Jan-04, ahu: created
              11-Feb-04, ahu: isolated as a component
  */
 // *****************************************************************************
 #include "rcsid.hpp"
-EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.31 $ $RCSfile: exif.cpp,v $")
+EXIV2_RCSID("@(#) $Name:  $ $Revision: 1.32 $ $RCSfile: exif.cpp,v $")
 
 // *****************************************************************************
 // included header files
@@ -74,7 +74,7 @@ namespace Exif {
 
     Metadatum::Metadatum(const Entry& e, ByteOrder byteOrder)
         : tag_(e.tag()), ifdId_(e.ifdId()), idx_(e.idx()), 
-          makerNote_(e.makerNote()), value_(0), key_(makeKey(e))
+          pMakerNote_(e.makerNote()), value_(0), key_(makeKey(e))
     {
         value_ = Value::create(TypeId(e.type()));
         value_->read(e.data(), e.count() * e.typeSize(), byteOrder);
@@ -83,7 +83,7 @@ namespace Exif {
     Metadatum::Metadatum(const std::string& key, 
                          const Value* value, 
                          MakerNote* makerNote)
-        : idx_(0), makerNote_(makerNote), value_(0), key_(key)
+        : idx_(0), pMakerNote_(makerNote), value_(0), key_(key)
     {
         if (value) value_ = value->clone();
         std::pair<uint16, IfdId> p = decomposeKey(key, makerNote);
@@ -101,7 +101,7 @@ namespace Exif {
 
     Metadatum::Metadatum(const Metadatum& rhs)
         : tag_(rhs.tag_), ifdId_(rhs.ifdId_), idx_(rhs.idx_),
-          makerNote_(rhs.makerNote_), value_(0), key_(rhs.key_)
+          pMakerNote_(rhs.pMakerNote_), value_(0), key_(rhs.key_)
     {
         if (rhs.value_ != 0) value_ = rhs.value_->clone(); // deep copy
     }
@@ -112,7 +112,7 @@ namespace Exif {
         tag_ = rhs.tag_;
         ifdId_ = rhs.ifdId_;
         idx_ = rhs.idx_;
-        makerNote_ = rhs.makerNote_;
+        pMakerNote_ = rhs.pMakerNote_;
         delete value_;
         value_ = 0;
         if (rhs.value_ != 0) value_ = rhs.value_->clone(); // deep copy
@@ -141,100 +141,61 @@ namespace Exif {
 
     std::string Metadatum::tagName() const
     {
-        if (ifdId_ == makerIfd && makerNote_ != 0) {
-            return makerNote_->tagName(tag_);
+        if (ifdId_ == makerIfd && pMakerNote_ != 0) {
+            return pMakerNote_->tagName(tag_);
         }
         return ExifTags::tagName(tag_, ifdId_); 
     }
 
     std::string Metadatum::sectionName() const 
     {
-        if (ifdId_ == makerIfd && makerNote_ != 0) {
-            return makerNote_->sectionName(tag_);
+        if (ifdId_ == makerIfd && pMakerNote_ != 0) {
+            return pMakerNote_->sectionName(tag_);
         }        
         return ExifTags::sectionName(tag_, ifdId_); 
     }
 
-    Thumbnail::Thumbnail()
-        : type_(none), size_(0), image_(0), ifd_(ifd1, 0, false)
+    TiffThumbnail::TiffThumbnail()
+        : size_(0), pImage_(0), ifd_(ifd1, 0, false)
     {
     }
 
-    Thumbnail::~Thumbnail()
+    TiffThumbnail::~TiffThumbnail()
     {
-        delete[] image_;
+        delete[] pImage_;
     }
 
-    Thumbnail::Thumbnail(const Thumbnail& rhs)
-        : type_(rhs.type_), size_(rhs.size_), image_(0), ifd_(ifd1, 0, false)
+    TiffThumbnail::TiffThumbnail(const TiffThumbnail& rhs)
+        : size_(rhs.size_), pImage_(0), ifd_(ifd1, 0, false)
     {
-        if (rhs.image_ > 0 && rhs.size_ > 0) {
-            image_ = new char[rhs.size_];
-            memcpy(image_, rhs.image_, rhs.size_);
-        }
-        if (image_ && type_ == tiff) {
-            tiffHeader_.read(image_);
-            ifd_.read(image_ + tiffHeader_.offset(),
+        if (rhs.pImage_ && rhs.size_ > 0) {
+            pImage_ = new char[rhs.size_];
+            memcpy(pImage_, rhs.pImage_, rhs.size_);
+            tiffHeader_.read(pImage_);
+            ifd_.read(pImage_ + tiffHeader_.offset(),
                       tiffHeader_.byteOrder(), tiffHeader_.offset());
         }
     }
 
-    Thumbnail& Thumbnail::operator=(const Thumbnail& rhs)
+    TiffThumbnail& TiffThumbnail::operator=(const TiffThumbnail& rhs)
     {
-        type_ = rhs.type_;
-        size_ = rhs.size_;
-        delete[] image_;
-        image_ = 0;
-        if (rhs.image_ > 0 && rhs.size_ > 0) {
-            image_ = new char[rhs.size_];
-            memcpy(image_, rhs.image_, rhs.size_);
-        }
-        if (image_ && type_ == tiff) {
-            tiffHeader_.read(image_);
-            ifd_.read(image_ + tiffHeader_.offset(), 
+        char* pNewImage = 0;
+        if (rhs.pImage_ && rhs.size_ > 0) {
+            pNewImage = new char[rhs.size_];
+            memcpy(pNewImage, rhs.pImage_, rhs.size_);
+            tiffHeader_.read(rhs.pImage_);
+            ifd_.read(pNewImage + tiffHeader_.offset(), 
                       tiffHeader_.byteOrder(), tiffHeader_.offset());
         }
+        size_ = rhs.size_;
+        delete[] pImage_;
+        pImage_ = pNewImage;
         return *this;
     }
 
-    int Thumbnail::read(const char* buf,
-                        const ExifData& exifData,
-                        ByteOrder byteOrder)
-    {
-        int rc = 0;
-        std::string key = "Thumbnail.ImageStructure.Compression";
-        ExifData::const_iterator pos = exifData.findKey(key);
-        if (pos == exifData.end()) return -1; // no thumbnail
-        long compression = pos->toLong();
-        if (compression == 6) {
-            rc = readJpegImage(buf, exifData);
-        }
-        else {
-            rc = readTiffImage(buf, exifData, byteOrder);
-        }
-        return rc;
-    } // Thumbnail::read
-
-    int Thumbnail::readJpegImage(const char* buf, const ExifData& exifData) 
-    {
-        std::string key = "Thumbnail.RecordingOffset.JPEGInterchangeFormat";
-        ExifData::const_iterator pos = exifData.findKey(key);
-        if (pos == exifData.end()) return 1;
-        long offset = pos->toLong();
-        key = "Thumbnail.RecordingOffset.JPEGInterchangeFormatLength";
-        pos = exifData.findKey(key);
-        if (pos == exifData.end()) return 1;
-        long size = pos->toLong();
-        image_ = new char[size];
-        memcpy(image_, buf + offset, size);
-        size_ = size;
-        type_ = jpeg;
-        return 0;
-    } // Thumbnail::readJpegImage
-
-    int Thumbnail::readTiffImage(const char* buf,
-                                 const ExifData& exifData,
-                                 ByteOrder byteOrder)
+    int TiffThumbnail::read(const char* buf,
+                            const ExifData& exifData,
+                            ByteOrder byteOrder)
     {
         char* data = new char[64*1024];     // temporary buffer Todo: handle larger
         memset(data, 0x0, 64*1024);         // images (which violate the Exif Std)
@@ -283,84 +244,43 @@ namespace Exif {
         ifd1.sortByTag();
         ifd1.copy(data + ifdOffset, tiffHeader.byteOrder(), ifdOffset);
 
-        image_ = new char[len];
-        memcpy(image_, data, len);
+        delete[] pImage_;
+        pImage_ = new char[len];
+        memcpy(pImage_, data, len);
         size_ = len;
-        tiffHeader_.read(image_);
-        ifd_.read(image_ + tiffHeader_.offset(), 
+        tiffHeader_.read(pImage_);
+        ifd_.read(pImage_ + tiffHeader_.offset(), 
                   tiffHeader_.byteOrder(), tiffHeader_.offset());
-        type_ = tiff;
         delete[] data;
 
         return 0;
-    } // Thumbnail::readTiffImage
+    } // TiffThumbnail::read
 
-    int Thumbnail::write(const std::string& path) const
+    const char* TiffThumbnail::format() const
     {
-        std::string p;
-        switch (type_) {
-        case jpeg: 
-            p = path + ".jpg";
-            break;
-        case tiff:
-            p = path + ".tif";
-            break;
-        case none:
-            return 1;
-            break;
-        }
-        std::ofstream file(p.c_str(), std::ios::binary);
+        return "TIFF";
+    }
+
+    const char* TiffThumbnail::extension() const
+    {
+        return ".tif";
+    }
+
+    int TiffThumbnail::write(const std::string& path) const
+    {
+        std::string name = path + extension();
+        std::ofstream file(name.c_str(), std::ios::binary);
         if (!file) return 1;
-        file.write(image_, size_);
+        file.write(pImage_, size_);
         if (!file.good()) return 2;
         return 0;
-    } // Thumbnail::write
+    } // TiffThumbnail::write
 
-    void Thumbnail::update(ExifData& exifData) const
+    void TiffThumbnail::update(ExifData& exifData) const
     {
         // Todo: properly synchronize the Exif data with the actual thumbnail,
         //       i.e., synch all relevant metadata
 
-        switch (type_) {
-        case jpeg: 
-            updateJpegImage(exifData);
-            break;
-        case tiff:
-            updateTiffImage(exifData);
-            break;
-        case none:
-            /* do nothing */
-            break;
-        }
-
-    } // Thumbnail::update
-
-    void Thumbnail::updateJpegImage(ExifData& exifData) const
-    {
-        std::string key = "Thumbnail.RecordingOffset.JPEGInterchangeFormat";
-        ExifData::iterator pos = exifData.findKey(key);
-        if (pos == exifData.end()) {
-            Value *value = Value::create(unsignedLong);
-            exifData.add(key, value);
-            delete value;
-            pos = exifData.findKey(key);
-        }
-        pos->setValue("0");
-
-        key = "Thumbnail.RecordingOffset.JPEGInterchangeFormatLength";
-        pos = exifData.findKey(key);
-        if (pos == exifData.end()) {
-            Value *value = Value::create(unsignedLong);
-            exifData.add(key, value);
-            delete value;            
-            pos = exifData.findKey(key);
-        }
-        pos->setValue(toString(size_));
-
-    } // Thumbnail::updateJpegImage
-
-    void Thumbnail::updateTiffImage(ExifData& exifData) const
-    {
         // Create metadata from the StripOffsets and StripByteCounts entries
         // and update the Exif data accordingly
         Entries::const_iterator entry = ifd_.findTag(0x0111);
@@ -383,95 +303,27 @@ namespace Exif {
             md->setValue(*entry, tiffHeader_.byteOrder());
         }
 
-    } // Thumbnail::updateTiffImage
-
-    long Thumbnail::copy(char* buf) const
-    {
-        long ret = 0;
-        switch (type_) {
-        case jpeg: 
-            ret = copyJpegImage(buf);
-            break;
-        case tiff:
-            ret = copyTiffImage(buf);
-            break;
-        case none:
-            ret = 0;
-            break;
-        }
-        return ret;
-    }
-
-    long Thumbnail::copyJpegImage(char* buf) const
-    {
-        memcpy(buf, image_, size_);
-        return size_;
-    }
+    } // TiffThumbnail::update
 
-    long Thumbnail::copyTiffImage(char* buf) const
+    long TiffThumbnail::copy(char* buf) const
     {
         long offset = ifd_.offset() + ifd_.size() + ifd_.dataSize();
         long size = size_ - offset;
-        memcpy(buf, image_ + offset, size);
+        memcpy(buf, pImage_ + offset, size);
         return size;
     }
 
-    long Thumbnail::dataSize() const
+    long TiffThumbnail::dataSize() const
     {
-        long size = 0;
-        switch (type_) {
-        case jpeg: 
-            size = size_;
-            break;
-        case tiff: 
-            size = size_ - ifd_.offset() - ifd_.size() - ifd_.dataSize();
-            break;
-        case none: 
-            size = 0; 
-            break;
-        }
-        return size;
+        return size_ - ifd_.offset() - ifd_.size() - ifd_.dataSize();
     }
 
-    long Thumbnail::size() const
+    long TiffThumbnail::size() const
     {
-        long size = 0;
-        switch (type_) {
-        case jpeg: 
-            // fallthrough
-        case tiff: 
-            size = size_; 
-            break;
-        case none: 
-            size = 0; 
-            break;
-        }
-        return size;
-    }
-
-    void Thumbnail::setOffsets(Ifd& ifd1, ByteOrder byteOrder) const
-    {
-        switch (type_) {
-        case jpeg: 
-            setJpegImageOffsets(ifd1, byteOrder);
-            break;
-        case tiff:
-            setTiffImageOffsets(ifd1, byteOrder);
-            break;
-        case none:
-            /* do nothing */
-            break;
-        }        
-    }
-
-    void Thumbnail::setJpegImageOffsets(Ifd& ifd1, ByteOrder byteOrder) const
-    {
-        Ifd::iterator pos = ifd1.findTag(0x0201);
-        if (pos == ifd1.end()) throw Error("Bad thumbnail (0x0201)");
-        pos->setValue(ifd1.offset() + ifd1.size() + ifd1.dataSize(), byteOrder);
+        return size_;
     }
 
-    void Thumbnail::setTiffImageOffsets(Ifd& ifd1, ByteOrder byteOrder) const
+    void TiffThumbnail::setOffsets(Ifd& ifd1, ByteOrder byteOrder) const
     {
         // Adjust the StripOffsets, assuming that the existing TIFF strips
         // start immediately after the thumbnail IFD
@@ -491,27 +343,147 @@ namespace Exif {
         if (i != ifd1.end()) ifd1.erase(i);
         addToIfd(ifd1, offsets, byteOrder);
 
-    } // Thumbnail::setTiffImageOffsets
+    } // TiffThumbnail::setOffsets
+
+    JpegThumbnail::JpegThumbnail()
+        : size_(0), pImage_(0)
+    {
+    }
+
+    JpegThumbnail::~JpegThumbnail()
+    {
+        delete[] pImage_;
+    }
+
+    JpegThumbnail::JpegThumbnail(const JpegThumbnail& rhs)
+        : size_(rhs.size_), pImage_(0)
+    {
+        if (rhs.pImage_ && rhs.size_ > 0) {
+            pImage_ = new char[rhs.size_];
+            memcpy(pImage_, rhs.pImage_, rhs.size_);
+        }
+    }
+
+    JpegThumbnail& JpegThumbnail::operator=(const JpegThumbnail& rhs)
+    {
+        char* pNewImage = 0;
+        if (rhs.pImage_ && rhs.size_ > 0) {
+            pNewImage = new char[rhs.size_];
+            memcpy(pNewImage, rhs.pImage_, rhs.size_);
+        }
+        size_ = rhs.size_;
+        delete[] pImage_;
+        pImage_ = pNewImage;
+        return *this;
+    }
+
+    int JpegThumbnail::read(const char* buf, 
+                            const ExifData& exifData,
+                            ByteOrder byteOrder) 
+    {
+        std::string key = "Thumbnail.RecordingOffset.JPEGInterchangeFormat";
+        ExifData::const_iterator pos = exifData.findKey(key);
+        if (pos == exifData.end()) return 1;
+        long offset = pos->toLong();
+        key = "Thumbnail.RecordingOffset.JPEGInterchangeFormatLength";
+        pos = exifData.findKey(key);
+        if (pos == exifData.end()) return 1;
+        long size = pos->toLong();
+        delete[] pImage_;
+        pImage_ = new char[size];
+        memcpy(pImage_, buf + offset, size);
+        size_ = size;
+        return 0;
+    } // JpegThumbnail::read
+
+    const char* JpegThumbnail::format() const
+    {
+        return "JPEG";
+    }
+
+    const char* JpegThumbnail::extension() const
+    {
+        return ".jpg";
+    }
+
+    int JpegThumbnail::write(const std::string& path) const
+    {
+        std::string name = path + extension();
+        std::ofstream file(name.c_str(), std::ios::binary);
+        if (!file) return 1;
+        file.write(pImage_, size_);
+        if (!file.good()) return 2;
+        return 0;
+    } // JpegThumbnail::write
+
+    void JpegThumbnail::update(ExifData& exifData) const
+    {
+        std::string key = "Thumbnail.RecordingOffset.JPEGInterchangeFormat";
+        ExifData::iterator pos = exifData.findKey(key);
+        if (pos == exifData.end()) {
+            Value* value = Value::create(unsignedLong);
+            exifData.add(key, value);
+            delete value;
+            pos = exifData.findKey(key);
+        }
+        pos->setValue("0");
+
+        key = "Thumbnail.RecordingOffset.JPEGInterchangeFormatLength";
+        pos = exifData.findKey(key);
+        if (pos == exifData.end()) {
+            Value *value = Value::create(unsignedLong);
+            exifData.add(key, value);
+            delete value;            
+            pos = exifData.findKey(key);
+        }
+        pos->setValue(toString(size_));
+
+    } // JpegThumbnail::update
+
+    long JpegThumbnail::copy(char* buf) const
+    {
+        memcpy(buf, pImage_, size_);
+        return size_;
+    }
+
+    long JpegThumbnail::dataSize() const
+    {
+        return size_;
+    }
+
+    long JpegThumbnail::size() const
+    {
+        return size_;
+    }
+
+    void JpegThumbnail::setOffsets(Ifd& ifd1, ByteOrder byteOrder) const
+    {
+        Ifd::iterator pos = ifd1.findTag(0x0201);
+        if (pos == ifd1.end()) throw Error("Bad thumbnail (0x0201)");
+        pos->setValue(ifd1.offset() + ifd1.size() + ifd1.dataSize(), byteOrder);
+    }
 
     ExifData::ExifData() 
-        : makerNote_(0), ifd0_(ifd0, 0, false), exifIfd_(exifIfd, 0, false), 
-          iopIfd_(iopIfd, 0, false), gpsIfd_(gpsIfd, 0, false),
-          ifd1_(ifd1, 0, false), valid_(false), size_(0), data_(0)
+        : pThumbnail_(0), pMakerNote_(0), ifd0_(ifd0, 0, false), 
+          exifIfd_(exifIfd, 0, false), iopIfd_(iopIfd, 0, false), 
+          gpsIfd_(gpsIfd, 0, false), ifd1_(ifd1, 0, false), 
+          size_(0), data_(0)
     {
     }
 
     ExifData::~ExifData()
     {
-        delete makerNote_;
+        delete pMakerNote_;
+        delete pThumbnail_;
         delete[] data_;
     }
 
     int ExifData::read(const std::string& path)
     {
-        JpegImage img;
-        int rc = img.readExifData(path);
+        JpegImage image;
+        int rc = image.readExifData(path);
         if (rc) return rc;
-        return read(img.exifData(), img.sizeExifData());
+        return read(image.exifData(), image.sizeExifData());
     }
 
     int ExifData::read(const char* buf, long len)
@@ -521,7 +493,6 @@ namespace Exif {
         data_ = new char[len];
         memcpy(data_, buf, len);
         size_ = len;
-        valid_ = true;
 
         // Read the TIFF header
         int ret = 0;
@@ -543,22 +514,22 @@ namespace Exif {
         if (pos != exifIfd_.end() && make != ifd0_.end() && model != ifd0_.end()) {
             MakerNoteFactory& mnf = MakerNoteFactory::instance();
             // Todo: The conversion to string assumes that there is a 

-- 
exiv2 packaging



More information about the pkg-kde-commits mailing list