const ref to ref conversions

main
Rosen Penev 2 years ago
parent 64bb7820a0
commit 2526dcf5a1

@ -89,8 +89,8 @@ class EXIV2API Cr2Parser {
@brief Encode metadata from the provided metadata to CR2 format. @brief Encode metadata from the provided metadata to CR2 format.
See TiffParser::encode(). See TiffParser::encode().
*/ */
static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, const ExifData& exifData, static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData,
const IptcData& iptcData, const XmpData& xmpData); IptcData& iptcData, XmpData& xmpData);
}; // class Cr2Parser }; // class Cr2Parser

@ -530,7 +530,7 @@ class EXIV2API ExifParser {
@return Write method used. @return Write method used.
*/ */
static WriteMethod encode(Blob& blob, const byte* pData, size_t size, ByteOrder byteOrder, const ExifData& exifData); static WriteMethod encode(Blob& blob, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData);
/*! /*!
@brief Encode metadata from the provided metadata to Exif format. @brief Encode metadata from the provided metadata to Exif format.
@ -551,7 +551,7 @@ class EXIV2API ExifParser {
@param byteOrder Byte order to use. @param byteOrder Byte order to use.
@param exifData Exif metadata container. @param exifData Exif metadata container.
*/ */
static void encode(Blob& blob, ByteOrder byteOrder, const ExifData& exifData) { static void encode(Blob& blob, ByteOrder byteOrder, ExifData& exifData) {
encode(blob, nullptr, 0, byteOrder, exifData); encode(blob, nullptr, 0, byteOrder, exifData);
} }

@ -78,8 +78,8 @@ class EXIV2API OrfParser {
@brief Encode metadata from the provided metadata to ORF format. @brief Encode metadata from the provided metadata to ORF format.
See TiffParser::encode(). See TiffParser::encode().
*/ */
static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, const ExifData& exifData, static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData,
const IptcData& iptcData, const XmpData& xmpData); IptcData& iptcData, XmpData& xmpData);
}; // class OrfParser }; // class OrfParser
// ***************************************************************************** // *****************************************************************************

@ -75,7 +75,7 @@ class EXIV2API PsdImage : public Image {
*/ */
void doWriteMetadata(BasicIo& outIo); void doWriteMetadata(BasicIo& outIo);
uint32_t writeExifData(const ExifData& exifData, BasicIo& out); uint32_t writeExifData(ExifData& exifData, BasicIo& out);
//@} //@}
//! @name Accessors //! @name Accessors

@ -137,8 +137,8 @@ class EXIV2API TiffParser {
@return Write method used. @return Write method used.
*/ */
static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, const ExifData& exifData, static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData,
const IptcData& iptcData, const XmpData& xmpData); IptcData& iptcData, XmpData& xmpData);
}; // class TiffParser }; // class TiffParser

@ -103,11 +103,8 @@ ByteOrder Cr2Parser::decode(ExifData& exifData, IptcData& iptcData, XmpData& xmp
Internal::TiffMapping::findDecoder, &cr2Header); Internal::TiffMapping::findDecoder, &cr2Header);
} }
WriteMethod Cr2Parser::encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, WriteMethod Cr2Parser::encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData,
const ExifData& exifData, const IptcData& iptcData, const XmpData& xmpData) { IptcData& iptcData, XmpData& xmpData) {
// Copy to be able to modify the Exif data
ExifData ed = exifData;
// Delete IFDs which do not occur in TIFF images // Delete IFDs which do not occur in TIFF images
static constexpr auto filteredIfds = std::array{ static constexpr auto filteredIfds = std::array{
IfdId::panaRawId, IfdId::panaRawId,
@ -116,13 +113,14 @@ WriteMethod Cr2Parser::encode(BasicIo& io, const byte* pData, size_t size, ByteO
#ifdef EXIV2_DEBUG_MESSAGES #ifdef EXIV2_DEBUG_MESSAGES
std::cerr << "Warning: Exif IFD " << filteredIfd << " not encoded\n"; std::cerr << "Warning: Exif IFD " << filteredIfd << " not encoded\n";
#endif #endif
ed.erase(std::remove_if(ed.begin(), ed.end(), Internal::FindExifdatum(filteredIfd)), ed.end()); exifData.erase(std::remove_if(exifData.begin(), exifData.end(), Internal::FindExifdatum(filteredIfd)),
exifData.end());
} }
auto header = Internal::Cr2Header(byteOrder); auto header = Internal::Cr2Header(byteOrder);
Internal::OffsetWriter offsetWriter; Internal::OffsetWriter offsetWriter;
offsetWriter.setOrigin(Internal::OffsetWriter::cr2RawIfdOffset, Internal::Cr2Header::offset2addr(), byteOrder); offsetWriter.setOrigin(Internal::OffsetWriter::cr2RawIfdOffset, Internal::Cr2Header::offset2addr(), byteOrder);
return Internal::TiffParserWorker::encode(io, pData, size, ed, iptcData, xmpData, Internal::Tag::root, return Internal::TiffParserWorker::encode(io, pData, size, exifData, iptcData, xmpData, Internal::Tag::root,
Internal::TiffMapping::findEncoder, &header, &offsetWriter); Internal::TiffMapping::findEncoder, &header, &offsetWriter);
} }

@ -500,10 +500,7 @@ ByteOrder ExifParser::decode(ExifData& exifData, const byte* pData, size_t size)
enum Ptt { pttLen, pttTag, pttIfd }; enum Ptt { pttLen, pttTag, pttIfd };
//! @endcond //! @endcond
WriteMethod ExifParser::encode(Blob& blob, const byte* pData, size_t size, ByteOrder byteOrder, WriteMethod ExifParser::encode(Blob& blob, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData) {
const ExifData& exifData) {
ExifData ed = exifData;
// Delete IFD0 tags that are "not recorded" in compressed images // Delete IFD0 tags that are "not recorded" in compressed images
// Reference: Exif 2.2 specs, 4.6.8 Tag Support Levels, section A // Reference: Exif 2.2 specs, 4.6.8 Tag Support Levels, section A
static constexpr auto filteredIfd0Tags = std::array{ static constexpr auto filteredIfd0Tags = std::array{
@ -533,12 +530,12 @@ WriteMethod ExifParser::encode(Blob& blob, const byte* pData, size_t size, ByteO
"Exif.Canon.AFFineRotation", "Exif.Canon.AFFineRotation",
}; };
for (auto&& filteredIfd0Tag : filteredIfd0Tags) { for (auto&& filteredIfd0Tag : filteredIfd0Tags) {
auto pos = ed.findKey(ExifKey(filteredIfd0Tag)); auto pos = exifData.findKey(ExifKey(filteredIfd0Tag));
if (pos != ed.end()) { if (pos != exifData.end()) {
#ifdef EXIV2_DEBUG_MESSAGES #ifdef EXIV2_DEBUG_MESSAGES
std::cerr << "Warning: Exif tag " << pos->key() << " not encoded\n"; std::cerr << "Warning: Exif tag " << pos->key() << " not encoded\n";
#endif #endif
ed.erase(pos); exifData.erase(pos);
} }
} }
@ -552,7 +549,7 @@ WriteMethod ExifParser::encode(Blob& blob, const byte* pData, size_t size, ByteO
#ifdef EXIV2_DEBUG_MESSAGES #ifdef EXIV2_DEBUG_MESSAGES
std::cerr << "Warning: Exif IFD " << filteredIfd << " not encoded\n"; std::cerr << "Warning: Exif IFD " << filteredIfd << " not encoded\n";
#endif #endif
eraseIfd(ed, filteredIfd); eraseIfd(exifData, filteredIfd);
} }
// IPTC and XMP are stored elsewhere, not in the Exif APP1 segment. // IPTC and XMP are stored elsewhere, not in the Exif APP1 segment.
@ -562,7 +559,7 @@ WriteMethod ExifParser::encode(Blob& blob, const byte* pData, size_t size, ByteO
// Encode and check if the result fits into a JPEG Exif APP1 segment // Encode and check if the result fits into a JPEG Exif APP1 segment
MemIo mio1; MemIo mio1;
TiffHeader header(byteOrder, 0x00000008, false); TiffHeader header(byteOrder, 0x00000008, false);
WriteMethod wm = TiffParserWorker::encode(mio1, pData, size, ed, emptyIptc, emptyXmp, Tag::root, WriteMethod wm = TiffParserWorker::encode(mio1, pData, size, exifData, emptyIptc, emptyXmp, Tag::root,
TiffMapping::findEncoder, &header, nullptr); TiffMapping::findEncoder, &header, nullptr);
if (mio1.size() <= 65527) { if (mio1.size() <= 65527) {
append(blob, mio1.mmap(), mio1.size()); append(blob, mio1.mmap(), mio1.size());
@ -609,22 +606,22 @@ WriteMethod ExifParser::encode(Blob& blob, const byte* pData, size_t size, ByteO
switch (ptt) { switch (ptt) {
case pttLen: { case pttLen: {
delTags = false; delTags = false;
if (auto pos = ed.findKey(ExifKey(key)); pos != ed.end() && sumToLong(*pos) > 32768) { if (auto pos = exifData.findKey(ExifKey(key)); pos != exifData.end() && sumToLong(*pos) > 32768) {
delTags = true; delTags = true;
#ifndef SUPPRESS_WARNINGS #ifndef SUPPRESS_WARNINGS
EXV_WARNING << "Exif tag " << pos->key() << " not encoded\n"; EXV_WARNING << "Exif tag " << pos->key() << " not encoded\n";
#endif #endif
ed.erase(pos); exifData.erase(pos);
} }
break; break;
} }
case pttTag: { case pttTag: {
if (delTags) { if (delTags) {
if (auto pos = ed.findKey(ExifKey(key)); pos != ed.end()) { if (auto pos = exifData.findKey(ExifKey(key)); pos != exifData.end()) {
#ifndef SUPPRESS_WARNINGS #ifndef SUPPRESS_WARNINGS
EXV_WARNING << "Exif tag " << pos->key() << " not encoded\n"; EXV_WARNING << "Exif tag " << pos->key() << " not encoded\n";
#endif #endif
ed.erase(pos); exifData.erase(pos);
} }
} }
break; break;
@ -634,19 +631,19 @@ WriteMethod ExifParser::encode(Blob& blob, const byte* pData, size_t size, ByteO
#ifndef SUPPRESS_WARNINGS #ifndef SUPPRESS_WARNINGS
EXV_WARNING << "Exif IFD " << key << " not encoded\n"; EXV_WARNING << "Exif IFD " << key << " not encoded\n";
#endif #endif
eraseIfd(ed, Internal::groupId(key)); eraseIfd(exifData, Internal::groupId(key));
} }
break; break;
} }
} }
// Delete unknown tags larger than 4kB and known tags larger than 20kB. // Delete unknown tags larger than 4kB and known tags larger than 20kB.
for (auto tag_iter = ed.begin(); tag_iter != ed.end();) { for (auto tag_iter = exifData.begin(); tag_iter != exifData.end();) {
if ((tag_iter->size() > 4096 && tag_iter->tagName().substr(0, 2) == "0x") || tag_iter->size() > 20480) { if ((tag_iter->size() > 4096 && tag_iter->tagName().substr(0, 2) == "0x") || tag_iter->size() > 20480) {
#ifndef SUPPRESS_WARNINGS #ifndef SUPPRESS_WARNINGS
EXV_WARNING << "Exif tag " << tag_iter->key() << " not encoded\n"; EXV_WARNING << "Exif tag " << tag_iter->key() << " not encoded\n";
#endif #endif
tag_iter = ed.erase(tag_iter); tag_iter = exifData.erase(tag_iter);
} else { } else {
++tag_iter; ++tag_iter;
} }
@ -654,7 +651,7 @@ WriteMethod ExifParser::encode(Blob& blob, const byte* pData, size_t size, ByteO
// Encode the remaining Exif tags again, don't care if it fits this time // Encode the remaining Exif tags again, don't care if it fits this time
MemIo mio2; MemIo mio2;
wm = TiffParserWorker::encode(mio2, pData, size, ed, emptyIptc, emptyXmp, Tag::root, TiffMapping::findEncoder, wm = TiffParserWorker::encode(mio2, pData, size, exifData, emptyIptc, emptyXmp, Tag::root, TiffMapping::findEncoder,
&header, nullptr); &header, nullptr);
append(blob, mio2.mmap(), mio2.size()); append(blob, mio2.mmap(), mio2.size());
#ifdef EXIV2_DEBUG_MESSAGES #ifdef EXIV2_DEBUG_MESSAGES

@ -116,11 +116,8 @@ ByteOrder OrfParser::decode(ExifData& exifData, IptcData& iptcData, XmpData& xmp
&orfHeader); &orfHeader);
} }
WriteMethod OrfParser::encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, WriteMethod OrfParser::encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData,
const ExifData& exifData, const IptcData& iptcData, const XmpData& xmpData) { IptcData& iptcData, XmpData& xmpData) {
// Copy to be able to modify the Exif data
ExifData ed = exifData;
// Delete IFDs which do not occur in TIFF images // Delete IFDs which do not occur in TIFF images
static constexpr auto filteredIfds = { static constexpr auto filteredIfds = {
IfdId::panaRawId, IfdId::panaRawId,
@ -129,12 +126,12 @@ WriteMethod OrfParser::encode(BasicIo& io, const byte* pData, size_t size, ByteO
#ifdef EXIV2_DEBUG_MESSAGES #ifdef EXIV2_DEBUG_MESSAGES
std::cerr << "Warning: Exif IFD " << filteredIfd << " not encoded\n"; std::cerr << "Warning: Exif IFD " << filteredIfd << " not encoded\n";
#endif #endif
ed.erase(std::remove_if(ed.begin(), ed.end(), FindExifdatum(filteredIfd)), ed.end()); exifData.erase(std::remove_if(exifData.begin(), exifData.end(), FindExifdatum(filteredIfd)), exifData.end());
} }
OrfHeader header(byteOrder); OrfHeader header(byteOrder);
return TiffParserWorker::encode(io, pData, size, ed, iptcData, xmpData, Tag::root, TiffMapping::findEncoder, &header, return TiffParserWorker::encode(io, pData, size, exifData, iptcData, xmpData, Tag::root, TiffMapping::findEncoder,
nullptr); &header, nullptr);
} }
// ************************************************************************* // *************************************************************************

@ -579,7 +579,7 @@ uint32_t PsdImage::writeIptcData(const IptcData& iptcData, BasicIo& out) {
return resLength; return resLength;
} // PsdImage::writeIptcData } // PsdImage::writeIptcData
uint32_t PsdImage::writeExifData(const ExifData& exifData, BasicIo& out) { uint32_t PsdImage::writeExifData(ExifData& exifData, BasicIo& out) {
uint32_t resLength = 0; uint32_t resLength = 0;
byte buf[8]; byte buf[8];

@ -216,11 +216,8 @@ ByteOrder TiffParser::decode(ExifData& exifData, IptcData& iptcData, XmpData& xm
return TiffParserWorker::decode(exifData, iptcData, xmpData, pData, size, root, TiffMapping::findDecoder); return TiffParserWorker::decode(exifData, iptcData, xmpData, pData, size, root, TiffMapping::findDecoder);
} // TiffParser::decode } // TiffParser::decode
WriteMethod TiffParser::encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, WriteMethod TiffParser::encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData,
const ExifData& exifData, const IptcData& iptcData, const XmpData& xmpData) { IptcData& iptcData, XmpData& xmpData) {
// Copy to be able to modify the Exif data
ExifData ed = exifData;
// Delete IFDs which do not occur in TIFF images // Delete IFDs which do not occur in TIFF images
static constexpr auto filteredIfds = std::array{ static constexpr auto filteredIfds = std::array{
IfdId::panaRawId, IfdId::panaRawId,
@ -229,12 +226,12 @@ WriteMethod TiffParser::encode(BasicIo& io, const byte* pData, size_t size, Byte
#ifdef EXIV2_DEBUG_MESSAGES #ifdef EXIV2_DEBUG_MESSAGES
std::cerr << "Warning: Exif IFD " << filteredIfd << " not encoded\n"; std::cerr << "Warning: Exif IFD " << filteredIfd << " not encoded\n";
#endif #endif
ed.erase(std::remove_if(ed.begin(), ed.end(), FindExifdatum(filteredIfd)), ed.end()); exifData.erase(std::remove_if(exifData.begin(), exifData.end(), FindExifdatum(filteredIfd)), exifData.end());
} }
TiffHeader header(byteOrder); TiffHeader header(byteOrder);
return TiffParserWorker::encode(io, pData, size, ed, iptcData, xmpData, Tag::root, TiffMapping::findEncoder, &header, return TiffParserWorker::encode(io, pData, size, exifData, iptcData, xmpData, Tag::root, TiffMapping::findEncoder,
nullptr); &header, nullptr);
} // TiffParser::encode } // TiffParser::encode
// ************************************************************************* // *************************************************************************

@ -2036,10 +2036,9 @@ ByteOrder TiffParserWorker::decode(ExifData& exifData, IptcData& iptcData, XmpDa
} // TiffParserWorker::decode } // TiffParserWorker::decode
WriteMethod TiffParserWorker::encode(BasicIo& io, const byte* pData, size_t size, const ExifData& exifData, WriteMethod TiffParserWorker::encode(BasicIo& io, const byte* pData, size_t size, ExifData& exifData,
const IptcData& iptcData, const XmpData& xmpData, uint32_t root, IptcData& iptcData, XmpData& xmpData, uint32_t root, FindEncoderFct findEncoderFct,
FindEncoderFct findEncoderFct, TiffHeaderBase* pHeader, TiffHeaderBase* pHeader, OffsetWriter* pOffsetWriter) {
OffsetWriter* pOffsetWriter) {
/* /*
1) parse the binary image, if one is provided, and 1) parse the binary image, if one is provided, and
2) attempt updating the parsed tree in-place ("non-intrusive writing") 2) attempt updating the parsed tree in-place ("non-intrusive writing")

@ -216,9 +216,9 @@ class TiffParserWorker {
writing"). If there is a parsed tree, it is only used to access the writing"). If there is a parsed tree, it is only used to access the
image data in this case. image data in this case.
*/ */
static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, const ExifData& exifData, static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, ExifData& exifData, IptcData& iptcData,
const IptcData& iptcData, const XmpData& xmpData, uint32_t root, XmpData& xmpData, uint32_t root, FindEncoderFct findEncoderFct, TiffHeaderBase* pHeader,
FindEncoderFct findEncoderFct, TiffHeaderBase* pHeader, OffsetWriter* pOffsetWriter); OffsetWriter* pOffsetWriter);
private: private:
/*! /*!

@ -443,10 +443,10 @@ void TiffDecoder::visitBinaryElement(TiffBinaryElement* object) {
decodeTiffEntry(object); decodeTiffEntry(object);
} }
TiffEncoder::TiffEncoder(ExifData exifData, const IptcData& iptcData, const XmpData& xmpData, TiffComponent* pRoot, TiffEncoder::TiffEncoder(ExifData& exifData, IptcData& iptcData, XmpData& xmpData, TiffComponent* pRoot,
const bool isNewImage, const PrimaryGroups* pPrimaryGroups, const TiffHeaderBase* pHeader, const bool isNewImage, const PrimaryGroups* pPrimaryGroups, const TiffHeaderBase* pHeader,
FindEncoderFct findEncoderFct) : FindEncoderFct findEncoderFct) :
exifData_(std::move(exifData)), exifData_(exifData),
iptcData_(iptcData), iptcData_(iptcData),
xmpData_(xmpData), xmpData_(xmpData),
pHeader_(pHeader), pHeader_(pHeader),

@ -349,9 +349,8 @@ class TiffEncoder : public TiffVisitor {
to, the image with the metadata to encode and a function to to, the image with the metadata to encode and a function to
find special encoders. find special encoders.
*/ */
TiffEncoder(ExifData exifData, const IptcData& iptcData, const XmpData& xmpData, TiffComponent* pRoot, TiffEncoder(ExifData& exifData, IptcData& iptcData, XmpData& xmpData, TiffComponent* pRoot, bool isNewImage,
bool isNewImage, const PrimaryGroups* pPrimaryGroups, const TiffHeaderBase* pHeader, const PrimaryGroups* pPrimaryGroups, const TiffHeaderBase* pHeader, FindEncoderFct findEncoderFct);
FindEncoderFct findEncoderFct);
TiffEncoder(const TiffEncoder&) = delete; TiffEncoder(const TiffEncoder&) = delete;
TiffEncoder& operator=(const TiffEncoder&) = delete; TiffEncoder& operator=(const TiffEncoder&) = delete;
//! Virtual destructor //! Virtual destructor

Loading…
Cancel
Save