aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorElvis Lee <kwangwoong.lee@lge.com>2017-06-22 18:40:35 +0900
committerThomas Senyk <thomas.senyk@qt.io>2020-08-19 10:12:29 +0200
commitcc0cb02da6fda1af6e6cd4a27d1fb8962f9ecb6e (patch)
treeb3fd0e940c7b39f74d9a490d5f1abbe376249275
parent739eb21594747842f15f098f2382e7554c5bc844 (diff)
webOS: Share images even if cache is false
Regardless Image::cache property, pixmap will be shared between images having same source. Image::cache property had two aspect of internal functionality. 1. Share image instance if source file is same. 2. Store cache for a while even if unreferenced. So we couldn't choose one of them with existing the cache property. In webOS, sharing image instance is quite natural. So by default, the sharing is always supported regardless the cache property. And the property will only cares the 2nd functionality to store cache. Change-Id: I68208cf633ce2afd5f086a61dcc77d0f3d0da037 Task-number: QTBUG-83115 Reviewed-by: Risto Avila <risto.avila@qt.io> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> (cherry picked from commit 60280cab2d96b0646469f3d85f8927c7baa166d1)
-rw-r--r--src/quick/util/qquickpixmapcache.cpp35
1 files changed, 34 insertions, 1 deletions
diff --git a/src/quick/util/qquickpixmapcache.cpp b/src/quick/util/qquickpixmapcache.cpp
index d96ebe70b2..bc1b267797 100644
--- a/src/quick/util/qquickpixmapcache.cpp
+++ b/src/quick/util/qquickpixmapcache.cpp
@@ -250,6 +250,9 @@ public:
providerOptions(po), appliedTransform(QQuickImageProviderOptions::UsePluginDefaultTransform),
textureFactory(nullptr), reply(nullptr), prevUnreferenced(nullptr),
prevUnreferencedPtr(nullptr), nextUnreferenced(nullptr)
+#ifdef Q_OS_WEBOS
+ , storeToCache(true)
+#endif
{
declarativePixmaps.insert(pixmap);
}
@@ -261,6 +264,9 @@ public:
providerOptions(po), appliedTransform(aTransform),
textureFactory(nullptr), reply(nullptr), prevUnreferenced(nullptr), prevUnreferencedPtr(nullptr),
nextUnreferenced(nullptr)
+#ifdef Q_OS_WEBOS
+ , storeToCache(true)
+#endif
{
declarativePixmaps.insert(pixmap);
}
@@ -273,6 +279,9 @@ public:
providerOptions(po), appliedTransform(aTransform),
textureFactory(texture), reply(nullptr), prevUnreferenced(nullptr),
prevUnreferencedPtr(nullptr), nextUnreferenced(nullptr)
+#ifdef Q_OS_WEBOS
+ , storeToCache(true)
+#endif
{
declarativePixmaps.insert(pixmap);
}
@@ -282,6 +291,9 @@ public:
appliedTransform(QQuickImageProviderOptions::UsePluginDefaultTransform),
textureFactory(texture), reply(nullptr), prevUnreferenced(nullptr),
prevUnreferencedPtr(nullptr), nextUnreferenced(nullptr)
+#ifdef Q_OS_WEBOS
+ , storeToCache(true)
+#endif
{
if (texture)
requestSize = implicitSize = texture->textureSize();
@@ -328,6 +340,10 @@ public:
QQuickPixmapData *prevUnreferenced;
QQuickPixmapData**prevUnreferencedPtr;
QQuickPixmapData *nextUnreferenced;
+
+#ifdef Q_OS_WEBOS
+ bool storeToCache;
+#endif
};
int QQuickPixmapReply::finishedIndex = -1;
@@ -1287,7 +1303,11 @@ void QQuickPixmapData::release()
QQuickPixmapReader::readerMutex.unlock();
}
- if (pixmapStatus == QQuickPixmap::Ready) {
+ if (pixmapStatus == QQuickPixmap::Ready
+#ifdef Q_OS_WEBOS
+ && storeToCache
+#endif
+ ) {
if (inCache)
pixmapStore()->unreferencePixmap(this);
else
@@ -1643,6 +1663,13 @@ void QQuickPixmap::load(QQmlEngine *engine, const QUrl &url, const QRect &reques
QHash<QQuickPixmapKey, QQuickPixmapData *>::Iterator iter = store->m_cache.end();
+#ifdef Q_OS_WEBOS
+ QQuickPixmap::Options orgOptions = options;
+ // In webOS, we suppose that cache is always enabled to share image instances along its source.
+ // So, original option(orgOptions) for cache only decides whether to store the instances when it's unreferenced.
+ options |= QQuickPixmap::Cache;
+#endif
+
// If Cache is disabled, the pixmap will always be loaded, even if there is an existing
// cached version. Unless it's an itemgrabber url, since the cache is used to pass
// the result between QQuickItemGrabResult and QQuickImage.
@@ -1678,6 +1705,9 @@ void QQuickPixmap::load(QQmlEngine *engine, const QUrl &url, const QRect &reques
PIXMAP_PROFILE(pixmapLoadingFinished(url, QSize(width(), height())));
if (options & QQuickPixmap::Cache)
d->addToCache();
+#ifdef Q_OS_WEBOS
+ d->storeToCache = orgOptions & QQuickPixmap::Cache;
+#endif
return;
}
if (d) { // loadable, but encountered error while loading
@@ -1694,6 +1724,9 @@ void QQuickPixmap::load(QQmlEngine *engine, const QUrl &url, const QRect &reques
QQuickImageProviderOptions::UsePluginDefaultTransform, frame, frameCount);
if (options & QQuickPixmap::Cache)
d->addToCache();
+#ifdef Q_OS_WEBOS
+ d->storeToCache = orgOptions & QQuickPixmap::Cache;
+#endif
QQuickPixmapReader::readerMutex.lock();
d->reply = QQuickPixmapReader::instance(engine)->getImage(d);