A() = delete; \
~A() = delete
+#define _TIZENVG_IDENTIFIER(A) \
+protected: \
+ unsigned A##_Id
+
namespace tvg
{
+class RenderMethod;
+class Scene;
+class Canvas;
+
+
enum class TIZENVG_EXPORT Result { Success = 0, InvalidArguments, InsufficientCondition, FailedAllocation, MemoryCorruption, Unknown };
enum class TIZENVG_EXPORT PathCommand { Close = 0, MoveTo, LineTo, CubicTo };
enum class TIZENVG_EXPORT StrokeCap { Square = 0, Round, Butt };
enum class TIZENVG_EXPORT StrokeJoin { Bevel = 0, Round, Miter };
-class RenderMethod;
-class Scene;
struct Point
{
virtual Result translate(float x, float y) = 0;
virtual Result bounds(float* x, float* y, float* w, float* h) const = 0;
+
+ _TIZENVG_IDENTIFIER(Paint);
+ _TIZENVG_DECLARE_ACCESSOR(Scene);
+ _TIZENVG_DECLARE_ACCESSOR(Canvas);
};
GlRenderer* GlRenderer::inst()
{
- return dynamic_cast<GlRenderer*>(RenderInitializer::inst(renderInit));
+ //We know renderer type, avoid dynamic_cast for performance.
+ return static_cast<GlRenderer*>(RenderInitializer::inst(renderInit));
}
SwRenderer* SwRenderer::inst()
{
- return dynamic_cast<SwRenderer*>(RenderInitializer::inst(renderInit));
+ //We know renderer type, avoid dynamic_cast for performance.
+ return static_cast<SwRenderer*>(RenderInitializer::inst(renderInit));
}
#endif /* _TVG_SW_RENDERER_CPP_ */
assert(renderer);
for (auto paint : paints) {
- if (auto scene = dynamic_cast<Scene*>(paint)) {
+ if (paint->Paint_Id == PAINT_ID_SCENE) {
+ //We know renderer type, avoid dynamic_cast for performance.
+ auto scene = static_cast<Scene*>(paint);
if (!SCENE_IMPL->clear(*renderer)) return Result::InsufficientCondition;
- } else if (auto shape = dynamic_cast<Shape*>(paint)) {
+ } else {
+ auto shape = static_cast<Shape*>(paint);
if (!SHAPE_IMPL->dispose(*shape, *renderer)) return Result::InsufficientCondition;
}
delete(paint);
assert(renderer);
for(auto paint: paints) {
- if (auto scene = dynamic_cast<Scene*>(paint)) {
+ if (paint->Paint_Id == PAINT_ID_SCENE) {
+ //We know renderer type, avoid dynamic_cast for performance.
+ auto scene = static_cast<Scene*>(paint);
if (!SCENE_IMPL->update(*renderer, nullptr)) return Result::InsufficientCondition;
- } else if (auto shape = dynamic_cast<Shape*>(paint)) {
+ } else {
+ auto shape = static_cast<Shape*>(paint);
if (!SHAPE_IMPL->update(*shape, *renderer, nullptr)) return Result::InsufficientCondition;
}
}
{
assert(renderer);
- if (auto scene = dynamic_cast<Scene*>(paint)) {
+ if (paint->Paint_Id == PAINT_ID_SCENE) {
+ //We know renderer type, avoid dynamic_cast for performance.
+ auto scene = static_cast<Scene*>(paint);
if (!SCENE_IMPL->update(*renderer)) return Result::InsufficientCondition;
- } else if (auto shape = dynamic_cast<Shape*>(paint)) {
+ } else {
+ auto shape = static_cast<Shape*>(paint);
if (!SHAPE_IMPL->update(*shape, *renderer)) return Result::InsufficientCondition;
}
return Result::Success;
if (!renderer->clear()) return Result::InsufficientCondition;
for(auto paint: paints) {
- if (auto scene = dynamic_cast<Scene*>(paint)) {
+ if (paint->Paint_Id == PAINT_ID_SCENE) {
+ //We know renderer type, avoid dynamic_cast for performance.
+ auto scene = static_cast<Scene*>(paint);
if(!SCENE_IMPL->render(*renderer)) return Result::InsufficientCondition;
- } else if (auto shape = dynamic_cast<Shape*>(paint)) {
+ } else {
+ auto shape = static_cast<Shape*>(paint);
if(!SHAPE_IMPL->render(*shape, *renderer)) return Result::InsufficientCondition;
}
}
#define SCENE_IMPL scene->pImpl.get()
#define SHAPE_IMPL shape->pImpl.get()
+#define PAINT_ID_SHAPE 0
+#define PAINT_ID_SCENE 1
+
#include "tvgRenderCommon.h"
#include "tvgShapePath.h"
#include "tvgShapeImpl.h"
Result GlCanvas::target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h) noexcept
{
- auto renderer = dynamic_cast<GlRenderer*>(Canvas::pImpl.get()->renderer);
+ //We know renderer type, avoid dynamic_cast for performance.
+ auto renderer = static_cast<GlRenderer*>(Canvas::pImpl.get()->renderer);
if (!renderer) return Result::MemoryCorruption;
if (!renderer->target(buffer, stride, w, h)) return Result::Unknown;
Scene::Scene() : pImpl(make_unique<Impl>())
{
-
+ Paint_Id = PAINT_ID_SCENE;
}
bool clear(RenderMethod& renderer)
{
for (auto paint : paints) {
- if (auto scene = dynamic_cast<Scene*>(paint)) {
+ if (paint->Paint_Id == PAINT_ID_SCENE) {
+ //We know renderer type, avoid dynamic_cast for performance.
+ auto scene = static_cast<Scene*>(paint);
if (!SCENE_IMPL->clear(renderer)) return false;
- } else if (auto shape = dynamic_cast<Shape*>(paint)) {
+ } else {
+ auto shape = static_cast<Shape*>(paint);
if (!SHAPE_IMPL->dispose(*shape, renderer)) return false;
}
delete(paint);
bool updateInternal(RenderMethod &renderer, const RenderTransform* transform, uint32_t flag)
{
for(auto paint: paints) {
- if (auto scene = dynamic_cast<Scene*>(paint)) {
+ if (paint->Paint_Id == PAINT_ID_SCENE) {
+ //We know renderer type, avoid dynamic_cast for performance.
+ auto scene = static_cast<Scene*>(paint);
if (!SCENE_IMPL->update(renderer, transform, flag)) return false;
- } else if (auto shape = dynamic_cast<Shape*>(paint)) {
+ } else {
+ auto shape = static_cast<Shape*>(paint);
if (!SHAPE_IMPL->update(*shape, renderer, transform, flag)) return false;
}
}
bool render(RenderMethod &renderer)
{
for(auto paint: paints) {
- if (auto scene = dynamic_cast<Scene*>(paint)) {
+ if (paint->Paint_Id == PAINT_ID_SCENE) {
+ //We know renderer type, avoid dynamic_cast for performance.
+ auto scene = static_cast<Scene*>(paint);
if(!SCENE_IMPL->render(renderer)) return false;
- } else if (auto shape = dynamic_cast<Shape*>(paint)) {
+ } else {
+ auto shape = static_cast<Shape*>(paint);
if(!SHAPE_IMPL->render(*shape, renderer)) return false;
}
}
auto w2 = 0.0f;
auto h2 = 0.0f;
- if (auto scene = dynamic_cast<Scene*>(paint)) {
+ if (paint->Paint_Id == PAINT_ID_SCENE) {
+ //We know renderer type, avoid dynamic_cast for performance.
+ auto scene = static_cast<Scene*>(paint);
if (!SCENE_IMPL->bounds(&x2, &y2, &w2, &h2)) return false;
- } else if (auto shape = dynamic_cast<Shape*>(paint)) {
+ } else {
+ auto shape = static_cast<Shape*>(paint);
if (!SHAPE_IMPL->bounds(&x2, &y2, &w2, &h2)) return false;
}
Shape :: Shape() : pImpl(make_unique<Impl>())
{
+ Paint_Id = PAINT_ID_SHAPE;
}
Result SwCanvas::target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h) noexcept
{
- auto renderer = dynamic_cast<SwRenderer*>(Canvas::pImpl.get()->renderer);
+ //We know renderer type, avoid dynamic_cast for performance.
+ auto renderer = static_cast<SwRenderer*>(Canvas::pImpl.get()->renderer);
if (!renderer) return Result::MemoryCorruption;
if (!renderer->target(buffer, stride, w, h)) return Result::InvalidArguments;