loader/svg: Check current graphics node that not closed 32/313732/2
authorjoogab.yun <joogab.yun@samsung.com>
Mon, 1 Jul 2024 08:17:49 +0000 (17:17 +0900)
committerjoogab.yun <joogab.yun@samsung.com>
Tue, 2 Jul 2024 05:36:08 +0000 (14:36 +0900)
If any of the graphics nodes are not closed,
the graphics nodes between them are ignored.

Change-Id: Ibe1ea8df4494fca4ca412c25826a5f460d2d5b9e

src/loaders/svg/tvgSvgLoader.cpp
src/loaders/svg/tvgSvgLoaderCommon.h

index 538d9b4bd5cb4cc697503f898bc6410440c62374..26da5230a9085c38a1db2ec49db694f5fca50004 100644 (file)
@@ -2680,6 +2680,14 @@ static void _svgLoaderParserXmlClose(SvgLoaderData* loader, const char* content)
         }
     }
 
+    for (unsigned int i = 0; i < sizeof(graphicsTags) / sizeof(graphicsTags[0]); i++) {
+        if (!strncmp(content, graphicsTags[i].tag, graphicsTags[i].sz - 1)) {
+            loader->currentGraphicsNode = nullptr;
+            loader->stack.pop();
+            break;
+        }
+    }
+
     loader->level--;
 }
 
@@ -2746,6 +2754,11 @@ static void _svgLoaderParserXmlOpen(SvgLoaderData* loader, const char* content,
         if (loader->stack.count > 0) parent = loader->stack.data[loader->stack.count - 1];
         else parent = loader->doc;
         node = method(loader, parent, attrs, attrsLength, simpleXmlParseAttributes);
+        if (node && !empty) {
+            auto defs = _createDefsNode(loader, nullptr, nullptr, 0, nullptr);
+            loader->stack.push(defs);
+            loader->currentGraphicsNode = node;
+        }
     } else if ((gradientMethod = _findGradientFactory(tagName))) {
         SvgStyleGradient* gradient;
         gradient = gradientMethod(loader, attrs, attrsLength);
index 6fed15939fa951ce1c5cc3fcb6d38be6b3104761..21625c58667a42ed3ace4f19ea0576220085ccee 100644 (file)
@@ -442,6 +442,7 @@ struct SvgLoaderData
     int level = 0;
     bool result = false;
     bool style = false;
+    SvgNode* currentGraphicsNode = nullptr;
 };
 
 /*