summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Tkachenko <me@ratijas.tk>2021-10-31 21:39:50 +0300
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-11-02 17:23:29 +0000
commitbda9f2aa71377a82fb6cbc22552e43e9538e332d (patch)
tree3caf807cfc09195f548b634134dccaee9dee366d
parentd81f9f74790cf162ae541b457ad7db99c1a2e1e3 (diff)
downloadqtsvg-bda9f2aa71377a82fb6cbc22552e43e9538e332d.tar.gz
Improve <use> node resolution process
Since QSvgUse nodes are the only ones that ever get stored in the m_resolveNodes member, we can avoid extra cast and checks around it. Also a more descriptive name wouldn't hurt. Currently, the list is merely cleaned at the end of a parsing process, but ideally it should not be stored at all, hence I left the comment for possible future optimizations, if anyone's willing to do it. Change-Id: I86e83a8661679503e532c230e70f6d52092ad58e Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io> (cherry picked from commit 256f4805bc98bc975773ff4c4053a980d8c5277c) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/svg/qsvghandler.cpp22
-rw-r--r--src/svg/qsvghandler_p.h7
2 files changed, 15 insertions, 14 deletions
diff --git a/src/svg/qsvghandler.cpp b/src/svg/qsvghandler.cpp
index 38af443..b303ca7 100644
--- a/src/svg/qsvghandler.cpp
+++ b/src/svg/qsvghandler.cpp
@@ -3820,8 +3820,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);
}
}
}
@@ -3928,17 +3929,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()));
@@ -3950,7 +3950,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
{