diff --git a/src/lib/tvgCanvasImpl.h b/src/lib/tvgCanvasImpl.h index 5f326555..2e24f184 100644 --- a/src/lib/tvgCanvasImpl.h +++ b/src/lib/tvgCanvasImpl.h @@ -32,6 +32,7 @@ struct Canvas::Impl { Array paints; RenderMethod* renderer; + bool refresh; //if all paints should be updated by force. Impl(RenderMethod* pRenderer):renderer(pRenderer) { @@ -70,12 +71,18 @@ struct Canvas::Impl return Result::Success; } + void needRefresh() + { + refresh = true; + } + Result update(Paint* paint, bool force) { if (!renderer) return Result::InsufficientCondition; Array clips; - auto flag = force ? RenderUpdateFlag::All : RenderUpdateFlag::None; + auto flag = RenderUpdateFlag::None; + if (refresh | force) flag = RenderUpdateFlag::All; //Update single paint node if (paint) { @@ -86,6 +93,9 @@ struct Canvas::Impl (*paint)->pImpl->update(*renderer, nullptr, 255, clips, flag); } } + + refresh = false; + return Result::Success; } diff --git a/src/lib/tvgGlCanvas.cpp b/src/lib/tvgGlCanvas.cpp index 049ff7ad..121649ad 100644 --- a/src/lib/tvgGlCanvas.cpp +++ b/src/lib/tvgGlCanvas.cpp @@ -68,6 +68,9 @@ Result GlCanvas::target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t if (!renderer->target(buffer, stride, w, h)) return Result::Unknown; + //Paints must be updated again with this new target. + Canvas::pImpl->needRefresh(); + return Result::Success; #endif return Result::NonSupport; diff --git a/src/lib/tvgSwCanvas.cpp b/src/lib/tvgSwCanvas.cpp index 03337a72..0a820507 100644 --- a/src/lib/tvgSwCanvas.cpp +++ b/src/lib/tvgSwCanvas.cpp @@ -67,6 +67,9 @@ Result SwCanvas::target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t if (!renderer->target(buffer, stride, w, h, cs)) return Result::InvalidArguments; + //Paints must be updated again with this new target. + Canvas::pImpl->needRefresh(); + return Result::Success; #endif return Result::NonSupport;