From 6a589777b04f22a9d9b7f406f08cd580e1d96d41 Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Mon, 7 Feb 2022 02:39:48 +0100 Subject: [PATCH] svg_loader: proper image transformation One of the image's attributes can be a transformation matrix. Now it's applied. --- src/loaders/svg/tvgSvgLoader.cpp | 2 ++ src/loaders/svg/tvgSvgSceneBuilder.cpp | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/loaders/svg/tvgSvgLoader.cpp b/src/loaders/svg/tvgSvgLoader.cpp index ce8eab31..82ee33f3 100644 --- a/src/loaders/svg/tvgSvgLoader.cpp +++ b/src/loaders/svg/tvgSvgLoader.cpp @@ -1715,6 +1715,8 @@ static bool _attrParseImageNode(void* data, const char* key, const char* value) _handleClipPathAttr(loader, node, value); } else if (!strcmp(key, "mask")) { _handleMaskAttr(loader, node, value); + } else if (!strcmp(key, "transform")) { + node->transform = _parseTransformationMatrix(value); } else { return _parseStyleAttr(loader, key, value); } diff --git a/src/loaders/svg/tvgSvgSceneBuilder.cpp b/src/loaders/svg/tvgSvgSceneBuilder.cpp index ed9576bc..737d99be 100644 --- a/src/loaders/svg/tvgSvgSceneBuilder.cpp +++ b/src/loaders/svg/tvgSvgSceneBuilder.cpp @@ -546,12 +546,14 @@ static unique_ptr _imageBuildHelper(SvgNode* node, const Box& vBox, con } float w, h; + Matrix m = {1, 0, 0, 0, 1, 0, 0, 0, 1}; if (picture->size(&w, &h) == Result::Success && w > 0 && h > 0) { auto sx = node->node.image.w / w; auto sy = node->node.image.h / h; - Matrix m = {sx, 0, node->node.image.x, 0, sy, node->node.image.y, 0, 0, 1}; - picture->transform(m); + m = {sx, 0, node->node.image.x, 0, sy, node->node.image.y, 0, 0, 1}; } + if (node->transform) m = mathMultiply(node->transform, &m); + picture->transform(m); _applyComposition(picture.get(), node, vBox, svgPath); return picture;