blob: a02c7d0f7b4cf5e91f95df55d178d1d4d12b8724 [file] [log] [blame]
caryclarkb6474dd2016-01-19 08:07:49 -08001/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "gm.h"
9#include "SkPath.h"
10#include "SkDashPathEffect.h"
11
12int dash1[] = { 1, 1 };
13int dash2[] = { 1, 3 };
14int dash3[] = { 1, 1, 3, 3 };
15int dash4[] = { 1, 3, 2, 4 };
16
17struct DashExample {
18 int* pattern;
19 int length;
20} dashExamples[] = {
21 { dash1, SK_ARRAY_COUNT(dash1) },
22 { dash2, SK_ARRAY_COUNT(dash2) },
23 { dash3, SK_ARRAY_COUNT(dash3) },
24 { dash4, SK_ARRAY_COUNT(dash4) }
25};
26
27DEF_SIMPLE_GM(dashcircle, canvas, 900, 1200) {
28 SkPaint refPaint;
29 refPaint.setAntiAlias(true);
30 refPaint.setColor(0xFFbf3f7f);
31 refPaint.setStyle(SkPaint::kStroke_Style);
32 refPaint.setStrokeWidth(1);
33 const SkScalar radius = 125;
34 SkRect oval = SkRect::MakeLTRB(-radius - 20, -radius - 20, radius + 20, radius + 20);
35 SkPath circle;
36 circle.addCircle(0, 0, radius);
37 SkScalar circumference = radius * SK_ScalarPI * 2;
38 int wedges[] = { 6, 12, 36 };
39 canvas->translate(radius + 20, radius + 20);
40 for (int wedge : wedges) {
41 SkScalar arcLength = 360.f / wedge;
42 canvas->save();
43 for (const DashExample& dashExample : dashExamples) {
44 SkPath refPath;
45 int dashUnits = 0;
46 for (int index = 0; index < dashExample.length; ++index) {
47 dashUnits += dashExample.pattern[index];
48 }
49 SkScalar unitLength = arcLength / dashUnits;
50 SkScalar angle = 0;
51 for (int index = 0; index < wedge; ++index) {
52 for (int i2 = 0; i2 < dashExample.length; i2 += 2) {
53 SkScalar span = dashExample.pattern[i2] * unitLength;
54 refPath.moveTo(0, 0);
55 refPath.arcTo(oval, angle, span, false);
56 refPath.close();
57 angle += span + (dashExample.pattern[i2 + 1]) * unitLength;
58 }
59 }
60 canvas->drawPath(refPath, refPaint);
61 SkPaint p;
62 p.setAntiAlias(true);
63 p.setStyle(SkPaint::kStroke_Style);
64 p.setStrokeWidth(10);
65 SkScalar intervals[4];
66 int intervalCount = dashExample.length;
67 SkScalar dashLength = circumference / wedge / dashUnits;
68 for (int index = 0; index < dashExample.length; ++index) {
69 intervals[index] = dashExample.pattern[index] * dashLength;
70 }
reeda4393342016-03-18 11:22:57 -070071 p.setPathEffect(SkDashPathEffect::Make(intervals, intervalCount, 0));
caryclarkb6474dd2016-01-19 08:07:49 -080072 canvas->drawPath(circle, p);
73 canvas->translate(0, radius * 2 + 50);
74 }
75 canvas->restore();
76 canvas->translate(radius * 2 + 50, 0);
77 }
78}