blob: b2138385f14339471052e255f390b7127b03077a [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
9#include "include/core/SkCanvas.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040010#include "include/core/SkClipOp.h"
11#include "include/core/SkPaint.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "include/core/SkPath.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040013#include "include/core/SkRect.h"
14#include "include/core/SkScalar.h"
15#include "include/core/SkSize.h"
16#include "include/core/SkString.h"
17#include "include/core/SkTypes.h"
18#include "src/core/SkClipOpPriv.h"
commit-bot@chromium.orgd2623a12013-08-08 02:52:05 +000019
reedbbf3e892014-06-20 11:33:59 -070020class CircularClipsGM : public skiagm::GM {
21 SkScalar fX1, fX2, fY, fR;
22 SkPath fCircle1, fCircle2;
commit-bot@chromium.orgd2623a12013-08-08 02:52:05 +000023
caryclark63c684a2015-02-25 09:04:04 -080024protected:
mtklein36352bf2015-03-25 18:17:31 -070025 void onOnceBeforeDraw() override {
reedbbf3e892014-06-20 11:33:59 -070026 fX1 = 80;
27 fX2 = 120;
28 fY = 50;
29 fR = 40;
30
Mike Reed30bc5272019-11-22 18:34:02 +000031 fCircle1.addCircle(fX1, fY, fR, SkPathDirection::kCW);
32 fCircle2.addCircle(fX2, fY, fR, SkPathDirection::kCW);
reedbbf3e892014-06-20 11:33:59 -070033 }
commit-bot@chromium.orgd2623a12013-08-08 02:52:05 +000034
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +000035
mtklein36352bf2015-03-25 18:17:31 -070036 bool runAsBench() const override { return true; }
mtkleincf5d9c92015-01-23 10:31:45 -080037
mtklein36352bf2015-03-25 18:17:31 -070038 SkString onShortName() override {
commit-bot@chromium.orgd2623a12013-08-08 02:52:05 +000039 return SkString("circular-clips");
40 }
41
mtklein36352bf2015-03-25 18:17:31 -070042 SkISize onISize() override {
commit-bot@chromium.orgd2623a12013-08-08 02:52:05 +000043 return SkISize::Make(800, 600);
44 }
45
mtklein36352bf2015-03-25 18:17:31 -070046 void onDraw(SkCanvas* canvas) override {
Mike Reedc1f77742016-12-09 09:00:50 -050047 const SkClipOp ops[] = {
48 kDifference_SkClipOp,
49 kIntersect_SkClipOp,
50 kUnion_SkClipOp,
51 kXOR_SkClipOp,
52 kReverseDifference_SkClipOp,
53 kReplace_SkClipOp,
commit-bot@chromium.orgd2623a12013-08-08 02:52:05 +000054 };
55
reedbbf3e892014-06-20 11:33:59 -070056 SkRect rect = SkRect::MakeLTRB(fX1 - fR, fY - fR, fX2 + fR, fY + fR);
commit-bot@chromium.orgd2623a12013-08-08 02:52:05 +000057
58 SkPaint fillPaint;
59
bsalomonfcabe422015-04-28 12:43:01 -070060 // Giant background circular clips (AA, non-inverted, replace/isect)
61 fillPaint.setColor(0x80808080);
62 canvas->save();
63 canvas->scale(10, 10);
64 canvas->translate(-((fX1 + fX2)/2 - fR), -(fY - 2*fR/3));
reed66998382016-09-21 11:15:07 -070065 canvas->clipPath(fCircle1, true);
66 canvas->clipPath(fCircle2, true);
bsalomonfcabe422015-04-28 12:43:01 -070067
68 canvas->drawRect(rect, fillPaint);
69
70 canvas->restore();
halcanary9d524f22016-03-29 09:03:52 -070071
bsalomonfcabe422015-04-28 12:43:01 -070072 fillPaint.setColor(0xFF000000);
73
commit-bot@chromium.orgd2623a12013-08-08 02:52:05 +000074 for (size_t i = 0; i < 4; i++) {
reedbbf3e892014-06-20 11:33:59 -070075 fCircle1.toggleInverseFillType();
commit-bot@chromium.orgd2623a12013-08-08 02:52:05 +000076 if (i % 2 == 0) {
reedbbf3e892014-06-20 11:33:59 -070077 fCircle2.toggleInverseFillType();
commit-bot@chromium.orgd2623a12013-08-08 02:52:05 +000078 }
79
80 canvas->save();
81 for (size_t op = 0; op < SK_ARRAY_COUNT(ops); op++) {
82 canvas->save();
83
reed66998382016-09-21 11:15:07 -070084 canvas->clipPath(fCircle1);
reedbbf3e892014-06-20 11:33:59 -070085 canvas->clipPath(fCircle2, ops[op]);
commit-bot@chromium.orgd2623a12013-08-08 02:52:05 +000086
87 canvas->drawRect(rect, fillPaint);
88
89 canvas->restore();
reedbbf3e892014-06-20 11:33:59 -070090 canvas->translate(0, 2 * fY);
commit-bot@chromium.orgd2623a12013-08-08 02:52:05 +000091 }
92 canvas->restore();
reedbbf3e892014-06-20 11:33:59 -070093 canvas->translate(fX1 + fX2, 0);
commit-bot@chromium.orgd2623a12013-08-08 02:52:05 +000094 }
95 }
96
97private:
reedbbf3e892014-06-20 11:33:59 -070098 typedef skiagm::GM INHERITED;
commit-bot@chromium.orgd2623a12013-08-08 02:52:05 +000099};
100
101//////////////////////////////////////////////////////////////////////////////
102
103DEF_GM( return new CircularClipsGM; )