1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2011 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/SkBlurTypes.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h" 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker #include <stddef.h> 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm { 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker class PointsGM : public GM { 24*c8dee2aaSAndroid Build Coastguard Worker public: PointsGM()25*c8dee2aaSAndroid Build Coastguard Worker PointsGM() {} 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker protected: getName() const28*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("points"); } 29*c8dee2aaSAndroid Build Coastguard Worker getISize()30*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(640, 490); } 31*c8dee2aaSAndroid Build Coastguard Worker fill_pts(SkPoint pts[],size_t n,SkRandom * rand)32*c8dee2aaSAndroid Build Coastguard Worker static void fill_pts(SkPoint pts[], size_t n, SkRandom* rand) { 33*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < n; i++) { 34*c8dee2aaSAndroid Build Coastguard Worker // Compute these independently and store in variables, rather 35*c8dee2aaSAndroid Build Coastguard Worker // than in the parameter-passing expression, to get consistent 36*c8dee2aaSAndroid Build Coastguard Worker // evaluation order across compilers. 37*c8dee2aaSAndroid Build Coastguard Worker SkScalar y = rand->nextUScalar1() * 480; 38*c8dee2aaSAndroid Build Coastguard Worker SkScalar x = rand->nextUScalar1() * 640; 39*c8dee2aaSAndroid Build Coastguard Worker pts[i].set(x, y); 40*c8dee2aaSAndroid Build Coastguard Worker } 41*c8dee2aaSAndroid Build Coastguard Worker } 42*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)43*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 44*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(SK_Scalar1, SK_Scalar1); 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand; 47*c8dee2aaSAndroid Build Coastguard Worker SkPaint p0, p1, p2, p3; 48*c8dee2aaSAndroid Build Coastguard Worker const size_t n = 99; 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker p0.setColor(SK_ColorRED); 51*c8dee2aaSAndroid Build Coastguard Worker p1.setColor(SK_ColorGREEN); 52*c8dee2aaSAndroid Build Coastguard Worker p2.setColor(SK_ColorBLUE); 53*c8dee2aaSAndroid Build Coastguard Worker p3.setColor(SK_ColorWHITE); 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker p0.setStrokeWidth(SkIntToScalar(4)); 56*c8dee2aaSAndroid Build Coastguard Worker p2.setStrokeCap(SkPaint::kRound_Cap); 57*c8dee2aaSAndroid Build Coastguard Worker p2.setStrokeWidth(SkIntToScalar(6)); 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker SkPoint* pts = new SkPoint[n]; 60*c8dee2aaSAndroid Build Coastguard Worker fill_pts(pts, n, &rand); 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPoints(SkCanvas::kPolygon_PointMode, n, pts, p0); 63*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPoints(SkCanvas::kLines_PointMode, n, pts, p1); 64*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPoints(SkCanvas::kPoints_PointMode, n, pts, p2); 65*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPoints(SkCanvas::kPoints_PointMode, n, pts, p3); 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker delete[] pts; 68*c8dee2aaSAndroid Build Coastguard Worker } 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker private: 71*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GM; 72*c8dee2aaSAndroid Build Coastguard Worker }; 73*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new PointsGM; ) 74*c8dee2aaSAndroid Build Coastguard Worker } // namespace skiagm 75*c8dee2aaSAndroid Build Coastguard Worker 76*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMaskFilter.h" 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(points_maskfilter, canvas, 512, 256) { 79*c8dee2aaSAndroid Build Coastguard Worker constexpr int N = 30; 80*c8dee2aaSAndroid Build Coastguard Worker SkPoint pts[N]; 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand; 83*c8dee2aaSAndroid Build Coastguard Worker for (SkPoint& p : pts) { 84*c8dee2aaSAndroid Build Coastguard Worker p.fX = rand.nextF() * 220 + 18; 85*c8dee2aaSAndroid Build Coastguard Worker p.fY = rand.nextF() * 220 + 18; 86*c8dee2aaSAndroid Build Coastguard Worker } 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker auto mf = SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 6); 89*c8dee2aaSAndroid Build Coastguard Worker const SkPaint::Cap caps[] = { SkPaint::kSquare_Cap, SkPaint::kRound_Cap }; 90*c8dee2aaSAndroid Build Coastguard Worker 91*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 92*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(true); 93*c8dee2aaSAndroid Build Coastguard Worker paint.setStroke(true); 94*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeWidth(10); 95*c8dee2aaSAndroid Build Coastguard Worker 96*c8dee2aaSAndroid Build Coastguard Worker for (auto cap : caps) { 97*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeCap(cap); 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker paint.setMaskFilter(mf); 100*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(SK_ColorBLACK); 101*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPoints(SkCanvas::kPoints_PointMode, N, pts, paint); 102*c8dee2aaSAndroid Build Coastguard Worker 103*c8dee2aaSAndroid Build Coastguard Worker paint.setMaskFilter(nullptr); 104*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(SK_ColorRED); 105*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPoints(SkCanvas::kPoints_PointMode, N, pts, paint); 106*c8dee2aaSAndroid Build Coastguard Worker 107*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(256, 0); 108*c8dee2aaSAndroid Build Coastguard Worker } 109*c8dee2aaSAndroid Build Coastguard Worker } 110