From e7fdad875a568a93d8f7438c875d42d77748462b Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Mon, 9 Dec 2019 04:27:13 -0800 Subject: [PATCH] metadata: cache recent files for faster operation (cherry picked from commit 6ee014ddb7ab77537289e1f41f13345e5db54710) --- rtengine/metadata.cc | 22 ++++++++++++++++++---- rtengine/metadata.h | 10 +++++----- rtgui/procparamchangers.h | 15 ++++++++------- 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/rtengine/metadata.cc b/rtengine/metadata.cc index bfcb3080e..70e8b785a 100644 --- a/rtengine/metadata.cc +++ b/rtengine/metadata.cc @@ -21,6 +21,7 @@ #include #include #include +#include #include "metadata.h" #include "settings.h" @@ -32,9 +33,12 @@ namespace rtengine { extern const Settings *settings; +std::unique_ptr Exiv2Metadata::cache_(nullptr); namespace { +constexpr size_t IMAGE_CACHE_SIZE = 200; + Exiv2::Image::AutoPtr open_exiv2(const Glib::ustring& fname) { #ifdef EXV_UNICODE_PATH @@ -88,10 +92,19 @@ Exiv2Metadata::Exiv2Metadata(const Glib::ustring &path, bool merge_xmp_sidecar): void Exiv2Metadata::load() const { - if (!src_.empty() && !image_.get()) { - auto img = open_exiv2(src_); - image_.reset(img.release()); - image_->readMetadata(); + if (!src_.empty() && !image_.get() && Glib::file_test(src_.c_str(), Glib::FILE_TEST_EXISTS)) { + CacheVal val; + auto finfo = Gio::File::create_for_path(src_)->query_info(G_FILE_ATTRIBUTE_TIME_MODIFIED); + if (cache_ && cache_->get(src_, val) && val.second >= finfo->modification_time()) { + image_ = val.first; + } else { + auto img = open_exiv2(src_); + image_.reset(img.release()); + image_->readMetadata(); + if (cache_) { + cache_->set(src_, CacheVal(image_, finfo->modification_time())); + } + } if (merge_xmp_) { do_merge_xmp(image_.get()); @@ -319,6 +332,7 @@ Exiv2::XmpData Exiv2Metadata::getXmpSidecar(const Glib::ustring &path) void Exiv2Metadata::init() { + cache_.reset(new ImageCache(IMAGE_CACHE_SIZE)); Exiv2::XmpParser::initialize(); } diff --git a/rtengine/metadata.h b/rtengine/metadata.h index 5f19fa5a1..57904d4a4 100644 --- a/rtengine/metadata.h +++ b/rtengine/metadata.h @@ -24,6 +24,7 @@ #include #include #include "procparams.h" +#include "cache.h" namespace rtengine { @@ -74,11 +75,10 @@ private: Exiv2::ExifData exif_data_; Exiv2::IptcData iptc_data_; Exiv2::XmpData xmp_data_; + + typedef std::pair, Glib::TimeVal> CacheVal; + typedef Cache ImageCache; + static std::unique_ptr cache_; }; -// Glib::ustring get_xmp_sidecar_path(const Glib::ustring &path); -// Exiv2::Image::AutoPtr open_exiv2(const Glib::ustring &fname, -// bool merge_xmp_sidecar); -// Exiv2::XmpData read_exiv2_xmp(const Glib::ustring &fname); - } // namespace rtengine diff --git a/rtgui/procparamchangers.h b/rtgui/procparamchangers.h index 8dd3769c6..0ca76a0eb 100644 --- a/rtgui/procparamchangers.h +++ b/rtgui/procparamchangers.h @@ -1,4 +1,5 @@ -/* +/* -*- C++ -*- + * * This file is part of RawTherapee. * * Copyright (c) 2004-2010 Gabor Horvath @@ -16,9 +17,9 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#define UNKNOWN -1 -#define FILEBROWSER 1 -#define EDITOR 2 -#define BATCHEDITOR 3 -#define CACHEMGR 4 -#define SAFETYUPDATE 5 +constexpr int UNKNOWN = -1; +constexpr int FILEBROWSER = 1; +constexpr int EDITOR = 2; +constexpr int BATCHEDITOR = 3; +constexpr int CACHEMGR = 4; +constexpr int SAFETYUPDATE = 5;