Index: tests/ReadPixelsTest.cpp |
diff --git a/tests/ReadPixelsTest.cpp b/tests/ReadPixelsTest.cpp |
index 59c826fbf096ae05305b6980f18a850d8166a03c..9e9f53c7992995875900e956ba93cca989450421 100644 |
--- a/tests/ReadPixelsTest.cpp |
+++ b/tests/ReadPixelsTest.cpp |
@@ -15,6 +15,7 @@ |
#if SK_SUPPORT_GPU |
#include "GrContextFactory.h" |
#include "SkGpuDevice.h" |
+#include "SkGr.h" |
#endif |
static const int DEV_W = 100, DEV_H = 100; |
@@ -22,7 +23,7 @@ static const SkIRect DEV_RECT = SkIRect::MakeWH(DEV_W, DEV_H); |
static const SkRect DEV_RECT_S = SkRect::MakeWH(DEV_W * SK_Scalar1, |
DEV_H * SK_Scalar1); |
-static SkPMColor getCanvasColor(int x, int y) { |
+static SkPMColor get_src_color(int x, int y) { |
SkASSERT(x >= 0 && x < DEV_W); |
SkASSERT(y >= 0 && y < DEV_H); |
@@ -50,8 +51,8 @@ static SkPMColor getCanvasColor(int x, int y) { |
} |
return SkPremultiplyARGBInline(a, r, g, b); |
} |
- |
-static SkPMColor getBitmapColor(int x, int y, int w) { |
+ |
+static SkPMColor get_dst_bmp_init_color(int x, int y, int w) { |
int n = y * w + x; |
U8CPU b = n & 0xff; |
@@ -60,8 +61,8 @@ static SkPMColor getBitmapColor(int x, int y, int w) { |
return SkPackARGB32(0xff, r, g , b); |
} |
-static SkPMColor convertToPMColor(SkColorType ct, SkAlphaType at, const uint32_t* addr, |
- bool* doUnpremul) { |
+static SkPMColor convert_to_pmcolor(SkColorType ct, SkAlphaType at, const uint32_t* addr, |
+ bool* doUnpremul) { |
*doUnpremul = (kUnpremul_SkAlphaType == at); |
const uint8_t* c = reinterpret_cast<const uint8_t*>(addr); |
@@ -92,7 +93,7 @@ static SkPMColor convertToPMColor(SkColorType ct, SkAlphaType at, const uint32_t |
return SkPackARGB32(a, r, g, b); |
} |
-static void fillCanvas(SkCanvas* canvas) { |
+static SkBitmap make_src_bitmap() { |
static SkBitmap bmp; |
if (bmp.isNull()) { |
bmp.allocN32Pixels(DEV_W, DEV_H); |
@@ -100,20 +101,34 @@ static void fillCanvas(SkCanvas* canvas) { |
for (int y = 0; y < DEV_H; ++y) { |
for (int x = 0; x < DEV_W; ++x) { |
SkPMColor* pixel = reinterpret_cast<SkPMColor*>(pixels + y * bmp.rowBytes() + x * bmp.bytesPerPixel()); |
- *pixel = getCanvasColor(x, y); |
+ *pixel = get_src_color(x, y); |
} |
} |
} |
+ return bmp; |
+} |
+ |
+static void fill_src_canvas(SkCanvas* canvas) { |
canvas->save(); |
canvas->setMatrix(SkMatrix::I()); |
canvas->clipRect(DEV_RECT_S, SkRegion::kReplace_Op); |
SkPaint paint; |
paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
- canvas->drawBitmap(bmp, 0, 0, &paint); |
+ canvas->drawBitmap(make_src_bitmap(), 0, 0, &paint); |
canvas->restore(); |
} |
-static void fillBitmap(SkBitmap* bitmap) { |
+#if SK_SUPPORT_GPU |
+static void fill_src_texture(GrTexture* texture) { |
+ SkBitmap bmp = make_src_bitmap(); |
+ bmp.lockPixels(); |
+ texture->writePixels(0, 0, DEV_W, DEV_H, kSkia8888_GrPixelConfig, bmp.getPixels(), |
+ bmp.rowBytes()); |
+ bmp.unlockPixels(); |
+} |
+#endif |
+ |
+static void fill_dst_bmp_with_init_data(SkBitmap* bitmap) { |
SkASSERT(bitmap->lockPixelsAreWritable()); |
SkAutoLockPixels alp(*bitmap); |
int w = bitmap->width(); |
@@ -122,12 +137,12 @@ static void fillBitmap(SkBitmap* bitmap) { |
for (int y = 0; y < h; ++y) { |
for (int x = 0; x < w; ++x) { |
SkPMColor* pixel = reinterpret_cast<SkPMColor*>(pixels + y * bitmap->rowBytes() + x * bitmap->bytesPerPixel()); |
- *pixel = getBitmapColor(x, y, w); |
+ *pixel = get_dst_bmp_init_color(x, y, w); |
} |
} |
} |
-static bool checkPixel(SkPMColor a, SkPMColor b, bool didPremulConversion) { |
+static bool check_read_pixel(SkPMColor a, SkPMColor b, bool didPremulConversion) { |
if (!didPremulConversion) { |
return a == b; |
} |
@@ -150,11 +165,11 @@ static bool checkPixel(SkPMColor a, SkPMColor b, bool didPremulConversion) { |
// checks the bitmap contains correct pixels after the readPixels |
// if the bitmap was prefilled with pixels it checks that these weren't |
// overwritten in the area outside the readPixels. |
-static bool checkRead(skiatest::Reporter* reporter, |
- const SkBitmap& bitmap, |
- int x, int y, |
- bool checkCanvasPixels, |
- bool checkBitmapPixels) { |
+static bool check_read(skiatest::Reporter* reporter, |
+ const SkBitmap& bitmap, |
+ int x, int y, |
+ bool checkCanvasPixels, |
+ bool checkBitmapPixels) { |
SkASSERT(4 == bitmap.bytesPerPixel()); |
SkASSERT(!bitmap.isNull()); |
SkASSERT(checkCanvasPixels || checkBitmapPixels); |
@@ -180,18 +195,18 @@ static bool checkRead(skiatest::Reporter* reporter, |
if (clippedSrcRect.contains(devx, devy)) { |
if (checkCanvasPixels) { |
- SkPMColor canvasPixel = getCanvasColor(devx, devy); |
+ SkPMColor canvasPixel = get_src_color(devx, devy); |
bool didPremul; |
- SkPMColor pmPixel = convertToPMColor(ct, at, pixel, &didPremul); |
- bool check; |
- REPORTER_ASSERT(reporter, check = checkPixel(pmPixel, canvasPixel, didPremul)); |
+ SkPMColor pmPixel = convert_to_pmcolor(ct, at, pixel, &didPremul); |
+ bool check = check_read_pixel(pmPixel, canvasPixel, didPremul); |
+ REPORTER_ASSERT(reporter, check); |
if (!check) { |
return false; |
} |
} |
} else if (checkBitmapPixels) { |
- REPORTER_ASSERT(reporter, getBitmapColor(bx, by, bw) == *pixel); |
- if (getBitmapColor(bx, by, bw) != *pixel) { |
+ REPORTER_ASSERT(reporter, get_dst_bmp_init_color(bx, by, bw) == *pixel); |
+ if (get_dst_bmp_init_color(bx, by, bw) != *pixel) { |
return false; |
} |
} |
@@ -291,6 +306,9 @@ DEF_GPUTEST(ReadPixels, reporter, factory) { |
for (int dtype = 0; dtype < 3; ++dtype) { |
int glCtxTypeCnt = 1; |
#if SK_SUPPORT_GPU |
+ // On the GPU we will also try reading back from a non-renderable texture. |
+ SkAutoTUnref<GrTexture> texture; |
+ |
if (0 != dtype) { |
glCtxTypeCnt = GrContextFactory::kGLContextTypeCnt; |
} |
@@ -317,15 +335,24 @@ DEF_GPUTEST(ReadPixels, reporter, factory) { |
desc.fHeight = DEV_H; |
desc.fConfig = kSkia8888_GrPixelConfig; |
desc.fOrigin = 1 == dtype ? kBottomLeft_GrSurfaceOrigin : kTopLeft_GrSurfaceOrigin; |
- SkAutoTUnref<GrTexture> texture( |
+ SkAutoTUnref<GrTexture> surfaceTexture( |
context->textureProvider()->createTexture(desc, false)); |
- surface.reset(SkSurface::NewRenderTargetDirect(texture->asRenderTarget())); |
+ surface.reset(SkSurface::NewRenderTargetDirect(surfaceTexture->asRenderTarget())); |
+ desc.fFlags = kNone_GrSurfaceFlags; |
+ |
+ texture.reset(context->textureProvider()->createTexture(desc, false)); |
#else |
continue; |
#endif |
} |
SkCanvas& canvas = *surface->getCanvas(); |
- fillCanvas(&canvas); |
+ fill_src_canvas(&canvas); |
+ |
+#if SK_SUPPORT_GPU |
+ if (texture) { |
+ fill_src_texture(texture); |
+ } |
+#endif |
static const struct { |
SkColorType fColorType; |
@@ -348,7 +375,7 @@ DEF_GPUTEST(ReadPixels, reporter, factory) { |
// note that and fill them with pattern |
bool startsWithPixels = !bmp.isNull(); |
if (startsWithPixels) { |
- fillBitmap(&bmp); |
+ fill_dst_bmp_with_init_data(&bmp); |
} |
uint32_t idBefore = surface->generationID(); |
bool success = canvas.readPixels(&bmp, srcRect.fLeft, srcRect.fTop); |
@@ -363,13 +390,34 @@ DEF_GPUTEST(ReadPixels, reporter, factory) { |
REPORTER_ASSERT(reporter, idBefore == idAfter); |
if (success || startsWithPixels) { |
- checkRead(reporter, bmp, srcRect.fLeft, srcRect.fTop, |
- success, startsWithPixels); |
+ check_read(reporter, bmp, srcRect.fLeft, srcRect.fTop, |
+ success, startsWithPixels); |
} else { |
// if we had no pixels beforehand and the readPixels |
// failed then our bitmap should still not have pixels |
REPORTER_ASSERT(reporter, bmp.isNull()); |
} |
+#if SK_SUPPORT_GPU |
+ // Try doing the read directly from a non-renderable texture |
+ if (texture && startsWithPixels) { |
+ fill_dst_bmp_with_init_data(&bmp); |
+ GrPixelConfig dstConfig = |
+ SkImageInfo2GrPixelConfig(gReadConfigs[c].fColorType, |
+ gReadConfigs[c].fAlphaType, |
+ kLinear_SkColorProfileType); |
+ uint32_t flags = 0; |
+ if (gReadConfigs[c].fAlphaType == kUnpremul_SkAlphaType) { |
+ flags = GrContext::kUnpremul_PixelOpsFlag; |
+ } |
+ bmp.lockPixels(); |
+ success = texture->readPixels(srcRect.fLeft, srcRect.fTop, bmp.width(), |
+ bmp.height(), dstConfig, bmp.getPixels(), |
+ bmp.rowBytes(), flags); |
+ bmp.unlockPixels(); |
+ check_read(reporter, bmp, srcRect.fLeft, srcRect.fTop, |
+ success, true); |
+ } |
+#endif |
} |
// check the old webkit version of readPixels that clips the |
// bitmap size |
@@ -380,8 +428,8 @@ DEF_GPUTEST(ReadPixels, reporter, factory) { |
REPORTER_ASSERT(reporter, success); |
REPORTER_ASSERT(reporter, kN32_SkColorType == wkbmp.colorType()); |
REPORTER_ASSERT(reporter, kPremul_SkAlphaType == wkbmp.alphaType()); |
- checkRead(reporter, wkbmp, clippedRect.fLeft, |
- clippedRect.fTop, true, false); |
+ check_read(reporter, wkbmp, clippedRect.fLeft, |
+ clippedRect.fTop, true, false); |
} else { |
REPORTER_ASSERT(reporter, !success); |
} |