Index: tests/SurfaceTest.cpp |
diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp |
index 23a7f94f246f10e9cec299ed78565b6996c56ae4..a3ac216786c262882f2d59be04f7a23385779f16 100644 |
--- a/tests/SurfaceTest.cpp |
+++ b/tests/SurfaceTest.cpp |
@@ -617,3 +617,69 @@ DEF_GPUTEST(Surface, reporter, factory) { |
} |
#endif |
} |
+ |
+#if SK_SUPPORT_GPU |
+static SkImage* make_desc_image(GrContext* ctx, int w, int h, GrBackendObject texID, bool doCopy) { |
+ GrBackendTextureDesc desc; |
+ desc.fConfig = kSkia8888_GrPixelConfig; |
+ // need to be a rendertarget for now... |
+ desc.fFlags = kRenderTarget_GrBackendTextureFlag; |
+ desc.fWidth = w; |
+ desc.fHeight = h; |
+ desc.fSampleCnt = 0; |
+ desc.fTextureHandle = texID; |
+ return doCopy ? SkImage::NewFromTextureCopy(ctx, desc) : SkImage::NewFromTexture(ctx, desc); |
+} |
+ |
+static void test_image_color(skiatest::Reporter* reporter, SkImage* image, SkPMColor expected) { |
+ const SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1); |
+ SkPMColor pixel; |
+ REPORTER_ASSERT(reporter, image->readPixels(info, &pixel, sizeof(pixel), 0, 0)); |
+ REPORTER_ASSERT(reporter, pixel == expected); |
+} |
+ |
+DEF_GPUTEST(SkImage_NewFromTexture, reporter, factory) { |
+ GrContext* ctx = factory->get(GrContextFactory::kNative_GLContextType); |
+ if (!ctx) { |
+ REPORTER_ASSERT(reporter, false); |
+ return; |
+ } |
+ GrTextureProvider* provider = ctx->textureProvider(); |
+ |
+ const int w = 10; |
+ const int h = 10; |
+ SkPMColor storage[w * h]; |
+ const SkPMColor expected0 = SkPreMultiplyColor(SK_ColorRED); |
+ sk_memset32(storage, expected0, w * h); |
+ |
+ GrSurfaceDesc desc; |
+ desc.fFlags = kRenderTarget_GrSurfaceFlag; // needs to be a rendertarget for readpixels(); |
+ desc.fOrigin = kDefault_GrSurfaceOrigin; |
+ desc.fWidth = w; |
+ desc.fHeight = h; |
+ desc.fConfig = kSkia8888_GrPixelConfig; |
+ desc.fSampleCnt = 0; |
+ |
+ SkAutoTUnref<GrTexture> tex(provider->createTexture(desc, false, storage, w * 4)); |
+ if (!tex) { |
+ REPORTER_ASSERT(reporter, false); |
+ return; |
+ } |
+ |
+ GrBackendObject srcTex = tex->getTextureHandle(); |
+ SkAutoTUnref<SkImage> refImg(make_desc_image(ctx, w, h, srcTex, false)); |
+ SkAutoTUnref<SkImage> cpyImg(make_desc_image(ctx, w, h, srcTex, true)); |
+ |
+ test_image_color(reporter, refImg, expected0); |
+ test_image_color(reporter, cpyImg, expected0); |
+ |
+ // Now lets jam new colors into our "external" texture, and see if the images notice |
+ const SkPMColor expected1 = SkPreMultiplyColor(SK_ColorBLUE); |
+ sk_memset32(storage, expected1, w * h); |
+ tex->writePixels(0, 0, w, h, kSkia8888_GrPixelConfig, storage, GrContext::kFlushWrites_PixelOp); |
+ |
+ // We expect the ref'd image to see the new color, but cpy'd one should still see the old color |
+ test_image_color(reporter, refImg, expected1); |
+ test_image_color(reporter, cpyImg, expected0); |
+} |
+#endif |