aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp')
-rw-r--r--src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp61
1 files changed, 50 insertions, 11 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