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); 2945fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark sk_tool_utils::set_portable_typeface(&titlePaint); 2954da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org titlePaint.setLCDRenderText(true); 2964da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org titlePaint.setTextSize(15 * SK_Scalar1); 2974da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org const char title[] = "Random Paths Drawn Into Rectangle Clips With " 2984da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org "Indicated Style, Fill and Linecaps, " 2994da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org "with Stroke width 6"; 3004da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->drawText(title, strlen(title), 3014da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 20 * SK_Scalar1, 3024da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 20 * SK_Scalar1, 3034da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org titlePaint); 3044da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 305e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkLCGRandom rand; 3064da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org SkRect rect = SkRect::MakeWH(220*SK_Scalar1, 50*SK_Scalar1); 3074da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->save(); 3084da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->translate(2*SK_Scalar1, 30 * SK_Scalar1); // The title 3094da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->save(); 3104da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org unsigned numSegments = SK_ARRAY_COUNT(gSegmentFunctions); 3114da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org unsigned numCaps = SK_ARRAY_COUNT(gCaps); 3124da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org unsigned numStyles = SK_ARRAY_COUNT(gStyles); 3134da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org unsigned numFills = SK_ARRAY_COUNT(gFills); 31445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org for (size_t row = 0; row < 6; ++row) { 3154da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org if (0 < row) { 3164da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->translate(0, rect.height() + 100*SK_Scalar1); 3174da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org } 3184da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->save(); 31945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org for (size_t column = 0; column < 4; ++column) { 3204da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org if (0 < column) { 3214da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->translate(rect.width() + 4*SK_Scalar1, 0); 3224da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org } 323d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 3244da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org SkColor color = 0xff007000; 3254da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org StyleAndName style = gStyles[(rand.nextU() >> 16) % numStyles]; 3264da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org CapAndName cap = gCaps[(rand.nextU() >> 16) % numCaps]; 3274da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org FillAndName fill = gFills[(rand.nextU() >> 16) % numFills]; 3284da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org SkPath path; 3294da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org unsigned s1 = (rand.nextU() >> 16) % numSegments; 3304da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org unsigned s2 = (rand.nextU() >> 16) % numSegments; 3314da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org unsigned s3 = (rand.nextU() >> 16) % numSegments; 3324da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org unsigned s4 = (rand.nextU() >> 16) % numSegments; 3334da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org unsigned s5 = (rand.nextU() >> 16) % numSegments; 3344da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org SkPoint pt = SkPoint::Make(10*SK_Scalar1, 0); 3354da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org pt = gSegmentFunctions[s1](path, pt); 3364da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org pt = gSegmentFunctions[s2](path, pt); 3374da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org pt = gSegmentFunctions[s3](path, pt); 3384da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org pt = gSegmentFunctions[s4](path, pt); 3394da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org pt = gSegmentFunctions[s5](path, pt); 3404da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 3414da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org this->drawPath(path, canvas, color, rect, 34245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org cap.fCap, cap.fJoin, style.fStyle, 3434da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org fill.fFill, SK_Scalar1*6); 3444da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 3454da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org SkPaint rectPaint; 3464da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org rectPaint.setColor(SK_ColorBLACK); 3474da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org rectPaint.setStyle(SkPaint::kStroke_Style); 3484da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org rectPaint.setStrokeWidth(-1); 3494da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org rectPaint.setAntiAlias(true); 3504da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->drawRect(rect, rectPaint); 3514da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 3524da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org SkPaint labelPaint; 3534da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org labelPaint.setColor(color); 3544da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org labelPaint.setAntiAlias(true); 3555fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark sk_tool_utils::set_portable_typeface(&labelPaint); 3564da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org labelPaint.setLCDRenderText(true); 3574da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org labelPaint.setTextSize(10 * SK_Scalar1); 3584da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->drawText(style.fName, 3594da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org strlen(style.fName), 3604da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 0, rect.height() + 12 * SK_Scalar1, 3614da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org labelPaint); 3624da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->drawText(fill.fName, 3634da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org strlen(fill.fName), 3644da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 0, rect.height() + 24 * SK_Scalar1, 3654da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org labelPaint); 3664da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->drawText(cap.fName, 3674da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org strlen(cap.fName), 3684da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 0, rect.height() + 36 * SK_Scalar1, 3694da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org labelPaint); 3704da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->drawText(gSegmentNames[s1], 3714da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org strlen(gSegmentNames[s1]), 3724da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 0, rect.height() + 48 * SK_Scalar1, 3734da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org labelPaint); 3744da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->drawText(gSegmentNames[s2], 3754da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org strlen(gSegmentNames[s2]), 3764da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 0, rect.height() + 60 * SK_Scalar1, 3774da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org labelPaint); 3784da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->drawText(gSegmentNames[s3], 3794da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org strlen(gSegmentNames[s3]), 3804da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 0, rect.height() + 72 * SK_Scalar1, 3814da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org labelPaint); 3824da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->drawText(gSegmentNames[s4], 3834da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org strlen(gSegmentNames[s4]), 3844da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 0, rect.height() + 84 * SK_Scalar1, 3854da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org labelPaint); 3864da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->drawText(gSegmentNames[s5], 3874da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org strlen(gSegmentNames[s5]), 3884da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 0, rect.height() + 96 * SK_Scalar1, 3894da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org labelPaint); 3904da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org } 3914da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->restore(); 3924da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org } 3934da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->restore(); 3944da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->restore(); 3954da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org } 396d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 3974da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgprivate: 3984da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org typedef GM INHERITED; 3994da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org}; 4004da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 4014da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org////////////////////////////////////////////////////////////////////////////// 4024da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 4034da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgstatic GM* MyFactory(void*) { return new DegenerateSegmentsGM; } 4044da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgstatic GMRegistry reg(MyFactory); 4054da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 4064da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org} 407