From 6e3674b904be71b09d2d69bf99426942cb41ac47 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 24 Oct 2023 14:54:45 +0900 Subject: [PATCH] canvas/paint: ++exception handling enhanced reference count verification to prevent unintentional deletion of used composition targets. --- src/renderer/tvgPaint.h | 8 ++++++-- src/renderer/tvgShape.cpp | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/renderer/tvgPaint.h b/src/renderer/tvgPaint.h index 0ee07fed..88f8f4ad 100644 --- a/src/renderer/tvgPaint.h +++ b/src/renderer/tvgPaint.h @@ -73,7 +73,7 @@ namespace tvg ~Impl() { if (compData) { - delete(compData->target); + if (P(compData->target)->unref() == 0) delete(compData->target); free(compData); } delete(smethod); @@ -141,7 +141,10 @@ namespace tvg if ((!target && method != CompositeMethod::None) || (target && method == CompositeMethod::None)) return false; if (compData) { - delete(compData->target); + P(compData->target)->unref(); + if ((compData->target != target) && P(compData->target)->refCnt == 0) { + delete(compData->target); + } //Reset scenario if (!target && method == CompositeMethod::None) { free(compData); @@ -152,6 +155,7 @@ namespace tvg if (!target && method == CompositeMethod::None) return true; compData = static_cast(calloc(1, sizeof(Composite))); } + P(target)->ref(); compData->target = target; compData->source = source; compData->method = method; diff --git a/src/renderer/tvgShape.cpp b/src/renderer/tvgShape.cpp index 3e422aae..c95ae240 100644 --- a/src/renderer/tvgShape.cpp +++ b/src/renderer/tvgShape.cpp @@ -62,7 +62,7 @@ Result Shape::reset() noexcept pImpl->rs.path.cmds.clear(); pImpl->rs.path.pts.clear(); - pImpl->flag = RenderUpdateFlag::Path; + pImpl->flag |= RenderUpdateFlag::Path; return Result::Success; }