blob: e045d965eef4acffa8e1050ae8702666c79062c8 [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
reed@android.com562ea922010-02-08 21:45:03 +00009#include "SkWidgetViews.h"
10
11static SkStaticTextView* make_textview(SkView* parent,
12 const SkRect& bounds,
13 const SkPaint& paint) {
14 SkStaticTextView* view = new SkStaticTextView;
15 view->setMode(SkStaticTextView::kFixedSize_Mode);
16 view->setPaint(paint);
17 view->setVisibleP(true);
18 view->setSize(bounds.width(), bounds.height());
19 view->setLoc(bounds.fLeft, bounds.fTop);
20 parent->attachChildToFront(view)->unref();
21 return view;
22}
23
24static void set_scalar(SkStaticTextView* view, SkScalar value) {
25 SkString str;
26 str.appendScalar(value);
27 view->setText(str);
28}
29
reed@android.com161b00b2009-11-03 15:33:14 +000030class UnitMapperView : public SkView {
31 SkPoint fPts[4];
32 SkMatrix fMatrix;
reed@android.com562ea922010-02-08 21:45:03 +000033 SkStaticTextView* fViews[4];
34
35 void setViews() {
36 set_scalar(fViews[0], fPts[1].fX);
37 set_scalar(fViews[1], fPts[1].fY);
38 set_scalar(fViews[2], fPts[2].fX);
39 set_scalar(fViews[3], fPts[2].fY);
40 }
41
reed@android.com161b00b2009-11-03 15:33:14 +000042public:
43 UnitMapperView() {
44 fPts[0].set(0, 0);
45 fPts[1].set(SK_Scalar1 / 3, SK_Scalar1 / 3);
46 fPts[2].set(SK_Scalar1 * 2 / 3, SK_Scalar1 * 2 / 3);
47 fPts[3].set(SK_Scalar1, SK_Scalar1);
48
49 fMatrix.setScale(SK_Scalar1 * 200, -SK_Scalar1 * 200);
50 fMatrix.postTranslate(SkIntToScalar(100), SkIntToScalar(300));
reed@android.com562ea922010-02-08 21:45:03 +000051
52 SkRect r = {
53 SkIntToScalar(350), SkIntToScalar(100),
54 SkIntToScalar(500), SkIntToScalar(130)
55 };
56 SkPaint paint;
57 paint.setAntiAlias(true);
58 paint.setTextSize(SkIntToScalar(25));
59 for (int i = 0; i < 4; i++) {
60 fViews[i] = make_textview(this, r, paint);
61 r.offset(0, r.height());
62 }
63 this->setViews();
reed@android.com161b00b2009-11-03 15:33:14 +000064 }
65
66protected:
67 // overrides from SkEventSink
68 virtual bool onQuery(SkEvent* evt) {
69 if (SampleCode::TitleQ(*evt)) {
70 SampleCode::TitleR(evt, "UnitMapper");
71 return true;
72 }
73 return this->INHERITED::onQuery(evt);
74 }
75
76 void drawBG(SkCanvas* canvas) {
77 canvas->drawColor(SK_ColorWHITE);
78 }
79
80 virtual void onDraw(SkCanvas* canvas) {
81 this->drawBG(canvas);
82
83 SkPaint paint;
84 paint.setAntiAlias(true);
85 paint.setColor(0xFF8888FF);
86
87 SkRect r = { 0, 0, SK_Scalar1, SK_Scalar1 };
88
89 canvas->concat(fMatrix);
90 canvas->drawRect(r, paint);
91
92 paint.setColor(SK_ColorBLACK);
93 paint.setStyle(SkPaint::kStroke_Style);
94 paint.setStrokeWidth(0);
95 paint.setStrokeCap(SkPaint::kRound_Cap);
96
97 SkPath path;
98 path.moveTo(fPts[0]);
99 path.cubicTo(fPts[1], fPts[2], fPts[3]);
100 canvas->drawPath(path, paint);
101
102 paint.setColor(SK_ColorRED);
103 paint.setStrokeWidth(0);
104 canvas->drawLine(0, 0, SK_Scalar1, SK_Scalar1, paint);
105
106 paint.setColor(SK_ColorBLUE);
107 paint.setStrokeWidth(SK_Scalar1 / 60);
108 for (int i = 0; i < 50; i++) {
109 SkScalar x = i * SK_Scalar1 / 49;
110 canvas->drawPoint(x, SkEvalCubicInterval(&fPts[1], x), paint);
111 }
112
113 paint.setStrokeWidth(SK_Scalar1 / 20);
114 paint.setColor(SK_ColorGREEN);
115 canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, &fPts[1], paint);
116 }
117
118 SkPoint invertPt(SkScalar x, SkScalar y) {
119 SkPoint pt;
120 SkMatrix m;
121 fMatrix.invert(&m);
122 m.mapXY(x, y, &pt);
123 return pt;
124 }
125
reed@android.com562ea922010-02-08 21:45:03 +0000126 int hittest(SkScalar x, SkScalar y) {
reed@android.com161b00b2009-11-03 15:33:14 +0000127 SkPoint target = { x, y };
128 SkPoint pts[2] = { fPts[1], fPts[2] };
129 fMatrix.mapPoints(pts, 2);
130 for (int i = 0; i < 2; i++) {
131 if (SkPoint::Distance(pts[i], target) < SkIntToScalar(4)) {
reed@android.com562ea922010-02-08 21:45:03 +0000132 return i + 1;
reed@android.com161b00b2009-11-03 15:33:14 +0000133 }
134 }
reed@android.com562ea922010-02-08 21:45:03 +0000135 return -1;
reed@android.com161b00b2009-11-03 15:33:14 +0000136 }
137
138 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
reed@android.com562ea922010-02-08 21:45:03 +0000139 fDragIndex = hittest(x, y);
140 return fDragIndex >= 0 ? new Click(this) : NULL;
reed@android.com161b00b2009-11-03 15:33:14 +0000141 }
142
143 virtual bool onClick(Click* click) {
reed@android.com562ea922010-02-08 21:45:03 +0000144 if (fDragIndex >= 0) {
145 fPts[fDragIndex] = invertPt(click->fCurr.fX, click->fCurr.fY);
146 this->setViews();
reed@android.com161b00b2009-11-03 15:33:14 +0000147 this->inval(NULL);
148 return true;
149 }
150 return false;
151 }
152
153private:
reed@android.com562ea922010-02-08 21:45:03 +0000154 int fDragIndex;
reed@android.com161b00b2009-11-03 15:33:14 +0000155
156 typedef SkView INHERITED;
157};
158
159//////////////////////////////////////////////////////////////////////////////
160
161static SkView* MyFactory() { return new UnitMapperView; }
162static SkViewRegister reg(MyFactory);
163