add lineclipper, and test case
git-svn-id: http://skia.googlecode.com/svn/trunk@427 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/samplecode/SampleLineClipper.cpp b/samplecode/SampleLineClipper.cpp
new file mode 100644
index 0000000..e990c86
--- /dev/null
+++ b/samplecode/SampleLineClipper.cpp
@@ -0,0 +1,127 @@
+#include "SampleCode.h"
+#include "SkView.h"
+#include "SkCanvas.h"
+#include "SkGradientShader.h"
+#include "SkGraphics.h"
+#include "SkImageDecoder.h"
+#include "SkPath.h"
+#include "SkRegion.h"
+#include "SkShader.h"
+#include "SkUtils.h"
+#include "SkXfermode.h"
+#include "SkColorPriv.h"
+#include "SkColorFilter.h"
+#include "SkTime.h"
+#include "SkRandom.h"
+#include "SkLineClipper.h"
+
+enum {
+ W = 640/4,
+ H = 480/4
+};
+
+class LineClipperView : public SkView {
+ SkRect fClip;
+ SkRandom fRand;
+ SkPoint fPts[2];
+
+ void randPts() {
+ fPts[0].set(fRand.nextUScalar1() * 640, fRand.nextUScalar1() * 480);
+ fPts[1].set(fRand.nextUScalar1() * 640, fRand.nextUScalar1() * 480);
+ }
+
+public:
+ LineClipperView() {
+ int x = (640 - W)/2;
+ int y = (480 - H)/2;
+ fClip.set(x, y, x + W, y + H);
+ this->randPts();
+ }
+
+protected:
+ // overrides from SkEventSink
+ virtual bool onQuery(SkEvent* evt) {
+ if (SampleCode::TitleQ(*evt)) {
+ SampleCode::TitleR(evt, "LineClipper");
+ return true;
+ }
+ return this->INHERITED::onQuery(evt);
+ }
+
+ void drawBG(SkCanvas* canvas) {
+ canvas->drawColor(SK_ColorWHITE);
+ }
+
+ static void drawVLine(SkCanvas* canvas, SkScalar x, const SkPaint& paint) {
+ canvas->drawLine(x, -999, x, 999, paint);
+ }
+
+ static void drawHLine(SkCanvas* canvas, SkScalar y, const SkPaint& paint) {
+ canvas->drawLine(-999, y, 999, y, paint);
+ }
+
+ static void check_lineclipper(int count, const SkPoint pts[],
+ const SkRect& clip) {
+ if (count > 0) {
+ for (int i = 0; i <= count; i++) {
+ SkASSERT(pts[i].fX >= clip.fLeft);
+ SkASSERT(pts[i].fX <= clip.fRight);
+ SkASSERT(pts[i].fY >= clip.fTop);
+ SkASSERT(pts[i].fY <= clip.fBottom);
+ }
+ }
+ }
+
+ virtual void onDraw(SkCanvas* canvas) {
+ this->drawBG(canvas);
+
+ SkPaint paint;
+
+ drawVLine(canvas, fClip.fLeft + SK_ScalarHalf, paint);
+ drawVLine(canvas, fClip.fRight - SK_ScalarHalf, paint);
+ drawHLine(canvas, fClip.fTop + SK_ScalarHalf, paint);
+ drawHLine(canvas, fClip.fBottom - SK_ScalarHalf, paint);
+
+ paint.setColor(SK_ColorLTGRAY);
+ canvas->drawRect(fClip, paint);
+
+ paint.setAntiAlias(true);
+ paint.setColor(SK_ColorBLUE);
+ paint.setStrokeWidth(SkIntToScalar(3));
+ paint.setStrokeCap(SkPaint::kRound_Cap);
+ SkPoint pts[SkLineClipper::kMaxPoints];
+ int count = SkLineClipper::ClipLine(fPts, fClip, pts);
+ check_lineclipper(count, pts, fClip);
+ for (int i = 0; i < count; i++) {
+ canvas->drawPoints(SkCanvas::kLines_PointMode, 2, &pts[i], paint);
+ }
+
+ paint.setColor(SK_ColorRED);
+ paint.setStrokeWidth(0);
+ canvas->drawPoints(SkCanvas::kLines_PointMode, 2, fPts, paint);
+
+ if (true) {
+ this->randPts();
+ this->inval(NULL);
+ }
+ }
+
+ virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
+ this->randPts();
+ this->inval(NULL);
+ return NULL;
+ }
+
+ virtual bool onClick(Click* click) {
+ return false;
+ }
+
+private:
+ typedef SkView INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+static SkView* MyFactory() { return new LineClipperView; }
+static SkViewRegister reg(MyFactory);
+