From 0e633bd009be36a574021f8a8d7073c55eba3ea8 Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Mon, 17 Feb 2025 02:44:44 +0100 Subject: [PATCH] sw_engine: fix update issue In cases where the fill was changed while the stroke existed but remained unchanged, the stroke would disappear because it was being reset during the shape preparing (shapeReset). Fixed by disabling the reset of stroke rle from shape reseting. Also the shape should be prepared not only when the RenderUpdateFlag is set to Color, but also when it is set to Gradient. @Issue: https://github.com/thorvg/thorvg/issues/3237 --- src/renderer/sw_engine/tvgSwRenderer.cpp | 4 ++-- src/renderer/sw_engine/tvgSwShape.cpp | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/renderer/sw_engine/tvgSwRenderer.cpp b/src/renderer/sw_engine/tvgSwRenderer.cpp index 5b9719d2..c70fdcfa 100644 --- a/src/renderer/sw_engine/tvgSwRenderer.cpp +++ b/src/renderer/sw_engine/tvgSwRenderer.cpp @@ -121,8 +121,7 @@ struct SwShapeTask : SwTask auto visibleFill = false; //This checks also for the case, if the invisible shape turned to visible by alpha. - auto prepareShape = false; - if (!shapePrepared(&shape) && (flags & RenderUpdateFlag::Color)) prepareShape = true; + auto prepareShape = !shapePrepared(&shape) && flags & (RenderUpdateFlag::Color | RenderUpdateFlag::Gradient); //Shape if (flags & (RenderUpdateFlag::Path | RenderUpdateFlag::Transform) || prepareShape) { @@ -186,6 +185,7 @@ struct SwShapeTask : SwTask err: bbox.reset(); shapeReset(&shape); + rleReset(shape.strokeRle); shapeDelOutline(&shape, mpool, tid); } diff --git a/src/renderer/sw_engine/tvgSwShape.cpp b/src/renderer/sw_engine/tvgSwShape.cpp index 4408db0b..ce46b582 100644 --- a/src/renderer/sw_engine/tvgSwShape.cpp +++ b/src/renderer/sw_engine/tvgSwShape.cpp @@ -543,7 +543,6 @@ void shapeDelOutline(SwShape* shape, SwMpool* mpool, uint32_t tid) void shapeReset(SwShape* shape) { rleReset(shape->rle); - rleReset(shape->strokeRle); shape->fastTrack = false; shape->bbox.reset(); }