canvas: code refactoring

accept an extra argument in the clear() to clear paints node

and clear buffer selectively.

Change-Id: I83721e74358f546f325bb03fd1f36c7565174dd7
This commit is contained in:
Hermet Park 2020-05-02 11:14:14 +09:00
parent c923d881aa
commit a8864390e2
7 changed files with 25 additions and 26 deletions

View file

@ -92,7 +92,7 @@ public:
int reserve(size_t n) noexcept; int reserve(size_t n) noexcept;
virtual int push(std::unique_ptr<PaintNode> paint) noexcept; virtual int push(std::unique_ptr<PaintNode> paint) noexcept;
virtual int clear() noexcept; virtual int clear(bool clearPaints = true) noexcept;
virtual int update() noexcept; virtual int update() noexcept;
virtual int draw(bool async = true) noexcept; virtual int draw(bool async = true) noexcept;
virtual int sync() = 0; virtual int sync() = 0;
@ -179,7 +179,6 @@ class TIZENVG_EXPORT SwCanvas final : public Canvas
public: public:
~SwCanvas(); ~SwCanvas();
int clear() noexcept override;
int target(uint32_t* buffer, size_t stride, size_t w, size_t h) noexcept; int target(uint32_t* buffer, size_t stride, size_t w, size_t h) noexcept;
int sync() noexcept override; int sync() noexcept override;
static std::unique_ptr<SwCanvas> gen() noexcept; static std::unique_ptr<SwCanvas> gen() noexcept;

View file

@ -35,6 +35,11 @@ struct GlShape
/* External Class Implementation */ /* External Class Implementation */
/************************************************************************/ /************************************************************************/
bool GlRenderer::clear()
{
return true;
}
bool GlRenderer::render(const ShapeNode& shape, void *data) bool GlRenderer::render(const ShapeNode& shape, void *data)
{ {
GlShape* sdata = static_cast<GlShape*>(data); GlShape* sdata = static_cast<GlShape*>(data);

View file

@ -26,6 +26,7 @@ public:
void* prepare(const ShapeNode& shape, void* data, UpdateFlag flags) override; void* prepare(const ShapeNode& shape, void* data, UpdateFlag flags) override;
bool dispose(const ShapeNode& shape, void *data) override; bool dispose(const ShapeNode& shape, void *data) override;
bool render(const ShapeNode& shape, void *data) override; bool render(const ShapeNode& shape, void *data) override;
bool clear() override;
size_t ref() override; size_t ref() override;
size_t unref() override; size_t unref() override;

View file

@ -26,7 +26,7 @@ public:
bool dispose(const ShapeNode& shape, void *data) override; bool dispose(const ShapeNode& shape, void *data) override;
bool render(const ShapeNode& shape, void *data) override; bool render(const ShapeNode& shape, void *data) override;
bool target(uint32_t* buffer, size_t stride, size_t w, size_t h); bool target(uint32_t* buffer, size_t stride, size_t w, size_t h);
bool clear(); bool clear() override;
size_t ref() override; size_t ref() override;
size_t unref() override; size_t unref() override;

View file

@ -36,7 +36,7 @@ struct Canvas::Impl
~Impl() ~Impl()
{ {
clear(); clearPaints();
renderer->unref(); renderer->unref();
} }
@ -55,23 +55,27 @@ struct Canvas::Impl
return node->update(renderer); return node->update(renderer);
} }
int clear() bool clearRender()
{ {
assert(renderer); assert(renderer);
return renderer->clear());
}
auto ret = 0; int clearPaints()
{
assert(renderer);
for (auto node : nodes) { for (auto node : nodes) {
if (SceneNode *scene = dynamic_cast<SceneNode *>(node)) { if (SceneNode *scene = dynamic_cast<SceneNode *>(node)) {
cout << "TODO: " << scene << endl; cout << "TODO: " << scene << endl;
} else if (ShapeNode *shape = dynamic_cast<ShapeNode *>(node)) { } else if (ShapeNode *shape = dynamic_cast<ShapeNode *>(node)) {
ret |= renderer->dispose(*shape, shape->engine()); if (!renderer->dispose(*shape, shape->engine())) return -1;
} }
delete(node); delete(node);
} }
nodes.clear(); nodes.clear();
return ret; return 0;
} }
int update() int update()
@ -91,16 +95,14 @@ struct Canvas::Impl
{ {
assert(renderer); assert(renderer);
auto ret = 0;
for(auto node: nodes) { for(auto node: nodes) {
if (SceneNode *scene = dynamic_cast<SceneNode *>(node)) { if (SceneNode *scene = dynamic_cast<SceneNode *>(node)) {
cout << "TODO: " << scene << endl; cout << "TODO: " << scene << endl;
} else if (ShapeNode *shape = dynamic_cast<ShapeNode *>(node)) { } else if (ShapeNode *shape = dynamic_cast<ShapeNode *>(node)) {
ret |= renderer->render(*shape, shape->engine()); if (!renderer->render(*shape, shape->engine())) return -1;
} }
} }
return ret; return 0;
} }
}; };
@ -137,11 +139,14 @@ int Canvas::push(unique_ptr<PaintNode> paint) noexcept
} }
int Canvas::clear() noexcept int Canvas::clear(bool clearPaints) noexcept
{ {
auto impl = pImpl.get(); auto impl = pImpl.get();
assert(impl); assert(impl);
return impl->clear(); auto ret = 0;
if (clearPaints) ret |= impl->clearPaints();
ret |= impl->clearRender();
return ret;
} }

View file

@ -36,6 +36,7 @@ public:
virtual void* prepare(const ShapeNode& shape, void* data, UpdateFlag flags) = 0; virtual void* prepare(const ShapeNode& shape, void* data, UpdateFlag flags) = 0;
virtual bool dispose(const ShapeNode& shape, void *data) = 0; virtual bool dispose(const ShapeNode& shape, void *data) = 0;
virtual bool render(const ShapeNode& shape, void *data) = 0; virtual bool render(const ShapeNode& shape, void *data) = 0;
virtual bool clear() = 0;
virtual size_t ref() = 0; virtual size_t ref() = 0;
virtual size_t unref() = 0; virtual size_t unref() = 0;
}; };

View file

@ -44,18 +44,6 @@ SwCanvas::~SwCanvas()
{ {
} }
int SwCanvas::clear() noexcept
{
auto renderer = dynamic_cast<SwRenderer*>(engine());
assert(renderer);
if (!renderer->clear()) return -1;
return Canvas::clear();
}
int SwCanvas::target(uint32_t* buffer, size_t stride, size_t w, size_t h) noexcept int SwCanvas::target(uint32_t* buffer, size_t stride, size_t w, size_t h) noexcept
{ {
auto renderer = dynamic_cast<SwRenderer*>(engine()); auto renderer = dynamic_cast<SwRenderer*>(engine());