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
124da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgnamespace skiagm {
134da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
1445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgclass LinePathGM : public GM {
1545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgpublic:
1645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    LinePathGM() {}
1745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
1845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgprotected:
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
2345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    SkString onShortName() {
2445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        return SkString("linepath");
2545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    }
26d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
27f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    SkISize onISize() { return SkISize::Make(1240, 390); }
28d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    void drawPath(SkPath& path,SkCanvas* canvas,SkColor color,
3045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                  const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join,
3145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                  SkPaint::Style style, SkPath::FillType fill,
3245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                  SkScalar strokeWidth) {
3345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.setFillType(fill);
3445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkPaint paint;
3545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStrokeCap(cap);
3645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStrokeWidth(strokeWidth);
3745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStrokeJoin(join);
3845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setColor(color);
3945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStyle(style);
4045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
4145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->clipRect(clip);
4245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->drawPath(path, paint);
4345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->restore();
4445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    }
45d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
4645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    virtual void onDraw(SkCanvas* canvas) {
4745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct FillAndName {
4845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPath::FillType fFill;
4945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char*      fName;
5045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
5145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        static const FillAndName gFills[] = {
5245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kWinding_FillType, "Winding"},
5345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kEvenOdd_FillType, "Even / Odd"},
5445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kInverseWinding_FillType, "Inverse Winding"},
5545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"},
5645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
5745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct StyleAndName {
5845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Style fStyle;
5945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char*    fName;
6045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
6145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        static const StyleAndName gStyles[] = {
6245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kFill_Style, "Fill"},
6345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kStroke_Style, "Stroke"},
6445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"},
6545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
6645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct CapAndName {
6745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Cap  fCap;
6845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Join fJoin;
6945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char*   fName;
7045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
7145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        static const CapAndName gCaps[] = {
7245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"},
7345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"},
7445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"}
7545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
7645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct PathAndName {
7745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPath      fPath;
7845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char* fName;
7945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
8045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        PathAndName path;
8145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fPath.moveTo(25*SK_Scalar1, 15*SK_Scalar1);
8245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fPath.lineTo(75*SK_Scalar1, 15*SK_Scalar1);
8345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fName = "moveTo-line";
8445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
8545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkPaint titlePaint;
8645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setColor(SK_ColorBLACK);
8745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setAntiAlias(true);
8845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setLCDRenderText(true);
8945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setTextSize(15 * SK_Scalar1);
9045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        const char title[] = "Line Drawn Into Rectangle Clips With "
9145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                             "Indicated Style, Fill and Linecaps, with stroke width 10";
9245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->drawText(title, strlen(title),
9345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            20 * SK_Scalar1,
9445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            20 * SK_Scalar1,
9545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            titlePaint);
9645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
97e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkLCGRandom rand;
9845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1);
9945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
10045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1);
10145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
10245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        for (size_t cap = 0; cap < SK_ARRAY_COUNT(gCaps); ++cap) {
10345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            if (0 < cap) {
10445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                canvas->translate((rect.width() + 40 * SK_Scalar1) * SK_ARRAY_COUNT(gStyles), 0);
10545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            }
10645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            canvas->save();
10745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) {
10845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                if (0 < fill) {
10945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->translate(0, rect.height() + 40 * SK_Scalar1);
11045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                }
11145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                canvas->save();
11245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) {
11345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    if (0 < style) {
11445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                        canvas->translate(rect.width() + 40 * SK_Scalar1, 0);
11545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    }
116d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
11745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkColor color = 0xff007000;
11845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    this->drawPath(path.fPath, canvas, color, rect,
11945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                    gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle,
12045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                    gFills[fill].fFill, SK_Scalar1*10);
121d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
12245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkPaint rectPaint;
12345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setColor(SK_ColorBLACK);
12445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setStyle(SkPaint::kStroke_Style);
12545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setStrokeWidth(-1);
12645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setAntiAlias(true);
12745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawRect(rect, rectPaint);
128d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
12945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkPaint labelPaint;
13045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setColor(color);
13145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setAntiAlias(true);
13245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setLCDRenderText(true);
13345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setTextSize(10 * SK_Scalar1);
13445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gStyles[style].fName,
13545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gStyles[style].fName),
13645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 12 * SK_Scalar1,
13745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
13845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gFills[fill].fName,
13945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gFills[fill].fName),
14045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 24 * SK_Scalar1,
14145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
14245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gCaps[cap].fName,
14345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gCaps[cap].fName),
14445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 36 * SK_Scalar1,
14545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
14645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                }
14745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                canvas->restore();
14845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            }
14945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            canvas->restore();
15045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        }
15145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->restore();
15245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->restore();
15345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    }
154d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
15545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgprivate:
15645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    typedef GM INHERITED;
15745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org};
15845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
15945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgclass LineClosePathGM : public GM {
16045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgpublic:
16145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    LineClosePathGM() {}
16245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
16345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgprotected:
16445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    SkString onShortName() {
16545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        return SkString("lineclosepath");
16645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    }
167d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
168f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    SkISize onISize() { return SkISize::Make(1240, 390); }
169d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
17045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    void drawPath(SkPath& path,SkCanvas* canvas,SkColor color,
17145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                  const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join,
17245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                  SkPaint::Style style, SkPath::FillType fill,
17345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                  SkScalar strokeWidth) {
17445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.setFillType(fill);
17545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkPaint paint;
17645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStrokeCap(cap);
17745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStrokeWidth(strokeWidth);
17845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStrokeJoin(join);
17945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setColor(color);
18045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStyle(style);
18145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
18245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->clipRect(clip);
18345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->drawPath(path, paint);
18445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->restore();
18545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    }
186d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
18745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    virtual void onDraw(SkCanvas* canvas) {
18845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct FillAndName {
18945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPath::FillType fFill;
19045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char*      fName;
19145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
19245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        static const FillAndName gFills[] = {
19345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kWinding_FillType, "Winding"},
19445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kEvenOdd_FillType, "Even / Odd"},
19545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kInverseWinding_FillType, "Inverse Winding"},
19645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"},
19745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
19845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct StyleAndName {
19945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Style fStyle;
20045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char*    fName;
20145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
20245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        static const StyleAndName gStyles[] = {
20345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kFill_Style, "Fill"},
20445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kStroke_Style, "Stroke"},
20545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"},
20645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
20745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct CapAndName {
20845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Cap  fCap;
20945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Join fJoin;
21045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char*   fName;
21145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
21245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        static const CapAndName gCaps[] = {
21345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"},
21445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"},
21545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"}
21645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
21745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct PathAndName {
21845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPath      fPath;
21945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char* fName;
22045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
22145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        PathAndName path;
22245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fPath.moveTo(25*SK_Scalar1, 15*SK_Scalar1);
22345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fPath.lineTo(75*SK_Scalar1, 15*SK_Scalar1);
22445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fPath.close();
22545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fName = "moveTo-line-close";
22645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
22745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkPaint titlePaint;
22845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setColor(SK_ColorBLACK);
22945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setAntiAlias(true);
23045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setLCDRenderText(true);
23145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setTextSize(15 * SK_Scalar1);
23245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        const char title[] = "Line Closed Drawn Into Rectangle Clips With "
23345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                             "Indicated Style, Fill and Linecaps, with stroke width 10";
23445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->drawText(title, strlen(title),
23545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            20 * SK_Scalar1,
23645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            20 * SK_Scalar1,
23745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            titlePaint);
23845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
239e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkLCGRandom rand;
24045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1);
24145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
24245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1);
24345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
24445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        for (size_t cap = 0; cap < SK_ARRAY_COUNT(gCaps); ++cap) {
24545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            if (0 < cap) {
24645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                canvas->translate((rect.width() + 40 * SK_Scalar1) * SK_ARRAY_COUNT(gStyles), 0);
24745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            }
24845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            canvas->save();
24945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) {
25045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                if (0 < fill) {
25145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->translate(0, rect.height() + 40 * SK_Scalar1);
25245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                }
25345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                canvas->save();
25445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) {
25545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    if (0 < style) {
25645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                        canvas->translate(rect.width() + 40 * SK_Scalar1, 0);
2574da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                    }
258d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
25945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkColor color = 0xff007000;
26045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    this->drawPath(path.fPath, canvas, color, rect,
26145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                    gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle,
26245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                    gFills[fill].fFill, SK_Scalar1*10);
263d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
26445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkPaint rectPaint;
26545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setColor(SK_ColorBLACK);
26645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setStyle(SkPaint::kStroke_Style);
26745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setStrokeWidth(-1);
26845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setAntiAlias(true);
26945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawRect(rect, rectPaint);
270d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
27145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkPaint labelPaint;
27245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setColor(color);
27345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setAntiAlias(true);
27445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setLCDRenderText(true);
27545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setTextSize(10 * SK_Scalar1);
27645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gStyles[style].fName,
27745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gStyles[style].fName),
27845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 12 * SK_Scalar1,
27945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
28045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gFills[fill].fName,
28145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gFills[fill].fName),
28245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 24 * SK_Scalar1,
28345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
28445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gCaps[cap].fName,
28545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gCaps[cap].fName),
28645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 36 * SK_Scalar1,
28745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
2884da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                }
2894da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                canvas->restore();
2904da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            }
2914da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            canvas->restore();
2924da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        }
2934da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        canvas->restore();
2944da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        canvas->restore();
2954da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
296d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2974da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgprivate:
2984da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    typedef GM INHERITED;
2994da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org};
3004da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
3014da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org//////////////////////////////////////////////////////////////////////////////
3024da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
30345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgstatic GM* LinePathFactory(void*) { return new LinePathGM; }
30445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgstatic GMRegistry regLinePath(LinePathFactory);
30545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
30645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgstatic GM* LineClosePathFactory(void*) { return new LineClosePathGM; }
30745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgstatic GMRegistry regLineClosePath(LineClosePathFactory);
3084da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
3094da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org}
310