svg_loader: fix clipping in use/symbol nodes

Clipping for the <use> node when a <symbol> was used,
was being overridden when 'overflowVisible' was 'true'
(the default value), which caused the 'clip-path' applied
to the <use> node to have no visible effect.
The clipping for the <use> node (without <symbol> node) was
transformed in an incorrect order, resulting in a visually
incorrect results.

@Issue: https://github.com/thorvg/thorvg/issues/3392
This commit is contained in:
Mira Grudzinska 2025-04-17 07:42:26 +02:00 committed by Hermet Park
parent 53e5e783b7
commit 65c4e27437

View file

@ -807,12 +807,22 @@ static Scene* _useBuildHelper(SvgLoaderData& loaderData, const SvgNode* node, co
}
viewBoxClip->transform(mClipTransform);
scene->clip(viewBoxClip);
auto clippingLayer = Scene::gen();
clippingLayer->clip(viewBoxClip);
clippingLayer->push(scene);
return clippingLayer;
}
} else {
scene->transform(mUseTransform);
return scene;
}
if (auto clipper = PAINT(scene)->clipper) {
auto& clipTransform = clipper->transform();
Matrix inv;
if (node->transform && inverse(node->transform, &inv)) clipTransform = inv * clipTransform;
clipTransform = mUseTransform * clipTransform ;
}
scene->transform(mUseTransform);
return scene;
}
@ -888,7 +898,9 @@ static Scene* _sceneBuildHelper(SvgLoaderData& loaderData, const SvgNode* node,
auto scene = Scene::gen();
// For a Symbol node, the viewBox transformation has to be applied first - see _useBuildHelper()
if (!mask && node->transform && node->type != SvgNodeType::Symbol) scene->transform(*node->transform);
if (!mask && node->transform && node->type != SvgNodeType::Symbol && node->type != SvgNodeType::Use) {
scene->transform(*node->transform);
}
if (!node->style->display || node->style->opacity == 0) return scene;