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