[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:07 UTC 2017
Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/exiv2.git;a=commitdiff;h=1daee4d
The following commit has been merged in the master branch:
commit 1daee4d7aedface3952c1f5a19cba542274f7e91
Author: Andreas Huggel <ahuggel at gmx.net>
Date: Sun Mar 7 08:47:20 2004 +0000
Changes for makernote write support, documentation updates
---
src/exif.cpp | 168 ++++++++++++++++++++-----------
src/exif.hpp | 317 ++++++++++++++++++++++++++++++++++++++++-------------------
2 files changed, 327 insertions(+), 158 deletions(-)
diff --git a/src/exif.cpp b/src/exif.cpp
index 924c227..55fc87f 100644
--- a/src/exif.cpp
+++ b/src/exif.cpp
@@ -20,14 +20,14 @@
*/
/*
File: exif.cpp
- Version: $Name: $ $Revision: 1.22 $
+ Version: $Name: $ $Revision: 1.23 $
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.22 $ $RCSfile: exif.cpp,v $")
+EXIV2_RCSID("@(#) $Name: $ $Revision: 1.23 $ $RCSfile: exif.cpp,v $")
// *****************************************************************************
// included header files
@@ -60,6 +60,7 @@ namespace {
entry of type unsigned long with one component is created.
*/
void setOffsetTag(Exif::Ifd& ifd,
+ int idx,
Exif::uint16 tag,
Exif::uint32 offset,
Exif::ByteOrder byteOrder);
@@ -71,8 +72,8 @@ namespace {
namespace Exif {
Metadatum::Metadatum(const Entry& e, ByteOrder byteOrder)
- : tag_(e.tag()), ifdId_(e.ifdId()), makerNote_(e.makerNote()),
- value_(0), key_(makeKey(e))
+ : tag_(e.tag()), ifdId_(e.ifdId()), idx_(e.idx()),
+ makerNote_(e.makerNote()), value_(0), key_(makeKey(e))
{
value_ = Value::create(TypeId(e.type()));
value_->read(e.data(), e.count() * e.typeSize(), byteOrder);
@@ -81,7 +82,7 @@ namespace Exif {
Metadatum::Metadatum(const std::string& key,
const Value* value,
MakerNote* makerNote)
- : makerNote_(makerNote), value_(0), key_(key)
+ : idx_(0), makerNote_(makerNote), value_(0), key_(key)
{
if (value) value_ = value->clone();
std::pair<uint16, IfdId> p = decomposeKey(key, makerNote);
@@ -98,8 +99,8 @@ namespace Exif {
}
Metadatum::Metadatum(const Metadatum& rhs)
- : tag_(rhs.tag_), ifdId_(rhs.ifdId_), makerNote_(rhs.makerNote_),
- value_(0), key_(rhs.key_)
+ : tag_(rhs.tag_), ifdId_(rhs.ifdId_), idx_(rhs.idx_),
+ makerNote_(rhs.makerNote_), value_(0), key_(rhs.key_)
{
if (rhs.value_ != 0) value_ = rhs.value_->clone(); // deep copy
}
@@ -109,6 +110,7 @@ namespace Exif {
if (this == &rhs) return *this;
tag_ = rhs.tag_;
ifdId_ = rhs.ifdId_;
+ idx_ = rhs.idx_;
makerNote_ = rhs.makerNote_;
delete value_;
value_ = 0;
@@ -498,18 +500,6 @@ namespace Exif {
// Find and read ExifIFD sub-IFD of IFD0
rc = ifd0_.readSubIfd(exifIfd_, data_, byteOrder(), 0x8769);
if (rc) return rc;
- // Find and read Interoperability IFD in ExifIFD
- rc = exifIfd_.readSubIfd(iopIfd_, data_, byteOrder(), 0xa005);
- if (rc) return rc;
- // Find and read GPSInfo sub-IFD in IFD0
- rc = ifd0_.readSubIfd(gpsIfd_, data_, byteOrder(), 0x8825);
- if (rc) return rc;
- // Read IFD1
- if (ifd0_.next()) {
- rc = ifd1_.read(data_ + ifd0_.next(), byteOrder(), ifd0_.next());
- if (rc) return rc;
- }
-
// Find MakerNote in ExifIFD, create a MakerNote class
Ifd::iterator pos = exifIfd_.findTag(0x927c);
Ifd::iterator make = ifd0_.findTag(0x010f);
@@ -535,7 +525,17 @@ namespace Exif {
if (makerNote_) {
exifIfd_.erase(pos);
}
-
+ // Find and read Interoperability IFD in ExifIFD
+ rc = exifIfd_.readSubIfd(iopIfd_, data_, byteOrder(), 0xa005);
+ if (rc) return rc;
+ // Find and read GPSInfo sub-IFD in IFD0
+ rc = ifd0_.readSubIfd(gpsIfd_, data_, byteOrder(), 0x8825);
+ if (rc) return rc;
+ // Read IFD1
+ if (ifd0_.next()) {
+ rc = ifd1_.read(data_ + ifd0_.next(), byteOrder(), ifd0_.next());
+ if (rc) return rc;
+ }
// Find and delete ExifIFD sub-IFD of IFD1
pos = ifd1_.findTag(0x8769);
if (pos != ifd1_.end()) {
@@ -586,7 +586,7 @@ namespace Exif {
// If we can update the internal IFDs and the underlying data buffer
// from the metadata without changing the data size, then it is enough
// to copy the data buffer.
- if (updateIfds()) {
+ if (updateEntries()) {
//ahu Todo: remove debugging output
std::cout << "->>>>>> using non-intrusive writing <<<<<<-
";
@@ -618,11 +618,24 @@ std::cout << "->>>>>> writing from metadata <<<<<<-
";
long exifIfdOffset = ifd0Offset + ifd0.size() + ifd0.dataSize();
Ifd exifIfd(exifIfd, exifIfdOffset);
addToIfd(exifIfd, begin(), end(), byteOrder());
+ if (makerNote_) {
+ // Create a placeholder MakerNote entry of the correct size and
+ // add it to the Exif IFD
+ Entry e;
+ e.setIfdId(makerIfd);
+ e.setTag(0x927c);
+ long size = makerNote_->size();
+ char* buf = new char[size];
+ memset(buf, 0x0, size);
+ e.setValue(undefined, size, buf, size);
+ exifIfd.add(e);
+ delete[] buf;
+ }
// Set the offset to the Exif IFD in IFD0
- ifd0.erase(0x8769);
+ int idx = ifd0.erase(0x8769);
if (exifIfd.size() > 0) {
- setOffsetTag(ifd0, 0x8769, exifIfdOffset, byteOrder());
+ setOffsetTag(ifd0, idx, 0x8769, exifIfdOffset, byteOrder());
}
// Build Interoperability IFD from metadata
@@ -631,9 +644,9 @@ std::cout << "->>>>>> writing from metadata <<<<<<-
";
addToIfd(iopIfd, begin(), end(), byteOrder());
// Set the offset to the Interoperability IFD in Exif IFD
- exifIfd.erase(0xa005);
+ idx = exifIfd.erase(0xa005);
if (iopIfd.size() > 0) {
- setOffsetTag(exifIfd, 0xa005, iopIfdOffset, byteOrder());
+ setOffsetTag(exifIfd, idx, 0xa005, iopIfdOffset, byteOrder());
}
// Build GPSInfo IFD from metadata
@@ -642,9 +655,9 @@ std::cout << "->>>>>> writing from metadata <<<<<<-
";
addToIfd(gpsIfd, begin(), end(), byteOrder());
// Set the offset to the GPSInfo IFD in IFD0
- ifd0.erase(0x8825);
+ idx = ifd0.erase(0x8825);
if (gpsIfd.size() > 0) {
- setOffsetTag(ifd0, 0x8825, gpsIfdOffset, byteOrder());
+ setOffsetTag(ifd0, idx, 0x8825, gpsIfdOffset, byteOrder());
}
// Update Exif data from thumbnail, build IFD1 from updated metadata
@@ -660,11 +673,18 @@ std::cout << "->>>>>> writing from metadata <<<<<<-
";
ifd0.setNext(ifd1Offset);
}
- // Copy all IFDs and the thumbnail image to the data buffer
+ // Copy all IFDs, the MakerNote data and the thumbnail to the data buffer
ifd0.sortByTag();
ifd0.copy(buf + ifd0Offset, byteOrder(), ifd0Offset);
exifIfd.sortByTag();
exifIfd.copy(buf + exifIfdOffset, byteOrder(), exifIfdOffset);
+ if (makerNote_) {
+ // Copy the MakerNote over the placeholder data
+ Entries::iterator mn = exifIfd.findTag(0x927c);
+ makerNote_->copy(buf + exifIfdOffset + mn->offset(),
+ byteOrder(),
+ exifIfdOffset + mn->offset());
+ }
iopIfd.sortByTag();
iopIfd.copy(buf + iopIfdOffset, byteOrder(), iopIfdOffset);
gpsIfd.sortByTag();
@@ -737,6 +757,18 @@ std::cout << "->>>>>> writing from metadata <<<<<<-
";
FindMetadatumByKey(key));
}
+ ExifData::const_iterator ExifData::findIfdIdIdx(IfdId ifdId, int idx) const
+ {
+ return std::find_if(metadata_.begin(), metadata_.end(),
+ FindMetadatumByIfdIdIdx(ifdId, idx));
+ }
+
+ ExifData::iterator ExifData::findIfdIdIdx(IfdId ifdId, int idx)
+ {
+ return std::find_if(metadata_.begin(), metadata_.end(),
+ FindMetadatumByIfdIdIdx(ifdId, idx));
+ }
+
void ExifData::sortByKey()
{
std::sort(metadata_.begin(), metadata_.end(), cmpMetadataByKey);
@@ -752,30 +784,30 @@ std::cout << "->>>>>> writing from metadata <<<<<<-
";
metadata_.erase(pos);
}
- bool ExifData::updateIfds()
+ bool ExifData::updateEntries()
{
if (!this->compatible()) return false;
bool compatible = true;
- compatible |= updateIfd(ifd0_);
- compatible |= updateIfd(exifIfd_);
- compatible |= updateIfd(iopIfd_);
- compatible |= updateIfd(gpsIfd_);
- compatible |= updateIfd(ifd1_);
+ compatible |= updateRange(ifd0_.begin(), ifd0_.end());
+ compatible |= updateRange(exifIfd_.begin(), exifIfd_.end());
+ if (makerNote_) {
+ compatible |= updateRange(makerNote_->begin(), makerNote_->end());
+ }
+ compatible |= updateRange(iopIfd_.begin(), iopIfd_.end());
+ compatible |= updateRange(gpsIfd_.begin(), gpsIfd_.end());
+ compatible |= updateRange(ifd1_.begin(), ifd1_.end());
return compatible;
- } // ExifData::updateIfds
+ } // ExifData::updateEntries
- bool ExifData::updateIfd(Ifd& ifd)
+ bool ExifData::updateRange(const Entries::iterator& begin,
+ const Entries::iterator& end)
{
- if (ifd.alloc()) throw Error("Invariant violated in ExifData::updateIfd");
-
bool compatible = true;
- Ifd::iterator end = ifd.end();
- for (Ifd::iterator entry = ifd.begin(); entry != end; ++entry) {
+ for (Entries::iterator entry = begin; entry != end; ++entry) {
// find the corresponding metadatum
- std::string key = makeKey(*entry);
- const_iterator md = findKey(key);
+ const_iterator md = findIfdIdIdx(entry->ifdId(), entry->idx());
if (md == this->end()) {
// corresponding metadatum was deleted: this is not (yet) a
// supported non-intrusive write operation.
@@ -796,31 +828,54 @@ std::cout << "->>>>>> writing from metadata <<<<<<-
";
}
}
return compatible;
- } // ExifData::updateIfd
+ } // ExifData::updateRange
bool ExifData::compatible() const
{
bool compatible = true;
- const_iterator end = this->end();
- for (const_iterator md = begin(); md != end; ++md) {
- // Check if the metadatum is compatible with the
- // corresponding IFD entry
- const Ifd* ifd = getIfd(md->ifdId());
- if (!ifd) {
- compatible = false;
- break;
- }
- Ifd::const_iterator entry = ifd->findTag(md->tag());
- if (entry == ifd->end()) {
+ // For each metadatum, check if it is compatible with the corresponding
+ // IFD or MakerNote entry
+ for (const_iterator md = begin(); md != this->end(); ++md) {
+ std::pair<bool, Entries::const_iterator> rc;
+ rc = findEntry(md->ifdId(), md->idx());
+ // Make sure that we have an entry
+ if (!rc.first) {
compatible = false;
break;
}
- if (md->size() > entry->size()) {
+ // Make sure that the size of the metadatum fits the available size
+ // of the entry
+ if (md->size() > rc.second->size()) {
compatible = false;
break;
}
}
return compatible;
+ } // ExifData::compatible
+
+ std::pair<bool, Entries::const_iterator>
+ ExifData::findEntry(IfdId ifdId, int idx) const
+ {
+ Entries::const_iterator entry;
+ std::pair<bool, Entries::const_iterator> rc(false, entry);
+
+ if (ifdId == makerIfd && makerNote_) {
+ entry = makerNote_->findIdx(idx);
+ if (entry != makerNote_->end()) {
+ rc.first = true;
+ rc.second = entry;
+ }
+ return rc;
+ }
+ const Ifd* ifd = getIfd(ifdId);
+ if (ifdId != makerIfd && ifd) {
+ entry = ifd->findIdx(idx);
+ if (entry != ifd->end()) {
+ rc.first = true;
+ rc.second = entry;
+ }
+ }
+ return rc;
}
const Ifd* ExifData::getIfd(IfdId ifdId) const
@@ -872,6 +927,7 @@ std::cout << "->>>>>> writing from metadata <<<<<<-
";
Entry e(ifd.alloc());
e.setIfdId(metadatum.ifdId());
+ e.setIdx(metadatum.idx());
e.setTag(metadatum.tag());
e.setOffset(0); // will be calculated when the IFD is written
char* buf = new char[metadatum.size()];
@@ -924,6 +980,7 @@ std::cout << "->>>>>> writing from metadata <<<<<<-
";
namespace {
void setOffsetTag(Exif::Ifd& ifd,
+ int idx,
Exif::uint16 tag,
Exif::uint32 offset,
Exif::ByteOrder byteOrder)
@@ -932,6 +989,7 @@ namespace {
if (pos == ifd.end()) {
Exif::Entry e(ifd.alloc());
e.setIfdId(ifd.ifdId());
+ e.setIdx(idx);
e.setTag(tag);
e.setOffset(0); // will be calculated when the IFD is written
ifd.add(e);
diff --git a/src/exif.hpp b/src/exif.hpp
index 98c945d..e7f1af4 100644
--- a/src/exif.hpp
+++ b/src/exif.hpp
@@ -21,7 +21,7 @@
/*!
@file exif.hpp
@brief Encoding and decoding of %Exif data
- @version $Name: $ $Revision: 1.24 $
+ @version $Name: $ $Revision: 1.25 $
@author Andreas Huggel (ahu)
<a href="mailto:ahuggel at gmx.net">ahuggel at gmx.net</a>
@date 09-Jan-04, ahu: created
@@ -61,16 +61,14 @@ namespace Exif {
*/
class Metadatum {
public:
+ //! @name Creators
+ //@{
/*!
- @brief Constructor to build a metadatum from an IFD entry.
- */
- Metadatum(const Entry& e, ByteOrder byteOrder);
- /*!
- @brief Constructor for new tags created by an application, which only
- needs to provide a key / value pair. %Metadatum copies (clones)
- the value if one is provided. Alternatively, a program can
- create an 'empty' metadatum with only a key and set the value
- later, using setValue().
+ @brief Constructor for new tags created by an application. The
+ metadatum is created from a key / value pair. %Metadatum copies
+ (clones) the value if one is provided. Alternatively, a program
+ can create an 'empty' metadatum with only a key and set the
+ value using setValue().
@param key The key of the metadatum.
@param value Pointer to a metadatum value.
@@ -82,10 +80,16 @@ namespace Exif {
explicit Metadatum(const std::string& key,
const Value* value =0,
MakerNote* makerNote =0);
- //! Destructor
- ~Metadatum();
+ //! Constructor to build a metadatum from an IFD entry.
+ Metadatum(const Entry& e, ByteOrder byteOrder);
//! Copy constructor
Metadatum(const Metadatum& rhs);
+ //! Destructor
+ ~Metadatum();
+ //@}
+
+ //! @name Manipulators
+ //@{
//! Assignment operator
Metadatum& operator=(const Metadatum& rhs);
/*!
@@ -98,6 +102,10 @@ namespace Exif {
not have a value yet, then an AsciiValue is created.
*/
void setValue(const std::string& buf);
+ //@}
+
+ //! @name Accessors
+ //@{
/*!
@brief Write value to a character data buffer and return the number
of characters (bytes) written.
@@ -111,22 +119,21 @@ namespace Exif {
*/
long copy(char* buf, ByteOrder byteOrder) const
{ return value_ == 0 ? 0 : value_->copy(buf, byteOrder); }
- //! @name Accessors
- //@{
/*!
- @brief Return a key for the tag. The key is of the form
- 'ifdItem.sectionName.tagName'.
+ @brief Return the key of the metadatum. The key is of the form
+ 'ifdItem.sectionName.tagName'. Note however that the key
+ is not necessarily unique.
*/
std::string key() const { return key_; }
- //! Return the related image item
+ //! Return the related image item (the first part of the key)
const char* ifdItem() const { return ExifTags::ifdItem(ifdId_); }
- //! Return the name of the section
+ //! Return the name of the section (the second part of the key)
std::string sectionName() const;
- //! Return the name of the tag
+ //! Return the name of the tag (which is also the third part of the key)
std::string tagName() const;
//! Return the tag
uint16 tag() const { return tag_; }
- //! Return the type id.
+ //! Return the type id of the value
TypeId typeId() const { return value_ == 0 ? invalid : value_->typeId(); }
//! Return the name of the type
const char* typeName() const { return TypeInfo::typeName(typeId()); }
@@ -140,6 +147,8 @@ namespace Exif {
IfdId ifdId() const { return ifdId_; }
//! Return the name of the IFD
const char* ifdName() const { return ExifTags::ifdName(ifdId_); }
+ //! Return the index (unique id of this metadatum within the original IFD)
+ int idx() const { return idx_; }
//! Return the pointer to the associated MakerNote
MakerNote* makerNote() const { return makerNote_; }
//! Return the value as a string.
@@ -208,6 +217,7 @@ namespace Exif {
private:
uint16 tag_; //!< Tag value
IfdId ifdId_; //!< The IFD associated with this tag
+ int idx_; //!< Unique id of an entry within one IFD
MakerNote* makerNote_; //!< Pointer to the associated MakerNote
Value* value_; //!< Pointer to the value
std::string key_; //!< Key
@@ -220,39 +230,26 @@ namespace Exif {
*/
std::ostream& operator<<(std::ostream& os, const Metadatum& md);
- //! Container type to hold all metadata
- typedef std::vector<Metadatum> Metadata;
-
- //! Unary predicate that matches a Metadatum with a given key
- class FindMetadatumByKey {
- public:
- //! Constructor, initializes the object with the tag to look for
- FindMetadatumByKey(const std::string& key) : key_(key) {}
- /*!
- @brief Returns true if the key of the argument metadatum is equal
- to that of the object.
- */
- bool operator()(const Metadatum& metadatum) const
- { return key_ == metadatum.key(); }
-
- private:
- std::string key_;
-
- }; // class FindMetadatumByTag
-
//! %Thumbnail data Todo: add, create, rotate, delete
class Thumbnail {
public:
+ //! %Thumbnail image types
+ enum Type { none, jpeg, tiff };
+
+ //! @name Creators
+ //@{
//! Default constructor
Thumbnail();
//! Destructor
~Thumbnail();
//! Copy constructor
Thumbnail(const Thumbnail& rhs);
+ //@}
+
+ //! @name Manipulators
+ //@{
//! Assignment operator
Thumbnail& operator=(const Thumbnail& rhs);
- //! %Thumbnail image types
- enum Type { none, jpeg, tiff };
/*!
@brief Read the thumbnail from the data buffer buf, using %Exif
metadata exifData. Return 0 if successful.
@@ -272,6 +269,10 @@ namespace Exif {
int read(const char* buf,
const ExifData& exifData,
ByteOrder byteOrder =littleEndian);
+ //@}
+
+ //! @name Accessors
+ //@{
/*!
@brief Write thumbnail to file path, return 0 if successful, -1 if
there is no thumbnail image to write.
@@ -312,15 +313,21 @@ namespace Exif {
long size() const;
//! Return the type of the thumbnail
Type type() const { return type_; }
+ //@}
private:
-
+ //! @name Manipulators
+ //@{
//! Read a compressed (JPEG) thumbnail image from the data buffer
int readJpegImage(const char* buf, const ExifData& exifData);
//! Read an uncompressed (TIFF) thumbnail image from the data buffer
int readTiffImage(const char* buf,
const ExifData& exifData,
ByteOrder byteOrder);
+ //@}
+
+ //! @name Accessors
+ //@{
//! Update the Exif data according to the actual JPEG thumbnail image
void updateJpegImage(ExifData& exifData) const;
//! Update the Exif data according to the actual TIFF thumbnail image
@@ -333,15 +340,56 @@ namespace Exif {
void setJpegImageOffsets(Ifd& ifd1, ByteOrder byteOrder) const;
//! Update the offsets to the TIFF thumbnail image in the IFD
void setTiffImageOffsets(Ifd& ifd1, ByteOrder byteOrder) const;
+ //@}
+ // DATA
Type type_; // Type of thumbnail image
long size_; // Size of the image data
char* image_; // Thumbnail image data
TiffHeader tiffHeader_; // Thumbnail TIFF Header, only for TIFF thumbs
Ifd ifd_; // Thumbnail IFD, only for TIFF thumbnails
-
+
}; // class Thumbnail
+ //! Container type to hold all metadata
+ typedef std::vector<Metadatum> Metadata;
+
+ //! Unary predicate that matches a Metadatum with a given key
+ class FindMetadatumByKey {
+ public:
+ //! Constructor, initializes the object with the tag to look for
+ FindMetadatumByKey(const std::string& key) : key_(key) {}
+ /*!
+ @brief Returns true if the key of the argument metadatum is equal
+ to that of the object.
+ */
+ bool operator()(const Metadatum& metadatum) const
+ { return key_ == metadatum.key(); }
+
+ private:
+ std::string key_;
+
+ }; // class FindMetadatumByTag
+
+ //! Unary predicate that matches a Metadatum with a given ifd id and idx
+ class FindMetadatumByIfdIdIdx {
+ public:
+ //! Constructor, initializes the object with the ifd id and idx to look for
+ FindMetadatumByIfdIdIdx(IfdId ifdId, int idx)
+ : ifdId_(ifdId), idx_(idx) {}
+ /*!
+ @brief Returns true if the ifd id and idx of the argument metadatum
+ is equal to that of the object.
+ */
+ bool operator()(const Metadatum& metadatum) const
+ { return ifdId_ == metadatum.ifdId() && idx_ == metadatum.idx(); }
+
+ private:
+ IfdId ifdId_;
+ int idx_;
+
+ }; // class FindMetadatumByIfdIdIdx
+
/*!
@brief A container for %Exif data. This is the top-level class of
the Exiv2 library.
@@ -355,15 +403,29 @@ namespace Exif {
- extract and delete %Exif thumbnail (JPEG and TIFF thumbnails)
*/
class ExifData {
- // Copying not allowed (Todo: implement me!)
+ //! @name Not implemented
+ //@{
+ //! Copying not allowed (Todo: implement me!)
ExifData(const ExifData& rhs);
- // Assignment not allowed (Todo: implement me!)
+ //! Assignment not allowed (Todo: implement me!)
ExifData& operator=(const ExifData& rhs);
+ //@}
public:
+ //! Metadata iterator type
+ typedef Metadata::iterator iterator;
+ //! Metadata const iterator type
+ typedef Metadata::const_iterator const_iterator;
+
+ //! @name Creators
+ //@{
//! Default constructor
ExifData();
//! Destructor
~ExifData();
+ //@}
+
+ //! @name Manipulators
+ //@{
/*!
@brief Read the %Exif data from file path.
@param path Path to the file
@@ -436,25 +498,12 @@ namespace Exif {
multiple metadata with the same key.
*/
void add(const Metadatum& metadatum);
-
- /*!
- @brief Return the approximate size of all %Exif data (TIFF header plus
- metadata). The number returned may be bigger than the actual
- size of the %Exif data, but it is never smaller. Only copy()
- returns the exact size.
- */
- long size() const;
- //! Returns the byte order as specified in the TIFF header
- ByteOrder byteOrder() const { return tiffHeader_.byteOrder(); }
-
- //! Metadata iterator type
- typedef Metadata::iterator iterator;
- //! Metadata const iterator type
- typedef Metadata::const_iterator const_iterator;
- //! Begin of the metadata
- const_iterator begin() const { return metadata_.begin(); }
- //! End of the metadata
- const_iterator end() const { return metadata_.end(); }
+ //! Delete the metadatum at iterator position pos
+ void erase(iterator pos);
+ //! Sort metadata by key
+ void sortByKey();
+ //! Sort metadata by tag
+ void sortByTag();
//! Begin of the metadata
iterator begin() { return metadata_.begin(); }
//! End of the metadata
@@ -466,18 +515,56 @@ namespace Exif {
*/
iterator findKey(const std::string& key);
/*!
+ @brief Find the metadatum with the given ifd id and idx, return an
+ iterator to it.
+
+ This method can be used to uniquely identify a metadatum that was
+ created from an IFD or from the makernote (with idx greater than
+ 0). Metadata created by an application (not read from an IFD or a
+ makernote) all have their idx field set to 0, i.e., they cannot be
+ uniquely identified with this method. If multiple metadata with the
+ same key exist, it is undefined which of the matching metadata is
+ found.
+ */
+ iterator findIfdIdIdx(IfdId ifdId, int idx);
+ //@}
+
+ //! @name Accessors
+ //@{
+ //! Begin of the metadata
+ const_iterator begin() const { return metadata_.begin(); }
+ //! End of the metadata
+ const_iterator end() const { return metadata_.end(); }
+ /*!
@brief Find a metadatum with the given key, return a const iterator to
it. If multiple metadata with the same key exist, it is
undefined which of the matching metadata is found.
*/
const_iterator findKey(const std::string& key) const;
- //! Sort metadata by key
- void sortByKey();
- //! Sort metadata by tag
- void sortByTag();
- //! Delete the metadatum at iterator position pos
- void erase(iterator pos);
-
+ /*!
+ @brief Find the metadatum with the given ifd id and idx, return an
+ iterator to it.
+
+ This method can be used to uniquely identify a metadatum that was
+ created from an IFD or from the makernote (with idx greater than
+ 0). Metadata created by an application (not read from an IFD or a
+ makernote) all have their idx field set to 0, i.e., they cannot be
+ uniquely identified with this method. If multiple metadata with the
+ same key exist, it is undefined which of the matching metadata is
+ found.
+ */
+ const_iterator findIfdIdIdx(IfdId ifdId, int idx) const;
+ //! Get the number of metadata entries
+ long count() const { return metadata_.size(); }
+ /*!
+ @brief Return the approximate size of all %Exif data (TIFF header plus
+ metadata). The number returned may be bigger than the actual
+ size of the %Exif data, but it is never smaller. Only copy()
+ returns the exact size.
+ */
+ long size() const;
+ //! Returns the byte order as specified in the TIFF header
+ ByteOrder byteOrder() const { return tiffHeader_.byteOrder(); }
/*!
@brief Write the thumbnail image to a file. The filename extension
will be set according to the image type of the thumbnail, so
@@ -489,44 +576,68 @@ namespace Exif {
Thumbnail::Type thumbnailType() const { return thumbnail_.type(); }
//! Return the size of the thumbnail data
long thumbnailSize() const { return thumbnail_.size(); }
+ //@}
private:
- // Return a pointer to the internal IFD identified by its IFD id
- const Ifd* getIfd(IfdId ifdId) const;
- /*
- Check if the metadata changed and update the internal IFDs if the
- changes are compatible with the existing data (non-intrusive write
- support). Return true if only compatible changes were detected in the
- metadata and the internal IFDs (i.e., data buffer) were updated
- successfully. Return false, if non-intrusive writing is not
- possible. The internal IFDs and the data buffer may or may not be
- modified in this case.
- */
- bool updateIfds();
- /*
- Update the metadata of one IFD. Called by updateIfds() for each
- of the internal IFDs.
- */
- bool updateIfd(Ifd& ifd);
- /*
- Check if the metadata is compatible with the internal IFDs for
- non-intrusive writing. Return true if compatible, false if not.
-
- Note: This function does not detect deleted metadata as incompatible,
- although the deletion of metadata is not (yet) a supported
- non-intrusive write operation.
+ //! @name Accessors
+ //@{
+ /*!
+ @brief Check if the metadata is compatible with the internal IFDs for
+ non-intrusive writing. Return true if compatible, false if not.
+
+ @note This function does not detect deleted metadata as incompatible,
+ although the deletion of metadata is not (yet) a supported
+ non-intrusive write operation.
*/
bool compatible() const;
- /*
- Write Exif data to a data buffer the hard way, return number of bytes
- written. Rebuilds the Exif data from scratch, using the TIFF header,
- metadata container and thumbnail. In particular, the internal IFDs and
- the original data buffer are not used. Furthermore, this method
- updates the Exif data with the metadata from the actual thumbnail
- image (overriding existing metadata).
+ /*!
+ @brief Find the IFD or makernote entry corresponding to ifd id and idx.
+
+ @return A pair of which the first part determines if a match was found
+ and, if true, the second contains an iterator to the entry.
+ */
+ std::pair<bool, Entries::const_iterator>
+ findEntry(IfdId ifdId, int idx) const;
+ //! Return a pointer to the internal IFD identified by its IFD id
+ const Ifd* getIfd(IfdId ifdId) const;
+ //@}
+
+ //! @name Manipulators
+ //@{
+ /*!
+ @brief Check if the metadata changed and update the internal IFDs and
+ the MakerNote if the changes are compatible with the existing
+ data (non-intrusive write support).
+
+ @return True if only compatible changes were detected in the metadata
+ and the internal IFDs and MakerNote (and thus the data buffer)
+ were updated successfully. Return false, if non-intrusive
+ writing is not possible. The internal IFDs and the MakerNote
+ (and thus the data buffer) may or may not be modified in this
+ case.
+ */
+ bool updateEntries();
+ /*!
+ @brief Update the metadata for a range of entries. Called by
+ updateEntries() for each of the internal IFDs and the MakerNote
+ (if any).
+ */
+ bool updateRange(const Entries::iterator& begin,
+ const Entries::iterator& end);
+ /*!
+ @brief Write Exif data to a data buffer the hard way, return number of
+ bytes written.
+
+ Rebuilds the Exif data from scratch, using the TIFF header, metadata
+ container and thumbnail. In particular, the internal IFDs and the
+ original data buffer are not used. Furthermore, this method updates
+ the Exif data with the metadata from the actual thumbnail image
+ (overriding existing metadata).
*/
long copyFromMetadata(char* buf);
+ //@}
+ // DATA
TiffHeader tiffHeader_;
Metadata metadata_;
Thumbnail thumbnail_;
--
exiv2 packaging
More information about the pkg-kde-commits
mailing list