diff --git a/src/lib/gl_engine/tvgGlRenderer.cpp b/src/lib/gl_engine/tvgGlRenderer.cpp index 8df62dda..94346284 100644 --- a/src/lib/gl_engine/tvgGlRenderer.cpp +++ b/src/lib/gl_engine/tvgGlRenderer.cpp @@ -28,8 +28,8 @@ /************************************************************************/ /* Internal Class Implementation */ /************************************************************************/ -static bool initEngine = false; -static uint32_t rendererCnt = 0; +static int32_t initEngineCnt = false; +static int32_t rendererCnt = 0; static void _termEngine() @@ -236,22 +236,19 @@ RenderData GlRenderer::prepare(const Shape& shape, RenderData data, const Render int GlRenderer::init(uint32_t threads) { - if (rendererCnt > 0) return false; - if (initEngine) return true; + if ((initEngineCnt++) > 0) return true; //TODO: - initEngine = true; - return true; } int GlRenderer::term() { - if (!initEngine) return true; + if ((--initEngineCnt) > 0) return true; - initEngine = false; + initEngineCnt = 0; _termEngine(); @@ -270,7 +267,8 @@ GlRenderer::~GlRenderer() mRenderTasks.clear(); --rendererCnt; - if (!initEngine) _termEngine(); + + if (rendererCnt == 0 && initEngineCnt == 0) _termEngine(); } @@ -308,13 +306,11 @@ void GlRenderer::drawPrimitive(GlShape& sdata, const Fill* fill, uint32_t primit { const Fill::ColorStop* stops = nullptr; auto stopCnt = fill->colorStops(&stops); - if (stopCnt < 2) - { - return; - } + if (stopCnt < 2) return; + GlGradientRenderTask* rTask = nullptr; - GlSize size = sdata.geometry->getPrimitiveSize(primitiveIndex); - float* matrix = sdata.geometry->getTransforMatrix(); + auto size = sdata.geometry->getPrimitiveSize(primitiveIndex); + auto matrix = sdata.geometry->getTransforMatrix(); switch (fill->id()) { case FILL_ID_LINEAR: { @@ -344,16 +340,15 @@ void GlRenderer::drawPrimitive(GlShape& sdata, const Fill* fill, uint32_t primit break; } } - if (rTask) - { - int32_t vertexLoc = rTask->getLocationPropertyId(); + if (rTask) { + auto vertexLoc = rTask->getLocationPropertyId(); rTask->setPrimitveSize(size.x, size.y); rTask->setCanvasSize(sdata.viewWd, sdata.viewHt); rTask->setNoise(NOISE_LEVEL); rTask->setStopCount((int)stopCnt); rTask->setTransform(FORMAT_SIZE_MAT_4x4, matrix); - for (uint32_t i = 0; i < stopCnt; ++i) - { + + for (uint32_t i = 0; i < stopCnt; ++i) { rTask->setStopColor(i, stops[i].offset, stops[i].r, stops[i].g, stops[i].b, stops[i].a); } diff --git a/src/lib/sw_engine/tvgSwRenderer.cpp b/src/lib/sw_engine/tvgSwRenderer.cpp index 9638597e..1e0e28c5 100644 --- a/src/lib/sw_engine/tvgSwRenderer.cpp +++ b/src/lib/sw_engine/tvgSwRenderer.cpp @@ -27,8 +27,8 @@ /************************************************************************/ /* Internal Class Implementation */ /************************************************************************/ -static bool initEngine = false; -static uint32_t rendererCnt = 0; +static int32_t initEngineCnt = false; +static int32_t rendererCnt = 0; struct SwTask : Task @@ -229,7 +229,8 @@ SwRenderer::~SwRenderer() if (surface) delete(surface); --rendererCnt; - if (!initEngine) _termEngine(); + + if (rendererCnt == 0 && initEngineCnt == 0) _termEngine(); } @@ -546,22 +547,19 @@ RenderData SwRenderer::prepare(const Shape& sdata, RenderData data, const Render bool SwRenderer::init(uint32_t threads) { - if (rendererCnt > 0) return false; - if (initEngine) return true; + if ((initEngineCnt++) > 0) return true; if (!mpoolInit(threads)) return false; - initEngine = true; - return true; } bool SwRenderer::term() { - if (!initEngine) return true; + if ((--initEngineCnt) > 0) return true; - initEngine = false; + initEngineCnt = 0; _termEngine(); diff --git a/src/lib/tvgInitializer.cpp b/src/lib/tvgInitializer.cpp index a32cb5df..b7decb1f 100644 --- a/src/lib/tvgInitializer.cpp +++ b/src/lib/tvgInitializer.cpp @@ -35,7 +35,7 @@ /************************************************************************/ /* Internal Class Implementation */ /************************************************************************/ -static bool initialized = false; + /************************************************************************/ /* External Class Implementation */ @@ -43,8 +43,6 @@ static bool initialized = false; Result Initializer::init(CanvasEngine engine, uint32_t threads) noexcept { - if (initialized) return Result::InsufficientCondition; - auto nonSupport = true; if (static_cast(engine) & static_cast(CanvasEngine::Sw)) { @@ -67,16 +65,12 @@ Result Initializer::init(CanvasEngine engine, uint32_t threads) noexcept TaskScheduler::init(threads); - initialized = true; - return Result::Success; } Result Initializer::term(CanvasEngine engine) noexcept { - if (!initialized) return Result::InsufficientCondition; - auto nonSupport = true; if (static_cast(engine) & static_cast(CanvasEngine::Sw)) { @@ -99,7 +93,5 @@ Result Initializer::term(CanvasEngine engine) noexcept if (!LoaderMgr::term()) return Result::Unknown; - initialized = false; - return Result::Success; } \ No newline at end of file