48bool QSGSoftwareRenderableNodeUpdater::visit(QSGClipNode *node)
51 if (m_clipState.size() == 0 || (m_clipState.size() == 1 && m_clipState.top().isNull())) {
52 m_clipState.push(m_transformState.top().map(QRegion(node->clipRect().toRect())));
55 const QRegion transformedClipRect = m_transformState.top().map(QRegion(node->clipRect().toRect()));
56 m_clipState.push(transformedClipRect.intersected(m_clipState.top()));
58 m_stateMap[node] = currentState(node);
69bool QSGSoftwareRenderableNodeUpdater::visit(QSGGeometryNode *node)
71 if (QSGSimpleRectNode *rectNode =
dynamic_cast<QSGSimpleRectNode *>(node)) {
72 return updateRenderableNode(QSGSoftwareRenderableNode::SimpleRect, rectNode);
73 }
else if (QSGSimpleTextureNode *tn =
dynamic_cast<QSGSimpleTextureNode *>(node)) {
74 return updateRenderableNode(QSGSoftwareRenderableNode::SimpleTexture, tn);
75 }
else if (QSGNinePatchNode *nn =
dynamic_cast<QSGNinePatchNode *>(node)) {
76 return updateRenderableNode(QSGSoftwareRenderableNode::NinePatch, nn);
77 }
else if (QSGRectangleNode *rn =
dynamic_cast<QSGRectangleNode *>(node)) {
78 return updateRenderableNode(QSGSoftwareRenderableNode::SimpleRectangle, rn);
79 }
else if (QSGImageNode *n =
dynamic_cast<QSGImageNode *>(node)) {
80 return updateRenderableNode(QSGSoftwareRenderableNode::SimpleImage, n);
170void QSGSoftwareRenderableNodeUpdater::updateNodes(QSGNode *node,
bool isNodeRemoved)
172 m_opacityState.clear();
174 m_transformState.clear();
176 auto parentNode = node->parent();
179 if ((!parentNode || isNodeRemoved ) && m_stateMap.contains(node))
180 parentNode = m_stateMap[node].parent;
183 if (parentNode && m_stateMap.contains(parentNode)) {
184 auto state = m_stateMap[parentNode];
185 m_opacityState.push(state.opacity);
186 m_transformState.push(state.transform);
187 m_clipState.push(state.clip);
188 m_hasClip = state.hasClip;
191 m_opacityState.push(1.0f);
192 m_transformState.push(QTransform());
193 m_clipState.push(QRegion());
200 m_stateMap.remove(node);
205 switch (node->type()) {
206 case QSGNode::ClipNodeType: {
207 QSGClipNode *c =
static_cast<QSGClipNode*>(node);
213 case QSGNode::TransformNodeType: {
214 QSGTransformNode *c =
static_cast<QSGTransformNode*>(node);
220 case QSGNode::OpacityNodeType: {
221 QSGOpacityNode *c =
static_cast<QSGOpacityNode*>(node);
227 case QSGNode::GeometryNodeType: {
228 if (node->flags() & QSGNode::IsVisitableNode) {
229 QSGVisitableNode *v =
static_cast<QSGVisitableNode*>(node);
232 QSGGeometryNode *c =
static_cast<QSGGeometryNode*>(node);
239 case QSGNode::RootNodeType: {
240 QSGRootNode *root =
static_cast<QSGRootNode*>(node);
246 case QSGNode::BasicNodeType: {
250 case QSGNode::RenderNodeType: {
251 QSGRenderNode *r =
static_cast<QSGRenderNode*>(node);