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
if (free) {
for (auto paint : paints) {
paint->pImpl->dispose(*renderer);
delete(paint);
if (paint->pImpl->dispose(*renderer)) {
delete(paint);
}
}
paints.clear();
}

View file

@ -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<RenderData>& 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;

View file

@ -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()

View file

@ -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();

View file

@ -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)