Chromium Code Reviews| Index: tests/DeferredCanvasTest.cpp |
| diff --git a/tests/DeferredCanvasTest.cpp b/tests/DeferredCanvasTest.cpp |
| index d15eeffd5c83094151e489a862be23641a9762d9..9b68bc58bafe79e05ab9931aa0c8bae12b1b5351 100644 |
| --- a/tests/DeferredCanvasTest.cpp |
| +++ b/tests/DeferredCanvasTest.cpp |
| @@ -13,6 +13,7 @@ |
| #include "SkDeferredCanvas.h" |
| #include "SkGradientShader.h" |
| #include "SkShader.h" |
| +#include "SkSurface.h" |
| #include "Test.h" |
| #if SK_SUPPORT_GPU |
| #include "GrContextFactory.h" |
| @@ -29,20 +30,39 @@ static void create(SkBitmap* bm, SkBitmap::Config config, SkColor color) { |
| bm->eraseColor(color); |
| } |
| +static SkSurface* createSurface(SkColor color) { |
| + SkSurface* surface = SkSurface::NewRasterPMColor(gWidth, gHeight); |
| + surface->getCanvas()->clear(color); |
| + return surface; |
| +} |
| + |
| +static SkPMColor read_pixel(SkSurface* surface, int x, int y) { |
| + SkPMColor pixel = 0; |
| + SkBitmap bitmap; |
| + bitmap.installPixels(SkImageInfo::MakeN32Premul(1, 1), &pixel, 4, NULL, NULL); |
| + SkCanvas canvas(bitmap); |
| + |
| + SkPaint paint; |
| + paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
| + surface->draw(&canvas, -x, -y, &paint); |
| + return pixel; |
| +} |
| + |
| static void TestDeferredCanvasBitmapAccess(skiatest::Reporter* reporter) { |
| SkBitmap store; |
| - create(&store, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF); |
| - SkBitmapDevice device(store); |
| - SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(&device)); |
| - |
| + SkAutoTUnref<SkSurface> surface(createSurface(0xFFFFFFFF)); |
| + SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get())); |
| + |
| canvas->clear(0x00000000); |
| - SkAutoLockPixels alp(store); |
| - REPORTER_ASSERT(reporter, store.getColor(0,0) == 0xFFFFFFFF); //verify that clear was deferred |
| + // verify that the clear() was deferred |
| + REPORTER_ASSERT(reporter, 0xFFFFFFFF == read_pixel(surface, 0, 0)); |
| + |
| SkBitmap accessed = canvas->getDevice()->accessBitmap(false); |
| - REPORTER_ASSERT(reporter, store.getColor(0,0) == 0x00000000); //verify that clear was executed |
| - REPORTER_ASSERT(reporter, accessed.pixelRef() == store.pixelRef()); |
| + |
| + // verify that clear was executed |
| + REPORTER_ASSERT(reporter, 0 == read_pixel(surface, 0, 0)); |
| } |
| class MockSurface : public SkSurface_Base { |
| @@ -256,31 +276,30 @@ static void TestDeferredCanvasWritePixelsToSurface(skiatest::Reporter* reporter) |
| } |
| static void TestDeferredCanvasFlush(skiatest::Reporter* reporter) { |
| - SkBitmap store; |
| - |
| - create(&store, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF); |
| - SkBitmapDevice device(store); |
| - SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(&device)); |
| + SkAutoTUnref<SkSurface> surface(createSurface(0xFFFFFFFF)); |
| + SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get())); |
| canvas->clear(0x00000000); |
| - SkAutoLockPixels alp(store); |
| - REPORTER_ASSERT(reporter, store.getColor(0,0) == 0xFFFFFFFF); //verify that clear was deferred |
| + // verify that clear was deferred |
| + REPORTER_ASSERT(reporter, 0xFFFFFFFF == read_pixel(surface, 0, 0)); |
| + |
| canvas->flush(); |
| - REPORTER_ASSERT(reporter, store.getColor(0,0) == 0x00000000); //verify that clear was executed |
| + |
| + // verify that clear was executed |
| + REPORTER_ASSERT(reporter, 0 == read_pixel(surface, 0, 0)); |
| } |
| static void TestDeferredCanvasFreshFrame(skiatest::Reporter* reporter) { |
| - SkBitmap store; |
| SkRect fullRect; |
| fullRect.setXYWH(SkIntToScalar(0), SkIntToScalar(0), SkIntToScalar(gWidth), |
| SkIntToScalar(gHeight)); |
| SkRect partialRect; |
| partialRect.setXYWH(SkIntToScalar(0), SkIntToScalar(0), |
| SkIntToScalar(1), SkIntToScalar(1)); |
| - create(&store, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF); |
| - SkBitmapDevice device(store); |
| - SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(&device)); |
| + |
| + SkAutoTUnref<SkSurface> surface(createSurface(0xFFFFFFFF)); |
| + SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get())); |
| // verify that frame is intially fresh |
| REPORTER_ASSERT(reporter, canvas->isFreshFrame()); |
| @@ -449,6 +468,7 @@ public: |
| // Verifies that the deferred canvas triggers a flush when its memory |
| // limit is exceeded |
| static void TestDeferredCanvasMemoryLimit(skiatest::Reporter* reporter) { |
| +#if 0 // TODO -- need a surface-oriented way to exercise this. |
|
Justin Novosad
2014/02/03 21:33:47
You could register an SkDeferredCanvas::Notificati
reed1
2014/02/03 21:52:40
Done.
|
| SkBitmap store; |
| store.setConfig(SkBitmap::kARGB_8888_Config, 100, 100); |
| store.allocPixels(); |
| @@ -467,6 +487,7 @@ static void TestDeferredCanvasMemoryLimit(skiatest::Reporter* reporter) { |
| } |
| REPORTER_ASSERT(reporter, mockDevice.fDrawBitmapCallCount == 4); |
| +#endif |
| } |
| class NotificationCounter : public SkDeferredCanvas::NotificationClient { |
| @@ -499,12 +520,10 @@ private: |
| }; |
| static void TestDeferredCanvasBitmapCaching(skiatest::Reporter* reporter) { |
| - SkBitmap store; |
| - store.setConfig(SkBitmap::kARGB_8888_Config, 100, 100); |
| - store.allocPixels(); |
| - SkBitmapDevice device(store); |
| + SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterPMColor(100, 100)); |
| + SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get())); |
| + |
| NotificationCounter notificationCounter; |
| - SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(&device)); |
| canvas->setNotificationClient(¬ificationCounter); |
| const int imageCount = 2; |
| @@ -582,12 +601,10 @@ static void TestDeferredCanvasBitmapCaching(skiatest::Reporter* reporter) { |
| } |
| static void TestDeferredCanvasSkip(skiatest::Reporter* reporter) { |
| - SkBitmap store; |
| - store.setConfig(SkBitmap::kARGB_8888_Config, 100, 100); |
| - store.allocPixels(); |
| - SkBitmapDevice device(store); |
| + SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterPMColor(100, 100)); |
| + SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get())); |
| + |
| NotificationCounter notificationCounter; |
| - SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(&device)); |
| canvas->setNotificationClient(¬ificationCounter); |
| canvas->clear(0x0); |
| REPORTER_ASSERT(reporter, 1 == notificationCounter.fSkippedPendingDrawCommandsCount); |
| @@ -603,11 +620,8 @@ static void TestDeferredCanvasBitmapShaderNoLeak(skiatest::Reporter* reporter) { |
| // This test covers a code path that inserts bitmaps into the bitmap heap through the |
| // flattening of SkBitmapProcShaders. The refcount in the bitmap heap is maintained through |
| // the flattening and unflattening of the shader. |
| - SkBitmap store; |
| - store.setConfig(SkBitmap::kARGB_8888_Config, 100, 100); |
| - store.allocPixels(); |
| - SkBitmapDevice device(store); |
| - SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(&device)); |
| + SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterPMColor(100, 100)); |
| + SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get())); |
| // test will fail if nbIterations is not in sync with |
| // BITMAPS_TO_KEEP in SkGPipeWrite.cpp |
| const int nbIterations = 5; |
| @@ -641,9 +655,7 @@ static void TestDeferredCanvasBitmapShaderNoLeak(skiatest::Reporter* reporter) { |
| } |
| static void TestDeferredCanvasBitmapSizeThreshold(skiatest::Reporter* reporter) { |
| - SkBitmap store; |
| - store.setConfig(SkBitmap::kARGB_8888_Config, 100, 100); |
| - store.allocPixels(); |
| + SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterPMColor(100, 100)); |
| SkBitmap sourceImage; |
| // 100 by 100 image, takes 40,000 bytes in memory |
| @@ -652,8 +664,7 @@ static void TestDeferredCanvasBitmapSizeThreshold(skiatest::Reporter* reporter) |
| // 1 under : should not store the image |
| { |
| - SkBitmapDevice device(store); |
| - SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(&device)); |
| + SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get())); |
| canvas->setBitmapSizeThreshold(39999); |
| canvas->drawBitmap(sourceImage, 0, 0, NULL); |
| size_t newBytesAllocated = canvas->storageAllocatedForRecording(); |
| @@ -662,8 +673,7 @@ static void TestDeferredCanvasBitmapSizeThreshold(skiatest::Reporter* reporter) |
| // exact value : should store the image |
| { |
| - SkBitmapDevice device(store); |
| - SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(&device)); |
| + SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get())); |
| canvas->setBitmapSizeThreshold(40000); |
| canvas->drawBitmap(sourceImage, 0, 0, NULL); |
| size_t newBytesAllocated = canvas->storageAllocatedForRecording(); |
| @@ -672,8 +682,7 @@ static void TestDeferredCanvasBitmapSizeThreshold(skiatest::Reporter* reporter) |
| // 1 over : should still store the image |
| { |
| - SkBitmapDevice device(store); |
| - SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(&device)); |
| + SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get())); |
| canvas->setBitmapSizeThreshold(40001); |
| canvas->drawBitmap(sourceImage, 0, 0, NULL); |
| size_t newBytesAllocated = canvas->storageAllocatedForRecording(); |
| @@ -811,15 +820,14 @@ static void TestDeferredCanvasSetSurface(skiatest::Reporter* reporter, GrContext |
| } |
| static void TestDeferredCanvasCreateCompatibleDevice(skiatest::Reporter* reporter) { |
| - SkBitmap store; |
| - store.setConfig(SkBitmap::kARGB_8888_Config, 100, 100); |
| - store.allocPixels(); |
| - SkBitmapDevice device(store); |
| + SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterPMColor(100, 100)); |
| + SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get())); |
| + |
| NotificationCounter notificationCounter; |
| - SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(&device)); |
| canvas->setNotificationClient(¬ificationCounter); |
| + |
| SkAutoTUnref<SkBaseDevice> secondaryDevice(canvas->createCompatibleDevice( |
| - SkBitmap::kARGB_8888_Config, 10, 10, device.isOpaque())); |
| + SkBitmap::kARGB_8888_Config, 10, 10, false)); |
| SkCanvas secondaryCanvas(secondaryDevice.get()); |
| SkRect rect = SkRect::MakeWH(5, 5); |
| SkPaint paint; |