diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/svg/qsvghandler.cpp | 22 | ||||
-rw-r--r-- | src/svg/qsvghandler_p.h | 7 |
2 files changed, 15 insertions, 14 deletions
diff --git a/src/svg/qsvghandler.cpp b/src/svg/qsvghandler.cpp index 778f175..f520c3f 100644 --- a/src/svg/qsvghandler.cpp +++ b/src/svg/qsvghandler.cpp @@ -3818,8 +3818,9 @@ bool QSvgHandler::startElement(const QString &localName, } else if (node->type() == QSvgNode::TSPAN) { static_cast<QSvgTspan *>(node)->setWhitespaceMode(m_whitespaceMode.top()); } else if (node->type() == QSvgNode::USE) { - if (!static_cast<QSvgUse *>(node)->isResolved()) - m_resolveNodes.append(node); + auto useNode = static_cast<QSvgUse *>(node); + if (!useNode->isResolved()) + m_toBeResolved.append(useNode); } } } @@ -3926,17 +3927,16 @@ void QSvgHandler::resolveGradients(QSvgNode *node, int nestedDepth) void QSvgHandler::resolveNodes() { - for (QSvgNode *node : qAsConst(m_resolveNodes)) { - if (!node || !node->parent() || node->type() != QSvgNode::USE) + for (QSvgUse *useNode : qAsConst(m_toBeResolved)) { + const auto parent = useNode->parent(); + if (!parent) continue; - QSvgUse *useNode = static_cast<QSvgUse *>(node); - if (useNode->isResolved()) - continue; - QSvgNode::Type t = useNode->parent()->type(); - if (!(t == QSvgNode::DOC || t == QSvgNode::DEFS || t == QSvgNode::G || t == QSvgNode::SWITCH)) + + QSvgNode::Type t = parent->type(); + if (t != QSvgNode::DOC && t != QSvgNode::DEFS && t != QSvgNode::G && t != QSvgNode::SWITCH) continue; - QSvgStructureNode *group = static_cast<QSvgStructureNode *>(useNode->parent()); + QSvgStructureNode *group = static_cast<QSvgStructureNode *>(parent); QSvgNode *link = group->scopeNode(useNode->linkId()); if (!link) { qCWarning(lcSvgHandler, "link #%s is undefined!", qPrintable(useNode->linkId())); @@ -3948,7 +3948,7 @@ void QSvgHandler::resolveNodes() useNode->setLink(link); } - m_resolveNodes.clear(); + m_toBeResolved.clear(); } bool QSvgHandler::characters(const QStringView str) diff --git a/src/svg/qsvghandler_p.h b/src/svg/qsvghandler_p.h index 86b9fa4..2c4b158 100644 --- a/src/svg/qsvghandler_p.h +++ b/src/svg/qsvghandler_p.h @@ -144,9 +144,10 @@ private: void init(); QSvgTinyDocument *m_doc; - QStack<QSvgNode*> m_nodes; - - QList<QSvgNode*> m_resolveNodes; + QStack<QSvgNode *> m_nodes; + // TODO: This is only needed during parsing, so it unnecessarily takes up space after that. + // Temporary container for <use> nodes which haven't been resolved yet. + QList<QSvgUse *> m_toBeResolved; enum CurrentNode { |