From 3e78a95b57173f101ff1d6f2cc2d14945075c7a9 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 8 Aug 2024 11:48:09 +0900 Subject: [PATCH] lottie: support matte+masking combination introduced an intermediate scene for embracing the matte and maskings --- src/loaders/lottie/tvgLottieBuilder.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index 6f740711..24f8c43a 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -1195,6 +1195,13 @@ static void _updateMaskings(LottieLayer* layer, float frameNo, LottieExpressions { if (layer->masks.count == 0) return; + //Introduce an intermediate scene for embracing the matte + masking + if (layer->matteTarget) { + auto scene = Scene::gen().release(); + scene->push(cast(layer->scene)); + layer->scene = scene; + } + //Apply the base mask auto pMask = static_cast(layer->masks[0]); auto pMethod = pMask->method; @@ -1277,12 +1284,8 @@ static void _updateLayer(LottieComposition* comp, Scene* scene, LottieLayer* lay layer->scene->transform(layer->cache.matrix); - if (layer->matteTarget && layer->masks.count > 0) TVGERR("LOTTIE", "FIXME: Matte + Masking??"); - if (!_updateMatte(comp, frameNo, scene, layer, exps)) return; - _updateMaskings(layer, frameNo, exps); - switch (layer->type) { case LottieLayer::Precomp: { _updatePrecomp(comp, layer, frameNo, exps); @@ -1311,6 +1314,8 @@ static void _updateLayer(LottieComposition* comp, Scene* scene, LottieLayer* lay } } + _updateMaskings(layer, frameNo, exps); + layer->scene->blend(layer->blendMethod); //the given matte source was composited by the target earlier.