[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