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 
      9 #include "SampleCode.h"
     10 #include "SkView.h"
     11 #include "SkCanvas.h"
     12 #include "SkGradientShader.h"
     13 #include "SkGraphics.h"
     14 #include "SkImageDecoder.h"
     15 #include "SkPath.h"
     16 #include "SkRegion.h"
     17 #include "SkShader.h"
     18 #include "SkUtils.h"
     19 #include "SkXfermode.h"
     20 #include "SkColorPriv.h"
     21 #include "SkColorFilter.h"
     22 #include "SkParsePath.h"
     23 #include "SkTime.h"
     24 #include "SkTypeface.h"
     25 
     26 #include "SkGeometry.h"
     27 
     28 class ConcavePathView : public SampleView {
     29 public:
     30     ConcavePathView() {}
     31 
     32 protected:
     33     // overrides from SkEventSink
     34     virtual bool onQuery(SkEvent* evt) {
     35         if (SampleCode::TitleQ(*evt)) {
     36             SampleCode::TitleR(evt, "ConcavePaths");
     37             return true;
     38         }
     39         return this->INHERITED::onQuery(evt);
     40     }
     41 
     42     virtual void onDrawContent(SkCanvas* canvas) {
     43         SkPaint paint;
     44 
     45         paint.setAntiAlias(true);
     46         paint.setStyle(SkPaint::kFill_Style);
     47 
     48         // Concave test
     49         if (1) {
     50             SkPath path;
     51             canvas->translate(0, 0);
     52             path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
     53             path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
     54             path.lineTo(SkIntToScalar(30), SkIntToScalar(30));
     55             path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
     56             canvas->drawPath(path, paint);
     57         }
     58         // Reverse concave test
     59         if (1) {
     60             SkPath path;
     61             canvas->save();
     62             canvas->translate(100, 0);
     63             path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
     64             path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
     65             path.lineTo(SkIntToScalar(30), SkIntToScalar(30));
     66             path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
     67             canvas->drawPath(path, paint);
     68             canvas->restore();
     69         }
     70         // Bowtie (intersection)
     71         if (1) {
     72             SkPath path;
     73             canvas->save();
     74             canvas->translate(200, 0);
     75             path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
     76             path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
     77             path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
     78             path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
     79             canvas->drawPath(path, paint);
     80             canvas->restore();
     81         }
     82         // "fake" bowtie (concave, but no intersection)
     83         if (1) {
     84             SkPath path;
     85             canvas->save();
     86             canvas->translate(300, 0);
     87             path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
     88             path.lineTo(SkIntToScalar(50), SkIntToScalar(40));
     89             path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
     90             path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
     91             path.lineTo(SkIntToScalar(50), SkIntToScalar(60));
     92             path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
     93             canvas->drawPath(path, paint);
     94             canvas->restore();
     95         }
     96         // Fish test (intersection/concave)
     97         if (1) {
     98             SkPath path;
     99             canvas->save();
    100             canvas->translate(0, 100);
    101             path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
    102             path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
    103             path.lineTo(SkIntToScalar(70), SkIntToScalar(50));
    104             path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
    105             path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
    106             path.lineTo(SkIntToScalar(0), SkIntToScalar(50));
    107             canvas->drawPath(path, paint);
    108             canvas->restore();
    109         }
    110         // Collinear test
    111         if (1) {
    112             SkPath path;
    113             canvas->save();
    114             canvas->translate(100, 100);
    115             path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
    116             path.lineTo(SkIntToScalar(50), SkIntToScalar(20));
    117             path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
    118             path.lineTo(SkIntToScalar(50), SkIntToScalar(80));
    119             canvas->drawPath(path, paint);
    120             canvas->restore();
    121         }
    122         // Hole test
    123         if (1) {
    124             SkPath path;
    125             canvas->save();
    126             canvas->translate(200, 100);
    127             path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
    128             path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
    129             path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
    130             path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
    131             path.moveTo(SkIntToScalar(30), SkIntToScalar(30));
    132             path.lineTo(SkIntToScalar(30), SkIntToScalar(70));
    133             path.lineTo(SkIntToScalar(70), SkIntToScalar(70));
    134             path.lineTo(SkIntToScalar(70), SkIntToScalar(30));
    135             canvas->drawPath(path, paint);
    136             canvas->restore();
    137         }
    138     }
    139 
    140     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
    141                                               unsigned modi) {
    142         this->inval(NULL);
    143         return this->INHERITED::onFindClickHandler(x, y, modi);
    144     }
    145 
    146 private:
    147     typedef SampleView INHERITED;
    148 };
    149 
    150 //////////////////////////////////////////////////////////////////////////////
    151 
    152 static SkView* MyFactory() { return new ConcavePathView; }
    153 static SkViewRegister reg(MyFactory);
    154