Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 67f119c7 authored by Jorge Betancourt's avatar Jorge Betancourt
Browse files

enable hardware drawing for clipShader

Test: atest CtsUiRenderingTestCases:android.uirendering.cts.testclasses.ShaderClippingTests
Bug:280116960

Change-Id: I84b81c89f67fa48895a3106ca9bac7cb9286f4fc
parent 3da1c926
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ X(ClipPath)
X(ClipRect)
X(ClipRRect)
X(ClipRegion)
X(ClipShader)
X(ResetClip)
X(DrawPaint)
X(DrawBehind)
+15 −0
Original line number Diff line number Diff line
@@ -207,6 +207,13 @@ struct ClipRegion final : Op {
    SkClipOp op;
    void draw(SkCanvas* c, const SkMatrix&) const { c->clipRegion(region, op); }
};
struct ClipShader final : Op {
    static const auto kType = Type::ClipShader;
    ClipShader(const sk_sp<SkShader>& shader, SkClipOp op) : shader(shader), op(op) {}
    sk_sp<SkShader> shader;
    SkClipOp op;
    void draw(SkCanvas* c, const SkMatrix&) const { c->clipShader(shader, op); }
};
struct ResetClip final : Op {
    static const auto kType = Type::ResetClip;
    ResetClip() {}
@@ -822,6 +829,9 @@ void DisplayListData::clipRRect(const SkRRect& rrect, SkClipOp op, bool aa) {
void DisplayListData::clipRegion(const SkRegion& region, SkClipOp op) {
    this->push<ClipRegion>(0, region, op);
}
void DisplayListData::clipShader(const sk_sp<SkShader>& shader, SkClipOp op) {
    this->push<ClipShader>(0, shader, op);
}
void DisplayListData::resetClip() {
    this->push<ResetClip>(0);
}
@@ -1134,6 +1144,11 @@ void RecordingCanvas::onClipRegion(const SkRegion& region, SkClipOp op) {
    fDL->clipRegion(region, op);
    this->INHERITED::onClipRegion(region, op);
}
void RecordingCanvas::onClipShader(sk_sp<SkShader> shader, SkClipOp op) {
    setClipMayBeComplex();
    fDL->clipShader(shader, op);
    this->INHERITED::onClipShader(shader, op);
}
void RecordingCanvas::onResetClip() {
    // This is part of "replace op" emulation, but rely on the following intersection
    // clip to potentially mark the clip as complex. If we are already complex, we do
+2 −0
Original line number Diff line number Diff line
@@ -140,6 +140,7 @@ private:
    void translateZ(SkScalar);

    void clipPath(const SkPath&, SkClipOp, bool aa);
    void clipShader(const sk_sp<SkShader>& shader, SkClipOp);
    void clipRect(const SkRect&, SkClipOp, bool aa);
    void clipRRect(const SkRRect&, SkClipOp, bool aa);
    void clipRegion(const SkRegion&, SkClipOp);
@@ -216,6 +217,7 @@ public:
    void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override;
    void onClipRRect(const SkRRect&, SkClipOp, ClipEdgeStyle) override;
    void onClipPath(const SkPath&, SkClipOp, ClipEdgeStyle) override;
    void onClipShader(sk_sp<SkShader>, SkClipOp) override;
    void onClipRegion(const SkRegion&, SkClipOp) override;
    void onResetClip() override;