180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "gm.h"
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querutypedef SkScalar (*MakePathProc)(SkPath*);
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_frame(SkPath* path) {
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                 SkIntToScalar(630), SkIntToScalar(470) };
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->addRoundRect(r, SkIntToScalar(15), SkIntToScalar(15));
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPaint paint;
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    paint.setStyle(SkPaint::kStroke_Style);
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    paint.setStrokeWidth(SkIntToScalar(5));
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    paint.getFillPath(*path, path);
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return SkIntToScalar(15);
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_triangle(SkPath* path) {
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static const int gCoord[] = {
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        10, 20, 15, 5, 30, 30
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1]));
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3]));
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5]));
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->close();
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->offset(SkIntToScalar(10), SkIntToScalar(0));
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return SkIntToScalar(30);
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_rect(SkPath* path) {
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                 SkIntToScalar(30), SkIntToScalar(30) };
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->addRect(r);
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->offset(SkIntToScalar(10), SkIntToScalar(0));
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return SkIntToScalar(30);
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_oval(SkPath* path) {
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                 SkIntToScalar(30), SkIntToScalar(30) };
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->addOval(r);
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->offset(SkIntToScalar(10), SkIntToScalar(0));
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return SkIntToScalar(30);
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_sawtooth(SkPath* path) {
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar x = SkIntToScalar(20);
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar y = SkIntToScalar(20);
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkScalar x0 = x;
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkScalar dx = SK_Scalar1 * 5;
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkScalar dy = SK_Scalar1 * 10;
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->moveTo(x, y);
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (int i = 0; i < 32; i++) {
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        x += dx;
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        path->lineTo(x, y - dy);
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        x += dx;
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        path->lineTo(x, y + dy);
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->lineTo(x, y + (2 * dy));
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->lineTo(x0, y + (2 * dy));
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->close();
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return SkIntToScalar(30);
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_star(SkPath* path, int n) {
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkScalar c = SkIntToScalar(45);
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkScalar r = SkIntToScalar(20);
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar rad = -SK_ScalarPI / 2;
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n;
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->moveTo(c, c - r);
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (int i = 1; i < n; i++) {
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        rad += drad;
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV);
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        path->lineTo(c + SkScalarMul(cosV, r), c + SkScalarMul(sinV, r));
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->close();
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return r * 2 * 6 / 5;
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_star_5(SkPath* path) { return make_star(path, 5); }
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_star_13(SkPath* path) { return make_star(path, 13); }
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// We don't expect any output from this path.
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkScalar make_line(SkPath* path) {
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->moveTo(SkIntToScalar(30), SkIntToScalar(30));
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->lineTo(SkIntToScalar(120), SkIntToScalar(40));
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->close();
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->moveTo(SkIntToScalar(150), SkIntToScalar(30));
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->lineTo(SkIntToScalar(150), SkIntToScalar(30));
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->lineTo(SkIntToScalar(300), SkIntToScalar(40));
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->close();
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return SkIntToScalar(40);
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const MakePathProc gProcs[] = {
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    make_frame,
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    make_triangle,
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    make_rect,
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    make_oval,
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    make_sawtooth,
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    make_star_5,
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    make_star_13,
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    make_line,
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define N   SK_ARRAY_COUNT(gProcs)
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass PathFillGM : public skiagm::GM {
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPath  fPath[N];
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar fDY[N];
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    PathFillGM() {
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (size_t i = 0; i < N; i++) {
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fDY[i] = gProcs[i](&fPath[i]);
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual SkString onShortName() {
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return SkString("pathfill");
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual SkISize onISize() {
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return SkISize::Make(640, 480);
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onDraw(SkCanvas* canvas) {
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkPaint paint;
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        paint.setAntiAlias(true);
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (size_t i = 0; i < N; i++) {
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            canvas->drawPath(fPath[i], paint);
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            canvas->translate(SkIntToScalar(0), fDY[i]);
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef skiagm::GM INHERITED;
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// test inverse-fill w/ a clip that completely excludes the geometry
15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass PathInverseFillGM : public skiagm::GM {
15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPath  fPath[N];
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar fDY[N];
15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    PathInverseFillGM() {
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (size_t i = 0; i < N; i++) {
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fDY[i] = gProcs[i](&fPath[i]);
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual SkString onShortName() {
16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return SkString("pathinvfill");
16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual SkISize onISize() {
16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return SkISize::Make(450, 220);
16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static void show(SkCanvas* canvas, const SkPath& path, const SkPaint& paint,
17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                     const SkRect* clip, SkScalar top, const SkScalar bottom) {
17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        canvas->save();
17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (clip) {
17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkRect r = *clip;
17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            r.fTop = top;
17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            r.fBottom = bottom;
17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            canvas->clipRect(r);
17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        canvas->drawPath(path, paint);
18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        canvas->restore();
18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void onDraw(SkCanvas* canvas) {
18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkPath path;
18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        path.addCircle(SkIntToScalar(50), SkIntToScalar(50), SkIntToScalar(40));
18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        path.toggleInverseFillType();
18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkRect clipR = { 0, 0, SkIntToScalar(100), SkIntToScalar(200) };
19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (int doclip = 0; doclip <= 1; ++doclip) {
19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            for (int aa = 0; aa <= 1; ++aa) {
19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkPaint paint;
19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                paint.setAntiAlias(SkToBool(aa));
19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                canvas->save();
19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                canvas->clipRect(clipR);
20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                const SkRect* clipPtr = doclip ? &clipR : NULL;
20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                show(canvas, path, paint, clipPtr, clipR.fTop, clipR.centerY());
20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                show(canvas, path, paint, clipPtr, clipR.centerY(), clipR.fBottom);
20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                canvas->restore();
20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                canvas->translate(SkIntToScalar(110), 0);
20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef skiagm::GM INHERITED;
21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic skiagm::GM* MyFactory(void*) { return new PathFillGM; }
21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic skiagm::GMRegistry reg(MyFactory);
22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic skiagm::GM* F1(void*) { return new PathInverseFillGM; }
22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic skiagm::GMRegistry gR1(F1);
223