aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/dashcircle.cpp
blob: cddd913723128addbd8ea25fb7720607064e1fd5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "gm.h"
#include "SkPath.h"
#include "SkDashPathEffect.h"

int dash1[] = { 1, 1 };
int dash2[] = { 1, 3 };
int dash3[] = { 1, 1, 3, 3 };
int dash4[] = { 1, 3, 2, 4 };

struct DashExample {
    int* pattern;
    int length;
} dashExamples[] = {
    { dash1, SK_ARRAY_COUNT(dash1) },
    { dash2, SK_ARRAY_COUNT(dash2) },
    { dash3, SK_ARRAY_COUNT(dash3) },
    { dash4, SK_ARRAY_COUNT(dash4) }
};

DEF_SIMPLE_GM(dashcircle, canvas, 900, 1200) {
    SkPaint refPaint;
    refPaint.setAntiAlias(true);
    refPaint.setColor(0xFFbf3f7f);
    refPaint.setStyle(SkPaint::kStroke_Style);
    refPaint.setStrokeWidth(1);
    const SkScalar radius = 125;
    SkRect oval = SkRect::MakeLTRB(-radius - 20, -radius - 20, radius + 20, radius + 20);
    SkPath circle;
    circle.addCircle(0, 0, radius);
    SkScalar circumference = radius * SK_ScalarPI * 2;
    int wedges[] = { 6, 12, 36 };
    canvas->translate(radius + 20, radius + 20);
    for (int wedge : wedges) {
        SkScalar arcLength = 360.f / wedge;
        canvas->save();
        for (const DashExample& dashExample : dashExamples) {
            SkPath refPath;
            int dashUnits = 0;
            for (int index = 0; index < dashExample.length; ++index) {
                dashUnits += dashExample.pattern[index];
            }
            SkScalar unitLength = arcLength / dashUnits;
            SkScalar angle = 0;
            for (int index = 0; index < wedge; ++index) {
                for (int i2 = 0; i2 < dashExample.length; i2 += 2) {
                    SkScalar span = dashExample.pattern[i2] * unitLength;
                    refPath.moveTo(0, 0);
                    refPath.arcTo(oval, angle, span, false);
                    refPath.close();
                    angle += span + (dashExample.pattern[i2 + 1]) * unitLength;
                }
            }
            canvas->drawPath(refPath, refPaint);
            SkPaint p;
            p.setAntiAlias(true);
            p.setStyle(SkPaint::kStroke_Style);
            p.setStrokeWidth(10);
            SkScalar intervals[4];
            int intervalCount = dashExample.length;
            SkScalar dashLength = circumference / wedge / dashUnits;
            for (int index = 0; index < dashExample.length; ++index) {
                intervals[index] = dashExample.pattern[index] * dashLength;
            }
            p.setPathEffect(SkDashPathEffect::Create(intervals, intervalCount, 0))->unref();
            canvas->drawPath(circle, p);
            canvas->translate(0, radius * 2 + 50);
        }
        canvas->restore();
        canvas->translate(radius * 2  + 50, 0);
    }
}