Index: tests/PictureTest.cpp |
diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp |
index 618ccfc4c0ffc3b931a0e170099c2af76f8280fd..6969524bd7156d049cf7dd611ac2d8de86de541e 100644 |
--- a/tests/PictureTest.cpp |
+++ b/tests/PictureTest.cpp |
@@ -986,6 +986,45 @@ public: |
} |
}; |
+static void create_imbalance(SkCanvas* canvas) { |
+ SkRect clipRect = SkRect::MakeWH(2, 2); |
+ SkRect drawRect = SkRect::MakeWH(10, 10); |
+ canvas->save(); |
+ canvas->clipRect(clipRect, SkRegion::kReplace_Op); |
+ canvas->translate(1.0f, 1.0f); |
+ SkPaint p; |
+ p.setColor(SK_ColorGREEN); |
+ canvas->drawRect(drawRect, p); |
+ // no restore |
+} |
+ |
+// This tests that replaying a potentially unbalanced picture into a canvas |
+// doesn't affect the canvas' save count or matrix/clip state. |
+static void check_balance(skiatest::Reporter* reporter, SkPicture* picture) { |
+ SkBitmap bm; |
+ bm.allocN32Pixels(4, 3); |
+ SkCanvas canvas(bm); |
+ |
+ int beforeSaveCount = canvas.getSaveCount(); |
+ |
+ SkMatrix beforeMatrix = canvas.getTotalMatrix(); |
+ |
+ SkRect beforeClip; |
+ |
+ canvas.getClipBounds(&beforeClip); |
+ |
+ canvas.drawPicture(picture); |
+ |
+ REPORTER_ASSERT(reporter, beforeSaveCount == canvas.getSaveCount()); |
+ REPORTER_ASSERT(reporter, beforeMatrix == canvas.getTotalMatrix()); |
+ |
+ SkRect afterClip; |
+ |
+ canvas.getClipBounds(&afterClip); |
+ |
+ REPORTER_ASSERT(reporter, afterClip == beforeClip); |
+} |
+ |
// Test out SkPictureRecorder::partialReplay |
DEF_TEST(PictureRecorder_replay, reporter) { |
// check save/saveLayer state |
@@ -1040,6 +1079,25 @@ DEF_TEST(PictureRecorder_replay, reporter) { |
// The snapshot shouldn't pick up any operations added after it was made |
REPORTER_ASSERT(reporter, !copy->willPlayBackBitmaps()); |
} |
+ |
+ // Recreate the Android partialReplay test case |
+ { |
+ SkPictureRecorder recorder; |
+ |
+ SkCanvas* canvas = recorder.beginRecording(4, 3, NULL, 0); |
+ create_imbalance(canvas); |
+ |
+ int expectedSaveCount = canvas->getSaveCount(); |
+ |
+ SkAutoTUnref<SkPicture> copy(SkPictureRecorderReplayTester::Copy(&recorder)); |
+ check_balance(reporter, copy); |
+ |
+ REPORTER_ASSERT(reporter, expectedSaveCount = canvas->getSaveCount()); |
+ |
+ // End the recording of source to test the picture finalization |
+ // process isn't complicated by the partialReplay step |
+ SkAutoTUnref<SkPicture> final(recorder.endRecording()); |
+ } |
} |
static void test_unbalanced_save_restores(skiatest::Reporter* reporter) { |