From: Hermet Park Date: Thu, 16 Jul 2020 11:42:42 +0000 (+0900) Subject: common transformation: fix transformation multiply X-Git-Tag: accepted/tizen/unified/20200806.062539~34 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2ba529c8fb071bce45cbdb644a3186e920240aa1;p=platform%2Fcore%2Fgraphics%2Ftizenvg.git common transformation: fix transformation multiply Change-Id: Ibc95fab0abfc07aa7f0c4ff6c74785d4f73d02c7 --- diff --git a/src/lib/sw_engine/tvgSwFill.cpp b/src/lib/sw_engine/tvgSwFill.cpp index fd857f9..43514bc 100644 --- a/src/lib/sw_engine/tvgSwFill.cpp +++ b/src/lib/sw_engine/tvgSwFill.cpp @@ -100,12 +100,12 @@ bool _prepareLinear(SwFill* fill, const LinearGradient* linear, const Matrix* tr auto cy = (y2 - y1) * 0.5f + y1; auto dx = x1 - cx; auto dy = y1 - cy; - x1 = dx * transform->e11 + dy * transform->e12 + transform->e31 + cx; - y1 = dx * transform->e21 + dy * transform->e22 + transform->e32 + cy; + x1 = dx * transform->e11 + dy * transform->e12 + transform->e13 + cx; + y1 = dx * transform->e21 + dy * transform->e22 + transform->e23 + cy; dx = x2 - cx; dy = y2 - cy; - x2 = dx * transform->e11 + dy * transform->e12 + transform->e31 + cx; - y2 = dx * transform->e21 + dy * transform->e22 + transform->e32 + cy; + x2 = dx * transform->e11 + dy * transform->e12 + transform->e13 + cx; + y2 = dx * transform->e21 + dy * transform->e22 + transform->e23 + cy; } fill->linear.dx = x2 - x1; @@ -131,8 +131,8 @@ bool _prepareRadial(SwFill* fill, const RadialGradient* radial, const Matrix* tr if (radius < FLT_EPSILON) return true; if (transform) { - auto tx = fill->radial.cx * transform->e11 + fill->radial.cy * transform->e12 + transform->e31; - auto ty = fill->radial.cx * transform->e21 + fill->radial.cy * transform->e22 + transform->e32; + auto tx = fill->radial.cx * transform->e11 + fill->radial.cy * transform->e12 + transform->e13; + auto ty = fill->radial.cx * transform->e21 + fill->radial.cy * transform->e22 + transform->e23; fill->radial.cx = tx; fill->radial.cy = ty; radius *= transform->e33; diff --git a/src/lib/sw_engine/tvgSwShape.cpp b/src/lib/sw_engine/tvgSwShape.cpp index 66655b0..026dae0 100644 --- a/src/lib/sw_engine/tvgSwShape.cpp +++ b/src/lib/sw_engine/tvgSwShape.cpp @@ -239,8 +239,8 @@ static void _transformOutline(SwOutline* outline, const Matrix* transform) for(uint32_t i = 0; i < outline->ptsCnt; ++i) { auto dx = static_cast(outline->pts[i].x >> 6); auto dy = static_cast(outline->pts[i].y >> 6); - auto tx = dx * transform->e11 + dy * transform->e12 + transform->e31; - auto ty = dx * transform->e21 + dy * transform->e22 + transform->e32; + auto tx = dx * transform->e11 + dy * transform->e12 + transform->e13; + auto ty = dx * transform->e21 + dy * transform->e22 + transform->e23; auto pt = Point{round(tx), round(ty)}; outline->pts[i] = TO_SWPOINT(&pt); } diff --git a/src/lib/tvgRender.cpp b/src/lib/tvgRender.cpp index c1212c6..4317aac 100644 --- a/src/lib/tvgRender.cpp +++ b/src/lib/tvgRender.cpp @@ -66,7 +66,6 @@ bool RenderTransform::update() //scale m.e11 *= factor; m.e22 *= factor; - m.e33 *= factor; //rotation if (fabsf(degree) > FLT_EPSILON) { @@ -78,19 +77,19 @@ bool RenderTransform::update() auto t12 = m.e11 * -sinVal + m.e12 * cosVal; auto t21 = m.e21 * cosVal + m.e22 * sinVal; auto t22 = m.e21 * -sinVal + m.e22 * cosVal; - auto t31 = m.e31 * cosVal + m.e32 * sinVal; - auto t32 = m.e31 * -sinVal + m.e32 * cosVal; + auto t13 = m.e13 * cosVal + m.e23 * sinVal; + auto t23 = m.e13 * -sinVal + m.e23 * cosVal; m.e11 = t11; m.e12 = t12; m.e21 = t21; m.e22 = t22; - m.e31 = t31; - m.e32 = t32; + m.e13 = t13; + m.e23 = t23; } - m.e31 += x; - m.e32 += y; + m.e13 += x; + m.e23 += y; return true; } @@ -105,17 +104,17 @@ RenderTransform::RenderTransform(const RenderTransform* lhs, const RenderTransfo { assert(lhs && rhs); - auto dx = rhs->x * lhs->factor; - auto dy = rhs->y * lhs->factor; - auto tx = dx * lhs->m.e11 + dy * lhs->m.e12 + lhs->m.e13; - auto ty = dx * lhs->m.e21 + dy * lhs->m.e22 + lhs->m.e23; + m.e11 = lhs->m.e11 * rhs->m.e11 + lhs->m.e12 * rhs->m.e21 + lhs->m.e13 * rhs->m.e31; + m.e12 = lhs->m.e11 * rhs->m.e12 + lhs->m.e12 * rhs->m.e22 + lhs->m.e13 * rhs->m.e32; + m.e13 = lhs->m.e11 * rhs->m.e13 + lhs->m.e12 * rhs->m.e23 + lhs->m.e13 * rhs->m.e33; - x = lhs->x + tx; - y = lhs->y + ty; - degree = lhs->degree + rhs->degree; - factor = lhs->factor * rhs->factor; + m.e21 = lhs->m.e21 * rhs->m.e11 + lhs->m.e22 * rhs->m.e21 + lhs->m.e23 * rhs->m.e31; + m.e22 = lhs->m.e21 * rhs->m.e12 + lhs->m.e22 * rhs->m.e22 + lhs->m.e23 * rhs->m.e32; + m.e23 = lhs->m.e21 * rhs->m.e13 + lhs->m.e22 * rhs->m.e23 + lhs->m.e23 * rhs->m.e33; - update(); + m.e31 = lhs->m.e31 * rhs->m.e11 + lhs->m.e32 * rhs->m.e21 + lhs->m.e33 * rhs->m.e31; + m.e32 = lhs->m.e31 * rhs->m.e12 + lhs->m.e32 * rhs->m.e22 + lhs->m.e33 * rhs->m.e32; + m.e33 = lhs->m.e31 * rhs->m.e13 + lhs->m.e32 * rhs->m.e23 + lhs->m.e33 * rhs->m.e33; } #endif //_TVG_RENDER_CPP_ diff --git a/src/loaders/svg_loader/tvgSvgSceneBuilder.cpp b/src/loaders/svg_loader/tvgSvgSceneBuilder.cpp index c651368..53f0093 100644 --- a/src/loaders/svg_loader/tvgSvgSceneBuilder.cpp +++ b/src/loaders/svg_loader/tvgSvgSceneBuilder.cpp @@ -20,26 +20,6 @@ #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->e21; - rz = atan2(si, cs); - *z = rz * (180.0f / M_PI); - zcs = cosf(-1.0f * rz); - zsi = sinf(-1.0f * 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 _applyLinearGradientProperty(SvgStyleGradient* g, Shape* vg, float rx, float ry, float rw, float rh) { Fill::ColorStop* stops; @@ -225,15 +205,7 @@ void _applyProperty(SvgNode* node, Shape* vg, float vx, float vy, float vw, floa { SvgStyleProperty* style = node->style; - //Apply the transformation - 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->transform) vg->transform(*node->transform); if (node->type == SvgNodeType::Doc) return; //If fill property is nullptr then do nothing @@ -359,13 +331,7 @@ unique_ptr _sceneBuildHelper(SvgNode* node, float vx, float vy, float vw, { if (node->type == SvgNodeType::Doc || node->type == SvgNodeType::G) { auto scene = Scene::gen(); - 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); - } + if (node->transform) scene->transform(*node->transform); node->style->opacity = (node->style->opacity * parentOpacity) / 255.0f; for (auto child : node->child) { child->style->opacity = (child->style->opacity * node->style->opacity) / 255.0f; diff --git a/test/svgs/duke.svg b/test/svgs/duke.svg new file mode 100644 index 0000000..64cdcf8 --- /dev/null +++ b/test/svgs/duke.svg @@ -0,0 +1,25 @@ + + + + + diff --git a/test/testCustomTransform.cpp b/test/testCustomTransform.cpp index f95e41e..4803ef1 100644 --- a/test/testCustomTransform.cpp +++ b/test/testCustomTransform.cpp @@ -61,19 +61,19 @@ void tvgUpdateCmds(tvg::Canvas* canvas, float progress) auto t12 = m.e11 * -sinVal + m.e12 * cosVal; auto t21 = m.e21 * cosVal + m.e22 * sinVal; auto t22 = m.e21 * -sinVal + m.e22 * cosVal; - auto t31 = m.e31 * cosVal + m.e32 * sinVal; - auto t32 = m.e31 * -sinVal + m.e32 * cosVal; + auto t13 = m.e31 * cosVal + m.e32 * sinVal; + auto t23 = m.e31 * -sinVal + m.e32 * cosVal; m.e11 = t11; m.e12 = t12; m.e21 = t21; m.e22 = t22; - m.e31 = t31; - m.e32 = t32; + m.e13 = t13; + m.e23 = t23; //translate - m.e31 = progress * 300.0f + 300.0f; - m.e32 = progress * -100.0f + 300.0f; + m.e13 = progress * 300.0f + 300.0f; + m.e23 = progress * -100.0f + 300.0f; pShape->transform(m);