From: Hermet Park Date: Thu, 30 Jul 2020 05:47:04 +0000 (+0900) Subject: common: code refactoring for simplicity. X-Git-Tag: accepted/tizen/unified/20200806.062539~12 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8dca270a30d3ad116ee34fbacfd4026fbb9501a0;p=platform%2Fcore%2Fgraphics%2Ftizenvg.git common: code refactoring for simplicity. Introduce internal PaintMethod since there more derived paint classes are coming. This PaintMethod is a sort of Strategy Pattern method. Change-Id: I29c49f5d4ddbfb9e429d4976636b20b39914ee20 --- diff --git a/inc/thorvg.h b/inc/thorvg.h index 6475890..36fed95 100644 --- a/inc/thorvg.h +++ b/inc/thorvg.h @@ -105,8 +105,9 @@ public: Result transform(const Matrix& m) noexcept; Result bounds(float* x, float* y, float* w, float* h) const noexcept; - _TVG_DECALRE_IDENTIFIER(); _TVG_DECLARE_PRIVATE(Paint); + _TVG_DECLARE_ACCESSOR(Canvas); + _TVG_DECLARE_ACCESSOR(Scene); }; @@ -161,7 +162,6 @@ public: virtual Result draw() noexcept; virtual Result sync() noexcept; - _TVG_DECLARE_ACCESSOR(Scene); _TVG_DECLARE_PRIVATE(Canvas); }; @@ -264,8 +264,6 @@ public: static std::unique_ptr gen() noexcept; _TVG_DECLARE_PRIVATE(Shape); - _TVG_DECLARE_ACCESSOR(Canvas); - _TVG_DECLARE_ACCESSOR(Scene); }; @@ -288,7 +286,6 @@ public: static std::unique_ptr gen() noexcept; - _TVG_DECLARE_ACCESSOR(Canvas); _TVG_DECLARE_PRIVATE(Scene); }; diff --git a/src/lib/tvgCanvasImpl.h b/src/lib/tvgCanvasImpl.h index 77af3d5..a1b9b78 100644 --- a/src/lib/tvgCanvasImpl.h +++ b/src/lib/tvgCanvasImpl.h @@ -56,14 +56,7 @@ struct Canvas::Impl if (!renderer->clear()) return Result::InsufficientCondition; for (auto paint : paints) { - if (paint->id() == PAINT_ID_SCENE) { - //We know renderer type, avoid dynamic_cast for performance. - auto scene = static_cast(paint); - if (!SCENE_IMPL->dispose(*renderer)) return Result::InsufficientCondition; - } else { - auto shape = static_cast(paint); - if (!SHAPE_IMPL->dispose(*renderer)) return Result::InsufficientCondition; - } + paint->IMPL->method->dispose(*renderer); delete(paint); } paints.clear(); @@ -77,24 +70,14 @@ struct Canvas::Impl //Update single paint node if (paint) { - if (paint->id() == PAINT_ID_SCENE) { - //We know renderer type, avoid dynamic_cast for performance. - auto scene = static_cast(paint); - if (!SCENE_IMPL->update(*renderer, nullptr, RenderUpdateFlag::None)) return Result::InsufficientCondition; - } else { - auto shape = static_cast(paint); - if (!SHAPE_IMPL->update(*renderer, nullptr, RenderUpdateFlag::None)) return Result::InsufficientCondition; + if (!paint->IMPL->method->update(*renderer, nullptr, RenderUpdateFlag::None)) { + return Result::InsufficientCondition; } //Update retained all paint nodes } else { for(auto paint: paints) { - if (paint->id() == PAINT_ID_SCENE) { - //We know renderer type, avoid dynamic_cast for performance. - auto scene = static_cast(paint); - if (!SCENE_IMPL->update(*renderer, nullptr, RenderUpdateFlag::None)) return Result::InsufficientCondition; - } else { - auto shape = static_cast(paint); - if (!SHAPE_IMPL->update(*renderer, nullptr, RenderUpdateFlag::None)) return Result::InsufficientCondition; + if (!paint->IMPL->method->update(*renderer, nullptr, RenderUpdateFlag::None)) { + return Result::InsufficientCondition; } } } @@ -108,14 +91,7 @@ struct Canvas::Impl if (!renderer->preRender()) return Result::InsufficientCondition; for(auto paint: paints) { - if (paint->id() == PAINT_ID_SCENE) { - //We know renderer type, avoid dynamic_cast for performance. - auto scene = static_cast(paint); - if(!SCENE_IMPL->render(*renderer)) return Result::InsufficientCondition; - } else { - auto shape = static_cast(paint); - if(!SHAPE_IMPL->render(*renderer)) return Result::InsufficientCondition; - } + if(!paint->IMPL->method->render(*renderer)) return Result::InsufficientCondition; } if (!renderer->postRender()) return Result::InsufficientCondition; diff --git a/src/lib/tvgCommon.h b/src/lib/tvgCommon.h index 2e5bd13..4cec18f 100644 --- a/src/lib/tvgCommon.h +++ b/src/lib/tvgCommon.h @@ -34,9 +34,6 @@ 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 - #define FILL_ID_LINEAR 0 #define FILL_ID_RADIAL 1 diff --git a/src/lib/tvgPaint.cpp b/src/lib/tvgPaint.cpp index b33b764..cbd68c6 100644 --- a/src/lib/tvgPaint.cpp +++ b/src/lib/tvgPaint.cpp @@ -39,35 +39,35 @@ Paint :: ~Paint() Result Paint::rotate(float degree) noexcept { - if (IMPL->ts->rotate(degree)) return Result::Success; + if (IMPL->method->rotate(degree)) return Result::Success; return Result::FailedAllocation; } Result Paint::scale(float factor) noexcept { - if (IMPL->ts->scale(factor)) return Result::Success; + if (IMPL->method->scale(factor)) return Result::Success; return Result::FailedAllocation; } Result Paint::translate(float x, float y) noexcept { - if (IMPL->ts->translate(x, y)) return Result::Success; + if (IMPL->method->translate(x, y)) return Result::Success; return Result::FailedAllocation; } Result Paint::transform(const Matrix& m) noexcept { - if (IMPL->ts->transform(m)) return Result::Success; + if (IMPL->method->transform(m)) return Result::Success; return Result::FailedAllocation; } Result Paint::bounds(float* x, float* y, float* w, float* h) const noexcept { - if (IMPL->ts->bounds(x, y, w, h)) return Result::Success; + if (IMPL->method->bounds(x, y, w, h)) return Result::Success; return Result::InsufficientCondition; } diff --git a/src/lib/tvgPaint.h b/src/lib/tvgPaint.h index cd0933b..31dcbf4 100644 --- a/src/lib/tvgPaint.h +++ b/src/lib/tvgPaint.h @@ -19,57 +19,78 @@ namespace tvg { - struct ITransformMethod + struct PaintMethod { - virtual ~ITransformMethod(){} + virtual ~PaintMethod(){} + + virtual bool dispose(RenderMethod& renderer) = 0; + virtual bool update(RenderMethod& renderer, const RenderTransform* pTransform, uint32_t pFlag) = 0; + virtual bool render(RenderMethod& renderer) = 0; + virtual bool rotate(float degree) = 0; virtual bool scale(float factor) = 0; virtual bool translate(float x, float y) = 0; virtual bool transform(const Matrix& m) = 0; virtual bool bounds(float* x, float* y, float* w, float* h) const = 0; + }; struct Paint::Impl { - ITransformMethod* ts = nullptr; + PaintMethod* method = nullptr; ~Impl() { - if (ts) delete(ts); + if (method) delete(method); } }; template - struct TransformMethod : ITransformMethod + struct TransformMethod : PaintMethod { - T* _inst = nullptr; + T* inst = nullptr; - TransformMethod(T* inst) : _inst(inst) {} + TransformMethod(T* inst) : inst(_inst) {} ~TransformMethod(){} bool rotate(float degree) override { - return _inst->rotate(degree); + return inst->rotate(degree); } bool scale(float factor) override { - return _inst->scale(factor); + return inst->scale(factor); } bool translate(float x, float y) override { - return _inst->translate(x, y); + return inst->translate(x, y); } bool transform(const Matrix& m) override { - return _inst->transform(m); + return inst->transform(m); } bool bounds(float* x, float* y, float* w, float* h) const override { - return _inst->bounds(x, y, w, h); + return inst->bounds(x, y, w, h); + } + + bool dispose(RenderMethod& renderer) + { + return inst->dispose(renderer); + } + + bool update(RenderMethod& renderer, const RenderTransform* pTransform, uint32_t pFlag) + { + return inst->update(renderer, pTransform, pFlag); + } + + bool render(RenderMethod& renderer) + { + return inst->render(renderer); } }; } diff --git a/src/lib/tvgScene.cpp b/src/lib/tvgScene.cpp index adbbe09..4d04364 100644 --- a/src/lib/tvgScene.cpp +++ b/src/lib/tvgScene.cpp @@ -25,9 +25,7 @@ Scene::Scene() : pImpl(make_unique()) { - _id = PAINT_ID_SCENE; - - Paint::pImpl.get()->ts = pImpl.get()->transformMethod(); + Paint::IMPL->method = IMPL->transformMethod(); } diff --git a/src/lib/tvgSceneImpl.h b/src/lib/tvgSceneImpl.h index b8d71f2..bd49714 100644 --- a/src/lib/tvgSceneImpl.h +++ b/src/lib/tvgSceneImpl.h @@ -40,14 +40,7 @@ struct Scene::Impl bool dispose(RenderMethod& renderer) { for (auto paint : paints) { - if (paint->id() == PAINT_ID_SCENE) { - //We know renderer type, avoid dynamic_cast for performance. - auto scene = static_cast(paint); - if (!SCENE_IMPL->dispose(renderer)) return false; - } else { - auto shape = static_cast(paint); - if (!SHAPE_IMPL->dispose(renderer)) return false; - } + paint->IMPL->method->dispose(renderer); delete(paint); } paints.clear(); @@ -58,14 +51,7 @@ struct Scene::Impl bool updateInternal(RenderMethod &renderer, const RenderTransform* transform, uint32_t flag) { for(auto paint: paints) { - if (paint->id() == PAINT_ID_SCENE) { - //We know renderer type, avoid dynamic_cast for performance. - auto scene = static_cast(paint); - if (!SCENE_IMPL->update(renderer, transform, flag)) return false; - } else { - auto shape = static_cast(paint); - if (!SHAPE_IMPL->update(renderer, transform, flag)) return false; - } + if (!paint->IMPL->method->update(renderer, transform, flag)) return false; } return true; } @@ -108,14 +94,7 @@ struct Scene::Impl bool render(RenderMethod &renderer) { for(auto paint: paints) { - if (paint->id() == PAINT_ID_SCENE) { - //We know renderer type, avoid dynamic_cast for performance. - auto scene = static_cast(paint); - if(!SCENE_IMPL->render(renderer)) return false; - } else { - auto shape = static_cast(paint); - if(!SHAPE_IMPL->render(renderer)) return false; - } + if(!paint->IMPL->method->render(renderer)) return false; } return true; } @@ -139,14 +118,7 @@ struct Scene::Impl auto w2 = 0.0f; auto h2 = 0.0f; - if (paint->id() == PAINT_ID_SCENE) { - //We know renderer type, avoid dynamic_cast for performance. - auto scene = static_cast(paint); - if (!SCENE_IMPL->bounds(&x2, &y2, &w2, &h2)) return false; - } else { - auto shape = static_cast(paint); - if (!SHAPE_IMPL->bounds(&x2, &y2, &w2, &h2)) return false; - } + if (paint->IMPL->method->bounds(&x2, &y2, &w2, &h2)) return false; //Merge regions if (x2 < x) x = x2; @@ -232,7 +204,7 @@ struct Scene::Impl return Result::Success; } - ITransformMethod* transformMethod() + PaintMethod* transformMethod() { return new TransformMethod(this); } diff --git a/src/lib/tvgShape.cpp b/src/lib/tvgShape.cpp index 648c0ee..f42c160 100644 --- a/src/lib/tvgShape.cpp +++ b/src/lib/tvgShape.cpp @@ -31,9 +31,7 @@ constexpr auto PATH_KAPPA = 0.552284f; Shape :: Shape() : pImpl(make_unique(this)) { - _id = PAINT_ID_SHAPE; - - Paint::pImpl.get()->ts = pImpl.get()->transformMethod(); + Paint::IMPL->method = IMPL->transformMethod(); } diff --git a/src/lib/tvgShapeImpl.h b/src/lib/tvgShapeImpl.h index b733bd5..955deb6 100644 --- a/src/lib/tvgShapeImpl.h +++ b/src/lib/tvgShapeImpl.h @@ -238,7 +238,7 @@ struct Shape::Impl } - ITransformMethod* transformMethod() + PaintMethod* transformMethod() { return new TransformMethod(this); }