From 631c1e565168b28f4566cd892ff1311754b65a87 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Mon, 15 Mar 2021 14:56:36 +0900 Subject: [PATCH] loader SvgSceneBuilder: Add root node to clipping viewBox. If the boundary of scene created through the scenebuilder is larger than the viewbox, scene(SVG's root) should be clipped to the size of the viewbox. So, if scene need a clip, add a parent root and add clippath composition to that root. --- src/loaders/svg/tvgSvgSceneBuilder.cpp | 28 +++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/loaders/svg/tvgSvgSceneBuilder.cpp b/src/loaders/svg/tvgSvgSceneBuilder.cpp index 38b3b6ee..0bbc0233 100644 --- a/src/loaders/svg/tvgSvgSceneBuilder.cpp +++ b/src/loaders/svg/tvgSvgSceneBuilder.cpp @@ -386,6 +386,32 @@ unique_ptr _sceneBuildHelper(const SvgNode* node, float vx, float vy, flo return nullptr; } +unique_ptr _buildRoot(const SvgNode* node, float vx, float vy, float vw, float vh) +{ + unique_ptr root; + auto docNode = move(_sceneBuildHelper(node, vx, vy, vw, vh)); + float x, y, w, h; + + if (docNode->bounds(&x, &y, &w, &h) != Result::Success) return nullptr; + + if (x < vx || y < vy || w > vh || h > vh) { + auto viewBoxClip = Shape::gen(); + viewBoxClip->appendRect(vx, vy ,vw, vh, 0, 0); + viewBoxClip->fill(0, 0, 0, 255); + + auto compositeLayer = Scene::gen(); + compositeLayer->composite(move(viewBoxClip), tvg::CompositeMethod::ClipPath); + compositeLayer->push(move(docNode)); + + root = Scene::gen(); + root->push(move(compositeLayer)); + } + else + { + root = move(docNode); + } + return root; +} SvgSceneBuilder::SvgSceneBuilder() { @@ -401,5 +427,5 @@ unique_ptr SvgSceneBuilder::build(SvgNode* node) { if (!node || (node->type != SvgNodeType::Doc)) return nullptr; - return _sceneBuildHelper(node, node->node.doc.vx, node->node.doc.vy, node->node.doc.vw, node->node.doc.vh); + return _buildRoot(node, node->node.doc.vx, node->node.doc.vy, node->node.doc.vw, node->node.doc.vh); }