From ba6b92f34116551facd913c4cc93e457ab2b24e4 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 30 Aug 2019 12:42:03 +0300 Subject: [PATCH] Check for layer parent-child cycles. --- src/lottie/lottieitem.cpp | 15 ++++++++++++++- src/lottie/lottieitem.h | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index 95e8d369c9..09d14a4e67 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -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()); + } } } diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index b3165ef059..a359791291 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -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);