Index: ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm |
diff --git a/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm b/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm |
index 3c5dd7ef592427126c4398c3a24f53a77a17b85c..e8cabcd6d9437611691722814e45a0204594e9ed 100644 |
--- a/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm |
+++ b/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm |
@@ -39,6 +39,9 @@ |
float scale_factor = 1.0f; |
unsigned filter = GL_LINEAR; |
scoped_refptr<gl::GLImageIOSurface> gl_image; |
+ |
+ bool allow_av_layers = true; |
+ bool allow_solid_color_layers = true; |
}; |
scoped_refptr<gl::GLImageIOSurface> CreateGLImage(const gfx::Size& size, |
@@ -74,20 +77,8 @@ void UpdateCALayerTree(std::unique_ptr<ui::CARendererLayerTree>& ca_layer_tree, |
CALayerProperties* properties, |
CALayer* superlayer) { |
std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree( |
- new ui::CARendererLayerTree(true)); |
- bool result = ScheduleCALayer(new_ca_layer_tree.get(), properties); |
- EXPECT_TRUE(result); |
- new_ca_layer_tree->CommitScheduledCALayers( |
- superlayer, std::move(ca_layer_tree), properties->scale_factor); |
- std::swap(new_ca_layer_tree, ca_layer_tree); |
-} |
- |
-void UpdateCALayerTreeWithAVDisabled( |
- std::unique_ptr<ui::CARendererLayerTree>& ca_layer_tree, |
- CALayerProperties* properties, |
- CALayer* superlayer) { |
- std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree( |
- new ui::CARendererLayerTree(false)); |
+ new ui::CARendererLayerTree(properties->allow_av_layers, |
+ properties->allow_solid_color_layers)); |
bool result = ScheduleCALayer(new_ca_layer_tree.get(), properties); |
EXPECT_TRUE(result); |
new_ca_layer_tree->CommitScheduledCALayers( |
@@ -110,352 +101,385 @@ void SetUp() override { |
}; |
// Test updating each layer's properties. |
-TEST_F(CALayerTreeTest, PropertyUpdates) { |
- CALayerProperties properties; |
- properties.clip_rect = gfx::Rect(2, 4, 8, 16); |
- properties.transform.Translate(10, 20); |
- properties.contents_rect = gfx::RectF(0.0f, 0.25f, 0.5f, 0.75f); |
- properties.rect = gfx::Rect(16, 32, 64, 128); |
- properties.background_color = SkColorSetARGB(0xFF, 0xFF, 0, 0); |
- properties.edge_aa_mask = GL_CA_LAYER_EDGE_LEFT_CHROMIUM; |
- properties.opacity = 0.5f; |
- properties.gl_image = |
- CreateGLImage(gfx::Size(256, 256), gfx::BufferFormat::BGRA_8888, false); |
- |
- std::unique_ptr<ui::CARendererLayerTree> ca_layer_tree; |
- CALayer* root_layer = nil; |
- CALayer* clip_and_sorting_layer = nil; |
- CALayer* transform_layer = nil; |
- CALayer* content_layer = nil; |
- |
- // Validate the initial values. |
- { |
- std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree( |
- new ui::CARendererLayerTree(true)); |
- |
- UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
- |
- // Validate the tree structure. |
- EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
- root_layer = [[superlayer_ sublayers] objectAtIndex:0]; |
- EXPECT_EQ(1u, [[root_layer sublayers] count]); |
- clip_and_sorting_layer = [[root_layer sublayers] objectAtIndex:0]; |
- EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
- transform_layer = [[clip_and_sorting_layer sublayers] objectAtIndex:0]; |
- EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
- content_layer = [[transform_layer sublayers] objectAtIndex:0]; |
- |
- // Validate the clip and sorting context layer. |
- EXPECT_TRUE([clip_and_sorting_layer masksToBounds]); |
- EXPECT_EQ(gfx::Rect(properties.clip_rect.size()), |
- gfx::Rect([clip_and_sorting_layer bounds])); |
- EXPECT_EQ(properties.clip_rect.origin(), |
- gfx::Point([clip_and_sorting_layer position])); |
- EXPECT_EQ(-properties.clip_rect.origin().x(), |
- [clip_and_sorting_layer sublayerTransform].m41); |
- EXPECT_EQ(-properties.clip_rect.origin().y(), |
- [clip_and_sorting_layer sublayerTransform].m42); |
- |
- // Validate the transform layer. |
- EXPECT_EQ(properties.transform.matrix().get(3, 0), |
- [transform_layer sublayerTransform].m41); |
- EXPECT_EQ(properties.transform.matrix().get(3, 1), |
- [transform_layer sublayerTransform].m42); |
- |
- // Validate the content layer. |
- EXPECT_EQ(static_cast<id>(properties.gl_image->io_surface().get()), |
- [content_layer contents]); |
- EXPECT_EQ(properties.contents_rect, |
- gfx::RectF([content_layer contentsRect])); |
- EXPECT_EQ(properties.rect.origin(), gfx::Point([content_layer position])); |
- EXPECT_EQ(gfx::Rect(properties.rect.size()), |
- gfx::Rect([content_layer bounds])); |
- EXPECT_EQ(kCALayerLeftEdge, [content_layer edgeAntialiasingMask]); |
- EXPECT_EQ(properties.opacity, [content_layer opacity]); |
- EXPECT_NSEQ(kCAFilterLinear, [content_layer minificationFilter]); |
- EXPECT_NSEQ(kCAFilterLinear, [content_layer magnificationFilter]); |
- if ([content_layer respondsToSelector:(@selector(contentsScale))]) |
- EXPECT_EQ(properties.scale_factor, [content_layer contentsScale]); |
- } |
- |
- // Update just the clip rect and re-commit. |
- { |
- properties.clip_rect = gfx::Rect(4, 8, 16, 32); |
- UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
- |
- // Validate the tree structure |
- EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
- EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[root_layer sublayers] count]); |
- EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
- EXPECT_EQ(transform_layer, |
- [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
- |
- // Validate the clip and sorting context layer. |
- EXPECT_TRUE([clip_and_sorting_layer masksToBounds]); |
- EXPECT_EQ(gfx::Rect(properties.clip_rect.size()), |
- gfx::Rect([clip_and_sorting_layer bounds])); |
- EXPECT_EQ(properties.clip_rect.origin(), |
- gfx::Point([clip_and_sorting_layer position])); |
- EXPECT_EQ(-properties.clip_rect.origin().x(), |
- [clip_and_sorting_layer sublayerTransform].m41); |
- EXPECT_EQ(-properties.clip_rect.origin().y(), |
- [clip_and_sorting_layer sublayerTransform].m42); |
- } |
- |
- // Disable clipping and re-commit. |
- { |
- properties.is_clipped = false; |
- UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
- |
- // Validate the tree structure |
- EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
- EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[root_layer sublayers] count]); |
- EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
- EXPECT_EQ(transform_layer, |
- [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
- |
- // Validate the clip and sorting context layer. |
- EXPECT_FALSE([clip_and_sorting_layer masksToBounds]); |
- EXPECT_EQ(gfx::Rect(), gfx::Rect([clip_and_sorting_layer bounds])); |
- EXPECT_EQ(gfx::Point(), gfx::Point([clip_and_sorting_layer position])); |
- EXPECT_EQ(0.0, [clip_and_sorting_layer sublayerTransform].m41); |
- EXPECT_EQ(0.0, [clip_and_sorting_layer sublayerTransform].m42); |
- EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
- } |
- |
- // Change the transform and re-commit. |
- { |
- properties.transform.Translate(5, 5); |
- UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
- |
- // Validate the tree structure. |
- EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
- EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[root_layer sublayers] count]); |
- EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
- EXPECT_EQ(transform_layer, |
- [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
- |
- // Validate the transform layer. |
- EXPECT_EQ(properties.transform.matrix().get(3, 0), |
- [transform_layer sublayerTransform].m41); |
- EXPECT_EQ(properties.transform.matrix().get(3, 1), |
- [transform_layer sublayerTransform].m42); |
- } |
- |
- // Change the edge antialiasing mask and commit. |
- { |
- properties.edge_aa_mask = GL_CA_LAYER_EDGE_TOP_CHROMIUM; |
- UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
- |
- // Validate the tree structure. |
- EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
- EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[root_layer sublayers] count]); |
- EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
- EXPECT_EQ(transform_layer, |
- [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
- EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]); |
- |
- // Validate the content layer. Note that top and bottom edges flip. |
- EXPECT_EQ(kCALayerBottomEdge, [content_layer edgeAntialiasingMask]); |
- } |
- |
- // Change the contents and commit. |
- { |
- properties.gl_image->Destroy(true); |
- properties.gl_image = nullptr; |
- UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
- |
- // Validate the tree structure. |
- EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
- EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[root_layer sublayers] count]); |
- EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
- EXPECT_EQ(transform_layer, |
- [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
- EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]); |
- |
- // Validate the content layer. Note that edge anti-aliasing no longer flips. |
- EXPECT_EQ(nil, [content_layer contents]); |
- EXPECT_EQ(kCALayerTopEdge, [content_layer edgeAntialiasingMask]); |
- } |
- |
- // Change the rect size. |
- { |
- properties.rect = gfx::Rect(properties.rect.origin(), gfx::Size(32, 16)); |
- UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
- |
- // Validate the tree structure. |
- EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
- EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[root_layer sublayers] count]); |
- EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
- EXPECT_EQ(transform_layer, |
- [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
- EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]); |
- |
- // Validate the content layer. |
- EXPECT_EQ(properties.rect.origin(), gfx::Point([content_layer position])); |
- EXPECT_EQ(gfx::Rect(properties.rect.size()), |
- gfx::Rect([content_layer bounds])); |
- } |
- |
- // Change the rect position. |
- { |
- properties.rect = gfx::Rect(gfx::Point(16, 4), properties.rect.size()); |
- UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
- |
- // Validate the tree structure. |
- EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
- EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[root_layer sublayers] count]); |
- EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
- EXPECT_EQ(transform_layer, |
- [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
- EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]); |
- |
- // Validate the content layer. |
- EXPECT_EQ(properties.rect.origin(), gfx::Point([content_layer position])); |
- EXPECT_EQ(gfx::Rect(properties.rect.size()), |
- gfx::Rect([content_layer bounds])); |
- } |
- |
- // Change the opacity. |
- { |
- properties.opacity = 1.0f; |
- UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
- |
- // Validate the tree structure. |
- EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
- EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[root_layer sublayers] count]); |
- EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
- EXPECT_EQ(transform_layer, |
- [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
- EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]); |
- |
- // Validate the content layer. |
- EXPECT_EQ(properties.opacity, [content_layer opacity]); |
- } |
- |
- // Change the filter. |
- { |
- properties.filter = GL_NEAREST; |
- UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
- |
- // Validate the tree structure. |
- EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
- EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[root_layer sublayers] count]); |
- EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
- EXPECT_EQ(transform_layer, |
- [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
- EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]); |
- |
- // Validate the content layer. |
- EXPECT_NSEQ(kCAFilterNearest, [content_layer minificationFilter]); |
- EXPECT_NSEQ(kCAFilterNearest, [content_layer magnificationFilter]); |
- } |
- |
- // Add the clipping and IOSurface contents back. |
- { |
- properties.is_clipped = true; |
+class CALayerTreePropertyUpdatesTest : public CALayerTreeTest { |
+ public: |
+ void RunTest(bool allow_solid_color_layers) { |
+ CALayerProperties properties; |
+ properties.allow_solid_color_layers = allow_solid_color_layers; |
+ properties.clip_rect = gfx::Rect(2, 4, 8, 16); |
+ properties.transform.Translate(10, 20); |
+ properties.contents_rect = gfx::RectF(0.0f, 0.25f, 0.5f, 0.75f); |
+ properties.rect = gfx::Rect(16, 32, 64, 128); |
+ properties.background_color = SkColorSetARGB(0xFF, 0xFF, 0, 0); |
+ properties.edge_aa_mask = GL_CA_LAYER_EDGE_LEFT_CHROMIUM; |
+ properties.opacity = 0.5f; |
properties.gl_image = |
CreateGLImage(gfx::Size(256, 256), gfx::BufferFormat::BGRA_8888, false); |
- UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
- // Validate the tree structure. |
- EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
- EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[root_layer sublayers] count]); |
- EXPECT_EQ(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
- EXPECT_EQ(transform_layer, |
- [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
- EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
- EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]); |
+ std::unique_ptr<ui::CARendererLayerTree> ca_layer_tree; |
+ CALayer* root_layer = nil; |
+ CALayer* clip_and_sorting_layer = nil; |
+ CALayer* transform_layer = nil; |
+ CALayer* content_layer = nil; |
+ |
+ // Validate the initial values. |
+ { |
+ std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree( |
+ new ui::CARendererLayerTree(true, allow_solid_color_layers)); |
+ |
+ UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
+ |
+ // Validate the tree structure. |
+ EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
+ root_layer = [[superlayer_ sublayers] objectAtIndex:0]; |
+ EXPECT_EQ(1u, [[root_layer sublayers] count]); |
+ clip_and_sorting_layer = [[root_layer sublayers] objectAtIndex:0]; |
+ EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
+ transform_layer = [[clip_and_sorting_layer sublayers] objectAtIndex:0]; |
+ EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
+ content_layer = [[transform_layer sublayers] objectAtIndex:0]; |
+ |
+ // Validate the clip and sorting context layer. |
+ EXPECT_TRUE([clip_and_sorting_layer masksToBounds]); |
+ EXPECT_EQ(gfx::Rect(properties.clip_rect.size()), |
+ gfx::Rect([clip_and_sorting_layer bounds])); |
+ EXPECT_EQ(properties.clip_rect.origin(), |
+ gfx::Point([clip_and_sorting_layer position])); |
+ EXPECT_EQ(-properties.clip_rect.origin().x(), |
+ [clip_and_sorting_layer sublayerTransform].m41); |
+ EXPECT_EQ(-properties.clip_rect.origin().y(), |
+ [clip_and_sorting_layer sublayerTransform].m42); |
+ |
+ // Validate the transform layer. |
+ EXPECT_EQ(properties.transform.matrix().get(3, 0), |
+ [transform_layer sublayerTransform].m41); |
+ EXPECT_EQ(properties.transform.matrix().get(3, 1), |
+ [transform_layer sublayerTransform].m42); |
+ |
+ // Validate the content layer. |
+ EXPECT_EQ(static_cast<id>(properties.gl_image->io_surface().get()), |
+ [content_layer contents]); |
+ EXPECT_EQ(properties.contents_rect, |
+ gfx::RectF([content_layer contentsRect])); |
+ EXPECT_EQ(properties.rect.origin(), gfx::Point([content_layer position])); |
+ EXPECT_EQ(gfx::Rect(properties.rect.size()), |
+ gfx::Rect([content_layer bounds])); |
+ EXPECT_EQ(kCALayerLeftEdge, [content_layer edgeAntialiasingMask]); |
+ EXPECT_EQ(properties.opacity, [content_layer opacity]); |
+ EXPECT_NSEQ(kCAFilterLinear, [content_layer minificationFilter]); |
+ EXPECT_NSEQ(kCAFilterLinear, [content_layer magnificationFilter]); |
+ if ([content_layer respondsToSelector:(@selector(contentsScale))]) |
+ EXPECT_EQ(properties.scale_factor, [content_layer contentsScale]); |
+ } |
+ |
+ // Update just the clip rect and re-commit. |
+ { |
+ properties.clip_rect = gfx::Rect(4, 8, 16, 32); |
+ UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
+ |
+ // Validate the tree structure |
+ EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
+ EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[root_layer sublayers] count]); |
+ EXPECT_EQ(clip_and_sorting_layer, |
+ [[root_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
+ EXPECT_EQ(transform_layer, |
+ [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
+ |
+ // Validate the clip and sorting context layer. |
+ EXPECT_TRUE([clip_and_sorting_layer masksToBounds]); |
+ EXPECT_EQ(gfx::Rect(properties.clip_rect.size()), |
+ gfx::Rect([clip_and_sorting_layer bounds])); |
+ EXPECT_EQ(properties.clip_rect.origin(), |
+ gfx::Point([clip_and_sorting_layer position])); |
+ EXPECT_EQ(-properties.clip_rect.origin().x(), |
+ [clip_and_sorting_layer sublayerTransform].m41); |
+ EXPECT_EQ(-properties.clip_rect.origin().y(), |
+ [clip_and_sorting_layer sublayerTransform].m42); |
+ } |
+ |
+ // Disable clipping and re-commit. |
+ { |
+ properties.is_clipped = false; |
+ UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
+ |
+ // Validate the tree structure |
+ EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
+ EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[root_layer sublayers] count]); |
+ EXPECT_EQ(clip_and_sorting_layer, |
+ [[root_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
+ EXPECT_EQ(transform_layer, |
+ [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
+ |
+ // Validate the clip and sorting context layer. |
+ EXPECT_FALSE([clip_and_sorting_layer masksToBounds]); |
+ EXPECT_EQ(gfx::Rect(), gfx::Rect([clip_and_sorting_layer bounds])); |
+ EXPECT_EQ(gfx::Point(), gfx::Point([clip_and_sorting_layer position])); |
+ EXPECT_EQ(0.0, [clip_and_sorting_layer sublayerTransform].m41); |
+ EXPECT_EQ(0.0, [clip_and_sorting_layer sublayerTransform].m42); |
+ EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
+ } |
+ |
+ // Change the transform and re-commit. |
+ { |
+ properties.transform.Translate(5, 5); |
+ UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
+ |
+ // Validate the tree structure. |
+ EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
+ EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[root_layer sublayers] count]); |
+ EXPECT_EQ(clip_and_sorting_layer, |
+ [[root_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
+ EXPECT_EQ(transform_layer, |
+ [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
+ |
+ // Validate the transform layer. |
+ EXPECT_EQ(properties.transform.matrix().get(3, 0), |
+ [transform_layer sublayerTransform].m41); |
+ EXPECT_EQ(properties.transform.matrix().get(3, 1), |
+ [transform_layer sublayerTransform].m42); |
+ } |
+ |
+ // Change the edge antialiasing mask and commit. |
+ { |
+ properties.edge_aa_mask = GL_CA_LAYER_EDGE_TOP_CHROMIUM; |
+ UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
+ |
+ // Validate the tree structure. |
+ EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
+ EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[root_layer sublayers] count]); |
+ EXPECT_EQ(clip_and_sorting_layer, |
+ [[root_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
+ EXPECT_EQ(transform_layer, |
+ [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
+ EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]); |
+ |
+ // Validate the content layer. Note that top and bottom edges flip. |
+ EXPECT_EQ(kCALayerBottomEdge, [content_layer edgeAntialiasingMask]); |
+ } |
+ |
+ // Change the contents and commit. |
+ { |
+ properties.gl_image->Destroy(true); |
+ properties.gl_image = nullptr; |
+ UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
+ |
+ // Validate the tree structure. |
+ EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
+ EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[root_layer sublayers] count]); |
+ EXPECT_EQ(clip_and_sorting_layer, |
+ [[root_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
+ EXPECT_EQ(transform_layer, |
+ [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
+ EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]); |
+ |
+ // Validate the content layer. Note that edge anti-aliasing does not flip |
+ // for solid colors. |
+ if (allow_solid_color_layers) { |
+ EXPECT_EQ(nil, [content_layer contents]); |
+ EXPECT_EQ(kCALayerTopEdge, [content_layer edgeAntialiasingMask]); |
+ } else { |
+ EXPECT_EQ(ca_layer_tree->ContentsForSolidColorForTesting( |
+ properties.background_color), |
+ [content_layer contents]); |
+ EXPECT_EQ(kCALayerBottomEdge, [content_layer edgeAntialiasingMask]); |
+ } |
+ } |
+ |
+ // Change the rect size. |
+ { |
+ properties.rect = gfx::Rect(properties.rect.origin(), gfx::Size(32, 16)); |
+ UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
+ |
+ // Validate the tree structure. |
+ EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
+ EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[root_layer sublayers] count]); |
+ EXPECT_EQ(clip_and_sorting_layer, |
+ [[root_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
+ EXPECT_EQ(transform_layer, |
+ [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
+ EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]); |
+ |
+ // Validate the content layer. |
+ EXPECT_EQ(properties.rect.origin(), gfx::Point([content_layer position])); |
+ EXPECT_EQ(gfx::Rect(properties.rect.size()), |
+ gfx::Rect([content_layer bounds])); |
+ } |
+ |
+ // Change the rect position. |
+ { |
+ properties.rect = gfx::Rect(gfx::Point(16, 4), properties.rect.size()); |
+ UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
+ |
+ // Validate the tree structure. |
+ EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
+ EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[root_layer sublayers] count]); |
+ EXPECT_EQ(clip_and_sorting_layer, |
+ [[root_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
+ EXPECT_EQ(transform_layer, |
+ [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
+ EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]); |
+ |
+ // Validate the content layer. |
+ EXPECT_EQ(properties.rect.origin(), gfx::Point([content_layer position])); |
+ EXPECT_EQ(gfx::Rect(properties.rect.size()), |
+ gfx::Rect([content_layer bounds])); |
+ } |
+ |
+ // Change the opacity. |
+ { |
+ properties.opacity = 1.0f; |
+ UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
+ |
+ // Validate the tree structure. |
+ EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
+ EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[root_layer sublayers] count]); |
+ EXPECT_EQ(clip_and_sorting_layer, |
+ [[root_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
+ EXPECT_EQ(transform_layer, |
+ [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
+ EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]); |
+ |
+ // Validate the content layer. |
+ EXPECT_EQ(properties.opacity, [content_layer opacity]); |
+ } |
+ |
+ // Change the filter. |
+ { |
+ properties.filter = GL_NEAREST; |
+ UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
+ |
+ // Validate the tree structure. |
+ EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
+ EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[root_layer sublayers] count]); |
+ EXPECT_EQ(clip_and_sorting_layer, |
+ [[root_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
+ EXPECT_EQ(transform_layer, |
+ [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
+ EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]); |
+ |
+ // Validate the content layer. |
+ EXPECT_NSEQ(kCAFilterNearest, [content_layer minificationFilter]); |
+ EXPECT_NSEQ(kCAFilterNearest, [content_layer magnificationFilter]); |
+ } |
+ |
+ // Add the clipping and IOSurface contents back. |
+ { |
+ properties.is_clipped = true; |
+ properties.gl_image = CreateGLImage(gfx::Size(256, 256), |
+ gfx::BufferFormat::BGRA_8888, false); |
+ UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
+ |
+ // Validate the tree structure. |
+ EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
+ EXPECT_EQ(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[root_layer sublayers] count]); |
+ EXPECT_EQ(clip_and_sorting_layer, |
+ [[root_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
+ EXPECT_EQ(transform_layer, |
+ [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
+ EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
+ EXPECT_EQ(content_layer, [[transform_layer sublayers] objectAtIndex:0]); |
+ |
+ // Validate the content layer. |
+ EXPECT_EQ(static_cast<id>(properties.gl_image->io_surface().get()), |
+ [content_layer contents]); |
+ EXPECT_EQ(kCALayerBottomEdge, [content_layer edgeAntialiasingMask]); |
+ } |
+ |
+ // Change the scale factor. This should result in a new tree being created. |
+ { |
+ properties.scale_factor = 2.0f; |
+ UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
+ |
+ // Validate the tree structure. |
+ EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
+ EXPECT_NE(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
+ root_layer = [[superlayer_ sublayers] objectAtIndex:0]; |
+ EXPECT_EQ(1u, [[root_layer sublayers] count]); |
+ EXPECT_NE(clip_and_sorting_layer, |
+ [[root_layer sublayers] objectAtIndex:0]); |
+ clip_and_sorting_layer = [[root_layer sublayers] objectAtIndex:0]; |
+ EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
+ EXPECT_NE(transform_layer, |
+ [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
+ transform_layer = [[clip_and_sorting_layer sublayers] objectAtIndex:0]; |
+ EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
+ EXPECT_NE(content_layer, [[transform_layer sublayers] objectAtIndex:0]); |
+ content_layer = [[transform_layer sublayers] objectAtIndex:0]; |
+ |
+ // Validate the clip and sorting context layer. |
+ EXPECT_TRUE([clip_and_sorting_layer masksToBounds]); |
+ EXPECT_EQ(gfx::ConvertRectToDIP(properties.scale_factor, |
+ gfx::Rect(properties.clip_rect.size())), |
+ gfx::Rect([clip_and_sorting_layer bounds])); |
+ EXPECT_EQ(gfx::ConvertPointToDIP(properties.scale_factor, |
+ properties.clip_rect.origin()), |
+ gfx::Point([clip_and_sorting_layer position])); |
+ EXPECT_EQ(-properties.clip_rect.origin().x() / properties.scale_factor, |
+ [clip_and_sorting_layer sublayerTransform].m41); |
+ EXPECT_EQ(-properties.clip_rect.origin().y() / properties.scale_factor, |
+ [clip_and_sorting_layer sublayerTransform].m42); |
+ |
+ // Validate the transform layer. |
+ EXPECT_EQ( |
+ properties.transform.matrix().get(3, 0) / properties.scale_factor, |
+ [transform_layer sublayerTransform].m41); |
+ EXPECT_EQ( |
+ properties.transform.matrix().get(3, 1) / properties.scale_factor, |
+ [transform_layer sublayerTransform].m42); |
+ |
+ // Validate the content layer. |
+ EXPECT_EQ(static_cast<id>(properties.gl_image->io_surface().get()), |
+ [content_layer contents]); |
+ EXPECT_EQ(properties.contents_rect, |
+ gfx::RectF([content_layer contentsRect])); |
+ EXPECT_EQ(gfx::ConvertPointToDIP(properties.scale_factor, |
+ properties.rect.origin()), |
+ gfx::Point([content_layer position])); |
+ EXPECT_EQ(gfx::ConvertRectToDIP(properties.scale_factor, |
+ gfx::Rect(properties.rect.size())), |
+ gfx::Rect([content_layer bounds])); |
+ EXPECT_EQ(kCALayerBottomEdge, [content_layer edgeAntialiasingMask]); |
+ EXPECT_EQ(properties.opacity, [content_layer opacity]); |
+ if ([content_layer respondsToSelector:(@selector(contentsScale))]) |
+ EXPECT_EQ(properties.scale_factor, [content_layer contentsScale]); |
+ } |
- // Validate the content layer. |
- EXPECT_EQ(static_cast<id>(properties.gl_image->io_surface().get()), |
- [content_layer contents]); |
- EXPECT_EQ(kCALayerBottomEdge, [content_layer edgeAntialiasingMask]); |
+ properties.gl_image->Destroy(true); |
} |
+}; |
- // Change the scale factor. This should result in a new tree being created. |
- { |
- properties.scale_factor = 2.0f; |
- UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
- |
- // Validate the tree structure. |
- EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
- EXPECT_NE(root_layer, [[superlayer_ sublayers] objectAtIndex:0]); |
- root_layer = [[superlayer_ sublayers] objectAtIndex:0]; |
- EXPECT_EQ(1u, [[root_layer sublayers] count]); |
- EXPECT_NE(clip_and_sorting_layer, [[root_layer sublayers] objectAtIndex:0]); |
- clip_and_sorting_layer = [[root_layer sublayers] objectAtIndex:0]; |
- EXPECT_EQ(1u, [[clip_and_sorting_layer sublayers] count]); |
- EXPECT_NE(transform_layer, |
- [[clip_and_sorting_layer sublayers] objectAtIndex:0]); |
- transform_layer = [[clip_and_sorting_layer sublayers] objectAtIndex:0]; |
- EXPECT_EQ(1u, [[transform_layer sublayers] count]); |
- EXPECT_NE(content_layer, [[transform_layer sublayers] objectAtIndex:0]); |
- content_layer = [[transform_layer sublayers] objectAtIndex:0]; |
- |
- // Validate the clip and sorting context layer. |
- EXPECT_TRUE([clip_and_sorting_layer masksToBounds]); |
- EXPECT_EQ(gfx::ConvertRectToDIP(properties.scale_factor, |
- gfx::Rect(properties.clip_rect.size())), |
- gfx::Rect([clip_and_sorting_layer bounds])); |
- EXPECT_EQ(gfx::ConvertPointToDIP(properties.scale_factor, |
- properties.clip_rect.origin()), |
- gfx::Point([clip_and_sorting_layer position])); |
- EXPECT_EQ(-properties.clip_rect.origin().x() / properties.scale_factor, |
- [clip_and_sorting_layer sublayerTransform].m41); |
- EXPECT_EQ(-properties.clip_rect.origin().y() / properties.scale_factor, |
- [clip_and_sorting_layer sublayerTransform].m42); |
- |
- // Validate the transform layer. |
- EXPECT_EQ(properties.transform.matrix().get(3, 0) / properties.scale_factor, |
- [transform_layer sublayerTransform].m41); |
- EXPECT_EQ(properties.transform.matrix().get(3, 1) / properties.scale_factor, |
- [transform_layer sublayerTransform].m42); |
- |
- // Validate the content layer. |
- EXPECT_EQ(static_cast<id>(properties.gl_image->io_surface().get()), |
- [content_layer contents]); |
- EXPECT_EQ(properties.contents_rect, |
- gfx::RectF([content_layer contentsRect])); |
- EXPECT_EQ(gfx::ConvertPointToDIP(properties.scale_factor, |
- properties.rect.origin()), |
- gfx::Point([content_layer position])); |
- EXPECT_EQ(gfx::ConvertRectToDIP(properties.scale_factor, |
- gfx::Rect(properties.rect.size())), |
- gfx::Rect([content_layer bounds])); |
- EXPECT_EQ(kCALayerBottomEdge, [content_layer edgeAntialiasingMask]); |
- EXPECT_EQ(properties.opacity, [content_layer opacity]); |
- if ([content_layer respondsToSelector:(@selector(contentsScale))]) |
- EXPECT_EQ(properties.scale_factor, [content_layer contentsScale]); |
- } |
+TEST_F(CALayerTreePropertyUpdatesTest, AllowSolidColors) { |
+ RunTest(true); |
+} |
- properties.gl_image->Destroy(true); |
+TEST_F(CALayerTreePropertyUpdatesTest, DisallowSolidColors) { |
+ RunTest(false); |
} |
// Verify that sorting context zero is split at non-flat transforms. |
@@ -485,7 +509,7 @@ void SetUp() override { |
// Schedule and commit the layers. |
std::unique_ptr<ui::CARendererLayerTree> ca_layer_tree( |
- new ui::CARendererLayerTree(true)); |
+ new ui::CARendererLayerTree(true, true)); |
for (size_t i = 0; i < 5; ++i) { |
properties.gl_image = gl_images[i]; |
properties.transform = transforms[i]; |
@@ -568,7 +592,7 @@ void SetUp() override { |
// Schedule and commit the layers. |
std::unique_ptr<ui::CARendererLayerTree> ca_layer_tree( |
- new ui::CARendererLayerTree(true)); |
+ new ui::CARendererLayerTree(true, true)); |
for (size_t i = 0; i < 3; ++i) { |
properties.sorting_context_id = sorting_context_ids[i]; |
properties.gl_image = gl_images[i]; |
@@ -632,7 +656,7 @@ void SetUp() override { |
}; |
std::unique_ptr<ui::CARendererLayerTree> ca_layer_tree( |
- new ui::CARendererLayerTree(true)); |
+ new ui::CARendererLayerTree(true, true)); |
// First send the various clip parameters to sorting context zero. This is |
// legitimate. |
for (size_t i = 0; i < 3; ++i) { |
@@ -807,7 +831,8 @@ void SetUp() override { |
} |
{ |
- UpdateCALayerTreeWithAVDisabled(ca_layer_tree, &properties, superlayer_); |
+ properties.allow_av_layers = false; |
+ UpdateCALayerTree(ca_layer_tree, &properties, superlayer_); |
// Validate the tree structure. |
EXPECT_EQ(1u, [[superlayer_ sublayers] count]); |
@@ -845,7 +870,7 @@ void SetUp() override { |
// Test a configuration with no background. |
{ |
std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree( |
- new ui::CARendererLayerTree(true)); |
+ new ui::CARendererLayerTree(true, true)); |
bool result = ScheduleCALayer(new_ca_layer_tree.get(), &properties); |
EXPECT_TRUE(result); |
new_ca_layer_tree->CommitScheduledCALayers( |
@@ -875,7 +900,7 @@ void SetUp() override { |
// Test a configuration with a black background. |
{ |
std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree( |
- new ui::CARendererLayerTree(true)); |
+ new ui::CARendererLayerTree(true, true)); |
bool result = ScheduleCALayer(new_ca_layer_tree.get(), &properties_black); |
EXPECT_TRUE(result); |
result = ScheduleCALayer(new_ca_layer_tree.get(), &properties); |
@@ -907,7 +932,7 @@ void SetUp() override { |
// Test a configuration with a white background. It will fail. |
{ |
std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree( |
- new ui::CARendererLayerTree(true)); |
+ new ui::CARendererLayerTree(true, true)); |
bool result = ScheduleCALayer(new_ca_layer_tree.get(), &properties_white); |
EXPECT_TRUE(result); |
result = ScheduleCALayer(new_ca_layer_tree.get(), &properties); |
@@ -939,7 +964,7 @@ void SetUp() override { |
// Test a configuration with a black foreground. It too will fail. |
{ |
std::unique_ptr<ui::CARendererLayerTree> new_ca_layer_tree( |
- new ui::CARendererLayerTree(true)); |
+ new ui::CARendererLayerTree(true, true)); |
bool result = ScheduleCALayer(new_ca_layer_tree.get(), &properties); |
EXPECT_TRUE(result); |
result = ScheduleCALayer(new_ca_layer_tree.get(), &properties_black); |