blob: d7e8dce4a3591b739b519a004f23c7ad61ba23f1 [file] [log] [blame]
mike@reedtribe.orgb7d956d2011-03-20 20:19:16 +00001#include "SampleCode.h"
2#include "SkView.h"
3#include "SkCanvas.h"
4#include "SkGraphics.h"
5#include "SkRandom.h"
6
7class Draw : public SkRefCnt {
8public:
9 void draw(SkCanvas* canvas) {
10 this->onDraw(canvas);
11 }
12
13protected:
14 virtual void onDraw(SkCanvas*) = 0;
15};
16
17class RDraw : public Draw {
18public:
19 enum Style {
20 kRect_Style,
21 kOval_Style,
22 kRRect_Style
23 };
24
25 RDraw(const SkRect& r, Style s) : fRect(r), fStyle(s) {}
26
27 void setRect(const SkRect& r) {
28 fRect = r;
29 }
30
31 void setPaint(const SkPaint& p) {
32 fPaint = p;
33 }
34
35protected:
36 virtual void onDraw(SkCanvas* canvas) {
37 switch (fStyle) {
38 case kRect_Style:
39 canvas->drawRect(fRect, fPaint);
40 break;
41 case kOval_Style:
42 canvas->drawOval(fRect, fPaint);
43 break;
44 case kRRect_Style: {
45 SkScalar rx = fRect.width() / 5;
46 SkScalar ry = fRect.height() / 5;
47 if (rx < ry) {
48 ry = rx;
49 } else {
50 rx = ry;
51 }
52 canvas->drawRoundRect(fRect, rx, ry, fPaint);
53 break;
54 }
55 }
56 }
57
58private:
59 SkRect fRect;
60 SkPaint fPaint;
61 Style fStyle;
62};
63
64class DrawFactory {
65public:
66 DrawFactory() {
67 fPaint.setAntiAlias(true);
68 }
69
70 const SkPaint& getPaint() const { return fPaint; }
71
72 void setPaint(const SkPaint& p) {
73 fPaint = p;
74 }
75
76 virtual Draw* create(const SkPoint&, const SkPoint&) = 0;
77
78private:
79 SkPaint fPaint;
80};
81
82class RectFactory : public DrawFactory {
83public:
84 virtual Draw* create(const SkPoint& p0, const SkPoint& p1) {
85 SkRect r;
86 r.set(p0.x(), p0.y(), p1.x(), p1.y());
87 r.sort();
88
89 RDraw* d = new RDraw(r, RDraw::kRRect_Style);
90 d->setPaint(this->getPaint());
91 return d;
92 }
93};
94
95class DrawView : public SkView {
96 Draw* fDraw;
97 DrawFactory* fFactory;
98 SkRandom fRand;
99 SkTDArray<Draw*> fList;
100
101public:
102 DrawView() : fDraw(NULL) {
103 fFactory = new RectFactory;
104 }
105
106 virtual ~DrawView() {
107 fList.unrefAll();
108 SkSafeUnref(fDraw);
109 }
110
111 Draw* setDraw(Draw* d) {
112 SkRefCnt_SafeAssign(fDraw, d);
113 return d;
114 }
115
116 SkColor randColor() {
117 return (SkColor)fRand.nextU() | 0xFF000000;
118 }
119
120protected:
121 // overrides from SkEventSink
122 virtual bool onQuery(SkEvent* evt) {
123 if (SampleCode::TitleQ(*evt)) {
124 SampleCode::TitleR(evt, "Draw");
125 return true;
126 }
127 return this->INHERITED::onQuery(evt);
128 }
129
130 void drawBG(SkCanvas* canvas) {
131 canvas->drawColor(0xFFDDDDDD);
132// canvas->drawColor(SK_ColorWHITE);
133 }
134
135 virtual void onDraw(SkCanvas* canvas) {
136 this->drawBG(canvas);
137
138 Draw** iter = fList.begin();
139 Draw** stop = fList.end();
140 for (; iter < stop; iter++) {
141 (*iter)->draw(canvas);
142 }
143 if (fDraw) {
144 fDraw->draw(canvas);
145 }
146 }
147
148 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
149 return new Click(this);
150 }
151
152 virtual bool onClick(Click* click) {
153 if (Click::kUp_State == click->fState) {
154 *fList.append() = fDraw;
155 fDraw = NULL;
156 return true;
157 }
158
159 if (Click::kDown_State == click->fState) {
160 SkPaint p = fFactory->getPaint();
161 p.setColor(this->randColor());
162 fFactory->setPaint(p);
163 }
164 this->setDraw(fFactory->create(click->fOrig, click->fCurr))->unref();
165 this->inval(NULL);
166 return true;
167 }
168
169private:
170 typedef SkView INHERITED;
171};
172
173//////////////////////////////////////////////////////////////////////////////
174
175static SkView* MyFactory() { return new DrawView; }
176static SkViewRegister reg(MyFactory);
177