1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPathEffect.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRRect.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkDashPathEffect.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTemplates.h" 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private; 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm { 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker class ContourStartGM : public GM { 28*c8dee2aaSAndroid Build Coastguard Worker protected: onOnceBeforeDraw()29*c8dee2aaSAndroid Build Coastguard Worker void onOnceBeforeDraw() override { 30*c8dee2aaSAndroid Build Coastguard Worker const SkScalar kMaxDashLen = 100; 31*c8dee2aaSAndroid Build Coastguard Worker const SkScalar kDashGrowth = 1.2f; 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker STArray<100, SkScalar> intervals; 34*c8dee2aaSAndroid Build Coastguard Worker for (SkScalar len = 1; len < kMaxDashLen; len *= kDashGrowth) { 35*c8dee2aaSAndroid Build Coastguard Worker intervals.push_back(len); 36*c8dee2aaSAndroid Build Coastguard Worker intervals.push_back(len); 37*c8dee2aaSAndroid Build Coastguard Worker } 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker fDashPaint.setAntiAlias(true); 40*c8dee2aaSAndroid Build Coastguard Worker fDashPaint.setStyle(SkPaint::kStroke_Style); 41*c8dee2aaSAndroid Build Coastguard Worker fDashPaint.setStrokeWidth(6); 42*c8dee2aaSAndroid Build Coastguard Worker fDashPaint.setColor(0xff008000); 43*c8dee2aaSAndroid Build Coastguard Worker fDashPaint.setPathEffect(SkDashPathEffect::Make(intervals.begin(), intervals.size(), 0)); 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker fPointsPaint.setColor(0xff800000); 46*c8dee2aaSAndroid Build Coastguard Worker fPointsPaint.setStrokeWidth(3); 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker fRect = SkRect::MakeLTRB(10, 10, 100, 70); 49*c8dee2aaSAndroid Build Coastguard Worker } 50*c8dee2aaSAndroid Build Coastguard Worker getName() const51*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("contour_start"); } 52*c8dee2aaSAndroid Build Coastguard Worker getISize()53*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(kImageWidth, kImageHeight); } 54*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)55*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker drawDirs(canvas, [](const SkRect& rect, SkPathDirection dir, unsigned startIndex) { 58*c8dee2aaSAndroid Build Coastguard Worker return SkPath::Rect(rect, dir, startIndex); 59*c8dee2aaSAndroid Build Coastguard Worker }); 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker drawDirs(canvas, [](const SkRect& rect, SkPathDirection dir, unsigned startIndex) { 62*c8dee2aaSAndroid Build Coastguard Worker return SkPath::Oval(rect, dir, startIndex); 63*c8dee2aaSAndroid Build Coastguard Worker }); 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker drawDirs(canvas, [](const SkRect& rect, SkPathDirection dir, unsigned startIndex) { 66*c8dee2aaSAndroid Build Coastguard Worker SkRRect rrect; 67*c8dee2aaSAndroid Build Coastguard Worker const SkVector radii[4] = { {15, 15}, {15, 15}, {15, 15}, {15, 15}}; 68*c8dee2aaSAndroid Build Coastguard Worker rrect.setRectRadii(rect, radii); 69*c8dee2aaSAndroid Build Coastguard Worker return SkPath::RRect(rrect, dir, startIndex); 70*c8dee2aaSAndroid Build Coastguard Worker }); 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker drawDirs(canvas, [](const SkRect& rect, SkPathDirection dir, unsigned startIndex) { 73*c8dee2aaSAndroid Build Coastguard Worker SkRRect rrect; 74*c8dee2aaSAndroid Build Coastguard Worker rrect.setRect(rect); 75*c8dee2aaSAndroid Build Coastguard Worker return SkPath::RRect(rrect, dir, startIndex); 76*c8dee2aaSAndroid Build Coastguard Worker }); 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker drawDirs(canvas, [](const SkRect& rect, SkPathDirection dir, unsigned startIndex) { 79*c8dee2aaSAndroid Build Coastguard Worker SkRRect rrect; 80*c8dee2aaSAndroid Build Coastguard Worker rrect.setOval(rect); 81*c8dee2aaSAndroid Build Coastguard Worker return SkPath::RRect(rrect, dir, startIndex); 82*c8dee2aaSAndroid Build Coastguard Worker }); 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker } 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker private: 87*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr int kImageWidth = 1200; 88*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr int kImageHeight = 600; 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker SkPaint fDashPaint, fPointsPaint; 91*c8dee2aaSAndroid Build Coastguard Worker SkRect fRect; 92*c8dee2aaSAndroid Build Coastguard Worker drawDirs(SkCanvas * canvas,SkPath (* makePath)(const SkRect &,SkPathDirection,unsigned)) const93*c8dee2aaSAndroid Build Coastguard Worker void drawDirs(SkCanvas* canvas, 94*c8dee2aaSAndroid Build Coastguard Worker SkPath (*makePath)(const SkRect&, SkPathDirection, unsigned)) const { 95*c8dee2aaSAndroid Build Coastguard Worker drawOneColumn(canvas, SkPathDirection::kCW, makePath); 96*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(kImageWidth / 10, 0); 97*c8dee2aaSAndroid Build Coastguard Worker drawOneColumn(canvas, SkPathDirection::kCCW, makePath); 98*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(kImageWidth / 10, 0); 99*c8dee2aaSAndroid Build Coastguard Worker } 100*c8dee2aaSAndroid Build Coastguard Worker drawOneColumn(SkCanvas * canvas,SkPathDirection dir,SkPath (* makePath)(const SkRect &,SkPathDirection,unsigned)) const101*c8dee2aaSAndroid Build Coastguard Worker void drawOneColumn(SkCanvas* canvas, SkPathDirection dir, 102*c8dee2aaSAndroid Build Coastguard Worker SkPath (*makePath)(const SkRect&, SkPathDirection, unsigned)) const { 103*c8dee2aaSAndroid Build Coastguard Worker SkAutoCanvasRestore acr(canvas, true); 104*c8dee2aaSAndroid Build Coastguard Worker 105*c8dee2aaSAndroid Build Coastguard Worker for (unsigned i = 0; i < 8; ++i) { 106*c8dee2aaSAndroid Build Coastguard Worker const SkPath path = makePath(fRect, dir, i); 107*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, fDashPaint); 108*c8dee2aaSAndroid Build Coastguard Worker 109*c8dee2aaSAndroid Build Coastguard Worker const int n = path.countPoints(); 110*c8dee2aaSAndroid Build Coastguard Worker AutoTArray<SkPoint> points(n); 111*c8dee2aaSAndroid Build Coastguard Worker path.getPoints(points.get(), n); 112*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPoints(SkCanvas::kPoints_PointMode, n, points.get(), fPointsPaint); 113*c8dee2aaSAndroid Build Coastguard Worker 114*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, kImageHeight / 8); 115*c8dee2aaSAndroid Build Coastguard Worker } 116*c8dee2aaSAndroid Build Coastguard Worker } 117*c8dee2aaSAndroid Build Coastguard Worker 118*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GM; 119*c8dee2aaSAndroid Build Coastguard Worker }; 120*c8dee2aaSAndroid Build Coastguard Worker 121*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new ContourStartGM(); ) 122*c8dee2aaSAndroid Build Coastguard Worker 123*c8dee2aaSAndroid Build Coastguard Worker } // namespace skiagm 124