rawstudio/rawstudio-2.0+20210602git.c140a5e-exiv2-0.28.3.patch

457 lines
16 KiB
Diff

From d8a3550181d4f4d19de956490a155512895e6587 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Robert-Andr=C3=A9=20Mauchin?= <zebob.m@gmail.com>
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 <exiv2/convert.hpp>
#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 <rawstudio.h>
#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 <exiv2/exiv2.hpp>
#include <sstream>
#include <cassert>
+#include <cinttypes>
#include <iostream>
+#include <memory>
+
+#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<Exiv2::Value> 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