mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-09 06:04:03 +00:00
loaders svg: prevent composition setting if the result shape is invalid.
Current loader could return invalid shapes -default, from _appendShape()- by a certain interpretation result, Though it's a wrong or exception case, we can prevent worse case by avoiding it.
This commit is contained in:
parent
e1eb98af79
commit
903df3da6a
1 changed files with 26 additions and 9 deletions
|
@ -200,13 +200,20 @@ static unique_ptr<RadialGradient> _applyRadialGradientProperty(SvgStyleGradient*
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void _appendChildShape(SvgNode* node, Shape* shape, float vx, float vy, float vw, float vh)
|
static bool _appendChildShape(SvgNode* node, Shape* shape, float vx, float vy, float vw, float vh)
|
||||||
{
|
{
|
||||||
_appendShape(node, shape, vx, vy, vw, vh);
|
auto valid = false;
|
||||||
|
|
||||||
|
if (_appendShape(node, shape, vx, vy, vw, vh)) valid = true;
|
||||||
|
|
||||||
if (node->child.count > 0) {
|
if (node->child.count > 0) {
|
||||||
auto child = node->child.data;
|
auto child = node->child.data;
|
||||||
for (uint32_t i = 0; i < node->child.count; ++i, ++child) _appendChildShape(*child, shape, vx, vy, vw, vh);
|
for (uint32_t i = 0; i < node->child.count; ++i, ++child) {
|
||||||
|
if (_appendChildShape(*child, shape, vx, vy, vw, vh)) valid = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -275,9 +282,14 @@ static void _applyProperty(SvgNode* node, Shape* vg, float vx, float vy, float v
|
||||||
if (compNode->child.count > 0) {
|
if (compNode->child.count > 0) {
|
||||||
auto comp = Shape::gen();
|
auto comp = Shape::gen();
|
||||||
auto child = compNode->child.data;
|
auto child = compNode->child.data;
|
||||||
for (uint32_t i = 0; i < compNode->child.count; ++i, ++child) _appendChildShape(*child, comp.get(), vx, vy, vw, vh);
|
auto valid = false; //Composite only when valid shapes are existed
|
||||||
if (style->comp.method == CompositeMethod::ClipPath) comp->fill(0, 0, 0, 255);
|
for (uint32_t i = 0; i < compNode->child.count; ++i, ++child) {
|
||||||
vg->composite(move(comp), style->comp.method);
|
if (_appendChildShape(*child, comp.get(), vx, vy, vw, vh)) valid = true;
|
||||||
|
}
|
||||||
|
if (valid) {
|
||||||
|
if (style->comp.method == CompositeMethod::ClipPath) comp->fill(0, 0, 0, 255);
|
||||||
|
vg->composite(move(comp), style->comp.method);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -371,9 +383,14 @@ static unique_ptr<Scene> _sceneBuildHelper(const SvgNode* node, float vx, float
|
||||||
if (compNode->child.count > 0) {
|
if (compNode->child.count > 0) {
|
||||||
auto comp = Shape::gen();
|
auto comp = Shape::gen();
|
||||||
auto child = compNode->child.data;
|
auto child = compNode->child.data;
|
||||||
for (uint32_t i = 0; i < compNode->child.count; ++i, ++child) _appendChildShape(*child, comp.get(), vx, vy, vw, vh);
|
auto valid = false; //Composite only when valid shapes are existed
|
||||||
if (node->style->comp.method == CompositeMethod::ClipPath) comp->fill(0, 0, 0, 255);
|
for (uint32_t i = 0; i < compNode->child.count; ++i, ++child) {
|
||||||
scene->composite(move(comp), node->style->comp.method);
|
if (_appendChildShape(*child, comp.get(), vx, vy, vw, vh)) valid = true;
|
||||||
|
}
|
||||||
|
if (valid) {
|
||||||
|
if (node->style->comp.method == CompositeMethod::ClipPath) comp->fill(0, 0, 0, 255);
|
||||||
|
scene->composite(move(comp), node->style->comp.method);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
scene->opacity(node->style->opacity);
|
scene->opacity(node->style->opacity);
|
||||||
|
|
Loading…
Add table
Reference in a new issue