svg_loader: fixing symbol transformation 76/289176/1
authorMira Grudzinska <m.grudzinska@samsung.com>
Thu, 17 Feb 2022 00:47:17 +0000 (01:47 +0100)
committerMichal Szczecinski <m.szczecinsk@partner.samsung.com>
Thu, 2 Mar 2023 08:12:02 +0000 (09:12 +0100)
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

src/loaders/svg/tvgSvgSceneBuilder.cpp

index 591355a..a02cc32 100644 (file)
@@ -591,14 +591,17 @@ static unique_ptr<Scene> _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<Scene> _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<Scene> _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;