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