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)