svg_loader: allow multiple defs tags
authorMichal Maciola <71131832+mmaciola@users.noreply.github.com>
Thu, 29 Jul 2021 02:47:33 +0000 (04:47 +0200)
committerJunsuChoi <jsuya.choi@samsung.com>
Fri, 30 Jul 2021 00:43:30 +0000 (09:43 +0900)
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

index 550ad5b..5e0c6d8 100644 (file)
@@ -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 <svg>(SvgNodeType::Doc) tag
+            if (!strcmp(tagName, "svg")) return; //Already loaded <svg>(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))) {