blob: be9da8fb1dc4e88d06d799cbfda0241967cc7aa0 [file] [log] [blame]
reed@android.com9b46e772009-06-05 12:24:41 +00001#include "SampleCode.h"
2#include "SkView.h"
3#include "SkCanvas.h"
4#include "SkConcaveToTriangles.h"
5
6#define SIZE SkIntToScalar(150)
7
8typedef void (*PathProc)(SkPath*);
9
10static void make_path0(SkPath* path) {
11 SkRect r;
12 r.set(0, 0, SIZE, SIZE);
13 path->addRect(r);
14}
15
16static 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
22static void make_path2(SkPath* path) {
23 SkRect r;
24 r.set(0, 0, SIZE, SIZE);
25 path->addOval(r);
26}
27
28static const PathProc gProcs[] = {
29 make_path0,
30 make_path1,
31 make_path2,
32};
33
34#define COUNT_PROCS SK_ARRAY_COUNT(gProcs)
35
36class TriangleView : public SkView {
37public:
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
46protected:
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
110private:
111 typedef SkView INHERITED;
112};
113
114//////////////////////////////////////////////////////////////////////////////
115
116static SkView* MyFactory() { return new TriangleView; }
117static SkViewRegister reg(MyFactory);
118