diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index 0f249b9c..20d7d3ed 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -1542,15 +1542,12 @@ bool LottieBuilder::update(LottieComposition* comp, float frameNo) if (equal(frameNo, tween.frameNo)) offTween(); } - //update children layers - auto root = comp->root; - root->scene->remove(); - if (exps && comp->expressions) exps->update(comp->timeAtFrame(frameNo)); - ARRAY_REVERSE_FOREACH(child, root->children) { + //update children layers + ARRAY_REVERSE_FOREACH(child, comp->root->children) { auto layer = static_cast(*child); - if (!layer->matteSrc) updateLayer(comp, root->scene, layer, frameNo); + if (!layer->matteSrc) updateLayer(comp, comp->root->scene, layer, frameNo); } return true; diff --git a/src/loaders/lottie/tvgLottieLoader.cpp b/src/loaders/lottie/tvgLottieLoader.cpp index f56f61d8..be4c9b64 100644 --- a/src/loaders/lottie/tvgLottieLoader.cpp +++ b/src/loaders/lottie/tvgLottieLoader.cpp @@ -347,6 +347,8 @@ bool LottieLoader::frame(float no) builder->offTween(); + if (comp) comp->clear(); //clear synchronously + TaskScheduler::request(this); return true; @@ -452,6 +454,8 @@ bool LottieLoader::tween(float from, float to, float progress) builder->onTween(shorten(to), progress); + if (comp) comp->clear(); //clear synchronously + TaskScheduler::request(this); return true; diff --git a/src/loaders/lottie/tvgLottieModel.h b/src/loaders/lottie/tvgLottieModel.h index 6b279fe3..6f54132b 100644 --- a/src/loaders/lottie/tvgLottieModel.h +++ b/src/loaders/lottie/tvgLottieModel.h @@ -1089,6 +1089,11 @@ struct LottieComposition { ~LottieComposition(); + void clear() + { + if (root && root->scene) root->scene->remove(); + } + float duration() const { return frameCnt() / frameRate; // in second diff --git a/src/renderer/sw_engine/tvgSwRenderer.cpp b/src/renderer/sw_engine/tvgSwRenderer.cpp index b6297a24..baa0291c 100644 --- a/src/renderer/sw_engine/tvgSwRenderer.cpp +++ b/src/renderer/sw_engine/tvgSwRenderer.cpp @@ -384,7 +384,7 @@ bool SwRenderer::postRender() void SwRenderer::damage(RenderData rd, const RenderRegion& region) { SwTask* task = static_cast(rd); - if (task && task->opacity == 0) return; + if (dirtyRegion.deactivated() || (task && task->opacity == 0)) return; dirtyRegion.add(region); } diff --git a/src/renderer/tvgRender.cpp b/src/renderer/tvgRender.cpp index 221d0000..392da4aa 100644 --- a/src/renderer/tvgRender.cpp +++ b/src/renderer/tvgRender.cpp @@ -160,8 +160,6 @@ void RenderDirtyRegion::init(uint32_t w, uint32_t h) bool RenderDirtyRegion::add(const RenderRegion& bbox) { - if (disabled) return false; - for (int idx = 0; idx < PARTITIONING; ++idx) { auto& partition = partitions[idx]; if (bbox.max.y <= partition.region.min.y) break; @@ -176,7 +174,6 @@ bool RenderDirtyRegion::add(const RenderRegion& bbox) bool RenderDirtyRegion::add(const RenderRegion& prv, const RenderRegion& cur) { - if (disabled) return false; if (prv == cur) return add(prv); for (int idx = 0; idx < PARTITIONING; ++idx) {