mirror of
https://github.com/thorvg/thorvg.git
synced 2025-07-28 09:05:52 +00:00
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:
parent
c97c60b900
commit
9af89f9f18
5 changed files with 12 additions and 13 deletions
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue