diff options
author | Kim Motoyoshi Kalland <kim.kalland@nokia.com> | 2011-06-10 13:59:13 +0200 |
---|---|---|
committer | Kim Motoyoshi Kalland <kim.kalland@nokia.com> | 2011-06-10 14:02:24 +0200 |
commit | 5cc65fef81759971e99a45b27186dde697d22b99 (patch) | |
tree | f055a94b806841b5f81dc5f66d46b73b2830cc38 | |
parent | 199635ad73b223cd993869ce088faef8d1ecad0c (diff) |
Removed QSGNodeVisitor inheritance from QSGNodeUpdater.
This reduces the number of virtual function calls.
-rw-r--r-- | src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp | 61 | ||||
-rw-r--r-- | src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h | 7 |
2 files changed, 54 insertions, 14 deletions
diff --git a/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp b/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp index 6eff011e85..326fd82c48 100644 --- a/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp +++ b/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp @@ -189,6 +189,13 @@ void QSGNodeUpdater::enterGeometryNode(QSGGeometryNode *g) g->setInheritedOpacity(m_opacity_stack.top()); } +void QSGNodeUpdater::leaveGeometryNode(QSGGeometryNode *g) +{ +#ifdef QSG_UPDATER_DEBUG + qDebug() << "leave geometry" << g; +#endif +} + void QSGNodeUpdater::enterOpacityNode(QSGOpacityNode *o) { if (o->dirtyFlags() & QSGNode::DirtyOpacity) @@ -216,8 +223,11 @@ void QSGNodeUpdater::leaveOpacityNode(QSGOpacityNode *o) void QSGNodeUpdater::visitChildren(QSGNode *n) { - if (!n->isSubtreeBlocked()) - QSGNodeVisitor::visitChildren(n); + if (!n->isSubtreeBlocked()) { + int count = n->childCount(); + for (int i = 0; i < count; ++i) + visitNode(n->childAtIndex(i)); + } } void QSGNodeUpdater::visitNode(QSGNode *n) @@ -226,18 +236,47 @@ void QSGNodeUpdater::visitNode(QSGNode *n) qDebug() << "enter:" << n; #endif - if (n->dirtyFlags() || m_force_update) { - bool forceUpdate = n->dirtyFlags() & (QSGNode::DirtyNodeAdded | QSGNode::DirtyForceUpdate); - if (forceUpdate) - ++m_force_update; + if (!n->dirtyFlags() && !m_force_update) + return; - QSGNodeVisitor::visitNode(n); - - if (forceUpdate) - --m_force_update; + bool forceUpdate = n->dirtyFlags() & (QSGNode::DirtyNodeAdded | QSGNode::DirtyForceUpdate); + if (forceUpdate) + ++m_force_update; - n->clearDirty(); + switch (n->type()) { + case QSGNode::TransformNodeType: { + QSGTransformNode *t = static_cast<QSGTransformNode *>(n); + enterTransformNode(t); + visitChildren(t); + leaveTransformNode(t); + break; } + case QSGNode::GeometryNodeType: { + QSGGeometryNode *g = static_cast<QSGGeometryNode *>(n); + enterGeometryNode(g); + visitChildren(g); + leaveGeometryNode(g); + break; } + case QSGNode::ClipNodeType: { + QSGClipNode *c = static_cast<QSGClipNode *>(n); + enterClipNode(c); + visitChildren(c); + leaveClipNode(c); + break; } + case QSGNode::OpacityNodeType: { + QSGOpacityNode *o = static_cast<QSGOpacityNode *>(n); + enterOpacityNode(o); + visitChildren(o); + leaveOpacityNode(o); + break; } + default: + visitChildren(n); + break; } + + if (forceUpdate) + --m_force_update; + + n->clearDirty(); } QT_END_NAMESPACE diff --git a/src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h b/src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h index 518cf9eff9..c10b1babd7 100644 --- a/src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h +++ b/src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h @@ -48,7 +48,7 @@ QT_BEGIN_NAMESPACE -class Q_DECLARATIVE_EXPORT QSGNodeUpdater : public QSGNodeVisitor +class Q_DECLARATIVE_EXPORT QSGNodeUpdater { public: QSGNodeUpdater(); @@ -60,13 +60,14 @@ public: qreal toplevelOpacity() const { return m_opacity_stack.top(); } protected: - void enterTransformNode(QSGTransformNode *); - void leaveTransformNode(QSGTransformNode *); + virtual void enterTransformNode(QSGTransformNode *); + virtual void leaveTransformNode(QSGTransformNode *); void enterClipNode(QSGClipNode *c); void leaveClipNode(QSGClipNode *c); void enterOpacityNode(QSGOpacityNode *o); void leaveOpacityNode(QSGOpacityNode *o); void enterGeometryNode(QSGGeometryNode *); + void leaveGeometryNode(QSGGeometryNode *); void visitNode(QSGNode *n); void visitChildren(QSGNode *n); |