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