xref: /aosp_15_r20/external/skia/gm/circularclips.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2013 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "gm/gm.h"
9 #include "include/core/SkCanvas.h"
10 #include "include/core/SkClipOp.h"
11 #include "include/core/SkPaint.h"
12 #include "include/core/SkPath.h"
13 #include "include/core/SkRect.h"
14 #include "include/core/SkScalar.h"
15 #include "include/core/SkSize.h"
16 #include "include/core/SkString.h"
17 #include "include/core/SkTypes.h"
18 
19 class CircularClipsGM : public skiagm::GM {
20     SkScalar fX1, fX2, fY, fR;
21     SkPath   fCircle1, fCircle2;
22 
23 protected:
onOnceBeforeDraw()24     void onOnceBeforeDraw() override {
25         fX1 = 80;
26         fX2 = 120;
27         fY = 50;
28         fR = 40;
29 
30         fCircle1 = SkPath::Circle(fX1, fY, fR, SkPathDirection::kCW);
31         fCircle2 = SkPath::Circle(fX2, fY, fR, SkPathDirection::kCW);
32     }
33 
34 
runAsBench() const35     bool runAsBench() const override { return true; }
36 
getName() const37     SkString getName() const override { return SkString("circular-clips"); }
38 
getISize()39     SkISize getISize() override { return SkISize::Make(800, 200); }
40 
onDraw(SkCanvas * canvas)41     void onDraw(SkCanvas* canvas) override {
42         const SkClipOp ops[] = {
43             SkClipOp::kDifference,
44             SkClipOp::kIntersect
45         };
46 
47         SkRect rect = SkRect::MakeLTRB(fX1 - fR, fY - fR, fX2 + fR, fY + fR);
48 
49         SkPaint fillPaint;
50 
51         // Giant background circular clips (AA, non-inverted, replace/isect)
52         fillPaint.setColor(0x80808080);
53         canvas->save();
54         canvas->scale(10, 10);
55         canvas->translate(-((fX1 + fX2)/2 - fR), -(fY - 2*fR/3));
56         canvas->clipPath(fCircle1, true);
57         canvas->clipPath(fCircle2, true);
58 
59         canvas->drawRect(rect, fillPaint);
60 
61         canvas->restore();
62 
63         fillPaint.setColor(0xFF000000);
64 
65         for (size_t i = 0; i < 4; i++) {
66             fCircle1.toggleInverseFillType();
67             if (i % 2 == 0) {
68                 fCircle2.toggleInverseFillType();
69             }
70 
71             canvas->save();
72             for (size_t op = 0; op < std::size(ops); op++) {
73                 canvas->save();
74 
75                 canvas->clipPath(fCircle1);
76                 canvas->clipPath(fCircle2, ops[op]);
77 
78                 canvas->drawRect(rect, fillPaint);
79 
80                 canvas->restore();
81                 canvas->translate(0, 2 * fY);
82             }
83             canvas->restore();
84             canvas->translate(fX1 + fX2, 0);
85         }
86     }
87 
88 private:
89     using INHERITED = skiagm::GM;
90 };
91 
92 //////////////////////////////////////////////////////////////////////////////
93 
94 DEF_GM( return new CircularClipsGM; )
95