svg: specs ++

Completely remove an element if the applied clip/mask is empty.

@Issue: https://github.com/thorvg/thorvg/issues/3089
This commit is contained in:
Mira Grudzinska 2025-01-01 19:12:52 +01:00 committed by Hermet Park
parent a12accbc93
commit 4818c70dd4

View file

@ -217,7 +217,7 @@ static Matrix _compositionTransform(Paint* paint, const SvgNode* node, const Svg
return m; return m;
} }
static void _applyClip(SvgLoaderData& loaderData, Paint* paint, const SvgNode* node, const SvgNode* clipNode, const Box& vBox, const string& svgPath) static bool _applyClip(SvgLoaderData& loaderData, Paint* paint, const SvgNode* node, const SvgNode* clipNode, const Box& vBox, const string& svgPath)
{ {
node->style->clipPath.applying = true; node->style->clipPath.applying = true;
@ -238,6 +238,7 @@ static void _applyClip(SvgLoaderData& loaderData, Paint* paint, const SvgNode* n
} }
node->style->clipPath.applying = false; node->style->clipPath.applying = false;
return valid;
} }
@ -250,18 +251,25 @@ static Paint* _applyComposition(SvgLoaderData& loaderData, Paint* paint, const S
auto clipNode = node->style->clipPath.node; auto clipNode = node->style->clipPath.node;
auto maskNode = node->style->mask.node; auto maskNode = node->style->mask.node;
auto validClip = (clipNode && clipNode->child.count > 0) ? true : false;
auto validMask = (maskNode && maskNode->child.count > 0) ? true : false;
if (!validClip && !validMask) return paint; if (!clipNode && !maskNode) return paint;
if ((clipNode && clipNode->child.empty()) || (maskNode && maskNode->child.empty())) {
delete(paint);
return nullptr;
}
auto scene = Scene::gen(); auto scene = Scene::gen();
scene->push(paint); scene->push(paint);
if (validClip) _applyClip(loaderData, scene, node, clipNode, vBox, svgPath); if (clipNode) {
if (!_applyClip(loaderData, scene, node, clipNode, vBox, svgPath)) {
delete(scene);
return nullptr;
}
}
/* Mask */ /* Mask */
if (validMask) { if (maskNode) {
node->style->mask.applying = true; node->style->mask.applying = true;
if (auto mask = _sceneBuildHelper(loaderData, maskNode, vBox, svgPath, true, 0)) { if (auto mask = _sceneBuildHelper(loaderData, maskNode, vBox, svgPath, true, 0)) {
@ -433,10 +441,13 @@ static bool _appendClipShape(SvgLoaderData& loaderData, SvgNode* node, Shape* sh
} }
//Apply Clip Chaining //Apply Clip Chaining
auto clipNode = node->style->clipPath.node; if (auto clipNode = node->style->clipPath.node) {
if (clipNode && clipNode->child.count > 0) { if (clipNode->child.count == 0) return false;
if (node->style->clipPath.applying) TVGLOG("SVG", "Multiple composition tried! Check out circular dependency?"); if (node->style->clipPath.applying) {
else _applyClip(loaderData, shape, node, clipNode, vBox, svgPath); TVGLOG("SVG", "Multiple composition tried! Check out circular dependency?");
return false;
}
return _applyClip(loaderData, shape, node, clipNode, vBox, svgPath);
} }
return true; return true;