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 +}