11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "gm.h"
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkCanvas.h"
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkPaint.h"
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkRandom.h"
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergernamespace skiagm {
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass QuadPathGM : public GM {
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    QuadPathGM() {}
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkString onShortName() {
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return SkString("quadpath");
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkISize onISize() { return make_isize(1240, 390); }
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void drawPath(SkPath& path,SkCanvas* canvas,SkColor color,
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                  const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join,
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                  SkPaint::Style style, SkPath::FillType fill,
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                  SkScalar strokeWidth) {
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        path.setFillType(fill);
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint paint;
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setStrokeCap(cap);
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setStrokeWidth(strokeWidth);
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setStrokeJoin(join);
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setColor(color);
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setStyle(style);
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->save();
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->clipRect(clip);
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->drawPath(path, paint);
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->restore();
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDraw(SkCanvas* canvas) {
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        struct FillAndName {
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPath::FillType fFill;
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const char*      fName;
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const FillAndName gFills[] = {
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPath::kWinding_FillType, "Winding"},
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPath::kEvenOdd_FillType, "Even / Odd"},
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPath::kInverseWinding_FillType, "Inverse Winding"},
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"},
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        struct StyleAndName {
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPaint::Style fStyle;
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const char*    fName;
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const StyleAndName gStyles[] = {
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPaint::kFill_Style, "Fill"},
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPaint::kStroke_Style, "Stroke"},
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"},
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        struct CapAndName {
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPaint::Cap  fCap;
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPaint::Join fJoin;
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const char*   fName;
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const CapAndName gCaps[] = {
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"},
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"},
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"}
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        struct PathAndName {
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPath      fPath;
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const char* fName;
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        PathAndName path;
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        path.fPath.moveTo(25*SK_Scalar1, 10*SK_Scalar1);
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        path.fPath.quadTo(50*SK_Scalar1, 20*SK_Scalar1,
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          75*SK_Scalar1, 10*SK_Scalar1);
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        path.fName = "moveTo-quad";
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint titlePaint;
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        titlePaint.setColor(SK_ColorBLACK);
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        titlePaint.setAntiAlias(true);
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        titlePaint.setLCDRenderText(true);
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        titlePaint.setTextSize(15 * SK_Scalar1);
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const char title[] = "Quad Drawn Into Rectangle Clips With "
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             "Indicated Style, Fill and Linecaps, with stroke width 10";
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->drawText(title, strlen(title),
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            20 * SK_Scalar1,
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            20 * SK_Scalar1,
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            titlePaint);
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkRandom rand;
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1);
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->save();
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1);
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->save();
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (size_t cap = 0; cap < SK_ARRAY_COUNT(gCaps); ++cap) {
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (0 < cap) {
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                canvas->translate((rect.width() + 40 * SK_Scalar1) * SK_ARRAY_COUNT(gStyles), 0);
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->save();
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) {
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                if (0 < fill) {
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->translate(0, rect.height() + 40 * SK_Scalar1);
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                canvas->save();
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) {
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    if (0 < style) {
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        canvas->translate(rect.width() + 40 * SK_Scalar1, 0);
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    }
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    SkColor color = 0xff007000;
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    this->drawPath(path.fPath, canvas, color, rect,
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle,
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    gFills[fill].fFill, SK_Scalar1*10);
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    SkPaint rectPaint;
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    rectPaint.setColor(SK_ColorBLACK);
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    rectPaint.setStyle(SkPaint::kStroke_Style);
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    rectPaint.setStrokeWidth(-1);
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    rectPaint.setAntiAlias(true);
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->drawRect(rect, rectPaint);
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    SkPaint labelPaint;
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    labelPaint.setColor(color);
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    labelPaint.setAntiAlias(true);
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    labelPaint.setLCDRenderText(true);
1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    labelPaint.setTextSize(10 * SK_Scalar1);
1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->drawText(gStyles[style].fName,
1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        strlen(gStyles[style].fName),
1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        0, rect.height() + 12 * SK_Scalar1,
1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        labelPaint);
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->drawText(gFills[fill].fName,
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        strlen(gFills[fill].fName),
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        0, rect.height() + 24 * SK_Scalar1,
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        labelPaint);
1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->drawText(gCaps[cap].fName,
1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        strlen(gCaps[cap].fName),
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        0, rect.height() + 36 * SK_Scalar1,
1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        labelPaint);
1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                canvas->restore();
1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->restore();
1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->restore();
1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->restore();
1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef GM INHERITED;
1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass QuadClosePathGM : public GM {
1571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
1581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    QuadClosePathGM() {}
1591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
1611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkString onShortName() {
1621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return SkString("quadclosepath");
1631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkISize onISize() { return make_isize(1240, 390); }
1661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void drawPath(SkPath& path,SkCanvas* canvas,SkColor color,
1681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                  const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join,
1691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                  SkPaint::Style style, SkPath::FillType fill,
1701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                  SkScalar strokeWidth) {
1711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        path.setFillType(fill);
1721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint paint;
1731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setStrokeCap(cap);
1741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setStrokeWidth(strokeWidth);
1751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setStrokeJoin(join);
1761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setColor(color);
1771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setStyle(style);
1781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->save();
1791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->clipRect(clip);
1801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->drawPath(path, paint);
1811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->restore();
1821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDraw(SkCanvas* canvas) {
1851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        struct FillAndName {
1861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPath::FillType fFill;
1871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const char*      fName;
1881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
1891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const FillAndName gFills[] = {
1901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPath::kWinding_FillType, "Winding"},
1911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPath::kEvenOdd_FillType, "Even / Odd"},
1921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPath::kInverseWinding_FillType, "Inverse Winding"},
1931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"},
1941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
1951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        struct StyleAndName {
1961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPaint::Style fStyle;
1971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const char*    fName;
1981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
1991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const StyleAndName gStyles[] = {
2001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPaint::kFill_Style, "Fill"},
2011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPaint::kStroke_Style, "Stroke"},
2021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"},
2031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
2041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        struct CapAndName {
2051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPaint::Cap  fCap;
2061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPaint::Join fJoin;
2071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const char*   fName;
2081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
2091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const CapAndName gCaps[] = {
2101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"},
2111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"},
2121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"}
2131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
2141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        struct PathAndName {
2151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPath      fPath;
2161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const char* fName;
2171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
2181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        PathAndName path;
2191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        path.fPath.moveTo(25*SK_Scalar1, 10*SK_Scalar1);
2201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        path.fPath.quadTo(50*SK_Scalar1, 20*SK_Scalar1,
2211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          75*SK_Scalar1, 10*SK_Scalar1);
2221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        path.fPath.close();
2231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        path.fName = "moveTo-quad-close";
2241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint titlePaint;
2261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        titlePaint.setColor(SK_ColorBLACK);
2271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        titlePaint.setAntiAlias(true);
2281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        titlePaint.setLCDRenderText(true);
2291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        titlePaint.setTextSize(15 * SK_Scalar1);
2301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const char title[] = "Quad Closed Drawn Into Rectangle Clips With "
2311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             "Indicated Style, Fill and Linecaps, with stroke width 10";
2321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->drawText(title, strlen(title),
2331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            20 * SK_Scalar1,
2341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            20 * SK_Scalar1,
2351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            titlePaint);
2361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkRandom rand;
2381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1);
2391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->save();
2401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1);
2411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->save();
2421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (size_t cap = 0; cap < SK_ARRAY_COUNT(gCaps); ++cap) {
2431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (0 < cap) {
2441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                canvas->translate((rect.width() + 40 * SK_Scalar1) * SK_ARRAY_COUNT(gStyles), 0);
2451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
2461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->save();
2471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) {
2481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                if (0 < fill) {
2491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->translate(0, rect.height() + 40 * SK_Scalar1);
2501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
2511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                canvas->save();
2521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) {
2531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    if (0 < style) {
2541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        canvas->translate(rect.width() + 40 * SK_Scalar1, 0);
2551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    }
2561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    SkColor color = 0xff007000;
2581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    this->drawPath(path.fPath, canvas, color, rect,
2591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle,
2601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    gFills[fill].fFill, SK_Scalar1*10);
2611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    SkPaint rectPaint;
2631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    rectPaint.setColor(SK_ColorBLACK);
2641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    rectPaint.setStyle(SkPaint::kStroke_Style);
2651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    rectPaint.setStrokeWidth(-1);
2661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    rectPaint.setAntiAlias(true);
2671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->drawRect(rect, rectPaint);
2681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    SkPaint labelPaint;
2701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    labelPaint.setColor(color);
2711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    labelPaint.setAntiAlias(true);
2721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    labelPaint.setLCDRenderText(true);
2731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    labelPaint.setTextSize(10 * SK_Scalar1);
2741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->drawText(gStyles[style].fName,
2751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        strlen(gStyles[style].fName),
2761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        0, rect.height() + 12 * SK_Scalar1,
2771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        labelPaint);
2781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->drawText(gFills[fill].fName,
2791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        strlen(gFills[fill].fName),
2801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        0, rect.height() + 24 * SK_Scalar1,
2811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        labelPaint);
2821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->drawText(gCaps[cap].fName,
2831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        strlen(gCaps[cap].fName),
2841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        0, rect.height() + 36 * SK_Scalar1,
2851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        labelPaint);
2861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
2871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                canvas->restore();
2881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
2891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->restore();
2901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
2911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->restore();
2921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->restore();
2931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
2961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef GM INHERITED;
2971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
2981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger//////////////////////////////////////////////////////////////////////////////
3001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GM* QuadPathFactory(void*) { return new QuadPathGM; }
3021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GMRegistry regQuadPath(QuadPathFactory);
3031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GM* QuadClosePathFactory(void*) { return new QuadClosePathGM; }
3051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GMRegistry regQuadClosePath(QuadClosePathFactory);
3061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
308