Check for layer parent-child cycles.

This commit is contained in:
John Preston 2019-08-30 12:42:03 +03:00
parent d08a03b650
commit ba6b92f341
2 changed files with 15 additions and 1 deletions

View File

@ -69,6 +69,16 @@ static bool strokeProp(rlottie::Property prop)
}
}
static bool isGoodParentLayer(LOTLayerItem *parent, LOTLayerItem *child) {
do {
if (parent == child) {
return false;
}
parent = parent->resolvedParentLayer();
} while (parent);
return true;
}
LOTCompItem::LOTCompItem(LOTModel *model)
: mCurFrameNo(-1)
{
@ -520,7 +530,10 @@ LOTCompLayerItem::LOTCompLayerItem(LOTLayerData *layerModel)
auto search =
std::find_if(mLayers.begin(), mLayers.end(),
[id](const auto &val) { return val->id() == id; });
if (search != mLayers.end()) layer->setParentLayer((*search).get());
if (search != mLayers.end() &&
isGoodParentLayer((*search).get(), layer.get())) {
layer->setParentLayer((*search).get());
}
}
}

View File

@ -107,6 +107,7 @@ public:
int id() const {return mLayerData->id();}
int parentId() const {return mLayerData->parentId();}
void setParentLayer(LOTLayerItem *parent){mParentLayer = parent;}
LOTLayerItem *resolvedParentLayer() const {return mParentLayer;}
void setComplexContent(bool value) { mComplexContent = value;}
bool complexContent() const {return mComplexContent;}
virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha);