summaryrefslogtreecommitdiff
path: root/libs/hwui/SkiaCanvas.cpp
diff options
context:
space:
mode:
author Jorge Betancourt <jmbetancourt@google.com> 2024-02-01 17:38:31 +0000
committer Jorge Betancourt <jmbetancourt@google.com> 2024-02-14 20:07:41 +0000
commit3700b100d79434079f87763e64b38c419b09ac2e (patch)
tree2b6928dd3b64831361eb06dc01492e50830aa59f /libs/hwui/SkiaCanvas.cpp
parent70331c8b8a33c00e3cede72f67bb4a6850d434d3 (diff)
add clipShader API to android.graphics.Canvas
Test: atest CtsUiRenderingTestCases:android.uirendering.cts.testclasses.ShaderClippingTests Bug: 280116960 Change-Id: Ic78c4b2ca01e6af9e5af757aa64e15e248cadcf8
Diffstat (limited to 'libs/hwui/SkiaCanvas.cpp')
-rw-r--r--libs/hwui/SkiaCanvas.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index 14b8d8d0aa12..0b739c361d64 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -70,6 +70,8 @@ public:
: mType(Type::RRect), mOp(op), mMatrix(m), mRRect(rrect) {}
Clip(const SkPath& path, SkClipOp op, const SkMatrix& m)
: mType(Type::Path), mOp(op), mMatrix(m), mPath(std::in_place, path) {}
+ Clip(const sk_sp<SkShader> shader, SkClipOp op, const SkMatrix& m)
+ : mType(Type::Shader), mOp(op), mMatrix(m), mShader(shader) {}
void apply(SkCanvas* canvas) const {
canvas->setMatrix(mMatrix);
@@ -86,6 +88,8 @@ public:
// Ensure path clips are anti-aliased
canvas->clipPath(mPath.value(), mOp, true);
break;
+ case Type::Shader:
+ canvas->clipShader(mShader, mOp);
}
}
@@ -94,6 +98,7 @@ private:
Rect,
RRect,
Path,
+ Shader,
};
Type mType;
@@ -103,6 +108,7 @@ private:
// These are logically a union (tracked separately due to non-POD path).
std::optional<SkPath> mPath;
SkRRect mRRect;
+ sk_sp<SkShader> mShader;
};
Canvas* Canvas::create_canvas(const SkBitmap& bitmap) {
@@ -413,6 +419,11 @@ bool SkiaCanvas::clipPath(const SkPath* path, SkClipOp op) {
return !mCanvas->isClipEmpty();
}
+void SkiaCanvas::clipShader(sk_sp<SkShader> shader, SkClipOp op) {
+ this->recordClip(shader, op);
+ mCanvas->clipShader(shader, op);
+}
+
bool SkiaCanvas::replaceClipRect_deprecated(float left, float top, float right, float bottom) {
SkRect rect = SkRect::MakeLTRB(left, top, right, bottom);