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
144da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgclass DegenerateSegmentsGM : public GM {
154da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgpublic:
164da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    DegenerateSegmentsGM() {}
174da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
184da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgprotected:
194da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    struct PathAndName {
204da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPath      fPath;
214da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        const char* fName1;
224da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        const char* fName2;
234da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    };
244da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
25a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
26a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
27a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
28a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
294da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    SkString onShortName() {
304da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return SkString("degeneratesegments");
314da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
32d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
33f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    SkISize onISize() { return SkISize::Make(896, 930); }
344da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
354da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    typedef SkPoint (*AddSegmentFunc)(SkPath&, SkPoint&);
36d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
374da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    // We need to use explicit commands here, instead of addPath, because we
386630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org    // do not want the moveTo that is added at the beginning of a path to
396630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org    // appear in the appended path.
404da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddMove(SkPath& path, SkPoint& startPt) {
414da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
424da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.moveTo(moveToPt);
434da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return moveToPt;
444da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
454da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
464da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddMoveClose(SkPath& path, SkPoint& startPt) {
474da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
484da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.moveTo(moveToPt);
494da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.close();
504da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return moveToPt;
514da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
524da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
534da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddDegenLine(SkPath& path, SkPoint& startPt) {
544da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.lineTo(startPt);
554da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return startPt;
564da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
574da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
584da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddMoveDegenLine(SkPath& path, SkPoint& startPt) {
594da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
604da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.moveTo(moveToPt);
614da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.lineTo(moveToPt);
624da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return moveToPt;
634da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
644da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
654da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddMoveDegenLineClose(SkPath& path, SkPoint& startPt) {
664da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
674da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.moveTo(moveToPt);
684da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.lineTo(moveToPt);
694da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.close();
704da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return moveToPt;
714da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
724da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
734da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddDegenQuad(SkPath& path, SkPoint& startPt) {
744da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.quadTo(startPt, startPt);
754da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return startPt;
764da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
774da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
784da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddMoveDegenQuad(SkPath& path, SkPoint& startPt) {
794da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
804da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.moveTo(moveToPt);
814da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.quadTo(moveToPt, moveToPt);
824da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return moveToPt;
834da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
844da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
854da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddMoveDegenQuadClose(SkPath& path, SkPoint& startPt) {
864da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
874da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.moveTo(moveToPt);
884da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.quadTo(moveToPt, moveToPt);
894da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.close();
904da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return moveToPt;
914da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
924da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
934da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddDegenCubic(SkPath& path, SkPoint& startPt) {
944da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.cubicTo(startPt, startPt, startPt);
954da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return startPt;
964da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
974da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
984da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddMoveDegenCubic(SkPath& path, SkPoint& startPt) {
994da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
1004da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.moveTo(moveToPt);
1014da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.cubicTo(moveToPt, moveToPt, moveToPt);
1024da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return moveToPt;
1034da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
1044da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
1054da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddMoveDegenCubicClose(SkPath& path, SkPoint& startPt) {
1064da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
1074da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.moveTo(moveToPt);
1084da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.cubicTo(moveToPt, moveToPt, moveToPt);
1094da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.close();
1104da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return moveToPt;
1114da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
1124da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
1134da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddClose(SkPath& path, SkPoint& startPt) {
1144da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.close();
1154da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return startPt;
1164da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
1174da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
1184da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddLine(SkPath& path, SkPoint& startPt) {
1194da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint endPt = startPt + SkPoint::Make(40*SK_Scalar1, 0);
1204da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.lineTo(endPt);
1214da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return endPt;
1224da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
1234da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
1244da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddMoveLine(SkPath& path, SkPoint& startPt) {
1254da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
1264da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
1274da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.moveTo(moveToPt);
1284da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.lineTo(endPt);
1294da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return endPt;
1304da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
1314da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
1324da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddMoveLineClose(SkPath& path, SkPoint& startPt) {
1334da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
1344da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
1354da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.moveTo(moveToPt);
1364da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.lineTo(endPt);
1374da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.close();
1384da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return endPt;
1394da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
1404da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
1414da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddQuad(SkPath& path, SkPoint& startPt) {
1424da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint midPt = startPt + SkPoint::Make(20*SK_Scalar1, 5*SK_Scalar1);
1434da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint endPt = startPt + SkPoint::Make(40*SK_Scalar1, 0);
1444da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.quadTo(midPt, endPt);
1454da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return endPt;
1464da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
1474da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
1484da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddMoveQuad(SkPath& path, SkPoint& startPt) {
1494da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
1504da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint midPt = moveToPt + SkPoint::Make(20*SK_Scalar1, 5*SK_Scalar1);
1514da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
1524da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.moveTo(moveToPt);
1534da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.quadTo(midPt, endPt);
1544da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return endPt;
1554da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
1564da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
1574da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddMoveQuadClose(SkPath& path, SkPoint& startPt) {
1584da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
1594da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint midPt = moveToPt + SkPoint::Make(20*SK_Scalar1, 5*SK_Scalar1);
1604da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
1614da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.moveTo(moveToPt);
1624da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.quadTo(midPt, endPt);
1634da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.close();
1644da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return endPt;
1654da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
1664da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
1674da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddCubic(SkPath& path, SkPoint& startPt) {
1684da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint t1Pt = startPt + SkPoint::Make(15*SK_Scalar1, 5*SK_Scalar1);
1694da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint t2Pt = startPt + SkPoint::Make(25*SK_Scalar1, 5*SK_Scalar1);
1704da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint endPt = startPt + SkPoint::Make(40*SK_Scalar1, 0);
1714da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.cubicTo(t1Pt, t2Pt, endPt);
1724da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return endPt;
1734da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
1744da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
1754da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddMoveCubic(SkPath& path, SkPoint& startPt) {
1764da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
1774da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint t1Pt = moveToPt + SkPoint::Make(15*SK_Scalar1, 5*SK_Scalar1);
1784da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint t2Pt = moveToPt + SkPoint::Make(25*SK_Scalar1, 5*SK_Scalar1);
1794da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
1804da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.moveTo(moveToPt);
1814da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.cubicTo(t1Pt, t2Pt, endPt);
1824da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return endPt;
1834da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
1844da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
1854da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    static SkPoint AddMoveCubicClose(SkPath& path, SkPoint& startPt) {
1864da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
1874da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint t1Pt = moveToPt + SkPoint::Make(15*SK_Scalar1, 5*SK_Scalar1);
1884da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint t2Pt = moveToPt + SkPoint::Make(25*SK_Scalar1, 5*SK_Scalar1);
1894da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
1904da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.moveTo(moveToPt);
1914da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.cubicTo(t1Pt, t2Pt, endPt);
1924da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.close();
1934da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        return endPt;
1944da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
1954da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
1964da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    void drawPath(SkPath& path, SkCanvas* canvas, SkColor color,
19745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                  const SkRect& clip, SkPaint::Cap cap, SkPaint::Join join,
1984da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                  SkPaint::Style style, SkPath::FillType fill,
1994da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                  SkScalar strokeWidth) {
2004da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        path.setFillType(fill);
2014da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPaint paint;
2024da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        paint.setStrokeCap(cap);
2034da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        paint.setStrokeWidth(strokeWidth);
20445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        paint.setStrokeJoin(join);
2054da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        paint.setColor(color);
2064da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        paint.setStyle(style);
2074da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        canvas->save();
2084da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        canvas->clipRect(clip);
2094da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        canvas->drawPath(path, paint);
2104da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        canvas->restore();
2114da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
212d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2134da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    virtual void onDraw(SkCanvas* canvas) {
2146630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org    static const AddSegmentFunc gSegmentFunctions[] = {
2156630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddMove,
2166630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddMoveClose,
2176630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddDegenLine,
2186630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddMoveDegenLine,
2196630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddMoveDegenLineClose,
2206630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddDegenQuad,
2216630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddMoveDegenQuad,
2226630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddMoveDegenQuadClose,
2236630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddDegenCubic,
2246630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddMoveDegenCubic,
2256630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddMoveDegenCubicClose,
2266630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddClose,
2276630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddLine,
2286630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddMoveLine,
2296630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddMoveLineClose,
2306630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddQuad,
2316630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddMoveQuad,
2326630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddMoveQuadClose,
2336630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddCubic,
2346630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddMoveCubic,
2356630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        AddMoveCubicClose
2366630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org    };
2376630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org    static const char* gSegmentNames[] = {
2386630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "Move",
2396630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "MoveClose",
2406630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "DegenLine",
2416630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "MoveDegenLine",
2426630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "MoveDegenLineClose",
2436630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "DegenQuad",
2446630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "MoveDegenQuad",
2456630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "MoveDegenQuadClose",
2466630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "DegenCubic",
2476630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "MoveDegenCubic",
2486630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "MoveDegenCubicClose",
2496630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "Close",
2506630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "Line",
2516630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "MoveLine",
2526630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "MoveLineClose",
2536630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "Quad",
2546630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "MoveQuad",
2556630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "MoveQuadClose",
2566630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "Cubic",
2576630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "MoveCubic",
2586630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org        "MoveCubicClose"
2596630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org    };
2604da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
2614da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        struct FillAndName {
2624da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            SkPath::FillType fFill;
2634da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            const char*      fName;
2644da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        };
2654da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        static const FillAndName gFills[] = {
2664da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            {SkPath::kWinding_FillType, "Winding"},
2674da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            {SkPath::kEvenOdd_FillType, "Even / Odd"},
2684da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            {SkPath::kInverseWinding_FillType, "Inverse Winding"},
2694da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"}
2704da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        };
2714da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        struct StyleAndName {
2724da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            SkPaint::Style fStyle;
2734da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            const char*    fName;
2744da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        };
2754da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        static const StyleAndName gStyles[] = {
2764da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            {SkPaint::kFill_Style, "Fill"},
2774da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            {SkPaint::kStroke_Style, "Stroke 10"},
2784da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            {SkPaint::kStrokeAndFill_Style, "Stroke 10 And Fill"}
2794da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        };
2804da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        struct CapAndName {
28145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Cap  fCap;
28245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            SkPaint::Join fJoin;
28345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            const char*   fName;
2844da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        };
2854da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        static const CapAndName gCaps[] = {
28645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"},
28745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"},
28845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"}
2894da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        };
2904da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
2914da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkPaint titlePaint;
2924da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        titlePaint.setColor(SK_ColorBLACK);
2934da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        titlePaint.setAntiAlias(true);
2944da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        titlePaint.setLCDRenderText(true);
2954da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        titlePaint.setTextSize(15 * SK_Scalar1);
2964da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        const char title[] = "Random Paths Drawn Into Rectangle Clips With "
2974da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                             "Indicated Style, Fill and Linecaps, "
2984da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                             "with Stroke width 6";
2994da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        canvas->drawText(title, strlen(title),
3004da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                            20 * SK_Scalar1,
3014da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                            20 * SK_Scalar1,
3024da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                            titlePaint);
3034da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
304e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkLCGRandom rand;
3054da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        SkRect rect = SkRect::MakeWH(220*SK_Scalar1, 50*SK_Scalar1);
3064da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        canvas->save();
3074da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        canvas->translate(2*SK_Scalar1, 30 * SK_Scalar1); // The title
3084da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        canvas->save();
3094da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        unsigned numSegments = SK_ARRAY_COUNT(gSegmentFunctions);
3104da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        unsigned numCaps = SK_ARRAY_COUNT(gCaps);
3114da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        unsigned numStyles = SK_ARRAY_COUNT(gStyles);
3124da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        unsigned numFills = SK_ARRAY_COUNT(gFills);
31345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org        for (size_t row = 0; row < 6; ++row) {
3144da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            if (0 < row) {
3154da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                canvas->translate(0, rect.height() + 100*SK_Scalar1);
3164da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            }
3174da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            canvas->save();
31845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org            for (size_t column = 0; column < 4; ++column) {
3194da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                if (0 < column) {
3204da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                    canvas->translate(rect.width() + 4*SK_Scalar1, 0);
3214da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                }
322d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
3234da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                SkColor color = 0xff007000;
3244da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                StyleAndName style = gStyles[(rand.nextU() >> 16) % numStyles];
3254da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                CapAndName cap = gCaps[(rand.nextU() >> 16) % numCaps];
3264da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                FillAndName fill = gFills[(rand.nextU() >> 16) % numFills];
3274da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                SkPath path;
3284da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                unsigned s1 = (rand.nextU() >> 16) % numSegments;
3294da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                unsigned s2 = (rand.nextU() >> 16) % numSegments;
3304da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                unsigned s3 = (rand.nextU() >> 16) % numSegments;
3314da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                unsigned s4 = (rand.nextU() >> 16) % numSegments;
3324da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                unsigned s5 = (rand.nextU() >> 16) % numSegments;
3334da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                SkPoint pt = SkPoint::Make(10*SK_Scalar1, 0);
3344da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                pt = gSegmentFunctions[s1](path, pt);
3354da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                pt = gSegmentFunctions[s2](path, pt);
3364da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                pt = gSegmentFunctions[s3](path, pt);
3374da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                pt = gSegmentFunctions[s4](path, pt);
3384da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                pt = gSegmentFunctions[s5](path, pt);
3394da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
3404da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                this->drawPath(path, canvas, color, rect,
34145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org                               cap.fCap, cap.fJoin, style.fStyle,
3424da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                               fill.fFill, SK_Scalar1*6);
3434da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
3444da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                SkPaint rectPaint;
3454da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                rectPaint.setColor(SK_ColorBLACK);
3464da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                rectPaint.setStyle(SkPaint::kStroke_Style);
3474da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                rectPaint.setStrokeWidth(-1);
3484da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                rectPaint.setAntiAlias(true);
3494da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                canvas->drawRect(rect, rectPaint);
3504da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
3514da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                SkPaint labelPaint;
3524da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                labelPaint.setColor(color);
3534da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                labelPaint.setAntiAlias(true);
3544da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                labelPaint.setLCDRenderText(true);
3554da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                labelPaint.setTextSize(10 * SK_Scalar1);
3564da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                canvas->drawText(style.fName,
3574da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 strlen(style.fName),
3584da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 0, rect.height() + 12 * SK_Scalar1,
3594da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 labelPaint);
3604da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                canvas->drawText(fill.fName,
3614da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 strlen(fill.fName),
3624da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 0, rect.height() + 24 * SK_Scalar1,
3634da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 labelPaint);
3644da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                canvas->drawText(cap.fName,
3654da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 strlen(cap.fName),
3664da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 0, rect.height() + 36 * SK_Scalar1,
3674da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 labelPaint);
3684da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                canvas->drawText(gSegmentNames[s1],
3694da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 strlen(gSegmentNames[s1]),
3704da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 0, rect.height() + 48 * SK_Scalar1,
3714da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 labelPaint);
3724da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                canvas->drawText(gSegmentNames[s2],
3734da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 strlen(gSegmentNames[s2]),
3744da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 0, rect.height() + 60 * SK_Scalar1,
3754da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 labelPaint);
3764da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                canvas->drawText(gSegmentNames[s3],
3774da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 strlen(gSegmentNames[s3]),
3784da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 0, rect.height() + 72 * SK_Scalar1,
3794da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 labelPaint);
3804da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                canvas->drawText(gSegmentNames[s4],
3814da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 strlen(gSegmentNames[s4]),
3824da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 0, rect.height() + 84 * SK_Scalar1,
3834da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 labelPaint);
3844da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                canvas->drawText(gSegmentNames[s5],
3854da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 strlen(gSegmentNames[s5]),
3864da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 0, rect.height() + 96 * SK_Scalar1,
3874da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org                                 labelPaint);
3884da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            }
3894da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org            canvas->restore();
3904da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        }
3914da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        canvas->restore();
3924da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org        canvas->restore();
3934da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    }
394d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
3954da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgprivate:
3964da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org    typedef GM INHERITED;
3974da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org};
3984da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
3994da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org//////////////////////////////////////////////////////////////////////////////
4004da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
4014da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgstatic GM* MyFactory(void*) { return new DegenerateSegmentsGM; }
4024da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgstatic GMRegistry reg(MyFactory);
4034da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org
4044da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org}
405