diff --git a/samplecode/SampleCircle.cpp b/samplecode/SampleCircle.cpp
index 3f39dbd..b250f29 100644
--- a/samplecode/SampleCircle.cpp
+++ b/samplecode/SampleCircle.cpp
@@ -26,6 +26,7 @@
 
     CircleView() {
         fDX = fDY = fRAD = 0;
+        fN = 3;
     }
     
 protected:
@@ -71,56 +72,75 @@
         const SkBitmap& bm = device->accessBitmap(false);
         canvas->drawBitmapRect(bm, &src, dst, NULL);
     }
+    
+    static void make_poly(SkPath* path, int n) {
+        if (n <= 0) {
+            return;
+        }
+        path->incReserve(n + 1);
+        path->moveTo(SK_Scalar1, 0);
+        SkScalar step = SK_ScalarPI * 2 / n;
+        SkScalar angle = 0;
+        for (int i = 1; i < n; i++) {
+            angle += step;
+            SkScalar c, s = SkScalarSinCos(angle, &c);
+            path->lineTo(c, s);
+        }
+        path->close();
+    }
+    
+    static void rotate(SkCanvas* canvas, SkScalar angle, SkScalar px, SkScalar py) {
+        canvas->translate(-px, -py);
+        canvas->rotate(angle);
+        canvas->translate(px, py);
+    }
 
     virtual void onDraw(SkCanvas* canvas) {
         this->drawBG(canvas);
         
-        test_circlebounds(canvas);
+        SkPaint paint;
+        paint.setAntiAlias(true);
+        paint.setStyle(SkPaint::kStroke_Style);
+//        canvas->drawCircle(250, 250, 220, paint);
+        SkMatrix matrix;
+        matrix.setScale(SkIntToScalar(100), SkIntToScalar(100));
+        matrix.postTranslate(SkIntToScalar(200), SkIntToScalar(200));
+        canvas->concat(matrix);
+        for (int n = 3; n < 20; n++) {
+            SkPath path;
+            make_poly(&path, n);
+            SkAutoCanvasRestore acr(canvas, true);
+            canvas->rotate(SkIntToScalar(10) * (n - 3));
+            canvas->translate(-SK_Scalar1, 0);
+            canvas->drawPath(path, paint);
+        }
         
         if (false) {
-          //  canvas->translate(SK_ScalarHalf, SK_ScalarHalf);
-
-            SkPaint paint;
-            paint.setAntiAlias(true);
-            paint.setStyle(SkPaint::kStroke_Style);
-            canvas->drawCircle(SkIntToScalar(10), SkIntToScalar(10), SkIntToScalar(2), paint);
+            test_circlebounds(canvas);
             
-            SkIRect r;
-            r.set(7, 7, 13, 13);
-            SkRect dst;
-            dst.set(SkIntToScalar(100), SkIntToScalar(10), SkIntToScalar(200), SkIntToScalar(110));
-            blowup(canvas, r, dst);
-            return;
-        }
-        
-        // test that degenerate rects do nothing
-        if (true) {
-            SkScalar x = SkIntToScalar(30);
-            SkRect  r;
-            r.set(x, x, x, x);
-            SkPaint p;
-            canvas->drawRect(r, p);
-            p.setAntiAlias(true);
-            canvas->drawRect(r, p);
-        }
+            SkScalar dx = SkIntToScalar(32);
+            SkScalar dy = SkIntToScalar(32);
+            
+            canvas->translate(dx + fDX, dy + fDY);
+            drawSix(canvas, dx, dy);
 
-        SkScalar dx = SkIntToScalar(32);
-        SkScalar dy = SkIntToScalar(32);
-        
-        canvas->translate(dx + fDX, dy + fDY);
-        drawSix(canvas, dx, dy);
-
-        canvas->translate(dx, 0);
-        canvas->translate(SK_ScalarHalf, SK_ScalarHalf);
-        drawSix(canvas, dx, dy);
+            canvas->translate(dx, 0);
+            canvas->translate(SK_ScalarHalf, SK_ScalarHalf);
+            drawSix(canvas, dx, dy);
+        }
         
         fDX += ANIM_DX;
         fDY += ANIM_DY;
         fRAD += ANIM_RAD;
+        fN += 1;
+        if (fN > 40) {
+            fN = 3;
+        }
         this->inval(NULL);
     }
     
 private:
+    int fN;
     typedef SkView INHERITED;
 };
 
