forked from pool/gwenview5
1bf84ee124
- Fix build with Exiv2 0.27 Add 0001-Compile-more-files-with-enabled-exceptions-required-.patch Add 0002-Use-forward-declaration-for-Exiv2-Image-port-to-std-.patch OBS-URL: https://build.opensuse.org/request/show/662082 OBS-URL: https://build.opensuse.org/package/show/KDE:Applications/gwenview5?expand=0&rev=122
456 lines
14 KiB
Diff
456 lines
14 KiB
Diff
From 248b358495a3e5488fed4443d0dc135fbf604302 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Stefan=20Br=C3=BCns?= <stefan.bruens@rwth-aachen.de>
|
|
Date: Sun, 30 Dec 2018 02:46:28 +0100
|
|
Subject: [PATCH 2/2] Use forward declaration for Exiv2::Image, port to
|
|
std::unique_ptr
|
|
|
|
Instead of the Exiv2::Image::AutoPtr typedef just use a forward declaration
|
|
for Exiv2::Image, and use std::unique_ptr instead of std::auto_ptr.
|
|
|
|
The forward declaration avoids pulling in Exiv2 declarations everywhere,
|
|
e.g. via document.h.
|
|
|
|
Although it would be possible to use std::auto_ptr, unique_ptr is
|
|
preferable for two reasons:
|
|
- ownership transfer is explicit (std::move, release()/reset())
|
|
- Exiv2 0.28 will use std::unique_ptr as well, i.e. the code is forward
|
|
compatible.
|
|
---
|
|
lib/cms/cmsprofile.cpp | 3 +++
|
|
lib/cms/cmsprofile.h | 8 +++++---
|
|
lib/document/abstractdocumentimpl.cpp | 5 +++--
|
|
lib/document/abstractdocumentimpl.h | 7 ++++++-
|
|
lib/document/document.cpp | 7 +++++--
|
|
lib/document/document.h | 11 ++++++++---
|
|
lib/document/document_p.h | 10 +++++++++-
|
|
lib/document/loadingdocumentimpl.cpp | 7 +++++--
|
|
lib/exiv2imageloader.cpp | 13 ++++++-------
|
|
lib/exiv2imageloader.h | 11 ++++++++---
|
|
lib/jpegcontent.cpp | 10 +++++-----
|
|
lib/timeutils.cpp | 8 +++++---
|
|
tests/auto/cmsprofiletest.cpp | 4 ++--
|
|
tests/auto/imagemetainfomodeltest.cpp | 5 ++++-
|
|
14 files changed, 74 insertions(+), 35 deletions(-)
|
|
|
|
diff --git a/lib/cms/cmsprofile.cpp b/lib/cms/cmsprofile.cpp
|
|
index 188b90a4..7d2b753e 100644
|
|
--- a/lib/cms/cmsprofile.cpp
|
|
+++ b/lib/cms/cmsprofile.cpp
|
|
@@ -42,6 +42,9 @@ extern "C" {
|
|
// lcms
|
|
#include <lcms2.h>
|
|
|
|
+// Exiv2
|
|
+#include <exiv2/exiv2.hpp>
|
|
+
|
|
// X11
|
|
#ifdef HAVE_X11
|
|
#include <X11/Xlib.h>
|
|
diff --git a/lib/cms/cmsprofile.h b/lib/cms/cmsprofile.h
|
|
index a2a38a87..41abe97c 100644
|
|
--- a/lib/cms/cmsprofile.h
|
|
+++ b/lib/cms/cmsprofile.h
|
|
@@ -29,12 +29,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA
|
|
#include <QExplicitlySharedDataPointer>
|
|
#include <QSharedData>
|
|
|
|
-// Exiv2
|
|
-#include <exiv2/image.hpp>
|
|
-
|
|
class QByteArray;
|
|
class QString;
|
|
|
|
+namespace Exiv2
|
|
+{
|
|
+class Image;
|
|
+}
|
|
+
|
|
typedef void* cmsHPROFILE;
|
|
|
|
namespace Gwenview
|
|
diff --git a/lib/document/abstractdocumentimpl.cpp b/lib/document/abstractdocumentimpl.cpp
|
|
index d841ae5f..d3d0002c 100644
|
|
--- a/lib/document/abstractdocumentimpl.cpp
|
|
+++ b/lib/document/abstractdocumentimpl.cpp
|
|
@@ -21,6 +21,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
// Self
|
|
#include "abstractdocumentimpl.h"
|
|
|
|
+#include <exiv2/exiv2.hpp>
|
|
// Qt
|
|
|
|
// KDE
|
|
@@ -77,9 +78,9 @@ void AbstractDocumentImpl::setDocumentKind(MimeTypeUtils::Kind kind)
|
|
d->mDocument->setKind(kind);
|
|
}
|
|
|
|
-void AbstractDocumentImpl::setDocumentExiv2Image(Exiv2::Image::AutoPtr image)
|
|
+void AbstractDocumentImpl::setDocumentExiv2Image(std::unique_ptr<Exiv2::Image> image)
|
|
{
|
|
- d->mDocument->setExiv2Image(image);
|
|
+ d->mDocument->setExiv2Image(std::move(image));
|
|
}
|
|
|
|
void AbstractDocumentImpl::setDocumentDownSampledImage(const QImage& image, int invertedZoom)
|
|
diff --git a/lib/document/abstractdocumentimpl.h b/lib/document/abstractdocumentimpl.h
|
|
index 1f427e60..86e6bfd2 100644
|
|
--- a/lib/document/abstractdocumentimpl.h
|
|
+++ b/lib/document/abstractdocumentimpl.h
|
|
@@ -34,6 +34,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
class QImage;
|
|
class QRect;
|
|
|
|
+namespace Exiv2
|
|
+{
|
|
+ class Image;
|
|
+}
|
|
+
|
|
namespace Gwenview
|
|
{
|
|
|
|
@@ -108,7 +113,7 @@ protected:
|
|
void setDocumentImageSize(const QSize& size);
|
|
void setDocumentKind(MimeTypeUtils::Kind);
|
|
void setDocumentFormat(const QByteArray& format);
|
|
- void setDocumentExiv2Image(Exiv2::Image::AutoPtr);
|
|
+ void setDocumentExiv2Image(std::unique_ptr<Exiv2::Image>);
|
|
void setDocumentDownSampledImage(const QImage&, int invertedZoom);
|
|
void setDocumentCmsProfile(Cms::Profile::Ptr profile);
|
|
void setDocumentErrorString(const QString&);
|
|
diff --git a/lib/document/document.cpp b/lib/document/document.cpp
|
|
index 18756700..afa9ed03 100644
|
|
--- a/lib/document/document.cpp
|
|
+++ b/lib/document/document.cpp
|
|
@@ -31,6 +31,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
#include <KLocalizedString>
|
|
#include <KJobUiDelegate>
|
|
|
|
+// Exiv2
|
|
+#include <exiv2/exiv2.hpp>
|
|
+
|
|
// Local
|
|
#include "documentjob.h"
|
|
#include "emptydocumentimpl.h"
|
|
@@ -388,9 +391,9 @@ AbstractDocumentEditor* Document::editor()
|
|
return d->mImpl->editor();
|
|
}
|
|
|
|
-void Document::setExiv2Image(Exiv2::Image::AutoPtr image)
|
|
+void Document::setExiv2Image(std::unique_ptr<Exiv2::Image> image)
|
|
{
|
|
- d->mExiv2Image = image;
|
|
+ d->mExiv2Image = std::move(image);
|
|
d->mImageMetaInfoModel.setExiv2Image(d->mExiv2Image.get());
|
|
emit metaInfoUpdated();
|
|
}
|
|
diff --git a/lib/document/document.h b/lib/document/document.h
|
|
index c0bb454b..4b40a6e1 100644
|
|
--- a/lib/document/document.h
|
|
+++ b/lib/document/document.h
|
|
@@ -22,8 +22,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
#include <lib/gwenviewlib_export.h>
|
|
|
|
-#include <string.h>
|
|
-#include <exiv2/image.hpp>
|
|
+// STL
|
|
+#include <memory>
|
|
|
|
// Qt
|
|
#include <QObject>
|
|
@@ -43,6 +43,11 @@ class QUndoStack;
|
|
class KJob;
|
|
class QUrl;
|
|
|
|
+namespace Exiv2
|
|
+{
|
|
+ class Image;
|
|
+}
|
|
+
|
|
namespace Gwenview
|
|
{
|
|
|
|
@@ -235,7 +240,7 @@ private:
|
|
void setKind(MimeTypeUtils::Kind);
|
|
void setFormat(const QByteArray&);
|
|
void setSize(const QSize&);
|
|
- void setExiv2Image(Exiv2::Image::AutoPtr);
|
|
+ void setExiv2Image(std::unique_ptr<Exiv2::Image>);
|
|
void setDownSampledImage(const QImage&, int invertedZoom);
|
|
void switchToImpl(AbstractDocumentImpl* impl);
|
|
void setErrorString(const QString&);
|
|
diff --git a/lib/document/document_p.h b/lib/document/document_p.h
|
|
index 78e0ac6e..4de25f15 100644
|
|
--- a/lib/document/document_p.h
|
|
+++ b/lib/document/document_p.h
|
|
@@ -21,6 +21,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA
|
|
#ifndef DOCUMENT_P_H
|
|
#define DOCUMENT_P_H
|
|
|
|
+// STL
|
|
+#include <memory>
|
|
+
|
|
// Local
|
|
#include <imagemetainfomodel.h>
|
|
#include <document/documentjob.h>
|
|
@@ -34,6 +37,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA
|
|
#include <QUndoStack>
|
|
#include <QPointer>
|
|
|
|
+namespace Exiv2
|
|
+{
|
|
+ class Image;
|
|
+}
|
|
+
|
|
namespace Gwenview
|
|
{
|
|
|
|
@@ -54,7 +62,7 @@ struct DocumentPrivate
|
|
QSize mSize;
|
|
QImage mImage;
|
|
QMap<int, QImage> mDownSampledImageMap;
|
|
- Exiv2::Image::AutoPtr mExiv2Image;
|
|
+ std::unique_ptr<Exiv2::Image> mExiv2Image;
|
|
MimeTypeUtils::Kind mKind;
|
|
QByteArray mFormat;
|
|
ImageMetaInfoModel mImageMetaInfoModel;
|
|
diff --git a/lib/document/loadingdocumentimpl.cpp b/lib/document/loadingdocumentimpl.cpp
|
|
index 07675783..766a1831 100644
|
|
--- a/lib/document/loadingdocumentimpl.cpp
|
|
+++ b/lib/document/loadingdocumentimpl.cpp
|
|
@@ -24,6 +24,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
// STL
|
|
#include <memory>
|
|
|
|
+// Exiv2
|
|
+#include <exiv2/exiv2.hpp>
|
|
+
|
|
// Qt
|
|
#include <QBuffer>
|
|
#include <QByteArray>
|
|
@@ -100,7 +103,7 @@ struct LoadingDocumentImplPrivate
|
|
QByteArray mData;
|
|
QByteArray mFormat;
|
|
QSize mImageSize;
|
|
- Exiv2::Image::AutoPtr mExiv2Image;
|
|
+ std::unique_ptr<Exiv2::Image> mExiv2Image;
|
|
std::unique_ptr<JpegContent> mJpegContent;
|
|
QImage mImage;
|
|
Cms::Profile::Ptr mCmsProfile;
|
|
@@ -486,7 +489,7 @@ void LoadingDocumentImpl::slotMetaInfoLoaded()
|
|
|
|
setDocumentFormat(d->mFormat);
|
|
setDocumentImageSize(d->mImageSize);
|
|
- setDocumentExiv2Image(d->mExiv2Image);
|
|
+ setDocumentExiv2Image(std::move(d->mExiv2Image));
|
|
setDocumentCmsProfile(d->mCmsProfile);
|
|
|
|
d->mMetaInfoLoaded = true;
|
|
diff --git a/lib/exiv2imageloader.cpp b/lib/exiv2imageloader.cpp
|
|
index f2830f81..f13dff7a 100644
|
|
--- a/lib/exiv2imageloader.cpp
|
|
+++ b/lib/exiv2imageloader.cpp
|
|
@@ -29,8 +29,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
// KDE
|
|
|
|
// Exiv2
|
|
-#include <exiv2/error.hpp>
|
|
-#include <exiv2/types.hpp>
|
|
+#include <exiv2/exiv2.hpp>
|
|
|
|
// Local
|
|
|
|
@@ -39,7 +38,7 @@ namespace Gwenview
|
|
|
|
struct Exiv2ImageLoaderPrivate
|
|
{
|
|
- Exiv2::Image::AutoPtr mImage;
|
|
+ std::unique_ptr<Exiv2::Image> mImage;
|
|
QString mErrorMessage;
|
|
};
|
|
|
|
@@ -57,7 +56,7 @@ bool Exiv2ImageLoader::load(const QString& filePath)
|
|
{
|
|
QByteArray filePathByteArray = QFile::encodeName(filePath);
|
|
try {
|
|
- d->mImage = Exiv2::ImageFactory::open(filePathByteArray.constData());
|
|
+ d->mImage.reset(Exiv2::ImageFactory::open(filePathByteArray.constData()).release());
|
|
d->mImage->readMetadata();
|
|
} catch (const Exiv2::Error& error) {
|
|
d->mErrorMessage = QString::fromUtf8(error.what());
|
|
@@ -69,7 +68,7 @@ bool Exiv2ImageLoader::load(const QString& filePath)
|
|
bool Exiv2ImageLoader::load(const QByteArray& data)
|
|
{
|
|
try {
|
|
- d->mImage = Exiv2::ImageFactory::open((unsigned char*)data.constData(), data.size());
|
|
+ d->mImage.reset(Exiv2::ImageFactory::open((unsigned char*)data.constData(), data.size()).release());
|
|
d->mImage->readMetadata();
|
|
} catch (const Exiv2::Error& error) {
|
|
d->mErrorMessage = QString::fromUtf8(error.what());
|
|
@@ -83,9 +82,9 @@ QString Exiv2ImageLoader::errorMessage() const
|
|
return d->mErrorMessage;
|
|
}
|
|
|
|
-Exiv2::Image::AutoPtr Exiv2ImageLoader::popImage()
|
|
+std::unique_ptr<Exiv2::Image> Exiv2ImageLoader::popImage()
|
|
{
|
|
- return d->mImage;
|
|
+ return std::move(d->mImage);
|
|
}
|
|
|
|
} // namespace
|
|
diff --git a/lib/exiv2imageloader.h b/lib/exiv2imageloader.h
|
|
index 57ef24d2..12a45b68 100644
|
|
--- a/lib/exiv2imageloader.h
|
|
+++ b/lib/exiv2imageloader.h
|
|
@@ -23,13 +23,18 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
#include <lib/gwenviewlib_export.h>
|
|
|
|
+// STL
|
|
+#include <memory>
|
|
+
|
|
// Qt
|
|
|
|
// KDE
|
|
|
|
// Exiv2
|
|
-#include <string.h>
|
|
-#include <exiv2/image.hpp>
|
|
+namespace Exiv2
|
|
+{
|
|
+ class Image;
|
|
+}
|
|
|
|
// Local
|
|
|
|
@@ -54,7 +59,7 @@ public:
|
|
bool load(const QString&);
|
|
bool load(const QByteArray&);
|
|
QString errorMessage() const;
|
|
- Exiv2::Image::AutoPtr popImage();
|
|
+ std::unique_ptr<Exiv2::Image> popImage();
|
|
|
|
private:
|
|
Exiv2ImageLoaderPrivate* const d;
|
|
diff --git a/lib/jpegcontent.cpp b/lib/jpegcontent.cpp
|
|
index bb810dd4..a8cf909f 100644
|
|
--- a/lib/jpegcontent.cpp
|
|
+++ b/lib/jpegcontent.cpp
|
|
@@ -42,8 +42,7 @@ extern "C" {
|
|
#include <KLocalizedString>
|
|
|
|
// Exiv2
|
|
-#include <exiv2/exif.hpp>
|
|
-#include <exiv2/image.hpp>
|
|
+#include <exiv2/exiv2.hpp>
|
|
|
|
// Local
|
|
#include "jpegerrormanager.h"
|
|
@@ -216,12 +215,12 @@ bool JpegContent::load(const QString& path)
|
|
|
|
bool JpegContent::loadFromData(const QByteArray& data)
|
|
{
|
|
- Exiv2::Image::AutoPtr image;
|
|
+ std::unique_ptr<Exiv2::Image> image;
|
|
Exiv2ImageLoader loader;
|
|
if (!loader.load(data)) {
|
|
qCritical() << "Could not load image with Exiv2, reported error:" << loader.errorMessage();
|
|
}
|
|
- image = loader.popImage();
|
|
+ image.reset(loader.popImage().release());
|
|
|
|
return loadFromData(data, image.get());
|
|
}
|
|
@@ -603,7 +602,8 @@ bool JpegContent::save(QIODevice* device)
|
|
d->mPendingTransformation = false;
|
|
}
|
|
|
|
- Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open((unsigned char*)d->mRawData.data(), d->mRawData.size());
|
|
+ std::unique_ptr<Exiv2::Image> image;
|
|
+ image.reset(Exiv2::ImageFactory::open((unsigned char*)d->mRawData.data(), d->mRawData.size()).release());
|
|
|
|
// Store Exif info
|
|
image->setExifData(d->mExifData);
|
|
diff --git a/lib/timeutils.cpp b/lib/timeutils.cpp
|
|
index 9e8836a9..3c519098 100644
|
|
--- a/lib/timeutils.cpp
|
|
+++ b/lib/timeutils.cpp
|
|
@@ -21,6 +21,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA
|
|
// Self
|
|
#include "timeutils.h"
|
|
|
|
+// STL
|
|
+#include <memory>
|
|
+
|
|
// Qt
|
|
#include <QFile>
|
|
#include <QDateTime>
|
|
@@ -30,8 +33,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA
|
|
#include <KFileItem>
|
|
|
|
// Exiv2
|
|
-#include <exiv2/exif.hpp>
|
|
-#include <exiv2/image.hpp>
|
|
+#include <exiv2/exiv2.hpp>
|
|
|
|
// Local
|
|
#include <lib/exiv2imageloader.h>
|
|
@@ -92,7 +94,7 @@ struct CacheItem
|
|
if (!loader.load(path)) {
|
|
return false;
|
|
}
|
|
- Exiv2::Image::AutoPtr img = loader.popImage();
|
|
+ std::unique_ptr<Exiv2::Image> img(loader.popImage().release());
|
|
try {
|
|
Exiv2::ExifData exifData = img->exifData();
|
|
if (exifData.empty()) {
|
|
diff --git a/tests/auto/cmsprofiletest.cpp b/tests/auto/cmsprofiletest.cpp
|
|
index 4efc441b..f4c7f9e5 100644
|
|
--- a/tests/auto/cmsprofiletest.cpp
|
|
+++ b/tests/auto/cmsprofiletest.cpp
|
|
@@ -69,7 +69,7 @@ void CmsProfileTest::testLoadFromImageData_data()
|
|
void CmsProfileTest::testLoadFromExiv2Image()
|
|
{
|
|
QFETCH(QString, fileName);
|
|
- Exiv2::Image::AutoPtr image;
|
|
+ std::unique_ptr<Exiv2::Image> image;
|
|
{
|
|
QByteArray data;
|
|
QString path = pathForTestFile(fileName);
|
|
@@ -80,7 +80,7 @@ void CmsProfileTest::testLoadFromExiv2Image()
|
|
|
|
Exiv2ImageLoader loader;
|
|
QVERIFY(loader.load(data));
|
|
- image = loader.popImage();
|
|
+ image.reset(loader.popImage().release());
|
|
}
|
|
Cms::Profile::Ptr ptr = Cms::Profile::loadFromExiv2Image(image.get());
|
|
QVERIFY(!ptr.isNull());
|
|
diff --git a/tests/auto/imagemetainfomodeltest.cpp b/tests/auto/imagemetainfomodeltest.cpp
|
|
index e3ec8d30..2e569dba 100644
|
|
--- a/tests/auto/imagemetainfomodeltest.cpp
|
|
+++ b/tests/auto/imagemetainfomodeltest.cpp
|
|
@@ -17,6 +17,9 @@ along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
+
|
|
+#include <memory>
|
|
+
|
|
// Qt
|
|
|
|
// KDE
|
|
@@ -46,7 +49,7 @@ void ImageMetaInfoModelTest::testCatchExiv2Errors()
|
|
data = file.readAll();
|
|
}
|
|
|
|
- Exiv2::Image::AutoPtr image;
|
|
+ std::unique_ptr<Exiv2::Image> image;
|
|
{
|
|
Exiv2ImageLoader loader;
|
|
QVERIFY(loader.load(data));
|
|
--
|
|
2.20.1
|
|
|