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.
This commit is contained in:
Hermet Park 2023-08-07 13:47:33 +09:00 committed by Hermet Park
parent c97c60b900
commit 9af89f9f18
5 changed files with 12 additions and 13 deletions

View file

@ -66,8 +66,9 @@ struct Canvas::Impl
//Free paints //Free paints
if (free) { if (free) {
for (auto paint : paints) { for (auto paint : paints) {
paint->pImpl->dispose(*renderer); if (paint->pImpl->dispose(*renderer)) {
delete(paint); delete(paint);
}
} }
paints.clear(); paints.clear();
} }

View file

@ -42,7 +42,7 @@ namespace tvg
{ {
virtual ~StrategyMethod() {} 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<RenderData>& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper) = 0; //Return engine data if it has. virtual void* update(RenderMethod& renderer, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper) = 0; //Return engine data if it has.
virtual bool render(RenderMethod& renderer) = 0; virtual bool render(RenderMethod& renderer) = 0;
virtual bool bounds(float* x, float* y, float* w, float* h) = 0; virtual bool bounds(float* x, float* y, float* w, float* h) = 0;

View file

@ -84,12 +84,10 @@ struct Picture::Impl
bool dispose(RenderMethod& renderer) bool dispose(RenderMethod& renderer)
{ {
bool ret = true; if (paint) paint->pImpl->dispose(renderer);
if (paint) ret = paint->pImpl->dispose(renderer); else if (surface) renderer.dispose(rd);
else if (surface) ret = renderer.dispose(rd);
rd = nullptr; rd = nullptr;
return !animated;
return ret;
} }
RenderUpdateFlag load() RenderUpdateFlag load()

View file

@ -85,11 +85,11 @@ struct Scene::Impl
paint->pImpl->dispose(renderer); paint->pImpl->dispose(renderer);
} }
auto ret = renderer.dispose(rd); renderer.dispose(rd);
this->renderer = nullptr; this->renderer = nullptr;
this->rd = nullptr; this->rd = nullptr;
return ret; return true;
} }
bool needComposition(uint8_t opacity) bool needComposition(uint8_t opacity)
@ -231,7 +231,7 @@ struct Scene::Impl
auto dispose = renderer ? true : false; auto dispose = renderer ? true : false;
for (auto paint : paints) { for (auto paint : paints) {
if (dispose) paint->pImpl->dispose(*renderer); if (dispose) free &= paint->pImpl->dispose(*renderer);
if (free) delete(paint); if (free) delete(paint);
} }
paints.clear(); paints.clear();

View file

@ -46,9 +46,9 @@ struct Shape::Impl
bool dispose(RenderMethod& renderer) bool dispose(RenderMethod& renderer)
{ {
auto ret = renderer.dispose(rd); renderer.dispose(rd);
rd = nullptr; rd = nullptr;
return ret; return true;
} }
bool render(RenderMethod& renderer) bool render(RenderMethod& renderer)