16 switch (node->type()) {
17 case QSvgNode::Switch:
22 case QSvgNode::Symbol:
23 case QSvgNode::Filter:
24 case QSvgNode::FeMerge:
25 case QSvgNode::FeMergenode:
26 case QSvgNode::FeColormatrix:
27 case QSvgNode::FeGaussianblur:
28 case QSvgNode::FeOffset:
29 case QSvgNode::FeComposite:
30 case QSvgNode::FeFlood:
31 case QSvgNode::FeBlend:
32 case QSvgNode::FeUnsupported:
33 case QSvgNode::Marker:
34 case QSvgNode::Pattern:
36 case QSvgNode::AnimateColor:
37 case QSvgNode::AnimateTransform:
38 case QSvgNode::Circle:
39 case QSvgNode::Ellipse:
43 case QSvgNode::Polygon:
44 case QSvgNode::Polyline:
47 case QSvgNode::Textarea:
55 Q_UNREACHABLE_RETURN(
false);
60QSvgVisitor::~QSvgVisitor()
63void QSvgVisitor::traverse(
const QSvgNode *node)
66 using NodeState = std::pair<
const QSvgNode *,
bool>;
67 QStack<NodeState> nodes;
68 nodes.push({node,
false});
71 NodeState state = nodes.pop();
72 const QSvgNode *current = state.first;
73 const bool visited = state.second;
74 if (isStructure(current)) {
75 const QSvgStructureNode *structure =
static_cast<
const QSvgStructureNode *>(current);
77 if (!traverseStructureNodeStart(structure))
79 nodes.push({structure,
true});
80 for (
auto it = structure->renderers().crbegin(); it != structure->renderers().crend(); it++)
81 nodes.push({it->get(),
false});
83 traverseStructureNodeEnd(structure);
86 traverseLeafNode(current);
89 }
while (!nodes.isEmpty());
92bool QSvgVisitor::traverseStructureNodeStart(
const QSvgStructureNode *node)
94 switch (node->type()) {
95 case QSvgNode::Switch:
96 return visitSwitchNodeStart(
static_cast<
const QSvgSwitch *>(node));
98 return visitDocumentNodeStart(
static_cast<
const QSvgDocument *>(node));
100 return visitDefsNodeStart(
static_cast<
const QSvgDefs *>(node));
101 case QSvgNode::Group:
102 return visitGroupNodeStart(
static_cast<
const QSvgG *>(node));
104 return visitMaskNodeStart(
static_cast<
const QSvgMask *>(node));
105 case QSvgNode::Symbol:
106 return visitSymbolNodeStart(
static_cast<
const QSvgSymbol *>(node));
107 case QSvgNode::Filter:
108 return visitFilterNodeStart(
static_cast<
const QSvgFilterContainer *>(node));
109 case QSvgNode::Marker:
110 return visitMarkerNodeStart(
static_cast<
const QSvgMarker *>(node));
111 case QSvgNode::Pattern:
112 return visitPatternNodeStart(
static_cast<
const QSvgPattern *>(node));
113 case QSvgNode::FeMerge:
114 case QSvgNode::FeMergenode:
115 case QSvgNode::FeColormatrix:
116 case QSvgNode::FeGaussianblur:
117 case QSvgNode::FeOffset:
118 case QSvgNode::FeComposite:
119 case QSvgNode::FeFlood:
120 case QSvgNode::FeBlend:
121 return visitFeFilterPrimitiveNodeStart(
static_cast<
const QSvgFeFilterPrimitive *>(node));
123 case QSvgNode::FeUnsupported:
124 qDebug() <<
"Unhandled type in switch" << node->type();
134void QSvgVisitor::traverseStructureNodeEnd(
const QSvgStructureNode *node)
136 switch (node->type()) {
137 case QSvgNode::Switch:
138 visitSwitchNodeEnd(
static_cast<
const QSvgSwitch *>(node));
141 visitDocumentNodeEnd(
static_cast<
const QSvgDocument *>(node));
144 visitDefsNodeEnd(
static_cast<
const QSvgDefs *>(node));
146 case QSvgNode::Group:
147 visitGroupNodeEnd(
static_cast<
const QSvgG *>(node));
150 visitMaskNodeEnd(
static_cast<
const QSvgMask *>(node));
152 case QSvgNode::Symbol:
153 visitSymbolNodeEnd(
static_cast<
const QSvgSymbol *>(node));
155 case QSvgNode::Filter:
156 visitFilterNodeEnd(
static_cast<
const QSvgFilterContainer *>(node));
158 case QSvgNode::Marker:
159 visitMarkerNodeEnd(
static_cast<
const QSvgMarker *>(node));
161 case QSvgNode::Pattern:
162 visitPatternNodeEnd(
static_cast<
const QSvgPattern *>(node));
164 case QSvgNode::FeMerge:
165 case QSvgNode::FeMergenode:
166 case QSvgNode::FeColormatrix:
167 case QSvgNode::FeGaussianblur:
168 case QSvgNode::FeOffset:
169 case QSvgNode::FeComposite:
170 case QSvgNode::FeFlood:
171 case QSvgNode::FeBlend:
172 visitFeFilterPrimitiveNodeEnd(
static_cast<
const QSvgFeFilterPrimitive *>(node));
175 case QSvgNode::FeUnsupported:
176 qDebug() <<
"Unhandled type in switch" << node->type();
184void QSvgVisitor::traverseLeafNode(
const QSvgNode *node)
186 switch (node->type()) {
187 case QSvgNode::AnimateColor:
188 case QSvgNode::AnimateTransform:
189 visitAnimateNode(
static_cast<
const QSvgAnimateNode *>(node));
191 case QSvgNode::Circle:
192 case QSvgNode::Ellipse:
193 visitEllipseNode(
static_cast<
const QSvgEllipse *>(node));
195 case QSvgNode::Image:
196 visitImageNode(
static_cast<
const QSvgImage *>(node));
199 visitLineNode(
static_cast<
const QSvgLine *>(node));
202 visitPathNode(
static_cast<
const QSvgPath *>(node));
204 case QSvgNode::Polygon:
205 visitPolygonNode(
static_cast<
const QSvgPolygon *>(node));
207 case QSvgNode::Polyline:
208 visitPolylineNode(
static_cast<
const QSvgPolyline *>(node));
211 visitRectNode(
static_cast<
const QSvgRect *>(node));
214 case QSvgNode::Textarea:
215 visitTextNode(
static_cast<
const QSvgText *>(node));
217 case QSvgNode::Tspan:
218 visitTspanNode(
static_cast<
const QSvgTspan *>(node));
221 visitUseNode(
static_cast<
const QSvgUse *>(node));
223 case QSvgNode::Video:
224 visitVideoNode(
static_cast<
const QSvgVideo *>(node));
228 qDebug() <<
"Unhandled type in switch" << node->type();
bool isStructure(const QSvgNode *node)