From e9939dec82d834ae073e4abff2617f4fa6d52ac7 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 20 Jan 2021 22:57:29 +0900 Subject: [PATCH] common canvas: fix non-updated paints. When shapes are poped from canvas while retaining shapes instances, they have no chances to redraw after pushed again due to missing flag. This patch fixes it by forcely updating flag on pushing time. @Issues: 181 --- src/lib/tvgCanvas.cpp | 4 ++-- src/lib/tvgCanvasImpl.h | 11 ++++++----- src/lib/tvgPictureImpl.h | 7 ++++--- src/lib/tvgShapeImpl.h | 4 +++- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/lib/tvgCanvas.cpp b/src/lib/tvgCanvas.cpp index b1b8b265..2e20ccb1 100644 --- a/src/lib/tvgCanvas.cpp +++ b/src/lib/tvgCanvas.cpp @@ -63,7 +63,7 @@ Result Canvas::draw() noexcept Result Canvas::update(Paint* paint) noexcept { - return pImpl->update(paint); + return pImpl->update(paint, false); } @@ -72,4 +72,4 @@ Result Canvas::sync() noexcept if (pImpl->renderer->sync()) return Result::Success; return Result::InsufficientCondition; -} \ No newline at end of file +} diff --git a/src/lib/tvgCanvasImpl.h b/src/lib/tvgCanvasImpl.h index ef63238d..6eb3319a 100644 --- a/src/lib/tvgCanvasImpl.h +++ b/src/lib/tvgCanvasImpl.h @@ -31,7 +31,7 @@ struct Canvas::Impl { Array paints; - RenderMethod* renderer; + RenderMethod* renderer; Impl(RenderMethod* pRenderer):renderer(pRenderer) { @@ -49,7 +49,7 @@ struct Canvas::Impl if (!p) return Result::MemoryCorruption; paints.push(p); - return update(p); + return update(p, true); } Result clear(bool free) @@ -72,19 +72,20 @@ struct Canvas::Impl return Result::Success; } - Result update(Paint* paint) + Result update(Paint* paint, bool force) { if (!renderer) return Result::InsufficientCondition; Array clips; + auto flag = force ? RenderUpdateFlag::All : RenderUpdateFlag::None; //Update single paint node if (paint) { - paint->pImpl->update(*renderer, nullptr, 255, clips, RenderUpdateFlag::None); + paint->pImpl->update(*renderer, nullptr, 255, clips, flag); //Update all retained paint nodes } else { for (auto paint = paints.data; paint < (paints.data + paints.count); ++paint) { - (*paint)->pImpl->update(*renderer, nullptr, 255, clips, RenderUpdateFlag::None); + (*paint)->pImpl->update(*renderer, nullptr, 255, clips, flag); } } return Result::Success; diff --git a/src/lib/tvgPictureImpl.h b/src/lib/tvgPictureImpl.h index fed1d127..35945d6d 100644 --- a/src/lib/tvgPictureImpl.h +++ b/src/lib/tvgPictureImpl.h @@ -49,13 +49,14 @@ struct Picture::Impl if (paint) { paint->pImpl->dispose(renderer); delete(paint); - return true; } else if (pixels) { - return renderer.dispose(rdata); + auto ret = renderer.dispose(rdata); + rdata = nullptr; + return ret; } - return false; + return true; } void resize() diff --git a/src/lib/tvgShapeImpl.h b/src/lib/tvgShapeImpl.h index 9a81d0c6..14f911e0 100644 --- a/src/lib/tvgShapeImpl.h +++ b/src/lib/tvgShapeImpl.h @@ -215,7 +215,9 @@ struct Shape::Impl bool dispose(RenderMethod& renderer) { - return renderer.dispose(rdata); + auto ret = renderer.dispose(rdata); + rdata = nullptr; + return ret; } bool render(RenderMethod& renderer)