diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index 84f7b2ab..dd80f754 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -1000,18 +1000,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 5ab009ba..bc1c9ecd 100644 --- a/src/loaders/lottie/tvgLottieModel.cpp +++ b/src/loaders/lottie/tvgLottieModel.cpp @@ -331,6 +331,8 @@ LottieLayer::~LottieLayer() delete(*m); } + 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 0e0449db..79b97348 100644 --- a/src/loaders/lottie/tvgLottieModel.h +++ b/src/loaders/lottie/tvgLottieModel.h @@ -594,6 +594,8 @@ struct LottieLayer : LottieGroup RGB24 color; //used by Solid layer LottieLayer* matteTarget = nullptr; + tvg::Shape* clipper = nullptr; + float timeStretch = 1.0f; float w = 0.0f, h = 0.0f; float inFrame = 0.0f;