fixed bugs in metadata saving

(cherry picked from commit 880b1d3d865a7820051cf3023cc58802daca28b0)
This commit is contained in:
Alberto Griggio
2019-05-15 05:57:14 -07:00
committed by Lawrence Lee
parent 1a771fa211
commit a4b0801646
4 changed files with 88 additions and 52 deletions

View File

@@ -1789,6 +1789,11 @@ PREFERENCES_MENUGROUPLABEL;Group "Color label"
PREFERENCES_MENUGROUPPROFILEOPERATIONS;Group "Processing profile operations" PREFERENCES_MENUGROUPPROFILEOPERATIONS;Group "Processing profile operations"
PREFERENCES_MENUGROUPRANK;Group "Rank" PREFERENCES_MENUGROUPRANK;Group "Rank"
PREFERENCES_MENUOPTIONS;Context Menu Options PREFERENCES_MENUOPTIONS;Context Menu Options
PREFERENCES_METADATA;Metadata
PREFERENCES_METADATA_SYNC;Metadata synchronization with XMP sidecars
PREFERENCES_METADATA_SYNC_NONE;Off
PREFERENCES_METADATA_SYNC_READ;Read only
PREFERENCES_METADATA_SYNC_READWRITE;Bidirectional
PREFERENCES_MONINTENT;Default rendering intent PREFERENCES_MONINTENT;Default rendering intent
PREFERENCES_MONITOR;Monitor PREFERENCES_MONITOR;Monitor
PREFERENCES_MONPROFILE;Default color profile PREFERENCES_MONPROFILE;Default color profile
@@ -1864,6 +1869,9 @@ PREFERENCES_TP_LABEL;Tool panel:
PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar
PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles
PREFERENCES_WORKFLOW;Layout PREFERENCES_WORKFLOW;Layout
PREFERENCES_XMP_SIDECAR_MODE;XMP sidecar style
PREFERENCES_XMP_SIDECAR_MODE_STD;Standard (FILENAME.xmp for FILENAME.ext)
PREFERENCES_XMP_SIDECAR_MODE_EXT;Darktable-like (FILENAME.ext.xmp for FILENAME.ext)
PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling PREFERENCES_ZOOMONSCROLL;Zoom images by scrolling
PROFILEPANEL_COPYPPASTE;Parameters to copy PROFILEPANEL_COPYPPASTE;Parameters to copy
PROFILEPANEL_GLOBALPROFILES;Bundled profiles PROFILEPANEL_GLOBALPROFILES;Bundled profiles

View File

@@ -33,6 +33,7 @@
#include "profilestore.h" #include "profilestore.h"
#include "../rtgui/threadutils.h" #include "../rtgui/threadutils.h"
#include "rtlensfun.h" #include "rtlensfun.h"
#include "metadata.h"
#include "procparams.h" #include "procparams.h"
namespace rtengine namespace rtengine
@@ -103,6 +104,8 @@ int init (const Settings* s, const Glib::ustring& baseDir, const Glib::ustring&
} }
Color::init (); Color::init ();
Exiv2Metadata::init();
delete lcmsMutex; delete lcmsMutex;
lcmsMutex = new MyMutex; lcmsMutex = new MyMutex;
fftwMutex = new MyMutex; fftwMutex = new MyMutex;
@@ -111,6 +114,7 @@ int init (const Settings* s, const Glib::ustring& baseDir, const Glib::ustring&
void cleanup () void cleanup ()
{ {
Exiv2Metadata::cleanup();
ProcParams::cleanup (); ProcParams::cleanup ();
Color::cleanup (); Color::cleanup ();
RawImageSource::cleanup (); RawImageSource::cleanup ();

View File

@@ -20,6 +20,8 @@
#include <stdio.h> #include <stdio.h>
#include <glib/gstdio.h> #include <glib/gstdio.h>
#include <iostream>
#include "metadata.h" #include "metadata.h"
#include "settings.h" #include "settings.h"
#include "../rtgui/version.h" #include "../rtgui/version.h"
@@ -65,7 +67,7 @@ Exiv2Metadata::Exiv2Metadata():
Exiv2Metadata::Exiv2Metadata(const Glib::ustring &path): Exiv2Metadata::Exiv2Metadata(const Glib::ustring &path):
src_(""), src_(path),
merge_xmp_(settings->metadata_xmp_sync != Settings::MetadataXmpSync::NONE), merge_xmp_(settings->metadata_xmp_sync != Settings::MetadataXmpSync::NONE),
image_(nullptr), image_(nullptr),
exif_(new rtengine::procparams::ExifPairs), exif_(new rtengine::procparams::ExifPairs),
@@ -154,11 +156,12 @@ void Exiv2Metadata::setIptc(const rtengine::procparams::IPTCPairs &iptc)
void Exiv2Metadata::do_merge_xmp(Exiv2::Image *dst) const void Exiv2Metadata::do_merge_xmp(Exiv2::Image *dst) const
{ {
try {
auto xmp = getXmpSidecar(src_); auto xmp = getXmpSidecar(src_);
Exiv2::ExifData exif; Exiv2::ExifData exif;
Exiv2::IptcData iptc; Exiv2::IptcData iptc;
Exiv2::moveXmpToExif(xmp, exif);
Exiv2::moveXmpToIptc(xmp, iptc); Exiv2::moveXmpToIptc(xmp, iptc);
Exiv2::moveXmpToExif(xmp, exif);
for (auto &datum : exif) { for (auto &datum : exif) {
dst->exifData()[datum.key()] = datum; dst->exifData()[datum.key()] = datum;
@@ -169,6 +172,12 @@ void Exiv2Metadata::do_merge_xmp(Exiv2::Image *dst) const
for (auto &datum : xmp) { for (auto &datum : xmp) {
dst->xmpData()[datum.key()] = datum; dst->xmpData()[datum.key()] = datum;
} }
} catch (Exiv2::AnyError &exc) {
if (settings->verbose) {
std::cerr << "Error loading metadata from XMP sidecar: "
<< exc.what() << std::endl;
}
}
} }
@@ -288,4 +297,16 @@ Exiv2::XmpData Exiv2Metadata::getXmpSidecar(const Glib::ustring &path)
return ret; return ret;
} }
void Exiv2Metadata::init()
{
Exiv2::XmpParser::initialize();
}
void Exiv2Metadata::cleanup()
{
Exiv2::XmpParser::terminate();
}
} // namespace rtengine } // namespace rtengine

View File

@@ -57,6 +57,9 @@ public:
static Glib::ustring xmpSidecarPath(const Glib::ustring& path); static Glib::ustring xmpSidecarPath(const Glib::ustring& path);
static Exiv2::XmpData getXmpSidecar(const Glib::ustring& path); static Exiv2::XmpData getXmpSidecar(const Glib::ustring& path);
static void init();
static void cleanup();
private: private:
void do_merge_xmp(Exiv2::Image* dst) const; void do_merge_xmp(Exiv2::Image* dst) const;
void import_exif_pairs(Exiv2::ExifData& out) const; void import_exif_pairs(Exiv2::ExifData& out) const;