From be32e97d9637ef0ea826b19f20884389e10c2316 Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Tue, 11 Mar 2025 23:38:24 +0100 Subject: [PATCH] svg: fix incorrect assignment of elements If the svg contained an unsupported element with elements, they were incorrectly assigned to the last loaded gradient. Now fixed. @Issue: https://github.com/thorvg/thorvg/issues/3321 --- ...7-22eaf24a-a9a7-4a35-abac-df5a54ac5b19.svg | 258 ++++++++++++++++++ examples/resources/svg/samsung-7.svg | 1 - src/loaders/svg/tvgSvgLoader.cpp | 7 +- 3 files changed, 263 insertions(+), 3 deletions(-) create mode 100644 examples/resources/svg/421553147-22eaf24a-a9a7-4a35-abac-df5a54ac5b19.svg delete mode 100644 examples/resources/svg/samsung-7.svg diff --git a/examples/resources/svg/421553147-22eaf24a-a9a7-4a35-abac-df5a54ac5b19.svg b/examples/resources/svg/421553147-22eaf24a-a9a7-4a35-abac-df5a54ac5b19.svg new file mode 100644 index 00000000..88215113 --- /dev/null +++ b/examples/resources/svg/421553147-22eaf24a-a9a7-4a35-abac-df5a54ac5b19.svg @@ -0,0 +1,258 @@ + + + + diff --git a/examples/resources/svg/samsung-7.svg b/examples/resources/svg/samsung-7.svg deleted file mode 100644 index d9df1265..00000000 --- a/examples/resources/svg/samsung-7.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/loaders/svg/tvgSvgLoader.cpp b/src/loaders/svg/tvgSvgLoader.cpp index fc6071d1..15ab7fd7 100644 --- a/src/loaders/svg/tvgSvgLoader.cpp +++ b/src/loaders/svg/tvgSvgLoader.cpp @@ -3445,6 +3445,7 @@ static void _svgLoaderParserXmlOpen(SvgLoaderData* loader, const char* content, if (node->type != SvgNodeType::Defs || !empty) { loader->stack.push(node); } + loader->latestGradient = nullptr; } else if ((method = _findGraphicsFactory(tagName))) { if (loader->stack.count > 0) parent = loader->stack.last(); else parent = loader->doc; @@ -3455,6 +3456,7 @@ static void _svgLoaderParserXmlOpen(SvgLoaderData* loader, const char* content, loader->stack.push(defs); loader->currentGraphicsNode = node; } + loader->latestGradient = nullptr; } else if ((gradientMethod = _findGradientFactory(tagName))) { SvgStyleGradient* gradient; gradient = gradientMethod(loader, attrs, attrsLength); @@ -3480,8 +3482,9 @@ static void _svgLoaderParserXmlOpen(SvgLoaderData* loader, const char* content, loader->svgParse->flags = SvgStopStyleFlags::StopDefault; simpleXmlParseAttributes(attrs, attrsLength, _attrParseStops, loader); loader->latestGradient->stops.push(loader->svgParse->gradStop); - } else if (!isIgnoreUnsupportedLogElements(tagName)) { - TVGLOG("SVG", "Unsupported elements used [Elements: %s]", tagName); + } else { + loader->latestGradient = nullptr; + if (!isIgnoreUnsupportedLogElements(tagName)) TVGLOG("SVG", "Unsupported elements used [Elements: %s]", tagName); } }