155d49053d1b6db42e013eb3409ffcfc7e235c685caryclark/*
255d49053d1b6db42e013eb3409ffcfc7e235c685caryclark * Copyright 2016 Google Inc.
355d49053d1b6db42e013eb3409ffcfc7e235c685caryclark *
455d49053d1b6db42e013eb3409ffcfc7e235c685caryclark * Use of this source code is governed by a BD-style license that can be
555d49053d1b6db42e013eb3409ffcfc7e235c685caryclark * found in the LICENSE file.
655d49053d1b6db42e013eb3409ffcfc7e235c685caryclark */
755d49053d1b6db42e013eb3409ffcfc7e235c685caryclark
855d49053d1b6db42e013eb3409ffcfc7e235c685caryclark#include "gm.h"
955d49053d1b6db42e013eb3409ffcfc7e235c685caryclark#include "SkParsePath.h"
1055d49053d1b6db42e013eb3409ffcfc7e235c685caryclark#include "SkPath.h"
1155d49053d1b6db42e013eb3409ffcfc7e235c685caryclark
1255d49053d1b6db42e013eb3409ffcfc7e235c685caryclark/*
1355d49053d1b6db42e013eb3409ffcfc7e235c685caryclarkThe arcto test below should draw the same as this SVG:
1455d49053d1b6db42e013eb3409ffcfc7e235c685caryclark(Note that Skia's arcTo Direction parameter value is opposite SVG's sweep value, e.g. 0 / 1)
1555d49053d1b6db42e013eb3409ffcfc7e235c685caryclark
1655d49053d1b6db42e013eb3409ffcfc7e235c685caryclark<svg width="500" height="600">
1755d49053d1b6db42e013eb3409ffcfc7e235c685caryclark<path d="M 50,100 A50,50,   0,0,1, 150,200" style="stroke:#660000; fill:none; stroke-width:2" />
1855d49053d1b6db42e013eb3409ffcfc7e235c685caryclark<path d="M100,100 A50,100,  0,0,1, 200,200" style="stroke:#660000; fill:none; stroke-width:2" />
1955d49053d1b6db42e013eb3409ffcfc7e235c685caryclark<path d="M150,100 A50,50,  45,0,1, 250,200" style="stroke:#660000; fill:none; stroke-width:2" />
2055d49053d1b6db42e013eb3409ffcfc7e235c685caryclark<path d="M200,100 A50,100, 45,0,1, 300,200" style="stroke:#660000; fill:none; stroke-width:2" />
2155d49053d1b6db42e013eb3409ffcfc7e235c685caryclark
2255d49053d1b6db42e013eb3409ffcfc7e235c685caryclark<path d="M150,200 A50,50,   0,1,0, 150,300" style="stroke:#660000; fill:none; stroke-width:2" />
2355d49053d1b6db42e013eb3409ffcfc7e235c685caryclark<path d="M200,200 A50,100,  0,1,0, 200,300" style="stroke:#660000; fill:none; stroke-width:2" />
2455d49053d1b6db42e013eb3409ffcfc7e235c685caryclark<path d="M250,200 A50,50,  45,1,0, 250,300" style="stroke:#660000; fill:none; stroke-width:2" />
2555d49053d1b6db42e013eb3409ffcfc7e235c685caryclark<path d="M300,200 A50,100, 45,1,0, 300,300" style="stroke:#660000; fill:none; stroke-width:2" />
2655d49053d1b6db42e013eb3409ffcfc7e235c685caryclark
2755d49053d1b6db42e013eb3409ffcfc7e235c685caryclark<path d="M250,400  A120,80 0 0,0 250,500"
2855d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    fill="none" stroke="red" stroke-width="5" />
2955d49053d1b6db42e013eb3409ffcfc7e235c685caryclark
3055d49053d1b6db42e013eb3409ffcfc7e235c685caryclark<path d="M250,400  A120,80 0 1,1 250,500"
3155d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    fill="none" stroke="green" stroke-width="5"/>
3255d49053d1b6db42e013eb3409ffcfc7e235c685caryclark
3355d49053d1b6db42e013eb3409ffcfc7e235c685caryclark<path d="M250,400  A120,80 0 1,0 250,500"
3455d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    fill="none" stroke="purple" stroke-width="5"/>
3555d49053d1b6db42e013eb3409ffcfc7e235c685caryclark
3655d49053d1b6db42e013eb3409ffcfc7e235c685caryclark<path d="M250,400  A120,80 0 0,1 250,500"
3755d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    fill="none" stroke="blue" stroke-width="5"/>
38fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark
39fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark<path d="M100,100  A  0, 0 0 0,1 200,200"
40fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark    fill="none" stroke="blue" stroke-width="5" stroke-linecap="round"/>
41fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark
42fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark<path d="M200,100  A 80,80 0 0,1 200,100"
43fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark    fill="none" stroke="blue" stroke-width="5" stroke-linecap="round"/>
4455d49053d1b6db42e013eb3409ffcfc7e235c685caryclark</svg>
4555d49053d1b6db42e013eb3409ffcfc7e235c685caryclark */
4655d49053d1b6db42e013eb3409ffcfc7e235c685caryclark
4755d49053d1b6db42e013eb3409ffcfc7e235c685caryclarkDEF_SIMPLE_GM(arcto, canvas, 500, 600) {
4855d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    SkPaint paint;
4955d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    paint.setAntiAlias(true);
5055d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    paint.setStyle(SkPaint::kStroke_Style);
5155d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    paint.setStrokeWidth(2);
5255d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    paint.setColor(0xFF660000);
53fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark//    canvas->scale(2, 2);  // for testing on retina
5455d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    SkRect oval = SkRect::MakeXYWH(100, 100, 100, 100);
5555d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    SkPath svgArc;
5655d49053d1b6db42e013eb3409ffcfc7e235c685caryclark
5755d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    for (int angle = 0; angle <= 45; angle += 45) {
5855d49053d1b6db42e013eb3409ffcfc7e235c685caryclark       for (int oHeight = 2; oHeight >= 1; --oHeight) {
5955d49053d1b6db42e013eb3409ffcfc7e235c685caryclark            SkScalar ovalHeight = oval.height() / oHeight;
6055d49053d1b6db42e013eb3409ffcfc7e235c685caryclark            svgArc.moveTo(oval.fLeft, oval.fTop);
6155d49053d1b6db42e013eb3409ffcfc7e235c685caryclark            svgArc.arcTo(oval.width() / 2, ovalHeight, SkIntToScalar(angle), SkPath::kSmall_ArcSize,
6255d49053d1b6db42e013eb3409ffcfc7e235c685caryclark                    SkPath::kCW_Direction, oval.right(), oval.bottom());
6355d49053d1b6db42e013eb3409ffcfc7e235c685caryclark            canvas->drawPath(svgArc, paint);
6455d49053d1b6db42e013eb3409ffcfc7e235c685caryclark            svgArc.reset();
6555d49053d1b6db42e013eb3409ffcfc7e235c685caryclark
6655d49053d1b6db42e013eb3409ffcfc7e235c685caryclark            svgArc.moveTo(oval.fLeft + 100, oval.fTop + 100);
6755d49053d1b6db42e013eb3409ffcfc7e235c685caryclark            svgArc.arcTo(oval.width() / 2, ovalHeight, SkIntToScalar(angle), SkPath::kLarge_ArcSize,
6855d49053d1b6db42e013eb3409ffcfc7e235c685caryclark                    SkPath::kCCW_Direction, oval.right(), oval.bottom() + 100);
6955d49053d1b6db42e013eb3409ffcfc7e235c685caryclark            canvas->drawPath(svgArc, paint);
7055d49053d1b6db42e013eb3409ffcfc7e235c685caryclark            oval.offset(50, 0);
7155d49053d1b6db42e013eb3409ffcfc7e235c685caryclark            svgArc.reset();
7255d49053d1b6db42e013eb3409ffcfc7e235c685caryclark
7355d49053d1b6db42e013eb3409ffcfc7e235c685caryclark        }
7455d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    }
7555d49053d1b6db42e013eb3409ffcfc7e235c685caryclark
7655d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    paint.setStrokeWidth(5);
7755d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    const SkColor purple = 0xFF800080;
7855d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    const SkColor darkgreen = 0xFF008000;
7955d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    const SkColor colors[] = { SK_ColorRED, darkgreen, purple, SK_ColorBLUE };
8055d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    const char* arcstrs[] = {
8155d49053d1b6db42e013eb3409ffcfc7e235c685caryclark        "M250,400  A120,80 0 0,0 250,500",
8255d49053d1b6db42e013eb3409ffcfc7e235c685caryclark        "M250,400  A120,80 0 1,1 250,500",
8355d49053d1b6db42e013eb3409ffcfc7e235c685caryclark        "M250,400  A120,80 0 1,0 250,500",
8455d49053d1b6db42e013eb3409ffcfc7e235c685caryclark        "M250,400  A120,80 0 0,1 250,500"
8555d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    };
8655d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    int cIndex = 0;
8755d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    for (const char* arcstr : arcstrs) {
8855d49053d1b6db42e013eb3409ffcfc7e235c685caryclark        SkParsePath::FromSVGString(arcstr, &svgArc);
8955d49053d1b6db42e013eb3409ffcfc7e235c685caryclark        paint.setColor(colors[cIndex++]);
9055d49053d1b6db42e013eb3409ffcfc7e235c685caryclark        canvas->drawPath(svgArc, paint);
9155d49053d1b6db42e013eb3409ffcfc7e235c685caryclark    }
92fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark
93fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark    // test that zero length arcs still draw round cap
94fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark    paint.setStrokeCap(SkPaint::kRound_Cap);
95fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark    SkPath path;
96fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark    path.moveTo(100, 100);
97fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark    path.arcTo(0, 0, 0, SkPath::kLarge_ArcSize, SkPath::kCW_Direction, 200, 200);
98fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark    canvas->drawPath(path, paint);
99fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark
100fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark    path.reset();
101fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark    path.moveTo(200, 100);
102fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark    path.arcTo(80, 80, 0, SkPath::kLarge_ArcSize, SkPath::kCW_Direction, 200, 100);
103fc75253c82f838d0e687d05f5d7f82ebe6f26d5bcaryclark    canvas->drawPath(path, paint);
10455d49053d1b6db42e013eb3409ffcfc7e235c685caryclark}
105f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark
106f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark#include "random_parse_path.h"
107f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark#include "SkRandom.h"
108f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark
109f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark/* The test below generates a reference image using SVG. To compare the result for correctness,
110f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark   enable the define below and then view the generated SVG in a browser.
111f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark */
11277a5b0e1b48845c5b6715c2948df87f5df053696caryclark#define GENERATE_SVG_REFERENCE 0
113f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark
114f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark#if GENERATE_SVG_REFERENCE
115f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark#include "SkOSFile.h"
116f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark#endif
117f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark
118f1d415188ffb4c34e2886c2cfceb363a148333f1caryclarkenum {
119f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark    kParsePathTestDimension = 500
120f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark};
121f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark
122f1d415188ffb4c34e2886c2cfceb363a148333f1caryclarkDEF_SIMPLE_GM(parsedpaths, canvas, kParsePathTestDimension, kParsePathTestDimension) {
123f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark#if GENERATE_SVG_REFERENCE
124f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark    FILE* file = sk_fopen("svgout.htm", kWrite_SkFILE_Flag);
125f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark    SkString str;
126f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark    str.printf("<svg width=\"%d\" height=\"%d\">\n", kParsePathTestDimension,
127f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark            kParsePathTestDimension);
128f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark    sk_fwrite(str.c_str(), str.size(), file);
129f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark#endif
130f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark    SkRandom rand;
131f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark    SkPaint paint;
132f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark    paint.setAntiAlias(true);
133f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark    for (int xStart = 0; xStart < kParsePathTestDimension; xStart +=  100) {
134f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark        canvas->save();
135f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark        for (int yStart = 0; yStart < kParsePathTestDimension; yStart += 100) {
136f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark#if GENERATE_SVG_REFERENCE
137f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark            str.printf("<g transform='translate(%d,%d) scale(%d,%d)'>\n", xStart, yStart,
138f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                1, 1);
139f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark            sk_fwrite(str.c_str(), str.size(), file);
140f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark            str.printf("<clipPath id='clip_%d_%d'>\n", xStart, yStart);
141f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark            sk_fwrite(str.c_str(), str.size(), file);
142f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark            str.printf("<rect width='100' height='100' x='0' y='0'></rect>\n");
143f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark            sk_fwrite(str.c_str(), str.size(), file);
144f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark            str.printf("</clipPath>\n");
145f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark            sk_fwrite(str.c_str(), str.size(), file);
146f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark#endif
147f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark            int count = 3;
148f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark            do {
149f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                SkPath path;
150f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                SkString spec;
15158f4e1d2fd9d730cb207a02e3a60e09e49480d97caryclark                uint32_t y = rand.nextRangeU(30, 70);
15258f4e1d2fd9d730cb207a02e3a60e09e49480d97caryclark                uint32_t x = rand.nextRangeU(30, 70);
15358f4e1d2fd9d730cb207a02e3a60e09e49480d97caryclark                spec.printf("M %d,%d\n", x, y);
154f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                uint32_t count = rand.nextRangeU(0, 10);
155f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                for (uint32_t i = 0; i < count; ++i) {
156f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                    spec.append(MakeRandomParsePathPiece(&rand));
157f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                }
158f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                SkAssertResult(SkParsePath::FromSVGString(spec.c_str(), &path));
159f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                paint.setColor(rand.nextU());
160f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                canvas->save();
161f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                canvas->clipRect(SkRect::MakeIWH(100, 100));
162f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                canvas->drawPath(path, paint);
163f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                canvas->restore();
164f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark#if GENERATE_SVG_REFERENCE
165f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                str.printf("<path d='\n");
166f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                sk_fwrite(str.c_str(), str.size(), file);
167f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                sk_fwrite(spec.c_str(), spec.size(), file);
168f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                str.printf("\n' fill='#%06x' fill-opacity='%g'", paint.getColor() & 0xFFFFFF,
169f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                        paint.getAlpha() / 255.f);
170f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                sk_fwrite(str.c_str(), str.size(), file);
171f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                str.printf(" clip-path='url(#clip_%d_%d)'/>\n", xStart, yStart);
172f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark                sk_fwrite(str.c_str(), str.size(), file);
173f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark#endif
174f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark            } while (--count > 0);
175f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark#if GENERATE_SVG_REFERENCE
176f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark            str.printf("</g>\n");
177f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark            sk_fwrite(str.c_str(), str.size(), file);
178f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark#endif
179f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark            canvas->translate(0, 100);
180f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark        }
181f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark        canvas->restore();
182f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark        canvas->translate(100, 0);
183f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark    }
184f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark#if GENERATE_SVG_REFERENCE
185f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark    const char trailer[] = "</svg>\n";
186f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark    sk_fwrite(trailer, sizeof(trailer) - 1, file);
187f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark    sk_fclose(file);
188f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark#endif
189f1d415188ffb4c34e2886c2cfceb363a148333f1caryclark}
1901b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark
1911b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclarkDEF_SIMPLE_GM(bug593049, canvas, 300, 300) {
1921b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark    canvas->translate(111, 0);
1931b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark
1941b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark    SkPath p;
1951b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark    p.moveTo(-43.44464063610148f, 79.43535936389853f);
1961b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark    const SkScalar yOffset = 122.88f;
1971b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark    const SkScalar radius = 61.44f;
1981b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark    SkRect oval = SkRect::MakeXYWH(-radius, yOffset - radius, 2 * radius, 2 * radius);
1991b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark    p.arcTo(oval, 1.25f * 180, .5f * 180, false);
2001b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark
2011b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark    SkPaint paint;
2021b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark    paint.setStyle(SkPaint::kStroke_Style);
2031b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark    paint.setStrokeCap(SkPaint::kRound_Cap);
2041b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark    paint.setStrokeWidth(15.36f);
2051b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark
2061b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark    canvas->drawPath(p, paint);
2071b6934fcd968cf7e2d931bea3eefcd05a168ec3dcaryclark}
208eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark
209eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark#include "SkDashPathEffect.h"
210eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark#include "SkPathMeasure.h"
211eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark
212eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclarkDEF_SIMPLE_GM(bug583299, canvas, 300, 300) {
213eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark  const char* d="M60,60 A50,50 0 0 0 160,60 A50,50 0 0 0 60,60z";
214eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark  SkPaint p;
215eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark  p.setStyle(SkPaint::kStroke_Style);
216eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark  p.setStrokeWidth(100);
217eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark  p.setAntiAlias(true);
218eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark  p.setColor(0xFF008200);
219eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark  p.setStrokeCap(SkPaint::kSquare_Cap);
220eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark  SkPath path;
221eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark  SkParsePath::FromSVGString(d, &path);
222eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark  SkPathMeasure meas(path, false);
223eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark  SkScalar length = meas.getLength();
224eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark  SkScalar intervals[] = {0, length };
225eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark  int intervalCount = (int) SK_ARRAY_COUNT(intervals);
226a439334b6e758d38501e225e2e5d0ab73e2fb6ebreed  p.setPathEffect(SkDashPathEffect::Make(intervals, intervalCount, 0));
227eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark  canvas->drawPath(path, p);
228eb75c7db3a7372de68347d0df8d58acebc33a9adcaryclark}
229