1aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com
2aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com/*
3aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com * Copyright 2011 Google Inc.
4aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com *
5aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
6aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com * found in the LICENSE file.
7aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com */
8aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "SampleCode.h"
9aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "SkView.h"
10aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "SkCanvas.h"
11aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "SkPath.h"
12aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com#include "SkRandom.h"
13aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com
14aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comclass HairCurvesView : public SampleView {
15aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.compublic:
16aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com    HairCurvesView() {
17aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com    }
18ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
19aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comprotected:
20aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com    // overrides from SkEventSink
21aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com    virtual bool onQuery(SkEvent* evt) {
22aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        if (SampleCode::TitleQ(*evt)) {
23aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            SampleCode::TitleR(evt, "HairCurves");
24aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            return true;
25aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        }
26aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        return this->INHERITED::onQuery(evt);
27aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com    }
28aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com
29aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com
30aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com    virtual void onDrawContent(SkCanvas* canvas) {
31aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        SkPaint paint;
32aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        paint.setAntiAlias(true);
33aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        paint.setStyle(SkPaint::kStroke_Style);
34a308883003e36cbff4d1c4c2d2e7fceb3eea95b1egdaniel@google.com        paint.setStrokeWidth(0);
35aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        canvas->save();
36aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        canvas->scale(1000 * SK_Scalar1, 1000 * SK_Scalar1);
37e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
38e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom randW;
39aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        SkPath curves;
40aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        SkPath hulls;
41aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        SkPath ctrlPts;
42aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        for (int i = 0; i < 100; ++i) {
43aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            SkScalar pts[] = {
44aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com                rand.nextUScalar1(), rand.nextUScalar1(),
45aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com                rand.nextUScalar1(), rand.nextUScalar1(),
46aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com                rand.nextUScalar1(), rand.nextUScalar1(),
47aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com                rand.nextUScalar1(), rand.nextUScalar1()
48aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            };
49aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            curves.moveTo(pts[0], pts[1]);
50aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            curves.cubicTo(pts[2], pts[3],
51aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com                         pts[4], pts[5],
52aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com                         pts[6], pts[7]);
53aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com
54aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            hulls.moveTo(pts[0], pts[1]);
55aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            hulls.lineTo(pts[2], pts[3]);
56aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            hulls.lineTo(pts[4], pts[5]);
57aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            hulls.lineTo(pts[6], pts[7]);
58aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com
59aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200);
60aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200);
61aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            ctrlPts.addCircle(pts[4], pts[5], SK_Scalar1 / 200);
62aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            ctrlPts.addCircle(pts[6], pts[7], SK_Scalar1 / 200);
63aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        }
64aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        for (int i = 0; i < 100; ++i) {
65aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            SkScalar pts[] = {
66aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com                rand.nextUScalar1(), rand.nextUScalar1(),
67aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com                rand.nextUScalar1(), rand.nextUScalar1(),
68aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com                rand.nextUScalar1(), rand.nextUScalar1(),
69aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            };
70aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            curves.moveTo(pts[0], pts[1]);
71aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            curves.quadTo(pts[2], pts[3],
72aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com                          pts[4], pts[5]);
73aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com
74aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            hulls.moveTo(pts[0], pts[1]);
75aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            hulls.lineTo(pts[2], pts[3]);
76aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            hulls.lineTo(pts[4], pts[5]);
77aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com
78aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200);
79aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200);
80aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            ctrlPts.addCircle(pts[4], pts[5], SK_Scalar1 / 200);
813f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com        }
823f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com        for (int i = 0; i < 100; ++i) {
833f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com            SkScalar pts[] = {
843f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com                rand.nextUScalar1(), rand.nextUScalar1(),
853f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com                rand.nextUScalar1(), rand.nextUScalar1(),
863f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com                rand.nextUScalar1(), rand.nextUScalar1(),
873f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com            };
883f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com            SkScalar weight = randW.nextUScalar1() * 2.0f;
893f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com
903f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com            curves.moveTo(pts[0], pts[1]);
913f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com            curves.conicTo(pts[2], pts[3],
923f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com                          pts[4], pts[5],
933f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com                          weight);
943f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com
953f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com            hulls.moveTo(pts[0], pts[1]);
963f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com            hulls.lineTo(pts[2], pts[3]);
973f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com            hulls.lineTo(pts[4], pts[5]);
983f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com
993f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com            ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200);
1003f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com            ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200);
1013f2a2d5fdc833dd20900ee90249b03474d0e00b3egdaniel@google.com            ctrlPts.addCircle(pts[4], pts[5], SK_Scalar1 / 200);
102aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        }
103aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        for (int i = 0; i < 100; ++i) {
104aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            SkScalar pts[] = {
105aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com                rand.nextUScalar1(), rand.nextUScalar1(),
106aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com                rand.nextUScalar1(), rand.nextUScalar1(),
107aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            };
108aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            curves.moveTo(pts[0], pts[1]);
109aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            curves.lineTo(pts[2], pts[3]);
110aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com
111aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200);
112aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com            ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200);
113aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        }
114aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com
115aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        paint.setColor(SK_ColorBLACK);
116aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        canvas->drawPath(curves, paint);
117aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        paint.setColor(SK_ColorRED);
118aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        //canvas->drawPath(hulls, paint);
119aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        paint.setStyle(SkPaint::kFill_Style);
120aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        paint.setColor(SK_ColorBLUE);
121aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        //canvas->drawPath(ctrlPts, paint);
122aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com
123aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com        canvas->restore();
124aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com    }
125aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com
126aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comprivate:
127aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com    typedef SampleView INHERITED;
128aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com};
129aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com
130aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com//////////////////////////////////////////////////////////////////////////////
131aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.com
132aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comstatic SkView* MyFactory() { return new HairCurvesView; }
133aeb2160b1dd34f8e640e8e56544fe407d4ff6311bsalomon@google.comstatic SkViewRegister reg(MyFactory);
134