svg_loader: fixing css style for group selectors, clips/masks 34/289034/1
authorMira Grudzinska <m.grudzinska@samsung.com>
Sat, 29 Jan 2022 22:08:53 +0000 (23:08 +0100)
committerMichal Szczecinski <mihashco89@gmail.com>
Mon, 27 Feb 2023 10:00:11 +0000 (11:00 +0100)
The css styling has to be applied as the first step of the node
updates. Whereas the updateStyle function should be called
as the last step, after all other node updates are made.

Change-Id: I59d11f6d372ff4f32c22b067edff90b552900ef8

src/loaders/svg/tvgSvgCssStyle.cpp
src/loaders/svg/tvgSvgLoader.cpp

index 60edf92..67fb39c 100644 (file)
@@ -101,7 +101,6 @@ static void _cssStyleCopy(SvgStyleProperty* to, const SvgStyleProperty* from)
         to->opacity = from->opacity;
         to->flags = (SvgStyleFlags)((int)to->flags | (int)SvgStyleFlags::Opacity);
     }
-    //TODO: support clip-path, mask, mask-type, display
 }
 
 
@@ -121,7 +120,7 @@ void copyCssStyleAttr(SvgNode* to, const SvgNode* from)
     }
     //Copy style attribute
     _cssStyleCopy(to->style, from->style);
-    //TODO: clips and masks are not supported yet in css style
+
     if (from->style->clipPath.url) to->style->clipPath.url = strdup(from->style->clipPath.url);
     if (from->style->mask.url) to->style->mask.url = strdup(from->style->mask.url);
 }
index 196de4d..0fdd883 100644 (file)
@@ -2688,7 +2688,7 @@ static void _svgLoaderParserXmlCssStyle(SvgLoaderData* loader, const char* conte
 
     while (auto next = simpleXmlParseCSSAttribute(content, length, &tag, &name, &attrs, &attrsLength)) {
         if ((method = _findGroupFactory(tag))) {
-            TVGLOG("SVG", "Unsupported elements used in the internal CSS style sheets [Elements: %s]", tag);
+            if ((node = method(loader, loader->cssStyle, attrs, attrsLength, simpleXmlParseW3CAttribute))) node->id = _copyId(name);
         } else if ((method = _findGraphicsFactory(tag))) {
             if ((node = method(loader, loader->cssStyle, attrs, attrsLength, simpleXmlParseW3CAttribute))) node->id = _copyId(name);
         } else if ((gradientMethod = _findGradientFactory(tag))) {
@@ -3043,9 +3043,11 @@ void SvgLoader::run(unsigned tid)
     if (!simpleXmlParse(content, size, true, _svgLoaderParser, &(loaderData))) return;
 
     if (loaderData.doc) {
-        _updateStyle(loaderData.doc, nullptr);
         auto defs = loaderData.doc->node.doc.defs;
 
+        if (loaderData.nodesToStyle.count > 0) stylePostponedNodes(&loaderData.nodesToStyle, loaderData.cssStyle);
+        if (loaderData.cssStyle) updateCssStyle(loaderData.doc, loaderData.cssStyle);
+
         _updateComposite(loaderData.doc, loaderData.doc);
         if (defs) _updateComposite(loaderData.doc, defs);
 
@@ -3054,8 +3056,7 @@ void SvgLoader::run(unsigned tid)
         if (loaderData.gradients.count > 0) _updateGradient(loaderData.doc, &loaderData.gradients);
         if (defs) _updateGradient(loaderData.doc, &defs->node.defs.gradients);
 
-        if (loaderData.nodesToStyle.count > 0) stylePostponedNodes(&loaderData.nodesToStyle, loaderData.cssStyle);
-        if (loaderData.cssStyle) updateCssStyle(loaderData.doc, loaderData.cssStyle);
+        _updateStyle(loaderData.doc, nullptr);
     }
     root = svgSceneBuild(loaderData.doc, vx, vy, vw, vh, w, h, preserveAspect, svgPath);
 }