diff --git a/src/loaders/lottie/tvgLottieLoader.cpp b/src/loaders/lottie/tvgLottieLoader.cpp index 96b1f69d..7ea1e58f 100644 --- a/src/loaders/lottie/tvgLottieLoader.cpp +++ b/src/loaders/lottie/tvgLottieLoader.cpp @@ -304,6 +304,7 @@ unique_ptr LottieLoader::paint() { this->done(); if (!comp) return nullptr; + comp->initiated = true; return cast(comp->scene); } diff --git a/src/loaders/lottie/tvgLottieModel.cpp b/src/loaders/lottie/tvgLottieModel.cpp index f5acccd7..2632a5f6 100644 --- a/src/loaders/lottie/tvgLottieModel.cpp +++ b/src/loaders/lottie/tvgLottieModel.cpp @@ -158,6 +158,8 @@ int32_t LottieLayer::remap(int32_t frameNo) LottieComposition::~LottieComposition() { + if (!initiated) delete(scene); + delete(root); free(version); free(name); diff --git a/src/loaders/lottie/tvgLottieModel.h b/src/loaders/lottie/tvgLottieModel.h index 46821843..da1de994 100644 --- a/src/loaders/lottie/tvgLottieModel.h +++ b/src/loaders/lottie/tvgLottieModel.h @@ -585,6 +585,7 @@ struct LottieComposition float frameRate; Array assets; Array interpolators; + bool initiated = false; }; #endif //_TVG_LOTTIE_MODEL_H_ \ No newline at end of file diff --git a/src/renderer/tvgAnimation.cpp b/src/renderer/tvgAnimation.cpp index 4d08665c..7a29ecf9 100644 --- a/src/renderer/tvgAnimation.cpp +++ b/src/renderer/tvgAnimation.cpp @@ -36,12 +36,12 @@ struct Animation::Impl Impl() { picture = Picture::gen().release(); - static_cast(picture)->pImpl->ref(); + PP(picture)->ref(); } ~Impl() { - if (static_cast(picture)->pImpl->unref() == 0) { + if (PP(picture)->unref() == 0) { delete(picture); } } diff --git a/src/renderer/tvgCanvas.h b/src/renderer/tvgCanvas.h index fe21858e..f893f9f7 100644 --- a/src/renderer/tvgCanvas.h +++ b/src/renderer/tvgCanvas.h @@ -53,6 +53,7 @@ struct Canvas::Impl auto p = paint.release(); if (!p) return Result::MemoryCorruption; + PP(p)->ref(); paints.push_back(p); return update(p, true); @@ -66,8 +67,9 @@ struct Canvas::Impl //Free paints if (free) { for (auto paint : paints) { - if (paint->pImpl->dispose(*renderer)) { - if (paint->pImpl->unref() == 0) delete(paint); + P(paint)->unref(); + if (paint->pImpl->dispose(*renderer) && P(paint)->refCnt == 0) { + delete(paint); } } paints.clear(); diff --git a/src/renderer/tvgPaint.h b/src/renderer/tvgPaint.h index 48900bdd..0ee07fed 100644 --- a/src/renderer/tvgPaint.h +++ b/src/renderer/tvgPaint.h @@ -68,7 +68,7 @@ namespace tvg uint8_t ctxFlag = ContextFlag::Invalid; uint8_t id; uint8_t opacity = 255; - uint8_t refCnt = 1; + uint8_t refCnt = 0; ~Impl() { diff --git a/src/renderer/tvgScene.cpp b/src/renderer/tvgScene.cpp index b3bf2940..a4a34608 100644 --- a/src/renderer/tvgScene.cpp +++ b/src/renderer/tvgScene.cpp @@ -55,6 +55,7 @@ Result Scene::push(unique_ptr paint) noexcept { auto p = paint.release(); if (!p) return Result::MemoryCorruption; + PP(p)->ref(); pImpl->paints.push_back(p); return Result::Success; diff --git a/src/renderer/tvgScene.h b/src/renderer/tvgScene.h index 90b17756..10daa49a 100644 --- a/src/renderer/tvgScene.h +++ b/src/renderer/tvgScene.h @@ -220,7 +220,9 @@ struct Scene::Impl auto dup = ret.get()->pImpl; for (auto paint : paints) { - dup->paints.push_back(paint->duplicate()); + auto cdup = paint->duplicate(); + P(cdup)->ref(); + dup->paints.push_back(cdup); } return ret.release(); @@ -231,8 +233,8 @@ struct Scene::Impl auto dispose = renderer ? true : false; for (auto paint : paints) { - if (dispose) free &= paint->pImpl->dispose(*renderer); - if (free) delete(paint); + if (dispose) free &= P(paint)->dispose(*renderer); + if (P(paint)->unref() == 0 && free) delete(paint); } paints.clear(); renderer = nullptr;