From ca92d4a53b33014a3fe54654aefa9aaa2230e34b Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Tue, 4 Jun 2024 00:20:52 +0200 Subject: [PATCH] lottie: fix matte layer finding Layer identifiers do not have to be unique within the entire file - they are unique within a given group. Searching the entire composition to find the referenced matte was an incorrect approach. Error introduced by 1ee79a6c2afafb6b16b14abc969b60c1dbc7a065 @Issue: https://github.com/thorvg/thorvg/issues/2349 --- src/loaders/lottie/tvgLottieBuilder.cpp | 10 +++------- src/loaders/lottie/tvgLottieModel.h | 9 +++++++++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index c5426b19..945c958c 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -98,7 +98,7 @@ struct RenderContext static void _updateChildren(LottieGroup* parent, float frameNo, Inlist& contexts, LottieExpressions* exps); static void _updateLayer(LottieLayer* root, LottieLayer* layer, float frameNo, LottieExpressions* exps); -static bool _buildComposition(LottieComposition* comp, LottieGroup* parent); +static bool _buildComposition(LottieComposition* comp, LottieLayer* parent); static Shape* _draw(LottieGroup* parent, RenderContext* ctx); static void _rotateX(Matrix* m, float degree) @@ -1315,7 +1315,7 @@ static void _attachFont(LottieComposition* comp, LottieLayer* parent) } -static bool _buildComposition(LottieComposition* comp, LottieGroup* parent) +static bool _buildComposition(LottieComposition* comp, LottieLayer* parent) { if (parent->children.count == 0) return false; if (parent->buildDone) return true; @@ -1334,11 +1334,7 @@ static bool _buildComposition(LottieComposition* comp, LottieGroup* parent) child->matteTarget = static_cast(*(c - 1)); } //matte layer is specified by an index. - } else { - if (auto matte = comp->layerByIdx(child->mid)) { - child->matteTarget = matte; - } - } + } else child->matteTarget = parent->layerByIdx(child->mid); } if (child->matteTarget) { diff --git a/src/loaders/lottie/tvgLottieModel.h b/src/loaders/lottie/tvgLottieModel.h index 8209f16a..2074a810 100644 --- a/src/loaders/lottie/tvgLottieModel.h +++ b/src/loaders/lottie/tvgLottieModel.h @@ -571,6 +571,15 @@ struct LottieLayer : LottieGroup Type type = Null; bool autoOrient = false; bool matteSrc = false; + + LottieLayer* layerByIdx(int16_t idx) + { + for (auto child = children.begin(); child < children.end(); ++child) { + auto layer = static_cast(*child); + if (layer->idx == idx) return layer; + } + return nullptr; + } };