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);
+