From 259e3807330ac14cf190c6cf85dc2cb733557830 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 1ee24db9..9e826e37 100644 --- a/src/renderer/sw_engine/tvgSwRenderer.cpp +++ b/src/renderer/sw_engine/tvgSwRenderer.cpp @@ -123,8 +123,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) { @@ -185,6 +184,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 a25ae967..0dea226d 100644 --- a/src/renderer/sw_engine/tvgSwShape.cpp +++ b/src/renderer/sw_engine/tvgSwShape.cpp @@ -461,7 +461,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(); }