Index: tests/SurfaceTest.cpp |
diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp |
index f0d9b17591c64b9bb0c81d5910c0de03c5ab2e40..5b7325e9af201bf681dd87a08aa0ebd7f45d4226 100644 |
--- a/tests/SurfaceTest.cpp |
+++ b/tests/SurfaceTest.cpp |
@@ -661,3 +661,44 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SurfaceNoCanvas_Gpu, reporter, context) { |
} |
} |
#endif |
+ |
+static void check_rowbytes_remain_consistent(SkSurface* surface, skiatest::Reporter* reporter) { |
+ SkImageInfo info; |
+ size_t rowBytes; |
+ REPORTER_ASSERT(reporter, surface->peekPixels(&info, &rowBytes)); |
+ |
+ SkAutoTUnref<SkImage> image(surface->newImageSnapshot()); |
+ SkImageInfo im_info; |
+ size_t im_rowbytes; |
+ REPORTER_ASSERT(reporter, image->peekPixels(&im_info, &im_rowbytes)); |
+ |
+ REPORTER_ASSERT(reporter, rowBytes == im_rowbytes); |
+ |
+ // trigger a copy-on-write |
+ surface->getCanvas()->drawPaint(SkPaint()); |
+ SkAutoTUnref<SkImage> image2(surface->newImageSnapshot()); |
+ REPORTER_ASSERT(reporter, image->uniqueID() != image2->uniqueID()); |
+ |
+ SkImageInfo im_info2; |
+ size_t im_rowbytes2; |
+ REPORTER_ASSERT(reporter, image2->peekPixels(&im_info2, &im_rowbytes2)); |
+ |
+ REPORTER_ASSERT(reporter, im_rowbytes2 == im_rowbytes); |
+} |
+ |
+DEF_TEST(surface_rowbytes, reporter) { |
+ const SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100); |
+ |
+ SkAutoTUnref<SkSurface> surf0(SkSurface::NewRaster(info)); |
+ check_rowbytes_remain_consistent(surf0, reporter); |
+ |
+ // specify a larger rowbytes |
+ SkAutoTUnref<SkSurface> surf1(SkSurface::NewRaster(info, 500, nullptr)); |
+ check_rowbytes_remain_consistent(surf1, reporter); |
+ |
+ // Try some illegal rowByte values |
+ SkSurface* s = SkSurface::NewRaster(info, 396, nullptr); // needs to be at least 400 |
+ REPORTER_ASSERT(reporter, nullptr == s); |
+ s = SkSurface::NewRaster(info, 1 << 30, nullptr); // allocation to large |
+ REPORTER_ASSERT(reporter, nullptr == s); |
+} |