we can handle opaque clip-shaders up front

Change-Id: I6ac1470dfe5005479b52a0ae662874fd0f7b61c3
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/276316
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 17c8a27..58efda4 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -1651,7 +1651,17 @@
 
 void SkCanvas::clipShader(sk_sp<SkShader> sh, SkClipOp op) {
     if (sh) {
-        this->onClipShader(std::move(sh), op);
+        if (sh->isOpaque()) {
+            if (op == SkClipOp::kIntersect) {
+                // we don't occlude anything, so skip this call
+            } else {
+                SkASSERT(op == SkClipOp::kDifference);
+                // we occlude everything, so set the clip to empty
+                this->clipRect({0,0,0,0});
+            }
+        } else {
+            this->onClipShader(std::move(sh), op);
+        }
     }
 }