From 0d20eb71eba0f4c6db07fc04f5be79951e2880ca Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Mon, 22 Apr 2024 18:59:59 +0900 Subject: [PATCH] loader/svg: Check current graphics node that not closed If any of the graphics nodes are not closed, the graphics nodes between them are ignored. related issue: https://github.com/thorvg/thorvg/issues/2210 --- src/loaders/svg/tvgSvgLoader.cpp | 13 +++++++++++++ src/loaders/svg/tvgSvgLoaderCommon.h | 1 + 2 files changed, 14 insertions(+) diff --git a/src/loaders/svg/tvgSvgLoader.cpp b/src/loaders/svg/tvgSvgLoader.cpp index c4ccdc41..46903619 100644 --- a/src/loaders/svg/tvgSvgLoader.cpp +++ b/src/loaders/svg/tvgSvgLoader.cpp @@ -3198,6 +3198,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--; } @@ -3264,6 +3272,11 @@ static void _svgLoaderParserXmlOpen(SvgLoaderData* loader, const char* content, if (loader->stack.count > 0) parent = loader->stack.last(); 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); diff --git a/src/loaders/svg/tvgSvgLoaderCommon.h b/src/loaders/svg/tvgSvgLoaderCommon.h index d6febd68..3a4061b8 100644 --- a/src/loaders/svg/tvgSvgLoaderCommon.h +++ b/src/loaders/svg/tvgSvgLoaderCommon.h @@ -560,6 +560,7 @@ struct SvgLoaderData int level = 0; bool result = false; bool style = false; + SvgNode* currentGraphicsNode = nullptr; }; struct Box