diff --git a/src/loaders/svg/tvgSvgLoaderCommon.h b/src/loaders/svg/tvgSvgLoaderCommon.h index 61b04b02..8c432935 100644 --- a/src/loaders/svg/tvgSvgLoaderCommon.h +++ b/src/loaders/svg/tvgSvgLoaderCommon.h @@ -190,6 +190,7 @@ struct SvgComposite CompositeMethod method; //TODO: Currently support either one method string *url; SvgNode* node; + bool applying; //flag for checking circualr dependency. }; struct SvgColor diff --git a/src/loaders/svg/tvgSvgSceneBuilder.cpp b/src/loaders/svg/tvgSvgSceneBuilder.cpp index 4766b0cf..31f47c4e 100644 --- a/src/loaders/svg/tvgSvgSceneBuilder.cpp +++ b/src/loaders/svg/tvgSvgSceneBuilder.cpp @@ -179,9 +179,20 @@ static void _applyComposition(Paint* paint, const SvgNode* node, float vx, float { if (node->style->comp.method == CompositeMethod::None) return; + /* Do not drop in Circular Dependency. + Composition can be applied recursively if its children nodes have composition target to this one. */ + if (node->style->comp.applying) { +#ifdef THORVG_LOG_ENABLED + printf("SVG: Multiple Composition Tried! Check out Circular dependency?\n"); +#endif + return; + } + auto compNode = node->style->comp.node; if (!compNode || compNode->child.count == 0) return; + node->style->comp.applying = true; + auto comp = Shape::gen(); comp->fill(255, 255, 255, 255); if (node->transform) comp->transform(*node->transform); @@ -194,6 +205,8 @@ static void _applyComposition(Paint* paint, const SvgNode* node, float vx, float } if (valid) paint->composite(move(comp), node->style->comp.method); + + node->style->comp.applying = false; }