aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/core/SkScan.h1
-rw-r--r--src/core/SkScan_Antihair.cpp77
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());
}
}
}