Index: tests/SurfaceTest.cpp |
diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp |
index 0114fb66fc85b6be9fc0404aaa1c0511cec1ea33..cfaa6692628d3478c1effd453894ca9baf263e44 100644 |
--- a/tests/SurfaceTest.cpp |
+++ b/tests/SurfaceTest.cpp |
@@ -30,16 +30,20 @@ enum SurfaceType { |
kRasterDirect_SurfaceType, |
kGpu_SurfaceType, |
kGpuScratch_SurfaceType, |
+ |
+ kLastSurfaceType = kGpuScratch_SurfaceType |
}; |
+static const int kSurfaceTypeCnt = kLastSurfaceType + 1; |
static void release_storage(void* pixels, void* context) { |
SkASSERT(pixels == context); |
sk_free(pixels); |
} |
-static SkSurface* createSurface(SurfaceType surfaceType, GrContext* context, |
- SkImageInfo* requestedInfo = NULL) { |
- static const SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10); |
+static SkSurface* create_surface(SurfaceType surfaceType, GrContext* context, |
+ SkAlphaType at = kPremul_SkAlphaType, |
+ SkImageInfo* requestedInfo = NULL) { |
+ const SkImageInfo info = SkImageInfo::MakeN32(10, 10, at); |
if (requestedInfo) { |
*requestedInfo = info; |
@@ -219,8 +223,8 @@ struct ReleaseDataContext { |
} |
}; |
-static SkImage* createImage(ImageType imageType, GrContext* context, SkColor color, |
- ReleaseDataContext* releaseContext) { |
+static SkImage* create_image(ImageType imageType, GrContext* context, SkColor color, |
+ ReleaseDataContext* releaseContext) { |
const SkPMColor pmcolor = SkPreMultiplyColor(color); |
const SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10); |
const size_t rowBytes = info.minRowBytes(); |
@@ -347,7 +351,7 @@ static void test_imagepeek(skiatest::Reporter* reporter, GrContextFactory* facto |
size_t rowBytes; |
releaseCtx.fData = NULL; |
- SkAutoTUnref<SkImage> image(createImage(gRec[i].fType, ctx, color, &releaseCtx)); |
+ SkAutoTUnref<SkImage> image(create_image(gRec[i].fType, ctx, color, &releaseCtx)); |
if (!image.get()) { |
SkDebugf("failed to createImage[%d] %s\n", i, gRec[i].fName); |
continue; // gpu may not be enabled |
@@ -417,8 +421,8 @@ static void test_canvaspeek(skiatest::Reporter* reporter, |
SkImageInfo info, requestInfo; |
size_t rowBytes; |
- SkAutoTUnref<SkSurface> surface(createSurface(gRec[i].fType, context, |
- &requestInfo)); |
+ SkAutoTUnref<SkSurface> surface(create_surface(gRec[i].fType, context, |
+ kPremul_SkAlphaType, &requestInfo)); |
surface->getCanvas()->clear(color); |
const void* addr = surface->getCanvas()->peekPixels(&info, &rowBytes); |
@@ -484,8 +488,8 @@ static void test_accessPixels(skiatest::Reporter* reporter, GrContextFactory* fa |
for (size_t j = 0; j < SK_ARRAY_COUNT(gRec); ++j) { |
SkImageInfo info, requestInfo; |
- SkAutoTUnref<SkSurface> surface(createSurface(gRec[j].fType, context, |
- &requestInfo)); |
+ SkAutoTUnref<SkSurface> surface(create_surface(gRec[j].fType, context, |
+ kPremul_SkAlphaType, &requestInfo)); |
SkCanvas* canvas = surface->getCanvas(); |
canvas->clear(0); |
@@ -501,10 +505,35 @@ static void test_accessPixels(skiatest::Reporter* reporter, GrContextFactory* fa |
} |
} |
+static void test_snap_alphatype(skiatest::Reporter* reporter, GrContextFactory* factory) { |
+ GrContext* context = NULL; |
+#if SK_SUPPORT_GPU |
+ context = factory->get(GrContextFactory::kNative_GLContextType); |
+ if (NULL == context) { |
+ return; |
+ } |
+#endif |
+ for (int opaque = 0; opaque < 2; ++opaque) { |
+ SkAlphaType atype = SkToBool(opaque) ? kOpaque_SkAlphaType : kPremul_SkAlphaType; |
+ for (int st = 0; st < kSurfaceTypeCnt; ++st) { |
+ SurfaceType stype = (SurfaceType)st; |
+ SkAutoTUnref<SkSurface> surface(create_surface(stype, context, atype)); |
+ REPORTER_ASSERT(reporter, surface); |
+ if (surface) { |
+ SkAutoTUnref<SkImage> image(surface->newImageSnapshot()); |
+ REPORTER_ASSERT(reporter, image); |
+ if (image) { |
+ REPORTER_ASSERT(reporter, image->isOpaque() == SkToBool(opaque)); |
+ } |
+ } |
+ } |
+ } |
+} |
+ |
static void TestSurfaceCopyOnWrite(skiatest::Reporter* reporter, SurfaceType surfaceType, |
GrContext* context) { |
// Verify that the right canvas commands trigger a copy on write |
- SkSurface* surface = createSurface(surfaceType, context); |
+ SkSurface* surface = create_surface(surfaceType, context); |
SkAutoTUnref<SkSurface> aur_surface(surface); |
SkCanvas* canvas = surface->getCanvas(); |
@@ -587,7 +616,7 @@ static void TestSurfaceWritableAfterSnapshotRelease(skiatest::Reporter* reporter |
// This test succeeds by not triggering an assertion. |
// The test verifies that the surface remains writable (usable) after |
// acquiring and releasing a snapshot without triggering a copy on write. |
- SkAutoTUnref<SkSurface> surface(createSurface(surfaceType, context)); |
+ SkAutoTUnref<SkSurface> surface(create_surface(surfaceType, context)); |
SkCanvas* canvas = surface->getCanvas(); |
canvas->clear(1); |
surface->newImageSnapshot()->unref(); // Create and destroy SkImage |
@@ -602,8 +631,8 @@ static void Test_crbug263329(skiatest::Reporter* reporter, |
// Bug was caused by onCopyOnWrite releasing the old surface texture |
// back to the scratch texture pool even though the texture is used |
// by and active SkImage_Gpu. |
- SkAutoTUnref<SkSurface> surface1(createSurface(surfaceType, context)); |
- SkAutoTUnref<SkSurface> surface2(createSurface(surfaceType, context)); |
+ SkAutoTUnref<SkSurface> surface1(create_surface(surfaceType, context)); |
+ SkAutoTUnref<SkSurface> surface2(create_surface(surfaceType, context)); |
SkCanvas* canvas1 = surface1->getCanvas(); |
SkCanvas* canvas2 = surface2->getCanvas(); |
canvas1->clear(1); |
@@ -633,7 +662,7 @@ static void Test_crbug263329(skiatest::Reporter* reporter, |
static void TestGetTexture(skiatest::Reporter* reporter, |
SurfaceType surfaceType, |
GrContext* context) { |
- SkAutoTUnref<SkSurface> surface(createSurface(surfaceType, context)); |
+ SkAutoTUnref<SkSurface> surface(create_surface(surfaceType, context)); |
SkAutoTUnref<SkImage> image(surface->newImageSnapshot()); |
GrTexture* texture = as_IB(image)->getTexture(); |
if (surfaceType == kGpu_SurfaceType || surfaceType == kGpuScratch_SurfaceType) { |
@@ -700,13 +729,13 @@ static void TestSurfaceNoCanvas(skiatest::Reporter* reporter, |
// are made before a canvas is created. |
{ |
// Test passes by not asserting |
- SkSurface* surface = createSurface(surfaceType, context); |
+ SkSurface* surface = create_surface(surfaceType, context); |
SkAutoTUnref<SkSurface> aur_surface(surface); |
surface->notifyContentWillChange(mode); |
SkDEBUGCODE(surface->validate();) |
} |
{ |
- SkSurface* surface = createSurface(surfaceType, context); |
+ SkSurface* surface = create_surface(surfaceType, context); |
SkAutoTUnref<SkSurface> aur_surface(surface); |
SkImage* image1 = surface->newImageSnapshot(); |
SkAutoTUnref<SkImage> aur_image1(image1); |
@@ -740,6 +769,8 @@ DEF_GPUTEST(Surface, reporter, factory) { |
test_accessPixels(reporter, factory); |
+ test_snap_alphatype(reporter, factory); |
+ |
#if SK_SUPPORT_GPU |
TestGetTexture(reporter, kRaster_SurfaceType, NULL); |
if (factory) { |