Fix processing params clear when XMP sync enabled

Fix caching of XMP when clearing processing parameters so that it knows
if the pp3 can be deleted without affecting the rank and color labels.
This commit is contained in:
Lawrence Lee 2025-01-20 12:49:36 -08:00
parent d3dca005eb
commit 367041e2e6
No known key found for this signature in database
GPG Key ID: 048FF2B76A63895F
2 changed files with 36 additions and 4 deletions

View File

@ -18,6 +18,7 @@
*/ */
#pragma once #pragma once
#include <functional>
#include <vector> #include <vector>
#include <type_traits> #include <type_traits>
@ -26,6 +27,37 @@
namespace rtengine namespace rtengine
{ {
/**
* A function object that supplies a value and returns the same value for
* subsequent calls.
*/
template <typename T>
struct MemoizingSupplier {
using Supplier = std::function<T()>;
/**
* @param supplier The delegate supplier.
*/
explicit MemoizingSupplier(const Supplier &supplier) :
supplier(supplier)
{
}
T operator()() const
{
if (!is_cached) {
value = supplier();
is_cached = true;
}
return value;
}
private:
const Supplier supplier;
mutable T value;
mutable bool is_cached{false};
};
// Update a point of a Cairo::Surface by accessing the raw data // Update a point of a Cairo::Surface by accessing the raw data
void poke255_uc(unsigned char*& dest, unsigned char r, unsigned char g, unsigned char b); void poke255_uc(unsigned char*& dest, unsigned char r, unsigned char g, unsigned char b);
// Update a point of a Cairo::Surface by accessing the raw data // Update a point of a Cairo::Surface by accessing the raw data

View File

@ -37,6 +37,7 @@
#include "rtengine/metadata.h" #include "rtengine/metadata.h"
#include "rtengine/profilestore.h" #include "rtengine/profilestore.h"
#include "rtengine/settings.h" #include "rtengine/settings.h"
#include "rtengine/utils.h"
#include "guiutils.h" #include "guiutils.h"
#include "batchqueue.h" #include "batchqueue.h"
#include "extprog.h" #include "extprog.h"
@ -1418,10 +1419,9 @@ void Thumbnail::updateProcParamsProperties(bool forceUpdate)
pparamsValid = true; pparamsValid = true;
} }
const auto getXmpSidecar = [this]() { const rtengine::MemoizingSupplier<Exiv2::XmpData> getXmpSidecar([this]() {
static auto xmp = rtengine::Exiv2Metadata::getXmpSidecar(fname); return rtengine::Exiv2Metadata::getXmpSidecar(fname);
return xmp; });
};
// save procparams rank and color also when options.thumbnailRankColorMode == Options::ThumbnailPropertyMode::XMP // save procparams rank and color also when options.thumbnailRankColorMode == Options::ThumbnailPropertyMode::XMP
// so they'll be kept in sync // so they'll be kept in sync