From 4f2f4dbf2622c02d7755ca29840f186854f77398 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 19 Jul 2024 08:34:25 +0900 Subject: [PATCH] Revert "Revert "lottie: ++ scene composing optimization"" This reverts commit 8c3586a7c413367e0b92470f118d3cf781078aca. --- src/loaders/lottie/tvgLottieBuilder.cpp | 23 +++++++++++++---------- src/loaders/lottie/tvgLottieModel.cpp | 1 + src/loaders/lottie/tvgLottieModel.h | 1 + 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index 7ffcd275..052f6788 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -1027,18 +1027,21 @@ static void _updatePrecomp(LottieLayer* precomp, float frameNo, LottieExpression if (!child->matteSrc) _updateLayer(precomp, child, frameNo, exps); } - //clip the layer viewport - if (precomp->w > 0 && precomp->h > 0) { - auto clipper = Shape::gen().release(); - clipper->appendRect(0, 0, static_cast(precomp->w), static_cast(precomp->h)); - clipper->transform(precomp->cache.matrix); - - //TODO: remove the intermediate scene.... - auto cscene = Scene::gen(); - cscene->composite(cast(clipper), CompositeMethod::ClipPath); + //TODO: remove the intermediate scene.... + if (precomp->scene->composite(nullptr) != tvg::CompositeMethod::None) { + auto cscene = Scene::gen().release(); cscene->push(cast(precomp->scene)); - precomp->scene = cscene.release(); + precomp->scene = cscene; } + + //clip the layer viewport + if (!precomp->clipper) { + precomp->clipper = Shape::gen().release(); + precomp->clipper->appendRect(0, 0, static_cast(precomp->w), static_cast(precomp->h)); + PP(precomp->clipper)->ref(); + } + precomp->clipper->transform(precomp->cache.matrix); + precomp->scene->composite(cast(precomp->clipper), CompositeMethod::ClipPath); } diff --git a/src/loaders/lottie/tvgLottieModel.cpp b/src/loaders/lottie/tvgLottieModel.cpp index 469f0888..ab7014dc 100644 --- a/src/loaders/lottie/tvgLottieModel.cpp +++ b/src/loaders/lottie/tvgLottieModel.cpp @@ -333,6 +333,7 @@ LottieLayer::~LottieLayer() //Remove tvg render paints if (solidFill && PP(solidFill)->unref() == 0) delete(solidFill); + if (clipper && PP(clipper)->unref() == 0) delete(clipper); delete(transform); free(name); diff --git a/src/loaders/lottie/tvgLottieModel.h b/src/loaders/lottie/tvgLottieModel.h index 8d370360..3cabbde0 100644 --- a/src/loaders/lottie/tvgLottieModel.h +++ b/src/loaders/lottie/tvgLottieModel.h @@ -594,6 +594,7 @@ struct LottieLayer : LottieGroup LottieLayer* matteTarget = nullptr; tvg::Shape* solidFill = nullptr; + tvg::Shape* clipper = nullptr; float timeStretch = 1.0f; float w = 0.0f, h = 0.0f;