Home | History | Annotate | Download | only in samplecode
      1 #include "SampleCode.h"
      2 #include "SkView.h"
      3 #include "SkCanvas.h"
      4 #include "SkConcaveToTriangles.h"
      5 
      6 #define SIZE    SkIntToScalar(150)
      7 
      8 typedef void (*PathProc)(SkPath*);
      9 
     10 static void make_path0(SkPath* path) {
     11     SkRect r;
     12     r.set(0, 0, SIZE, SIZE);
     13     path->addRect(r);
     14 }
     15 
     16 static void make_path1(SkPath* path) {
     17     SkRect r;
     18     r.set(0, 0, SIZE, SIZE);
     19     path->addRoundRect(r, SIZE/4, SIZE/4);
     20 }
     21 
     22 static void make_path2(SkPath* path) {
     23     SkRect r;
     24     r.set(0, 0, SIZE, SIZE);
     25     path->addOval(r);
     26 }
     27 
     28 static const PathProc gProcs[] = {
     29     make_path0,
     30     make_path1,
     31     make_path2,
     32 };
     33 
     34 #define COUNT_PROCS SK_ARRAY_COUNT(gProcs)
     35 
     36 class TriangleView : public SkView {
     37 public:
     38     SkPath fPaths[COUNT_PROCS];
     39 
     40 	TriangleView() {
     41         for (size_t i = 0; i < COUNT_PROCS; i++) {
     42             gProcs[i](&fPaths[i]);
     43         }
     44     }
     45 
     46 protected:
     47     // overrides from SkEventSink
     48     virtual bool onQuery(SkEvent* evt) {
     49         if (SampleCode::TitleQ(*evt)) {
     50             SampleCode::TitleR(evt, "Triangles");
     51             return true;
     52         }
     53         return this->INHERITED::onQuery(evt);
     54     }
     55 
     56     void drawBG(SkCanvas* canvas) {
     57         canvas->drawColor(SK_ColorGRAY);
     58     }
     59 
     60     static void draw_path(SkCanvas* canvas, const SkPaint& pathPaint,
     61                           const SkPath& path, const SkPaint& triPaint) {
     62         canvas->drawPath(path, pathPaint);
     63 
     64         int n = path.getPoints(NULL, 0);
     65         SkPoint* pts = new SkPoint[n];
     66         path.getPoints(pts, n);
     67 
     68         SkTDArray<SkPoint> triangles;
     69         if (SkConcaveToTriangles(n, pts, &triangles)) {
     70             canvas->drawVertices(SkCanvas::kTriangles_VertexMode,
     71                                  triangles.count(), triangles.begin(), NULL,
     72                                  NULL, NULL, NULL, 0, triPaint);
     73         }
     74 
     75         SkPaint paint;
     76         paint.setColor(SK_ColorGREEN);
     77         paint.setStrokeWidth(SkIntToScalar(4));
     78         canvas->drawPoints(SkCanvas::kPoints_PointMode, n, pts, paint);
     79         delete[] pts;
     80     }
     81 
     82     virtual void onDraw(SkCanvas* canvas) {
     83         this->drawBG(canvas);
     84 
     85         canvas->translate(SIZE/2, SIZE/2);
     86 
     87         SkPaint pathPaint, triPaint;
     88 
     89         pathPaint.setColor(SK_ColorBLUE);
     90         pathPaint.setStrokeWidth(SIZE / 12);
     91 
     92         triPaint.setColor(SK_ColorRED);
     93         triPaint.setStyle(SkPaint::kStroke_Style);
     94 
     95         for (size_t i = 0; i < COUNT_PROCS; i++) {
     96             pathPaint.setStyle(SkPaint::kFill_Style);
     97             draw_path(canvas, pathPaint, fPaths[i], triPaint);
     98 
     99             canvas->save();
    100             canvas->translate(0, SIZE * 6 / 5);
    101 
    102             pathPaint.setStyle(SkPaint::kStroke_Style);
    103             draw_path(canvas, pathPaint, fPaths[i], triPaint);
    104 
    105             canvas->restore();
    106             canvas->translate(SIZE * 6 / 5, 0);
    107         }
    108     }
    109 
    110 private:
    111     typedef SkView INHERITED;
    112 };
    113 
    114 //////////////////////////////////////////////////////////////////////////////
    115 
    116 static SkView* MyFactory() { return new TriangleView; }
    117 static SkViewRegister reg(MyFactory);
    118 
    119