aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickimage.cpp
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@jollamobile.com>2014-07-31 11:40:03 +0200
committerGunnar Sletta <gunnar.sletta@jollamobile.com>2014-08-04 14:30:12 +0200
commitec559c38c349c38785bdcc265d7e0f852249cfb4 (patch)
treea394958f1851991066d4a94fc782874f8dada74f /src/quick/items/qquickimage.cpp
parent6a3d776671bc618fcc184779a8cc8e2d08e08278 (diff)
Clean up Image and ShaderEffectSource properly.
Change-Id: I9e3eb5f65ea5f46d30fb7905d0f9c479da367bf5 Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
Diffstat (limited to 'src/quick/items/qquickimage.cpp')
-rw-r--r--src/quick/items/qquickimage.cpp35
1 files changed, 33 insertions, 2 deletions
diff --git a/src/quick/items/qquickimage.cpp b/src/quick/items/qquickimage.cpp
index 5df9e630db..14dc6c3377 100644
--- a/src/quick/items/qquickimage.cpp
+++ b/src/quick/items/qquickimage.cpp
@@ -49,6 +49,7 @@
#include <QtGui/qpainter.h>
#include <qmath.h>
+#include <QtCore/QRunnable>
QT_BEGIN_NAMESPACE
@@ -100,6 +101,14 @@ QQuickImagePrivate::QQuickImagePrivate()
{
}
+class QQuickImageCleanup : public QRunnable
+{
+public:
+ QQuickImageCleanup(QQuickImageTextureProvider *p) : provider(p) { }
+ void run() Q_DECL_OVERRIDE { delete provider; }
+ QQuickImageTextureProvider *provider;
+};
+
/*!
\qmltype Image
\instantiates QQuickImage
@@ -159,18 +168,24 @@ QQuickImagePrivate::QQuickImagePrivate()
QQuickImage::QQuickImage(QQuickItem *parent)
: QQuickImageBase(*(new QQuickImagePrivate), parent)
{
+ connect(this, SIGNAL(sceneGraphInvalidated()), this, SLOT(invalidateSG()));
}
QQuickImage::QQuickImage(QQuickImagePrivate &dd, QQuickItem *parent)
: QQuickImageBase(dd, parent)
{
+ connect(this, SIGNAL(sceneGraphInvalidated()), this, SLOT(invalidateSG()));
}
QQuickImage::~QQuickImage()
{
Q_D(QQuickImage);
- if (d->provider)
- d->provider->deleteLater();
+ if (QQuickWindow *w = window()) {
+ w->scheduleRenderJob(new QQuickImageCleanup(d->provider), QQuickWindow::AfterSynchronizingStage);
+ } else {
+ // Should have been released already in releaseResources or in invalidateSG.
+ Q_ASSERT(!d->provider);
+ }
}
void QQuickImagePrivate::setImage(const QImage &image)
@@ -571,6 +586,22 @@ QSGTextureProvider *QQuickImage::textureProvider() const
return d->provider;
}
+void QQuickImage::invalidateSG()
+{
+ Q_D(QQuickImage);
+ delete d->provider;
+ d->provider = 0;
+}
+
+void QQuickImage::releaseResources()
+{
+ Q_D(QQuickImage);
+ if (d->provider) {
+ window()->scheduleRenderJob(new QQuickImageCleanup(d->provider), QQuickWindow::AfterSynchronizingStage);
+ d->provider = 0;
+ }
+}
+
QSGNode *QQuickImage::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
{
Q_D(QQuickImage);