| |
@@ -0,0 +1,110 @@
|
| |
+ From b1243b8c9ea0add1b7548428c8b0fcb8ee3ac71a Mon Sep 17 00:00:00 2001
|
| |
+ From: Andy Shaw <andy.shaw@qt.io>
|
| |
+ Date: Wed, 14 Mar 2018 09:42:03 +0100
|
| |
+ Subject: [PATCH] Scale up SVG images if source size is larger than original
|
| |
+ size
|
| |
+
|
| |
+ Since SVG images can be scaled up without any loss of quality then we
|
| |
+ should allow this to happen even though it is not done for other image
|
| |
+ formats. This restores the 5.9.x behavior for SVG images.
|
| |
+
|
| |
+ Additionally the manual test is updated to showcase an embedded image
|
| |
+ inside a SVG one to indicate this is continuing to work as before too.
|
| |
+
|
| |
+ Task-number: QTBUG-67019
|
| |
+ Change-Id: Ia719899937f8146e8fab50aa85adf18e2f79aa98
|
| |
+ Reviewed-by: Evangelos Foutras <evangelos@foutrelis.com>
|
| |
+ Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
|
| |
+ ---
|
| |
+ src/quick/util/qquickimageprovider.cpp | 9 ++++++---
|
| |
+ tests/auto/quick/qquickimage/tst_qquickimage.cpp | 6 ++++++
|
| |
+ tests/manual/imagehandler/embeddedimage.svg | 10 ++++++++++
|
| |
+ tests/manual/imagehandler/heart.png | Bin 0 -> 15194 bytes
|
| |
+ tests/manual/imagehandler/main.qml | 6 +++++-
|
| |
+ 5 files changed, 27 insertions(+), 4 deletions(-)
|
| |
+ create mode 100644 tests/manual/imagehandler/embeddedimage.svg
|
| |
+ create mode 100644 tests/manual/imagehandler/heart.png
|
| |
+
|
| |
+ diff --git a/src/quick/util/qquickimageprovider.cpp b/src/quick/util/qquickimageprovider.cpp
|
| |
+ index 1a13f6395a..2bb2af4fc0 100644
|
| |
+ --- a/src/quick/util/qquickimageprovider.cpp
|
| |
+ +++ b/src/quick/util/qquickimageprovider.cpp
|
| |
+ @@ -680,15 +680,18 @@ QSize QQuickImageProviderWithOptions::loadSize(const QSize &originalSize, const
|
| |
+ return res;
|
| |
+
|
| |
+ const bool preserveAspectCropOrFit = options.preserveAspectRatioCrop() || options.preserveAspectRatioFit();
|
| |
+ + const bool formatIsSvg = (format == "svg" || format == "svgz");
|
| |
+
|
| |
+ - if (!preserveAspectCropOrFit && (format == "svg" || format == "svgz") && !requestedSize.isEmpty())
|
| |
+ + if (!preserveAspectCropOrFit && formatIsSvg && !requestedSize.isEmpty())
|
| |
+ return requestedSize;
|
| |
+
|
| |
+ qreal ratio = 0.0;
|
| |
+ - if (requestedSize.width() && (preserveAspectCropOrFit || requestedSize.width() < originalSize.width())) {
|
| |
+ + if (requestedSize.width() && (preserveAspectCropOrFit || formatIsSvg ||
|
| |
+ + requestedSize.width() < originalSize.width())) {
|
| |
+ ratio = qreal(requestedSize.width()) / originalSize.width();
|
| |
+ }
|
| |
+ - if (requestedSize.height() && (preserveAspectCropOrFit || requestedSize.height() < originalSize.height())) {
|
| |
+ + if (requestedSize.height() && (preserveAspectCropOrFit || formatIsSvg ||
|
| |
+ + requestedSize.height() < originalSize.height())) {
|
| |
+ qreal hr = qreal(requestedSize.height()) / originalSize.height();
|
| |
+ if (ratio == 0.0)
|
| |
+ ratio = hr;
|
| |
+ diff --git a/tests/auto/quick/qquickimage/tst_qquickimage.cpp b/tests/auto/quick/qquickimage/tst_qquickimage.cpp
|
| |
+ index 3613ba6d87..d1f46a3912 100644
|
| |
+ --- a/tests/auto/quick/qquickimage/tst_qquickimage.cpp
|
| |
+ +++ b/tests/auto/quick/qquickimage/tst_qquickimage.cpp
|
| |
+ @@ -445,6 +445,12 @@ void tst_qquickimage::svg()
|
| |
+ // Due to aspect ratio calculations we can't get a precise
|
| |
+ // check for all setups, so we allow a small margin of error
|
| |
+ QVERIFY(qAbs(obj->height() - 141) < 1);
|
| |
+ +
|
| |
+ + // Setting it to a size bigger than the actual file, SVG formats
|
| |
+ + // can scale up although other image formats cannot
|
| |
+ + obj->setSourceSize(QSize(800,0));
|
| |
+ + QCOMPARE(obj->width(), 800.0);
|
| |
+ + QVERIFY(qAbs(obj->height() - 1131) < 1);
|
| |
+ delete obj;
|
| |
+ }
|
| |
+
|
| |
+ diff --git a/tests/manual/imagehandler/embeddedimage.svg b/tests/manual/imagehandler/embeddedimage.svg
|
| |
+ new file mode 100644
|
| |
+ index 0000000000..f952640822
|
| |
+ --- /dev/null
|
| |
+ +++ b/tests/manual/imagehandler/embeddedimage.svg
|
| |
+ @@ -0,0 +1,10 @@
|
| |
+ +<?xml version="1.0"?>
|
| |
+ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
| |
+ + version="1.2" baseProfile="tiny">
|
| |
+ +
|
| |
+ + <desc>This document has a reference to an external image</desc>
|
| |
+ +
|
| |
+ + <image x="200" y="200" width="100" height="100" xlink:href="heart.png">
|
| |
+ + <title>External image</title>
|
| |
+ + </image>
|
| |
+ +</svg>
|
| |
+ diff --git a/tests/manual/imagehandler/main.qml b/tests/manual/imagehandler/main.qml
|
| |
+ index 55e5b89cae..ec474e62ce 100644
|
| |
+ --- a/tests/manual/imagehandler/main.qml
|
| |
+ +++ b/tests/manual/imagehandler/main.qml
|
| |
+ @@ -41,6 +41,10 @@ Window {
|
| |
+ width: parent.width
|
| |
+ sourceSize.height: height
|
| |
+ sourceSize.width: width
|
| |
+ + MouseArea {
|
| |
+ + anchors.fill: parent
|
| |
+ + onClicked: svgImage.source = "embeddedimage.svg"
|
| |
+ + }
|
| |
+ }
|
| |
+ ListModel {
|
| |
+ id: imageFillModeModel
|
| |
+ @@ -57,7 +61,7 @@ Window {
|
| |
+ height: 75
|
| |
+ anchors.bottom: parent.bottom
|
| |
+ Text {
|
| |
+ - text: "Click the options below to change the fill mode"
|
| |
+ + text: "Click the options below to change the fill mode.<br>Click the image to change the used image."
|
| |
+ font.pointSize: 16
|
| |
+ }
|
| |
+
|
| |
GCompris-qt is not working as expected, missing its SVG icons as reported by the maintainer Andrea Musuruane on the mailing list:
https://lists.fedorahosted.org/archives/list/devel@lists.fedoraproject.org/thread/PSYB66PFPF5UIMV7POW23JCB5GLKON2P/
This is caused by two bugs:
- QTBUG-65789: https://bugreports.qt.io/browse/QTBUG-65789 solved by this commit https://github.com/qt/qtdeclarative/commit/602a6589
- QTBUG-67019: https://bugreports.qt.io/browse/QTBUG-67019 solved by this commit https://github.com/qt/qtdeclarative/commit/b1243b8c
This PR backports these commits to 5.10.1 in order for Gcompris-qt to work as expected. I have tested it on Fedora 28.