36bool QSGSoftwareRenderableNodeUpdater::visit(QSGTransformNode *node)
38 m_transformState.push(node->matrix().toTransform() * m_transformState.top());
41 m_opacityState.push(node->isSubtreeBlocked() ? 0.0f : m_opacityState.top());
42 m_stateMap[node] = currentState(node);
52bool QSGSoftwareRenderableNodeUpdater::visit(QSGClipNode *node)
55 if (m_clipState.size() == 0 || (m_clipState.size() == 1 && m_clipState.top().isNull())) {
56 m_clipState.push(m_transformState.top().map(QRegion(node->clipRect().toRect())));
59 const QRegion transformedClipRect = m_transformState.top().map(QRegion(node->clipRect().toRect()));
60 m_clipState.push(transformedClipRect.intersected(m_clipState.top()));
62 m_stateMap[node] = currentState(node);
73bool QSGSoftwareRenderableNodeUpdater::visit(QSGGeometryNode *node)
75 if (QSGSimpleRectNode *rectNode =
dynamic_cast<QSGSimpleRectNode *>(node)) {
76 return updateRenderableNode(QSGSoftwareRenderableNode::SimpleRect, rectNode);
77 }
else if (QSGSimpleTextureNode *tn =
dynamic_cast<QSGSimpleTextureNode *>(node)) {
78 return updateRenderableNode(QSGSoftwareRenderableNode::SimpleTexture, tn);
79 }
else if (QSGNinePatchNode *nn =
dynamic_cast<QSGNinePatchNode *>(node)) {
80 return updateRenderableNode(QSGSoftwareRenderableNode::NinePatch, nn);
81 }
else if (QSGRectangleNode *rn =
dynamic_cast<QSGRectangleNode *>(node)) {
82 return updateRenderableNode(QSGSoftwareRenderableNode::SimpleRectangle, rn);
83 }
else if (QSGImageNode *n =
dynamic_cast<QSGImageNode *>(node)) {
84 return updateRenderableNode(QSGSoftwareRenderableNode::SimpleImage, n);
174void QSGSoftwareRenderableNodeUpdater::updateNodes(QSGNode *node,
bool isNodeRemoved)
176 m_opacityState.clear();
178 m_transformState.clear();
180 auto parentNode = node->parent();
183 if ((!parentNode || isNodeRemoved ) && m_stateMap.contains(node))
184 parentNode = m_stateMap[node].parent;
187 if (parentNode && m_stateMap.contains(parentNode)) {
188 auto state = m_stateMap[parentNode];
189 m_opacityState.push(state.opacity);
190 m_transformState.push(state.transform);
191 m_clipState.push(state.clip);
192 m_hasClip = state.hasClip;
195 m_opacityState.push(1.0f);
196 m_transformState.push(QTransform());
197 m_clipState.push(QRegion());
204 m_stateMap.remove(node);
209 switch (node->type()) {
210 case QSGNode::ClipNodeType: {
211 QSGClipNode *c =
static_cast<QSGClipNode*>(node);
217 case QSGNode::TransformNodeType: {
218 QSGTransformNode *c =
static_cast<QSGTransformNode*>(node);
224 case QSGNode::OpacityNodeType: {
225 QSGOpacityNode *c =
static_cast<QSGOpacityNode*>(node);
231 case QSGNode::GeometryNodeType: {
232 if (node->flags() & QSGNode::IsVisitableNode) {
233 QSGVisitableNode *v =
static_cast<QSGVisitableNode*>(node);
236 QSGGeometryNode *c =
static_cast<QSGGeometryNode*>(node);
243 case QSGNode::RootNodeType: {
244 QSGRootNode *root =
static_cast<QSGRootNode*>(node);
250 case QSGNode::BasicNodeType: {
254 case QSGNode::RenderNodeType: {
255 QSGRenderNode *r =
static_cast<QSGRenderNode*>(node);