From 2fb925a2d73ecb3854d47de5669160dcd05fd2d2 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 2 Jan 2025 17:40:29 +0900 Subject: [PATCH] sw_engine: corrected the rle cell building Properly build the cell cover value when a new cell value is just overlapped. This fixes certain weird visual artifacts at a corner case. issue: https://github.com/thorvg/thorvg/issues/2929 --- src/renderer/sw_engine/tvgSwRle.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/renderer/sw_engine/tvgSwRle.cpp b/src/renderer/sw_engine/tvgSwRle.cpp index a994fcf2..36e67842 100644 --- a/src/renderer/sw_engine/tvgSwRle.cpp +++ b/src/renderer/sw_engine/tvgSwRle.cpp @@ -451,17 +451,17 @@ static bool _setCell(RleWorker& rw, SwPoint pos) min_ex - 1 horizontal position. */ pos -= rw.cellMin; - if (pos.x > rw.cellMax.x) pos.x = rw.cellMax.x; + //exceptions + if (pos.x < 0) pos.x = -1; + else if (pos.x > rw.cellMax.x) pos.x = rw.cellMax.x; //Are we moving to a different cell? if (pos != rw.cellPos) { //Record the current one if it is valid if (!rw.invalid && !_recordCell(rw)) return false; + rw.area = rw.cover = 0; + rw.cellPos = pos; } - - rw.area = 0; - rw.cover = 0; - rw.cellPos = pos; rw.invalid = ((unsigned)pos.y >= (unsigned)rw.cellYCnt || pos.x >= rw.cellXCnt); return true;