diff options
author | Gunnar Sletta <gunnar.sletta@jollamobile.com> | 2014-07-31 11:40:03 +0200 |
---|---|---|
committer | Gunnar Sletta <gunnar.sletta@jollamobile.com> | 2014-08-04 14:30:12 +0200 |
commit | ec559c38c349c38785bdcc265d7e0f852249cfb4 (patch) | |
tree | a394958f1851991066d4a94fc782874f8dada74f /src/quick/items/qquickimage.cpp | |
parent | 6a3d776671bc618fcc184779a8cc8e2d08e08278 (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.cpp | 35 |
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); |