int reserve(size_t n) 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 draw(bool async = true) noexcept;
virtual int sync() = 0;
public:
~SwCanvas();
- int clear() noexcept override;
int target(uint32_t* buffer, size_t stride, size_t w, size_t h) noexcept;
int sync() noexcept override;
static std::unique_ptr<SwCanvas> gen() noexcept;
/* External Class Implementation */
/************************************************************************/
+bool GlRenderer::clear()
+{
+ return true;
+}
+
bool GlRenderer::render(const ShapeNode& shape, void *data)
{
GlShape* sdata = static_cast<GlShape*>(data);
void* prepare(const ShapeNode& shape, void* data, UpdateFlag flags) override;
bool dispose(const ShapeNode& shape, void *data) override;
bool render(const ShapeNode& shape, void *data) override;
+ bool clear() override;
size_t ref() override;
size_t unref() override;
bool dispose(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 clear();
+ bool clear() override;
size_t ref() override;
size_t unref() override;
~Impl()
{
- clear();
+ clearPaints();
renderer->unref();
}
return node->update(renderer);
}
- int clear()
+ bool clearRender()
{
assert(renderer);
+ return renderer->clear());
+ }
- auto ret = 0;
+ int clearPaints()
+ {
+ assert(renderer);
for (auto node : nodes) {
if (SceneNode *scene = dynamic_cast<SceneNode *>(node)) {
cout << "TODO: " << scene << endl;
} else if (ShapeNode *shape = dynamic_cast<ShapeNode *>(node)) {
- ret |= renderer->dispose(*shape, shape->engine());
+ if (!renderer->dispose(*shape, shape->engine())) return -1;
}
delete(node);
}
nodes.clear();
- return ret;
+ return 0;
}
int update()
{
assert(renderer);
- auto ret = 0;
-
for(auto node: nodes) {
if (SceneNode *scene = dynamic_cast<SceneNode *>(node)) {
cout << "TODO: " << scene << endl;
} 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;
}
};
}
-int Canvas::clear() noexcept
+int Canvas::clear(bool clearPaints) noexcept
{
auto impl = pImpl.get();
assert(impl);
- return impl->clear();
+ auto ret = 0;
+ if (clearPaints) ret |= impl->clearPaints();
+ ret |= impl->clearRender();
+ return ret;
}
virtual void* prepare(const ShapeNode& shape, void* data, UpdateFlag flags) = 0;
virtual bool dispose(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 unref() = 0;
};
{
}
-
-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
{
auto renderer = dynamic_cast<SwRenderer*>(engine());