move rasterclip_ helper into rasterclip

R=robertphillips@google.com, reed@chromium.org

Author: reed@google.com

Review URL: https://codereview.chromium.org/546113002
diff --git a/src/core/SkRasterClip.cpp b/src/core/SkRasterClip.cpp
index d1615a3..dab91d8 100644
--- a/src/core/SkRasterClip.cpp
+++ b/src/core/SkRasterClip.cpp
@@ -86,6 +86,39 @@
     return this->updateCacheAndReturnNonEmpty();
 }
 
+bool SkRasterClip::op(const SkPath& path, const SkISize& size, SkRegion::Op op, bool doAA) {
+    // base is used to limit the size (and therefore memory allocation) of the
+    // region that results from scan converting devPath.
+    SkRegion base;
+    
+    if (SkRegion::kIntersect_Op == op) {
+        // since we are intersect, we can do better (tighter) with currRgn's
+        // bounds, than just using the device. However, if currRgn is complex,
+        // our region blitter may hork, so we do that case in two steps.
+        if (this->isRect()) {
+            // FIXME: we should also be able to do this when this->isBW(),
+            // but relaxing the test above triggers GM asserts in
+            // SkRgnBuilder::blitH(). We need to investigate what's going on.
+            return this->setPath(path, this->bwRgn(), doAA);
+        } else {
+            base.setRect(this->getBounds());
+            SkRasterClip clip;
+            clip.setPath(path, base, doAA);
+            return this->op(clip, op);
+        }
+    } else {
+        base.setRect(0, 0, size.width(), size.height());
+        
+        if (SkRegion::kReplace_Op == op) {
+            return this->setPath(path, base, doAA);
+        } else {
+            SkRasterClip clip;
+            clip.setPath(path, base, doAA);
+            return this->op(clip, op);
+        }
+    }
+}
+
 bool SkRasterClip::setPath(const SkPath& path, const SkIRect& clip, bool doAA) {
     SkRegion tmp;
     tmp.setRect(clip);