Index: content/common/gpu/client/gl_helper_unittest.cc |
diff --git a/content/common/gpu/client/gl_helper_unittest.cc b/content/common/gpu/client/gl_helper_unittest.cc |
index 974031f7b6732be0d457f74f5b4ca35516a79002..bfd538f9faca005cca461e88c1a9a235e12de04c 100644 |
--- a/content/common/gpu/client/gl_helper_unittest.cc |
+++ b/content/common/gpu/client/gl_helper_unittest.cc |
@@ -662,7 +662,8 @@ class GLHelperTest : public testing::Test { |
helper_->ReadbackTextureSync( |
dst_texture, |
gfx::Rect(0, 0, scaled_xsize, scaled_ysize), |
- static_cast<unsigned char*>(output_pixels.getPixels())); |
+ static_cast<unsigned char*>(output_pixels.getPixels()), |
+ SkBitmap::kARGB_8888_Config); |
if (flip) { |
// Flip the pixels back. |
FlipSKBitmap(&output_pixels); |
@@ -841,6 +842,127 @@ class GLHelperTest : public testing::Test { |
} |
} |
+ bool ColorComponentsClose(SkColor component1, |
+ SkColor component2, |
+ SkBitmap::Config config) { |
+ int c1 = static_cast<int>(component1); |
+ int c2 = static_cast<int>(component2); |
+ bool result = false; |
+ switch (config) { |
+ case SkBitmap::kARGB_8888_Config: |
+ result = (std::abs(c1 - c2) == 0); |
+ break; |
+ case SkBitmap::kRGB_565_Config: |
+ result = (std::abs(c1 - c2) <= 7); |
+ break; |
+ default: |
+ break; |
+ } |
+ return result; |
+ } |
+ |
+ bool ColorsClose(SkColor color1, SkColor color2, SkBitmap::Config config) { |
+ bool red = ColorComponentsClose(SkColorGetR(color1), |
+ SkColorGetR(color2), config); |
+ bool green = ColorComponentsClose(SkColorGetG(color1), |
+ SkColorGetG(color2), config); |
+ bool blue = ColorComponentsClose(SkColorGetB(color1), |
+ SkColorGetB(color2), config); |
+ bool alpha = ColorComponentsClose(SkColorGetA(color1), |
+ SkColorGetA(color2), config); |
+ if (config == SkBitmap::kRGB_565_Config) { |
+ return red && blue && green; |
+ } |
+ return red && blue && green && alpha; |
+ } |
+ |
+ bool IsEqual(const SkBitmap& bmp1, const SkBitmap& bmp2) { |
+ if (bmp1.isNull() && bmp2.isNull()) |
+ return true; |
+ if (bmp1.width() != bmp2.width() || |
+ bmp1.height() != bmp2.height()) { |
+ LOG(ERROR) << "Bitmap geometry check failure"; |
+ return false; |
+ } |
+ if (bmp1.getConfig() != bmp2.getConfig()) |
+ return false; |
+ |
+ SkAutoLockPixels lock1(bmp1); |
+ SkAutoLockPixels lock2(bmp2); |
+ if (!bmp1.getPixels() || !bmp2.getPixels()) { |
+ LOG(ERROR) << "Empty Bitmap!"; |
+ return false; |
+ } |
+ for (int y = 0; y < bmp1.height(); ++y) { |
+ for (int x = 0; x < bmp1.width(); ++x) { |
+ if (!ColorsClose(bmp1.getColor(x,y), |
+ bmp2.getColor(x,y), |
+ bmp1.getConfig())) { |
+ LOG(ERROR) << "Bitmap color comparision failure"; |
+ return false; |
+ } |
+ } |
+ } |
+ return true; |
+ } |
+ |
+ // Test basic format readback. |
+ bool TestTextureFormatReadback(const gfx::Size& src_size, |
+ SkBitmap::Config bitmap_config) { |
+ DCHECK((bitmap_config == SkBitmap::kRGB_565_Config) || |
+ (bitmap_config == SkBitmap::kARGB_8888_Config)); |
+ bool rgb565_format = (bitmap_config == SkBitmap::kRGB_565_Config); |
+ if (rgb565_format && !helper_->CanUseRgb565Readback()) { |
+ LOG(ERROR) << "RGB565 Format Not supported on this platform"; |
+ return false; |
+ } |
+ WebGLId src_texture = context_->createTexture(); |
+ SkBitmap input_pixels; |
+ input_pixels.setConfig(bitmap_config, src_size.width(), |
+ src_size.height()); |
+ input_pixels.allocPixels(); |
+ SkAutoLockPixels lock1(input_pixels); |
+ // Erase the input bitmap with red color. |
+ input_pixels.eraseColor(SK_ColorRED); |
+ context_->bindTexture(GL_TEXTURE_2D, src_texture); |
+ GLenum format = (bitmap_config == SkBitmap::kRGB_565_Config) ? |
+ GL_RGB : GL_RGBA; |
+ GLenum type = (bitmap_config == SkBitmap::kRGB_565_Config) ? |
+ GL_UNSIGNED_SHORT_5_6_5 : GL_UNSIGNED_BYTE; |
+ context_->texImage2D(GL_TEXTURE_2D, |
+ 0, |
+ format, |
+ src_size.width(), |
+ src_size.height(), |
+ 0, |
+ format, |
+ type, |
+ input_pixels.getPixels()); |
+ SkBitmap output_pixels; |
+ output_pixels.setConfig(bitmap_config, src_size.width(), |
+ src_size.height()); |
+ output_pixels.allocPixels(); |
+ SkAutoLockPixels lock2(output_pixels); |
+ // Initialize the output bitmap with Green color. |
+ // When the readback is over output bitmap should have the red color. |
+ output_pixels.eraseColor(SK_ColorGREEN); |
+ uint8* pixels = static_cast<uint8*>(output_pixels.getPixels()); |
+ helper_->ReadbackTextureSync(src_texture, |
+ gfx::Rect(src_size), |
+ pixels, |
+ bitmap_config); |
+ bool result = IsEqual(input_pixels, output_pixels); |
+ if (!result) { |
+ LOG(ERROR) << "Bitmap comparision failure"; |
+ return false; |
+ } |
+ context_->deleteTexture(src_texture); |
+ if (HasFailure()) { |
+ return false; |
+ } |
+ return true; |
+ } |
+ |
// YUV readback test. Create a test pattern, convert to YUV |
// with reference implementation and compare to what gl_helper |
// returns. |
@@ -1216,6 +1338,20 @@ class GLHelperTest : public testing::Test { |
std::deque<GLHelperScaling::ScaleOp> x_ops_, y_ops_; |
}; |
+TEST_F(GLHelperTest, RGBAReadBackTest) { |
+ const int kTestSize = 64; |
+ bool result = TestTextureFormatReadback(gfx::Size(kTestSize,kTestSize), |
+ SkBitmap::kARGB_8888_Config); |
+ EXPECT_EQ(result, true); |
+} |
+ |
+TEST_F(GLHelperTest, RGB565ReadBackTest) { |
+ const int kTestSize = 64; |
+ bool result = TestTextureFormatReadback(gfx::Size(kTestSize,kTestSize), |
+ SkBitmap::kRGB_565_Config); |
+ EXPECT_EQ(result, true); |
+} |
+ |
TEST_F(GLHelperTest, YUVReadbackOptTest) { |
// This test uses the cb_command tracing events to detect how many |
// scaling passes are actually performed by the YUV readback pipeline. |