diff --git a/src/examples/ImageScaleDown.cpp b/src/examples/ImageScaleDown.cpp index 46a589b3..3361fbef 100644 --- a/src/examples/ImageScaleDown.cpp +++ b/src/examples/ImageScaleDown.cpp @@ -50,6 +50,8 @@ void tvgUpdateCmds(tvg::Canvas* canvas, float progress) { if (!canvas || !pPicture) return; + canvas->clear(false); + auto scale = 1.0f; if (progress > 0.875f) scale = 0.125f; diff --git a/src/examples/ImageScaleUp.cpp b/src/examples/ImageScaleUp.cpp index e0f808ac..45d333c7 100644 --- a/src/examples/ImageScaleUp.cpp +++ b/src/examples/ImageScaleUp.cpp @@ -50,6 +50,8 @@ void tvgUpdateCmds(tvg::Canvas* canvas, float progress) { if (!canvas || !pPicture) return; + canvas->clear(false); + auto scale = 1.0f; if (progress > 0.875f) scale = 4.0f; diff --git a/src/examples/Performance.cpp b/src/examples/Performance.cpp index 4a8f3e77..b28b266c 100644 --- a/src/examples/Performance.cpp +++ b/src/examples/Performance.cpp @@ -53,6 +53,8 @@ void tvgUpdateCmds(tvg::Canvas* canvas, float progress) { if (!canvas) return; + canvas->clear(false); + pPicture->translate(WIDTH * progress * 0.05f, HEIGHT * progress * 0.05f); auto before = ecore_time_get(); diff --git a/src/renderer/sw_engine/tvgSwRenderer.cpp b/src/renderer/sw_engine/tvgSwRenderer.cpp index 1cd47113..e404cc9e 100644 --- a/src/renderer/sw_engine/tvgSwRenderer.cpp +++ b/src/renderer/sw_engine/tvgSwRenderer.cpp @@ -376,6 +376,13 @@ SwRenderer::~SwRenderer() bool SwRenderer::clear() +{ + if (surface) return rasterClear(surface, 0, 0, surface->w, surface->h); + return false; +} + + +bool SwRenderer::sync() { for (auto task = tasks.data; task < tasks.end(); ++task) { if ((*task)->disposed) { @@ -389,18 +396,6 @@ bool SwRenderer::clear() if (!sharedMpool) mpoolClear(mpool); - if (surface) { - vport.x = vport.y = 0; - vport.w = surface->w; - vport.h = surface->h; - } - - return true; -} - - -bool SwRenderer::sync() -{ return true; } @@ -443,7 +438,13 @@ bool SwRenderer::target(pixel_t* data, uint32_t stride, uint32_t w, uint32_t h, bool SwRenderer::preRender() { - return rasterClear(surface, 0, 0, surface->w, surface->h); + if (surface) { + vport.x = vport.y = 0; + vport.w = surface->w; + vport.h = surface->h; + } + + return true; } diff --git a/src/renderer/tvgCanvas.h b/src/renderer/tvgCanvas.h index f893f9f7..323c85f2 100644 --- a/src/renderer/tvgCanvas.h +++ b/src/renderer/tvgCanvas.h @@ -42,10 +42,27 @@ struct Canvas::Impl ~Impl() { - clear(true); + //make it sure any deffered jobs + if (renderer) renderer->sync(); + + clearPaints(true); delete(renderer); } + void clearPaints(bool free) + { + if (free) { + for (auto paint : paints) { + P(paint)->unref(); + if (paint->pImpl->dispose(*renderer) && P(paint)->refCnt == 0) { + delete(paint); + } + } + paints.clear(); + } + drawing = false; + } + Result push(unique_ptr paint) { //You can not push paints during rendering. @@ -61,20 +78,10 @@ struct Canvas::Impl Result clear(bool free) { - //Clear render target before drawing + //Clear render target if (!renderer || !renderer->clear()) return Result::InsufficientCondition; - //Free paints - if (free) { - for (auto paint : paints) { - P(paint)->unref(); - if (paint->pImpl->dispose(*renderer) && P(paint)->refCnt == 0) { - delete(paint); - } - } - paints.clear(); - } - drawing = false; + clearPaints(free); return Result::Success; } diff --git a/test/capi/capiSwCanvas.cpp b/test/capi/capiSwCanvas.cpp index 48d3c25b..b031487f 100644 --- a/test/capi/capiSwCanvas.cpp +++ b/test/capi/capiSwCanvas.cpp @@ -128,6 +128,11 @@ TEST_CASE("Canvas update, clear and reuse", "[capiSwCanvas]") REQUIRE(tvg_canvas_update_paint(canvas, paint) == TVG_RESULT_SUCCESS); + //negative + REQUIRE(tvg_canvas_clear(canvas, false) == TVG_RESULT_INSUFFICIENT_CONDITION); + + uint32_t buffer[25]; + REQUIRE(tvg_swcanvas_set_target(canvas, buffer, 5, 5, 5, TVG_COLORSPACE_ARGB8888) == TVG_RESULT_SUCCESS); REQUIRE(tvg_canvas_clear(canvas, false) == TVG_RESULT_SUCCESS); REQUIRE(tvg_canvas_destroy(canvas) == TVG_RESULT_SUCCESS); diff --git a/test/testSwCanvasBase.cpp b/test/testSwCanvasBase.cpp index 90f32b24..f778b376 100644 --- a/test/testSwCanvasBase.cpp +++ b/test/testSwCanvasBase.cpp @@ -89,17 +89,24 @@ TEST_CASE("Clear", "[tvgSwCanvasBase]") auto canvas = SwCanvas::gen(); REQUIRE(canvas); + auto canvas2 = SwCanvas::gen(); REQUIRE(canvas2); - //Try 0: Clear - REQUIRE(canvas->clear() == Result::Success); - REQUIRE(canvas->clear(false) == Result::Success); - REQUIRE(canvas->clear() == Result::Success); + //Try 0: Negative + REQUIRE(canvas->clear() == Result::InsufficientCondition); + REQUIRE(canvas->clear(false) == Result::InsufficientCondition); + REQUIRE(canvas->clear() == Result::InsufficientCondition); - REQUIRE(canvas2->clear(false) == Result::Success); - REQUIRE(canvas2->clear() == Result::Success); - REQUIRE(canvas2->clear(false) == Result::Success); + REQUIRE(canvas2->clear(false) == Result::InsufficientCondition); + REQUIRE(canvas2->clear() == Result::InsufficientCondition); + REQUIRE(canvas2->clear(false) == Result::InsufficientCondition); + + uint32_t buffer[100*100]; + REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ARGB8888) == Result::Success); + + uint32_t buffer2[100*100]; + REQUIRE(canvas2->target(buffer2, 100, 100, 100, SwCanvas::Colorspace::ARGB8888) == Result::Success); //Try 1: Push -> Clear for (int i = 0; i < 5; ++i) {