From 46147dcec70b81102e3c0f625ac8ee72b9c770c8 Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Tue, 18 Apr 2023 01:48:51 +0200 Subject: [PATCH] svg_loader: fixing clipper transformation In a case where both the clipper and the clippee are transformed, the final clipper transformation matrix should be calculated as the multiplication of both matrices. @Issue: https://github.com/thorvg/thorvg/issues/1255 --- src/loaders/svg/tvgSvgSceneBuilder.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/loaders/svg/tvgSvgSceneBuilder.cpp b/src/loaders/svg/tvgSvgSceneBuilder.cpp index e83844ff..b76a0b10 100644 --- a/src/loaders/svg/tvgSvgSceneBuilder.cpp +++ b/src/loaders/svg/tvgSvgSceneBuilder.cpp @@ -254,7 +254,6 @@ static void _applyComposition(Paint* paint, const SvgNode* node, const Box& vBox node->style->clipPath.applying = true; auto comp = Shape::gen(); - if (node->transform) comp->transform(*node->transform); auto child = compNode->child.data; auto valid = false; //Composite only when valid shapes are existed @@ -263,6 +262,12 @@ static void _applyComposition(Paint* paint, const SvgNode* node, const Box& vBox if (_appendChildShape(*child, comp.get(), vBox, svgPath)) valid = true; } + if (node->transform) { + auto m = comp->transform(); + m = mathMultiply(node->transform, &m); + comp->transform(m); + } + if (valid) paint->composite(move(comp), CompositeMethod::ClipPath); node->style->clipPath.applying = false;