Index: tests/PictureBBHTest.cpp |
diff --git a/tests/PictureBBHTest.cpp b/tests/PictureBBHTest.cpp |
index 3ff5625686b298fdcd99357222d1b9daa066ab9c..fa02437432bb4aa621e67904d6c28f315fd79dbe 100644 |
--- a/tests/PictureBBHTest.cpp |
+++ b/tests/PictureBBHTest.cpp |
@@ -49,7 +49,9 @@ private: |
SkCanvas playbackCanvas(fResultBitmap); |
playbackCanvas.clear(SK_ColorGREEN); |
SkPictureRecorder recorder; |
- SkCanvas* recordCanvas = recorder.beginRecording(SkIntToScalar(fPictureWidth), SkIntToScalar(fPictureHeight), factory); |
+ SkCanvas* recordCanvas = recorder.beginRecording(SkIntToScalar(fPictureWidth), |
+ SkIntToScalar(fPictureHeight), |
+ factory); |
this->doTest(playbackCanvas, *recordCanvas); |
SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
playbackCanvas.drawPicture(picture); |
@@ -99,3 +101,34 @@ DEF_TEST(PictureBBH, reporter) { |
EmptyClipPictureBBHTest emptyClipPictureTest; |
emptyClipPictureTest.run(reporter); |
} |
+ |
+static void test_clear(skiatest::Reporter* r, SkBBHFactory* factory) { |
+ // SkPicture should always call clear()s on the target canvas, even if its clip is empty. |
+ SkPictureRecorder src, dst; |
+ |
+ // A picture that's just clear(). |
+ src.beginRecording(1,1, factory) |
+ ->clear(SK_ColorGREEN); |
+ SkAutoTDelete<SkPicture> srcPic(src.endRecording()); |
+ |
+ // A target canvas with an empty clip. |
+ SkCanvas* c = dst.beginRecording(1,1, NULL); |
+ c->clipRect(SkRect::MakeEmpty()); |
+ srcPic->playback(c); |
+ SkAutoTDelete<SkPicture> dstPic(dst.endRecording()); |
+ |
+ // Should be Clip - Save - Clear - Restore. |
+ // Buggy implementations might return 1 (just Clip) or 3 (Clip - Save - Restore). |
+ REPORTER_ASSERT(r, dstPic->approximateOpCount() == 4); |
+} |
+ |
+DEF_TEST(PictureBBH_Clear, r) { |
+ test_clear(r, NULL); |
+ |
+ SkTileGridFactory::TileGridInfo grid = { {1,1}, {0,0}, {0,0} }; |
+ SkTileGridFactory tilegrid(grid); |
+ test_clear(r, &tilegrid); |
+ |
+ SkRTreeFactory rtree; |
+ test_clear(r, &rtree); |
+} |