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(); };