mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-13 19:44:28 +00:00
common: ++optimization
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
This commit is contained in:
parent
58de99aea3
commit
498a024df8
10 changed files with 66 additions and 23 deletions
|
@ -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);
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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_ */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
|
||||
Scene::Scene() : pImpl(make_unique<Impl>())
|
||||
{
|
||||
|
||||
Paint_Id = PAINT_ID_SCENE;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ constexpr auto PATH_KAPPA = 0.552284f;
|
|||
|
||||
Shape :: Shape() : pImpl(make_unique<Impl>())
|
||||
{
|
||||
Paint_Id = PAINT_ID_SHAPE;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue