14da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org/*
24da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org * Copyright 2011 Google Inc.
34da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org *
44da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org * Use of this source code is governed by a BSD-style license that can be
54da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org * found in the LICENSE file.
64da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org */
74da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org#include "gm.h"
84da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org#include "SkCanvas.h"
94da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org#include "SkPaint.h"
104da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org#include "SkRandom.h"
114da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
1222999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com// skbug.com/1316 shows that this cubic, when slightly clipped, creates big
1322999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com// (incorrect) changes to its control points.
1422999c61d8a89f8f5920dc3ad494a88f57718770reed@google.comclass ClippedCubicGM : public skiagm::GM {
1522999c61d8a89f8f5920dc3ad494a88f57718770reed@google.compublic:
1622999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com    ClippedCubicGM() {}
173e2345a8d56cb76bc43e4421a3e9e3681ecd9ebaskia.committer@gmail.com
1822999c61d8a89f8f5920dc3ad494a88f57718770reed@google.comprotected:
19a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
20a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
21a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
22a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
2322999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com    SkString onShortName() {
2403ca64b832819564d958b70ee27a2134ff88c9c6reed@google.com        return SkString("clippedcubic");
2522999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com    }
263e2345a8d56cb76bc43e4421a3e9e3681ecd9ebaskia.committer@gmail.com
2722999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com    SkISize onISize() { return SkISize::Make(1240, 390); }
283e2345a8d56cb76bc43e4421a3e9e3681ecd9ebaskia.committer@gmail.com
2922999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com    virtual void onDraw(SkCanvas* canvas) {
3022999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com        SkPath path;
3122999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com        path.moveTo(0, 0);
3222999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com        path.cubicTo(140, 150, 40, 10, 170, 150);
333e2345a8d56cb76bc43e4421a3e9e3681ecd9ebaskia.committer@gmail.com
3422999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com        SkPaint paint;
3522999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com        SkRect bounds = path.getBounds();
363e2345a8d56cb76bc43e4421a3e9e3681ecd9ebaskia.committer@gmail.com
370f8990cd2cf8bc934efef15c74e4d9439ddac184reed@google.com        for (SkScalar dy = -1; dy <= 1; dy += 1) {
3822999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com            canvas->save();
390f8990cd2cf8bc934efef15c74e4d9439ddac184reed@google.com            for (SkScalar dx = -1; dx <= 1; dx += 1) {
4022999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com                canvas->save();
4122999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com                canvas->clipRect(bounds);
4222999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com                canvas->translate(dx, dy);
4322999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com                canvas->drawPath(path, paint);
4422999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com                canvas->restore();
453e2345a8d56cb76bc43e4421a3e9e3681ecd9ebaskia.committer@gmail.com
4622999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com                canvas->translate(bounds.width(), 0);
4722999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com            }
4822999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com            canvas->restore();
4922999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com            canvas->translate(0, bounds.height());
5022999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com        }
5122999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com    }
523e2345a8d56cb76bc43e4421a3e9e3681ecd9ebaskia.committer@gmail.com
5322999c61d8a89f8f5920dc3ad494a88f57718770reed@google.comprivate:
5422999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com    typedef skiagm::GM INHERITED;
5522999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com};
5622999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com
5727b90fae0e0ea159c2d2fe4b028be5859258267areed@google.comclass CubicPathGM : public skiagm::GM {
5845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgpublic:
5945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    CubicPathGM() {}
6045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
6145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgprotected:
62a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
63a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
64a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
65a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
6645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    SkString onShortName() {
6745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        return SkString("cubicpath");
6845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    }
69d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
7027b90fae0e0ea159c2d2fe4b028be5859258267areed@google.com    SkISize onISize() { return SkISize::Make(1240, 390); }
71d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
7245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    void drawPath(SkPath& path,SkCanvas* canvas,SkColor color,
7345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                  const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join,
7445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                  SkPaint::Style style, SkPath::FillType fill,
7545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                  SkScalar strokeWidth) {
7645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.setFillType(fill);
7745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkPaint paint;
7845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStrokeCap(cap);
7945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStrokeWidth(strokeWidth);
8045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStrokeJoin(join);
8145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setColor(color);
8245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStyle(style);
8345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
8445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->clipRect(clip);
8545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->drawPath(path, paint);
8645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->restore();
8745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    }
88d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
8945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    virtual void onDraw(SkCanvas* canvas) {
9045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct FillAndName {
9145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPath::FillType fFill;
9245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char*      fName;
9345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
9445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        static const FillAndName gFills[] = {
9545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kWinding_FillType, "Winding"},
9645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kEvenOdd_FillType, "Even / Odd"},
9745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kInverseWinding_FillType, "Inverse Winding"},
9845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"},
9945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
10045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct StyleAndName {
10145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Style fStyle;
10245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char*    fName;
10345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
10445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        static const StyleAndName gStyles[] = {
10545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kFill_Style, "Fill"},
10645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kStroke_Style, "Stroke"},
10745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"},
10845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
10945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct CapAndName {
11045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Cap  fCap;
11145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Join fJoin;
11245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char*   fName;
11345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
11445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        static const CapAndName gCaps[] = {
11545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"},
11645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"},
11745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"}
11845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
11945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct PathAndName {
12045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPath      fPath;
12145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char* fName;
12245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
12345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        PathAndName path;
12445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fPath.moveTo(25*SK_Scalar1, 10*SK_Scalar1);
12545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fPath.cubicTo(40*SK_Scalar1, 20*SK_Scalar1,
12645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                           60*SK_Scalar1, 20*SK_Scalar1,
12745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                           75*SK_Scalar1, 10*SK_Scalar1);
12845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fName = "moveTo-cubic";
12945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
13045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkPaint titlePaint;
13145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setColor(SK_ColorBLACK);
13245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setAntiAlias(true);
13345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setLCDRenderText(true);
13445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setTextSize(15 * SK_Scalar1);
13545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        const char title[] = "Cubic Drawn Into Rectangle Clips With "
13645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                             "Indicated Style, Fill and Linecaps, with stroke width 10";
13745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->drawText(title, strlen(title),
13845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            20 * SK_Scalar1,
13945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            20 * SK_Scalar1,
14045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            titlePaint);
14145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
142e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkLCGRandom rand;
14345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1);
14445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
14545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1);
14645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
14745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        for (size_t cap = 0; cap < SK_ARRAY_COUNT(gCaps); ++cap) {
14845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            if (0 < cap) {
14945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                canvas->translate((rect.width() + 40 * SK_Scalar1) * SK_ARRAY_COUNT(gStyles), 0);
15045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            }
15145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            canvas->save();
15245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) {
15345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                if (0 < fill) {
15445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->translate(0, rect.height() + 40 * SK_Scalar1);
15545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                }
15645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                canvas->save();
15745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) {
15845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    if (0 < style) {
15945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                        canvas->translate(rect.width() + 40 * SK_Scalar1, 0);
1604da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                    }
161d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
16245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkColor color = 0xff007000;
16345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    this->drawPath(path.fPath, canvas, color, rect,
16445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                    gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle,
16545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                    gFills[fill].fFill, SK_Scalar1*10);
166d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
16745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkPaint rectPaint;
16845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setColor(SK_ColorBLACK);
16945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setStyle(SkPaint::kStroke_Style);
17045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setStrokeWidth(-1);
17145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setAntiAlias(true);
17245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawRect(rect, rectPaint);
173d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
17445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkPaint labelPaint;
17545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setColor(color);
17645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setAntiAlias(true);
17745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setLCDRenderText(true);
17845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setTextSize(10 * SK_Scalar1);
17945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gStyles[style].fName,
18045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gStyles[style].fName),
18145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 12 * SK_Scalar1,
18245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
18345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gFills[fill].fName,
18445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gFills[fill].fName),
18545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 24 * SK_Scalar1,
18645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
18745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gCaps[cap].fName,
18845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gCaps[cap].fName),
18945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 36 * SK_Scalar1,
19045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
19145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                }
19245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                canvas->restore();
19345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            }
19445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            canvas->restore();
19545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        }
19645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->restore();
19745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->restore();
19845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    }
199d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
20045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgprivate:
20127b90fae0e0ea159c2d2fe4b028be5859258267areed@google.com    typedef skiagm::GM INHERITED;
20245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org};
20345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
20427b90fae0e0ea159c2d2fe4b028be5859258267areed@google.comclass CubicClosePathGM : public skiagm::GM {
20545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgpublic:
20645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    CubicClosePathGM() {}
20745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
20845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgprotected:
209a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
210a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
211a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
212a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
21345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    SkString onShortName() {
21445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        return SkString("cubicclosepath");
21545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    }
216d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
21727b90fae0e0ea159c2d2fe4b028be5859258267areed@google.com    SkISize onISize() { return SkISize::Make(1240, 390); }
218d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
21945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    void drawPath(SkPath& path,SkCanvas* canvas,SkColor color,
22045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                  const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join,
22145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                  SkPaint::Style style, SkPath::FillType fill,
22245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                  SkScalar strokeWidth) {
22345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.setFillType(fill);
22445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkPaint paint;
22545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStrokeCap(cap);
22645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStrokeWidth(strokeWidth);
22745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStrokeJoin(join);
22845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setColor(color);
22945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStyle(style);
23045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
23145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->clipRect(clip);
23245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->drawPath(path, paint);
23345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->restore();
23445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    }
235d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
23645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    virtual void onDraw(SkCanvas* canvas) {
23745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct FillAndName {
23845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPath::FillType fFill;
23945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char*      fName;
24045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
24145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        static const FillAndName gFills[] = {
24245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kWinding_FillType, "Winding"},
24345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kEvenOdd_FillType, "Even / Odd"},
24445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kInverseWinding_FillType, "Inverse Winding"},
24545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"},
24645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
24745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct StyleAndName {
24845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Style fStyle;
24945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char*    fName;
25045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
25145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        static const StyleAndName gStyles[] = {
25245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kFill_Style, "Fill"},
25345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kStroke_Style, "Stroke"},
25445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"},
25545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
25645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct CapAndName {
25745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Cap  fCap;
25845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Join fJoin;
25945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char*   fName;
26045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
26145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        static const CapAndName gCaps[] = {
26245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"},
26345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"},
26445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"}
26545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
26645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct PathAndName {
26745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPath      fPath;
26845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char* fName;
26945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
27045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        PathAndName path;
27145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fPath.moveTo(25*SK_Scalar1, 10*SK_Scalar1);
27245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fPath.cubicTo(40*SK_Scalar1, 20*SK_Scalar1,
27345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                           60*SK_Scalar1, 20*SK_Scalar1,
27445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                           75*SK_Scalar1, 10*SK_Scalar1);
27545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fPath.close();
27645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fName = "moveTo-cubic-close";
27745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
27845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkPaint titlePaint;
27945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setColor(SK_ColorBLACK);
28045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setAntiAlias(true);
28145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setLCDRenderText(true);
28245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setTextSize(15 * SK_Scalar1);
28345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        const char title[] = "Cubic Closed Drawn Into Rectangle Clips With "
28445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                             "Indicated Style, Fill and Linecaps, with stroke width 10";
28545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->drawText(title, strlen(title),
28645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            20 * SK_Scalar1,
28745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            20 * SK_Scalar1,
28845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            titlePaint);
28945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
290e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkLCGRandom rand;
29145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1);
29245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
29345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1);
29445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
29545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        for (size_t cap = 0; cap < SK_ARRAY_COUNT(gCaps); ++cap) {
29645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            if (0 < cap) {
29745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                canvas->translate((rect.width() + 40 * SK_Scalar1) * SK_ARRAY_COUNT(gStyles), 0);
29845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            }
29945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            canvas->save();
30045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) {
30145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                if (0 < fill) {
30245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->translate(0, rect.height() + 40 * SK_Scalar1);
30345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                }
30445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                canvas->save();
30545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) {
30645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    if (0 < style) {
30745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                        canvas->translate(rect.width() + 40 * SK_Scalar1, 0);
30845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    }
309d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
31045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkColor color = 0xff007000;
31145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    this->drawPath(path.fPath, canvas, color, rect,
31245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                    gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle,
31345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                    gFills[fill].fFill, SK_Scalar1*10);
314d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
31545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkPaint rectPaint;
31645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setColor(SK_ColorBLACK);
31745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setStyle(SkPaint::kStroke_Style);
31845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setStrokeWidth(-1);
31945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setAntiAlias(true);
32045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawRect(rect, rectPaint);
321d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
32245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkPaint labelPaint;
32345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setColor(color);
32445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setAntiAlias(true);
32545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setLCDRenderText(true);
32645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setTextSize(10 * SK_Scalar1);
32745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gStyles[style].fName,
32845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gStyles[style].fName),
32945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 12 * SK_Scalar1,
33045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
33145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gFills[fill].fName,
33245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gFills[fill].fName),
33345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 24 * SK_Scalar1,
33445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
33545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gCaps[cap].fName,
33645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gCaps[cap].fName),
33745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 36 * SK_Scalar1,
33845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
3394da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                }
3404da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                canvas->restore();
3414da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            }
3424da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            canvas->restore();
3434da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        }
3444da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        canvas->restore();
3454da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        canvas->restore();
3464da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
347d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
3484da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgprivate:
34927b90fae0e0ea159c2d2fe4b028be5859258267areed@google.com    typedef skiagm::GM INHERITED;
3504da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org};
3514da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
3524da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org//////////////////////////////////////////////////////////////////////////////
3534da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
35427b90fae0e0ea159c2d2fe4b028be5859258267areed@google.comDEF_GM( return new CubicPathGM; )
35527b90fae0e0ea159c2d2fe4b028be5859258267areed@google.comDEF_GM( return new CubicClosePathGM; )
35622999c61d8a89f8f5920dc3ad494a88f57718770reed@google.comDEF_GM( return new ClippedCubicGM; )
357