From a4849d40b34de4433e0a512b1efde5f7d572be96 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Sat, 21 Jun 2025 12:14:55 +0900 Subject: [PATCH] sw_engine: small optimization with a fast-clipping region access Now the engine can access intermidate rle sections with a specific y ranges, It doesn't need full iterations. --- src/renderer/sw_engine/tvgSwRle.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/renderer/sw_engine/tvgSwRle.cpp b/src/renderer/sw_engine/tvgSwRle.cpp index 58ebffa2..a902aac4 100644 --- a/src/renderer/sw_engine/tvgSwRle.cpp +++ b/src/renderer/sw_engine/tvgSwRle.cpp @@ -881,12 +881,18 @@ bool rleClip(SwRle *rle, const SwRle *clip) Array out; out.reserve(std::max(rle->spans.count, clip->spans.count)); - auto spans = rle->data(); - auto end = rle->spans.end(); - auto cspans = clip->data(); - auto cend = clip->spans.end(); + const SwSpan *end; + auto spans = rle->fetch(clip->spans.first().y, clip->spans.last().y, &end); - while(spans < end && cspans < cend) { + if (spans >= end) { + rle->spans.clear(); + return false; + } + + const SwSpan *cend; + auto cspans = clip->fetch(spans->y, (end - 1)->y, &cend); + + while (spans < end && cspans < cend) { //align y-coordinates. if (cspans->y > spans->y) { ++spans; @@ -928,9 +934,10 @@ bool rleClip(SwRle *rle, const RenderRegion* clip) Array out; out.reserve(rle->spans.count); auto data = out.data; + const SwSpan* end; uint16_t x, len; - ARRAY_FOREACH(p, rle->spans) { + for (auto p = rle->fetch(*clip, &end); p < end; ++p) { if (p->y >= max.y) break; if (p->y < min.y || p->x >= max.x || (p->x + p->len) <= min.x) continue; if (p->x < min.x) { @@ -948,4 +955,4 @@ bool rleClip(SwRle *rle, const RenderRegion* clip) } out.move(rle->spans); return true; -} \ No newline at end of file +}