1d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org/*
2d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org * Copyright 2013 Google Inc.
3d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org *
4d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
5d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org * found in the LICENSE file.
6d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org */
7d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org
8d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org#include "gm.h"
9d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org#include "SkCanvas.h"
10d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org#include "SkPath.h"
11d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org
12bbf3e8982d9e6846196f73068bb83db849654f12reedclass CircularClipsGM : public skiagm::GM {
13bbf3e8982d9e6846196f73068bb83db849654f12reed    SkScalar fX1, fX2, fY, fR;
14bbf3e8982d9e6846196f73068bb83db849654f12reed    SkPath   fCircle1, fCircle2;
15d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org
16d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.orgpublic:
17bbf3e8982d9e6846196f73068bb83db849654f12reed    CircularClipsGM() {
18bbf3e8982d9e6846196f73068bb83db849654f12reed        fX1 = 80;
19bbf3e8982d9e6846196f73068bb83db849654f12reed        fX2 = 120;
20bbf3e8982d9e6846196f73068bb83db849654f12reed        fY = 50;
21bbf3e8982d9e6846196f73068bb83db849654f12reed        fR = 40;
22bbf3e8982d9e6846196f73068bb83db849654f12reed
23bbf3e8982d9e6846196f73068bb83db849654f12reed        fCircle1.addCircle(fX1, fY, fR, SkPath::kCW_Direction);
24bbf3e8982d9e6846196f73068bb83db849654f12reed        fCircle2.addCircle(fX2, fY, fR, SkPath::kCW_Direction);
25bbf3e8982d9e6846196f73068bb83db849654f12reed    }
26d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org
27d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.orgprotected:
28a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
29bbf3e8982d9e6846196f73068bb83db849654f12reed        return kSkipTiled_Flag | kAsBench_Flag;
30a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
31a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
32d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org    virtual SkString onShortName() {
33d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org        return SkString("circular-clips");
34d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org    }
35d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org
36d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org    virtual SkISize onISize() {
37d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org        return SkISize::Make(800, 600);
38d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org    }
39d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org
40d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org    virtual void onDraw(SkCanvas* canvas) {
41d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org        SkRegion::Op ops[] = {
42d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org            SkRegion::kDifference_Op,
43d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org            SkRegion::kIntersect_Op,
44d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org            SkRegion::kUnion_Op,
45d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org            SkRegion::kXOR_Op,
46d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org            SkRegion::kReverseDifference_Op,
47d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org            SkRegion::kReplace_Op,
48d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org        };
49d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org
50bbf3e8982d9e6846196f73068bb83db849654f12reed        SkRect rect = SkRect::MakeLTRB(fX1 - fR, fY - fR, fX2 + fR, fY + fR);
51d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org
52d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org        SkPaint fillPaint;
53d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org
54d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org        for (size_t i = 0; i < 4; i++) {
55bbf3e8982d9e6846196f73068bb83db849654f12reed            fCircle1.toggleInverseFillType();
56d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org            if (i % 2 == 0) {
57bbf3e8982d9e6846196f73068bb83db849654f12reed                fCircle2.toggleInverseFillType();
58d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org            }
59d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org
60d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org            canvas->save();
61d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org            for (size_t op = 0; op < SK_ARRAY_COUNT(ops); op++) {
62d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org                canvas->save();
63d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org
64bbf3e8982d9e6846196f73068bb83db849654f12reed                canvas->clipPath(fCircle1, SkRegion::kReplace_Op);
65bbf3e8982d9e6846196f73068bb83db849654f12reed                canvas->clipPath(fCircle2, ops[op]);
66d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org
67d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org                canvas->drawRect(rect, fillPaint);
68d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org
69d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org                canvas->restore();
70bbf3e8982d9e6846196f73068bb83db849654f12reed                canvas->translate(0, 2 * fY);
71d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org            }
72d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org            canvas->restore();
73bbf3e8982d9e6846196f73068bb83db849654f12reed            canvas->translate(fX1 + fX2, 0);
74d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org        }
75d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org    }
76d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org
77d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.orgprivate:
78bbf3e8982d9e6846196f73068bb83db849654f12reed    typedef skiagm::GM INHERITED;
79d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org};
80d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org
81d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
82d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.org
83d2623a1a0bcd23801c86a7d3f352b5e1f1c2e195commit-bot@chromium.orgDEF_GM( return new CircularClipsGM; )
84