From d8a3550181d4f4d19de956490a155512895e6587 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert-Andr=C3=A9=20Mauchin?= Date: Sun, 12 Nov 2023 00:09:01 +0100 Subject: [PATCH] Fix build with >=exiv2-0.28.0 - add compatibility for exiv2-0.28 --- librawstudio/rs-exif.cc | 24 ++++++++++++++------ plugins/load-dcraw/ufraw_exiv2.cc | 30 +++++++++++++++---------- plugins/load-gdk/exiv2-colorspace.cpp | 28 +++++++++++++++++++---- plugins/load-png/exiv2-colorspace.cpp | 28 +++++++++++++++++++---- plugins/meta-exiv2/exiv2-metadata.cpp | 32 ++++++++++++++++++--------- 5 files changed, 105 insertions(+), 37 deletions(-) diff --git a/librawstudio/rs-exif.cc b/librawstudio/rs-exif.cc index b22b6356..7a4ad819 100644 --- a/librawstudio/rs-exif.cc +++ b/librawstudio/rs-exif.cc @@ -33,6 +33,16 @@ #include #endif +#if EXIV2_TEST_VERSION(0,28,0) +typedef Exiv2::Error Exiv2Error; +typedef Exiv2::Image::UniquePtr ImagePtr; +typedef Exiv2::Value::UniquePtr ValuePtr; +#else +typedef Exiv2::AnyError Exiv2Error; +typedef Exiv2::Image::AutoPtr ImagePtr; +typedef Exiv2::Value::AutoPtr ValuePtr; +#endif + extern "C" { #include #include "config.h" @@ -128,7 +138,7 @@ rs_exif_load_from_file(const gchar *filename) RS_EXIF_DATA *exif_data; try { - Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(filename); + ImagePtr image = Exiv2::ImageFactory::open(filename); assert(image.get() != 0); image->readMetadata(); @@ -136,7 +146,7 @@ rs_exif_load_from_file(const gchar *filename) exif_data_init(exif_data); } - catch (Exiv2::AnyError& e) + catch (Exiv2Error& e) { g_warning("Could not load EXIF data from file %s", filename); return NULL; @@ -151,7 +161,7 @@ rs_exif_load_from_rawfile(RAWFILE *rawfile) RS_EXIF_DATA *rs_exif_data; try { - Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open( + ImagePtr image = Exiv2::ImageFactory::open( (const Exiv2::byte*) raw_get_map(rawfile), raw_get_filesize(rawfile)); assert(image.get() != 0); @@ -161,7 +171,7 @@ rs_exif_load_from_rawfile(RAWFILE *rawfile) exif_data_init(rs_exif_data); } - catch (Exiv2::AnyError& e) + catch (Exiv2Error& e) { g_warning("Could not load EXIF data"); return NULL; @@ -179,7 +189,7 @@ rs_exif_add_to_file(RS_EXIF_DATA *d, Exiv2::IptcData &iptc_data, const gchar *fi try { Exiv2::ExifData *data = (Exiv2::ExifData *) d; - Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(filename); + ImagePtr image = Exiv2::ImageFactory::open(filename); /* Copy EXIF to XMP */ #if EXIV2_TEST_VERSION(0,17,0) @@ -200,7 +210,7 @@ rs_exif_add_to_file(RS_EXIF_DATA *d, Exiv2::IptcData &iptc_data, const gchar *fi image->setIptcData(iptc_data); image->writeMetadata(); } - catch (Exiv2::AnyError& e) + catch (Exiv2Error& e) { g_warning("Couldn't add EXIF data to %s", filename); } @@ -269,7 +279,7 @@ rs_add_tags_exif(RS_EXIF_DATA *d, const gchar *input_filename) glong items_written; gunichar2 *w = g_utf8_to_utf16(xpkeyw->str, -1, NULL, &items_written, NULL); - Exiv2::Value::AutoPtr v = Exiv2::Value::create(Exiv2::unsignedByte); + ValuePtr v = Exiv2::Value::create(Exiv2::unsignedByte); v->read((const Exiv2::byte*)w, items_written * sizeof(gunichar2), Exiv2::invalidByteOrder); Exiv2::ExifKey key = Exiv2::ExifKey("Exif.Image.XPKeywords"); data->add(key, v.get()); diff --git a/plugins/load-dcraw/ufraw_exiv2.cc b/plugins/load-dcraw/ufraw_exiv2.cc index 873bacc2..79969936 100644 --- a/plugins/load-dcraw/ufraw_exiv2.cc +++ b/plugins/load-dcraw/ufraw_exiv2.cc @@ -18,7 +18,17 @@ #include #include #include +#include #include +#include + +#if EXIV2_TEST_VERSION(0,28,0) + typedef Exiv2::Error Exiv2Error; + typedef Exiv2::Image::UniquePtr ImagePtr; +#else + typedef Exiv2::AnyError Exiv2Error; + typedef Exiv2::Image::AutoPtr ImagePtr; +#endif /* * Helper function to copy a string to a buffer, converting it from @@ -50,7 +60,7 @@ extern "C" int ufraw_exif_read_input(ufraw_data *uf) uf->inputExifBuf = NULL; uf->inputExifBufLen = 0; - Exiv2::Image::AutoPtr image; + ImagePtr image; if (uf->unzippedBuf != NULL) { image = Exiv2::ImageFactory::open( (const Exiv2::byte*)uf->unzippedBuf, uf->unzippedBufLen); @@ -66,11 +76,7 @@ extern "C" int ufraw_exif_read_input(ufraw_data *uf) if (exifData.empty()) { std::string error(uf->filename); error += ": No Exif data found in the file"; -#if EXIV2_TEST_VERSION(0,27,0) - throw Exiv2::Error(Exiv2::kerErrorMessage, error); -#else - throw Exiv2::Error(1, error); -#endif + throw Exiv2Error(Exiv2::ErrorCode::kerErrorMessage, error); } /* List of tag names taken from exiv2's printSummary() in actions.cpp */ @@ -135,7 +141,7 @@ extern "C" int ufraw_exif_read_input(ufraw_data *uf) ufraw_message(UFRAW_SET_LOG, "%s\n", stderror.str().c_str()); return UFRAW_SUCCESS; - } catch (Exiv2::AnyError& e) { + } catch (Exiv2Error& e) { std::cerr.rdbuf(savecerr); std::string s(e.what()); ufraw_message(UFRAW_SET_WARNING, "%s\n", s.c_str()); @@ -155,8 +161,8 @@ static Exiv2::ExifData ufraw_prepare_exifdata(ufraw_data *uf) /* Reset orientation tag since UFRaw already rotates the image */ if ((pos = exifData.findKey(Exiv2::ExifKey("Exif.Image.Orientation"))) != exifData.end()) { - ufraw_message(UFRAW_SET_LOG, "Resetting %s from '%d' to '1'\n", - pos->key().c_str(), pos->value().toLong()); + ufraw_message(UFRAW_SET_LOG, "Resetting %s from '%" PRId64 "' to '1'\n", + pos->key().c_str(), pos->value().toInt64()); pos->setValue("1"); /* 1 = Normal orientation */ } } @@ -327,7 +333,7 @@ extern "C" int ufraw_exif_prepare_output(ufraw_data *uf) ufraw_message(UFRAW_SET_LOG, "%s\n", stderror.str().c_str()); return UFRAW_SUCCESS; - } catch (Exiv2::AnyError& e) { + } catch (Exiv2Error& e) { std::cerr.rdbuf(savecerr); std::string s(e.what()); ufraw_message(UFRAW_SET_WARNING, "%s\n", s.c_str()); @@ -347,7 +353,7 @@ extern "C" int ufraw_exif_write(ufraw_data *uf) char *filename = uf_win32_locale_filename_from_utf8(uf->conf->outputFilename); - Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(filename); + ImagePtr image = Exiv2::ImageFactory::open(filename); uf_win32_locale_filename_free(filename); assert(image.get() != 0); @@ -367,7 +373,7 @@ extern "C" int ufraw_exif_write(ufraw_data *uf) ufraw_message(UFRAW_SET_LOG, "%s\n", stderror.str().c_str()); return UFRAW_SUCCESS; - } catch (Exiv2::AnyError& e) { + } catch (Exiv2Error& e) { std::cerr.rdbuf(savecerr); std::string s(e.what()); ufraw_message(UFRAW_SET_WARNING, "%s\n", s.c_str()); diff --git a/plugins/load-gdk/exiv2-colorspace.cpp b/plugins/load-gdk/exiv2-colorspace.cpp index c2c87fbb..efda2ddc 100644 --- a/plugins/load-gdk/exiv2-colorspace.cpp +++ b/plugins/load-gdk/exiv2-colorspace.cpp @@ -42,6 +42,17 @@ extern "C" { /** INTERFACE **/ using namespace Exiv2; + +#if EXIV2_TEST_VERSION(0,28,0) +typedef Exiv2::Error Exiv2Error; +typedef Image::UniquePtr ImagePtr; +#define EXIV2_TO_INT toInt64 +#else +typedef Exiv2::AnyError Exiv2Error; +typedef Image::AutoPtr ImagePtr; +#define EXIV2_TO_INT toLong +#endif + static void setup_read_icc_profile (j_decompress_ptr cinfo); static boolean read_icc_profile (j_decompress_ptr cinfo, JOCTET **icc_data_ptr, unsigned int *icc_data_len); @@ -155,7 +166,7 @@ jpeg_fail: #endif try { - Image::AutoPtr img = ImageFactory::open(filename); + ImagePtr img = ImageFactory::open(filename); img->readMetadata(); ExifData &exifData = img->exifData(); *gamma_guess = 2.2f; @@ -173,13 +184,13 @@ jpeg_fail: ExifData::const_iterator i; i = exifData.findKey(ExifKey("Exif.Image.BitsPerSample")); if (i != exifData.end()) - if (i->toLong() == 16) + if (i->EXIV2_TO_INT() == 16) *gamma_guess = 1.0f; i = exifData.findKey(ExifKey("Exif.Photo.ColorSpace")); if (i != exifData.end()) { - if (i->toLong() == 1) + if (i->EXIV2_TO_INT() == 1) return rs_color_space_new_singleton("RSSrgb"); } @@ -188,12 +199,21 @@ jpeg_fail: if (i != exifData.end()) { DataBuf buf(i->size()); +#if EXIV2_TEST_VERSION(0,28,0) + i->copy(buf.data(), Exiv2::invalidByteOrder); + if (buf.c_str() && buf.size()) + { + RSIccProfile *icc = rs_icc_profile_new_from_memory((gchar*)buf.c_str(), buf.size(), TRUE); + return rs_color_space_icc_new_from_icc(icc); + } +#else i->copy(buf.pData_, Exiv2::invalidByteOrder); if (buf.pData_ && buf.size_) { RSIccProfile *icc = rs_icc_profile_new_from_memory((gchar*)buf.pData_, buf.size_, TRUE); return rs_color_space_icc_new_from_icc(icc); } +#endif } i = exifData.findKey(ExifKey("Exif.Iop.InteroperabilityIndex")); @@ -204,7 +224,7 @@ jpeg_fail: return rs_color_space_new_singleton("RSAdobeRGB"); } } - } catch (Exiv2::Error& e) { + } catch (Exiv2Error& e) { g_debug("Exiv2 ColorSpace Loader:'%s", e.what()); } g_debug("Exiv2 ColorSpace Loader: Could not determine colorspace, assume sRGB."); diff --git a/plugins/load-png/exiv2-colorspace.cpp b/plugins/load-png/exiv2-colorspace.cpp index c2c87fbb..efda2ddc 100644 --- a/plugins/load-png/exiv2-colorspace.cpp +++ b/plugins/load-png/exiv2-colorspace.cpp @@ -42,6 +42,17 @@ extern "C" { /** INTERFACE **/ using namespace Exiv2; + +#if EXIV2_TEST_VERSION(0,28,0) +typedef Exiv2::Error Exiv2Error; +typedef Image::UniquePtr ImagePtr; +#define EXIV2_TO_INT toInt64 +#else +typedef Exiv2::AnyError Exiv2Error; +typedef Image::AutoPtr ImagePtr; +#define EXIV2_TO_INT toLong +#endif + static void setup_read_icc_profile (j_decompress_ptr cinfo); static boolean read_icc_profile (j_decompress_ptr cinfo, JOCTET **icc_data_ptr, unsigned int *icc_data_len); @@ -155,7 +166,7 @@ jpeg_fail: #endif try { - Image::AutoPtr img = ImageFactory::open(filename); + ImagePtr img = ImageFactory::open(filename); img->readMetadata(); ExifData &exifData = img->exifData(); *gamma_guess = 2.2f; @@ -173,13 +184,13 @@ jpeg_fail: ExifData::const_iterator i; i = exifData.findKey(ExifKey("Exif.Image.BitsPerSample")); if (i != exifData.end()) - if (i->toLong() == 16) + if (i->EXIV2_TO_INT() == 16) *gamma_guess = 1.0f; i = exifData.findKey(ExifKey("Exif.Photo.ColorSpace")); if (i != exifData.end()) { - if (i->toLong() == 1) + if (i->EXIV2_TO_INT() == 1) return rs_color_space_new_singleton("RSSrgb"); } @@ -188,12 +199,21 @@ jpeg_fail: if (i != exifData.end()) { DataBuf buf(i->size()); +#if EXIV2_TEST_VERSION(0,28,0) + i->copy(buf.data(), Exiv2::invalidByteOrder); + if (buf.c_str() && buf.size()) + { + RSIccProfile *icc = rs_icc_profile_new_from_memory((gchar*)buf.c_str(), buf.size(), TRUE); + return rs_color_space_icc_new_from_icc(icc); + } +#else i->copy(buf.pData_, Exiv2::invalidByteOrder); if (buf.pData_ && buf.size_) { RSIccProfile *icc = rs_icc_profile_new_from_memory((gchar*)buf.pData_, buf.size_, TRUE); return rs_color_space_icc_new_from_icc(icc); } +#endif } i = exifData.findKey(ExifKey("Exif.Iop.InteroperabilityIndex")); @@ -204,7 +224,7 @@ jpeg_fail: return rs_color_space_new_singleton("RSAdobeRGB"); } } - } catch (Exiv2::Error& e) { + } catch (Exiv2Error& e) { g_debug("Exiv2 ColorSpace Loader:'%s", e.what()); } g_debug("Exiv2 ColorSpace Loader: Could not determine colorspace, assume sRGB."); diff --git a/plugins/meta-exiv2/exiv2-metadata.cpp b/plugins/meta-exiv2/exiv2-metadata.cpp index b757a575..2aace0b6 100644 --- a/plugins/meta-exiv2/exiv2-metadata.cpp +++ b/plugins/meta-exiv2/exiv2-metadata.cpp @@ -44,6 +44,18 @@ extern "C" { using namespace Exiv2; +#if EXIV2_TEST_VERSION(0,28,0) +typedef Exiv2::Error Exiv2Error; +typedef Image::UniquePtr ImagePtr; +typedef Value::UniquePtr ValuePtr; +#define EXIV2_TO_INT toInt64 +#else +typedef Exiv2::AnyError Exiv2Error; +typedef Image::AutoPtr ImagePtr; +typedef Value::AutoPtr ValuePtr; +#define EXIV2_TO_INT toLong +#endif + static void set_metadata_maker(std::string maker, RSMetadata *meta) { @@ -93,7 +105,7 @@ gboolean exiv2_load_meta_interface(const gchar *service, RAWFILE *rawfile, guint offset, RSMetadata *meta) { try { - Image::AutoPtr img = ImageFactory::open((byte*)raw_get_map(rawfile), raw_get_filesize(rawfile)); + ImagePtr img = ImageFactory::open((byte*)raw_get_map(rawfile), raw_get_filesize(rawfile)); img->readMetadata(); ExifData &exifData = img->exifData(); @@ -120,10 +132,10 @@ exiv2_load_meta_interface(const gchar *service, RAWFILE *rawfile, guint offset, i = orientation(exifData); if (i != exifData.end()) { - std::auto_ptr val = i->getValue(); + ValuePtr val = i->getValue(); if (val->count()) { - switch (val->toLong()) + switch (val->EXIV2_TO_INT()) { case 6: meta->orientation = 90; break; @@ -176,7 +188,7 @@ exiv2_load_meta_interface(const gchar *service, RAWFILE *rawfile, guint offset, #if EXIV2_TEST_VERSION(0,19,0) i = isoSpeed(exifData); if (i != exifData.end()) - meta->iso = i->toLong(); + meta->iso = i->EXIV2_TO_INT(); /* Text based Lens Identifier */ i = lensName(exifData); @@ -184,7 +196,7 @@ exiv2_load_meta_interface(const gchar *service, RAWFILE *rawfile, guint offset, { TypeId type = i->typeId(); if (type == unsignedShort || type == unsignedLong || type == signedShort || type == signedLong || type == unsignedByte || type == signedByte) - meta->lens_id = i->toLong(); + meta->lens_id = i->EXIV2_TO_INT(); else if (type == asciiString || type == string) meta->fixed_lens_identifier = g_strdup(i->toString().c_str()); } @@ -226,7 +238,7 @@ exiv2_load_meta_interface(const gchar *service, RAWFILE *rawfile, guint offset, if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.NikonLd3.MinFocalLength")); if (i != exifData.end()) - meta->lens_min_focal = 5.0 * pow(2.0, i->toLong()/24.0); + meta->lens_min_focal = 5.0 * pow(2.0, i->EXIV2_TO_INT()/24.0); i = exifData.findKey(ExifKey("Exif.NikonLd1.MaxFocalLength")); if (i == exifData.end()) @@ -234,7 +246,7 @@ exiv2_load_meta_interface(const gchar *service, RAWFILE *rawfile, guint offset, if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.NikonLd3.MaxFocalLength")); if (i != exifData.end()) - meta->lens_max_focal = 5.0 * pow(2.0, i->toLong()/24.0); + meta->lens_max_focal = 5.0 * pow(2.0, i->EXIV2_TO_INT()/24.0); i = exifData.findKey(ExifKey("Exif.NikonLd1.MaxApertureAtMinFocal")); if (i == exifData.end()) @@ -242,7 +254,7 @@ exiv2_load_meta_interface(const gchar *service, RAWFILE *rawfile, guint offset, if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.NikonLd3.MaxApertureAtMinFocal")); if (i != exifData.end()) - meta->lens_min_aperture = i->toLong()/12.0; + meta->lens_min_aperture = i->EXIV2_TO_INT()/12.0; i = exifData.findKey(ExifKey("Exif.NikonLd1.MaxApertureAtMaxFocal")); if (i == exifData.end()) @@ -250,7 +262,7 @@ exiv2_load_meta_interface(const gchar *service, RAWFILE *rawfile, guint offset, if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.NikonLd3.MaxApertureAtMaxFocal")); if (i != exifData.end()) - meta->lens_max_aperture = i->toLong()/12.0; + meta->lens_max_aperture = i->EXIV2_TO_INT()/12.0; /* Fuji */ i = exifData.findKey(ExifKey("Exif.Fujifilm.MinFocalLength")); @@ -262,7 +274,7 @@ exiv2_load_meta_interface(const gchar *service, RAWFILE *rawfile, guint offset, return TRUE; } - } catch (Exiv2::Error& e) { + } catch (Exiv2Error& e) { g_debug("Exiv2 Metadata Loader:'%s'", e.what()); } return FALSE; -- 2.41.0