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