mirror of
https://github.com/thorvg/thorvg.git
synced 2025-07-24 15:19:06 +00:00
svg_loader: symbol++
- The initial value of the overflow attribute was missing - overflow="visible" was missing scaling
This commit is contained in:
parent
70ed0653f1
commit
72ab9268e3
2 changed files with 22 additions and 17 deletions
|
@ -1309,6 +1309,7 @@ static SvgNode* _createSymbolNode(SvgLoaderData* loader, SvgNode* parent, const
|
||||||
|
|
||||||
loader->svgParse->node->display = false;
|
loader->svgParse->node->display = false;
|
||||||
loader->svgParse->node->node.symbol.preserveAspect = true;
|
loader->svgParse->node->node.symbol.preserveAspect = true;
|
||||||
|
loader->svgParse->node->node.symbol.overflowVisible = false;
|
||||||
|
|
||||||
func(buf, bufLength, _attrParseSymbolNode, loader);
|
func(buf, bufLength, _attrParseSymbolNode, loader);
|
||||||
|
|
||||||
|
|
|
@ -573,7 +573,7 @@ static unique_ptr<Scene> _useBuildHelper(const SvgNode* node, const Box& vBox, c
|
||||||
mUseTransform = mathMultiply(&mUseTransform, &mTranslate);
|
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;
|
auto symbol = node->node.use.symbol->node.symbol;
|
||||||
|
|
||||||
Matrix mViewBox = {1, 0, 0, 0, 1, 0, 0, 0, 1};
|
Matrix mViewBox = {1, 0, 0, 0, 1, 0, 0, 0, 1};
|
||||||
|
@ -601,23 +601,27 @@ static unique_ptr<Scene> _useBuildHelper(const SvgNode* node, const Box& vBox, c
|
||||||
Matrix mSceneTransform = mathMultiply(&mUseTransform, &mViewBox);
|
Matrix mSceneTransform = mathMultiply(&mUseTransform, &mViewBox);
|
||||||
scene->transform(mSceneTransform);
|
scene->transform(mSceneTransform);
|
||||||
|
|
||||||
auto viewBoxClip = Shape::gen();
|
if (node->node.use.symbol->node.symbol.overflowVisible) {
|
||||||
viewBoxClip->appendRect(0, 0, symbol.w, symbol.h, 0, 0);
|
finalScene = move(scene);
|
||||||
// mClipTransform = mUseTransform * mSymbolTransform
|
} else {
|
||||||
Matrix mClipTransform = mUseTransform;
|
auto viewBoxClip = Shape::gen();
|
||||||
if (node->node.use.symbol->transform) {
|
viewBoxClip->appendRect(0, 0, symbol.w, symbol.h, 0, 0);
|
||||||
mClipTransform = mathMultiply(&mUseTransform, node->node.use.symbol->transform);
|
// 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) {
|
} else if (node->node.use.x != 0.0f || node->node.use.y != 0.0f) {
|
||||||
scene->transform(mUseTransform);
|
scene->transform(mUseTransform);
|
||||||
finalScene = move(scene);
|
finalScene = move(scene);
|
||||||
|
|
Loading…
Add table
Reference in a new issue