From 3700b100d79434079f87763e64b38c419b09ac2e Mon Sep 17 00:00:00 2001 From: Jorge Betancourt Date: Thu, 1 Feb 2024 17:38:31 +0000 Subject: add clipShader API to android.graphics.Canvas Test: atest CtsUiRenderingTestCases:android.uirendering.cts.testclasses.ShaderClippingTests Bug: 280116960 Change-Id: Ic78c4b2ca01e6af9e5af757aa64e15e248cadcf8 --- libs/hwui/SkiaCanvas.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'libs/hwui/SkiaCanvas.cpp') 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 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 mPath; SkRRect mRRect; + sk_sp 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 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); -- cgit v1.2.3-59-g8ed1b