catch empty stack in restorefixup called by clipRect
write stress-test for save/clip/restore peephole optimization



git-svn-id: http://skia.googlecode.com/svn/trunk@5774 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp
index 34d7832..dfad68f 100644
--- a/tests/PictureTest.cpp
+++ b/tests/PictureTest.cpp
@@ -5,7 +5,10 @@
  * found in the LICENSE file.
  */
 #include "Test.h"
+#include "SkCanvas.h"
+#include "SkPaint.h"
 #include "SkPicture.h"
+#include "SkRandom.h"
 #include "SkStream.h"
 
 #ifdef SK_DEBUG
@@ -31,12 +34,64 @@
 }
 #endif
 
+static void rand_op(SkCanvas* canvas, SkRandom& rand) {
+    SkPaint paint;
+    SkRect rect = SkRect::MakeWH(50, 50);
+
+    SkScalar unit = rand.nextUScalar1();
+    if (unit <= 0.3) {
+//        SkDebugf("save\n");
+        canvas->save();
+    } else if (unit <= 0.6) {
+//        SkDebugf("restore\n");
+        canvas->restore();
+    } else if (unit <= 0.9) {
+//        SkDebugf("clip\n");
+        canvas->clipRect(rect);
+    } else {
+//        SkDebugf("draw\n");
+        canvas->drawPaint(paint);
+    }
+}
+
+static void test_peephole(skiatest::Reporter* reporter) {
+    SkRandom rand;
+
+    for (int j = 0; j < 100; j++) {
+        SkRandom rand2(rand.getSeed()); // remember the seed
+
+        SkPicture picture;
+        SkCanvas* canvas = picture.beginRecording(100, 100);
+
+        for (int i = 0; i < 1000; ++i) {
+            rand_op(canvas, rand);
+        }
+        picture.endRecording();
+    }
+
+    {
+        SkPicture picture;
+        SkCanvas* canvas = picture.beginRecording(100, 100);
+        SkRect rect = SkRect::MakeWH(50, 50);
+    
+        for (int i = 0; i < 100; ++i) {
+            canvas->save();
+        }
+        while (canvas->getSaveCount() > 1) {
+            canvas->clipRect(rect);
+            canvas->restore();
+        }
+        picture.endRecording();
+    }
+}
+
 static void TestPicture(skiatest::Reporter* reporter) {
 #ifdef SK_DEBUG
     test_deleting_empty_playback();
     test_serializing_empty_picture();
 #endif
+    test_peephole(reporter);
 }
 
 #include "TestClassDef.h"
-DEFINE_TESTCLASS("Picture", PictureTestClass, TestPicture)
+DEFINE_TESTCLASS("Pictures", PictureTestClass, TestPicture)