SvgLoader: Don't use custom transform 08/237508/2
authorJunsuChoi <jsuya.choi@samsung.com>
Wed, 1 Jul 2020 04:44:12 +0000 (13:44 +0900)
committerJunsuChoi <jsuya.choi@samsung.com>
Wed, 1 Jul 2020 05:07:17 +0000 (14:07 +0900)
Change-Id: Ia7cd0992bbb8d5ee117806ee62b35604ffd91e16

src/loaders/svg_loader/tvgSvgSceneBuilder.cpp

index b3fe81d..b79a3eb 100644 (file)
 #include "tvgSvgSceneBuilder.h"
 
 
+static void _getTransformationData(Matrix* m, float* tx, float* ty, float* s, float* z)
+{
+    float rz, si, cs, zcs, zsi;
+
+    *tx = m->e13;
+    *ty = m->e23;
+
+    cs = m->e11;
+    si = m->e12;
+    rz = atan2(si, cs);
+    *z = rz * (180.0 / M_PI);
+    zcs = cosf(rz);
+    zsi = sinf(rz);
+    m->e11 = m->e11 * zcs + m->e12 * zsi;
+    m->e22 = m->e21 * (-1 * zsi) + m->e22 * zcs;
+    *s = m->e11 > m->e22 ? m->e11 : m->e22;
+}
+
+
 unique_ptr<tvg::Shape> _applyProperty(SvgNode* node, unique_ptr<tvg::Shape> vg)
 {
     SvgStyleProperty* style = node->style;
 
     //Apply the transformation
-    if (node->transform) vg->transform(*node->transform);
+    if (node->transform) {
+         float tx = 0, ty = 0, s = 0, z = 0;
+         _getTransformationData(node->transform, &tx, &ty, &s, &z);
+         vg->scale(s);
+         vg->rotate(z);
+         vg->translate(tx, ty);
+    }
 
     if (node->type == SvgNodeType::Doc) return vg;
 
@@ -151,8 +176,13 @@ unique_ptr<tvg::Scene> _sceneBuildHelper(SvgNode* node)
 {
     if (node->type == SvgNodeType::Doc || node->type == SvgNodeType::G) {
         auto scene = tvg::Scene::gen();
-        if (node->transform) scene->transform(*node->transform);
-
+        if (node->transform) {
+            float tx = 0, ty = 0, s = 0, z = 0;
+            _getTransformationData(node->transform, &tx, &ty, &s, &z);
+            scene->scale(s);
+            scene->rotate(z);
+            scene->translate(tx, ty);
+        }
         for (vector<SvgNode*>::iterator itrChild = node->child.begin(); itrChild != node->child.end(); itrChild++) {
             SvgNode* child = *itrChild;
             if (child->type == SvgNodeType::Doc || child->type == SvgNodeType::G) scene->push(_sceneBuildHelper(*itrChild));