Replaced QStack with QDataBuffer in the node updater.
authorKim Motoyoshi Kalland <kim.kalland@nokia.com>
Mon, 30 May 2011 14:31:53 +0000 (16:31 +0200)
committerKim Motoyoshi Kalland <kim.kalland@nokia.com>
Fri, 10 Jun 2011 12:05:09 +0000 (14:05 +0200)
src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp
src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h

index a6657bf..7a66074 100644 (file)
@@ -46,10 +46,14 @@ QT_BEGIN_NAMESPACE
 // #define QSG_UPDATER_DEBUG
 
 QSGNodeUpdater::QSGNodeUpdater()
-    : m_current_clip(0)
+    : m_matrix_stack(64)
+    , m_combined_matrix_stack(64)
+    , m_opacity_stack(64)
+    , m_current_clip(0)
     , m_force_update(0)
 {
-    m_opacity_stack.push(1);
+    m_opacity_stack.add(1);
+    m_matrix_stack.add(QMatrix4x4());
 }
 
 void QSGNodeUpdater::updateStates(QSGNode *n)
@@ -58,7 +62,6 @@ void QSGNodeUpdater::updateStates(QSGNode *n)
     m_force_update = 0;
 
     Q_ASSERT(m_opacity_stack.size() == 1); // The one we added in the constructr...
-    // Q_ASSERT(m_matrix_stack.isEmpty()); ### no such function?
     Q_ASSERT(m_combined_matrix_stack.isEmpty());
 
     visitNode(n);
@@ -121,13 +124,11 @@ void QSGNodeUpdater::enterTransformNode(QSGTransformNode *t)
 #endif
 
     if (!t->matrix().isIdentity()) {
-        m_combined_matrix_stack.push(&t->combinedMatrix());
-
-        m_matrix_stack.push();
-        m_matrix_stack *= t->matrix();
+        m_combined_matrix_stack.add(&t->combinedMatrix());
+        m_matrix_stack.add(m_matrix_stack.last() * t->matrix());
     }
 
-    t->setCombinedMatrix(m_matrix_stack.top());
+    t->setCombinedMatrix(m_matrix_stack.last());
 }
 
 
@@ -141,8 +142,8 @@ void QSGNodeUpdater::leaveTransformNode(QSGTransformNode *t)
         --m_force_update;
 
     if (!t->matrix().isIdentity()) {
-        m_matrix_stack.pop();
-        m_combined_matrix_stack.pop();
+        m_matrix_stack.pop_back();
+        m_combined_matrix_stack.pop_back();
     }
 
 }
@@ -154,11 +155,10 @@ void QSGNodeUpdater::enterClipNode(QSGClipNode *c)
     qDebug() << "enter clip:" << c;
 #endif
 
-    if (c->dirtyFlags() & QSGNode::DirtyClipList) {
+    if (c->dirtyFlags() & QSGNode::DirtyClipList)
         ++m_force_update;
-    }
 
-    c->m_matrix = m_combined_matrix_stack.isEmpty() ? 0 : m_combined_matrix_stack.top();
+    c->m_matrix = m_combined_matrix_stack.isEmpty() ? 0 : m_combined_matrix_stack.last();
     c->m_clip_list = m_current_clip;
     m_current_clip = c;
 }
@@ -170,9 +170,8 @@ void QSGNodeUpdater::leaveClipNode(QSGClipNode *c)
     qDebug() << "leave clip:" << c;
 #endif
 
-    if (c->dirtyFlags() & QSGNode::DirtyClipList) {
+    if (c->dirtyFlags() & QSGNode::DirtyClipList)
         --m_force_update;
-    }
 
     m_current_clip = c->m_clip_list;
 }
@@ -184,9 +183,9 @@ void QSGNodeUpdater::enterGeometryNode(QSGGeometryNode *g)
     qDebug() << "enter geometry:" << g;
 #endif
 
-    g->m_matrix = m_combined_matrix_stack.isEmpty() ? 0 : m_combined_matrix_stack.top();
+    g->m_matrix = m_combined_matrix_stack.isEmpty() ? 0 : m_combined_matrix_stack.last();
     g->m_clip_list = m_current_clip;
-    g->setInheritedOpacity(m_opacity_stack.top());
+    g->setInheritedOpacity(m_opacity_stack.last());
 }
 
 void QSGNodeUpdater::leaveGeometryNode(QSGGeometryNode *g)
@@ -201,9 +200,9 @@ void QSGNodeUpdater::enterOpacityNode(QSGOpacityNode *o)
     if (o->dirtyFlags() & QSGNode::DirtyOpacity)
         ++m_force_update;
 
-    qreal opacity = m_opacity_stack.top() * o->opacity();
+    qreal opacity = m_opacity_stack.last() * o->opacity();
     o->setCombinedOpacity(opacity);
-    m_opacity_stack.push(opacity);
+    m_opacity_stack.add(opacity);
 
 #ifdef QSG_UPDATER_DEBUG
     qDebug() << "enter opacity" << o;
@@ -218,7 +217,7 @@ void QSGNodeUpdater::leaveOpacityNode(QSGOpacityNode *o)
     if (o->flags() & QSGNode::DirtyOpacity)
         --m_force_update;
 
-    m_opacity_stack.pop();
+    m_opacity_stack.pop_back();
 }
 
 void QSGNodeUpdater::visitChildren(QSGNode *n)
index c10b1ba..798a906 100644 (file)
@@ -44,7 +44,7 @@
 
 #include "qsgnode.h"
 #include "qsgmatrix4x4stack.h"
-#include <qstack.h>
+#include <QtGui/private/qdatabuffer_p.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -56,8 +56,8 @@ public:
     virtual void updateStates(QSGNode *n);
     virtual bool isNodeBlocked(QSGNode *n, QSGNode *root) const;
 
-    void setToplevelOpacity(qreal alpha) { m_opacity_stack.top() = alpha; }
-    qreal toplevelOpacity() const { return m_opacity_stack.top(); }
+    void setToplevelOpacity(qreal alpha) { m_opacity_stack.last() = alpha; }
+    qreal toplevelOpacity() const { return m_opacity_stack.last(); }
 
 protected:
     virtual void enterTransformNode(QSGTransformNode *);
@@ -73,9 +73,9 @@ protected:
     void visitChildren(QSGNode *n);
 
 
-    QSGMatrix4x4Stack m_matrix_stack;
-    QStack<const QMatrix4x4 *> m_combined_matrix_stack;
-    QStack<qreal> m_opacity_stack;
+    QDataBuffer<QMatrix4x4> m_matrix_stack;
+    QDataBuffer<const QMatrix4x4 *> m_combined_matrix_stack;
+    QDataBuffer<qreal> m_opacity_stack;
     const QSGClipNode *m_current_clip;
 
     int m_force_update;