add SK_ENABLE_CLIP_QUICKREJECT option (currently disabled)



git-svn-id: http://skia.googlecode.com/svn/trunk@5135 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 57f11df..4e4d430 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -25,6 +25,8 @@
 SK_DEFINE_INST_COUNT(SkCanvas)
 SK_DEFINE_INST_COUNT(SkDrawFilter)
 
+// experimental for faster tiled drawing...
+//#define SK_ENABLE_CLIP_QUICKREJECT
 
 //#define SK_TRACE_SAVERESTORE
 
@@ -1095,6 +1097,23 @@
 //////////////////////////////////////////////////////////////////////////////
 
 bool SkCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
+#ifdef SK_ENABLE_CLIP_QUICKREJECT
+    if (SkRegion::kIntersect_Op == op) {
+        if (fMCRec->fRasterClip->isEmpty()) {
+            return false;
+        }
+
+        if (this->quickReject(rect, kAA_EdgeType)) {
+            fDeviceCMDirty = true;
+            fLocalBoundsCompareTypeDirty = true;
+            fLocalBoundsCompareTypeDirtyBW = true;
+
+            fClipStack.clipEmpty();
+            return fMCRec->fRasterClip->setEmpty();
+        }
+    }
+#endif
+
     AutoValidateClip avc(this);
 
     fDeviceCMDirty = true;
@@ -1160,6 +1179,23 @@
 }
 
 bool SkCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
+#ifdef SK_ENABLE_CLIP_QUICKREJECT
+    if (SkRegion::kIntersect_Op == op && !path.isInverseFillType()) {
+        if (fMCRec->fRasterClip->isEmpty()) {
+            return false;
+        }
+        
+        if (this->quickReject(path.getBounds(), kAA_EdgeType)) {
+            fDeviceCMDirty = true;
+            fLocalBoundsCompareTypeDirty = true;
+            fLocalBoundsCompareTypeDirtyBW = true;
+            
+            fClipStack.clipEmpty();
+            return fMCRec->fRasterClip->setEmpty();
+        }
+    }
+#endif
+
     AutoValidateClip avc(this);
 
     fDeviceCMDirty = true;