1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7ebfce6d9b42198e04288a15953f40c395a7b6139Mike Reed
8807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com#include "gm.h"
933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
10807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com#include "SkCanvas.h"
11807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com#include "SkPath.h"
12807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
13807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.comnamespace skiagm {
14807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
15dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr SkColor gPathColor = SK_ColorBLACK;
16dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr SkColor gClipAColor = SK_ColorBLUE;
17dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr SkColor gClipBColor = SK_ColorRED;
18a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com
19807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.comclass ComplexClipGM : public GM {
20807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.compublic:
216ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon    ComplexClipGM(bool aaclip, bool saveLayer, bool invertDraw)
2250a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com    : fDoAAClip(aaclip)
236ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon    , fDoSaveLayer(saveLayer)
246ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon    , fInvertDraw(invertDraw) {
25ceb9f3b3898c1cc45156ae28854338734f4ad4d1caryclark        this->setBGColor(0xFFDEDFDE);
26807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com    }
27807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
28807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.comprotected:
29a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
30807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
31807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com    SkString onShortName() {
32a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        SkString str;
336ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon        str.printf("complexclip_%s%s%s",
3450a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com                   fDoAAClip ? "aa" : "bw",
356ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon                   fDoSaveLayer ? "_layer" : "",
366ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon                   fInvertDraw ? "_invert" : "");
37a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        return str;
38807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com    }
39807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
40f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    SkISize onISize() { return SkISize::Make(970, 780); }
41807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
42807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com    virtual void onDraw(SkCanvas* canvas) {
43807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        SkPath path;
44807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.moveTo(SkIntToScalar(0),   SkIntToScalar(50));
45807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.quadTo(SkIntToScalar(0),   SkIntToScalar(0),   SkIntToScalar(50),  SkIntToScalar(0));
46807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.lineTo(SkIntToScalar(175), SkIntToScalar(0));
47807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.quadTo(SkIntToScalar(200), SkIntToScalar(0),   SkIntToScalar(200), SkIntToScalar(25));
48807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.lineTo(SkIntToScalar(200), SkIntToScalar(150));
49807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.quadTo(SkIntToScalar(200), SkIntToScalar(200), SkIntToScalar(150), SkIntToScalar(200));
50807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.lineTo(SkIntToScalar(0),   SkIntToScalar(200));
51807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.close();
52807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.moveTo(SkIntToScalar(50),  SkIntToScalar(50));
53807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.lineTo(SkIntToScalar(150), SkIntToScalar(50));
54807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.lineTo(SkIntToScalar(150), SkIntToScalar(125));
55807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.quadTo(SkIntToScalar(150), SkIntToScalar(150), SkIntToScalar(125), SkIntToScalar(150));
56807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.lineTo(SkIntToScalar(50),  SkIntToScalar(150));
57807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.close();
586ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon        if (fInvertDraw) {
596ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon            path.setFillType(SkPath::kInverseEvenOdd_FillType);
606ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon        } else {
616ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon            path.setFillType(SkPath::kEvenOdd_FillType);
626ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon        }
63807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        SkPaint pathPaint;
64807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        pathPaint.setAntiAlias(true);
65a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        pathPaint.setColor(gPathColor);
66807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
67807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        SkPath clipA;
68807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipA.moveTo(SkIntToScalar(10),  SkIntToScalar(20));
69807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipA.lineTo(SkIntToScalar(165), SkIntToScalar(22));
70807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipA.lineTo(SkIntToScalar(70),  SkIntToScalar(105));
71807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipA.lineTo(SkIntToScalar(165), SkIntToScalar(177));
72807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipA.lineTo(SkIntToScalar(-5),  SkIntToScalar(180));
73807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipA.close();
74807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
75807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        SkPath clipB;
76807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipB.moveTo(SkIntToScalar(40),  SkIntToScalar(10));
77807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipB.lineTo(SkIntToScalar(190), SkIntToScalar(15));
78807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipB.lineTo(SkIntToScalar(195), SkIntToScalar(190));
79807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipB.lineTo(SkIntToScalar(40),  SkIntToScalar(185));
80807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipB.lineTo(SkIntToScalar(155), SkIntToScalar(100));
81807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipB.close();
82807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
83807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        SkPaint paint;
84807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        paint.setAntiAlias(true);
851818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark        sk_tool_utils::set_portable_typeface(&paint);
86a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        paint.setTextSize(SkIntToScalar(20));
87807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
88dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein        constexpr struct {
89c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed            SkClipOp fOp;
9073603f3c52ffd89fe9d035be827b566a0e7d3b79reed            const char*      fName;
91807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        } gOps[] = { //extra spaces in names for measureText
92c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed            {kIntersect_SkClipOp,         "Isect "},
93c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed            {kDifference_SkClipOp,        "Diff " },
94c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed            {kUnion_SkClipOp,             "Union "},
95c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed            {kXOR_SkClipOp,               "Xor "  },
96c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed            {kReverseDifference_SkClipOp, "RDiff "}
97807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        };
98807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
99a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
100807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4);
101807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
10254bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com        if (fDoSaveLayer) {
10354bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com            // We want the layer to appear symmetric relative to actual
10454bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com            // device boundaries so we need to "undo" the effect of the
10554bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com            // scale and translate
10654bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com            SkRect bounds = SkRect::MakeLTRB(
1074b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org              4.0f/3.0f * -20,
1084b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org              4.0f/3.0f * -20,
1094b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org              4.0f/3.0f * (this->getISize().fWidth - 20),
1104b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org              4.0f/3.0f * (this->getISize().fHeight - 20));
11154bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com
11254bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com            bounds.inset(SkIntToScalar(100), SkIntToScalar(100));
11350a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com            SkPaint boundPaint;
11450a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com            boundPaint.setColor(SK_ColorRED);
11550a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com            boundPaint.setStyle(SkPaint::kStroke_Style);
11650a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com            canvas->drawRect(bounds, boundPaint);
11796fcdcc219d2a0d3579719b84b28bede76efba64halcanary            canvas->saveLayer(&bounds, nullptr);
11850a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com        }
11950a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com
120a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        for (int invBits = 0; invBits < 4; ++invBits) {
121a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com            canvas->save();
122807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com            for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) {
123a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                this->drawHairlines(canvas, path, clipA, clipB);
124a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com
125a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                bool doInvA = SkToBool(invBits & 1);
126a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                bool doInvB = SkToBool(invBits & 2);
127807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                canvas->save();
128807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                    // set clip
129a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                    clipA.setFillType(doInvA ? SkPath::kInverseEvenOdd_FillType :
130a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                                      SkPath::kEvenOdd_FillType);
131a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                    clipB.setFillType(doInvB ? SkPath::kInverseEvenOdd_FillType :
132a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                                      SkPath::kEvenOdd_FillType);
133669983856d99b9312be3166b7dd1f8483a90c315reed                    canvas->clipPath(clipA, fDoAAClip);
134a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                    canvas->clipPath(clipB, gOps[op].fOp, fDoAAClip);
135807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
1366ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon                    // In the inverse case we need to prevent the draw from covering the whole
1376ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon                    // canvas.
1386ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon                    if (fInvertDraw) {
1396ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon                        SkRect rectClip = clipA.getBounds();
1406ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon                        rectClip.join(path.getBounds());
1416ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon                        rectClip.join(path.getBounds());
1426ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon                        rectClip.outset(5, 5);
1436ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon                        canvas->clipRect(rectClip);
1446ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon                    }
1456ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon
146807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                    // draw path clipped
147807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                    canvas->drawPath(path, pathPaint);
148807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                canvas->restore();
149807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
150807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
151a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                SkScalar txtX = SkIntToScalar(45);
152a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                paint.setColor(gClipAColor);
153a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                const char* aTxt = doInvA ? "InvA " : "A ";
1542a475eae622adc1e8fa29206be1eaf862c23548eCary Clark                canvas->drawString(aTxt, txtX, SkIntToScalar(220), paint);
155807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                txtX += paint.measureText(aTxt, strlen(aTxt));
156807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                paint.setColor(SK_ColorBLACK);
1572a475eae622adc1e8fa29206be1eaf862c23548eCary Clark                canvas->drawString(gOps[op].fName, txtX, SkIntToScalar(220), paint);
158807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                txtX += paint.measureText(gOps[op].fName, strlen(gOps[op].fName));
159a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                paint.setColor(gClipBColor);
160a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                const char* bTxt = doInvB ? "InvB " : "B ";
1612a475eae622adc1e8fa29206be1eaf862c23548eCary Clark                canvas->drawString(bTxt, txtX, SkIntToScalar(220), paint);
162807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
163807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                canvas->translate(SkIntToScalar(250),0);
164807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com            }
165a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com            canvas->restore();
166a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com            canvas->translate(0, SkIntToScalar(250));
167807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        }
16850a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com
16954bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com        if (fDoSaveLayer) {
17050a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com            canvas->restore();
17150a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com        }
172807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com    }
173807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.comprivate:
174a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com    void drawHairlines(SkCanvas* canvas, const SkPath& path,
175a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                       const SkPath& clipA, const SkPath& clipB) {
176a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        SkPaint paint;
177a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        paint.setAntiAlias(true);
178a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        paint.setStyle(SkPaint::kStroke_Style);
179a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        const SkAlpha fade = 0x33;
180a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com
181a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        // draw path in hairline
182a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        paint.setColor(gPathColor); paint.setAlpha(fade);
183a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        canvas->drawPath(path, paint);
184d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
185a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        // draw clips in hair line
186a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        paint.setColor(gClipAColor); paint.setAlpha(fade);
187a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        canvas->drawPath(clipA, paint);
188a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        paint.setColor(gClipBColor); paint.setAlpha(fade);
189a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        canvas->drawPath(clipB, paint);
190a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com    }
191a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com
1926ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon    bool fDoAAClip;
1936ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon    bool fDoSaveLayer;
1946ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon    bool fInvertDraw;
1956ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon
196807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com    typedef GM INHERITED;
197807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com};
198807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
199807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com//////////////////////////////////////////////////////////////////////////////
200807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
201385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ComplexClipGM(false, false, false);)
202385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ComplexClipGM(false, false, true);)
203385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ComplexClipGM(false, true, false);)
204385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ComplexClipGM(false, true, true);)
205385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ComplexClipGM(true, false, false);)
206385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ComplexClipGM(true, false, true);)
207385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ComplexClipGM(true, true, false);)
208385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ComplexClipGM(true, true, true);)
209807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com}
210