1 
2 /*
3  * Copyright 2011 Google Inc.
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 #include "SampleCode.h"
9 #include "SkView.h"
10 #include "SkCanvas.h"
11 #include "SkPath.h"
12 #include "SkRandom.h"
13 
14 class HairCurvesView : public SampleView {
15 public:
HairCurvesView()16     HairCurvesView() {
17     }
18 
19 protected:
20     // overrides from SkEventSink
onQuery(SkEvent * evt)21     virtual bool onQuery(SkEvent* evt) {
22         if (SampleCode::TitleQ(*evt)) {
23             SampleCode::TitleR(evt, "HairCurves");
24             return true;
25         }
26         return this->INHERITED::onQuery(evt);
27     }
28 
29 
onDrawContent(SkCanvas * canvas)30     virtual void onDrawContent(SkCanvas* canvas) {
31         SkPaint paint;
32         paint.setAntiAlias(true);
33         paint.setStyle(SkPaint::kStroke_Style);
34         paint.setStrokeWidth(0);
35         canvas->save();
36         canvas->scale(1000 * SK_Scalar1, 1000 * SK_Scalar1);
37         SkRandom rand;
38         SkRandom randW;
39         SkPath curves;
40         SkPath hulls;
41         SkPath ctrlPts;
42         for (int i = 0; i < 100; ++i) {
43             SkScalar pts[] = {
44                 rand.nextUScalar1(), rand.nextUScalar1(),
45                 rand.nextUScalar1(), rand.nextUScalar1(),
46                 rand.nextUScalar1(), rand.nextUScalar1(),
47                 rand.nextUScalar1(), rand.nextUScalar1()
48             };
49             curves.moveTo(pts[0], pts[1]);
50             curves.cubicTo(pts[2], pts[3],
51                          pts[4], pts[5],
52                          pts[6], pts[7]);
53 
54             hulls.moveTo(pts[0], pts[1]);
55             hulls.lineTo(pts[2], pts[3]);
56             hulls.lineTo(pts[4], pts[5]);
57             hulls.lineTo(pts[6], pts[7]);
58 
59             ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200);
60             ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200);
61             ctrlPts.addCircle(pts[4], pts[5], SK_Scalar1 / 200);
62             ctrlPts.addCircle(pts[6], pts[7], SK_Scalar1 / 200);
63         }
64         for (int i = 0; i < 100; ++i) {
65             SkScalar pts[] = {
66                 rand.nextUScalar1(), rand.nextUScalar1(),
67                 rand.nextUScalar1(), rand.nextUScalar1(),
68                 rand.nextUScalar1(), rand.nextUScalar1(),
69             };
70             curves.moveTo(pts[0], pts[1]);
71             curves.quadTo(pts[2], pts[3],
72                           pts[4], pts[5]);
73 
74             hulls.moveTo(pts[0], pts[1]);
75             hulls.lineTo(pts[2], pts[3]);
76             hulls.lineTo(pts[4], pts[5]);
77 
78             ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200);
79             ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200);
80             ctrlPts.addCircle(pts[4], pts[5], SK_Scalar1 / 200);
81         }
82         for (int i = 0; i < 100; ++i) {
83             SkScalar pts[] = {
84                 rand.nextUScalar1(), rand.nextUScalar1(),
85                 rand.nextUScalar1(), rand.nextUScalar1(),
86                 rand.nextUScalar1(), rand.nextUScalar1(),
87             };
88             SkScalar weight = randW.nextUScalar1() * 2.0f;
89 
90             curves.moveTo(pts[0], pts[1]);
91             curves.conicTo(pts[2], pts[3],
92                           pts[4], pts[5],
93                           weight);
94 
95             hulls.moveTo(pts[0], pts[1]);
96             hulls.lineTo(pts[2], pts[3]);
97             hulls.lineTo(pts[4], pts[5]);
98 
99             ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200);
100             ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200);
101             ctrlPts.addCircle(pts[4], pts[5], SK_Scalar1 / 200);
102         }
103         for (int i = 0; i < 100; ++i) {
104             SkScalar pts[] = {
105                 rand.nextUScalar1(), rand.nextUScalar1(),
106                 rand.nextUScalar1(), rand.nextUScalar1(),
107             };
108             curves.moveTo(pts[0], pts[1]);
109             curves.lineTo(pts[2], pts[3]);
110 
111             ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200);
112             ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200);
113         }
114 
115         paint.setColor(SK_ColorBLACK);
116         canvas->drawPath(curves, paint);
117         paint.setColor(SK_ColorRED);
118         //canvas->drawPath(hulls, paint);
119         paint.setStyle(SkPaint::kFill_Style);
120         paint.setColor(SK_ColorBLUE);
121         //canvas->drawPath(ctrlPts, paint);
122 
123         canvas->restore();
124     }
125 
126 private:
127     typedef SampleView INHERITED;
128 };
129 
130 //////////////////////////////////////////////////////////////////////////////
131 
MyFactory()132 static SkView* MyFactory() { return new HairCurvesView; }
133 static SkViewRegister reg(MyFactory);
134