aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickimagebase.cpp
diff options
context:
space:
mode:
authorMitch Curtis <mitch.curtis@qt.io>2017-02-16 12:38:51 +0100
committerMitch Curtis <mitch.curtis@qt.io>2017-02-24 10:40:09 +0000
commitdca1f953264a373cbbe42adccb93fea84b96af51 (patch)
tree76f0f89428ee4fbe497ab3b4c7f8bb8c99f735cb /src/quick/items/qquickimagebase.cpp
parentfebb1f721f720bb9f32bb60c711f709faadb366a (diff)
QQuickImageBase: allow derived classes to affect devicePixelRatio usage
QQuickImageBase currently sets its d->devicePixelRatio member in three scenarios: - The URL uses the image: scheme (an image provider) - The URL is an svg/svgz - The URL contains the "@2x" syntax In all other cases, it sets d->devicePixelRatio to 1.0. QQuickIconImage derives from QQuickImageBase, and can display theme icons in addition to regular images. Theme icons have their own directory structure that determines what is and is not a high DPI image: https://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html In particular, they use e.g. a 22x22@2 directory to indicate that the icons contained within it are high DPI images, as opposed to storing that information in the file name. To account for these images, QQuickIconImage must be able to affect the decision making progress that determines whether or not an image is loaded at a higher DPI. This patch adds a virtual function to QQuickImageBasePrivate that allows subclasses to have some control over this. Change-Id: Id45e0580c8e2ea9a96a41c54ef5fa765ce5922cf Reviewed-by: J-P Nurmi <jpnurmi@qt.io> Reviewed-by: Robin Burchell <robin.burchell@crimson.no>
Diffstat (limited to 'src/quick/items/qquickimagebase.cpp')
-rw-r--r--src/quick/items/qquickimagebase.cpp47
1 files changed, 28 insertions, 19 deletions
diff --git a/src/quick/items/qquickimagebase.cpp b/src/quick/items/qquickimagebase.cpp
index 22d631e917..33d69f5032 100644
--- a/src/quick/items/qquickimagebase.cpp
+++ b/src/quick/items/qquickimagebase.cpp
@@ -49,6 +49,30 @@
QT_BEGIN_NAMESPACE
+// This function gives derived classes the chance set the devicePixelRatio
+// if they're not happy with our implementation of it.
+bool QQuickImageBasePrivate::updateDevicePixelRatio(qreal targetDevicePixelRatio)
+{
+ // QQuickImageProvider and SVG can generate a high resolution image when
+ // sourceSize is set (this function is only called if it's set).
+ // If sourceSize is not set then the provider default size will be used, as usual.
+ bool setDevicePixelRatio = false;
+ if (url.scheme() == QLatin1String("image")) {
+ setDevicePixelRatio = true;
+ } else {
+ QString stringUrl = url.path(QUrl::PrettyDecoded);
+ if (stringUrl.endsWith(QLatin1String("svg")) ||
+ stringUrl.endsWith(QLatin1String("svgz"))) {
+ setDevicePixelRatio = true;
+ }
+ }
+
+ if (setDevicePixelRatio)
+ devicePixelRatio = targetDevicePixelRatio;
+
+ return setDevicePixelRatio;
+}
+
QQuickImageBase::QQuickImageBase(QQuickItem *parent)
: QQuickImplicitSizeItem(*(new QQuickImageBasePrivate), parent)
{
@@ -221,26 +245,11 @@ void QQuickImageBase::load()
QUrl loadUrl = d->url;
- // QQuickImageProvider and SVG can generate a high resolution image when
- // sourceSize is set. If sourceSize is not set then the provider default size
- // will be used, as usual.
- bool setDevicePixelRatio = false;
- if (d->sourcesize.isValid()) {
- if (loadUrl.scheme() == QLatin1String("image")) {
- setDevicePixelRatio = true;
- } else {
- QString stringUrl = loadUrl.path(QUrl::PrettyDecoded);
- if (stringUrl.endsWith(QLatin1String("svg")) ||
- stringUrl.endsWith(QLatin1String("svgz"))) {
- setDevicePixelRatio = true;
- }
- }
-
- if (setDevicePixelRatio)
- d->devicePixelRatio = targetDevicePixelRatio;
- }
+ bool updatedDevicePixelRatio = false;
+ if (d->sourcesize.isValid())
+ updatedDevicePixelRatio = d->updateDevicePixelRatio(targetDevicePixelRatio);
- if (!setDevicePixelRatio) {
+ if (!updatedDevicePixelRatio) {
// (possible) local file: loadUrl and d->devicePixelRatio will be modified if
// an "@2x" file is found.
resolve2xLocalFile(d->url, targetDevicePixelRatio, &loadUrl, &d->devicePixelRatio);