47bool QSGSoftwareRenderableNodeUpdater::visit(QSGClipNode *node)
50 if (m_clipState.size() == 0 || (m_clipState.size() == 1 && m_clipState.top().isNull())) {
51 m_clipState.push(m_transformState.top().map(QRegion(node->clipRect().toRect())));
54 const QRegion transformedClipRect = m_transformState.top().map(QRegion(node->clipRect().toRect()));
55 m_clipState.push(transformedClipRect.intersected(m_clipState.top()));
57 m_stateMap[node] = currentState(node);
68bool QSGSoftwareRenderableNodeUpdater::visit(QSGGeometryNode *node)
70 if (QSGSimpleRectNode *rectNode =
dynamic_cast<QSGSimpleRectNode *>(node)) {
71 return updateRenderableNode(QSGSoftwareRenderableNode::SimpleRect, rectNode);
72 }
else if (QSGSimpleTextureNode *tn =
dynamic_cast<QSGSimpleTextureNode *>(node)) {
73 return updateRenderableNode(QSGSoftwareRenderableNode::SimpleTexture, tn);
74 }
else if (QSGNinePatchNode *nn =
dynamic_cast<QSGNinePatchNode *>(node)) {
75 return updateRenderableNode(QSGSoftwareRenderableNode::NinePatch, nn);
76 }
else if (QSGRectangleNode *rn =
dynamic_cast<QSGRectangleNode *>(node)) {
77 return updateRenderableNode(QSGSoftwareRenderableNode::SimpleRectangle, rn);
78 }
else if (QSGImageNode *n =
dynamic_cast<QSGImageNode *>(node)) {
79 return updateRenderableNode(QSGSoftwareRenderableNode::SimpleImage, n);
169void QSGSoftwareRenderableNodeUpdater::updateNodes(QSGNode *node,
bool isNodeRemoved)
171 m_opacityState.clear();
173 m_transformState.clear();
175 auto parentNode = node->parent();
178 if ((!parentNode || isNodeRemoved ) && m_stateMap.contains(node))
179 parentNode = m_stateMap[node].parent;
182 if (parentNode && m_stateMap.contains(parentNode)) {
183 auto state = m_stateMap[parentNode];
184 m_opacityState.push(state.opacity);
185 m_transformState.push(state.transform);
186 m_clipState.push(state.clip);
187 m_hasClip = state.hasClip;
190 m_opacityState.push(1.0f);
191 m_transformState.push(QTransform());
192 m_clipState.push(QRegion());
199 m_stateMap.remove(node);
204 switch (node->type()) {
205 case QSGNode::ClipNodeType: {
206 QSGClipNode *c =
static_cast<QSGClipNode*>(node);
212 case QSGNode::TransformNodeType: {
213 QSGTransformNode *c =
static_cast<QSGTransformNode*>(node);
219 case QSGNode::OpacityNodeType: {
220 QSGOpacityNode *c =
static_cast<QSGOpacityNode*>(node);
226 case QSGNode::GeometryNodeType: {
227 if (node->flags() & QSGNode::IsVisitableNode) {
228 QSGVisitableNode *v =
static_cast<QSGVisitableNode*>(node);
231 QSGGeometryNode *c =
static_cast<QSGGeometryNode*>(node);
238 case QSGNode::RootNodeType: {
239 QSGRootNode *root =
static_cast<QSGRootNode*>(node);
245 case QSGNode::BasicNodeType: {
249 case QSGNode::RenderNodeType: {
250 QSGRenderNode *r =
static_cast<QSGRenderNode*>(node);