/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SampleCode.h" #include "SkView.h" #include "SkCanvas.h" #include "SkConcaveToTriangles.h" #define SIZE SkIntToScalar(150) typedef void (*PathProc)(SkPath*); static void make_path0(SkPath* path) { SkRect r; r.set(0, 0, SIZE, SIZE); path->addRect(r); } static void make_path1(SkPath* path) { SkRect r; r.set(0, 0, SIZE, SIZE); path->addRoundRect(r, SIZE/4, SIZE/4); } static void make_path2(SkPath* path) { SkRect r; r.set(0, 0, SIZE, SIZE); path->addOval(r); } static const PathProc gProcs[] = { make_path0, make_path1, make_path2, }; #define COUNT_PROCS SK_ARRAY_COUNT(gProcs) class TriangleView : public SkView { public: SkPath fPaths[COUNT_PROCS]; TriangleView() { for (size_t i = 0; i < COUNT_PROCS; i++) { gProcs[i](&fPaths[i]); } } protected: // overrides from SkEventSink virtual bool onQuery(SkEvent* evt) { if (SampleCode::TitleQ(*evt)) { SampleCode::TitleR(evt, "Triangles"); return true; } return this->INHERITED::onQuery(evt); } void drawBG(SkCanvas* canvas) { canvas->drawColor(SK_ColorGRAY); } static void draw_path(SkCanvas* canvas, const SkPaint& pathPaint, const SkPath& path, const SkPaint& triPaint) { canvas->drawPath(path, pathPaint); int n = path.getPoints(NULL, 0); SkPoint* pts = new SkPoint[n]; path.getPoints(pts, n); SkTDArray triangles; if (SkConcaveToTriangles(n, pts, &triangles)) { canvas->drawVertices(SkCanvas::kTriangles_VertexMode, triangles.count(), triangles.begin(), NULL, NULL, NULL, NULL, 0, triPaint); } SkPaint paint; paint.setColor(SK_ColorGREEN); paint.setStrokeWidth(SkIntToScalar(4)); canvas->drawPoints(SkCanvas::kPoints_PointMode, n, pts, paint); delete[] pts; } virtual void onDraw(SkCanvas* canvas) { this->drawBG(canvas); canvas->translate(SIZE/2, SIZE/2); SkPaint pathPaint, triPaint; pathPaint.setColor(SK_ColorBLUE); pathPaint.setStrokeWidth(SIZE / 12); triPaint.setColor(SK_ColorRED); triPaint.setStyle(SkPaint::kStroke_Style); for (size_t i = 0; i < COUNT_PROCS; i++) { pathPaint.setStyle(SkPaint::kFill_Style); draw_path(canvas, pathPaint, fPaths[i], triPaint); canvas->save(); canvas->translate(0, SIZE * 6 / 5); pathPaint.setStyle(SkPaint::kStroke_Style); draw_path(canvas, pathPaint, fPaths[i], triPaint); canvas->restore(); canvas->translate(SIZE * 6 / 5, 0); } } private: typedef SkView INHERITED; }; ////////////////////////////////////////////////////////////////////////////// static SkView* MyFactory() { return new TriangleView; } static SkViewRegister reg(MyFactory);