svg_loader: symbol++

- The initial value of the overflow attribute was missing
- overflow="visible" was missing scaling
This commit is contained in:
Mira Grudzinska 2022-02-16 01:45:26 +01:00 committed by Hermet Park
parent 70ed0653f1
commit 72ab9268e3
2 changed files with 22 additions and 17 deletions

View file

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

View file

@ -573,7 +573,7 @@ static unique_ptr<Scene> _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<Scene> _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);