From: Mira Grudzinska Date: Thu, 17 Feb 2022 00:47:17 +0000 (+0100) Subject: svg_loader: fixing symbol transformation X-Git-Tag: accepted/tizen/unified/20230307.101618~9 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=854b0264038133eb48ce9514040189d2884feb94;p=platform%2Fcore%2Fgraphics%2Ftizenvg.git svg_loader: fixing symbol transformation For a Symbol node, the transformation based on the 'viewBox', 'width' and 'height' attributes has to be applied before the transformation based on the 'transformation' attribute. Change-Id: I72fe990e5c95f0f73aec6c77124d4017e8227a65 --- diff --git a/src/loaders/svg/tvgSvgSceneBuilder.cpp b/src/loaders/svg/tvgSvgSceneBuilder.cpp index 591355a6..a02cc320 100644 --- a/src/loaders/svg/tvgSvgSceneBuilder.cpp +++ b/src/loaders/svg/tvgSvgSceneBuilder.cpp @@ -591,14 +591,17 @@ static unique_ptr _useBuildHelper(const SvgNode* node, const Box& vBox, c auto tvh = symbol.vh * sy; if (tvw > tvh) tvy -= (symbol.h - tvh) * 0.5f; else tvx -= (symbol.w - tvw) * 0.5f; - mViewBox = {sx, 0, -tvx, 0, sy, -tvy, 0, 0, 1}; } else if (!mathZero(symbol.vx) || !mathZero(symbol.vy)) { mViewBox = {1, 0, -symbol.vx, 0, 1, -symbol.vy, 0, 0, 1}; } - // mSceneTransform = mUseTransform * mViewBox - Matrix mSceneTransform = mathMultiply(&mUseTransform, &mViewBox); + // mSceneTransform = mUseTransform * mSymbolTransform * mViewBox + Matrix mSceneTransform = mViewBox; + if (node->node.use.symbol->transform) { + mSceneTransform = mathMultiply(node->node.use.symbol->transform, &mViewBox); + } + mSceneTransform = mathMultiply(&mUseTransform, &mSceneTransform); scene->transform(mSceneTransform); if (node->node.use.symbol->node.symbol.overflowVisible) { @@ -606,6 +609,7 @@ static unique_ptr _useBuildHelper(const SvgNode* node, const Box& vBox, c } else { auto viewBoxClip = Shape::gen(); viewBoxClip->appendRect(0, 0, symbol.w, symbol.h, 0, 0); + // mClipTransform = mUseTransform * mSymbolTransform Matrix mClipTransform = mUseTransform; if (node->node.use.symbol->transform) { @@ -639,7 +643,8 @@ static unique_ptr _sceneBuildHelper(const SvgNode* node, const Box& vBox, { if (_isGroupType(node->type) || mask) { auto scene = Scene::gen(); - if (!mask && node->transform) scene->transform(*node->transform); + // 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 (node->display && node->style->opacity != 0) { auto child = node->child.data;