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 #include "src/core/SkClipOpPriv.h" 19 20 class CircularClipsGM : public skiagm::GM { 21 SkScalar fX1, fX2, fY, fR; 22 SkPath fCircle1, fCircle2; 23 24 protected: onOnceBeforeDraw()25 void onOnceBeforeDraw() override { 26 fX1 = 80; 27 fX2 = 120; 28 fY = 50; 29 fR = 40; 30 31 fCircle1 = SkPath::Circle(fX1, fY, fR, SkPathDirection::kCW); 32 fCircle2 = SkPath::Circle(fX2, fY, fR, SkPathDirection::kCW); 33 } 34 35 runAsBench() const36 bool runAsBench() const override { return true; } 37 onShortName()38 SkString onShortName() override { 39 return SkString("circular-clips"); 40 } 41 onISize()42 SkISize onISize() override { 43 return SkISize::Make(800, 200); 44 } 45 onDraw(SkCanvas * canvas)46 void onDraw(SkCanvas* canvas) override { 47 const SkClipOp ops[] = { 48 kDifference_SkClipOp, 49 kIntersect_SkClipOp 50 }; 51 52 SkRect rect = SkRect::MakeLTRB(fX1 - fR, fY - fR, fX2 + fR, fY + fR); 53 54 SkPaint fillPaint; 55 56 // Giant background circular clips (AA, non-inverted, replace/isect) 57 fillPaint.setColor(0x80808080); 58 canvas->save(); 59 canvas->scale(10, 10); 60 canvas->translate(-((fX1 + fX2)/2 - fR), -(fY - 2*fR/3)); 61 canvas->clipPath(fCircle1, true); 62 canvas->clipPath(fCircle2, true); 63 64 canvas->drawRect(rect, fillPaint); 65 66 canvas->restore(); 67 68 fillPaint.setColor(0xFF000000); 69 70 for (size_t i = 0; i < 4; i++) { 71 fCircle1.toggleInverseFillType(); 72 if (i % 2 == 0) { 73 fCircle2.toggleInverseFillType(); 74 } 75 76 canvas->save(); 77 for (size_t op = 0; op < SK_ARRAY_COUNT(ops); op++) { 78 canvas->save(); 79 80 canvas->clipPath(fCircle1); 81 canvas->clipPath(fCircle2, ops[op]); 82 83 canvas->drawRect(rect, fillPaint); 84 85 canvas->restore(); 86 canvas->translate(0, 2 * fY); 87 } 88 canvas->restore(); 89 canvas->translate(fX1 + fX2, 0); 90 } 91 } 92 93 private: 94 using INHERITED = skiagm::GM; 95 }; 96 97 ////////////////////////////////////////////////////////////////////////////// 98 99 DEF_GM( return new CircularClipsGM; ) 100