Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(131)

Unified Diff: tests/DeferredCanvasTest.cpp

Issue 12567025: Integrating SkSurface with SkDeferredCanvas (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tests/DeferredCanvasTest.cpp
===================================================================
--- tests/DeferredCanvasTest.cpp (revision 8402)
+++ tests/DeferredCanvasTest.cpp (working copy)
@@ -12,6 +12,12 @@
#include "SkDevice.h"
#include "SkGradientShader.h"
#include "SkShader.h"
+#include "SkSurface.h"
+#if SK_SUPPORT_GPU
+#include "GrContextFactory.h"
+#else
+class GrContextFactory;
+#endif
static const int gWidth = 2;
static const int gHeight = 2;
@@ -465,6 +471,59 @@
}
}
+static void TestDeferredCanvasSurface(skiatest::Reporter* reporter, GrContextFactory* factory) {
+ SkImage::Info imageSpec = {
+ 10, // width
+ 10, // height
+ SkImage::kPMColor_ColorType,
+ SkImage::kPremul_AlphaType
+ };
+ SkSurface* surface;
+ bool useGpu = NULL != factory;
+#if SK_SUPPORT_GPU
+ if (useGpu) {
+ GrContext* context = factory->get(GrContextFactory::kNative_GLContextType);
+ surface = SkSurface::NewRenderTarget(context, imageSpec);
+ } else {
+ surface = SkSurface::NewRaster(imageSpec);
+ }
+#else
+ SkASSERT(!useGpu);
+ surface = SkSurface::NewRaster(imageSpec);
+#endif
+ SkASSERT(NULL != surface);
+ SkAutoTUnref<SkSurface> aur(surface);
+ SkDeferredCanvas canvas(surface);
+
+ SkImage* image1 = canvas.newImageShapshot();
+ SkAutoTUnref<SkImage> aur_i1(image1);
+ void* pixels1 = useGpu ? surface->getCanvas()->getDevice()->accessBitmap(false).getTexture() :
+ surface->getCanvas()->getDevice()->accessBitmap(false).getPixels();
+ canvas.clear(SK_ColorBLACK);
+ SkImage* image2 = surface->newImageShapshot();
+ SkAutoTUnref<SkImage> aur_i2(image2);
+ // Images identical because of deferral
+ REPORTER_ASSERT(reporter, image1->uniqueID() == image2->uniqueID());
+ SkImage* image3 = canvas.newImageShapshot(); // triggers a flush
+ SkAutoTUnref<SkImage> aur_i3(image3);
+ REPORTER_ASSERT(reporter, image1->uniqueID() != image3->uniqueID());
+ // Verify that backing store is now a different buffer because of copy on write
+ void* pixels2 = useGpu ? surface->getCanvas()->getDevice()->accessBitmap(false).getTexture() :
+ surface->getCanvas()->getDevice()->accessBitmap(false).getPixels();
+ REPORTER_ASSERT(reporter, pixels1 != pixels2);
+ canvas.clear(SK_ColorWHITE);
+ canvas.flush();
+ void* pixels3 = useGpu ? surface->getCanvas()->getDevice()->accessBitmap(false).getTexture() :
+ surface->getCanvas()->getDevice()->accessBitmap(false).getPixels();
+ canvas.clear(SK_ColorBLACK);
+ canvas.flush();
+ void* pixels4 = useGpu ? surface->getCanvas()->getDevice()->accessBitmap(false).getTexture() :
+ surface->getCanvas()->getDevice()->accessBitmap(false).getPixels();
+ // Since no snapshot was acquired in the pixels3 state, the flush should
+ // not trigger a copy on write.
+ REPORTER_ASSERT(reporter, pixels3 == pixels4);
+}
+
static void TestDeferredCanvas(skiatest::Reporter* reporter) {
TestDeferredCanvasBitmapAccess(reporter);
TestDeferredCanvasFlush(reporter);
@@ -474,7 +533,14 @@
TestDeferredCanvasSkip(reporter);
TestDeferredCanvasBitmapShaderNoLeak(reporter);
TestDeferredCanvasBitmapSizeThreshold(reporter);
+ TestDeferredCanvasSurface(reporter, NULL);
}
+static void TestDeferredCanvasGpu(skiatest::Reporter* reporter, GrContextFactory* factory) {
+ TestDeferredCanvasSurface(reporter, factory);
+}
+
#include "TestClassDef.h"
DEFINE_TESTCLASS("DeferredCanvas", TestDeferredCanvasClass, TestDeferredCanvas)
+DEFINE_GPUTESTCLASS("DeferredCanvasGpu", TestDeferredCanvasGpuClass, TestDeferredCanvasGpu)
+

Powered by Google App Engine
This is Rietveld 408576698