const ref to ref conversions
This commit is contained in:
parent
64bb7820a0
commit
2526dcf5a1
@ -89,8 +89,8 @@ class EXIV2API Cr2Parser {
|
||||
@brief Encode metadata from the provided metadata to CR2 format.
|
||||
See TiffParser::encode().
|
||||
*/
|
||||
static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, const ExifData& exifData,
|
||||
const IptcData& iptcData, const XmpData& xmpData);
|
||||
static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData,
|
||||
IptcData& iptcData, XmpData& xmpData);
|
||||
|
||||
}; // class Cr2Parser
|
||||
|
||||
|
||||
@ -530,7 +530,7 @@ class EXIV2API ExifParser {
|
||||
|
||||
@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.
|
||||
|
||||
@ -551,7 +551,7 @@ class EXIV2API ExifParser {
|
||||
@param byteOrder Byte order to use.
|
||||
@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);
|
||||
}
|
||||
|
||||
|
||||
@ -78,8 +78,8 @@ class EXIV2API OrfParser {
|
||||
@brief Encode metadata from the provided metadata to ORF format.
|
||||
See TiffParser::encode().
|
||||
*/
|
||||
static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, const ExifData& exifData,
|
||||
const IptcData& iptcData, const XmpData& xmpData);
|
||||
static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData,
|
||||
IptcData& iptcData, XmpData& xmpData);
|
||||
}; // class OrfParser
|
||||
|
||||
// *****************************************************************************
|
||||
|
||||
@ -75,7 +75,7 @@ class EXIV2API PsdImage : public Image {
|
||||
|
||||
*/
|
||||
void doWriteMetadata(BasicIo& outIo);
|
||||
uint32_t writeExifData(const ExifData& exifData, BasicIo& out);
|
||||
uint32_t writeExifData(ExifData& exifData, BasicIo& out);
|
||||
//@}
|
||||
|
||||
//! @name Accessors
|
||||
|
||||
@ -137,8 +137,8 @@ class EXIV2API TiffParser {
|
||||
|
||||
@return Write method used.
|
||||
*/
|
||||
static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, const ExifData& exifData,
|
||||
const IptcData& iptcData, const XmpData& xmpData);
|
||||
static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData,
|
||||
IptcData& iptcData, XmpData& xmpData);
|
||||
|
||||
}; // class TiffParser
|
||||
|
||||
|
||||
@ -103,11 +103,8 @@ ByteOrder Cr2Parser::decode(ExifData& exifData, IptcData& iptcData, XmpData& xmp
|
||||
Internal::TiffMapping::findDecoder, &cr2Header);
|
||||
}
|
||||
|
||||
WriteMethod Cr2Parser::encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder,
|
||||
const ExifData& exifData, const IptcData& iptcData, const XmpData& xmpData) {
|
||||
// Copy to be able to modify the Exif data
|
||||
ExifData ed = exifData;
|
||||
|
||||
WriteMethod Cr2Parser::encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData,
|
||||
IptcData& iptcData, XmpData& xmpData) {
|
||||
// Delete IFDs which do not occur in TIFF images
|
||||
static constexpr auto filteredIfds = std::array{
|
||||
IfdId::panaRawId,
|
||||
@ -116,13 +113,14 @@ WriteMethod Cr2Parser::encode(BasicIo& io, const byte* pData, size_t size, ByteO
|
||||
#ifdef EXIV2_DEBUG_MESSAGES
|
||||
std::cerr << "Warning: Exif IFD " << filteredIfd << " not encoded\n";
|
||||
#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);
|
||||
Internal::OffsetWriter offsetWriter;
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
31
src/exif.cpp
31
src/exif.cpp
@ -500,10 +500,7 @@ ByteOrder ExifParser::decode(ExifData& exifData, const byte* pData, size_t size)
|
||||
enum Ptt { pttLen, pttTag, pttIfd };
|
||||
//! @endcond
|
||||
|
||||
WriteMethod ExifParser::encode(Blob& blob, const byte* pData, size_t size, ByteOrder byteOrder,
|
||||
const ExifData& exifData) {
|
||||
ExifData ed = exifData;
|
||||
|
||||
WriteMethod ExifParser::encode(Blob& blob, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData) {
|
||||
// Delete IFD0 tags that are "not recorded" in compressed images
|
||||
// Reference: Exif 2.2 specs, 4.6.8 Tag Support Levels, section A
|
||||
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",
|
||||
};
|
||||
for (auto&& filteredIfd0Tag : filteredIfd0Tags) {
|
||||
auto pos = ed.findKey(ExifKey(filteredIfd0Tag));
|
||||
if (pos != ed.end()) {
|
||||
auto pos = exifData.findKey(ExifKey(filteredIfd0Tag));
|
||||
if (pos != exifData.end()) {
|
||||
#ifdef EXIV2_DEBUG_MESSAGES
|
||||
std::cerr << "Warning: Exif tag " << pos->key() << " not encoded\n";
|
||||
#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
|
||||
std::cerr << "Warning: Exif IFD " << filteredIfd << " not encoded\n";
|
||||
#endif
|
||||
eraseIfd(ed, filteredIfd);
|
||||
eraseIfd(exifData, filteredIfd);
|
||||
}
|
||||
|
||||
// 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
|
||||
MemIo mio1;
|
||||
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);
|
||||
if (mio1.size() <= 65527) {
|
||||
append(blob, mio1.mmap(), mio1.size());
|
||||
@ -609,22 +606,22 @@ WriteMethod ExifParser::encode(Blob& blob, const byte* pData, size_t size, ByteO
|
||||
switch (ptt) {
|
||||
case pttLen: {
|
||||
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;
|
||||
#ifndef SUPPRESS_WARNINGS
|
||||
EXV_WARNING << "Exif tag " << pos->key() << " not encoded\n";
|
||||
#endif
|
||||
ed.erase(pos);
|
||||
exifData.erase(pos);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case pttTag: {
|
||||
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
|
||||
EXV_WARNING << "Exif tag " << pos->key() << " not encoded\n";
|
||||
#endif
|
||||
ed.erase(pos);
|
||||
exifData.erase(pos);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -634,19 +631,19 @@ WriteMethod ExifParser::encode(Blob& blob, const byte* pData, size_t size, ByteO
|
||||
#ifndef SUPPRESS_WARNINGS
|
||||
EXV_WARNING << "Exif IFD " << key << " not encoded\n";
|
||||
#endif
|
||||
eraseIfd(ed, Internal::groupId(key));
|
||||
eraseIfd(exifData, Internal::groupId(key));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 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) {
|
||||
#ifndef SUPPRESS_WARNINGS
|
||||
EXV_WARNING << "Exif tag " << tag_iter->key() << " not encoded\n";
|
||||
#endif
|
||||
tag_iter = ed.erase(tag_iter);
|
||||
tag_iter = exifData.erase(tag_iter);
|
||||
} else {
|
||||
++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
|
||||
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);
|
||||
append(blob, mio2.mmap(), mio2.size());
|
||||
#ifdef EXIV2_DEBUG_MESSAGES
|
||||
|
||||
@ -116,11 +116,8 @@ ByteOrder OrfParser::decode(ExifData& exifData, IptcData& iptcData, XmpData& xmp
|
||||
&orfHeader);
|
||||
}
|
||||
|
||||
WriteMethod OrfParser::encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder,
|
||||
const ExifData& exifData, const IptcData& iptcData, const XmpData& xmpData) {
|
||||
// Copy to be able to modify the Exif data
|
||||
ExifData ed = exifData;
|
||||
|
||||
WriteMethod OrfParser::encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData,
|
||||
IptcData& iptcData, XmpData& xmpData) {
|
||||
// Delete IFDs which do not occur in TIFF images
|
||||
static constexpr auto filteredIfds = {
|
||||
IfdId::panaRawId,
|
||||
@ -129,12 +126,12 @@ WriteMethod OrfParser::encode(BasicIo& io, const byte* pData, size_t size, ByteO
|
||||
#ifdef EXIV2_DEBUG_MESSAGES
|
||||
std::cerr << "Warning: Exif IFD " << filteredIfd << " not encoded\n";
|
||||
#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);
|
||||
return TiffParserWorker::encode(io, pData, size, ed, iptcData, xmpData, Tag::root, TiffMapping::findEncoder, &header,
|
||||
nullptr);
|
||||
return TiffParserWorker::encode(io, pData, size, exifData, iptcData, xmpData, Tag::root, TiffMapping::findEncoder,
|
||||
&header, nullptr);
|
||||
}
|
||||
|
||||
// *************************************************************************
|
||||
|
||||
@ -579,7 +579,7 @@ uint32_t PsdImage::writeIptcData(const IptcData& iptcData, BasicIo& out) {
|
||||
return resLength;
|
||||
} // PsdImage::writeIptcData
|
||||
|
||||
uint32_t PsdImage::writeExifData(const ExifData& exifData, BasicIo& out) {
|
||||
uint32_t PsdImage::writeExifData(ExifData& exifData, BasicIo& out) {
|
||||
uint32_t resLength = 0;
|
||||
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);
|
||||
} // TiffParser::decode
|
||||
|
||||
WriteMethod TiffParser::encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder,
|
||||
const ExifData& exifData, const IptcData& iptcData, const XmpData& xmpData) {
|
||||
// Copy to be able to modify the Exif data
|
||||
ExifData ed = exifData;
|
||||
|
||||
WriteMethod TiffParser::encode(BasicIo& io, const byte* pData, size_t size, ByteOrder byteOrder, ExifData& exifData,
|
||||
IptcData& iptcData, XmpData& xmpData) {
|
||||
// Delete IFDs which do not occur in TIFF images
|
||||
static constexpr auto filteredIfds = std::array{
|
||||
IfdId::panaRawId,
|
||||
@ -229,12 +226,12 @@ WriteMethod TiffParser::encode(BasicIo& io, const byte* pData, size_t size, Byte
|
||||
#ifdef EXIV2_DEBUG_MESSAGES
|
||||
std::cerr << "Warning: Exif IFD " << filteredIfd << " not encoded\n";
|
||||
#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);
|
||||
return TiffParserWorker::encode(io, pData, size, ed, iptcData, xmpData, Tag::root, TiffMapping::findEncoder, &header,
|
||||
nullptr);
|
||||
return TiffParserWorker::encode(io, pData, size, exifData, iptcData, xmpData, Tag::root, TiffMapping::findEncoder,
|
||||
&header, nullptr);
|
||||
} // TiffParser::encode
|
||||
|
||||
// *************************************************************************
|
||||
|
||||
@ -2036,10 +2036,9 @@ ByteOrder TiffParserWorker::decode(ExifData& exifData, IptcData& iptcData, XmpDa
|
||||
|
||||
} // TiffParserWorker::decode
|
||||
|
||||
WriteMethod TiffParserWorker::encode(BasicIo& io, const byte* pData, size_t size, const ExifData& exifData,
|
||||
const IptcData& iptcData, const XmpData& xmpData, uint32_t root,
|
||||
FindEncoderFct findEncoderFct, TiffHeaderBase* pHeader,
|
||||
OffsetWriter* pOffsetWriter) {
|
||||
WriteMethod TiffParserWorker::encode(BasicIo& io, const byte* pData, size_t size, ExifData& exifData,
|
||||
IptcData& iptcData, XmpData& xmpData, uint32_t root, FindEncoderFct findEncoderFct,
|
||||
TiffHeaderBase* pHeader, OffsetWriter* pOffsetWriter) {
|
||||
/*
|
||||
1) parse the binary image, if one is provided, and
|
||||
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
|
||||
image data in this case.
|
||||
*/
|
||||
static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, const ExifData& exifData,
|
||||
const IptcData& iptcData, const XmpData& xmpData, uint32_t root,
|
||||
FindEncoderFct findEncoderFct, TiffHeaderBase* pHeader, OffsetWriter* pOffsetWriter);
|
||||
static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, ExifData& exifData, IptcData& iptcData,
|
||||
XmpData& xmpData, uint32_t root, FindEncoderFct findEncoderFct, TiffHeaderBase* pHeader,
|
||||
OffsetWriter* pOffsetWriter);
|
||||
|
||||
private:
|
||||
/*!
|
||||
|
||||
@ -443,10 +443,10 @@ void TiffDecoder::visitBinaryElement(TiffBinaryElement* 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,
|
||||
FindEncoderFct findEncoderFct) :
|
||||
exifData_(std::move(exifData)),
|
||||
exifData_(exifData),
|
||||
iptcData_(iptcData),
|
||||
xmpData_(xmpData),
|
||||
pHeader_(pHeader),
|
||||
|
||||
@ -349,9 +349,8 @@ class TiffEncoder : public TiffVisitor {
|
||||
to, the image with the metadata to encode and a function to
|
||||
find special encoders.
|
||||
*/
|
||||
TiffEncoder(ExifData exifData, const IptcData& iptcData, const XmpData& xmpData, TiffComponent* pRoot,
|
||||
bool isNewImage, const PrimaryGroups* pPrimaryGroups, const TiffHeaderBase* pHeader,
|
||||
FindEncoderFct findEncoderFct);
|
||||
TiffEncoder(ExifData& exifData, IptcData& iptcData, XmpData& xmpData, TiffComponent* pRoot, bool isNewImage,
|
||||
const PrimaryGroups* pPrimaryGroups, const TiffHeaderBase* pHeader, FindEncoderFct findEncoderFct);
|
||||
TiffEncoder(const TiffEncoder&) = delete;
|
||||
TiffEncoder& operator=(const TiffEncoder&) = delete;
|
||||
//! Virtual destructor
|
||||
|
||||
Loading…
Reference in New Issue
Block a user