diff options
author | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2015-05-18 10:13:48 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2015-05-19 11:29:15 +0000 |
commit | 07882f73e8028577d9223b65a5abd6ffed5d2b35 (patch) | |
tree | fa6a2bca351dca8f1ae0b087901f0d1dd3efd1b2 /src/quick/items | |
parent | 0ace63da65a222873ecf4e966afe88afb89a25f8 (diff) |
Optionally apply orientation on images
Adds the option to follow EXIF orientation. This was previuosly
automatically applied to TIFF images, but not JPEGs except in
Qt 5.4.1.
[ChangeLog][Image] An autoTransform property has been added to
control whether metadata image transforms such as EXIF orientation
are automatically applied. By default it enabled for TIFF images
and disabled for JPEG.
Change-Id: I8a4cf204985b2a7d158a0e046e52db7cda970d20
Task-number: QTBUG-37946
Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
Diffstat (limited to 'src/quick/items')
-rw-r--r-- | src/quick/items/qquickimage.cpp | 11 | ||||
-rw-r--r-- | src/quick/items/qquickimage_p.h | 2 | ||||
-rw-r--r-- | src/quick/items/qquickimagebase.cpp | 27 | ||||
-rw-r--r-- | src/quick/items/qquickimagebase_p.h | 4 | ||||
-rw-r--r-- | src/quick/items/qquickimagebase_p_p.h | 6 | ||||
-rw-r--r-- | src/quick/items/qquickitemsmodule.cpp | 1 |
6 files changed, 49 insertions, 2 deletions
diff --git a/src/quick/items/qquickimage.cpp b/src/quick/items/qquickimage.cpp index a278fb72a2..f0f17551b7 100644 --- a/src/quick/items/qquickimage.cpp +++ b/src/quick/items/qquickimage.cpp @@ -152,6 +152,7 @@ QQuickImagePrivate::QQuickImagePrivate() QQuickImage::QQuickImage(QQuickItem *parent) : QQuickImageBase(*(new QQuickImagePrivate), parent) { + connect(this, SIGNAL(autoTransformBaseChanged()), SIGNAL(autoTransformChanged())); } QQuickImage::QQuickImage(QQuickImagePrivate &dd, QQuickItem *parent) @@ -820,4 +821,14 @@ void QQuickImage::setMipmap(bool use) update(); } +/*! + \qmlproperty bool QtQuick::Image::autoTransform + \since 5.5 + + This property holds whether the image should automatically apply + image transformation metadata such as EXIF orientation. + + By default, this property is set to false. + */ + QT_END_NAMESPACE diff --git a/src/quick/items/qquickimage_p.h b/src/quick/items/qquickimage_p.h index efe83e7026..5b1aea5940 100644 --- a/src/quick/items/qquickimage_p.h +++ b/src/quick/items/qquickimage_p.h @@ -53,6 +53,7 @@ class Q_AUTOTEST_EXPORT QQuickImage : public QQuickImageBase Q_PROPERTY(HAlignment horizontalAlignment READ horizontalAlignment WRITE setHorizontalAlignment NOTIFY horizontalAlignmentChanged) Q_PROPERTY(VAlignment verticalAlignment READ verticalAlignment WRITE setVerticalAlignment NOTIFY verticalAlignmentChanged) Q_PROPERTY(bool mipmap READ mipmap WRITE setMipmap NOTIFY mipmapChanged REVISION 1) + Q_PROPERTY(bool autoTransform READ autoTransform WRITE setAutoTransform NOTIFY autoTransformChanged REVISION 2) public: QQuickImage(QQuickItem *parent=0); @@ -93,6 +94,7 @@ Q_SIGNALS: void horizontalAlignmentChanged(HAlignment alignment); void verticalAlignmentChanged(VAlignment alignment); Q_REVISION(1) void mipmapChanged(bool); + Q_REVISION(2) void autoTransformChanged(); private Q_SLOTS: void invalidateSceneGraph(); diff --git a/src/quick/items/qquickimagebase.cpp b/src/quick/items/qquickimagebase.cpp index b54c34765f..8fba6e3d12 100644 --- a/src/quick/items/qquickimagebase.cpp +++ b/src/quick/items/qquickimagebase.cpp @@ -195,6 +195,10 @@ void QQuickImageBase::load() d->oldSourceSize = sourceSize(); emit sourceSizeChanged(); } + if (autoTransform() != d->oldAutoTransform) { + d->oldAutoTransform = autoTransform(); + emit autoTransformBaseChanged(); + } update(); } else { @@ -223,7 +227,7 @@ void QQuickImageBase::load() resolve2xLocalFile(d->url, targetDevicePixelRatio, &loadUrl, &d->devicePixelRatio); } - d->pix.load(qmlEngine(this), loadUrl, d->sourcesize * d->devicePixelRatio, options); + d->pix.load(qmlEngine(this), loadUrl, d->sourcesize * d->devicePixelRatio, options, d->autoTransform); if (d->pix.isLoading()) { if (d->progress != 0.0) { @@ -278,6 +282,10 @@ void QQuickImageBase::requestFinished() d->oldSourceSize = sourceSize(); emit sourceSizeChanged(); } + if (autoTransform() != d->oldAutoTransform) { + d->oldAutoTransform = autoTransform(); + emit autoTransformBaseChanged(); + } update(); } @@ -368,4 +376,21 @@ void QQuickImageBase::resolve2xLocalFile(const QUrl &url, qreal targetDevicePixe *sourceDevicePixelRatio = qreal(2.0); } +bool QQuickImageBase::autoTransform() const +{ + Q_D(const QQuickImageBase); + if (d->autoTransform == UsePluginDefault) + return d->pix.autoTransform() == ApplyTransform; + return d->autoTransform == ApplyTransform; +} + +void QQuickImageBase::setAutoTransform(bool transform) +{ + Q_D(QQuickImageBase); + if (d->autoTransform != UsePluginDefault && transform == (d->autoTransform == ApplyTransform)) + return; + d->autoTransform = transform ? ApplyTransform : DoNotApplyTransform; + emit autoTransformBaseChanged(); +} + QT_END_NAMESPACE diff --git a/src/quick/items/qquickimagebase_p.h b/src/quick/items/qquickimagebase_p.h index 978004f8fd..d43822bebe 100644 --- a/src/quick/items/qquickimagebase_p.h +++ b/src/quick/items/qquickimagebase_p.h @@ -78,6 +78,9 @@ public: virtual void setMirror(bool mirror); bool mirror() const; + virtual void setAutoTransform(bool transform); + bool autoTransform() const; + void resolve2xLocalFile(const QUrl &url, qreal targetDevicePixelRatio, QUrl *sourceUrl, qreal *sourceDevicePixelRatio); Q_SIGNALS: @@ -88,6 +91,7 @@ Q_SIGNALS: void asynchronousChanged(); void cacheChanged(); void mirrorChanged(); + void autoTransformBaseChanged(); protected: virtual void load(); diff --git a/src/quick/items/qquickimagebase_p_p.h b/src/quick/items/qquickimagebase_p_p.h index ebdf352e4e..cffe709116 100644 --- a/src/quick/items/qquickimagebase_p_p.h +++ b/src/quick/items/qquickimagebase_p_p.h @@ -62,9 +62,11 @@ public: : status(QQuickImageBase::Null), progress(0.0), devicePixelRatio(1.0), + autoTransform(UsePluginDefault), async(false), cache(true), - mirror(false) + mirror(false), + oldAutoTransform(false) { } @@ -75,9 +77,11 @@ public: QSize sourcesize; QSize oldSourceSize; qreal devicePixelRatio; + AutoTransform autoTransform; bool async : 1; bool cache : 1; bool mirror: 1; + bool oldAutoTransform : 1; }; QT_END_NAMESPACE diff --git a/src/quick/items/qquickitemsmodule.cpp b/src/quick/items/qquickitemsmodule.cpp index 6c342cc491..8b4723f340 100644 --- a/src/quick/items/qquickitemsmodule.cpp +++ b/src/quick/items/qquickitemsmodule.cpp @@ -267,6 +267,7 @@ static void qt_quickitems_defineModule(const char *uri, int major, int minor) qmlRegisterUncreatableType<QQuickOpenGLInfo>(uri, 2, 4,"OpenGLInfo", QQuickOpenGLInfo::tr("OpenGLInfo is only available via attached properties")); qmlRegisterType<QQuickPinchArea, 1>(uri, 2, 5,"PinchArea"); + qmlRegisterType<QQuickImage, 2>(uri, 2, 5,"Image"); } static void initResources() |