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 1222999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com// skbug.com/1316 shows that this cubic, when slightly clipped, creates big 1322999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com// (incorrect) changes to its control points. 1422999c61d8a89f8f5920dc3ad494a88f57718770reed@google.comclass ClippedCubicGM : public skiagm::GM { 1522999c61d8a89f8f5920dc3ad494a88f57718770reed@google.compublic: 1622999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com ClippedCubicGM() {} 173e2345a8d56cb76bc43e4421a3e9e3681ecd9ebaskia.committer@gmail.com 1822999c61d8a89f8f5920dc3ad494a88f57718770reed@google.comprotected: 19a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 20a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 21a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 22a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 2322999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com SkString onShortName() { 2403ca64b832819564d958b70ee27a2134ff88c9c6reed@google.com return SkString("clippedcubic"); 2522999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com } 263e2345a8d56cb76bc43e4421a3e9e3681ecd9ebaskia.committer@gmail.com 2722999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com SkISize onISize() { return SkISize::Make(1240, 390); } 283e2345a8d56cb76bc43e4421a3e9e3681ecd9ebaskia.committer@gmail.com 2922999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com virtual void onDraw(SkCanvas* canvas) { 3022999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com SkPath path; 3122999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com path.moveTo(0, 0); 3222999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com path.cubicTo(140, 150, 40, 10, 170, 150); 333e2345a8d56cb76bc43e4421a3e9e3681ecd9ebaskia.committer@gmail.com 3422999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com SkPaint paint; 3522999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com SkRect bounds = path.getBounds(); 363e2345a8d56cb76bc43e4421a3e9e3681ecd9ebaskia.committer@gmail.com 370f8990cd2cf8bc934efef15c74e4d9439ddac184reed@google.com for (SkScalar dy = -1; dy <= 1; dy += 1) { 3822999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com canvas->save(); 390f8990cd2cf8bc934efef15c74e4d9439ddac184reed@google.com for (SkScalar dx = -1; dx <= 1; dx += 1) { 4022999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com canvas->save(); 4122999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com canvas->clipRect(bounds); 4222999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com canvas->translate(dx, dy); 4322999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com canvas->drawPath(path, paint); 4422999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com canvas->restore(); 453e2345a8d56cb76bc43e4421a3e9e3681ecd9ebaskia.committer@gmail.com 4622999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com canvas->translate(bounds.width(), 0); 4722999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com } 4822999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com canvas->restore(); 4922999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com canvas->translate(0, bounds.height()); 5022999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com } 5122999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com } 523e2345a8d56cb76bc43e4421a3e9e3681ecd9ebaskia.committer@gmail.com 5322999c61d8a89f8f5920dc3ad494a88f57718770reed@google.comprivate: 5422999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com typedef skiagm::GM INHERITED; 5522999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com}; 5622999c61d8a89f8f5920dc3ad494a88f57718770reed@google.com 5727b90fae0e0ea159c2d2fe4b028be5859258267areed@google.comclass CubicPathGM : public skiagm::GM { 5845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgpublic: 5945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org CubicPathGM() {} 6045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 6145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgprotected: 62a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 63a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 64a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 65a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 6645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkString onShortName() { 6745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org return SkString("cubicpath"); 6845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org } 69d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7027b90fae0e0ea159c2d2fe4b028be5859258267areed@google.com SkISize onISize() { return SkISize::Make(1240, 390); } 71d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org void drawPath(SkPath& path,SkCanvas* canvas,SkColor color, 7345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join, 7445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPaint::Style style, SkPath::FillType fill, 7545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkScalar strokeWidth) { 7645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org path.setFillType(fill); 7745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPaint paint; 7845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org paint.setStrokeCap(cap); 7945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org paint.setStrokeWidth(strokeWidth); 8045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org paint.setStrokeJoin(join); 8145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org paint.setColor(color); 8245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org paint.setStyle(style); 8345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->save(); 8445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->clipRect(clip); 8545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->drawPath(path, paint); 8645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->restore(); 8745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org } 88d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org virtual void onDraw(SkCanvas* canvas) { 9045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org struct FillAndName { 9145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPath::FillType fFill; 9245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org const char* fName; 9345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org }; 9445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org static const FillAndName gFills[] = { 9545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPath::kWinding_FillType, "Winding"}, 9645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPath::kEvenOdd_FillType, "Even / Odd"}, 9745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPath::kInverseWinding_FillType, "Inverse Winding"}, 9845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"}, 9945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org }; 10045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org struct StyleAndName { 10145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPaint::Style fStyle; 10245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org const char* fName; 10345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org }; 10445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org static const StyleAndName gStyles[] = { 10545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPaint::kFill_Style, "Fill"}, 10645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPaint::kStroke_Style, "Stroke"}, 10745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"}, 10845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org }; 10945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org struct CapAndName { 11045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPaint::Cap fCap; 11145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPaint::Join fJoin; 11245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org const char* fName; 11345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org }; 11445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org static const CapAndName gCaps[] = { 11545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"}, 11645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"}, 11745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"} 11845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org }; 11945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org struct PathAndName { 12045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPath fPath; 12145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org const char* fName; 12245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org }; 12345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org PathAndName path; 12445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org path.fPath.moveTo(25*SK_Scalar1, 10*SK_Scalar1); 12545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org path.fPath.cubicTo(40*SK_Scalar1, 20*SK_Scalar1, 12645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 60*SK_Scalar1, 20*SK_Scalar1, 12745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 75*SK_Scalar1, 10*SK_Scalar1); 12845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org path.fName = "moveTo-cubic"; 12945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 13045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPaint titlePaint; 13145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org titlePaint.setColor(SK_ColorBLACK); 13245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org titlePaint.setAntiAlias(true); 13345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org titlePaint.setLCDRenderText(true); 13445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org titlePaint.setTextSize(15 * SK_Scalar1); 13545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org const char title[] = "Cubic Drawn Into Rectangle Clips With " 13645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org "Indicated Style, Fill and Linecaps, with stroke width 10"; 13745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->drawText(title, strlen(title), 13845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 20 * SK_Scalar1, 13945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 20 * SK_Scalar1, 14045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org titlePaint); 14145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 142e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkLCGRandom rand; 14345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1); 14445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->save(); 14545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1); 14645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->save(); 14745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org for (size_t cap = 0; cap < SK_ARRAY_COUNT(gCaps); ++cap) { 14845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org if (0 < cap) { 14945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->translate((rect.width() + 40 * SK_Scalar1) * SK_ARRAY_COUNT(gStyles), 0); 15045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org } 15145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->save(); 15245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) { 15345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org if (0 < fill) { 15445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->translate(0, rect.height() + 40 * SK_Scalar1); 15545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org } 15645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->save(); 15745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) { 15845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org if (0 < style) { 15945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->translate(rect.width() + 40 * SK_Scalar1, 0); 1604da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org } 161d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 16245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkColor color = 0xff007000; 16345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org this->drawPath(path.fPath, canvas, color, rect, 16445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle, 16545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org gFills[fill].fFill, SK_Scalar1*10); 166d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 16745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPaint rectPaint; 16845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org rectPaint.setColor(SK_ColorBLACK); 16945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org rectPaint.setStyle(SkPaint::kStroke_Style); 17045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org rectPaint.setStrokeWidth(-1); 17145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org rectPaint.setAntiAlias(true); 17245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->drawRect(rect, rectPaint); 173d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 17445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPaint labelPaint; 17545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org labelPaint.setColor(color); 17645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org labelPaint.setAntiAlias(true); 17745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org labelPaint.setLCDRenderText(true); 17845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org labelPaint.setTextSize(10 * SK_Scalar1); 17945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->drawText(gStyles[style].fName, 18045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org strlen(gStyles[style].fName), 18145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 0, rect.height() + 12 * SK_Scalar1, 18245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org labelPaint); 18345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->drawText(gFills[fill].fName, 18445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org strlen(gFills[fill].fName), 18545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 0, rect.height() + 24 * SK_Scalar1, 18645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org labelPaint); 18745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->drawText(gCaps[cap].fName, 18845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org strlen(gCaps[cap].fName), 18945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 0, rect.height() + 36 * SK_Scalar1, 19045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org labelPaint); 19145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org } 19245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->restore(); 19345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org } 19445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->restore(); 19545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org } 19645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->restore(); 19745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->restore(); 19845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org } 199d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 20045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgprivate: 20127b90fae0e0ea159c2d2fe4b028be5859258267areed@google.com typedef skiagm::GM INHERITED; 20245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org}; 20345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 20427b90fae0e0ea159c2d2fe4b028be5859258267areed@google.comclass CubicClosePathGM : public skiagm::GM { 20545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgpublic: 20645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org CubicClosePathGM() {} 20745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 20845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.orgprotected: 209a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 210a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 211a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 212a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 21345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkString onShortName() { 21445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org return SkString("cubicclosepath"); 21545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org } 216d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 21727b90fae0e0ea159c2d2fe4b028be5859258267areed@google.com SkISize onISize() { return SkISize::Make(1240, 390); } 218d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 21945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org void drawPath(SkPath& path,SkCanvas* canvas,SkColor color, 22045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org const SkRect& clip,SkPaint::Cap cap, SkPaint::Join join, 22145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPaint::Style style, SkPath::FillType fill, 22245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkScalar strokeWidth) { 22345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org path.setFillType(fill); 22445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPaint paint; 22545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org paint.setStrokeCap(cap); 22645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org paint.setStrokeWidth(strokeWidth); 22745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org paint.setStrokeJoin(join); 22845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org paint.setColor(color); 22945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org paint.setStyle(style); 23045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->save(); 23145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->clipRect(clip); 23245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->drawPath(path, paint); 23345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->restore(); 23445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org } 235d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 23645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org virtual void onDraw(SkCanvas* canvas) { 23745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org struct FillAndName { 23845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPath::FillType fFill; 23945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org const char* fName; 24045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org }; 24145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org static const FillAndName gFills[] = { 24245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPath::kWinding_FillType, "Winding"}, 24345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPath::kEvenOdd_FillType, "Even / Odd"}, 24445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPath::kInverseWinding_FillType, "Inverse Winding"}, 24545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"}, 24645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org }; 24745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org struct StyleAndName { 24845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPaint::Style fStyle; 24945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org const char* fName; 25045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org }; 25145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org static const StyleAndName gStyles[] = { 25245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPaint::kFill_Style, "Fill"}, 25345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPaint::kStroke_Style, "Stroke"}, 25445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"}, 25545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org }; 25645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org struct CapAndName { 25745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPaint::Cap fCap; 25845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPaint::Join fJoin; 25945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org const char* fName; 26045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org }; 26145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org static const CapAndName gCaps[] = { 26245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"}, 26345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"}, 26445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"} 26545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org }; 26645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org struct PathAndName { 26745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPath fPath; 26845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org const char* fName; 26945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org }; 27045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org PathAndName path; 27145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org path.fPath.moveTo(25*SK_Scalar1, 10*SK_Scalar1); 27245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org path.fPath.cubicTo(40*SK_Scalar1, 20*SK_Scalar1, 27345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 60*SK_Scalar1, 20*SK_Scalar1, 27445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 75*SK_Scalar1, 10*SK_Scalar1); 27545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org path.fPath.close(); 27645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org path.fName = "moveTo-cubic-close"; 27745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 27845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPaint titlePaint; 27945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org titlePaint.setColor(SK_ColorBLACK); 28045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org titlePaint.setAntiAlias(true); 28145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org titlePaint.setLCDRenderText(true); 28245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org titlePaint.setTextSize(15 * SK_Scalar1); 28345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org const char title[] = "Cubic Closed Drawn Into Rectangle Clips With " 28445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org "Indicated Style, Fill and Linecaps, with stroke width 10"; 28545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->drawText(title, strlen(title), 28645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 20 * SK_Scalar1, 28745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 20 * SK_Scalar1, 28845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org titlePaint); 28945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 290e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkLCGRandom rand; 29145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1); 29245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->save(); 29345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->translate(10 * SK_Scalar1, 30 * SK_Scalar1); 29445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->save(); 29545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org for (size_t cap = 0; cap < SK_ARRAY_COUNT(gCaps); ++cap) { 29645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org if (0 < cap) { 29745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->translate((rect.width() + 40 * SK_Scalar1) * SK_ARRAY_COUNT(gStyles), 0); 29845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org } 29945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->save(); 30045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) { 30145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org if (0 < fill) { 30245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->translate(0, rect.height() + 40 * SK_Scalar1); 30345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org } 30445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->save(); 30545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) { 30645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org if (0 < style) { 30745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->translate(rect.width() + 40 * SK_Scalar1, 0); 30845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org } 309d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 31045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkColor color = 0xff007000; 31145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org this->drawPath(path.fPath, canvas, color, rect, 31245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org gCaps[cap].fCap, gCaps[cap].fJoin, gStyles[style].fStyle, 31345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org gFills[fill].fFill, SK_Scalar1*10); 314d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 31545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPaint rectPaint; 31645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org rectPaint.setColor(SK_ColorBLACK); 31745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org rectPaint.setStyle(SkPaint::kStroke_Style); 31845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org rectPaint.setStrokeWidth(-1); 31945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org rectPaint.setAntiAlias(true); 32045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->drawRect(rect, rectPaint); 321d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 32245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org SkPaint labelPaint; 32345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org labelPaint.setColor(color); 32445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org labelPaint.setAntiAlias(true); 32545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org labelPaint.setLCDRenderText(true); 32645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org labelPaint.setTextSize(10 * SK_Scalar1); 32745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->drawText(gStyles[style].fName, 32845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org strlen(gStyles[style].fName), 32945cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 0, rect.height() + 12 * SK_Scalar1, 33045cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org labelPaint); 33145cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->drawText(gFills[fill].fName, 33245cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org strlen(gFills[fill].fName), 33345cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 0, rect.height() + 24 * SK_Scalar1, 33445cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org labelPaint); 33545cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org canvas->drawText(gCaps[cap].fName, 33645cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org strlen(gCaps[cap].fName), 33745cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org 0, rect.height() + 36 * SK_Scalar1, 33845cbfdd53533693927ac13d44e42104269ce7a9eschenney@chromium.org labelPaint); 3394da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org } 3404da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->restore(); 3414da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org } 3424da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->restore(); 3434da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org } 3444da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->restore(); 3454da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org canvas->restore(); 3464da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org } 347d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 3484da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgprivate: 34927b90fae0e0ea159c2d2fe4b028be5859258267areed@google.com typedef skiagm::GM INHERITED; 3504da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org}; 3514da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 3524da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org////////////////////////////////////////////////////////////////////////////// 3534da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 35427b90fae0e0ea159c2d2fe4b028be5859258267areed@google.comDEF_GM( return new CubicPathGM; ) 35527b90fae0e0ea159c2d2fe4b028be5859258267areed@google.comDEF_GM( return new CubicClosePathGM; ) 35622999c61d8a89f8f5920dc3ad494a88f57718770reed@google.comDEF_GM( return new ClippedCubicGM; ) 357