Refresh cached image data if sidecar is changed

This commit is contained in:
Lawrence Lee 2023-05-14 18:18:27 -07:00
parent 572a75f02a
commit c557b320c2
No known key found for this signature in database
GPG Key ID: 048FF2B76A63895F
6 changed files with 55 additions and 5 deletions

View File

@ -26,6 +26,15 @@
#include "../rtengine/procparams.h"
#include "../rtengine/settings.h"
namespace
{
const Glib::ustring INI_GROUP_XMP_SIDECAR = "XmpSidecar";
const Glib::ustring INI_XMP_SIDECAR_MD5 = "MD5";
}
CacheImageData::CacheImageData() :
supported(false),
format(FT_Invalid),
@ -108,6 +117,12 @@ int CacheImageData::load (const Glib::ustring& fname)
}
}
if (keyFile.has_group(INI_GROUP_XMP_SIDECAR)) {
if (keyFile.has_key(INI_GROUP_XMP_SIDECAR, INI_XMP_SIDECAR_MD5)) {
xmpSidecarMd5 = keyFile.get_string(INI_GROUP_XMP_SIDECAR, INI_XMP_SIDECAR_MD5);
}
}
timeValid = keyFile.has_group ("DateTime");
if (timeValid) {
@ -268,6 +283,8 @@ int CacheImageData::save (const Glib::ustring& fname)
keyFile.set_boolean ("General", "RecentlySaved", recentlySaved);
keyFile.set_integer ("General", "Rating", rating);
keyFile.set_string(INI_GROUP_XMP_SIDECAR, INI_XMP_SIDECAR_MD5, xmpSidecarMd5);
// remove the old implementation of Rank and InTrash from cache
if (keyFile.has_key ("General", "Rank")) {
keyFile.remove_key("General", "Rank");

View File

@ -39,6 +39,9 @@ public:
bool inTrashOld; // old implementation of inTrash
bool recentlySaved;
// XMP sidecar info.
Glib::ustring xmpSidecarMd5;
// time/date info
bool timeValid;
short year;

View File

@ -97,6 +97,10 @@ Thumbnail* CacheManager::getEntry (const Glib::ustring& fname)
}
const auto cacheName = getCacheFileName ("data", fname, ".txt", md5);
const auto xmpSidecarMd5 =
rtengine::settings->metadata_xmp_sync != rtengine::Settings::MetadataXmpSync::NONE
? getMD5(Thumbnail::xmpSidecarPath(fname))
: "";
// let's see if we have it in the cache
{
@ -106,6 +110,11 @@ Thumbnail* CacheManager::getEntry (const Glib::ustring& fname)
if (error == 0 && imageData.supported) {
if (xmpSidecarMd5 != imageData.xmpSidecarMd5) {
updateImageInfo(fname, imageData, xmpSidecarMd5);
imageData.save(cacheName);
}
thumbnail.reset (new Thumbnail (this, fname, &imageData));
if (!thumbnail->isSupported ()) {
@ -117,7 +126,7 @@ Thumbnail* CacheManager::getEntry (const Glib::ustring& fname)
// if not, create a new one
if (!thumbnail) {
thumbnail.reset (new Thumbnail (this, fname, md5));
thumbnail.reset (new Thumbnail (this, fname, md5, xmpSidecarMd5));
if (!thumbnail->isSupported ()) {
thumbnail.reset ();
@ -413,3 +422,9 @@ void CacheManager::applyCacheSizeLimitation () const
}
}
void CacheManager::updateImageInfo(const Glib::ustring &fname, CacheImageData &imageData, const Glib::ustring &xmpSidecarMd5) const
{
Thumbnail::infoFromImage(fname, imageData);
imageData.xmpSidecarMd5 = xmpSidecarMd5;
}

View File

@ -27,6 +27,7 @@
#include "../rtengine/noncopyable.h"
class CacheImageData;
class Thumbnail;
class CacheManager :
@ -42,6 +43,7 @@ private:
void deleteFiles (const Glib::ustring& fname, const std::string& md5, bool purgeData, bool purgeProfile) const;
void applyCacheSizeLimitation () const;
void updateImageInfo(const Glib::ustring &fname, CacheImageData &imageData, const Glib::ustring &xmpSidecarMd5) const;
public:
static CacheManager* getInstance ();

View File

@ -148,7 +148,7 @@ Thumbnail::Thumbnail(CacheManager* cm, const Glib::ustring& fname, CacheImageDat
tpp = nullptr;
}
Thumbnail::Thumbnail(CacheManager* cm, const Glib::ustring& fname, const std::string& md5) :
Thumbnail::Thumbnail(CacheManager* cm, const Glib::ustring& fname, const std::string& md5, const std::string &xmpSidecarMd5) :
fname(fname),
cachemgr(cm),
ref(1),
@ -166,6 +166,7 @@ Thumbnail::Thumbnail(CacheManager* cm, const Glib::ustring& fname, const std::st
cfs.md5 = md5;
cfs.xmpSidecarMd5 = xmpSidecarMd5;
loadProcParams ();
_generateThumbnailImage ();
cfs.recentlySaved = false;
@ -176,6 +177,11 @@ Thumbnail::Thumbnail(CacheManager* cm, const Glib::ustring& fname, const std::st
tpp = nullptr;
}
Glib::ustring Thumbnail::xmpSidecarPath(const Glib::ustring &imagePath)
{
return rtengine::Exiv2Metadata::xmpSidecarPath(imagePath);
}
void Thumbnail::_generateThumbnailImage ()
{
@ -852,7 +858,12 @@ ThFileType Thumbnail::getType () const
int Thumbnail::infoFromImage (const Glib::ustring& fname)
{
rtengine::FramesMetaData* idata = rtengine::FramesMetaData::fromFile (fname);
return infoFromImage(fname, cfs);
}
int Thumbnail::infoFromImage(const Glib::ustring &fname, CacheImageData &cfs)
{
std::unique_ptr<rtengine::FramesMetaData> idata(rtengine::FramesMetaData::fromFile (fname));
if (!idata) {
return 0;
@ -915,7 +926,6 @@ int Thumbnail::infoFromImage (const Glib::ustring& fname)
idata->getDimensions(cfs.width, cfs.height);
delete idata;
return deg;
}

View File

@ -93,9 +93,12 @@ class Thumbnail
public:
Thumbnail (CacheManager* cm, const Glib::ustring& fname, CacheImageData* cf);
Thumbnail (CacheManager* cm, const Glib::ustring& fname, const std::string& md5);
Thumbnail (CacheManager* cm, const Glib::ustring& fname, const std::string& md5, const std::string &xmpSidecarMd5);
~Thumbnail ();
static int infoFromImage(const Glib::ustring &fname, CacheImageData &cfs);
static Glib::ustring xmpSidecarPath(const Glib::ustring &imagePath);
bool hasProcParams () const;
const rtengine::procparams::ProcParams& getProcParams ();
const rtengine::procparams::ProcParams& getProcParamsU (); // Unprotected version