From eb810a92f2151134f75bdcf45dbfdc1b46b9fe57 Mon Sep 17 00:00:00 2001 From: Michal Maciola <71131832+mmaciola@users.noreply.github.com> Date: Thu, 29 Jul 2021 04:47:33 +0200 Subject: [PATCH] svg_loader: allow multiple defs tags If svg contained multiple defs tags only the first one was handled correctly. Every next 'defs' tag was skipped and its inner elements parsed as it was outside the defs. --- src/loaders/svg/tvgSvgLoader.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/loaders/svg/tvgSvgLoader.cpp b/src/loaders/svg/tvgSvgLoader.cpp index 550ad5b8..5e0c6d84 100644 --- a/src/loaders/svg/tvgSvgLoader.cpp +++ b/src/loaders/svg/tvgSvgLoader.cpp @@ -1087,8 +1087,11 @@ static SvgNode* _createNode(SvgNode* parent, SvgNodeType type) static SvgNode* _createDefsNode(TVG_UNUSED SvgLoaderData* loader, TVG_UNUSED SvgNode* parent, const char* buf, unsigned bufLength) { - if (loader->def && loader->doc->node.doc.defs) return nullptr; + if (loader->def && loader->doc->node.doc.defs) return loader->def; SvgNode* node = _createNode(nullptr, SvgNodeType::Defs); + + loader->def = node; + loader->doc->node.doc.defs = node; return node; } @@ -2342,18 +2345,14 @@ static void _svgLoaderParserXmlOpen(SvgLoaderData* loader, const char* content, node = method(loader, nullptr, attrs, attrsLength); loader->doc = node; } else { - if (!strcmp(tagName, "svg")) return; //Already loadded (SvgNodeType::Doc) tag + if (!strcmp(tagName, "svg")) return; //Already loaded (SvgNodeType::Doc) tag if (loader->stack.count > 0) parent = loader->stack.data[loader->stack.count - 1]; else parent = loader->doc; node = method(loader, parent, attrs, attrsLength); } if (!node) return; - if (node->type == SvgNodeType::Defs) { - loader->doc->node.doc.defs = node; - loader->def = node; - if (!empty) loader->stack.push(node); - } else { + if (node->type != SvgNodeType::Defs || !empty) { loader->stack.push(node); } } else if ((method = _findGraphicsFactory(tagName))) {