Opt-in that QSGSimpleTextureNode can own the texture.
authorGunnar Sletta <gunnar.sletta@jollamobile.com>
Thu, 1 May 2014 14:04:14 +0000 (16:04 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Thu, 1 May 2014 20:14:18 +0000 (22:14 +0200)
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>
src/quick/scenegraph/util/qsgsimpletexturenode.cpp
src/quick/scenegraph/util/qsgsimpletexturenode.h
tests/auto/quick/nodes/tst_nodestest.cpp

index fc1d6ce..47cb82d 100644 (file)
@@ -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
index 0c0b584..d971f00 100644 (file)
@@ -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;
index 662e78e..2123379 100644 (file)
@@ -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"