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