| Index: tests/SurfaceTest.cpp
|
| diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp
|
| index aa457c7dcc82a610c60c77df69174611f202f390..fcd098646024098a94f5049ecc4078cc75b0b16e 100644
|
| --- a/tests/SurfaceTest.cpp
|
| +++ b/tests/SurfaceTest.cpp
|
| @@ -22,27 +22,37 @@ class GrContext;
|
|
|
| enum SurfaceType {
|
| kRaster_SurfaceType,
|
| + kRasterDirect_SurfaceType,
|
| kGpu_SurfaceType,
|
| kPicture_SurfaceType
|
| };
|
|
|
| -static SkSurface* createSurface(SurfaceType surfaceType, GrContext* context) {
|
| - static const SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10);
|
| +static const int gSurfaceSize = 10;
|
| +static SkPMColor gSurfaceStorage[gSurfaceSize * gSurfaceSize];
|
| +
|
| +static SkSurface* createSurface(SurfaceType surfaceType, GrContext* context,
|
| + SkImageInfo* requestedInfo = NULL) {
|
| + static const SkImageInfo info = SkImageInfo::MakeN32Premul(gSurfaceSize,
|
| + gSurfaceSize);
|
| +
|
| + if (requestedInfo) {
|
| + *requestedInfo = info;
|
| + }
|
|
|
| switch (surfaceType) {
|
| - case kRaster_SurfaceType:
|
| - return SkSurface::NewRaster(info);
|
| - case kGpu_SurfaceType:
|
| + case kRaster_SurfaceType:
|
| + return SkSurface::NewRaster(info);
|
| + case kRasterDirect_SurfaceType:
|
| + return SkSurface::NewRasterDirect(info, gSurfaceStorage,
|
| + info.minRowBytes());
|
| + case kGpu_SurfaceType:
|
| #if SK_SUPPORT_GPU
|
| - SkASSERT(NULL != context);
|
| - return SkSurface::NewRenderTarget(context, info);
|
| -#else
|
| - SkASSERT(0);
|
| + return context ? SkSurface::NewRenderTarget(context, info) : NULL;
|
| #endif
|
| - case kPicture_SurfaceType:
|
| - return SkSurface::NewPicture(info.fWidth, info.fHeight);
|
| + break;
|
| + case kPicture_SurfaceType:
|
| + return SkSurface::NewPicture(info.fWidth, info.fHeight);
|
| }
|
| - SkASSERT(0);
|
| return NULL;
|
| }
|
|
|
| @@ -117,14 +127,14 @@ static void test_imagepeek(skiatest::Reporter* reporter) {
|
| { 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
|
| @@ -137,13 +147,65 @@ static void test_imagepeek(skiatest::Reporter* reporter) {
|
| REPORTER_ASSERT(reporter, 10 == info.fHeight);
|
| REPORTER_ASSERT(reporter, kPMColor_SkColorType == info.fColorType);
|
| REPORTER_ASSERT(reporter, kPremul_SkAlphaType == info.fAlphaType ||
|
| - kOpaque_SkAlphaType == info.fAlphaType);
|
| + kOpaque_SkAlphaType == info.fAlphaType);
|
| REPORTER_ASSERT(reporter, info.minRowBytes() <= rowBytes);
|
| REPORTER_ASSERT(reporter, pmcolor == *(const SkPMColor*)addr);
|
| }
|
| }
|
| }
|
|
|
| +static void test_canvaspeek(skiatest::Reporter* reporter,
|
| + GrContextFactory* factory) {
|
| + static const struct {
|
| + SurfaceType fType;
|
| + bool fPeekShouldSucceed;
|
| + } gRec[] = {
|
| + { kRaster_SurfaceType, true },
|
| + { kRasterDirect_SurfaceType, true },
|
| +#if SK_SUPPORT_GPU
|
| + { kGpu_SurfaceType, false },
|
| +#endif
|
| + { kPicture_SurfaceType, false },
|
| + };
|
| +
|
| + const SkColor color = SK_ColorRED;
|
| + const SkPMColor pmcolor = SkPreMultiplyColor(color);
|
| +
|
| + GrContext* context = NULL;
|
| +#if SK_SUPPORT_GPU
|
| + context = factory->get(GrContextFactory::kNative_GLContextType);
|
| +#endif
|
| +
|
| + for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) {
|
| + SkImageInfo info, requestInfo;
|
| + size_t rowBytes;
|
| +
|
| + SkAutoTUnref<SkSurface> surface(createSurface(gRec[i].fType, context,
|
| + &requestInfo));
|
| + surface->getCanvas()->clear(color);
|
| +
|
| + const void* addr = surface->getCanvas()->peekPixels(&info, &rowBytes);
|
| + bool success = (NULL != addr);
|
| + REPORTER_ASSERT(reporter, gRec[i].fPeekShouldSucceed == success);
|
| +
|
| + SkImageInfo info2;
|
| + size_t rb2;
|
| + const void* addr2 = surface->peekPixels(&info2, &rb2);
|
| +
|
| + if (success) {
|
| + REPORTER_ASSERT(reporter, requestInfo == info);
|
| + REPORTER_ASSERT(reporter, requestInfo.minRowBytes() <= rowBytes);
|
| + REPORTER_ASSERT(reporter, pmcolor == *(const SkPMColor*)addr);
|
| +
|
| + REPORTER_ASSERT(reporter, addr2 == addr);
|
| + REPORTER_ASSERT(reporter, info2 == info);
|
| + REPORTER_ASSERT(reporter, rb2 == rowBytes);
|
| + } else {
|
| + REPORTER_ASSERT(reporter, NULL == addr2);
|
| + }
|
| + }
|
| +}
|
| +
|
| static void TestSurfaceCopyOnWrite(skiatest::Reporter* reporter, SurfaceType surfaceType,
|
| GrContext* context) {
|
| // Verify that the right canvas commands trigger a copy on write
|
| @@ -335,7 +397,10 @@ 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);
|
| + test_canvaspeek(reporter, factory);
|
| +
|
| #if SK_SUPPORT_GPU
|
| TestGetTexture(reporter, kRaster_SurfaceType, NULL);
|
| TestGetTexture(reporter, kPicture_SurfaceType, NULL);
|
|
|