common: ++optimization 64/235764/3
authorHermet Park <chuneon.park@samsung.com>
Tue, 9 Jun 2020 11:17:39 +0000 (20:17 +0900)
committerHermet Park <chuneon.park@samsung.com>
Tue, 9 Jun 2020 11:32:22 +0000 (20:32 +0900)
replace dynamic_cast to static_cast,

This can be a controversial choice between optmization and clean code.

Obviously we know the converting types,
try avoiding a bit heavier casting some cases.

Change-Id: Id763e6d1db449a229a492ab5b1a901a195936152

inc/tizenvg.h
src/lib/gl_engine/tvgGlRenderer.cpp
src/lib/sw_engine/tvgSwRenderer.cpp
src/lib/tvgCanvasImpl.h
src/lib/tvgCommon.h
src/lib/tvgGlCanvas.cpp
src/lib/tvgScene.cpp
src/lib/tvgSceneImpl.h
src/lib/tvgShape.cpp
src/lib/tvgSwCanvas.cpp

index 88abfdd..309badd 100644 (file)
@@ -50,16 +50,23 @@ protected: \
     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
 {
@@ -85,6 +92,10 @@ public:
     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);
 };
 
 
index 14bdbaa..1ca9588 100644 (file)
@@ -109,7 +109,8 @@ uint32_t GlRenderer::ref()
 
 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));
 }
 
 
index d2143fe..59c4910 100644 (file)
@@ -151,7 +151,8 @@ uint32_t SwRenderer::ref()
 
 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_ */
index 782dd94..078385a 100644 (file)
@@ -53,9 +53,12 @@ struct Canvas::Impl
         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);
@@ -70,9 +73,12 @@ struct Canvas::Impl
         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;
             }
         }
@@ -83,9 +89,12 @@ struct Canvas::Impl
     {
         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;
@@ -99,9 +108,12 @@ struct Canvas::Impl
         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;
             }
         }
index c404f1f..ca18cca 100644 (file)
@@ -31,6 +31,9 @@ using namespace tvg;
 #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"
index 024fed5..7d3903c 100644 (file)
@@ -47,7 +47,8 @@ GlCanvas::~GlCanvas()
 
 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;
index 75e2720..a1c7a7f 100644 (file)
@@ -25,7 +25,7 @@
 
 Scene::Scene() : pImpl(make_unique<Impl>())
 {
-
+    Paint_Id = PAINT_ID_SCENE;
 }
 
 
index edaa6d8..1f1fa14 100644 (file)
@@ -39,9 +39,12 @@ struct Scene::Impl
     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);
@@ -54,9 +57,12 @@ struct Scene::Impl
     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;
             }
         }
@@ -91,9 +97,12 @@ struct Scene::Impl
     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;
             }
         }
@@ -113,9 +122,12 @@ struct Scene::Impl
             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;
             }
 
index ad1736b..5119ac8 100644 (file)
@@ -32,6 +32,7 @@ constexpr auto PATH_KAPPA = 0.552284f;
 
 Shape :: Shape() : pImpl(make_unique<Impl>())
 {
+    Paint_Id = PAINT_ID_SHAPE;
 }
 
 
index 560a975..780e463 100644 (file)
@@ -47,7 +47,8 @@ SwCanvas::~SwCanvas()
 
 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;