blob: 07b59f0a83bdfd0ac3ac95d9c2108c7a2b2a83ac [file] [log] [blame]
commit-bot@chromium.orgd2623a12013-08-08 02:52:05 +00001/*
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:
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +000019 virtual uint32_t onGetFlags() const SK_OVERRIDE {
20 return kSkipTiled_Flag;
21 }
22
commit-bot@chromium.orgd2623a12013-08-08 02:52:05 +000023 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}