Home | History | Annotate | Download | only in samplecode
      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:
     16     HairCurvesView() {
     17     }
     18 
     19 protected:
     20     // overrides from SkEventSink
     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 
     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 
    132 static SkView* MyFactory() { return new HairCurvesView; }
    133 static SkViewRegister reg(MyFactory);
    134