Index: cc/trees/layer_tree_host_impl_unittest.cc |
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc |
index 301bf27799b71768f3c92a65a0acfb38aba37b2f..a69f79af052a77f36cc15e65791b589765a87db3 100644 |
--- a/cc/trees/layer_tree_host_impl_unittest.cc |
+++ b/cc/trees/layer_tree_host_impl_unittest.cc |
@@ -4505,53 +4505,45 @@ TestCase remove_render_passes_cases[] = { |
"Single root pass", |
"R0ssss\n", |
"R0ssss\n" |
- }, |
- { |
+ }, { |
danakj
2013/04/15 20:50:51
These are for cpplint.
|
"Single pass - no quads", |
"R0\n", |
"R0\n" |
- }, |
- { |
+ }, { |
"Two passes, no removal", |
"R0ssssA0sss\n" |
"A0ssss\n", |
"R0ssssA0sss\n" |
"A0ssss\n" |
- }, |
- { |
+ }, { |
"Two passes, remove last", |
"R0ssssA0[ct]sss\n" |
"A0ssss\n", |
"R0ssssA0sss\n" |
- }, |
- { |
+ }, { |
"Have texture but contents changed - leave pass", |
"R0ssssA0[t]sss\n" |
"A0ssss\n", |
"R0ssssA0sss\n" |
"A0ssss\n" |
- }, |
- { |
+ }, { |
"Contents didn't change but no texture - leave pass", |
"R0ssssA0[c]sss\n" |
"A0ssss\n", |
"R0ssssA0sss\n" |
"A0ssss\n" |
- }, |
- { |
+ }, { |
"Replica: two quads reference the same pass; remove", |
"R0ssssA0[ct]A0[ct]sss\n" |
"A0ssss\n", |
"R0ssssA0A0sss\n" |
- }, |
- { |
+ }, { |
"Replica: two quads reference the same pass; leave", |
"R0ssssA0[c]A0[c]sss\n" |
"A0ssss\n", |
"R0ssssA0A0sss\n" |
"A0ssss\n", |
- }, |
- { |
+ }, { |
"Many passes, remove all", |
"R0ssssA0[ct]sss\n" |
"A0sssB0[ct]C0[ct]s\n" |
@@ -4563,8 +4555,7 @@ TestCase remove_render_passes_cases[] = { |
"G0sss\n", |
"R0ssssA0sss\n" |
- }, |
- { |
+ }, { |
"Deep recursion, remove all", |
"R0sssssA0[ct]ssss\n" |
@@ -4580,8 +4571,7 @@ TestCase remove_render_passes_cases[] = { |
"J0ssss\n", |
"R0sssssA0ssss\n" |
- }, |
- { |
+ }, { |
"Wide recursion, remove all", |
"R0A0[ct]B0[ct]C0[ct]D0[ct]E0[ct]F0[ct]G0[ct]H0[ct]I0[ct]J0[ct]\n" |
"A0s\n" |
@@ -4596,8 +4586,7 @@ TestCase remove_render_passes_cases[] = { |
"J0ssss\n", |
"R0A0B0C0D0E0F0G0H0I0J0\n" |
- }, |
- { |
+ }, { |
"Remove passes regardless of cache state", |
"R0ssssA0[ct]sss\n" |
"A0sssB0C0s\n" |
@@ -4609,8 +4598,7 @@ TestCase remove_render_passes_cases[] = { |
"G0sss\n", |
"R0ssssA0sss\n" |
- }, |
- { |
+ }, { |
"Leave some passes, remove others", |
"R0ssssA0[c]sss\n" |
@@ -4624,8 +4612,7 @@ TestCase remove_render_passes_cases[] = { |
"A0sssB0C0s\n" |
"B0sssD0ss\n" |
"D0sssssss\n" |
- }, |
- { |
+ }, { |
0, 0, 0 |
} |
}; |
@@ -5047,5 +5034,283 @@ TEST_F(LayerTreeHostImplTest, MaskLayerWithDifferentBounds) { |
} |
} |
+TEST_F(LayerTreeHostImplTest, ReflectionMaskLayerWithDifferentBounds) { |
+ // The replica's mask layer has bounds 100x100 but the replica is of a |
+ // layer with bounds 50x50. |
+ |
+ scoped_ptr<LayerImpl> scoped_root = |
+ LayerImpl::Create(host_impl_->active_tree(), 1); |
+ LayerImpl* root = scoped_root.get(); |
+ host_impl_->active_tree()->SetRootLayer(scoped_root.Pass()); |
+ |
+ scoped_ptr<LayerImpl> scoped_content_layer = |
+ LayerImpl::Create(host_impl_->active_tree(), 3); |
+ LayerImpl* content_layer = scoped_content_layer.get(); |
+ root->AddChild(scoped_content_layer.Pass()); |
+ |
+ scoped_ptr<LayerImpl> scoped_replica_layer = |
+ LayerImpl::Create(host_impl_->active_tree(), 2); |
+ LayerImpl* replica_layer = scoped_replica_layer.get(); |
+ content_layer->SetReplicaLayer(scoped_replica_layer.Pass()); |
+ |
+ scoped_ptr<FakeMaskLayerImpl> scoped_mask_layer = |
+ FakeMaskLayerImpl::Create(host_impl_->active_tree(), 4); |
+ FakeMaskLayerImpl* mask_layer = scoped_mask_layer.get(); |
+ replica_layer->SetMaskLayer(scoped_mask_layer.PassAs<LayerImpl>()); |
+ |
+ gfx::Size root_size(100, 100); |
+ root->SetBounds(root_size); |
+ root->SetContentBounds(root_size); |
+ root->SetPosition(gfx::PointF()); |
+ root->SetAnchorPoint(gfx::PointF()); |
+ |
+ gfx::Size layer_size(50, 50); |
+ content_layer->SetBounds(layer_size); |
+ content_layer->SetContentBounds(layer_size); |
+ content_layer->SetPosition(gfx::PointF()); |
+ content_layer->SetAnchorPoint(gfx::PointF()); |
+ content_layer->SetDrawsContent(true); |
+ |
+ gfx::Size mask_size(100, 100); |
+ mask_layer->SetBounds(mask_size); |
+ mask_layer->SetContentBounds(mask_size); |
+ mask_layer->SetPosition(gfx::PointF()); |
+ mask_layer->SetAnchorPoint(gfx::PointF()); |
+ mask_layer->SetDrawsContent(true); |
+ |
+ // Check that the mask fills the surface. |
+ float device_scale_factor = 1.f; |
+ host_impl_->SetViewportSize(root_size); |
+ host_impl_->SetDeviceScaleFactor(device_scale_factor); |
+ { |
+ LayerTreeHostImpl::FrameData frame; |
+ EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); |
+ |
+ ASSERT_EQ(1u, frame.render_passes.size()); |
+ ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); |
+ ASSERT_EQ(DrawQuad::RENDER_PASS, |
+ frame.render_passes[0]->quad_list[1]->material); |
+ const RenderPassDrawQuad* replica_quad = |
+ RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); |
+ EXPECT_TRUE(replica_quad->is_replica); |
+ EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(), |
+ replica_quad->rect.ToString()); |
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), |
+ replica_quad->mask_uv_rect.ToString()); |
+ |
+ host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); |
+ host_impl_->DidDrawAllLayers(frame); |
+ } |
+ |
+ // Applying a DSF should change the render surface size, but won't affect |
+ // which part of the mask is used. |
+ device_scale_factor = 2.f; |
+ gfx::Size device_viewport = |
+ gfx::ToFlooredSize(gfx::ScaleSize(root_size, device_scale_factor)); |
+ host_impl_->SetViewportSize(device_viewport); |
+ host_impl_->SetDeviceScaleFactor(device_scale_factor); |
+ host_impl_->active_tree()->set_needs_update_draw_properties(); |
+ { |
+ LayerTreeHostImpl::FrameData frame; |
+ EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); |
+ |
+ ASSERT_EQ(1u, frame.render_passes.size()); |
+ ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); |
+ ASSERT_EQ(DrawQuad::RENDER_PASS, |
+ frame.render_passes[0]->quad_list[1]->material); |
+ const RenderPassDrawQuad* replica_quad = |
+ RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); |
+ EXPECT_TRUE(replica_quad->is_replica); |
+ EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), |
+ replica_quad->rect.ToString()); |
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), |
+ replica_quad->mask_uv_rect.ToString()); |
+ |
+ host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); |
+ host_impl_->DidDrawAllLayers(frame); |
+ } |
+ |
+ // Applying an equivalent content scale on the content layer and the mask |
+ // should still result in the same part of the mask being used. |
+ gfx::Size layer_size_large = |
+ gfx::ToRoundedSize(gfx::ScaleSize(layer_size, device_scale_factor)); |
+ content_layer->SetContentBounds(layer_size_large); |
+ content_layer->SetContentsScale(device_scale_factor, device_scale_factor); |
+ gfx::Size mask_size_large = |
+ gfx::ToRoundedSize(gfx::ScaleSize(mask_size, device_scale_factor)); |
+ mask_layer->SetContentBounds(mask_size_large); |
+ mask_layer->SetContentsScale(device_scale_factor, device_scale_factor); |
+ host_impl_->active_tree()->set_needs_update_draw_properties(); |
+ { |
+ LayerTreeHostImpl::FrameData frame; |
+ EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); |
+ |
+ ASSERT_EQ(1u, frame.render_passes.size()); |
+ ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); |
+ ASSERT_EQ(DrawQuad::RENDER_PASS, |
+ frame.render_passes[0]->quad_list[1]->material); |
+ const RenderPassDrawQuad* replica_quad = |
+ RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); |
+ EXPECT_TRUE(replica_quad->is_replica); |
+ EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), |
+ replica_quad->rect.ToString()); |
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), |
+ replica_quad->mask_uv_rect.ToString()); |
+ |
+ host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); |
+ host_impl_->DidDrawAllLayers(frame); |
+ } |
+ |
+ // Applying a different contents scale to the mask layer will still result |
enne (OOO)
2013/04/15 22:20:40
I'm not sure I follow this case. Why is this the
danakj
2013/04/16 02:49:03
I think this case is wrong. It was a copy paste fr
|
+ // in the mask covering the owning layer. |
+ mask_layer->SetContentBounds(mask_size); |
+ mask_layer->SetContentsScale(device_scale_factor, device_scale_factor); |
+ host_impl_->active_tree()->set_needs_update_draw_properties(); |
+ { |
+ LayerTreeHostImpl::FrameData frame; |
+ EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); |
+ |
+ ASSERT_EQ(1u, frame.render_passes.size()); |
+ ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); |
+ ASSERT_EQ(DrawQuad::RENDER_PASS, |
+ frame.render_passes[0]->quad_list[1]->material); |
+ const RenderPassDrawQuad* replica_quad = |
+ RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); |
+ EXPECT_TRUE(replica_quad->is_replica); |
+ EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), |
+ replica_quad->rect.ToString()); |
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), |
+ replica_quad->mask_uv_rect.ToString()); |
+ |
+ host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); |
+ host_impl_->DidDrawAllLayers(frame); |
+ } |
+} |
+ |
+TEST_F(LayerTreeHostImplTest, ReflectionMaskLayerForSurfaceWithUnclippedLayer) { |
+ // The replica is of a layer with bounds 50x50, but it has a child that causes |
+ // the surface bounds to be larger. |
+ |
+ scoped_ptr<LayerImpl> scoped_root = |
+ LayerImpl::Create(host_impl_->active_tree(), 1); |
+ LayerImpl* root = scoped_root.get(); |
+ host_impl_->active_tree()->SetRootLayer(scoped_root.Pass()); |
+ |
+ scoped_ptr<LayerImpl> scoped_content_layer = |
+ LayerImpl::Create(host_impl_->active_tree(), 2); |
+ LayerImpl* content_layer = scoped_content_layer.get(); |
+ root->AddChild(scoped_content_layer.Pass()); |
+ |
+ scoped_ptr<LayerImpl> scoped_content_child_layer = |
+ LayerImpl::Create(host_impl_->active_tree(), 3); |
+ LayerImpl* content_child_layer = scoped_content_child_layer.get(); |
+ content_layer->AddChild(scoped_content_child_layer.Pass()); |
+ |
+ scoped_ptr<LayerImpl> scoped_replica_layer = |
+ LayerImpl::Create(host_impl_->active_tree(), 4); |
+ LayerImpl* replica_layer = scoped_replica_layer.get(); |
+ content_layer->SetReplicaLayer(scoped_replica_layer.Pass()); |
+ |
+ scoped_ptr<FakeMaskLayerImpl> scoped_mask_layer = |
+ FakeMaskLayerImpl::Create(host_impl_->active_tree(), 5); |
+ FakeMaskLayerImpl* mask_layer = scoped_mask_layer.get(); |
+ replica_layer->SetMaskLayer(scoped_mask_layer.PassAs<LayerImpl>()); |
+ |
+ gfx::Size root_size(100, 100); |
+ root->SetBounds(root_size); |
+ root->SetContentBounds(root_size); |
+ root->SetPosition(gfx::PointF()); |
+ root->SetAnchorPoint(gfx::PointF()); |
+ |
+ gfx::Size layer_size(50, 50); |
+ content_layer->SetBounds(layer_size); |
+ content_layer->SetContentBounds(layer_size); |
+ content_layer->SetPosition(gfx::PointF()); |
+ content_layer->SetAnchorPoint(gfx::PointF()); |
+ content_layer->SetDrawsContent(true); |
+ |
+ gfx::Size child_size(50, 50); |
+ content_child_layer->SetBounds(child_size); |
+ content_child_layer->SetContentBounds(child_size); |
+ content_child_layer->SetPosition(gfx::Point(50, 0)); |
+ content_child_layer->SetAnchorPoint(gfx::PointF()); |
+ content_child_layer->SetDrawsContent(true); |
+ |
+ gfx::Size mask_size(50, 50); |
+ mask_layer->SetBounds(mask_size); |
+ mask_layer->SetContentBounds(mask_size); |
+ mask_layer->SetPosition(gfx::PointF()); |
+ mask_layer->SetAnchorPoint(gfx::PointF()); |
+ mask_layer->SetDrawsContent(true); |
+ |
+ float device_scale_factor = 1.f; |
+ host_impl_->SetViewportSize(root_size); |
+ host_impl_->SetDeviceScaleFactor(device_scale_factor); |
+ { |
+ LayerTreeHostImpl::FrameData frame; |
+ EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); |
+ |
+ ASSERT_EQ(1u, frame.render_passes.size()); |
+ ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); |
+ |
+ // The surface is 100x50. |
+ ASSERT_EQ(DrawQuad::RENDER_PASS, |
+ frame.render_passes[0]->quad_list[0]->material); |
+ const RenderPassDrawQuad* render_pass_quad = |
+ RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); |
+ EXPECT_FALSE(render_pass_quad->is_replica); |
+ EXPECT_EQ(gfx::Rect(0, 0, 100, 50).ToString(), |
+ render_pass_quad->rect.ToString()); |
+ |
+ // The mask covers the owning layer only. |
+ ASSERT_EQ(DrawQuad::RENDER_PASS, |
+ frame.render_passes[0]->quad_list[1]->material); |
+ const RenderPassDrawQuad* replica_quad = |
+ RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); |
+ EXPECT_TRUE(replica_quad->is_replica); |
+ EXPECT_EQ(gfx::Rect(0, 0, 100, 50).ToString(), |
+ replica_quad->rect.ToString()); |
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 2.f, 1.f).ToString(), |
enne (OOO)
2013/04/15 22:20:40
This 2.f is unexpected in a uv rect. Why would th
danakj
2013/04/16 02:49:03
Right, it should be 1.f
|
+ replica_quad->mask_uv_rect.ToString()); |
+ |
+ host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); |
+ host_impl_->DidDrawAllLayers(frame); |
+ } |
+ |
+ // Move the child to (-50, 0) instead. Now the mask should be moved to still |
enne (OOO)
2013/04/15 22:20:40
It should?
danakj
2013/04/16 02:49:03
Ya, 0,0 in the surface texture is not inside the b
|
+ // cover the layer being replicated. |
+ content_child_layer->SetPosition(gfx::Point(-50, 0)); |
+ { |
+ LayerTreeHostImpl::FrameData frame; |
+ EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); |
+ |
+ ASSERT_EQ(1u, frame.render_passes.size()); |
+ ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); |
+ |
+ // The surface is 100x50 with its origin at (-50, 0). |
+ ASSERT_EQ(DrawQuad::RENDER_PASS, |
+ frame.render_passes[0]->quad_list[0]->material); |
+ const RenderPassDrawQuad* render_pass_quad = |
+ RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); |
+ EXPECT_FALSE(render_pass_quad->is_replica); |
+ EXPECT_EQ(gfx::Rect(-50, 0, 100, 50).ToString(), |
+ render_pass_quad->rect.ToString()); |
+ |
+ // The mask covers the owning layer only. |
+ ASSERT_EQ(DrawQuad::RENDER_PASS, |
+ frame.render_passes[0]->quad_list[1]->material); |
+ const RenderPassDrawQuad* replica_quad = |
+ RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); |
+ EXPECT_TRUE(replica_quad->is_replica); |
+ EXPECT_EQ(gfx::Rect(-50, 0, 100, 50).ToString(), |
+ replica_quad->rect.ToString()); |
+ EXPECT_EQ(gfx::RectF(-1.f, 0.f, 2.f, 1.f).ToString(), |
+ replica_quad->mask_uv_rect.ToString()); |
+ |
+ host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); |
+ host_impl_->DidDrawAllLayers(frame); |
+ } |
+} |
+ |
} // namespace |
} // namespace cc |