From 80e9375dfae450ac40088d566e23b9234733b91e Mon Sep 17 00:00:00 2001 From: Kim Motoyoshi Kalland Date: Mon, 30 May 2011 16:31:53 +0200 Subject: [PATCH] Replaced QStack with QDataBuffer in the node updater. --- .../scenegraph/coreapi/qsgnodeupdater.cpp | 39 ++++++++++---------- .../scenegraph/coreapi/qsgnodeupdater_p.h | 12 +++--- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp b/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp index a6657bf..7a66074 100644 --- a/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp +++ b/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp @@ -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) diff --git a/src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h b/src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h index c10b1ba..798a906 100644 --- a/src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h +++ b/src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h @@ -44,7 +44,7 @@ #include "qsgnode.h" #include "qsgmatrix4x4stack.h" -#include +#include 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 m_combined_matrix_stack; - QStack m_opacity_stack; + QDataBuffer m_matrix_stack; + QDataBuffer m_combined_matrix_stack; + QDataBuffer m_opacity_stack; const QSGClipNode *m_current_clip; int m_force_update; -- 1.7.2.5