common canvas: revise clear method.

Canvas::clear() introduces a new argument "free" that deterimes freeing the retained paints.

If free is true, Canvas won't delete the retained paints so that user keep paints valid.

In this scenario, user must have paints pointers, free them manually or push them again to the canvas.

This scenario is useful if user wants to re-organize paints order in the list or reuse them.
This commit is contained in:
Hermet Park 2020-10-08 11:55:50 +09:00 committed by Hermet Park
parent 4de26d7c86
commit 8422e8c62b
5 changed files with 14 additions and 11 deletions

View file

@ -148,7 +148,7 @@ public:
Result reserve(uint32_t n) noexcept; Result reserve(uint32_t n) noexcept;
virtual Result push(std::unique_ptr<Paint> paint) noexcept; virtual Result push(std::unique_ptr<Paint> paint) noexcept;
virtual Result clear() noexcept; virtual Result clear(bool free = true) noexcept;
virtual Result update(Paint* paint) noexcept; virtual Result update(Paint* paint) noexcept;
virtual Result draw() noexcept; virtual Result draw() noexcept;
virtual Result sync() noexcept; virtual Result sync() noexcept;

View file

@ -147,4 +147,4 @@ void bezSplitAt(const Bezier& cur, float at, Bezier& left, Bezier& right)
bezSplitLeft(right, t, left); bezSplitLeft(right, t, left);
} }
} }

View file

@ -49,9 +49,9 @@ Result Canvas::push(unique_ptr<Paint> paint) noexcept
} }
Result Canvas::clear() noexcept Result Canvas::clear(bool free) noexcept
{ {
return pImpl->clear(); return pImpl->clear(free);
} }

View file

@ -40,7 +40,7 @@ struct Canvas::Impl
~Impl() ~Impl()
{ {
clear(); clear(true);
delete(renderer); delete(renderer);
} }
@ -53,16 +53,19 @@ struct Canvas::Impl
return update(p); return update(p);
} }
Result clear() Result clear(bool free)
{ {
if (!renderer) return Result::InsufficientCondition; if (!renderer) return Result::InsufficientCondition;
//Clear render target before drawing //Clear render target before drawing
if (!renderer->clear()) return Result::InsufficientCondition; if (!renderer->clear()) return Result::InsufficientCondition;
for (auto paint : paints) { //free paints
paint->pImpl->dispose(*renderer); if (free) {
delete(paint); for (auto paint : paints) {
paint->pImpl->dispose(*renderer);
delete(paint);
}
} }
paints.clear(); paints.clear();
@ -79,7 +82,7 @@ struct Canvas::Impl
//Update single paint node //Update single paint node
if (paint) { if (paint) {
paint->pImpl->update(*renderer, nullptr, compList, RenderUpdateFlag::None); paint->pImpl->update(*renderer, nullptr, compList, RenderUpdateFlag::None);
//Update retained all paint nodes //Update all retained paint nodes
} else { } else {
for (auto paint: paints) { for (auto paint: paints) {
paint->pImpl->update(*renderer, nullptr, compList, RenderUpdateFlag::None); paint->pImpl->update(*renderer, nullptr, compList, RenderUpdateFlag::None);

View file

@ -123,7 +123,7 @@ namespace tvg
bool dispose(RenderMethod& renderer) bool dispose(RenderMethod& renderer)
{ {
if (this->compTarget) this->compTarget->pImpl->dispose(renderer); if (compTarget) compTarget->pImpl->dispose(renderer);
return smethod->dispose(renderer); return smethod->dispose(renderer);
} }