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 */
8c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com#include "gm.h"
9c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com
10c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.comtypedef SkScalar (*MakePathProc)(SkPath*);
11c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com
12c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.comstatic SkScalar make_frame(SkPath* path) {
133c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com    SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
143c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com                 SkIntToScalar(630), SkIntToScalar(470) };
153c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com    path->addRoundRect(r, SkIntToScalar(15), SkIntToScalar(15));
16d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
17c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    SkPaint paint;
18c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    paint.setStyle(SkPaint::kStroke_Style);
193c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com    paint.setStrokeWidth(SkIntToScalar(5));
20c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    paint.getFillPath(*path, path);
213c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com    return SkIntToScalar(15);
22c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com}
23c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com
24c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.comstatic SkScalar make_triangle(SkPath* path) {
25c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    static const int gCoord[] = {
26c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com        10, 20, 15, 5, 30, 30
27c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    };
28c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1]));
29c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3]));
30c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5]));
31c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    path->close();
323c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com    path->offset(SkIntToScalar(10), SkIntToScalar(0));
33c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    return SkIntToScalar(30);
34c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com}
35c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com
36c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.comstatic SkScalar make_rect(SkPath* path) {
373c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com    SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
383c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com                 SkIntToScalar(30), SkIntToScalar(30) };
39c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    path->addRect(r);
403c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com    path->offset(SkIntToScalar(10), SkIntToScalar(0));
41c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    return SkIntToScalar(30);
42c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com}
43c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com
44c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.comstatic SkScalar make_oval(SkPath* path) {
453c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com    SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
463c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com                 SkIntToScalar(30), SkIntToScalar(30) };
47c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    path->addOval(r);
483c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com    path->offset(SkIntToScalar(10), SkIntToScalar(0));
49c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    return SkIntToScalar(30);
50c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com}
51c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com
52c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.comstatic SkScalar make_sawtooth(SkPath* path) {
53c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    SkScalar x = SkIntToScalar(20);
54c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    SkScalar y = SkIntToScalar(20);
55c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    const SkScalar x0 = x;
56c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    const SkScalar dx = SK_Scalar1 * 5;
57c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    const SkScalar dy = SK_Scalar1 * 10;
58d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
59c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    path->moveTo(x, y);
60c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    for (int i = 0; i < 32; i++) {
61c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com        x += dx;
62c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com        path->lineTo(x, y - dy);
63c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com        x += dx;
64c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com        path->lineTo(x, y + dy);
65c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    }
663c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com    path->lineTo(x, y + (2 * dy));
673c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com    path->lineTo(x0, y + (2 * dy));
68c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    path->close();
69c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    return SkIntToScalar(30);
70c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com}
71c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com
72c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.comstatic SkScalar make_star(SkPath* path, int n) {
73c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    const SkScalar c = SkIntToScalar(45);
74c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    const SkScalar r = SkIntToScalar(20);
75d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
76c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    SkScalar rad = -SK_ScalarPI / 2;
77c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n;
78d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
79c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    path->moveTo(c, c - r);
80c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    for (int i = 1; i < n; i++) {
81c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com        rad += drad;
82c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com        SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV);
83c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com        path->lineTo(c + SkScalarMul(cosV, r), c + SkScalarMul(sinV, r));
84c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    }
85c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    path->close();
86c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    return r * 2 * 6 / 5;
87c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com}
88c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com
89c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.comstatic SkScalar make_star_5(SkPath* path) { return make_star(path, 5); }
90c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.comstatic SkScalar make_star_13(SkPath* path) { return make_star(path, 13); }
91c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com
92683001ce0de70c859ea5e5353245b18cadbefc45vandebo@chromium.org// We don't expect any output from this path.
93683001ce0de70c859ea5e5353245b18cadbefc45vandebo@chromium.orgstatic SkScalar make_line(SkPath* path) {
94683001ce0de70c859ea5e5353245b18cadbefc45vandebo@chromium.org    path->moveTo(SkIntToScalar(30), SkIntToScalar(30));
95683001ce0de70c859ea5e5353245b18cadbefc45vandebo@chromium.org    path->lineTo(SkIntToScalar(120), SkIntToScalar(40));
96683001ce0de70c859ea5e5353245b18cadbefc45vandebo@chromium.org    path->close();
97683001ce0de70c859ea5e5353245b18cadbefc45vandebo@chromium.org    path->moveTo(SkIntToScalar(150), SkIntToScalar(30));
98683001ce0de70c859ea5e5353245b18cadbefc45vandebo@chromium.org    path->lineTo(SkIntToScalar(150), SkIntToScalar(30));
99683001ce0de70c859ea5e5353245b18cadbefc45vandebo@chromium.org    path->lineTo(SkIntToScalar(300), SkIntToScalar(40));
100683001ce0de70c859ea5e5353245b18cadbefc45vandebo@chromium.org    path->close();
101683001ce0de70c859ea5e5353245b18cadbefc45vandebo@chromium.org    return SkIntToScalar(40);
102683001ce0de70c859ea5e5353245b18cadbefc45vandebo@chromium.org}
103683001ce0de70c859ea5e5353245b18cadbefc45vandebo@chromium.org
104c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.comstatic const MakePathProc gProcs[] = {
105c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    make_frame,
106c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    make_triangle,
107c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    make_rect,
108c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    make_oval,
109c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    make_sawtooth,
110c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    make_star_5,
111683001ce0de70c859ea5e5353245b18cadbefc45vandebo@chromium.org    make_star_13,
112683001ce0de70c859ea5e5353245b18cadbefc45vandebo@chromium.org    make_line,
113c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com};
114c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com
115c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com#define N   SK_ARRAY_COUNT(gProcs)
116c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com
1175ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.comclass PathFillGM : public skiagm::GM {
118c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    SkPath  fPath[N];
119c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    SkScalar fDY[N];
120c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.compublic:
1213c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com    PathFillGM() {
122c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com        for (size_t i = 0; i < N; i++) {
123c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com            fDY[i] = gProcs[i](&fPath[i]);
124c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com        }
125c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    }
126d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
127c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.comprotected:
128a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
129a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
130a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
131a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
132c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    virtual SkString onShortName() {
133c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com        return SkString("pathfill");
134c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    }
135d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1363c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com    virtual SkISize onISize() {
1375ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        return SkISize::Make(640, 480);
138c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    }
139d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
140c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    virtual void onDraw(SkCanvas* canvas) {
141c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com        SkPaint paint;
142c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com        paint.setAntiAlias(true);
143d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
144c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com        for (size_t i = 0; i < N; i++) {
145c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com            canvas->drawPath(fPath[i], paint);
1463c14d0f3d1b467dc3776669b0fc48cb463a20d41bungeman@google.com            canvas->translate(SkIntToScalar(0), fDY[i]);
147c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com        }
148c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com    }
149d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1505ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.comprivate:
1515ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com    typedef skiagm::GM INHERITED;
1525ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com};
1535ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com
1545ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com// test inverse-fill w/ a clip that completely excludes the geometry
1555ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.comclass PathInverseFillGM : public skiagm::GM {
1565ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com    SkPath  fPath[N];
1575ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com    SkScalar fDY[N];
1585ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.compublic:
1595ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com    PathInverseFillGM() {
1605ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        for (size_t i = 0; i < N; i++) {
1615ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com            fDY[i] = gProcs[i](&fPath[i]);
1625ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        }
1635ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com    }
164d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1655ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.comprotected:
166a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
167a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
168a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
169a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
1705ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com    virtual SkString onShortName() {
1715ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        return SkString("pathinvfill");
1725ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com    }
173d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1745ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com    virtual SkISize onISize() {
1755ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        return SkISize::Make(450, 220);
1765ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com    }
177d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1785ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com    static void show(SkCanvas* canvas, const SkPath& path, const SkPaint& paint,
1795ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com                     const SkRect* clip, SkScalar top, const SkScalar bottom) {
1805ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        canvas->save();
1815ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        if (clip) {
1825ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com            SkRect r = *clip;
1835ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com            r.fTop = top;
1845ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com            r.fBottom = bottom;
1855ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com            canvas->clipRect(r);
1865ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        }
1875ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        canvas->drawPath(path, paint);
1885ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        canvas->restore();
1895ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com    }
1905ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com
1915ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com    virtual void onDraw(SkCanvas* canvas) {
1925ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        SkPath path;
193d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1945ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        path.addCircle(SkIntToScalar(50), SkIntToScalar(50), SkIntToScalar(40));
1955ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        path.toggleInverseFillType();
1965ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com
1975ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        SkRect clipR = { 0, 0, SkIntToScalar(100), SkIntToScalar(200) };
1985ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com
1995ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
2005ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com
2015ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        for (int doclip = 0; doclip <= 1; ++doclip) {
2025ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com            for (int aa = 0; aa <= 1; ++aa) {
2035ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com                SkPaint paint;
2045ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com                paint.setAntiAlias(SkToBool(aa));
2055ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com
2065ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com                canvas->save();
2075ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com                canvas->clipRect(clipR);
208d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2095ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com                const SkRect* clipPtr = doclip ? &clipR : NULL;
210c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com
2115ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com                show(canvas, path, paint, clipPtr, clipR.fTop, clipR.centerY());
2125ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com                show(canvas, path, paint, clipPtr, clipR.centerY(), clipR.fBottom);
213d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2145ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com                canvas->restore();
2155ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com                canvas->translate(SkIntToScalar(110), 0);
2165ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com            }
2175ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com        }
2185ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com    }
219d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
220c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.comprivate:
2215ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com    typedef skiagm::GM INHERITED;
222c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com};
223c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com
224c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com///////////////////////////////////////////////////////////////////////////////
225c280700ad8159fa5bebb26d7c4e87e7fd25a7f26reed@google.com
2265ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.comstatic skiagm::GM* MyFactory(void*) { return new PathFillGM; }
2275ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.comstatic skiagm::GMRegistry reg(MyFactory);
2285ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.com
2295ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.comstatic skiagm::GM* F1(void*) { return new PathInverseFillGM; }
2305ee6491b7a1e7c177abc0186c2749ebe1f71fcf7reed@google.comstatic skiagm::GMRegistry gR1(F1);
231