diff --git a/rtengine/dfmanager.cc b/rtengine/dfmanager.cc index 68123d9b4..1ce43637d 100644 --- a/rtengine/dfmanager.cc +++ b/rtengine/dfmanager.cc @@ -382,8 +382,7 @@ dfInfo* DFManager::addFileInfo (const Glib::ustring& filename, bool pool) return &(iter->second); } - RawMetaDataLocation rml(ri.get_exifBase(), ri.get_ciffBase(), ri.get_ciffLen()); - FramesData idata(filename, &rml, true); + FramesData idata(filename, std::unique_ptr(new RawMetaDataLocation(ri.get_exifBase(), ri.get_ciffBase(), ri.get_ciffLen())), true); /* Files are added in the map, divided by same maker/model,ISO and shutter*/ std::string key( dfInfo::key(((Glib::ustring)idata.getMake()).uppercase(), ((Glib::ustring)idata.getModel()).uppercase(), idata.getISOSpeed(), idata.getShutterSpeed()) ); iter = dfList.find( key ); diff --git a/rtengine/ffmanager.cc b/rtengine/ffmanager.cc index 6acdc1b0a..8f8d928c1 100644 --- a/rtengine/ffmanager.cc +++ b/rtengine/ffmanager.cc @@ -338,8 +338,7 @@ ffInfo* FFManager::addFileInfo (const Glib::ustring& filename, bool pool) return &(iter->second); } - RawMetaDataLocation rml(ri.get_exifBase(), ri.get_ciffBase(), ri.get_ciffLen()); - FramesData idata(filename, &rml, true); + FramesData idata(filename, std::unique_ptr(new RawMetaDataLocation(ri.get_exifBase(), ri.get_ciffBase(), ri.get_ciffLen())), true); /* Files are added in the map, divided by same maker/model,lens and aperture*/ std::string key( ffInfo::key(idata.getMake(), idata.getModel(), idata.getLens(), idata.getFocalLen(), idata.getFNumber()) ); iter = ffList.find( key ); diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index 9c27ddd50..66cd3874b 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -41,9 +41,9 @@ Glib::ustring to_utf8 (const std::string& str) } -FramesMetaData* FramesMetaData::fromFile (const Glib::ustring& fname, RawMetaDataLocation* rml, bool firstFrameOnly) +FramesMetaData* FramesMetaData::fromFile (const Glib::ustring& fname, std::unique_ptr rml, bool firstFrameOnly) { - return new FramesData (fname, rml, firstFrameOnly); + return new FramesData (fname, std::move(rml), firstFrameOnly); } FrameData::FrameData () @@ -1000,18 +1000,20 @@ failure: } -FramesData::FramesData (Glib::ustring fname, RawMetaDataLocation* rml, bool firstFrameOnly, bool loadAll) : dcrawFrameCount (0) +FramesData::FramesData (const Glib::ustring& fname, std::unique_ptr rml, bool firstFrameOnly, bool loadAll) : + dcrawFrameCount (0) { if (rml && (rml->exifBase >= 0 || rml->ciffBase >= 0)) { FILE* f = g_fopen (fname.c_str (), "rb"); if (f) { - rtexif::ExifManager exifManager (f, rml, firstFrameOnly); + const bool has_rml_exif_base = rml->exifBase >= 0; + rtexif::ExifManager exifManager (f, std::move(rml), firstFrameOnly); - if (rml->exifBase >= 0) { + if (has_rml_exif_base) { FrameData *idata = new RawFrameData (exifManager); frames.push_back(idata); - if (rml && !firstFrameOnly) { + if (!firstFrameOnly) { while (exifManager.getNextIFDOffset ()) { int nextIFD = exifManager.getNextIFDOffset (); exifManager.setIFDOffset (nextIFD); @@ -1026,7 +1028,8 @@ FramesData::FramesData (Glib::ustring fname, RawMetaDataLocation* rml, bool firs FILE* f = g_fopen (fname.c_str (), "rb"); if (f) { - rtexif::ExifManager exifManager (f, rml, true); + rtexif::ExifManager exifManager (f, std::move(rml), true); + FrameData *idata = new JpegFrameData (exifManager); frames.push_back(idata); fclose (f); @@ -1035,10 +1038,12 @@ FramesData::FramesData (Glib::ustring fname, RawMetaDataLocation* rml, bool firs FILE* f = g_fopen (fname.c_str (), "rb"); if (f) { - rtexif::ExifManager exifManager (f, rml, firstFrameOnly); + const bool has_rml = static_cast(rml); + rtexif::ExifManager exifManager (f, std::move(rml), firstFrameOnly); + FrameData *idata = new TiffFrameData (exifManager); frames.push_back(idata); - if (rml && !firstFrameOnly) { + if (has_rml && !firstFrameOnly) { while (exifManager.getNextIFDOffset ()) { exifManager.setIFDOffset (exifManager.getNextIFDOffset ()); idata = new TiffFrameData (exifManager); diff --git a/rtengine/imagedata.h b/rtengine/imagedata.h index 7474ecab7..f8ba685c1 100644 --- a/rtengine/imagedata.h +++ b/rtengine/imagedata.h @@ -20,12 +20,17 @@ #define __IMAGEDATA_H__ #include -#include "rawimage.h" +#include #include + #include -#include "../rtexif/rtexif.h" -#include "procparams.h" + #include + +#include "../rtexif/rtexif.h" + +#include "procparams.h" +#include "rawimage.h" #include "rtengine.h" namespace rtengine @@ -111,7 +116,7 @@ private: unsigned int dcrawFrameCount; public: - FramesData (Glib::ustring fname, RawMetaDataLocation* rml = nullptr, bool firstFrameOnly = false, bool loadAll = false); + FramesData (const Glib::ustring& fname, std::unique_ptr rml = nullptr, bool firstFrameOnly = false, bool loadAll = false); ~FramesData (); void setDCRawFrameCount (unsigned int frameCount); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 6641cf51e..0cbb393d7 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1698,12 +1698,9 @@ int RawImageSource::load (const Glib::ustring &fname, int imageNum, bool batch) } - //Load complete Exif informations - RawMetaDataLocation rml; - rml.exifBase = ri->get_exifBase(); - rml.ciffBase = ri->get_ciffBase(); - rml.ciffLength = ri->get_ciffLen(); - idata = new FramesData (fname, &rml); + // Load complete Exif informations + std::unique_ptr rml(new RawMetaDataLocation (ri->get_exifBase(), ri->get_ciffBase(), ri->get_ciffLen())); + idata = new FramesData (fname, std::move(rml)); idata->setDCRawFrameCount (numFrames); green(W, H); diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 8e6e8430d..8f5a490d6 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -131,7 +131,7 @@ public: * Use it only for raw files. In caseof jpgs and tiffs pass a NULL pointer. * @param firstFrameOnly must be true to get the MetaData of the first frame only, e.g. for a PixelShift file. * @return The metadata */ - static FramesMetaData* fromFile (const Glib::ustring& fname, RawMetaDataLocation* rml, bool firstFrameOnly = false); + static FramesMetaData* fromFile (const Glib::ustring& fname, std::unique_ptr rml, bool firstFrameOnly = false); }; /** This listener interface is used to indicate the progress of time consuming operations */ diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index b242c2cbd..441d017d4 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -852,11 +852,11 @@ Tag::Tag (TagDirectory* p, FILE* f, int base) } if (tag == 0x002e) { // location of the embedded preview image in raw files of Panasonic cameras - TagDirectory* previewdir; - { - ExifManager exifManager(f, 0, true); - previewdir = exifManager.parseJPEG (ftell (f)); // try to parse the exif data from the preview image - } + const TagDirectory* const previewdir = + [&f]() + { + return ExifManager(f, nullptr, true).parseJPEG(ftell(f)); // try to parse the exif data from the preview image + }(); if (previewdir) { if (previewdir->getTag ("Exif")) { @@ -1977,9 +1977,16 @@ void ExifManager::parseCIFF (int length, TagDirectory* root) fseek (f, rml->ciffBase + get4 (f, INTEL), SEEK_SET); if ((((type >> 8) + 8) | 8) == 0x38) { - rtengine::RawMetaDataLocation rml2(ftell (f), len); - ExifManager exifManager(f, &rml2, true); - exifManager.parseCIFF (len, root); // Parse a sub-table + ExifManager( + f, + std::unique_ptr( + new rtengine::RawMetaDataLocation( + ftell(f), + len + ) + ), + true + ).parseCIFF(len, root); // Parse a sub-table } if (type == 0x0810) { @@ -2010,7 +2017,7 @@ void ExifManager::parseCIFF (int length, TagDirectory* root) } - ExifManager exifManager(f, 0, true); + ExifManager exifManager(f, nullptr, true); if (type == 0x102d) { Tag* t = exifManager.saveCIFFMNTag (root, len, "CanonCameraSettings"); int mm = t->toInt (34, SHORT); @@ -2856,16 +2863,14 @@ TagDirectory* ExifManager::parseJPEG (int offset) tiffbase = ftell (f); // We need a RawMetaDataLocation to put the 'tiffbase' value - bool rmlCreated = false; - if (!rml) { - rml = new rtengine::RawMetaDataLocation (0); - rmlCreated = true; + const bool rmlCreated = !rml; + if (rmlCreated) { + rml.reset(new rtengine::RawMetaDataLocation(0)); } rml->exifBase = tiffbase; TagDirectory* tagDir = parse (); if (rmlCreated) { - delete rml; - rml = nullptr; + rml.reset(); } return tagDir; } @@ -2879,10 +2884,11 @@ TagDirectory* ExifManager::parseJPEG (int offset) TagDirectory* ExifManager::parseTIFF (bool skipIgnored) { - if (!rml) { - std::unique_ptr rml(new rtengine::RawMetaDataLocation(0)); - return parse (skipIgnored); + rml.reset(new rtengine::RawMetaDataLocation(0)); + TagDirectory* const res = parse(skipIgnored); + rml.reset(); + return res; } else { return parse (skipIgnored); } diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index 5821c58f5..bc9495187 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -19,14 +19,16 @@ #ifndef _MEXIF3_ #define _MEXIF3_ -#include -#include -#include -#include -#include -#include -#include #include +#include +#include +#include +#include +#include +#include +#include +#include + #include #include "../rtengine/procparams.h" @@ -316,14 +318,14 @@ class ExifManager public: FILE* f; - rtengine::RawMetaDataLocation *rml; + std::unique_ptr rml; ByteOrder order; bool onlyFirst; // Only first IFD unsigned int IFDOffset; unsigned int nextIFDOffset; - ExifManager (FILE* fHandle, rtengine::RawMetaDataLocation *rml, bool onlyFirstIFD) - : f(fHandle), rml(rml), order(UNKNOWN), onlyFirst(onlyFirstIFD), + ExifManager (FILE* fHandle, std::unique_ptr _rml, bool onlyFirstIFD) + : f(fHandle), rml(std::move(_rml)), order(UNKNOWN), onlyFirst(onlyFirstIFD), IFDOffset(0), nextIFDOffset(0) {} void setIFDOffset(unsigned int offset) diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 320424bf1..283f80bed 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -145,7 +145,7 @@ void Thumbnail::_generateThumbnailImage () if (tpp) { cfs.format = FT_Raw; cfs.thumbImgType = quick ? CacheImageData::QUICK_THUMBNAIL : CacheImageData::FULL_THUMBNAIL; - infoFromImage (fname, &ri); + infoFromImage (fname, std::unique_ptr(new rtengine::RawMetaDataLocation(ri))); } } @@ -229,9 +229,8 @@ rtengine::procparams::ProcParams* Thumbnail::createProcParamsForUpdate(bool retu if (defProf == DEFPROFILE_DYNAMIC && create && cfs && cfs->exifValid) { rtengine::FramesMetaData* imageMetaData; if (getType() == FT_Raw) { - rtengine::RawMetaDataLocation metaData = rtengine::Thumbnail::loadMetaDataFromRaw(fname); // Should we ask all frame's MetaData ? - imageMetaData = rtengine::FramesMetaData::fromFile (fname, &metaData, true); + imageMetaData = rtengine::FramesMetaData::fromFile (fname, std::unique_ptr(new rtengine::RawMetaDataLocation(rtengine::Thumbnail::loadMetaDataFromRaw(fname))), true); } else { // Should we ask all frame's MetaData ? imageMetaData = rtengine::FramesMetaData::fromFile (fname, nullptr, true); @@ -255,9 +254,8 @@ rtengine::procparams::ProcParams* Thumbnail::createProcParamsForUpdate(bool retu rtengine::FramesMetaData* imageMetaData; if (getType() == FT_Raw) { - rtengine::RawMetaDataLocation metaData = rtengine::Thumbnail::loadMetaDataFromRaw(fname); // Should we ask all frame's MetaData ? - imageMetaData = rtengine::FramesMetaData::fromFile (fname, &metaData, true); + imageMetaData = rtengine::FramesMetaData::fromFile (fname, std::unique_ptr(new rtengine::RawMetaDataLocation(rtengine::Thumbnail::loadMetaDataFromRaw(fname))), true); } else { // Should we ask all frame's MetaData ? imageMetaData = rtengine::FramesMetaData::fromFile (fname, nullptr, true); @@ -713,10 +711,9 @@ ThFileType Thumbnail::getType () return (ThFileType) cfs.format; } -int Thumbnail::infoFromImage (const Glib::ustring& fname, rtengine::RawMetaDataLocation* rml) +int Thumbnail::infoFromImage (const Glib::ustring& fname, std::unique_ptr rml) { - - rtengine::FramesMetaData* idata = rtengine::FramesMetaData::fromFile (fname, rml); + rtengine::FramesMetaData* idata = rtengine::FramesMetaData::fromFile (fname, std::move(rml)); if (!idata) { return 0; diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h index eb9e38f7f..70bd60790 100644 --- a/rtgui/thumbnail.h +++ b/rtgui/thumbnail.h @@ -70,7 +70,7 @@ class Thumbnail void _loadThumbnail (bool firstTrial = true); void _saveThumbnail (); void _generateThumbnailImage (); - int infoFromImage (const Glib::ustring& fname, rtengine::RawMetaDataLocation* rml = nullptr); + int infoFromImage (const Glib::ustring& fname, std::unique_ptr rml = nullptr); void loadThumbnail (bool firstTrial = true); void generateExifDateTimeStrings ();