blob: cca233a79bed438dc85a0e53a0a723db9f4967a6 [file] [log] [blame]
reed@android.com161b00b2009-11-03 15:33:14 +00001#include "SampleCode.h"
2#include "SkView.h"
3#include "SkCanvas.h"
4#include "SkDevice.h"
5#include "SkPaint.h"
6#include "SkUnitMappers.h"
7#include "SkCubicInterval.h"
8
9class UnitMapperView : public SkView {
10 SkPoint fPts[4];
11 SkMatrix fMatrix;
12public:
13 UnitMapperView() {
14 fPts[0].set(0, 0);
15 fPts[1].set(SK_Scalar1 / 3, SK_Scalar1 / 3);
16 fPts[2].set(SK_Scalar1 * 2 / 3, SK_Scalar1 * 2 / 3);
17 fPts[3].set(SK_Scalar1, SK_Scalar1);
18
19 fMatrix.setScale(SK_Scalar1 * 200, -SK_Scalar1 * 200);
20 fMatrix.postTranslate(SkIntToScalar(100), SkIntToScalar(300));
21 }
22
23protected:
24 // overrides from SkEventSink
25 virtual bool onQuery(SkEvent* evt) {
26 if (SampleCode::TitleQ(*evt)) {
27 SampleCode::TitleR(evt, "UnitMapper");
28 return true;
29 }
30 return this->INHERITED::onQuery(evt);
31 }
32
33 void drawBG(SkCanvas* canvas) {
34 canvas->drawColor(SK_ColorWHITE);
35 }
36
37 virtual void onDraw(SkCanvas* canvas) {
38 this->drawBG(canvas);
39
40 SkPaint paint;
41 paint.setAntiAlias(true);
42 paint.setColor(0xFF8888FF);
43
44 SkRect r = { 0, 0, SK_Scalar1, SK_Scalar1 };
45
46 canvas->concat(fMatrix);
47 canvas->drawRect(r, paint);
48
49 paint.setColor(SK_ColorBLACK);
50 paint.setStyle(SkPaint::kStroke_Style);
51 paint.setStrokeWidth(0);
52 paint.setStrokeCap(SkPaint::kRound_Cap);
53
54 SkPath path;
55 path.moveTo(fPts[0]);
56 path.cubicTo(fPts[1], fPts[2], fPts[3]);
57 canvas->drawPath(path, paint);
58
59 paint.setColor(SK_ColorRED);
60 paint.setStrokeWidth(0);
61 canvas->drawLine(0, 0, SK_Scalar1, SK_Scalar1, paint);
62
63 paint.setColor(SK_ColorBLUE);
64 paint.setStrokeWidth(SK_Scalar1 / 60);
65 for (int i = 0; i < 50; i++) {
66 SkScalar x = i * SK_Scalar1 / 49;
67 canvas->drawPoint(x, SkEvalCubicInterval(&fPts[1], x), paint);
68 }
69
70 paint.setStrokeWidth(SK_Scalar1 / 20);
71 paint.setColor(SK_ColorGREEN);
72 canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, &fPts[1], paint);
73 }
74
75 SkPoint invertPt(SkScalar x, SkScalar y) {
76 SkPoint pt;
77 SkMatrix m;
78 fMatrix.invert(&m);
79 m.mapXY(x, y, &pt);
80 return pt;
81 }
82
83 SkPoint* hittest(SkScalar x, SkScalar y) {
84 SkPoint target = { x, y };
85 SkPoint pts[2] = { fPts[1], fPts[2] };
86 fMatrix.mapPoints(pts, 2);
87 for (int i = 0; i < 2; i++) {
88 if (SkPoint::Distance(pts[i], target) < SkIntToScalar(4)) {
89 return &fPts[i + 1];
90 }
91 }
92 return NULL;
93 }
94
95 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
96 fDragPt = hittest(x, y);
97 return fDragPt ? new Click(this) : NULL;
98 }
99
100 virtual bool onClick(Click* click) {
101 if (fDragPt) {
102 *fDragPt = invertPt(click->fCurr.fX, click->fCurr.fY);
103 this->inval(NULL);
104 return true;
105 }
106 return false;
107 }
108
109private:
110 SkPoint* fDragPt;
111
112 typedef SkView INHERITED;
113};
114
115//////////////////////////////////////////////////////////////////////////////
116
117static SkView* MyFactory() { return new UnitMapperView; }
118static SkViewRegister reg(MyFactory);
119