Index: tests/SurfaceTest.cpp |
diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp |
index 20e75059664d254ca3c9138e699dc0fbbaea7e32..179a33c8bf59f5e469f5003b4858b24d8dad35e4 100644 |
--- a/tests/SurfaceTest.cpp |
+++ b/tests/SurfaceTest.cpp |
@@ -6,8 +6,11 @@ |
*/ |
#include "SkCanvas.h" |
+#include "SkData.h" |
+#include "SkImageEncoder.h" |
#include "SkRRect.h" |
#include "SkSurface.h" |
+#include "SkUtils.h" |
#include "Test.h" |
#if SK_SUPPORT_GPU |
@@ -24,31 +27,32 @@ enum SurfaceType { |
}; |
static SkSurface* createSurface(SurfaceType surfaceType, GrContext* context) { |
- static const SkImageInfo imageSpec = { |
- 10, // width |
- 10, // height |
- kPMColor_SkColorType, |
- kPremul_SkAlphaType |
- }; |
+ static const SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10); |
switch (surfaceType) { |
case kRaster_SurfaceType: |
- return SkSurface::NewRaster(imageSpec); |
+ return SkSurface::NewRaster(info); |
case kGpu_SurfaceType: |
#if SK_SUPPORT_GPU |
SkASSERT(NULL != context); |
- return SkSurface::NewRenderTarget(context, imageSpec); |
+ return SkSurface::NewRenderTarget(context, info); |
#else |
SkASSERT(0); |
#endif |
case kPicture_SurfaceType: |
- return SkSurface::NewPicture(10, 10); |
+ return SkSurface::NewPicture(info.fWidth, info.fHeight); |
} |
SkASSERT(0); |
return NULL; |
} |
-#include "SkData.h" |
+enum ImageType { |
+ kRasterCopy_ImageType, |
+ kRasterData_ImageType, |
+ kGpu_ImageType, |
+ kPicture_ImageType, |
+ kCodec_ImageType, |
+}; |
static void test_image(skiatest::Reporter* reporter) { |
SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1); |
@@ -56,7 +60,7 @@ static void test_image(skiatest::Reporter* reporter) { |
size_t size = info.getSafeSize(rowBytes); |
void* addr = sk_malloc_throw(size); |
SkData* data = SkData::NewFromMalloc(addr, size); |
- |
+ |
REPORTER_ASSERT(reporter, 1 == data->getRefCnt()); |
SkImage* image = SkImage::NewRasterData(info, data, rowBytes); |
REPORTER_ASSERT(reporter, 2 == data->getRefCnt()); |
@@ -65,6 +69,81 @@ static void test_image(skiatest::Reporter* reporter) { |
data->unref(); |
} |
+static SkImage* createImage(ImageType imageType, GrContext* context, |
+ SkColor color) { |
+ const SkPMColor pmcolor = SkPreMultiplyColor(color); |
+ const SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10); |
+ const size_t rowBytes = info.minRowBytes(); |
+ const size_t size = rowBytes * info.fHeight; |
+ |
+ void* addr = sk_malloc_throw(size); |
+ sk_memset32((SkPMColor*)addr, pmcolor, SkToInt(size >> 2)); |
+ SkAutoTUnref<SkData> data(SkData::NewFromMalloc(addr, size)); |
+ |
+ switch (imageType) { |
+ case kRasterCopy_ImageType: |
+ return SkImage::NewRasterCopy(info, addr, rowBytes); |
+ case kRasterData_ImageType: |
+ return SkImage::NewRasterData(info, data, rowBytes); |
+ case kGpu_ImageType: |
+ return NULL; // TODO |
+ case kPicture_ImageType: { |
+ SkAutoTUnref<SkSurface> surf(SkSurface::NewPicture(info.fWidth, |
+ info.fHeight)); |
+ surf->getCanvas()->drawColor(SK_ColorRED); |
+ return surf->newImageSnapshot(); |
+ } |
+ case kCodec_ImageType: { |
+ SkBitmap bitmap; |
+ bitmap.installPixels(info, addr, rowBytes, NULL, NULL); |
+ SkAutoTUnref<SkData> src( |
+ SkImageEncoder::EncodeData(bitmap, SkImageEncoder::kPNG_Type, |
+ 100)); |
+ return SkImage::NewEncodedData(src); |
+ } |
+ } |
+ SkASSERT(false); |
+ return NULL; |
+} |
+ |
+static void test_imagepeek(skiatest::Reporter* reporter) { |
+ static const struct { |
+ ImageType fType; |
+ bool fPeekShouldSucceed; |
+ } gRec[] = { |
+ { kRasterCopy_ImageType, true }, |
+ { kRasterData_ImageType, true }, |
+ { kGpu_ImageType, false }, |
+ { kPicture_ImageType, false }, |
+ { kCodec_ImageType, false }, |
+ }; |
+ |
+ const SkColor color = SK_ColorRED; |
+ const SkPMColor pmcolor = SkPreMultiplyColor(color); |
+ |
+ for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { |
+ SkImageInfo info; |
+ size_t rowBytes; |
+ |
+ SkAutoTUnref<SkImage> image(createImage(gRec[i].fType, NULL, color)); |
+ if (!image.get()) { |
+ continue; // gpu may not be enabled |
+ } |
+ const void* addr = image->peekPixels(&info, &rowBytes); |
+ bool success = (NULL != addr); |
+ REPORTER_ASSERT(reporter, gRec[i].fPeekShouldSucceed == success); |
+ if (success) { |
+ REPORTER_ASSERT(reporter, 10 == info.fWidth); |
+ REPORTER_ASSERT(reporter, 10 == info.fHeight); |
+ REPORTER_ASSERT(reporter, kPMColor_SkColorType == info.fColorType); |
+ REPORTER_ASSERT(reporter, kPremul_SkAlphaType == info.fAlphaType || |
+ kOpaque_SkAlphaType == info.fAlphaType); |
+ REPORTER_ASSERT(reporter, info.minRowBytes() <= rowBytes); |
+ REPORTER_ASSERT(reporter, pmcolor == *(const SkPMColor*)addr); |
+ } |
+ } |
+} |
+ |
static void TestSurfaceCopyOnWrite(skiatest::Reporter* reporter, SurfaceType surfaceType, |
GrContext* context) { |
// Verify that the right canvas commands trigger a copy on write |
@@ -257,6 +336,7 @@ DEF_GPUTEST(Surface, reporter, factory) { |
TestSurfaceWritableAfterSnapshotRelease(reporter, kPicture_SurfaceType, NULL); |
TestSurfaceNoCanvas(reporter, kRaster_SurfaceType, NULL, SkSurface::kDiscard_ContentChangeMode); |
TestSurfaceNoCanvas(reporter, kRaster_SurfaceType, NULL, SkSurface::kRetain_ContentChangeMode); |
+ test_imagepeek(reporter); |
#if SK_SUPPORT_GPU |
TestGetTexture(reporter, kRaster_SurfaceType, NULL); |
TestGetTexture(reporter, kPicture_SurfaceType, NULL); |