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 QuadPathGM : public GM {
1545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgpublic:
1645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    QuadPathGM() {}
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("quadpath");
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, 10*SK_Scalar1);
8245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fPath.quadTo(50*SK_Scalar1, 20*SK_Scalar1,
8345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                          75*SK_Scalar1, 10*SK_Scalar1);
8445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fName = "moveTo-quad";
8545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
8645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkPaint titlePaint;
8745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setColor(SK_ColorBLACK);
8845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setAntiAlias(true);
8945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setLCDRenderText(true);
9045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setTextSize(15 * SK_Scalar1);
9145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        const char title[] = "Quad Drawn Into Rectangle Clips With "
9245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                             "Indicated Style, Fill and Linecaps, with stroke width 10";
9345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->drawText(title, strlen(title),
9445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            20 * SK_Scalar1,
9545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            20 * SK_Scalar1,
9645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            titlePaint);
9745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
98e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkLCGRandom rand;
9945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1);
10045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
10145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1);
10245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
10345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        for (size_t cap = 0; cap < SK_ARRAY_COUNT(gCaps); ++cap) {
10445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            if (0 < cap) {
10545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                canvas->translate((rect.width() + 40 * SK_Scalar1) * SK_ARRAY_COUNT(gStyles), 0);
10645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            }
10745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            canvas->save();
10845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) {
10945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                if (0 < fill) {
11045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->translate(0, rect.height() + 40 * SK_Scalar1);
11145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                }
11245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                canvas->save();
11345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) {
11445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    if (0 < style) {
11545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                        canvas->translate(rect.width() + 40 * SK_Scalar1, 0);
11645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    }
117d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
11845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkColor color = 0xff007000;
11945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    this->drawPath(path.fPath, canvas, color, rect,
12045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                    gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle,
12145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                    gFills[fill].fFill, SK_Scalar1*10);
122d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
12345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkPaint rectPaint;
12445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setColor(SK_ColorBLACK);
12545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setStyle(SkPaint::kStroke_Style);
12645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setStrokeWidth(-1);
12745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setAntiAlias(true);
12845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawRect(rect, rectPaint);
129d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
13045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkPaint labelPaint;
13145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setColor(color);
13245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setAntiAlias(true);
13345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setLCDRenderText(true);
13445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setTextSize(10 * SK_Scalar1);
13545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gStyles[style].fName,
13645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gStyles[style].fName),
13745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 12 * SK_Scalar1,
13845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
13945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gFills[fill].fName,
14045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gFills[fill].fName),
14145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 24 * SK_Scalar1,
14245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
14345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gCaps[cap].fName,
14445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gCaps[cap].fName),
14545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 36 * SK_Scalar1,
14645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
14745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                }
14845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                canvas->restore();
14945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            }
15045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            canvas->restore();
15145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        }
15245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->restore();
15345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->restore();
15445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    }
155d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
15645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgprivate:
15745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    typedef GM INHERITED;
15845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org};
15945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
16045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgclass QuadClosePathGM : public GM {
16145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgpublic:
16245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    QuadClosePathGM() {}
16345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
16445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgprotected:
165a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
166a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
167a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
168a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
16945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    SkString onShortName() {
17045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        return SkString("quadclosepath");
17145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    }
172d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
173f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    SkISize onISize() { return SkISize::Make(1240, 390); }
174d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
17545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    void drawPath(SkPath& path,SkCanvas* canvas,SkColor color,
17645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                  const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join,
17745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                  SkPaint::Style style, SkPath::FillType fill,
17845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                  SkScalar strokeWidth) {
17945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.setFillType(fill);
18045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkPaint paint;
18145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStrokeCap(cap);
18245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStrokeWidth(strokeWidth);
18345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStrokeJoin(join);
18445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setColor(color);
18545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStyle(style);
18645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
18745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->clipRect(clip);
18845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->drawPath(path, paint);
18945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->restore();
19045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    }
191d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
19245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org    virtual void onDraw(SkCanvas* canvas) {
19345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct FillAndName {
19445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPath::FillType fFill;
19545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char*      fName;
19645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
19745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        static const FillAndName gFills[] = {
19845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kWinding_FillType, "Winding"},
19945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kEvenOdd_FillType, "Even / Odd"},
20045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kInverseWinding_FillType, "Inverse Winding"},
20145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"},
20245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
20345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct StyleAndName {
20445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Style fStyle;
20545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char*    fName;
20645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
20745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        static const StyleAndName gStyles[] = {
20845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kFill_Style, "Fill"},
20945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kStroke_Style, "Stroke"},
21045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"},
21145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
21245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct CapAndName {
21345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Cap  fCap;
21445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Join fJoin;
21545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char*   fName;
21645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
21745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        static const CapAndName gCaps[] = {
21845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"},
21945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"},
22045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"}
22145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
22245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        struct PathAndName {
22345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPath      fPath;
22445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char* fName;
22545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        };
22645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        PathAndName path;
22745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fPath.moveTo(25*SK_Scalar1, 10*SK_Scalar1);
22845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fPath.quadTo(50*SK_Scalar1, 20*SK_Scalar1,
22945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                          75*SK_Scalar1, 10*SK_Scalar1);
23045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fPath.close();
23145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        path.fName = "moveTo-quad-close";
23245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
23345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkPaint titlePaint;
23445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setColor(SK_ColorBLACK);
23545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setAntiAlias(true);
23645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setLCDRenderText(true);
23745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        titlePaint.setTextSize(15 * SK_Scalar1);
23845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        const char title[] = "Quad Closed Drawn Into Rectangle Clips With "
23945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                             "Indicated Style, Fill and Linecaps, with stroke width 10";
24045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->drawText(title, strlen(title),
24145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            20 * SK_Scalar1,
24245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            20 * SK_Scalar1,
24345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                            titlePaint);
24445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
245e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkLCGRandom rand;
24645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1);
24745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
24845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1);
24945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        canvas->save();
25045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        for (size_t cap = 0; cap < SK_ARRAY_COUNT(gCaps); ++cap) {
25145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            if (0 < cap) {
25245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                canvas->translate((rect.width() + 40 * SK_Scalar1) * SK_ARRAY_COUNT(gStyles), 0);
25345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            }
25445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            canvas->save();
25545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) {
25645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                if (0 < fill) {
25745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->translate(0, rect.height() + 40 * SK_Scalar1);
25845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                }
25945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                canvas->save();
26045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) {
26145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    if (0 < style) {
26245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                        canvas->translate(rect.width() + 40 * SK_Scalar1, 0);
2634da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                    }
264d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
26545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkColor color = 0xff007000;
26645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    this->drawPath(path.fPath, canvas, color, rect,
26745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                    gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle,
26845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                    gFills[fill].fFill, SK_Scalar1*10);
269d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
27045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkPaint rectPaint;
27145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setColor(SK_ColorBLACK);
27245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setStyle(SkPaint::kStroke_Style);
27345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setStrokeWidth(-1);
27445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    rectPaint.setAntiAlias(true);
27545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawRect(rect, rectPaint);
276d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
27745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    SkPaint labelPaint;
27845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setColor(color);
27945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setAntiAlias(true);
28045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setLCDRenderText(true);
28145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    labelPaint.setTextSize(10 * SK_Scalar1);
28245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gStyles[style].fName,
28345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gStyles[style].fName),
28445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 12 * SK_Scalar1,
28545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
28645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gFills[fill].fName,
28745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gFills[fill].fName),
28845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 24 * SK_Scalar1,
28945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
29045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                    canvas->drawText(gCaps[cap].fName,
29145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        strlen(gCaps[cap].fName),
29245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        0, rect.height() + 36 * SK_Scalar1,
29345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                                        labelPaint);
2944da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                }
2954da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                canvas->restore();
2964da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            }
2974da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            canvas->restore();
2984da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        }
2994da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        canvas->restore();
3004da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        canvas->restore();
3014da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
302d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
3034da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgprivate:
3044da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    typedef GM INHERITED;
3054da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org};
3064da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
3074da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org//////////////////////////////////////////////////////////////////////////////
3084da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
30945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgstatic GM* QuadPathFactory(void*) { return new QuadPathGM; }
31045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgstatic GMRegistry regQuadPath(QuadPathFactory);
31145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org
31245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgstatic GM* QuadClosePathFactory(void*) { return new QuadClosePathGM; }
31345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgstatic GMRegistry regQuadClosePath(QuadClosePathFactory);
3144da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
3150b71f6cedd57de177b8368c48dfaab14feda9677schenney@chromium.org}
316