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.h"
9#include "SkCanvas.h"
10#include "SkPath.h"
11
12namespace skiagm {
13
14class CircularClipsGM : public GM {
15public:
16    CircularClipsGM() {}
17
18protected:
19    virtual uint32_t onGetFlags() const SK_OVERRIDE {
20        return kSkipTiled_Flag;
21    }
22
23    virtual SkString onShortName() {
24        return SkString("circular-clips");
25    }
26
27    virtual SkISize onISize() {
28        return SkISize::Make(800, 600);
29    }
30
31    virtual void onDraw(SkCanvas* canvas) {
32        SkRegion::Op ops[] = {
33            SkRegion::kDifference_Op,
34            SkRegion::kIntersect_Op,
35            SkRegion::kUnion_Op,
36            SkRegion::kXOR_Op,
37            SkRegion::kReverseDifference_Op,
38            SkRegion::kReplace_Op,
39        };
40
41        SkScalar x1 = 80, x2 = 120;
42        SkScalar y = 50;
43        SkScalar r = 40;
44
45        SkPath circle1, circle2;
46        circle1.addCircle(x1, y, r, SkPath::kCW_Direction);
47        circle2.addCircle(x2, y, r, SkPath::kCW_Direction);
48        SkRect rect = SkRect::MakeLTRB(x1 - r, y - r, x2 + r, y + r);
49
50        SkPaint fillPaint;
51
52        for (size_t i = 0; i < 4; i++) {
53            circle1.toggleInverseFillType();
54            if (i % 2 == 0) {
55                circle2.toggleInverseFillType();
56            }
57
58            canvas->save();
59            for (size_t op = 0; op < SK_ARRAY_COUNT(ops); op++) {
60                canvas->save();
61
62                canvas->clipPath(circle1, SkRegion::kReplace_Op);
63                canvas->clipPath(circle2, ops[op]);
64
65                canvas->drawRect(rect, fillPaint);
66
67                canvas->restore();
68                canvas->translate(0, 2 * y);
69            }
70            canvas->restore();
71            canvas->translate(x1 + x2, 0);
72        }
73    }
74
75private:
76    typedef GM INHERITED;
77};
78
79//////////////////////////////////////////////////////////////////////////////
80
81DEF_GM( return new CircularClipsGM; )
82}
83