1/*
2 * Copyright 2011 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#include "include/core/SkCanvas.h"
8#include "include/core/SkPath.h"
9#include "include/utils/SkRandom.h"
10#include "samplecode/Sample.h"
11
12class HairCurvesView : public Sample {
13public:
14    HairCurvesView() {
15    }
16
17protected:
18    SkString name() override { return SkString("HairCurves"); }
19
20    void onDrawContent(SkCanvas* canvas) override {
21        SkPaint paint;
22        paint.setAntiAlias(true);
23        paint.setStyle(SkPaint::kStroke_Style);
24        paint.setStrokeWidth(0);
25        canvas->save();
26        canvas->scale(1000 * SK_Scalar1, 1000 * SK_Scalar1);
27        SkRandom rand;
28        SkRandom randW;
29        SkPath curves;
30        SkPath hulls;
31        SkPath ctrlPts;
32        for (int i = 0; i < 100; ++i) {
33            SkScalar pts[] = {
34                rand.nextUScalar1(), rand.nextUScalar1(),
35                rand.nextUScalar1(), rand.nextUScalar1(),
36                rand.nextUScalar1(), rand.nextUScalar1(),
37                rand.nextUScalar1(), rand.nextUScalar1()
38            };
39            curves.moveTo(pts[0], pts[1]);
40            curves.cubicTo(pts[2], pts[3],
41                         pts[4], pts[5],
42                         pts[6], pts[7]);
43
44            hulls.moveTo(pts[0], pts[1]);
45            hulls.lineTo(pts[2], pts[3]);
46            hulls.lineTo(pts[4], pts[5]);
47            hulls.lineTo(pts[6], pts[7]);
48
49            ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200);
50            ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200);
51            ctrlPts.addCircle(pts[4], pts[5], SK_Scalar1 / 200);
52            ctrlPts.addCircle(pts[6], pts[7], SK_Scalar1 / 200);
53        }
54        for (int i = 0; i < 100; ++i) {
55            SkScalar pts[] = {
56                rand.nextUScalar1(), rand.nextUScalar1(),
57                rand.nextUScalar1(), rand.nextUScalar1(),
58                rand.nextUScalar1(), rand.nextUScalar1(),
59            };
60            curves.moveTo(pts[0], pts[1]);
61            curves.quadTo(pts[2], pts[3],
62                          pts[4], pts[5]);
63
64            hulls.moveTo(pts[0], pts[1]);
65            hulls.lineTo(pts[2], pts[3]);
66            hulls.lineTo(pts[4], pts[5]);
67
68            ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200);
69            ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200);
70            ctrlPts.addCircle(pts[4], pts[5], SK_Scalar1 / 200);
71        }
72        for (int i = 0; i < 100; ++i) {
73            SkScalar pts[] = {
74                rand.nextUScalar1(), rand.nextUScalar1(),
75                rand.nextUScalar1(), rand.nextUScalar1(),
76                rand.nextUScalar1(), rand.nextUScalar1(),
77            };
78            SkScalar weight = randW.nextUScalar1() * 2.0f;
79
80            curves.moveTo(pts[0], pts[1]);
81            curves.conicTo(pts[2], pts[3],
82                          pts[4], pts[5],
83                          weight);
84
85            hulls.moveTo(pts[0], pts[1]);
86            hulls.lineTo(pts[2], pts[3]);
87            hulls.lineTo(pts[4], pts[5]);
88
89            ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200);
90            ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200);
91            ctrlPts.addCircle(pts[4], pts[5], SK_Scalar1 / 200);
92        }
93        for (int i = 0; i < 100; ++i) {
94            SkScalar pts[] = {
95                rand.nextUScalar1(), rand.nextUScalar1(),
96                rand.nextUScalar1(), rand.nextUScalar1(),
97            };
98            curves.moveTo(pts[0], pts[1]);
99            curves.lineTo(pts[2], pts[3]);
100
101            ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200);
102            ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200);
103        }
104
105        paint.setColor(SK_ColorBLACK);
106        canvas->drawPath(curves, paint);
107        paint.setColor(SK_ColorRED);
108        //canvas->drawPath(hulls, paint);
109        paint.setStyle(SkPaint::kFill_Style);
110        paint.setColor(SK_ColorBLUE);
111        //canvas->drawPath(ctrlPts, paint);
112
113        canvas->restore();
114    }
115
116private:
117    using INHERITED = Sample;
118};
119
120//////////////////////////////////////////////////////////////////////////////
121
122DEF_SAMPLE( return new HairCurvesView(); )
123