From 74c04bc7470b1ad8c4f52dd75a6de8f593ed6e77 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 10 Jan 2024 11:54:32 +0900 Subject: [PATCH] loader: code refactoring Ensure scene data is freed when it's dangled in the loader. --- src/loaders/lottie/tvgLottieLoader.cpp | 6 ++---- src/loaders/svg/tvgSvgLoader.cpp | 4 +--- src/loaders/tvg/tvgTvgLoader.cpp | 13 +++++++++---- src/loaders/tvg/tvgTvgLoader.h | 2 +- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/loaders/lottie/tvgLottieLoader.cpp b/src/loaders/lottie/tvgLottieLoader.cpp index 5cc25b11..7cc2d84d 100644 --- a/src/loaders/lottie/tvgLottieLoader.cpp +++ b/src/loaders/lottie/tvgLottieLoader.cpp @@ -280,10 +280,8 @@ bool LottieLoader::read() { if (!content || size == 0) return false; - if (!LoadModule::read()) return true; - - //the loading has been already completed in header() - if (comp) return true; + //the loading has been already completed + if (comp || !LoadModule::read()) return true; TaskScheduler::request(this); diff --git a/src/loaders/svg/tvgSvgLoader.cpp b/src/loaders/svg/tvgSvgLoader.cpp index 6e524766..74f9871a 100644 --- a/src/loaders/svg/tvgSvgLoader.cpp +++ b/src/loaders/svg/tvgSvgLoader.cpp @@ -3732,10 +3732,8 @@ bool SvgLoader::read() { if (!content || size == 0) return false; - if (!LoadModule::read()) return true; - //the loading has been already completed in header() - if (root) return true; + if (root || !LoadModule::read()) return true; TaskScheduler::request(this); diff --git a/src/loaders/tvg/tvgTvgLoader.cpp b/src/loaders/tvg/tvgTvgLoader.cpp index efb3905f..b3d95c7d 100644 --- a/src/loaders/tvg/tvgTvgLoader.cpp +++ b/src/loaders/tvg/tvgTvgLoader.cpp @@ -32,7 +32,7 @@ /************************************************************************/ -void TvgLoader::clear() +void TvgLoader::clear(bool all) { if (copy) free((char*)data); ptr = data = nullptr; @@ -41,6 +41,8 @@ void TvgLoader::clear() delete(interpreter); interpreter = nullptr; + + if (all) delete(root); } @@ -113,7 +115,7 @@ void TvgLoader::run(unsigned tid) root = interpreter->run(data, this->data + size); } - clear(); + clear(false); } @@ -213,7 +215,8 @@ bool TvgLoader::read() { if (!ptr || size == 0) return false; - if (!LoadModule::read()) return true; + //the loading has been already completed + if (root || !LoadModule::read()) return true; TaskScheduler::request(this); @@ -224,5 +227,7 @@ bool TvgLoader::read() Paint* TvgLoader::paint() { this->done(); - return root; + auto ret = root; + root = nullptr; + return ret; } diff --git a/src/loaders/tvg/tvgTvgLoader.h b/src/loaders/tvg/tvgTvgLoader.h index e27827b0..6dba4573 100644 --- a/src/loaders/tvg/tvgTvgLoader.h +++ b/src/loaders/tvg/tvgTvgLoader.h @@ -55,7 +55,7 @@ public: private: bool readHeader(); void run(unsigned tid) override; - void clear(); + void clear(bool all = true); }; #endif //_TVG_TVG_LOADER_H_