Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1318)

Unified Diff: ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm

Issue 2391793002: Mac: Fix bugs in Sierra color fix (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
« no previous file with comments | « ui/accelerated_widget_mac/ca_layer_tree_coordinator.mm ('k') | ui/accelerated_widget_mac/ca_renderer_layer_tree.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698