From 9af89f9f18ed3252eae7bf592957e046e65f0899 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 7 Aug 2023 13:47:33 +0900 Subject: [PATCH] common: deleted paints only when they are no longer valid. Pictures can be shared with Animation instances. The condition can now be distinguished by checking the `dispose()` return value. --- src/lib/tvgCanvasImpl.h | 5 +++-- src/lib/tvgPaint.h | 2 +- src/lib/tvgPictureImpl.h | 8 +++----- src/lib/tvgSceneImpl.h | 6 +++--- src/lib/tvgShapeImpl.h | 4 ++-- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/lib/tvgCanvasImpl.h b/src/lib/tvgCanvasImpl.h index 3e251caf..42a2976c 100644 --- a/src/lib/tvgCanvasImpl.h +++ b/src/lib/tvgCanvasImpl.h @@ -66,8 +66,9 @@ struct Canvas::Impl //Free paints if (free) { for (auto paint : paints) { - paint->pImpl->dispose(*renderer); - delete(paint); + if (paint->pImpl->dispose(*renderer)) { + delete(paint); + } } paints.clear(); } diff --git a/src/lib/tvgPaint.h b/src/lib/tvgPaint.h index c00238a0..ba33e1b5 100644 --- a/src/lib/tvgPaint.h +++ b/src/lib/tvgPaint.h @@ -42,7 +42,7 @@ namespace tvg { virtual ~StrategyMethod() {} - virtual bool dispose(RenderMethod& renderer) = 0; + virtual bool dispose(RenderMethod& renderer) = 0; //return true if the deletion is allowed. virtual void* update(RenderMethod& renderer, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper) = 0; //Return engine data if it has. virtual bool render(RenderMethod& renderer) = 0; virtual bool bounds(float* x, float* y, float* w, float* h) = 0; diff --git a/src/lib/tvgPictureImpl.h b/src/lib/tvgPictureImpl.h index d445c72c..114c46f5 100644 --- a/src/lib/tvgPictureImpl.h +++ b/src/lib/tvgPictureImpl.h @@ -84,12 +84,10 @@ struct Picture::Impl bool dispose(RenderMethod& renderer) { - bool ret = true; - if (paint) ret = paint->pImpl->dispose(renderer); - else if (surface) ret = renderer.dispose(rd); + if (paint) paint->pImpl->dispose(renderer); + else if (surface) renderer.dispose(rd); rd = nullptr; - - return ret; + return !animated; } RenderUpdateFlag load() diff --git a/src/lib/tvgSceneImpl.h b/src/lib/tvgSceneImpl.h index 8fa38bcc..28890a6b 100644 --- a/src/lib/tvgSceneImpl.h +++ b/src/lib/tvgSceneImpl.h @@ -85,11 +85,11 @@ struct Scene::Impl paint->pImpl->dispose(renderer); } - auto ret = renderer.dispose(rd); + renderer.dispose(rd); this->renderer = nullptr; this->rd = nullptr; - return ret; + return true; } bool needComposition(uint8_t opacity) @@ -231,7 +231,7 @@ struct Scene::Impl auto dispose = renderer ? true : false; for (auto paint : paints) { - if (dispose) paint->pImpl->dispose(*renderer); + if (dispose) free &= paint->pImpl->dispose(*renderer); if (free) delete(paint); } paints.clear(); diff --git a/src/lib/tvgShapeImpl.h b/src/lib/tvgShapeImpl.h index b05f85bf..8be45a2e 100644 --- a/src/lib/tvgShapeImpl.h +++ b/src/lib/tvgShapeImpl.h @@ -46,9 +46,9 @@ struct Shape::Impl bool dispose(RenderMethod& renderer) { - auto ret = renderer.dispose(rd); + renderer.dispose(rd); rd = nullptr; - return ret; + return true; } bool render(RenderMethod& renderer)