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