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);
+ }
}
}