| /* | 
 |  * Copyright 2013 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 |  | 
 | #include "gm/gm.h" | 
 | #include "include/core/SkCanvas.h" | 
 | #include "include/core/SkClipOp.h" | 
 | #include "include/core/SkPaint.h" | 
 | #include "include/core/SkPath.h" | 
 | #include "include/core/SkRect.h" | 
 | #include "include/core/SkScalar.h" | 
 | #include "include/core/SkSize.h" | 
 | #include "include/core/SkString.h" | 
 | #include "include/core/SkTypes.h" | 
 |  | 
 | class CircularClipsGM : public skiagm::GM { | 
 |     SkScalar fX1, fX2, fY, fR; | 
 |     SkPath   fCircle1, fCircle2; | 
 |  | 
 | protected: | 
 |     void onOnceBeforeDraw() override { | 
 |         fX1 = 80; | 
 |         fX2 = 120; | 
 |         fY = 50; | 
 |         fR = 40; | 
 |  | 
 |         fCircle1 = SkPath::Circle(fX1, fY, fR, SkPathDirection::kCW); | 
 |         fCircle2 = SkPath::Circle(fX2, fY, fR, SkPathDirection::kCW); | 
 |     } | 
 |  | 
 |  | 
 |     bool runAsBench() const override { return true; } | 
 |  | 
 |     SkString onShortName() override { | 
 |         return SkString("circular-clips"); | 
 |     } | 
 |  | 
 |     SkISize onISize() override { | 
 |         return SkISize::Make(800, 200); | 
 |     } | 
 |  | 
 |     void onDraw(SkCanvas* canvas) override { | 
 |         const SkClipOp ops[] = { | 
 |             SkClipOp::kDifference, | 
 |             SkClipOp::kIntersect | 
 |         }; | 
 |  | 
 |         SkRect rect = SkRect::MakeLTRB(fX1 - fR, fY - fR, fX2 + fR, fY + fR); | 
 |  | 
 |         SkPaint fillPaint; | 
 |  | 
 |         // Giant background circular clips (AA, non-inverted, replace/isect) | 
 |         fillPaint.setColor(0x80808080); | 
 |         canvas->save(); | 
 |         canvas->scale(10, 10); | 
 |         canvas->translate(-((fX1 + fX2)/2 - fR), -(fY - 2*fR/3)); | 
 |         canvas->clipPath(fCircle1, true); | 
 |         canvas->clipPath(fCircle2, true); | 
 |  | 
 |         canvas->drawRect(rect, fillPaint); | 
 |  | 
 |         canvas->restore(); | 
 |  | 
 |         fillPaint.setColor(0xFF000000); | 
 |  | 
 |         for (size_t i = 0; i < 4; i++) { | 
 |             fCircle1.toggleInverseFillType(); | 
 |             if (i % 2 == 0) { | 
 |                 fCircle2.toggleInverseFillType(); | 
 |             } | 
 |  | 
 |             canvas->save(); | 
 |             for (size_t op = 0; op < std::size(ops); op++) { | 
 |                 canvas->save(); | 
 |  | 
 |                 canvas->clipPath(fCircle1); | 
 |                 canvas->clipPath(fCircle2, ops[op]); | 
 |  | 
 |                 canvas->drawRect(rect, fillPaint); | 
 |  | 
 |                 canvas->restore(); | 
 |                 canvas->translate(0, 2 * fY); | 
 |             } | 
 |             canvas->restore(); | 
 |             canvas->translate(fX1 + fX2, 0); | 
 |         } | 
 |     } | 
 |  | 
 | private: | 
 |     using INHERITED = skiagm::GM; | 
 | }; | 
 |  | 
 | ////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | DEF_GM( return new CircularClipsGM; ) |