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); }