SampleDraw.cpp revision a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6
1b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org#include "SampleCode.h"
2b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org#include "SkView.h"
3b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org#include "SkCanvas.h"
4b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org#include "SkGraphics.h"
5b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org#include "SkRandom.h"
6b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
7a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.orgstatic void test_strokerect(SkCanvas* canvas, const SkRect& r) {
8a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    SkPaint p;
9a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org
10a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    p.setAntiAlias(true);
11a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    p.setStyle(SkPaint::kStroke_Style);
12a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    p.setStrokeWidth(4);
13a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org
14a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    canvas->drawRect(r, p);
15a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org
16a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    SkPath path;
17a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    SkRect r2(r);
18a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    r2.offset(18, 0);
19a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    path.addRect(r2);
20a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org
21a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    canvas->drawPath(path, p);
22a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org}
23a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org
24a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.orgstatic void test_strokerect(SkCanvas* canvas) {
25a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    canvas->drawColor(SK_ColorWHITE);
26a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org
27a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    SkRect r;
28a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org
29a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    r.set(10, 10, 14, 14);
30a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    r.offset(0.25, 0.3333);
31a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    test_strokerect(canvas, r);
32a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    canvas->translate(0, 20);
33a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org
34a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    r.set(10, 10, 14.5f, 14.5f);
35a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    r.offset(0.25, 0.3333);
36a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    test_strokerect(canvas, r);
37a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    canvas->translate(0, 20);
38a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org
39a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    r.set(10, 10, 14.5f, 20);
40a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    r.offset(0.25, 0.3333);
41a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    test_strokerect(canvas, r);
42a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    canvas->translate(0, 20);
43a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org
44a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    r.set(10, 10, 20, 14.5f);
45a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    r.offset(0.25, 0.3333);
46a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    test_strokerect(canvas, r);
47a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    canvas->translate(0, 20);
48a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org
49a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    r.set(10, 10, 20, 20);
50a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    r.offset(0.25, 0.3333);
51a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    test_strokerect(canvas, r);
52a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org    canvas->translate(0, 20);
53a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org
54a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org}
55a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org
56b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgclass Draw : public SkRefCnt {
57b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgpublic:
58dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    Draw() : fFlags(0) {}
59dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
60dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    enum Flags {
61dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        kSelected_Flag  = 1 << 0
62dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    };
63dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    int getFlags() const { return fFlags; }
64dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    void setFlags(int flags);
65dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
66dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    bool isSelected() const { return SkToBool(fFlags & kSelected_Flag); }
67dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    void setSelected(bool pred) {
68dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        if (pred) {
69dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            fFlags |= kSelected_Flag;
70dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        } else {
71dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            fFlags &= ~kSelected_Flag;
72dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        }
73dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
74dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
75b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    void draw(SkCanvas* canvas) {
76dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        int sc = canvas->save();
77b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        this->onDraw(canvas);
78dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        canvas->restoreToCount(sc);
79dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
80dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        if (this->isSelected()) {
81dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            this->drawSelection(canvas);
82dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        }
83dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
84dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
85dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    void drawSelection(SkCanvas* canvas) {
86dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        int sc = canvas->save();
87dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        this->onDrawSelection(canvas);
88dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        canvas->restoreToCount(sc);
89dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
90dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
91dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    void getBounds(SkRect* bounds) {
92dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        this->onGetBounds(bounds);
93dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
94dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
95dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    bool hitTest(SkScalar x, SkScalar y) {
96dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        return this->onHitTest(x, y);
97dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
98dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
99dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    void offset(SkScalar dx, SkScalar dy) {
100dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        if (dx || dy) {
101dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            this->onOffset(dx, dy);
102dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        }
103b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    }
104b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
105b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgprotected:
106b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    virtual void onDraw(SkCanvas*) = 0;
107dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    virtual void onGetBounds(SkRect*) = 0;
108dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    virtual void onOffset(SkScalar dx, SkScalar dy) = 0;
109dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    virtual void onDrawSelection(SkCanvas* canvas) {
110dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        SkRect r;
111dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        this->getBounds(&r);
112dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        SkPaint paint;
113dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        SkPoint pts[4];
114dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        r.toQuad(pts);
115dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        paint.setStrokeWidth(SkIntToScalar(10));
116dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        paint.setColor(0x80FF8844);
117dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        paint.setStrokeCap(SkPaint::kRound_Cap);
118dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, pts, paint);
119dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
120dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    virtual bool onHitTest(SkScalar x, SkScalar y) {
121dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        SkRect bounds;
122dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        this->getBounds(&bounds);
123dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        return bounds.contains(x, y);
124dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
125dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
126dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.orgprivate:
127dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    int fFlags;
128b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org};
129b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
130b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgclass RDraw : public Draw {
131b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgpublic:
132b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    enum Style {
133b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        kRect_Style,
134b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        kOval_Style,
135a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org        kRRect_Style,
136a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org        kFrame_Style
137b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    };
138b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
139b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    RDraw(const SkRect& r, Style s) : fRect(r), fStyle(s) {}
140b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
141b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    void setRect(const SkRect& r) {
142b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        fRect = r;
143b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    }
144b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
145b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    void setPaint(const SkPaint& p) {
146b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        fPaint = p;
147b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    }
148b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
149b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgprotected:
150b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    virtual void onDraw(SkCanvas* canvas) {
151b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        switch (fStyle) {
152b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org            case kRect_Style:
153b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org                canvas->drawRect(fRect, fPaint);
154b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org                break;
155b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org            case kOval_Style:
156b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org                canvas->drawOval(fRect, fPaint);
157b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org                break;
158b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org            case kRRect_Style: {
159b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org                SkScalar rx = fRect.width() / 5;
160b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org                SkScalar ry = fRect.height() / 5;
161b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org                if (rx < ry) {
162b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org                    ry = rx;
163b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org                } else {
164b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org                    rx = ry;
165b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org                }
166b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org                canvas->drawRoundRect(fRect, rx, ry, fPaint);
167b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org                break;
168b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org            }
169a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org            case kFrame_Style: {
170a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org                SkPath path;
171a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org                path.addOval(fRect, SkPath::kCW_Direction);
172a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org                SkRect r = fRect;
173a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org                r.inset(fRect.width()/6, 0);
174a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org                path.addOval(r, SkPath::kCCW_Direction);
175a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org                canvas->drawPath(path, fPaint);
176a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org                break;
177a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org            }
178b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        }
179b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    }
180b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
181dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    virtual void onGetBounds(SkRect* bounds) {
182dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        *bounds = fRect;
183dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
184dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
185dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    virtual void onOffset(SkScalar dx, SkScalar dy) {
186dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        fRect.offset(dx, dy);
187dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
188dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
189b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgprivate:
190b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    SkRect  fRect;
191b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    SkPaint fPaint;
192b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    Style   fStyle;
193b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org};
194b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
195b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgclass DrawFactory {
196b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgpublic:
197b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    DrawFactory() {
198b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        fPaint.setAntiAlias(true);
199b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    }
200b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
201b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    const SkPaint& getPaint() const { return fPaint; }
202b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
203b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    void setPaint(const SkPaint& p) {
204b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        fPaint = p;
205b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    }
206b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
207b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    virtual Draw* create(const SkPoint&, const SkPoint&) = 0;
208b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
209b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgprivate:
210b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    SkPaint fPaint;
211b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org};
212b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
213b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgclass RectFactory : public DrawFactory {
214b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgpublic:
215b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    virtual Draw* create(const SkPoint& p0, const SkPoint& p1) {
216b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        SkRect r;
217b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        r.set(p0.x(), p0.y(), p1.x(), p1.y());
218b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        r.sort();
219b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
220a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org//        RDraw* d = new RDraw(r, RDraw::kRRect_Style);
221a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org        RDraw* d = new RDraw(r, RDraw::kFrame_Style);
222b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        d->setPaint(this->getPaint());
223b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        return d;
224b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    }
225b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org};
226b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
227b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgclass DrawView : public SkView {
228b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    Draw*           fDraw;
229b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    DrawFactory*    fFactory;
230b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    SkRandom        fRand;
231b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    SkTDArray<Draw*> fList;
232b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
233b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgpublic:
234b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    DrawView() : fDraw(NULL) {
235b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        fFactory = new RectFactory;
236b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    }
237b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
238b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    virtual ~DrawView() {
239b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        fList.unrefAll();
240b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        SkSafeUnref(fDraw);
241b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    }
242b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
243b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    Draw* setDraw(Draw* d) {
244b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        SkRefCnt_SafeAssign(fDraw, d);
245b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        return d;
246b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    }
247b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
248b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    SkColor randColor() {
249b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        return (SkColor)fRand.nextU() | 0xFF000000;
250b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    }
251b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
252dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    Draw* hitTestList(SkScalar x, SkScalar y) const {
253dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        Draw** first = fList.begin();
254dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        for (Draw** iter = fList.end(); iter > first;) {
255dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            --iter;
256dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            if ((*iter)->hitTest(x, y)) {
257dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                return *iter;
258dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            }
259dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        }
260dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        return NULL;
261dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org    }
262dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
263b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgprotected:
264b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    // overrides from SkEventSink
265b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    virtual bool onQuery(SkEvent* evt) {
266b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        if (SampleCode::TitleQ(*evt)) {
267b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org            SampleCode::TitleR(evt, "Draw");
268b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org            return true;
269b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        }
270b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        return this->INHERITED::onQuery(evt);
271b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    }
272b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
273b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    void drawBG(SkCanvas* canvas) {
274b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        canvas->drawColor(0xFFDDDDDD);
275b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org//        canvas->drawColor(SK_ColorWHITE);
276b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    }
277b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
278b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    virtual void onDraw(SkCanvas* canvas) {
279b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        this->drawBG(canvas);
280a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org     //   test_strokerect(canvas);
281a8282ef8f9e63e60c5665af0cdfc8fdd11c089f6mike@reedtribe.org     //   return;
282b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
283dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        for (Draw** iter = fList.begin(); iter < fList.end(); iter++) {
284b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org            (*iter)->draw(canvas);
285b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        }
286b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        if (fDraw) {
287b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org            fDraw->draw(canvas);
288b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        }
289b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    }
290b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
291b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
292dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        for (Draw** iter = fList.begin(); iter < fList.end(); iter++) {
293dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            (*iter)->setSelected(false);
294dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        }
295dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
296dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        Click* c = new Click(this);
297dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        Draw* d = this->hitTestList(x, y);
298dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        if (d) {
299dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            d->setSelected(true);
300dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            c->setType("dragger");
301dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        } else {
302dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            c->setType("maker");
303dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        }
304dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        return c;
305b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    }
306b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
307b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    virtual bool onClick(Click* click) {
308b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        if (Click::kUp_State == click->fState) {
309dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            if (click->isType("maker")) {
310dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                if (SkPoint::Distance(click->fOrig, click->fCurr) > SkIntToScalar(3)) {
311dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                    *fList.append() = fDraw;
312dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                } else {
313dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                    fDraw->unref();
314dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                }
315dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                fDraw = NULL;
316dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            }
317b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org            return true;
318b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        }
319b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
320b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        if (Click::kDown_State == click->fState) {
321b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org            SkPaint p = fFactory->getPaint();
322b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org            p.setColor(this->randColor());
323b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org            fFactory->setPaint(p);
324b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        }
325dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org
326dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        if (click->isType("maker")) {
327dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            this->setDraw(fFactory->create(click->fOrig, click->fCurr))->unref();
328dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        } else if (click->isType("dragger")) {
329dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            for (Draw** iter = fList.begin(); iter < fList.end(); iter++) {
330dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                if ((*iter)->isSelected()) {
331dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                    (*iter)->offset(click->fCurr.x() - click->fPrev.x(),
332dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                                    click->fCurr.y() - click->fPrev.y());
333dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org                }
334dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org            }
335dd0cd34067d103ace7c6739405cb7885d8ad3fb2mike@reedtribe.org        }
336b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        this->inval(NULL);
337b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org        return true;
338b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    }
339b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
340b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgprivate:
341b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org    typedef SkView INHERITED;
342b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org};
343b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
344b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org//////////////////////////////////////////////////////////////////////////////
345b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
346b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgstatic SkView* MyFactory() { return new DrawView; }
347b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.orgstatic SkViewRegister reg(MyFactory);
348b7d956df4665e06f3ae98cb696cef7c04452ab8emike@reedtribe.org
349