Index: ui/compositor/layer_unittest.cc |
diff --git a/ui/compositor/layer_unittest.cc b/ui/compositor/layer_unittest.cc |
index defb4a24020a541e5fabb83aa47800dceaab5ad4..404b0b6f781563ec250ab08029eeff107af815dd 100644 |
--- a/ui/compositor/layer_unittest.cc |
+++ b/ui/compositor/layer_unittest.cc |
@@ -847,6 +847,21 @@ TEST_F(LayerWithNullDelegateTest, SetBoundsSchedulesPaint) { |
WaitForDraw(); |
} |
+void ExpectRgba(int x, int y, SkColor expected_color, SkColor actual_color) { |
+ EXPECT_EQ(expected_color, actual_color) |
+ << "Pixel error at x=" << x << " y=" << y << "; " |
+ << "actual RGBA=(" |
+ << SkColorGetR(actual_color) << "," |
+ << SkColorGetG(actual_color) << "," |
+ << SkColorGetB(actual_color) << "," |
+ << SkColorGetA(actual_color) << "); " |
+ << "expected RGBA=(" |
+ << SkColorGetR(expected_color) << "," |
+ << SkColorGetG(expected_color) << "," |
+ << SkColorGetB(expected_color) << "," |
+ << SkColorGetA(expected_color) << ")"; |
+} |
+ |
// Checks that pixels are actually drawn to the screen with a read back. |
TEST_F(LayerWithRealCompositorTest, DrawPixels) { |
gfx::Size viewport_size = GetCompositor()->size(); |
@@ -877,18 +892,86 @@ TEST_F(LayerWithRealCompositorTest, DrawPixels) { |
for (int y = 0; y < viewport_size.height(); y++) { |
SkColor actual_color = bitmap.getColor(x, y); |
SkColor expected_color = y < blue_height ? SK_ColorBLUE : SK_ColorRED; |
- EXPECT_EQ(expected_color, actual_color) |
- << "Pixel error at x=" << x << " y=" << y << "; " |
- << "actual RGBA=(" |
- << SkColorGetR(actual_color) << "," |
- << SkColorGetG(actual_color) << "," |
- << SkColorGetB(actual_color) << "," |
- << SkColorGetA(actual_color) << "); " |
- << "expected RGBA=(" |
- << SkColorGetR(expected_color) << "," |
- << SkColorGetG(expected_color) << "," |
- << SkColorGetB(expected_color) << "," |
- << SkColorGetA(expected_color) << ")"; |
+ ExpectRgba(x, y, expected_color, actual_color); |
+ } |
+ } |
+} |
+ |
+// Checks that drawing a layer with transparent pixels is blended correctly |
+// with the lower layer. |
+TEST_F(LayerWithRealCompositorTest, DrawAlphaBlendedPixels) { |
+ gfx::Size viewport_size = GetCompositor()->size(); |
+ |
+ int test_size = 200; |
+ EXPECT_GE(viewport_size.width(), test_size); |
+ EXPECT_GE(viewport_size.height(), test_size); |
+ |
+ // Blue with a wee bit of transparency. |
+ SkColor blue_with_alpha = SkColorSetARGBInline(40, 10, 20, 200); |
+ SkColor blend_color = SkColorSetARGBInline(255, 216, 3, 32); |
+ |
+ scoped_ptr<Layer> background_layer( |
+ CreateColorLayer(SK_ColorRED, gfx::Rect(viewport_size))); |
+ scoped_ptr<Layer> foreground_layer( |
+ CreateColorLayer(blue_with_alpha, gfx::Rect(viewport_size))); |
+ |
+ // This must be set to false for layers with alpha to be blended correctly. |
+ foreground_layer->SetFillsBoundsOpaquely(false); |
+ |
+ background_layer->Add(foreground_layer.get()); |
+ DrawTree(background_layer.get()); |
+ |
+ SkBitmap bitmap; |
+ ASSERT_TRUE(ReadPixels(&bitmap, gfx::Rect(viewport_size))); |
+ ASSERT_FALSE(bitmap.empty()); |
+ |
+ SkAutoLockPixels lock(bitmap); |
+ for (int x = 0; x < test_size; x++) { |
+ for (int y = 0; y < test_size; y++) { |
+ SkColor actual_color = bitmap.getColor(x, y); |
+ ExpectRgba(x, y, blend_color, actual_color); |
+ } |
+ } |
+} |
+ |
+// Checks that using the AlphaShape filter applied to a layer with |
+// transparency, alpha-blends properly with the layer below. |
+TEST_F(LayerWithRealCompositorTest, DrawAlphaThresholdFilterPixels) { |
+ gfx::Size viewport_size = GetCompositor()->size(); |
+ |
+ int test_size = 200; |
+ EXPECT_GE(viewport_size.width(), test_size); |
+ EXPECT_GE(viewport_size.height(), test_size); |
+ |
+ int blue_height = 10; |
+ SkColor blue_with_alpha = SkColorSetARGBInline(40, 0, 0, 255); |
+ SkColor blend_color = SkColorSetARGBInline(255, 215, 0, 40); |
+ |
+ scoped_ptr<Layer> background_layer( |
+ CreateColorLayer(SK_ColorRED, gfx::Rect(viewport_size))); |
+ scoped_ptr<Layer> foreground_layer( |
+ CreateColorLayer(blue_with_alpha, gfx::Rect(viewport_size))); |
+ |
+ // Add a shape to restrict the visible part of the layer. |
+ SkRegion shape; |
+ shape.setRect(0, 0, viewport_size.width(), blue_height); |
+ foreground_layer->SetAlphaShape(make_scoped_ptr(new SkRegion(shape))); |
+ |
+ foreground_layer->SetFillsBoundsOpaquely(false); |
+ |
+ background_layer->Add(foreground_layer.get()); |
+ DrawTree(background_layer.get()); |
+ |
+ SkBitmap bitmap; |
+ ASSERT_TRUE(ReadPixels(&bitmap, gfx::Rect(viewport_size))); |
+ ASSERT_FALSE(bitmap.empty()); |
+ |
+ SkAutoLockPixels lock(bitmap); |
+ for (int x = 0; x < test_size; x++) { |
+ for (int y = 0; y < test_size; y++) { |
+ SkColor actual_color = bitmap.getColor(x, y); |
+ ExpectRgba(x, y, actual_color, |
+ y < blue_height ? blend_color : SK_ColorRED); |
} |
} |
} |