diff options
author | Gunnar Sletta <gunnar.sletta@jollamobile.com> | 2014-05-01 16:04:14 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-05-01 22:14:18 +0200 |
commit | 46354ec47db9adc80ac185b2178dcd1f157665cd (patch) | |
tree | b37e47248e1fc66b02365a17898399bc7a54c53d | |
parent | 0cb12e9e01b8309320706fab219945f0ff159413 (diff) |
Opt-in that QSGSimpleTextureNode can own the texture.
Having to subclass just to delete the texture is a bit
tedious.
Change-Id: I26c7e0b5c053ba70e004949ead748e50756d9b39
Reviewed-by: Michael Brasser <michael.brasser@live.com>
Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
-rw-r--r-- | src/quick/scenegraph/util/qsgsimpletexturenode.cpp | 38 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgsimpletexturenode.h | 4 | ||||
-rw-r--r-- | tests/auto/quick/nodes/tst_nodestest.cpp | 30 |
3 files changed, 72 insertions, 0 deletions
diff --git a/src/quick/scenegraph/util/qsgsimpletexturenode.cpp b/src/quick/scenegraph/util/qsgsimpletexturenode.cpp index fc1d6cecbc..47cb82d01b 100644 --- a/src/quick/scenegraph/util/qsgsimpletexturenode.cpp +++ b/src/quick/scenegraph/util/qsgsimpletexturenode.cpp @@ -52,10 +52,12 @@ public: : QSGGeometryNodePrivate() , m_texCoordMode(QSGSimpleTextureNode::NoTransform) , isAtlasTexture(false) + , ownsTexture(false) {} QSGSimpleTextureNode::TextureCoordinatesTransformMode m_texCoordMode; uint isAtlasTexture : 1; + uint ownsTexture : 1; }; static void qsgsimpletexturenode_update(QSGGeometry *g, @@ -111,6 +113,16 @@ QSGSimpleTextureNode::QSGSimpleTextureNode() } /*! + Destroys the texture node + */ +QSGSimpleTextureNode::~QSGSimpleTextureNode() +{ + Q_D(QSGSimpleTextureNode); + if (d->ownsTexture) + delete m_material.texture(); +} + +/*! Sets the filtering to be used for this texture node to \a filtering. For smooth scaling, use QSGTexture::Linear; for normal scaling, use @@ -168,6 +180,10 @@ QRectF QSGSimpleTextureNode::rect() const /*! Sets the texture of this texture node to \a texture. + Use setOwnsTexture() to set whether the node should take + ownership of the texture. By default, the node does not + take ownership. + \warning A texture node must have a texture before being added to the scenegraph to be rendered. */ @@ -244,4 +260,26 @@ QSGSimpleTextureNode::TextureCoordinatesTransformMode QSGSimpleTextureNode::text return d->m_texCoordMode; } +/*! + Sets whether the node takes ownership of the texture to \a owns. + + By default, the node does not take ownership of the texture. + + \sa setTexture() + */ +void QSGSimpleTextureNode::setOwnsTexture(bool owns) +{ + Q_D(QSGSimpleTextureNode); + d->ownsTexture = owns; +} + +/*! + Returns \c true if the node takes ownership of the texture; otherwise returns \c false. + */ +bool QSGSimpleTextureNode::ownsTexture() const +{ + Q_D(const QSGSimpleTextureNode); + return d->ownsTexture; +} + QT_END_NAMESPACE diff --git a/src/quick/scenegraph/util/qsgsimpletexturenode.h b/src/quick/scenegraph/util/qsgsimpletexturenode.h index 0c0b58442c..d971f00326 100644 --- a/src/quick/scenegraph/util/qsgsimpletexturenode.h +++ b/src/quick/scenegraph/util/qsgsimpletexturenode.h @@ -54,6 +54,7 @@ class Q_QUICK_EXPORT QSGSimpleTextureNode : public QSGGeometryNode { public: QSGSimpleTextureNode(); + ~QSGSimpleTextureNode(); void setRect(const QRectF &rect); inline void setRect(qreal x, qreal y, qreal w, qreal h) { setRect(QRectF(x, y, w, h)); } @@ -75,6 +76,9 @@ public: void setTextureCoordinatesTransform(TextureCoordinatesTransformMode mode); TextureCoordinatesTransformMode textureCoordinatesTransform() const; + void setOwnsTexture(bool owns); + bool ownsTexture() const; + private: QSGGeometry m_geometry; QSGOpaqueTextureMaterial m_opaque_material; diff --git a/tests/auto/quick/nodes/tst_nodestest.cpp b/tests/auto/quick/nodes/tst_nodestest.cpp index 662e78ef6c..212337957e 100644 --- a/tests/auto/quick/nodes/tst_nodestest.cpp +++ b/tests/auto/quick/nodes/tst_nodestest.cpp @@ -52,6 +52,8 @@ #include <QtQuick/private/qsgcontext_p.h> #include <QtQuick/qsgsimplerectnode.h> +#include <QtQuick/qsgsimpletexturenode.h> +#include <QtQuick/private/qsgtexture_p.h> class NodesTest : public QObject { @@ -74,6 +76,8 @@ private Q_SLOTS: void isBlockedCheck(); + void textureNodeTextureOwnership(); + private: QOffscreenSurface *surface; QOpenGLContext *context; @@ -259,6 +263,32 @@ void NodesTest::isBlockedCheck() QVERIFY(!updater.isNodeBlocked(node, &root)); } +void NodesTest::textureNodeTextureOwnership() +{ + { // Check that it is not deleted by default + QPointer<QSGTexture> texture(new QSGPlainTexture()); + + QSGSimpleTextureNode *tn = new QSGSimpleTextureNode(); + QVERIFY(!tn->ownsTexture()); + + tn->setTexture(texture); + delete tn; + QVERIFY(!texture.isNull()); + } + + { // Check that it is deleted when we so desire + QPointer<QSGTexture> texture(new QSGPlainTexture()); + + QSGSimpleTextureNode *tn = new QSGSimpleTextureNode(); + tn->setOwnsTexture(true); + QVERIFY(tn->ownsTexture()); + + tn->setTexture(texture); + delete tn; + QVERIFY(texture.isNull()); + } +} + QTEST_MAIN(NodesTest); #include "tst_nodestest.moc" |