From 8c815e95c8b4a08d55ad30df8e4b110715e693d7 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Wed, 1 Jul 2020 13:44:12 +0900 Subject: [PATCH] SvgLoader: Don't use custom transform Change-Id: Ia7cd0992bbb8d5ee117806ee62b35604ffd91e16 --- src/loaders/svg_loader/tvgSvgSceneBuilder.cpp | 36 ++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/loaders/svg_loader/tvgSvgSceneBuilder.cpp b/src/loaders/svg_loader/tvgSvgSceneBuilder.cpp index b3fe81d..b79a3eb 100644 --- a/src/loaders/svg_loader/tvgSvgSceneBuilder.cpp +++ b/src/loaders/svg_loader/tvgSvgSceneBuilder.cpp @@ -21,12 +21,37 @@ #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 _applyProperty(SvgNode* node, unique_ptr 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 _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::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)); -- 2.7.4