diff options
-rw-r--r-- | include/core/SkScan.h | 1 | ||||
-rw-r--r-- | src/core/SkScan_Antihair.cpp | 77 |
2 files changed, 49 insertions, 29 deletions
diff --git a/include/core/SkScan.h b/include/core/SkScan.h index 7b4cdc1071..61ba1b0d55 100644 --- a/include/core/SkScan.h +++ b/include/core/SkScan.h @@ -80,6 +80,7 @@ private: static void FillRect(const SkRect&, const SkRegion* clip, SkBlitter*); static void AntiFillRect(const SkRect&, const SkRegion* clip, SkBlitter*); #endif + static void AntiFillXRect(const SkXRect&, const SkRegion*, SkBlitter*); static void FillPath(const SkPath&, const SkRegion& clip, SkBlitter*); static void AntiFillPath(const SkPath&, const SkRegion& clip, SkBlitter*, bool forceRLE = false); diff --git a/src/core/SkScan_Antihair.cpp b/src/core/SkScan_Antihair.cpp index bb81cd6816..3b286343b6 100644 --- a/src/core/SkScan_Antihair.cpp +++ b/src/core/SkScan_Antihair.cpp @@ -556,41 +556,60 @@ static void antifillrect(const SkXRect& xr, SkBlitter* blitter) { /////////////////////////////////////////////////////////////////////////////// -void SkScan::AntiFillXRect(const SkXRect& xr, const SkRasterClip& clip, +void SkScan::AntiFillXRect(const SkXRect& xr, const SkRegion* clip, SkBlitter* blitter) { - SkAAClipBlitterWrapper wrapper(clip, blitter); - const SkRegion* clipRgn = &wrapper.getRgn(); - blitter = wrapper.getBlitter(); - - SkIRect outerBounds; - XRect_roundOut(xr, &outerBounds); - - if (clipRgn->isRect()) { - const SkIRect& clipBounds = clipRgn->getBounds(); + if (NULL == clip) { + antifillrect(xr, blitter); + } else { + SkIRect outerBounds; + XRect_roundOut(xr, &outerBounds); - if (clipBounds.contains(outerBounds)) { - antifillrect(xr, blitter); + if (clip->isRect()) { + const SkIRect& clipBounds = clip->getBounds(); + + if (clipBounds.contains(outerBounds)) { + antifillrect(xr, blitter); + } else { + SkXRect tmpR; + // this keeps our original edges fractional + XRect_set(&tmpR, clipBounds); + if (tmpR.intersect(xr)) { + antifillrect(tmpR, blitter); + } + } } else { - SkXRect tmpR; - // this keeps our original edges fractional - XRect_set(&tmpR, clipBounds); - if (tmpR.intersect(xr)) { - antifillrect(tmpR, blitter); + SkRegion::Cliperator clipper(*clip, outerBounds); + const SkIRect& rr = clipper.rect(); + + while (!clipper.done()) { + SkXRect tmpR; + + // this keeps our original edges fractional + XRect_set(&tmpR, rr); + if (tmpR.intersect(xr)) { + antifillrect(tmpR, blitter); + } + clipper.next(); } } + } +} + +void SkScan::AntiFillXRect(const SkXRect& xr, const SkRasterClip& clip, + SkBlitter* blitter) { + if (clip.isBW()) { + AntiFillXRect(xr, &clip.bwRgn(), blitter); } else { - SkRegion::Cliperator clipper(*clipRgn, outerBounds); - const SkIRect& rr = clipper.rect(); - - while (!clipper.done()) { - SkXRect tmpR; - - // this keeps our original edges fractional - XRect_set(&tmpR, rr); - if (tmpR.intersect(xr)) { - antifillrect(tmpR, blitter); - } - clipper.next(); + SkIRect outerBounds; + XRect_roundOut(xr, &outerBounds); + + if (clip.quickContains(outerBounds)) { + AntiFillXRect(xr, NULL, blitter); + } else { + SkAAClipBlitterWrapper wrapper(clip, blitter); + blitter = wrapper.getBlitter(); + + AntiFillXRect(xr, &wrapper.getRgn(), wrapper.getBlitter()); } } } |