aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Motoyoshi Kalland <kim.kalland@nokia.com>2011-06-10 13:59:13 +0200
committerKim Motoyoshi Kalland <kim.kalland@nokia.com>2011-06-10 14:02:24 +0200
commit5cc65fef81759971e99a45b27186dde697d22b99 (patch)
treef055a94b806841b5f81dc5f66d46b73b2830cc38
parent199635ad73b223cd993869ce088faef8d1ecad0c (diff)
Removed QSGNodeVisitor inheritance from QSGNodeUpdater.
This reduces the number of virtual function calls.
-rw-r--r--src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp61
-rw-r--r--src/declarative/scenegraph/coreapi/qsgnodeupdater_p.h7
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);