From 72ab9268e34e86f46105eceb021b932823cd350a Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Wed, 16 Feb 2022 01:45:26 +0100 Subject: [PATCH] svg_loader: symbol++ - The initial value of the overflow attribute was missing - overflow="visible" was missing scaling --- src/loaders/svg/tvgSvgLoader.cpp | 1 + src/loaders/svg/tvgSvgSceneBuilder.cpp | 38 ++++++++++++++------------ 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/loaders/svg/tvgSvgLoader.cpp b/src/loaders/svg/tvgSvgLoader.cpp index a7e3ef42..270c62ea 100644 --- a/src/loaders/svg/tvgSvgLoader.cpp +++ b/src/loaders/svg/tvgSvgLoader.cpp @@ -1309,6 +1309,7 @@ static SvgNode* _createSymbolNode(SvgLoaderData* loader, SvgNode* parent, const loader->svgParse->node->display = false; loader->svgParse->node->node.symbol.preserveAspect = true; + loader->svgParse->node->node.symbol.overflowVisible = false; func(buf, bufLength, _attrParseSymbolNode, loader); diff --git a/src/loaders/svg/tvgSvgSceneBuilder.cpp b/src/loaders/svg/tvgSvgSceneBuilder.cpp index 2646c480..591355a6 100644 --- a/src/loaders/svg/tvgSvgSceneBuilder.cpp +++ b/src/loaders/svg/tvgSvgSceneBuilder.cpp @@ -573,7 +573,7 @@ static unique_ptr _useBuildHelper(const SvgNode* node, const Box& vBox, c mUseTransform = mathMultiply(&mUseTransform, &mTranslate); } - if (node->node.use.symbol && !node->node.use.symbol->node.symbol.overflowVisible) { + if (node->node.use.symbol) { auto symbol = node->node.use.symbol->node.symbol; Matrix mViewBox = {1, 0, 0, 0, 1, 0, 0, 0, 1}; @@ -601,23 +601,27 @@ static unique_ptr _useBuildHelper(const SvgNode* node, const Box& vBox, c Matrix mSceneTransform = mathMultiply(&mUseTransform, &mViewBox); scene->transform(mSceneTransform); - auto viewBoxClip = Shape::gen(); - viewBoxClip->appendRect(0, 0, symbol.w, symbol.h, 0, 0); - // mClipTransform = mUseTransform * mSymbolTransform - Matrix mClipTransform = mUseTransform; - if (node->node.use.symbol->transform) { - mClipTransform = mathMultiply(&mUseTransform, node->node.use.symbol->transform); + if (node->node.use.symbol->node.symbol.overflowVisible) { + finalScene = move(scene); + } else { + auto viewBoxClip = Shape::gen(); + viewBoxClip->appendRect(0, 0, symbol.w, symbol.h, 0, 0); + // mClipTransform = mUseTransform * mSymbolTransform + Matrix mClipTransform = mUseTransform; + if (node->node.use.symbol->transform) { + mClipTransform = mathMultiply(&mUseTransform, node->node.use.symbol->transform); + } + viewBoxClip->transform(mClipTransform); + + auto compositeLayer = Scene::gen(); + compositeLayer->composite(move(viewBoxClip), CompositeMethod::ClipPath); + compositeLayer->push(move(scene)); + + auto root = Scene::gen(); + root->push(move(compositeLayer)); + + finalScene = move(root); } - viewBoxClip->transform(mClipTransform); - - auto compositeLayer = Scene::gen(); - compositeLayer->composite(move(viewBoxClip), CompositeMethod::ClipPath); - compositeLayer->push(move(scene)); - - auto root = Scene::gen(); - root->push(move(compositeLayer)); - - finalScene = move(root); } else if (node->node.use.x != 0.0f || node->node.use.y != 0.0f) { scene->transform(mUseTransform); finalScene = move(scene);