Index: samplecode/SampleUnitMapper.cpp |
diff --git a/samplecode/SampleUnitMapper.cpp b/samplecode/SampleUnitMapper.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..db9af09f38f22d6d0f418efce62115c3e6db7dbc |
--- /dev/null |
+++ b/samplecode/SampleUnitMapper.cpp |
@@ -0,0 +1,172 @@ |
+ |
+/* |
+ * Copyright 2011 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+#include "SampleCode.h" |
+#include "SkView.h" |
+#include "SkCanvas.h" |
+#include "SkDevice.h" |
+#include "SkPaint.h" |
+#include "SkUnitMappers.h" |
+#include "SkCubicInterval.h" |
+ |
+#include "SkWidgetViews.h" |
+ |
+static SkStaticTextView* make_textview(SkView* parent, |
+ const SkRect& bounds, |
+ const SkPaint& paint) { |
+ SkStaticTextView* view = new SkStaticTextView; |
+ view->setMode(SkStaticTextView::kFixedSize_Mode); |
+ view->setPaint(paint); |
+ view->setVisibleP(true); |
+ view->setSize(bounds.width(), bounds.height()); |
+ view->setLoc(bounds.fLeft, bounds.fTop); |
+ parent->attachChildToFront(view)->unref(); |
+ return view; |
+} |
+ |
+static void set_scalar(SkStaticTextView* view, SkScalar value) { |
+ SkString str; |
+ str.appendScalar(value); |
+ view->setText(str); |
+} |
+ |
+class UnitMapperView : public SampleView { |
+ SkPoint fPts[4]; |
+ SkMatrix fMatrix; |
+ SkStaticTextView* fViews[4]; |
+ |
+ void setViews() { |
+ set_scalar(fViews[0], fPts[1].fX); |
+ set_scalar(fViews[1], fPts[1].fY); |
+ set_scalar(fViews[2], fPts[2].fX); |
+ set_scalar(fViews[3], fPts[2].fY); |
+ } |
+ |
+public: |
+ UnitMapperView() { |
+ fPts[0].set(0, 0); |
+ fPts[1].set(SK_Scalar1 / 3, SK_Scalar1 / 3); |
+ fPts[2].set(SK_Scalar1 * 2 / 3, SK_Scalar1 * 2 / 3); |
+ fPts[3].set(SK_Scalar1, SK_Scalar1); |
+ |
+ fMatrix.setScale(SK_Scalar1 * 200, -SK_Scalar1 * 200); |
+ fMatrix.postTranslate(SkIntToScalar(100), SkIntToScalar(300)); |
+ |
+ SkRect r = { |
+ SkIntToScalar(350), SkIntToScalar(100), |
+ SkIntToScalar(500), SkIntToScalar(130) |
+ }; |
+ SkPaint paint; |
+ paint.setAntiAlias(true); |
+ paint.setTextSize(SkIntToScalar(25)); |
+ for (int i = 0; i < 4; i++) { |
+ fViews[i] = make_textview(this, r, paint); |
+ r.offset(0, r.height()); |
+ } |
+ this->setViews(); |
+ } |
+ |
+protected: |
+ // overrides from SkEventSink |
+ virtual bool onQuery(SkEvent* evt) { |
+ if (SampleCode::TitleQ(*evt)) { |
+ SampleCode::TitleR(evt, "UnitMapper"); |
+ return true; |
+ } |
+ return this->INHERITED::onQuery(evt); |
+ } |
+ |
+ virtual void onDrawContent(SkCanvas* canvas) { |
+ SkPaint paint; |
+ paint.setAntiAlias(true); |
+ paint.setColor(0xFF8888FF); |
+ |
+ SkRect r = { 0, 0, SK_Scalar1, SK_Scalar1 }; |
+ |
+ canvas->concat(fMatrix); |
+ canvas->drawRect(r, paint); |
+ |
+ paint.setColor(SK_ColorBLACK); |
+ paint.setStyle(SkPaint::kStroke_Style); |
+ paint.setStrokeWidth(0); |
+ paint.setStrokeCap(SkPaint::kRound_Cap); |
+ |
+ SkPath path; |
+ path.moveTo(fPts[0]); |
+ path.cubicTo(fPts[1], fPts[2], fPts[3]); |
+ canvas->drawPath(path, paint); |
+ |
+ paint.setColor(SK_ColorRED); |
+ paint.setStrokeWidth(0); |
+ canvas->drawLine(0, 0, SK_Scalar1, SK_Scalar1, paint); |
+ |
+ paint.setColor(SK_ColorBLUE); |
+ paint.setStrokeWidth(SK_Scalar1 / 60); |
+ for (int i = 0; i < 50; i++) { |
+ SkScalar x = i * SK_Scalar1 / 49; |
+ canvas->drawPoint(x, SkEvalCubicInterval(&fPts[1], x), paint); |
+ } |
+ |
+ paint.setStrokeWidth(SK_Scalar1 / 20); |
+ paint.setColor(SK_ColorGREEN); |
+ canvas->drawPoints(SkCanvas::kPoints_PointMode, 2, &fPts[1], paint); |
+ } |
+ |
+ bool invertPt(SkScalar x, SkScalar y, SkPoint* result) { |
+ if (NULL == result) |
+ return true; |
+ |
+ SkMatrix m; |
+ if (!fMatrix.invert(&m)) { |
+ return false; |
+ } |
+ |
+ m.mapXY(x, y, result); |
+ return true; |
+ } |
+ |
+ int hittest(SkScalar x, SkScalar y) { |
+ SkPoint target = { x, y }; |
+ SkPoint pts[2] = { fPts[1], fPts[2] }; |
+ fMatrix.mapPoints(pts, 2); |
+ for (int i = 0; i < 2; i++) { |
+ if (SkPoint::Distance(pts[i], target) < SkIntToScalar(4)) { |
+ return i + 1; |
+ } |
+ } |
+ return -1; |
+ } |
+ |
+ virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) SK_OVERRIDE { |
+ fDragIndex = hittest(x, y); |
+ return fDragIndex >= 0 ? new Click(this) : NULL; |
+ } |
+ |
+ virtual bool onClick(Click* click) { |
+ if (fDragIndex >= 0) { |
+ if (!invertPt(click->fCurr.fX, click->fCurr.fY, |
+ &fPts[fDragIndex])) { |
+ return false; |
+ } |
+ |
+ this->setViews(); |
+ this->inval(NULL); |
+ return true; |
+ } |
+ return false; |
+ } |
+ |
+private: |
+ int fDragIndex; |
+ |
+ typedef SampleView INHERITED; |
+}; |
+ |
+////////////////////////////////////////////////////////////////////////////// |
+ |
+static SkView* MyFactory() { return new UnitMapperView; } |
+static SkViewRegister reg(MyFactory); |