From a173b16ed5b1b90452130533fe6a6d57af2738c5 Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Thu, 4 Mar 2021 01:07:42 +0100 Subject: [PATCH] svgloader: fixing linear gradient transformation Gradient stop points were incorrectly transformed when building the scene in the SVG loader. --- src/loaders/svg/tvgSvgSceneBuilder.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/loaders/svg/tvgSvgSceneBuilder.cpp b/src/loaders/svg/tvgSvgSceneBuilder.cpp index e2154787..38b3b6ee 100644 --- a/src/loaders/svg/tvgSvgSceneBuilder.cpp +++ b/src/loaders/svg/tvgSvgSceneBuilder.cpp @@ -77,17 +77,15 @@ unique_ptr _applyLinearGradientProperty(SvgStyleGradient* g, con } if (g->transform) { - float cy = ((float) rh) * 0.5 + ry; - float cx = ((float) rw) * 0.5 + rx; + //Calc start point + auto x = g->linear->x1; + g->linear->x1 = x * g->transform->e11 + g->linear->y1 * g->transform->e12 + g->transform->e13; + g->linear->y1 = x * g->transform->e21 + g->linear->y1 * g->transform->e22 + g->transform->e23; - //= T(x - cx, y - cy) x g->transform x T(cx, cy) - //Calc start point - g->linear->x1 = (g->transform->e11 * cx) + (g->transform->e12 * cy) + g->linear->x1 + g->transform->e13 - cx; - g->linear->y1 = (g->transform->e21 * cx) + (g->transform->e22 * cy) + g->linear->y1 + g->transform->e23 - cy; - - //Calc end point - g->linear->x2 = (g->transform->e11 * cx) + (g->transform->e12 * cy) + g->linear->x2 + g->transform->e13 - cx; - g->linear->y2 = (g->transform->e21 * cx) + (g->transform->e22 * cy) + g->linear->y2 + g->transform->e23 - cy; + //Calc end point + x = g->linear->x2; + g->linear->x2 = x * g->transform->e11 + g->linear->y2 * g->transform->e12 + g->transform->e13; + g->linear->y2 = x * g->transform->e21 + g->linear->y2 * g->transform->e22 + g->transform->e23; } fillGrad->linear(g->linear->x1, g->linear->y1, g->linear->x2, g->linear->y2); @@ -276,7 +274,7 @@ void _applyProperty(SvgNode* node, Shape* vg, float vx, float vy, float vw, floa vg->composite(move(comp), CompositeMethod::ClipPath); } } - //Composite Alpha Mask + //Composite Alpha Mask if (((int)style->comp.flags & (int)SvgCompositeFlags::AlphaMask)) { auto compNode = style->comp.node; if (compNode->child.count > 0) {