|  | /* | 
|  | * 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.h" | 
|  | #include "SkCanvas.h" | 
|  | #include "SkPath.h" | 
|  |  | 
|  | class CircularClipsGM : public skiagm::GM { | 
|  | SkScalar fX1, fX2, fY, fR; | 
|  | SkPath   fCircle1, fCircle2; | 
|  |  | 
|  | public: | 
|  | CircularClipsGM() { | 
|  | fX1 = 80; | 
|  | fX2 = 120; | 
|  | fY = 50; | 
|  | fR = 40; | 
|  |  | 
|  | fCircle1.addCircle(fX1, fY, fR, SkPath::kCW_Direction); | 
|  | fCircle2.addCircle(fX2, fY, fR, SkPath::kCW_Direction); | 
|  | } | 
|  |  | 
|  | protected: | 
|  | virtual uint32_t onGetFlags() const SK_OVERRIDE { | 
|  | return kSkipTiled_Flag | kAsBench_Flag; | 
|  | } | 
|  |  | 
|  | virtual SkString onShortName() { | 
|  | return SkString("circular-clips"); | 
|  | } | 
|  |  | 
|  | virtual SkISize onISize() { | 
|  | return SkISize::Make(800, 600); | 
|  | } | 
|  |  | 
|  | virtual void onDraw(SkCanvas* canvas) { | 
|  | SkRegion::Op ops[] = { | 
|  | SkRegion::kDifference_Op, | 
|  | SkRegion::kIntersect_Op, | 
|  | SkRegion::kUnion_Op, | 
|  | SkRegion::kXOR_Op, | 
|  | SkRegion::kReverseDifference_Op, | 
|  | SkRegion::kReplace_Op, | 
|  | }; | 
|  |  | 
|  | SkRect rect = SkRect::MakeLTRB(fX1 - fR, fY - fR, fX2 + fR, fY + fR); | 
|  |  | 
|  | SkPaint fillPaint; | 
|  |  | 
|  | for (size_t i = 0; i < 4; i++) { | 
|  | fCircle1.toggleInverseFillType(); | 
|  | if (i % 2 == 0) { | 
|  | fCircle2.toggleInverseFillType(); | 
|  | } | 
|  |  | 
|  | canvas->save(); | 
|  | for (size_t op = 0; op < SK_ARRAY_COUNT(ops); op++) { | 
|  | canvas->save(); | 
|  |  | 
|  | canvas->clipPath(fCircle1, SkRegion::kReplace_Op); | 
|  | canvas->clipPath(fCircle2, ops[op]); | 
|  |  | 
|  | canvas->drawRect(rect, fillPaint); | 
|  |  | 
|  | canvas->restore(); | 
|  | canvas->translate(0, 2 * fY); | 
|  | } | 
|  | canvas->restore(); | 
|  | canvas->translate(fX1 + fX2, 0); | 
|  | } | 
|  | } | 
|  |  | 
|  | private: | 
|  | typedef skiagm::GM INHERITED; | 
|  | }; | 
|  |  | 
|  | ////////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | DEF_GM( return new CircularClipsGM; ) |