diff --git a/samplecode/SampleClip.cpp b/samplecode/SampleClip.cpp
new file mode 100644
index 0000000..87ff0b6
--- /dev/null
+++ b/samplecode/SampleClip.cpp
@@ -0,0 +1,119 @@
+/*
+ * 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 "SkColorPriv.h"
+#include "SkDevice.h"
+#include "SkPaint.h"
+#include "SkRandom.h"
+
+#define W   270
+#define H   200
+
+static void show_text(SkCanvas* canvas) {
+    SkRandom rand;
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(SkIntToScalar(20));
+    
+    for (int i = 0; i < 300; ++i) {
+        paint.setColor((SK_A32_MASK << SK_A32_SHIFT) | rand.nextU());
+        canvas->drawText("Hamburgefons", 12,
+                         rand.nextSScalar1() * W, rand.nextSScalar1() * H,
+                         paint);
+    }
+}
+
+static void show_geo(SkCanvas* canvas) {
+    SkRandom rand;
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    
+    for (int i = 0; i < 30; ++i) {
+        SkRect r;
+        SkPath p;
+
+        r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
+                  rand.nextUScalar1() * W, rand.nextUScalar1() * H);
+        paint.setStyle(SkPaint::kFill_Style);
+        paint.setColor(rand.nextU());
+        canvas->drawRect(r, paint);
+        
+        r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
+                  rand.nextUScalar1() * W, rand.nextUScalar1() * H);
+        paint.setStyle(SkPaint::kStroke_Style);
+        paint.setColor(rand.nextU());
+        canvas->drawRect(r, paint);
+        
+        r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
+                  rand.nextUScalar1() * W, rand.nextUScalar1() * H);
+        paint.setStyle(SkPaint::kFill_Style);
+        paint.setColor(rand.nextU());
+        p.addOval(r);
+        canvas->drawPath(p, paint);
+    }
+}
+
+typedef void (*CanvasProc)(SkCanvas*);
+
+class ClipView : public SampleView {
+public:
+    ClipView() {
+    }
+
+    virtual ~ClipView() {
+    }
+
+protected:
+    // overrides from SkEventSink
+    virtual bool onQuery(SkEvent* evt) {
+        if (SampleCode::TitleQ(*evt)) {
+            SampleCode::TitleR(evt, "Clip");
+            return true;
+        }
+        return this->INHERITED::onQuery(evt);
+    }
+
+    virtual void onDrawContent(SkCanvas* canvas) {
+        canvas->drawColor(SK_ColorLTGRAY);
+        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
+
+        static const CanvasProc gProc[] = {
+            show_text, show_geo
+        };
+        
+        SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) };
+        SkPath clipPath;
+        r.inset(SK_Scalar1 / 4, SK_Scalar1 / 4);
+        clipPath.addRoundRect(r, SkIntToScalar(16), SkIntToScalar(16));
+
+        for (int aa = 0; aa <= 1; ++aa) {
+            canvas->save();
+            for (size_t i = 0; i < SK_ARRAY_COUNT(gProc); ++i) {
+                canvas->save();
+                canvas->clipPath(clipPath);
+                canvas->drawColor(SK_ColorWHITE);
+                gProc[i](canvas);
+                canvas->restore();
+                canvas->translate(W * SK_Scalar1 * 8 / 7, 0);
+            }
+            canvas->restore();
+            canvas->translate(0, H * SK_Scalar1 * 8 / 7);
+        }
+    }
+    
+private:
+    typedef SampleView INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+static SkView* MyFactory() { return new ClipView; }
+static SkViewRegister reg(MyFactory);
+
