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; |