refactor where we wrap clipshaders, in prep for gpu backend
Change-Id: I6040d1fb67911bbfdefd5f1ff968e7d11323763d
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/276281
Reviewed-by: Mike Klein <mtklein@google.com>
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/src/core/SkBitmapDevice.cpp b/src/core/SkBitmapDevice.cpp
index 2747705..02735e1 100644
--- a/src/core/SkBitmapDevice.cpp
+++ b/src/core/SkBitmapDevice.cpp
@@ -757,8 +757,8 @@
fRCStack.clipPath(this->localToDevice(), path, op, aa);
}
-void SkBitmapDevice::onClipShader(sk_sp<SkShader> sh, SkClipOp op) {
- fRCStack.clipShader(this->localToDevice(), std::move(sh), op);
+void SkBitmapDevice::onClipShader(sk_sp<SkShader> sh) {
+ fRCStack.clipShader(std::move(sh));
}
void SkBitmapDevice::onClipRegion(const SkRegion& rgn, SkClipOp op) {
diff --git a/src/core/SkBitmapDevice.h b/src/core/SkBitmapDevice.h
index 9df2eeb..7a54c0c 100644
--- a/src/core/SkBitmapDevice.h
+++ b/src/core/SkBitmapDevice.h
@@ -125,7 +125,7 @@
void onClipRect(const SkRect& rect, SkClipOp, bool aa) override;
void onClipRRect(const SkRRect& rrect, SkClipOp, bool aa) override;
void onClipPath(const SkPath& path, SkClipOp, bool aa) override;
- void onClipShader(sk_sp<SkShader>, SkClipOp) override;
+ void onClipShader(sk_sp<SkShader>) override;
void onClipRegion(const SkRegion& deviceRgn, SkClipOp) override;
void onSetDeviceClipRestriction(SkIRect* mutableClipRestriction) override;
bool onClipIsAA() const override;
diff --git a/src/core/SkDevice.h b/src/core/SkDevice.h
index c1c8516..d9e7fd6 100644
--- a/src/core/SkDevice.h
+++ b/src/core/SkDevice.h
@@ -15,6 +15,7 @@
#include "include/core/SkShader.h"
#include "include/core/SkSurfaceProps.h"
#include "include/private/SkNoncopyable.h"
+#include "src/shaders/SkShaderBase.h"
class SkBitmap;
struct SkDrawShadowRec;
@@ -152,7 +153,11 @@
this->onClipPath(path, op, aa);
}
void clipShader(sk_sp<SkShader> sh, SkClipOp op) {
- this->onClipShader(std::move(sh), op);
+ sh = as_SB(sh)->makeWithCTM(this->localToDevice());
+ if (op == SkClipOp::kDifference) {
+ sh = as_SB(sh)->makeInvertAlpha();
+ }
+ this->onClipShader(std::move(sh));
}
void clipRegion(const SkRegion& region, SkClipOp op) {
this->onClipRegion(region, op);
@@ -188,7 +193,7 @@
virtual void onClipRect(const SkRect& rect, SkClipOp, bool aa) {}
virtual void onClipRRect(const SkRRect& rrect, SkClipOp, bool aa) {}
virtual void onClipPath(const SkPath& path, SkClipOp, bool aa) {}
- virtual void onClipShader(sk_sp<SkShader>, SkClipOp) {}
+ virtual void onClipShader(sk_sp<SkShader>) {}
virtual void onClipRegion(const SkRegion& deviceRgn, SkClipOp) {}
virtual void onSetDeviceClipRestriction(SkIRect* mutableClipRestriction) {}
virtual bool onClipIsAA() const = 0;
diff --git a/src/core/SkRasterClip.cpp b/src/core/SkRasterClip.cpp
index f8c92b9..f9773ff 100644
--- a/src/core/SkRasterClip.cpp
+++ b/src/core/SkRasterClip.cpp
@@ -347,20 +347,13 @@
return this->updateCacheAndReturnNonEmpty();
}
-bool SkRasterClip::op(sk_sp<SkShader> sh, const SkMatrix& ctm, SkRegion::Op op) {
+bool SkRasterClip::op(sk_sp<SkShader> sh) {
AUTO_RASTERCLIP_VALIDATE(*this);
- sh = as_SB(sh)->makeWithCTM(ctm);
if (!fShader) {
- if (op != SkRegion::kIntersect_Op) {
- sh = as_SB(sh)->makeInvertAlpha();
- }
fShader = sh;
} else {
- SkBlendMode mode = (op == SkRegion::kIntersect_Op) ?
- SkBlendMode::kSrcIn :
- SkBlendMode::kSrcOut;
- fShader = SkShaders::Blend(mode, sh, fShader);
+ fShader = SkShaders::Blend(SkBlendMode::kSrcIn, sh, fShader);
}
return !this->isEmpty();
}
diff --git a/src/core/SkRasterClip.h b/src/core/SkRasterClip.h
index 1e5b3d9..223ab0d 100644
--- a/src/core/SkRasterClip.h
+++ b/src/core/SkRasterClip.h
@@ -98,7 +98,7 @@
bool op(const SkRect&, const SkMatrix& matrix, const SkIRect&, SkRegion::Op, bool doAA);
bool op(const SkRRect&, const SkMatrix& matrix, const SkIRect&, SkRegion::Op, bool doAA);
bool op(const SkPath&, const SkMatrix& matrix, const SkIRect&, SkRegion::Op, bool doAA);
- bool op(sk_sp<SkShader>, const SkMatrix&, SkRegion::Op);
+ bool op(sk_sp<SkShader>);
void translate(int dx, int dy, SkRasterClip* dst) const;
void translate(int dx, int dy) {
diff --git a/src/core/SkRasterClipStack.h b/src/core/SkRasterClipStack.h
index 8224071..bdcd7b5 100644
--- a/src/core/SkRasterClipStack.h
+++ b/src/core/SkRasterClipStack.h
@@ -117,8 +117,8 @@
this->validate();
}
- void clipShader(const SkMatrix& ctm, sk_sp<SkShader> sh, SkClipOp op) {
- this->writable_rc().op(std::move(sh), ctm, (SkRegion::Op)op);
+ void clipShader(sk_sp<SkShader> sh) {
+ this->writable_rc().op(std::move(sh));
this->validate();
}