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/SkCanvas.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPathEffect.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPathUtils.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkDashPathEffect.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/utils/SkParsePath.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkFloatBits.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h"
26*c8dee2aaSAndroid Build Coastguard Worker
27*c8dee2aaSAndroid Build Coastguard Worker #include <string.h>
28*c8dee2aaSAndroid Build Coastguard Worker
29*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE)
30*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/ContextOptions.h"
31*c8dee2aaSAndroid Build Coastguard Worker #endif
32*c8dee2aaSAndroid Build Coastguard Worker
33*c8dee2aaSAndroid Build Coastguard Worker #define W 400
34*c8dee2aaSAndroid Build Coastguard Worker #define H 400
35*c8dee2aaSAndroid Build Coastguard Worker #define N 50
36*c8dee2aaSAndroid Build Coastguard Worker
37*c8dee2aaSAndroid Build Coastguard Worker constexpr SkScalar SW = SkIntToScalar(W);
38*c8dee2aaSAndroid Build Coastguard Worker constexpr SkScalar SH = SkIntToScalar(H);
39*c8dee2aaSAndroid Build Coastguard Worker
rnd_rect(SkRect * r,SkPaint * paint,SkRandom & rand)40*c8dee2aaSAndroid Build Coastguard Worker static void rnd_rect(SkRect* r, SkPaint* paint, SkRandom& rand) {
41*c8dee2aaSAndroid Build Coastguard Worker SkScalar x = rand.nextUScalar1() * W;
42*c8dee2aaSAndroid Build Coastguard Worker SkScalar y = rand.nextUScalar1() * H;
43*c8dee2aaSAndroid Build Coastguard Worker SkScalar w = rand.nextUScalar1() * (W >> 2);
44*c8dee2aaSAndroid Build Coastguard Worker SkScalar h = rand.nextUScalar1() * (H >> 2);
45*c8dee2aaSAndroid Build Coastguard Worker SkScalar hoffset = rand.nextSScalar1();
46*c8dee2aaSAndroid Build Coastguard Worker SkScalar woffset = rand.nextSScalar1();
47*c8dee2aaSAndroid Build Coastguard Worker
48*c8dee2aaSAndroid Build Coastguard Worker r->setXYWH(x, y, w, h);
49*c8dee2aaSAndroid Build Coastguard Worker r->offset(-w/2 + woffset, -h/2 + hoffset);
50*c8dee2aaSAndroid Build Coastguard Worker
51*c8dee2aaSAndroid Build Coastguard Worker paint->setColor(rand.nextU());
52*c8dee2aaSAndroid Build Coastguard Worker paint->setAlphaf(1.0f);
53*c8dee2aaSAndroid Build Coastguard Worker }
54*c8dee2aaSAndroid Build Coastguard Worker
55*c8dee2aaSAndroid Build Coastguard Worker
56*c8dee2aaSAndroid Build Coastguard Worker class StrokesGM : public skiagm::GM {
57*c8dee2aaSAndroid Build Coastguard Worker public:
StrokesGM()58*c8dee2aaSAndroid Build Coastguard Worker StrokesGM() {}
59*c8dee2aaSAndroid Build Coastguard Worker
60*c8dee2aaSAndroid Build Coastguard Worker protected:
getName() const61*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("strokes_round"); }
62*c8dee2aaSAndroid Build Coastguard Worker
getISize()63*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(W, H * 2); }
64*c8dee2aaSAndroid Build Coastguard Worker
65*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE)
modifyGraphiteContextOptions(skgpu::graphite::ContextOptions * options) const66*c8dee2aaSAndroid Build Coastguard Worker void modifyGraphiteContextOptions(skgpu::graphite::ContextOptions* options) const override {
67*c8dee2aaSAndroid Build Coastguard Worker options->fMaxPathAtlasTextureSize = 0;
68*c8dee2aaSAndroid Build Coastguard Worker options->fAllowMultipleAtlasTextures = false;
69*c8dee2aaSAndroid Build Coastguard Worker }
70*c8dee2aaSAndroid Build Coastguard Worker #endif
71*c8dee2aaSAndroid Build Coastguard Worker
onDraw(SkCanvas * canvas)72*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override {
73*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
74*c8dee2aaSAndroid Build Coastguard Worker paint.setStyle(SkPaint::kStroke_Style);
75*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeWidth(SkIntToScalar(9)/2);
76*c8dee2aaSAndroid Build Coastguard Worker
77*c8dee2aaSAndroid Build Coastguard Worker for (int y = 0; y < 2; y++) {
78*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(!!y);
79*c8dee2aaSAndroid Build Coastguard Worker SkAutoCanvasRestore acr(canvas, true);
80*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, SH * y);
81*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect(SkRect::MakeLTRB(
82*c8dee2aaSAndroid Build Coastguard Worker SkIntToScalar(2), SkIntToScalar(2)
83*c8dee2aaSAndroid Build Coastguard Worker , SW - SkIntToScalar(2), SH - SkIntToScalar(2)
84*c8dee2aaSAndroid Build Coastguard Worker ));
85*c8dee2aaSAndroid Build Coastguard Worker
86*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand;
87*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < N; i++) {
88*c8dee2aaSAndroid Build Coastguard Worker SkRect r;
89*c8dee2aaSAndroid Build Coastguard Worker rnd_rect(&r, &paint, rand);
90*c8dee2aaSAndroid Build Coastguard Worker canvas->drawOval(r, paint);
91*c8dee2aaSAndroid Build Coastguard Worker rnd_rect(&r, &paint, rand);
92*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRoundRect(r, r.width()/4, r.height()/4, paint);
93*c8dee2aaSAndroid Build Coastguard Worker rnd_rect(&r, &paint, rand);
94*c8dee2aaSAndroid Build Coastguard Worker }
95*c8dee2aaSAndroid Build Coastguard Worker }
96*c8dee2aaSAndroid Build Coastguard Worker }
97*c8dee2aaSAndroid Build Coastguard Worker
98*c8dee2aaSAndroid Build Coastguard Worker private:
99*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = skiagm::GM;
100*c8dee2aaSAndroid Build Coastguard Worker };
101*c8dee2aaSAndroid Build Coastguard Worker
102*c8dee2aaSAndroid Build Coastguard Worker /* See
103*c8dee2aaSAndroid Build Coastguard Worker https://code.google.com/p/chromium/issues/detail?id=422974 and
104*c8dee2aaSAndroid Build Coastguard Worker http://jsfiddle.net/1xnku3sg/2/
105*c8dee2aaSAndroid Build Coastguard Worker */
106*c8dee2aaSAndroid Build Coastguard Worker class ZeroLenStrokesGM : public skiagm::GM {
107*c8dee2aaSAndroid Build Coastguard Worker SkPath fMoveHfPath, fMoveZfPath, fDashedfPath, fRefPath[4];
108*c8dee2aaSAndroid Build Coastguard Worker SkPath fCubicPath, fQuadPath, fLinePath;
109*c8dee2aaSAndroid Build Coastguard Worker protected:
onOnceBeforeDraw()110*c8dee2aaSAndroid Build Coastguard Worker void onOnceBeforeDraw() override {
111*c8dee2aaSAndroid Build Coastguard Worker
112*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(SkParsePath::FromSVGString("M0,0h0M10,0h0M20,0h0", &fMoveHfPath));
113*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(SkParsePath::FromSVGString("M0,0zM10,0zM20,0z", &fMoveZfPath));
114*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(SkParsePath::FromSVGString("M0,0h25", &fDashedfPath));
115*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(SkParsePath::FromSVGString("M 0 0 C 0 0 0 0 0 0", &fCubicPath));
116*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(SkParsePath::FromSVGString("M 0 0 Q 0 0 0 0", &fQuadPath));
117*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(SkParsePath::FromSVGString("M 0 0 L 0 0", &fLinePath));
118*c8dee2aaSAndroid Build Coastguard Worker
119*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 3; ++i) {
120*c8dee2aaSAndroid Build Coastguard Worker fRefPath[0].addCircle(i * 10.f, 0, 5);
121*c8dee2aaSAndroid Build Coastguard Worker fRefPath[1].addCircle(i * 10.f, 0, 10);
122*c8dee2aaSAndroid Build Coastguard Worker fRefPath[2].addRect(i * 10.f - 4, -2, i * 10.f + 4, 6);
123*c8dee2aaSAndroid Build Coastguard Worker fRefPath[3].addRect(i * 10.f - 10, -10, i * 10.f + 10, 10);
124*c8dee2aaSAndroid Build Coastguard Worker }
125*c8dee2aaSAndroid Build Coastguard Worker }
126*c8dee2aaSAndroid Build Coastguard Worker
getName() const127*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("zeroPath"); }
128*c8dee2aaSAndroid Build Coastguard Worker
getISize()129*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(W, H * 2); }
130*c8dee2aaSAndroid Build Coastguard Worker
onDraw(SkCanvas * canvas)131*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override {
132*c8dee2aaSAndroid Build Coastguard Worker SkPaint fillPaint, strokePaint, dashPaint;
133*c8dee2aaSAndroid Build Coastguard Worker fillPaint.setAntiAlias(true);
134*c8dee2aaSAndroid Build Coastguard Worker strokePaint = fillPaint;
135*c8dee2aaSAndroid Build Coastguard Worker strokePaint.setStyle(SkPaint::kStroke_Style);
136*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) {
137*c8dee2aaSAndroid Build Coastguard Worker fillPaint.setAlphaf(1.0f);
138*c8dee2aaSAndroid Build Coastguard Worker strokePaint.setAlphaf(1.0f);
139*c8dee2aaSAndroid Build Coastguard Worker strokePaint.setStrokeWidth(i ? 8.f : 10.f);
140*c8dee2aaSAndroid Build Coastguard Worker strokePaint.setStrokeCap(i ? SkPaint::kSquare_Cap : SkPaint::kRound_Cap);
141*c8dee2aaSAndroid Build Coastguard Worker canvas->save();
142*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(10 + i * 100.f, 10);
143*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(fMoveHfPath, strokePaint);
144*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, 20);
145*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(fMoveZfPath, strokePaint);
146*c8dee2aaSAndroid Build Coastguard Worker dashPaint = strokePaint;
147*c8dee2aaSAndroid Build Coastguard Worker const SkScalar intervals[] = { 0, 10 };
148*c8dee2aaSAndroid Build Coastguard Worker dashPaint.setPathEffect(SkDashPathEffect::Make(intervals, 2, 0));
149*c8dee2aaSAndroid Build Coastguard Worker SkPath fillPath;
150*c8dee2aaSAndroid Build Coastguard Worker skpathutils::FillPathWithPaint(fDashedfPath, dashPaint, &fillPath);
151*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, 20);
152*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(fDashedfPath, dashPaint);
153*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, 20);
154*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(fRefPath[i * 2], fillPaint);
155*c8dee2aaSAndroid Build Coastguard Worker strokePaint.setStrokeWidth(20);
156*c8dee2aaSAndroid Build Coastguard Worker strokePaint.setAlphaf(0.5f);
157*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, 50);
158*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(fMoveHfPath, strokePaint);
159*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, 30);
160*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(fMoveZfPath, strokePaint);
161*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, 30);
162*c8dee2aaSAndroid Build Coastguard Worker fillPaint.setAlphaf(0.5f);
163*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(fRefPath[1 + i * 2], fillPaint);
164*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, 30);
165*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(fCubicPath, strokePaint);
166*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, 30);
167*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(fQuadPath, strokePaint);
168*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, 30);
169*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(fLinePath, strokePaint);
170*c8dee2aaSAndroid Build Coastguard Worker canvas->restore();
171*c8dee2aaSAndroid Build Coastguard Worker }
172*c8dee2aaSAndroid Build Coastguard Worker }
173*c8dee2aaSAndroid Build Coastguard Worker
174*c8dee2aaSAndroid Build Coastguard Worker private:
175*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = skiagm::GM;
176*c8dee2aaSAndroid Build Coastguard Worker };
177*c8dee2aaSAndroid Build Coastguard Worker
178*c8dee2aaSAndroid Build Coastguard Worker class TeenyStrokesGM : public skiagm::GM {
getName() const179*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("teenyStrokes"); }
180*c8dee2aaSAndroid Build Coastguard Worker
getISize()181*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(W, H * 2); }
182*c8dee2aaSAndroid Build Coastguard Worker
line(SkScalar scale,SkCanvas * canvas,SkColor color)183*c8dee2aaSAndroid Build Coastguard Worker static void line(SkScalar scale, SkCanvas* canvas, SkColor color) {
184*c8dee2aaSAndroid Build Coastguard Worker SkPaint p;
185*c8dee2aaSAndroid Build Coastguard Worker p.setAntiAlias(true);
186*c8dee2aaSAndroid Build Coastguard Worker p.setStyle(SkPaint::kStroke_Style);
187*c8dee2aaSAndroid Build Coastguard Worker p.setColor(color);
188*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(50, 0);
189*c8dee2aaSAndroid Build Coastguard Worker canvas->save();
190*c8dee2aaSAndroid Build Coastguard Worker p.setStrokeWidth(scale * 5);
191*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(1 / scale, 1 / scale);
192*c8dee2aaSAndroid Build Coastguard Worker canvas->drawLine(20 * scale, 20 * scale, 20 * scale, 100 * scale, p);
193*c8dee2aaSAndroid Build Coastguard Worker canvas->drawLine(20 * scale, 20 * scale, 100 * scale, 100 * scale, p);
194*c8dee2aaSAndroid Build Coastguard Worker canvas->restore();
195*c8dee2aaSAndroid Build Coastguard Worker }
196*c8dee2aaSAndroid Build Coastguard Worker
onDraw(SkCanvas * canvas)197*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override {
198*c8dee2aaSAndroid Build Coastguard Worker line(0.00005f, canvas, SK_ColorBLACK);
199*c8dee2aaSAndroid Build Coastguard Worker line(0.000045f, canvas, SK_ColorRED);
200*c8dee2aaSAndroid Build Coastguard Worker line(0.0000035f, canvas, SK_ColorGREEN);
201*c8dee2aaSAndroid Build Coastguard Worker line(0.000003f, canvas, SK_ColorBLUE);
202*c8dee2aaSAndroid Build Coastguard Worker line(0.000002f, canvas, SK_ColorBLACK);
203*c8dee2aaSAndroid Build Coastguard Worker }
204*c8dee2aaSAndroid Build Coastguard Worker private:
205*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = skiagm::GM;
206*c8dee2aaSAndroid Build Coastguard Worker };
207*c8dee2aaSAndroid Build Coastguard Worker
208*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(CubicStroke, canvas, 384, 384) {
209*c8dee2aaSAndroid Build Coastguard Worker SkPaint p;
210*c8dee2aaSAndroid Build Coastguard Worker p.setAntiAlias(true);
211*c8dee2aaSAndroid Build Coastguard Worker p.setStyle(SkPaint::kStroke_Style);
212*c8dee2aaSAndroid Build Coastguard Worker p.setStrokeWidth(1.0720f);
213*c8dee2aaSAndroid Build Coastguard Worker SkPath path;
214*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(-6000,-6000);
215*c8dee2aaSAndroid Build Coastguard Worker path.cubicTo(-3500,5500,-500,5500,2500,-6500);
216*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, p);
217*c8dee2aaSAndroid Build Coastguard Worker p.setStrokeWidth(1.0721f);
218*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(10, 10);
219*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, p);
220*c8dee2aaSAndroid Build Coastguard Worker p.setStrokeWidth(1.0722f);
221*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(10, 10);
222*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, p);
223*c8dee2aaSAndroid Build Coastguard Worker }
224*c8dee2aaSAndroid Build Coastguard Worker
225*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(zerolinestroke, canvas, 90, 120) {
226*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
227*c8dee2aaSAndroid Build Coastguard Worker paint.setStyle(SkPaint::kStroke_Style);
228*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeWidth(20);
229*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(true);
230*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeCap(SkPaint::kRound_Cap);
231*c8dee2aaSAndroid Build Coastguard Worker
232*c8dee2aaSAndroid Build Coastguard Worker SkPath path;
233*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(30, 90);
234*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(30, 90);
235*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(60, 90);
236*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(60, 90);
237*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, paint);
238*c8dee2aaSAndroid Build Coastguard Worker
239*c8dee2aaSAndroid Build Coastguard Worker path.reset();
240*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(30, 30);
241*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(60, 30);
242*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, paint);
243*c8dee2aaSAndroid Build Coastguard Worker
244*c8dee2aaSAndroid Build Coastguard Worker path.reset();
245*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(30, 60);
246*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(30, 60);
247*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(60, 60);
248*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, paint);
249*c8dee2aaSAndroid Build Coastguard Worker }
250*c8dee2aaSAndroid Build Coastguard Worker
251*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(quadcap, canvas, 200, 200) {
252*c8dee2aaSAndroid Build Coastguard Worker SkPaint p;
253*c8dee2aaSAndroid Build Coastguard Worker p.setAntiAlias(true);
254*c8dee2aaSAndroid Build Coastguard Worker p.setStyle(SkPaint::kStroke_Style);
255*c8dee2aaSAndroid Build Coastguard Worker p.setStrokeWidth(0);
256*c8dee2aaSAndroid Build Coastguard Worker SkPath path;
257*c8dee2aaSAndroid Build Coastguard Worker SkPoint pts[] = {{105.738571f,13.126318f},
258*c8dee2aaSAndroid Build Coastguard Worker {105.738571f,13.126318f},
259*c8dee2aaSAndroid Build Coastguard Worker {123.753784f,1.f}};
260*c8dee2aaSAndroid Build Coastguard Worker SkVector tangent = pts[1] - pts[2];
261*c8dee2aaSAndroid Build Coastguard Worker tangent.normalize();
262*c8dee2aaSAndroid Build Coastguard Worker SkPoint pts2[3];
263*c8dee2aaSAndroid Build Coastguard Worker memcpy(pts2, pts, sizeof(pts));
264*c8dee2aaSAndroid Build Coastguard Worker const SkScalar capOutset = SK_ScalarPI / 8;
265*c8dee2aaSAndroid Build Coastguard Worker pts2[0].fX += tangent.fX * capOutset;
266*c8dee2aaSAndroid Build Coastguard Worker pts2[0].fY += tangent.fY * capOutset;
267*c8dee2aaSAndroid Build Coastguard Worker pts2[1].fX += tangent.fX * capOutset;
268*c8dee2aaSAndroid Build Coastguard Worker pts2[1].fY += tangent.fY * capOutset;
269*c8dee2aaSAndroid Build Coastguard Worker pts2[2].fX += -tangent.fX * capOutset;
270*c8dee2aaSAndroid Build Coastguard Worker pts2[2].fY += -tangent.fY * capOutset;
271*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(pts2[0]);
272*c8dee2aaSAndroid Build Coastguard Worker path.quadTo(pts2[1], pts2[2]);
273*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, p);
274*c8dee2aaSAndroid Build Coastguard Worker
275*c8dee2aaSAndroid Build Coastguard Worker path.reset();
276*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(pts[0]);
277*c8dee2aaSAndroid Build Coastguard Worker path.quadTo(pts[1], pts[2]);
278*c8dee2aaSAndroid Build Coastguard Worker p.setStrokeCap(SkPaint::kRound_Cap);
279*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(30, 0);
280*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, p);
281*c8dee2aaSAndroid Build Coastguard Worker }
282*c8dee2aaSAndroid Build Coastguard Worker
283*c8dee2aaSAndroid Build Coastguard Worker class Strokes2GM : public skiagm::GM {
284*c8dee2aaSAndroid Build Coastguard Worker SkPath fPath;
285*c8dee2aaSAndroid Build Coastguard Worker protected:
onOnceBeforeDraw()286*c8dee2aaSAndroid Build Coastguard Worker void onOnceBeforeDraw() override {
287*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand;
288*c8dee2aaSAndroid Build Coastguard Worker fPath.moveTo(0, 0);
289*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 13; i++) {
290*c8dee2aaSAndroid Build Coastguard Worker SkScalar x = rand.nextUScalar1() * (W >> 1);
291*c8dee2aaSAndroid Build Coastguard Worker SkScalar y = rand.nextUScalar1() * (H >> 1);
292*c8dee2aaSAndroid Build Coastguard Worker fPath.lineTo(x, y);
293*c8dee2aaSAndroid Build Coastguard Worker }
294*c8dee2aaSAndroid Build Coastguard Worker }
295*c8dee2aaSAndroid Build Coastguard Worker
getName() const296*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("strokes_poly"); }
297*c8dee2aaSAndroid Build Coastguard Worker
getISize()298*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(W, H * 2); }
299*c8dee2aaSAndroid Build Coastguard Worker
onDraw(SkCanvas * canvas)300*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override {
301*c8dee2aaSAndroid Build Coastguard Worker canvas->drawColor(SK_ColorWHITE);
302*c8dee2aaSAndroid Build Coastguard Worker
303*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
304*c8dee2aaSAndroid Build Coastguard Worker paint.setStyle(SkPaint::kStroke_Style);
305*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeWidth(SkIntToScalar(9)/2);
306*c8dee2aaSAndroid Build Coastguard Worker
307*c8dee2aaSAndroid Build Coastguard Worker for (int y = 0; y < 2; y++) {
308*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(!!y);
309*c8dee2aaSAndroid Build Coastguard Worker SkAutoCanvasRestore acr(canvas, true);
310*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, SH * y);
311*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect(SkRect::MakeLTRB(SkIntToScalar(2),
312*c8dee2aaSAndroid Build Coastguard Worker SkIntToScalar(2),
313*c8dee2aaSAndroid Build Coastguard Worker SW - SkIntToScalar(2),
314*c8dee2aaSAndroid Build Coastguard Worker SH - SkIntToScalar(2)));
315*c8dee2aaSAndroid Build Coastguard Worker
316*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand;
317*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < N/2; i++) {
318*c8dee2aaSAndroid Build Coastguard Worker SkRect r;
319*c8dee2aaSAndroid Build Coastguard Worker rnd_rect(&r, &paint, rand);
320*c8dee2aaSAndroid Build Coastguard Worker canvas->rotate(SkIntToScalar(15), SW/2, SH/2);
321*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(fPath, paint);
322*c8dee2aaSAndroid Build Coastguard Worker }
323*c8dee2aaSAndroid Build Coastguard Worker }
324*c8dee2aaSAndroid Build Coastguard Worker }
325*c8dee2aaSAndroid Build Coastguard Worker
326*c8dee2aaSAndroid Build Coastguard Worker private:
327*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = skiagm::GM;
328*c8dee2aaSAndroid Build Coastguard Worker };
329*c8dee2aaSAndroid Build Coastguard Worker
330*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
331*c8dee2aaSAndroid Build Coastguard Worker
inset(const SkRect & r)332*c8dee2aaSAndroid Build Coastguard Worker static SkRect inset(const SkRect& r) {
333*c8dee2aaSAndroid Build Coastguard Worker SkRect rr(r);
334*c8dee2aaSAndroid Build Coastguard Worker rr.inset(r.width()/10, r.height()/10);
335*c8dee2aaSAndroid Build Coastguard Worker return rr;
336*c8dee2aaSAndroid Build Coastguard Worker }
337*c8dee2aaSAndroid Build Coastguard Worker
338*c8dee2aaSAndroid Build Coastguard Worker class Strokes3GM : public skiagm::GM {
make0(SkPath * path,const SkRect & bounds,SkString * title)339*c8dee2aaSAndroid Build Coastguard Worker static void make0(SkPath* path, const SkRect& bounds, SkString* title) {
340*c8dee2aaSAndroid Build Coastguard Worker path->addRect(bounds, SkPathDirection::kCW);
341*c8dee2aaSAndroid Build Coastguard Worker path->addRect(inset(bounds), SkPathDirection::kCW);
342*c8dee2aaSAndroid Build Coastguard Worker title->set("CW CW");
343*c8dee2aaSAndroid Build Coastguard Worker }
344*c8dee2aaSAndroid Build Coastguard Worker
make1(SkPath * path,const SkRect & bounds,SkString * title)345*c8dee2aaSAndroid Build Coastguard Worker static void make1(SkPath* path, const SkRect& bounds, SkString* title) {
346*c8dee2aaSAndroid Build Coastguard Worker path->addRect(bounds, SkPathDirection::kCW);
347*c8dee2aaSAndroid Build Coastguard Worker path->addRect(inset(bounds), SkPathDirection::kCCW);
348*c8dee2aaSAndroid Build Coastguard Worker title->set("CW CCW");
349*c8dee2aaSAndroid Build Coastguard Worker }
350*c8dee2aaSAndroid Build Coastguard Worker
make2(SkPath * path,const SkRect & bounds,SkString * title)351*c8dee2aaSAndroid Build Coastguard Worker static void make2(SkPath* path, const SkRect& bounds, SkString* title) {
352*c8dee2aaSAndroid Build Coastguard Worker path->addOval(bounds, SkPathDirection::kCW);
353*c8dee2aaSAndroid Build Coastguard Worker path->addOval(inset(bounds), SkPathDirection::kCW);
354*c8dee2aaSAndroid Build Coastguard Worker title->set("CW CW");
355*c8dee2aaSAndroid Build Coastguard Worker }
356*c8dee2aaSAndroid Build Coastguard Worker
make3(SkPath * path,const SkRect & bounds,SkString * title)357*c8dee2aaSAndroid Build Coastguard Worker static void make3(SkPath* path, const SkRect& bounds, SkString* title) {
358*c8dee2aaSAndroid Build Coastguard Worker path->addOval(bounds, SkPathDirection::kCW);
359*c8dee2aaSAndroid Build Coastguard Worker path->addOval(inset(bounds), SkPathDirection::kCCW);
360*c8dee2aaSAndroid Build Coastguard Worker title->set("CW CCW");
361*c8dee2aaSAndroid Build Coastguard Worker }
362*c8dee2aaSAndroid Build Coastguard Worker
make4(SkPath * path,const SkRect & bounds,SkString * title)363*c8dee2aaSAndroid Build Coastguard Worker static void make4(SkPath* path, const SkRect& bounds, SkString* title) {
364*c8dee2aaSAndroid Build Coastguard Worker path->addRect(bounds, SkPathDirection::kCW);
365*c8dee2aaSAndroid Build Coastguard Worker SkRect r = bounds;
366*c8dee2aaSAndroid Build Coastguard Worker r.inset(bounds.width() / 10, -bounds.height() / 10);
367*c8dee2aaSAndroid Build Coastguard Worker path->addOval(r, SkPathDirection::kCW);
368*c8dee2aaSAndroid Build Coastguard Worker title->set("CW CW");
369*c8dee2aaSAndroid Build Coastguard Worker }
370*c8dee2aaSAndroid Build Coastguard Worker
make5(SkPath * path,const SkRect & bounds,SkString * title)371*c8dee2aaSAndroid Build Coastguard Worker static void make5(SkPath* path, const SkRect& bounds, SkString* title) {
372*c8dee2aaSAndroid Build Coastguard Worker path->addRect(bounds, SkPathDirection::kCW);
373*c8dee2aaSAndroid Build Coastguard Worker SkRect r = bounds;
374*c8dee2aaSAndroid Build Coastguard Worker r.inset(bounds.width() / 10, -bounds.height() / 10);
375*c8dee2aaSAndroid Build Coastguard Worker path->addOval(r, SkPathDirection::kCCW);
376*c8dee2aaSAndroid Build Coastguard Worker title->set("CW CCW");
377*c8dee2aaSAndroid Build Coastguard Worker }
378*c8dee2aaSAndroid Build Coastguard Worker
379*c8dee2aaSAndroid Build Coastguard Worker public:
Strokes3GM()380*c8dee2aaSAndroid Build Coastguard Worker Strokes3GM() {}
381*c8dee2aaSAndroid Build Coastguard Worker
382*c8dee2aaSAndroid Build Coastguard Worker protected:
getName() const383*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("strokes3"); }
384*c8dee2aaSAndroid Build Coastguard Worker
getISize()385*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(1500, 1500); }
386*c8dee2aaSAndroid Build Coastguard Worker
onDraw(SkCanvas * canvas)387*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override {
388*c8dee2aaSAndroid Build Coastguard Worker SkPaint origPaint;
389*c8dee2aaSAndroid Build Coastguard Worker origPaint.setAntiAlias(true);
390*c8dee2aaSAndroid Build Coastguard Worker origPaint.setStyle(SkPaint::kStroke_Style);
391*c8dee2aaSAndroid Build Coastguard Worker SkPaint fillPaint(origPaint);
392*c8dee2aaSAndroid Build Coastguard Worker fillPaint.setColor(SK_ColorRED);
393*c8dee2aaSAndroid Build Coastguard Worker SkPaint strokePaint(origPaint);
394*c8dee2aaSAndroid Build Coastguard Worker strokePaint.setColor(ToolUtils::color_to_565(0xFF4444FF));
395*c8dee2aaSAndroid Build Coastguard Worker
396*c8dee2aaSAndroid Build Coastguard Worker void (*procs[])(SkPath*, const SkRect&, SkString*) = {
397*c8dee2aaSAndroid Build Coastguard Worker make0, make1, make2, make3, make4, make5
398*c8dee2aaSAndroid Build Coastguard Worker };
399*c8dee2aaSAndroid Build Coastguard Worker
400*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(SkIntToScalar(20), SkIntToScalar(80));
401*c8dee2aaSAndroid Build Coastguard Worker
402*c8dee2aaSAndroid Build Coastguard Worker SkRect bounds = SkRect::MakeWH(SkIntToScalar(50), SkIntToScalar(50));
403*c8dee2aaSAndroid Build Coastguard Worker SkScalar dx = bounds.width() * 4/3;
404*c8dee2aaSAndroid Build Coastguard Worker SkScalar dy = bounds.height() * 5;
405*c8dee2aaSAndroid Build Coastguard Worker
406*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(procs); ++i) {
407*c8dee2aaSAndroid Build Coastguard Worker SkPath orig;
408*c8dee2aaSAndroid Build Coastguard Worker SkString str;
409*c8dee2aaSAndroid Build Coastguard Worker procs[i](&orig, bounds, &str);
410*c8dee2aaSAndroid Build Coastguard Worker
411*c8dee2aaSAndroid Build Coastguard Worker canvas->save();
412*c8dee2aaSAndroid Build Coastguard Worker for (int j = 0; j < 13; ++j) {
413*c8dee2aaSAndroid Build Coastguard Worker strokePaint.setStrokeWidth(SK_Scalar1 * j * j);
414*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(orig, strokePaint);
415*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(orig, origPaint);
416*c8dee2aaSAndroid Build Coastguard Worker SkPath fill;
417*c8dee2aaSAndroid Build Coastguard Worker skpathutils::FillPathWithPaint(orig, strokePaint, &fill);
418*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(fill, fillPaint);
419*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(dx + strokePaint.getStrokeWidth(), 0);
420*c8dee2aaSAndroid Build Coastguard Worker }
421*c8dee2aaSAndroid Build Coastguard Worker canvas->restore();
422*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, dy);
423*c8dee2aaSAndroid Build Coastguard Worker }
424*c8dee2aaSAndroid Build Coastguard Worker }
425*c8dee2aaSAndroid Build Coastguard Worker
426*c8dee2aaSAndroid Build Coastguard Worker private:
427*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = skiagm::GM;
428*c8dee2aaSAndroid Build Coastguard Worker };
429*c8dee2aaSAndroid Build Coastguard Worker
430*c8dee2aaSAndroid Build Coastguard Worker class Strokes4GM : public skiagm::GM {
431*c8dee2aaSAndroid Build Coastguard Worker public:
Strokes4GM()432*c8dee2aaSAndroid Build Coastguard Worker Strokes4GM() {}
433*c8dee2aaSAndroid Build Coastguard Worker
434*c8dee2aaSAndroid Build Coastguard Worker protected:
getName() const435*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("strokes_zoomed"); }
436*c8dee2aaSAndroid Build Coastguard Worker
getISize()437*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(W, H * 2); }
438*c8dee2aaSAndroid Build Coastguard Worker
onDraw(SkCanvas * canvas)439*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override {
440*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
441*c8dee2aaSAndroid Build Coastguard Worker paint.setStyle(SkPaint::kStroke_Style);
442*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeWidth(0.055f);
443*c8dee2aaSAndroid Build Coastguard Worker
444*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(1000, 1000);
445*c8dee2aaSAndroid Build Coastguard Worker canvas->drawCircle(0, 2, 1.97f, paint);
446*c8dee2aaSAndroid Build Coastguard Worker }
447*c8dee2aaSAndroid Build Coastguard Worker
448*c8dee2aaSAndroid Build Coastguard Worker private:
449*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = skiagm::GM;
450*c8dee2aaSAndroid Build Coastguard Worker };
451*c8dee2aaSAndroid Build Coastguard Worker
452*c8dee2aaSAndroid Build Coastguard Worker // Test stroking for curves that produce degenerate tangents when t is 0 or 1 (see bug 4191)
453*c8dee2aaSAndroid Build Coastguard Worker class Strokes5GM : public skiagm::GM {
454*c8dee2aaSAndroid Build Coastguard Worker public:
Strokes5GM()455*c8dee2aaSAndroid Build Coastguard Worker Strokes5GM() {}
456*c8dee2aaSAndroid Build Coastguard Worker
457*c8dee2aaSAndroid Build Coastguard Worker protected:
getName() const458*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("zero_control_stroke"); }
459*c8dee2aaSAndroid Build Coastguard Worker
getISize()460*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(W, H * 2); }
461*c8dee2aaSAndroid Build Coastguard Worker
onDraw(SkCanvas * canvas)462*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override {
463*c8dee2aaSAndroid Build Coastguard Worker SkPaint p;
464*c8dee2aaSAndroid Build Coastguard Worker p.setColor(SK_ColorRED);
465*c8dee2aaSAndroid Build Coastguard Worker p.setAntiAlias(true);
466*c8dee2aaSAndroid Build Coastguard Worker p.setStyle(SkPaint::kStroke_Style);
467*c8dee2aaSAndroid Build Coastguard Worker p.setStrokeWidth(40);
468*c8dee2aaSAndroid Build Coastguard Worker p.setStrokeCap(SkPaint::kButt_Cap);
469*c8dee2aaSAndroid Build Coastguard Worker
470*c8dee2aaSAndroid Build Coastguard Worker SkPath path;
471*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(157.474f,111.753f);
472*c8dee2aaSAndroid Build Coastguard Worker path.cubicTo(128.5f,111.5f,35.5f,29.5f,35.5f,29.5f);
473*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, p);
474*c8dee2aaSAndroid Build Coastguard Worker path.reset();
475*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(250, 50);
476*c8dee2aaSAndroid Build Coastguard Worker path.quadTo(280, 80, 280, 80);
477*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, p);
478*c8dee2aaSAndroid Build Coastguard Worker path.reset();
479*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(150, 50);
480*c8dee2aaSAndroid Build Coastguard Worker path.conicTo(180, 80, 180, 80, 0.707f);
481*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, p);
482*c8dee2aaSAndroid Build Coastguard Worker
483*c8dee2aaSAndroid Build Coastguard Worker path.reset();
484*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(157.474f,311.753f);
485*c8dee2aaSAndroid Build Coastguard Worker path.cubicTo(157.474f,311.753f,85.5f,229.5f,35.5f,229.5f);
486*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, p);
487*c8dee2aaSAndroid Build Coastguard Worker path.reset();
488*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(280, 250);
489*c8dee2aaSAndroid Build Coastguard Worker path.quadTo(280, 250, 310, 280);
490*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, p);
491*c8dee2aaSAndroid Build Coastguard Worker path.reset();
492*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(180, 250);
493*c8dee2aaSAndroid Build Coastguard Worker path.conicTo(180, 250, 210, 280, 0.707f);
494*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, p);
495*c8dee2aaSAndroid Build Coastguard Worker }
496*c8dee2aaSAndroid Build Coastguard Worker
497*c8dee2aaSAndroid Build Coastguard Worker private:
498*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = skiagm::GM;
499*c8dee2aaSAndroid Build Coastguard Worker };
500*c8dee2aaSAndroid Build Coastguard Worker
501*c8dee2aaSAndroid Build Coastguard Worker
502*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////
503*c8dee2aaSAndroid Build Coastguard Worker
504*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new StrokesGM; )
DEF_GM(return new Strokes2GM;)505*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new Strokes2GM; )
506*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new Strokes3GM; )
507*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new Strokes4GM; )
508*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new Strokes5GM; )
509*c8dee2aaSAndroid Build Coastguard Worker
510*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new ZeroLenStrokesGM; )
511*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new TeenyStrokesGM; )
512*c8dee2aaSAndroid Build Coastguard Worker
513*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(zerolinedash, canvas, 256, 256) {
514*c8dee2aaSAndroid Build Coastguard Worker canvas->clear(SK_ColorWHITE);
515*c8dee2aaSAndroid Build Coastguard Worker
516*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
517*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(SkColorSetARGB(255, 0, 0, 0));
518*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeWidth(11);
519*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeCap(SkPaint::kRound_Cap);
520*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeJoin(SkPaint::kBevel_Join);
521*c8dee2aaSAndroid Build Coastguard Worker
522*c8dee2aaSAndroid Build Coastguard Worker SkScalar dash_pattern[] = {1, 5};
523*c8dee2aaSAndroid Build Coastguard Worker paint.setPathEffect(SkDashPathEffect::Make(dash_pattern, 2, 0));
524*c8dee2aaSAndroid Build Coastguard Worker
525*c8dee2aaSAndroid Build Coastguard Worker canvas->drawLine(100, 100, 100, 100, paint);
526*c8dee2aaSAndroid Build Coastguard Worker }
527*c8dee2aaSAndroid Build Coastguard Worker
528*c8dee2aaSAndroid Build Coastguard Worker #ifdef PDF_IS_FIXED_SO_THIS_DOESNT_BREAK_IT
529*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(longrect_dash, canvas, 250, 250) {
530*c8dee2aaSAndroid Build Coastguard Worker canvas->clear(SK_ColorWHITE);
531*c8dee2aaSAndroid Build Coastguard Worker
532*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
533*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(SkColorSetARGB(255, 0, 0, 0));
534*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeWidth(5);
535*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeCap(SkPaint::kRound_Cap);
536*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeJoin(SkPaint::kBevel_Join);
537*c8dee2aaSAndroid Build Coastguard Worker paint.setStyle(SkPaint::kStroke_Style);
538*c8dee2aaSAndroid Build Coastguard Worker SkScalar dash_pattern[] = {1, 5};
539*c8dee2aaSAndroid Build Coastguard Worker paint.setPathEffect(SkDashPathEffect::Make(dash_pattern, 2, 0));
540*c8dee2aaSAndroid Build Coastguard Worker // try all combinations of stretching bounds
541*c8dee2aaSAndroid Build Coastguard Worker for (auto left : { 20.f, -100001.f } ) {
542*c8dee2aaSAndroid Build Coastguard Worker for (auto top : { 20.f, -100001.f } ) {
543*c8dee2aaSAndroid Build Coastguard Worker for (auto right : { 40.f, 100001.f } ) {
544*c8dee2aaSAndroid Build Coastguard Worker for (auto bottom : { 40.f, 100001.f } ) {
545*c8dee2aaSAndroid Build Coastguard Worker canvas->save();
546*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect({10, 10, 50, 50});
547*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect({left, top, right, bottom}, paint);
548*c8dee2aaSAndroid Build Coastguard Worker canvas->restore();
549*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(60, 0);
550*c8dee2aaSAndroid Build Coastguard Worker }
551*c8dee2aaSAndroid Build Coastguard Worker }
552*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(-60 * 4, 60);
553*c8dee2aaSAndroid Build Coastguard Worker }
554*c8dee2aaSAndroid Build Coastguard Worker }
555*c8dee2aaSAndroid Build Coastguard Worker }
556*c8dee2aaSAndroid Build Coastguard Worker #endif
557*c8dee2aaSAndroid Build Coastguard Worker
558*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(inner_join_geometry, canvas, 1000, 700) {
559*c8dee2aaSAndroid Build Coastguard Worker // These paths trigger cases where we must add inner join geometry.
560*c8dee2aaSAndroid Build Coastguard Worker // skbug.com/11964
561*c8dee2aaSAndroid Build Coastguard Worker const SkPoint pathPoints[] = {
562*c8dee2aaSAndroid Build Coastguard Worker /*moveTo*/ /*lineTo*/ /*lineTo*/
563*c8dee2aaSAndroid Build Coastguard Worker {119, 71}, {129, 151}, {230, 24},
564*c8dee2aaSAndroid Build Coastguard Worker {200, 144}, {129, 151}, {230, 24},
565*c8dee2aaSAndroid Build Coastguard Worker {192, 176}, {224, 175}, {281, 103},
566*c8dee2aaSAndroid Build Coastguard Worker {233, 205}, {224, 175}, {281, 103},
567*c8dee2aaSAndroid Build Coastguard Worker {121, 216}, {234, 189}, {195, 147},
568*c8dee2aaSAndroid Build Coastguard Worker {141, 216}, {254, 189}, {238, 250},
569*c8dee2aaSAndroid Build Coastguard Worker {159, 202}, {269, 197}, {289, 165},
570*c8dee2aaSAndroid Build Coastguard Worker {159, 202}, {269, 197}, {287, 227},
571*c8dee2aaSAndroid Build Coastguard Worker };
572*c8dee2aaSAndroid Build Coastguard Worker
573*c8dee2aaSAndroid Build Coastguard Worker SkPaint pathPaint;
574*c8dee2aaSAndroid Build Coastguard Worker pathPaint.setStroke(true);
575*c8dee2aaSAndroid Build Coastguard Worker pathPaint.setAntiAlias(true);
576*c8dee2aaSAndroid Build Coastguard Worker pathPaint.setStrokeWidth(100);
577*c8dee2aaSAndroid Build Coastguard Worker
578*c8dee2aaSAndroid Build Coastguard Worker SkPaint skeletonPaint;
579*c8dee2aaSAndroid Build Coastguard Worker skeletonPaint.setStroke(true);
580*c8dee2aaSAndroid Build Coastguard Worker skeletonPaint.setAntiAlias(true);
581*c8dee2aaSAndroid Build Coastguard Worker skeletonPaint.setStrokeWidth(0);
582*c8dee2aaSAndroid Build Coastguard Worker skeletonPaint.setColor(SK_ColorRED);
583*c8dee2aaSAndroid Build Coastguard Worker
584*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, 50);
585*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(pathPoints) / 3; i++) {
586*c8dee2aaSAndroid Build Coastguard Worker auto path = SkPath::Polygon(pathPoints + i * 3, 3, false);
587*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, pathPaint);
588*c8dee2aaSAndroid Build Coastguard Worker
589*c8dee2aaSAndroid Build Coastguard Worker SkPath fillPath;
590*c8dee2aaSAndroid Build Coastguard Worker skpathutils::FillPathWithPaint(path, pathPaint, &fillPath);
591*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(fillPath, skeletonPaint);
592*c8dee2aaSAndroid Build Coastguard Worker
593*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(200, 0);
594*c8dee2aaSAndroid Build Coastguard Worker if ((i + 1) % 4 == 0) {
595*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(-800, 200);
596*c8dee2aaSAndroid Build Coastguard Worker }
597*c8dee2aaSAndroid Build Coastguard Worker }
598*c8dee2aaSAndroid Build Coastguard Worker }
599*c8dee2aaSAndroid Build Coastguard Worker
600*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(skbug12244, canvas, 150, 150) {
601*c8dee2aaSAndroid Build Coastguard Worker // Should look like a stroked triangle; these vertices are the results of the SkStroker
602*c8dee2aaSAndroid Build Coastguard Worker // but we draw as a filled path in order to highlight that it's the GPU triangulating path
603*c8dee2aaSAndroid Build Coastguard Worker // renderer that's the source of the problem, and not the stroking operation. The original
604*c8dee2aaSAndroid Build Coastguard Worker // path was a simple:
605*c8dee2aaSAndroid Build Coastguard Worker // m(0,0), l(100, 40), l(0, 80), l(0,0) with a stroke width of 15px
606*c8dee2aaSAndroid Build Coastguard Worker SkPath path;
607*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(2.7854299545288085938, -6.9635753631591796875);
608*c8dee2aaSAndroid Build Coastguard Worker path.lineTo( 120.194366455078125, 40);
609*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(-7.5000004768371582031, 91.07775115966796875);
610*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(-7.5000004768371582031, -11.077748298645019531);
611*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(2.7854299545288085938, -6.9635753631591796875);
612*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(-2.7854299545288085938, 6.9635753631591796875);
613*c8dee2aaSAndroid Build Coastguard Worker path.lineTo( 0, 0);
614*c8dee2aaSAndroid Build Coastguard Worker path.lineTo( 7.5, 0);
615*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(7.5000004768371582031, 68.92224884033203125);
616*c8dee2aaSAndroid Build Coastguard Worker path.lineTo( 79.805633544921875, 40);
617*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(-2.7854299545288085938, 6.9635753631591796875);
618*c8dee2aaSAndroid Build Coastguard Worker
619*c8dee2aaSAndroid Build Coastguard Worker SkPaint p;
620*c8dee2aaSAndroid Build Coastguard Worker p.setColor(SK_ColorGREEN);
621*c8dee2aaSAndroid Build Coastguard Worker
622*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(20.f, 20.f);
623*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, p);
624*c8dee2aaSAndroid Build Coastguard Worker }
625*c8dee2aaSAndroid Build Coastguard Worker
626*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(b_340982297, canvas, 80, 50) {
627*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
628*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(true);
629*c8dee2aaSAndroid Build Coastguard Worker
630*c8dee2aaSAndroid Build Coastguard Worker SkPath path;
631*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(30.23983f, 48.5674667f);
632*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(1.30884242f, 45.5222702f);
633*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(2.97688866f, 29.6749554f);
634*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(17.4423828f, 31.1975555f);
635*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(2.94269657f, 30.0452003f);
636*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(4.38597536f, 11.8849154f);
637*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(33.3853493f, 14.1896257f);
638*c8dee2aaSAndroid Build Coastguard Worker path.close();
639*c8dee2aaSAndroid Build Coastguard Worker
640*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, paint);
641*c8dee2aaSAndroid Build Coastguard Worker
642*c8dee2aaSAndroid Build Coastguard Worker path.reset();
643*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(73.3853455f, 4.18963623f);
644*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(69.995636f, 39.1360626f);
645*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(42.83145142f, 21.056778f);
646*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(42.97689819f, 19.6749573f);
647*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(57.4423828f, 21.1975555f);
648*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(42.94268799f, 20.0451965f);
649*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(44.38595581f, 1.88491821f);
650*c8dee2aaSAndroid Build Coastguard Worker path.close();
651*c8dee2aaSAndroid Build Coastguard Worker
652*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPath(path, paint);
653*c8dee2aaSAndroid Build Coastguard Worker }
654