1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com#include "gm.h"
9807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com#include "SkCanvas.h"
10807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com//#include "SkParsePath.h"
11807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com#include "SkPath.h"
12807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com//#include "SkRandom.h"
13807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
14807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.comnamespace skiagm {
15807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
16a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.comstatic const SkColor gPathColor = SK_ColorBLACK;
17a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.comstatic const SkColor gClipAColor = SK_ColorBLUE;
18a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.comstatic const SkColor gClipBColor = SK_ColorRED;
19a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com
20807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.comclass ComplexClipGM : public GM {
21a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com    bool fDoAAClip;
2254bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com    bool fDoSaveLayer;
23807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.compublic:
24d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    ComplexClipGM(bool aaclip, bool saveLayer)
2550a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com    : fDoAAClip(aaclip)
2654bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com    , fDoSaveLayer(saveLayer) {
27a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        this->setBGColor(0xFFDDDDDD);
28a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com//        this->setBGColor(SkColorSetRGB(0xB0,0xDD,0xB0));
29807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com    }
30807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
31807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.comprotected:
32a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
33a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
34a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
35a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
36807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
37807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com    SkString onShortName() {
38a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        SkString str;
39d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com        str.printf("complexclip_%s%s",
4050a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com                   fDoAAClip ? "aa" : "bw",
4154bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com                   fDoSaveLayer ? "_layer" : "");
42a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        return str;
43807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com    }
44807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
45f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    SkISize onISize() { return SkISize::Make(970, 780); }
46807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
47807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com    virtual void onDraw(SkCanvas* canvas) {
48807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        SkPath path;
49807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.moveTo(SkIntToScalar(0),   SkIntToScalar(50));
50807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.quadTo(SkIntToScalar(0),   SkIntToScalar(0),   SkIntToScalar(50),  SkIntToScalar(0));
51807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.lineTo(SkIntToScalar(175), SkIntToScalar(0));
52807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.quadTo(SkIntToScalar(200), SkIntToScalar(0),   SkIntToScalar(200), SkIntToScalar(25));
53807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.lineTo(SkIntToScalar(200), SkIntToScalar(150));
54807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.quadTo(SkIntToScalar(200), SkIntToScalar(200), SkIntToScalar(150), SkIntToScalar(200));
55807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.lineTo(SkIntToScalar(0),   SkIntToScalar(200));
56807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.close();
57807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.moveTo(SkIntToScalar(50),  SkIntToScalar(50));
58807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.lineTo(SkIntToScalar(150), SkIntToScalar(50));
59807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.lineTo(SkIntToScalar(150), SkIntToScalar(125));
60807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.quadTo(SkIntToScalar(150), SkIntToScalar(150), SkIntToScalar(125), SkIntToScalar(150));
61807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.lineTo(SkIntToScalar(50),  SkIntToScalar(150));
62807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.close();
63807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        path.setFillType(SkPath::kEvenOdd_FillType);
64807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        SkPaint pathPaint;
65807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        pathPaint.setAntiAlias(true);
66a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        pathPaint.setColor(gPathColor);
67807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
68807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        SkPath clipA;
69807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipA.moveTo(SkIntToScalar(10),  SkIntToScalar(20));
70807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipA.lineTo(SkIntToScalar(165), SkIntToScalar(22));
71807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipA.lineTo(SkIntToScalar(70),  SkIntToScalar(105));
72807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipA.lineTo(SkIntToScalar(165), SkIntToScalar(177));
73807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipA.lineTo(SkIntToScalar(-5),  SkIntToScalar(180));
74807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipA.close();
75807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
76807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        SkPath clipB;
77807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipB.moveTo(SkIntToScalar(40),  SkIntToScalar(10));
78807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipB.lineTo(SkIntToScalar(190), SkIntToScalar(15));
79807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipB.lineTo(SkIntToScalar(195), SkIntToScalar(190));
80807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipB.lineTo(SkIntToScalar(40),  SkIntToScalar(185));
81807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipB.lineTo(SkIntToScalar(155), SkIntToScalar(100));
82807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        clipB.close();
83807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
84807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        SkPaint paint;
85807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        paint.setAntiAlias(true);
865fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        sk_tool_utils::set_portable_typeface(&paint);
87a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        paint.setTextSize(SkIntToScalar(20));
88807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
89807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        static const struct {
90807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com            SkRegion::Op fOp;
91807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com            const char*  fName;
92807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        } gOps[] = { //extra spaces in names for measureText
93807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com            {SkRegion::kIntersect_Op,         "Isect "},
94807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com            {SkRegion::kDifference_Op,        "Diff " },
95807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com            {SkRegion::kUnion_Op,             "Union "},
96807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com            {SkRegion::kXOR_Op,               "Xor "  },
97807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com            {SkRegion::kReverseDifference_Op, "RDiff "}
98807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        };
99807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
100a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
101807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4);
102807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
10354bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com        if (fDoSaveLayer) {
10454bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com            // We want the layer to appear symmetric relative to actual
10554bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com            // device boundaries so we need to "undo" the effect of the
10654bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com            // scale and translate
10754bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com            SkRect bounds = SkRect::MakeLTRB(
1084b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org              4.0f/3.0f * -20,
1094b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org              4.0f/3.0f * -20,
1104b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org              4.0f/3.0f * (this->getISize().fWidth - 20),
1114b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org              4.0f/3.0f * (this->getISize().fHeight - 20));
11254bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com
11354bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com            bounds.inset(SkIntToScalar(100), SkIntToScalar(100));
11450a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com            SkPaint boundPaint;
11550a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com            boundPaint.setColor(SK_ColorRED);
11650a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com            boundPaint.setStyle(SkPaint::kStroke_Style);
11750a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com            canvas->drawRect(bounds, boundPaint);
11850a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com            canvas->saveLayer(&bounds, NULL);
11950a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com        }
12050a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com
121a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        for (int invBits = 0; invBits < 4; ++invBits) {
122a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com            canvas->save();
123807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com            for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) {
124a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                this->drawHairlines(canvas, path, clipA, clipB);
125a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com
126a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                bool doInvA = SkToBool(invBits & 1);
127a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                bool doInvB = SkToBool(invBits & 2);
128807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                canvas->save();
129807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                    // set clip
130a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                    clipA.setFillType(doInvA ? SkPath::kInverseEvenOdd_FillType :
131a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                                      SkPath::kEvenOdd_FillType);
132a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                    clipB.setFillType(doInvB ? SkPath::kInverseEvenOdd_FillType :
133a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                                      SkPath::kEvenOdd_FillType);
134a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                    canvas->clipPath(clipA, SkRegion::kIntersect_Op, fDoAAClip);
135a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                    canvas->clipPath(clipB, gOps[op].fOp, fDoAAClip);
136807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
137807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                    // draw path clipped
138807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                    canvas->drawPath(path, pathPaint);
139807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                canvas->restore();
140807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
141807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
142a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                SkScalar txtX = SkIntToScalar(45);
143a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                paint.setColor(gClipAColor);
144a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                const char* aTxt = doInvA ? "InvA " : "A ";
145807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                canvas->drawText(aTxt, strlen(aTxt), txtX, SkIntToScalar(220), paint);
146807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                txtX += paint.measureText(aTxt, strlen(aTxt));
147807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                paint.setColor(SK_ColorBLACK);
148807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                canvas->drawText(gOps[op].fName, strlen(gOps[op].fName),
149807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                                    txtX, SkIntToScalar(220), paint);
150807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                txtX += paint.measureText(gOps[op].fName, strlen(gOps[op].fName));
151a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                paint.setColor(gClipBColor);
152a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                const char* bTxt = doInvB ? "InvB " : "B ";
153a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                canvas->drawText(bTxt, strlen(bTxt), txtX, SkIntToScalar(220), paint);
154807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
155807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com                canvas->translate(SkIntToScalar(250),0);
156807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com            }
157a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com            canvas->restore();
158a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com            canvas->translate(0, SkIntToScalar(250));
159807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com        }
16050a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com
16154bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com        if (fDoSaveLayer) {
16250a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com            canvas->restore();
16350a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com        }
164807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com    }
165807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.comprivate:
166a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com    void drawHairlines(SkCanvas* canvas, const SkPath& path,
167a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com                       const SkPath& clipA, const SkPath& clipB) {
168a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        SkPaint paint;
169a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        paint.setAntiAlias(true);
170a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        paint.setStyle(SkPaint::kStroke_Style);
171a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        const SkAlpha fade = 0x33;
172a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com
173a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        // draw path in hairline
174a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        paint.setColor(gPathColor); paint.setAlpha(fade);
175a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        canvas->drawPath(path, paint);
176d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
177a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        // draw clips in hair line
178a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        paint.setColor(gClipAColor); paint.setAlpha(fade);
179a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        canvas->drawPath(clipA, paint);
180a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        paint.setColor(gClipBColor); paint.setAlpha(fade);
181a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com        canvas->drawPath(clipB, paint);
182a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com    }
183a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com
184807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com    typedef GM INHERITED;
185807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com};
186807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
187807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com//////////////////////////////////////////////////////////////////////////////
188807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
18950a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com// aliased and anti-aliased w/o a layer
19050a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.comstatic GM* gFact0(void*) { return new ComplexClipGM(false, false); }
19150a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.comstatic GM* gFact1(void*) { return new ComplexClipGM(true, false); }
19250a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com
19350a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com// aliased and anti-aliased w/ a layer
19450a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.comstatic GM* gFact2(void*) { return new ComplexClipGM(false, true); }
19550a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.comstatic GM* gFact3(void*) { return new ComplexClipGM(true, true); }
196a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com
197a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.comstatic GMRegistry gReg0(gFact0);
198a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.comstatic GMRegistry gReg1(gFact1);
19950a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.comstatic GMRegistry gReg2(gFact2);
20050a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.comstatic GMRegistry gReg3(gFact3);
201807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com
202807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com}
203