diff --git a/src/renderer/sw_engine/tvgSwCommon.h b/src/renderer/sw_engine/tvgSwCommon.h index ad70be84..bad67c54 100644 --- a/src/renderer/sw_engine/tvgSwCommon.h +++ b/src/renderer/sw_engine/tvgSwCommon.h @@ -543,8 +543,8 @@ SwRle* rleRender(const SwBBox* bbox); void rleFree(SwRle* rle); void rleReset(SwRle* rle); void rleMerge(SwRle* rle, SwRle* clip1, SwRle* clip2); -void rleClip(SwRle* rle, const SwRle* clip); -void rleClip(SwRle* rle, const SwBBox* clip); +bool rleClip(SwRle* rle, const SwRle* clip); +bool rleClip(SwRle* rle, const SwBBox* clip); SwMpool* mpoolInit(uint32_t threads); bool mpoolTerm(SwMpool* mpool); diff --git a/src/renderer/sw_engine/tvgSwRenderer.cpp b/src/renderer/sw_engine/tvgSwRenderer.cpp index ea582246..15043f6c 100644 --- a/src/renderer/sw_engine/tvgSwRenderer.cpp +++ b/src/renderer/sw_engine/tvgSwRenderer.cpp @@ -103,11 +103,9 @@ struct SwShapeTask : SwTask bool clip(SwRle* target) override { - if (shape.fastTrack) rleClip(target, &bbox); - else if (shape.rle) rleClip(target, shape.rle); - else return false; - - return true; + if (shape.fastTrack) return rleClip(target, &bbox); + else if (shape.rle) return rleClip(target, shape.rle); + return false; } void run(unsigned tid) override @@ -176,10 +174,8 @@ struct SwShapeTask : SwTask //Clip Path for (auto clip = clips.begin(); clip < clips.end(); ++clip) { auto clipper = static_cast(*clip); - //Clip shape rle - if (shape.rle && !clipper->clip(shape.rle)) goto err; - //Clip stroke rle - if (shape.strokeRle && !clipper->clip(shape.strokeRle)) goto err; + if (shape.rle && !clipper->clip(shape.rle)) goto err; //Clip shape rle + if (shape.strokeRle && !clipper->clip(shape.strokeRle)) goto err; //Clip stroke rle } bbox = renderRegion; //sync diff --git a/src/renderer/sw_engine/tvgSwRle.cpp b/src/renderer/sw_engine/tvgSwRle.cpp index c57e98bc..90b536af 100644 --- a/src/renderer/sw_engine/tvgSwRle.cpp +++ b/src/renderer/sw_engine/tvgSwRle.cpp @@ -1020,9 +1020,9 @@ void rleFree(SwRle* rle) } -void rleClip(SwRle *rle, const SwRle *clip) +bool rleClip(SwRle *rle, const SwRle *clip) { - if (rle->size == 0 || clip->size == 0) return; + if (rle->size == 0 || clip->size == 0) return false; auto spanCnt = rle->size > clip->size ? rle->size : clip->size; auto spans = static_cast(malloc(sizeof(SwSpan) * (spanCnt))); auto spansEnd = _intersectSpansRegion(clip, rle, spans, spanCnt); @@ -1030,17 +1030,21 @@ void rleClip(SwRle *rle, const SwRle *clip) _replaceClipSpan(rle, spans, spansEnd - spans); TVGLOG("SW_ENGINE", "Using Path Clipping!"); + + return true; } -void rleClip(SwRle *rle, const SwBBox* clip) +bool rleClip(SwRle *rle, const SwBBox* clip) { - if (rle->size == 0) return; + if (rle->size == 0) return false; auto spans = static_cast(malloc(sizeof(SwSpan) * (rle->size))); auto spansEnd = _intersectSpansRect(clip, rle, spans, rle->size); _replaceClipSpan(rle, spans, spansEnd - spans); TVGLOG("SW_ENGINE", "Using Box Clipping!"); + + return true; }