From a71fd6652a5bfb313debd776957433b7f55724d2 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 23 May 2024 15:05:35 +0900 Subject: [PATCH] lottie: fixed a missing slot overriding update. the Lottie scene should be updated when the slot overriding is updated. Previously, it only depended on the frame update. issue: https://github.com/thorvg/thorvg/issues/2303 --- src/loaders/lottie/tvgLottieLoader.cpp | 7 +++++-- src/loaders/lottie/tvgLottieLoader.h | 3 ++- src/renderer/tvgPicture.cpp | 7 ++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/loaders/lottie/tvgLottieLoader.cpp b/src/loaders/lottie/tvgLottieLoader.cpp index 235b302b..ba4165ca 100644 --- a/src/loaders/lottie/tvgLottieLoader.cpp +++ b/src/loaders/lottie/tvgLottieLoader.cpp @@ -42,6 +42,7 @@ void LottieLoader::run(unsigned tid) comp = parser.comp; builder->build(comp); } + rebuild = false; } @@ -294,14 +295,14 @@ bool LottieLoader::override(const char* slot) if (idx < 1) success = false; free(temp); - overriden = success; - + rebuild = overriden = success; //reset slots } else if (overriden) { for (auto s = comp->slots.begin(); s < comp->slots.end(); ++s) { (*s)->reset(); } overriden = false; + rebuild = true; } return success; } @@ -361,6 +362,8 @@ float LottieLoader::duration() void LottieLoader::sync() { this->done(); + + if (rebuild) run(0); } diff --git a/src/loaders/lottie/tvgLottieLoader.h b/src/loaders/lottie/tvgLottieLoader.h index abffd1b3..27a6c883 100644 --- a/src/loaders/lottie/tvgLottieLoader.h +++ b/src/loaders/lottie/tvgLottieLoader.h @@ -44,7 +44,8 @@ public: char* dirName = nullptr; //base resource directory bool copy = false; //"content" is owned by this loader - bool overriden = false; //overridden properties with slots. + bool overriden = false; //overridden properties with slots + bool rebuild = false; //require building the lottie scene LottieLoader(); ~LottieLoader(); diff --git a/src/renderer/tvgPicture.cpp b/src/renderer/tvgPicture.cpp index cfa1bccd..5bd55a3f 100644 --- a/src/renderer/tvgPicture.cpp +++ b/src/renderer/tvgPicture.cpp @@ -29,7 +29,9 @@ RenderUpdateFlag Picture::Impl::load() { if (loader) { - if (!paint) { + if (paint) { + loader->sync(); + } else { paint = loader->paint(); if (paint) { if (w != loader->w || h != loader->h) { @@ -42,8 +44,7 @@ RenderUpdateFlag Picture::Impl::load() } return RenderUpdateFlag::None; } - } else loader->sync(); - + } if (!surface) { if ((surface = loader->bitmap())) { return RenderUpdateFlag::Image;