From 1779689f03f57cccde973ec72cf2525ad91c789e Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 19 Nov 2024 00:04:15 +0900 Subject: [PATCH] lottie: Fixed a regression bug Reverted commit db800c8d4500cd379238c4ec1c9f6c59e70fe908, which introduced another regression that omitted support for multiple image asset references. Updated the data of active images in the pooler within the override() function to resolve the issue. --- src/loaders/lottie/tvgLottieBuilder.cpp | 2 +- src/loaders/lottie/tvgLottieModel.cpp | 21 +++++++++++++++++---- src/loaders/lottie/tvgLottieModel.h | 11 +++-------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index ec75c4ce..63f5b6fd 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -978,7 +978,7 @@ void LottieBuilder::updateSolid(LottieLayer* layer) void LottieBuilder::updateImage(LottieGroup* layer) { auto image = static_cast(layer->children.first()); - layer->scene->push(tvg::cast(image->picture)); + layer->scene->push(tvg::cast(image->pooling(true))); } diff --git a/src/loaders/lottie/tvgLottieModel.cpp b/src/loaders/lottie/tvgLottieModel.cpp index cc23a62d..05715485 100644 --- a/src/loaders/lottie/tvgLottieModel.cpp +++ b/src/loaders/lottie/tvgLottieModel.cpp @@ -159,10 +159,7 @@ void LottieImage::prepare() { LottieObject::type = LottieObject::Image; - if (!picture) { - picture = Picture::gen().release(); - PP(picture)->ref(); - } + auto picture = Picture::gen().release(); //force to load a picture on the same thread TaskScheduler::async(false); @@ -173,6 +170,22 @@ void LottieImage::prepare() TaskScheduler::async(true); picture->size(data.width, data.height); + PP(picture)->ref(); + + pooler.push(picture); +} + + +void LottieImage::update() +{ + //Update the picture data + TaskScheduler::async(false); + for (auto p = pooler.begin(); p < pooler.end(); ++p) { + if (data.size > 0) (*p)->load((const char*)data.b64Data, data.size, data.mimeType, false); + else (*p)->load(data.path); + (*p)->size(data.width, data.height); + } + TaskScheduler::async(true); } diff --git a/src/loaders/lottie/tvgLottieModel.h b/src/loaders/lottie/tvgLottieModel.h index 516881bd..e2df452c 100644 --- a/src/loaders/lottie/tvgLottieModel.h +++ b/src/loaders/lottie/tvgLottieModel.h @@ -656,24 +656,19 @@ struct LottieGradientStroke : LottieGradient, LottieStroke }; -struct LottieImage : LottieObject +struct LottieImage : LottieObject, LottieRenderPooler { LottieBitmap data; - Picture* picture = nullptr; - - ~LottieImage() - { - if (PP(picture)->unref() == 0) delete(picture); - } void override(LottieProperty* prop, bool byDefault = false) override { if (byDefault) data.release(); data = *static_cast(prop); - prepare(); + update(); } void prepare(); + void update(); };