diff options
-rw-r--r-- | src/quick/items/qquickitemgrabresult.cpp | 2 | ||||
-rw-r--r-- | src/quick/util/qquickpixmapcache.cpp | 12 | ||||
-rw-r--r-- | src/quick/util/qquickpixmapcache_p.h | 2 | ||||
-rw-r--r-- | tests/auto/qmltest/itemgrabber/tst_itemgrabber.qml | 41 |
4 files changed, 50 insertions, 7 deletions
diff --git a/src/quick/items/qquickitemgrabresult.cpp b/src/quick/items/qquickitemgrabresult.cpp index 07c2cb607c..12bcd43076 100644 --- a/src/quick/items/qquickitemgrabresult.cpp +++ b/src/quick/items/qquickitemgrabresult.cpp @@ -75,7 +75,7 @@ public: void ensureImageInCache() const { if (url.isEmpty() && !image.isNull()) { - url.setScheme(QStringLiteral("ItemGrabber")); + url.setScheme(QQuickPixmap::itemGrabberScheme); url.setPath(QVariant::fromValue(item.data()).toString()); static uint counter = 0; url.setFragment(QString::number(++counter)); diff --git a/src/quick/util/qquickpixmapcache.cpp b/src/quick/util/qquickpixmapcache.cpp index 1c6b2afb54..be6d4d18bd 100644 --- a/src/quick/util/qquickpixmapcache.cpp +++ b/src/quick/util/qquickpixmapcache.cpp @@ -84,6 +84,7 @@ QT_BEGIN_NAMESPACE +const QLatin1String QQuickPixmap::itemGrabberScheme = QLatin1String("itemgrabber"); #ifndef QT_NO_DEBUG static const bool qsg_leak_check = !qEnvironmentVariableIsEmpty("QML_LEAK_CHECK"); @@ -1462,8 +1463,15 @@ void QQuickPixmap::load(QQmlEngine *engine, const QUrl &url, const QSize &reques QHash<QQuickPixmapKey, QQuickPixmapData *>::Iterator iter = store->m_cache.end(); // If Cache is disabled, the pixmap will always be loaded, even if there is an existing - // cached version. - if (options & QQuickPixmap::Cache) + // cached version. Unless it's an itemgrabber url, since the cache is used to pass + // the result between QQuickItemGrabResult and QQuickImage. + if (url.scheme() == itemGrabberScheme) { + QSize dummy; + if (requestSize != dummy) + qWarning() << "Ignoring sourceSize request for image url that came from grabToImage. Use the targetSize parameter of the grabToImage() function instead."; + const QQuickPixmapKey grabberKey = { &url, &dummy, QQuickImageProviderOptions() }; + iter = store->m_cache.find(grabberKey); + } else if (options & QQuickPixmap::Cache) iter = store->m_cache.find(key); if (iter == store->m_cache.end()) { diff --git a/src/quick/util/qquickpixmapcache_p.h b/src/quick/util/qquickpixmapcache_p.h index f7cdfa7d07..a867771755 100644 --- a/src/quick/util/qquickpixmapcache_p.h +++ b/src/quick/util/qquickpixmapcache_p.h @@ -177,6 +177,8 @@ public: static void purgeCache(); static bool isCached(const QUrl &url, const QSize &requestSize); + static const QLatin1String itemGrabberScheme; + private: Q_DISABLE_COPY(QQuickPixmap) QQuickPixmapData *d; diff --git a/tests/auto/qmltest/itemgrabber/tst_itemgrabber.qml b/tests/auto/qmltest/itemgrabber/tst_itemgrabber.qml index 022e98a202..a80814d6de 100644 --- a/tests/auto/qmltest/itemgrabber/tst_itemgrabber.qml +++ b/tests/auto/qmltest/itemgrabber/tst_itemgrabber.qml @@ -37,8 +37,9 @@ Item { TestCase { id: testCase name: "item-grabber" - when: imageOnDisk.ready && imageOnDiskSmall.ready && imageInCache.ready && imageInCacheSmall.ready - function test_endresult() { + when: imageOnDisk.ready && imageOnDiskSmall.ready + + function test_endresult_disk() { var image = grabImage(root); // imageOnDisk at (0, 0) - (100x100) @@ -52,6 +53,40 @@ Item { compare(imageOnDiskSmall.height, 50); verify(image.pixel(100, 0) === Qt.rgba(1, 0, 0, 1)); verify(image.pixel(149, 49) === Qt.rgba(0, 0, 1, 1)); + } + + function test_endresult_cache_data() { + return [ + { cache: true, sourceSize: Qt.size(-1, -1), fillMode: Image.Stretch }, + { cache: true, sourceSize: Qt.size(-1, -1), fillMode: Image.PreserveAspectFit }, + { cache: true, sourceSize: Qt.size(-1, -1), fillMode: Image.PreserveAspectCrop }, + { cache: true, sourceSize: Qt.size(10, 10), fillMode: Image.Stretch }, + { cache: true, sourceSize: Qt.size(10, 10), fillMode: Image.PreserveAspectFit }, + { cache: true, sourceSize: Qt.size(10, 10), fillMode: Image.PreserveAspectCrop }, + { cache: false, sourceSize: Qt.size(-1, -1), fillMode: Image.Stretch }, + { cache: false, sourceSize: Qt.size(-1, -1), fillMode: Image.PreserveAspectFit }, + { cache: false, sourceSize: Qt.size(-1, -1), fillMode: Image.PreserveAspectCrop }, + { cache: false, sourceSize: Qt.size(10, 10), fillMode: Image.Stretch }, + { cache: false, sourceSize: Qt.size(10, 10), fillMode: Image.PreserveAspectFit }, + { cache: false, sourceSize: Qt.size(10, 10), fillMode: Image.PreserveAspectCrop }, + ]; + } + + function test_endresult_cache(data) { + imageInCache.cache = data.cache; + imageInCache.sourceSize = data.sourceSize; + imageInCache.fillMode = data.fillMode; + imageInCacheSmall.cache = data.cache; + imageInCacheSmall.sourceSize = data.sourceSize; + imageInCacheSmall.fillMode = data.fillMode; + + box.grabToImage(imageInCache.handleGrab); + box.grabToImage(imageInCacheSmall.handleGrab, Qt.size(50, 50)); + + tryCompare(imageInCache, "ready", true); + tryCompare(imageInCacheSmall, "ready", true); + + var image = grabImage(root); // imageInCache at (0, 100) - 100x100 compare(imageInCache.width, 100); @@ -72,8 +107,6 @@ Item { onWindowShownChanged: { box.grabToImage(imageOnDisk.handleGrab); box.grabToImage(imageOnDiskSmall.handleGrab, Qt.size(50, 50)); - box.grabToImage(imageInCache.handleGrab); - box.grabToImage(imageInCacheSmall.handleGrab, Qt.size(50, 50)); } } |