| Index: cc/trees/layer_tree_host_unittest.cc
|
| diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
|
| index add981f75d219efe4cff3d0520d287ed9cd1f806..d436387969c4f29c5bda04a3be37d34189560fa5 100644
|
| --- a/cc/trees/layer_tree_host_unittest.cc
|
| +++ b/cc/trees/layer_tree_host_unittest.cc
|
| @@ -6541,6 +6541,104 @@ class LayerTreeHostTestUpdateCopyRequests : public LayerTreeHostTest {
|
|
|
| SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestUpdateCopyRequests);
|
|
|
| +class LayerTreeTestMaskLayerForSurfaceWithContentRectNotAtOrigin
|
| + : public LayerTreeTest {
|
| + protected:
|
| + void SetupTree() override {
|
| + // The masked layer has bounds 50x50, but it has a child that causes
|
| + // the surface bounds to be larger. It also has a parent that clips the
|
| + // masked layer and its surface.
|
| +
|
| + scoped_refptr<Layer> root = Layer::Create();
|
| +
|
| + scoped_refptr<FakePictureLayer> content_layer =
|
| + FakePictureLayer::Create(&client_);
|
| +
|
| + std::unique_ptr<RecordingSource> recording_source =
|
| + FakeRecordingSource::CreateFilledRecordingSource(gfx::Size(100, 100));
|
| + PaintFlags paint1, paint2;
|
| + static_cast<FakeRecordingSource*>(recording_source.get())
|
| + ->add_draw_rect_with_flags(gfx::Rect(0, 0, 100, 90), paint1);
|
| + static_cast<FakeRecordingSource*>(recording_source.get())
|
| + ->add_draw_rect_with_flags(gfx::Rect(0, 90, 100, 10), paint2);
|
| + client_.set_fill_with_nonsolid_color(true);
|
| + static_cast<FakeRecordingSource*>(recording_source.get())->Rerecord();
|
| +
|
| + scoped_refptr<FakePictureLayer> mask_layer =
|
| + FakePictureLayer::CreateWithRecordingSource(
|
| + &client_, std::move(recording_source));
|
| + content_layer->SetMaskLayer(mask_layer.get());
|
| +
|
| + gfx::Size root_size(100, 100);
|
| + root->SetBounds(root_size);
|
| +
|
| + gfx::Size layer_size(100, 100);
|
| + content_layer->SetBounds(layer_size);
|
| +
|
| + gfx::Size mask_size(100, 100);
|
| + mask_layer->SetBounds(mask_size);
|
| + mask_layer->SetLayerMaskType(Layer::LayerMaskType::MULTI_TEXTURE_MASK);
|
| + mask_layer_id_ = mask_layer->id();
|
| +
|
| + layer_tree_host()->SetRootLayer(root);
|
| + LayerTreeTest::SetupTree();
|
| + scoped_refptr<Layer> outer_viewport_scroll_layer = Layer::Create();
|
| + outer_viewport_scroll_layer->SetBounds(layer_size);
|
| + CreateVirtualViewportLayers(root.get(), outer_viewport_scroll_layer,
|
| + gfx::Size(50, 50), gfx::Size(50, 50),
|
| + layer_tree_host());
|
| + outer_viewport_scroll_layer->scroll_clip_layer()->SetMasksToBounds(true);
|
| + outer_viewport_scroll_layer->AddChild(content_layer);
|
| +
|
| + client_.set_bounds(root->bounds());
|
| + outer_viewport_scroll_layer->SetScrollOffset(gfx::ScrollOffset(50, 50));
|
| + }
|
| +
|
| + void BeginTest() override { PostSetNeedsCommitToMainThread(); }
|
| +
|
| + DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
|
| + LayerTreeHostImpl::FrameData* frame_data,
|
| + DrawResult draw_result) override {
|
| + EXPECT_EQ(2u, frame_data->render_passes.size());
|
| + RenderPass* root_pass = frame_data->render_passes.back().get();
|
| + EXPECT_EQ(2u, root_pass->quad_list.size());
|
| +
|
| + // There's a solid color quad under everything.
|
| + EXPECT_EQ(DrawQuad::SOLID_COLOR, root_pass->quad_list.back()->material);
|
| +
|
| + EXPECT_EQ(DrawQuad::RENDER_PASS, root_pass->quad_list.front()->material);
|
| + const RenderPassDrawQuad* render_pass_quad =
|
| + RenderPassDrawQuad::MaterialCast(root_pass->quad_list.front());
|
| + EXPECT_EQ(gfx::Rect(50, 50, 50, 50).ToString(),
|
| + render_pass_quad->rect.ToString());
|
| + if (host_impl->settings().enable_mask_tiling) {
|
| + PictureLayerImpl* mask_layer_impl = static_cast<PictureLayerImpl*>(
|
| + host_impl->active_tree()->LayerById(mask_layer_id_));
|
| + gfx::SizeF texture_size(
|
| + mask_layer_impl->CalculateTileSize(mask_layer_impl->bounds()));
|
| + EXPECT_EQ(
|
| + gfx::RectF(50.f / texture_size.width(), 50.f / texture_size.height(),
|
| + 50.f / texture_size.width(), 50.f / texture_size.height())
|
| + .ToString(),
|
| + render_pass_quad->mask_uv_rect.ToString());
|
| + } else {
|
| + EXPECT_EQ(gfx::ScaleRect(gfx::RectF(50.f, 50.f, 50.f, 50.f), 1.f / 100.f)
|
| + .ToString(),
|
| + render_pass_quad->mask_uv_rect.ToString());
|
| + }
|
| + EndTest();
|
| + return draw_result;
|
| + }
|
| +
|
| + void AfterTest() override {}
|
| +
|
| + int mask_layer_id_;
|
| + FakeContentLayerClient client_;
|
| +};
|
| +
|
| +SINGLE_AND_MULTI_THREAD_TEST_F(
|
| + LayerTreeTestMaskLayerForSurfaceWithContentRectNotAtOrigin);
|
| +
|
| class LayerTreeTestMaskLayerForSurfaceWithClippedLayer : public LayerTreeTest {
|
| protected:
|
| void SetupTree() override {
|
| @@ -6561,8 +6659,19 @@ class LayerTreeTestMaskLayerForSurfaceWithClippedLayer : public LayerTreeTest {
|
| FakePictureLayer::Create(&client_);
|
| content_layer->AddChild(content_child_layer);
|
|
|
| + std::unique_ptr<RecordingSource> recording_source =
|
| + FakeRecordingSource::CreateFilledRecordingSource(gfx::Size(100, 100));
|
| + PaintFlags paint1, paint2;
|
| + static_cast<FakeRecordingSource*>(recording_source.get())
|
| + ->add_draw_rect_with_flags(gfx::Rect(0, 0, 100, 90), paint1);
|
| + static_cast<FakeRecordingSource*>(recording_source.get())
|
| + ->add_draw_rect_with_flags(gfx::Rect(0, 90, 100, 10), paint2);
|
| + client_.set_fill_with_nonsolid_color(true);
|
| + static_cast<FakeRecordingSource*>(recording_source.get())->Rerecord();
|
| +
|
| scoped_refptr<FakePictureLayer> mask_layer =
|
| - FakePictureLayer::Create(&client_);
|
| + FakePictureLayer::CreateWithRecordingSource(
|
| + &client_, std::move(recording_source));
|
| content_layer->SetMaskLayer(mask_layer.get());
|
|
|
| gfx::Size root_size(100, 100);
|
| @@ -6586,6 +6695,7 @@ class LayerTreeTestMaskLayerForSurfaceWithClippedLayer : public LayerTreeTest {
|
| gfx::Size mask_size(100, 100);
|
| mask_layer->SetBounds(mask_size);
|
| mask_layer->SetLayerMaskType(Layer::LayerMaskType::MULTI_TEXTURE_MASK);
|
| + mask_layer_id_ = mask_layer->id();
|
|
|
| layer_tree_host()->SetRootLayer(root);
|
| LayerTreeTest::SetupTree();
|
| @@ -6614,15 +6724,28 @@ class LayerTreeTestMaskLayerForSurfaceWithClippedLayer : public LayerTreeTest {
|
| // coords in the mask are scaled by 10/50 and 20/50.
|
| // The surface is clipped to (20,10) so the mask texture coords are offset
|
| // by 20/50 and 10/50
|
| - EXPECT_EQ(gfx::ScaleRect(gfx::RectF(20.f, 10.f, 10.f, 20.f), 1.f / 50.f)
|
| - .ToString(),
|
| - render_pass_quad->mask_uv_rect.ToString());
|
| + if (host_impl->settings().enable_mask_tiling) {
|
| + PictureLayerImpl* mask_layer_impl = static_cast<PictureLayerImpl*>(
|
| + host_impl->active_tree()->LayerById(mask_layer_id_));
|
| + gfx::SizeF texture_size(
|
| + mask_layer_impl->CalculateTileSize(mask_layer_impl->bounds()));
|
| + EXPECT_EQ(
|
| + gfx::RectF(20.f / texture_size.width(), 10.f / texture_size.height(),
|
| + 10.f / texture_size.width(), 20.f / texture_size.height())
|
| + .ToString(),
|
| + render_pass_quad->mask_uv_rect.ToString());
|
| + } else {
|
| + EXPECT_EQ(gfx::ScaleRect(gfx::RectF(20.f, 10.f, 10.f, 20.f), 1.f / 50.f)
|
| + .ToString(),
|
| + render_pass_quad->mask_uv_rect.ToString());
|
| + }
|
| EndTest();
|
| return draw_result;
|
| }
|
|
|
| void AfterTest() override {}
|
|
|
| + int mask_layer_id_;
|
| FakeContentLayerClient client_;
|
| };
|
|
|
| @@ -6652,8 +6775,19 @@ class LayerTreeTestMaskLayerWithScaling : public LayerTreeTest {
|
| FakePictureLayer::Create(&client_);
|
| scaling_layer->AddChild(content_layer);
|
|
|
| + std::unique_ptr<RecordingSource> recording_source =
|
| + FakeRecordingSource::CreateFilledRecordingSource(gfx::Size(100, 100));
|
| + PaintFlags paint1, paint2;
|
| + static_cast<FakeRecordingSource*>(recording_source.get())
|
| + ->add_draw_rect_with_flags(gfx::Rect(0, 0, 100, 10), paint1);
|
| + static_cast<FakeRecordingSource*>(recording_source.get())
|
| + ->add_draw_rect_with_flags(gfx::Rect(0, 10, 100, 90), paint2);
|
| + client_.set_fill_with_nonsolid_color(true);
|
| + static_cast<FakeRecordingSource*>(recording_source.get())->Rerecord();
|
| +
|
| scoped_refptr<FakePictureLayer> mask_layer =
|
| - FakePictureLayer::Create(&client_);
|
| + FakePictureLayer::CreateWithRecordingSource(
|
| + &client_, std::move(recording_source));
|
| content_layer->SetMaskLayer(mask_layer.get());
|
|
|
| gfx::Size root_size(100, 100);
|
| @@ -6696,16 +6830,28 @@ class LayerTreeTestMaskLayerWithScaling : public LayerTreeTest {
|
| // mask, that should fully map onto the quad.
|
| EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(),
|
| render_pass_quad->rect.ToString());
|
| - EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(),
|
| - render_pass_quad->mask_uv_rect.ToString());
|
| + if (host_impl->settings().enable_mask_tiling) {
|
| + EXPECT_EQ(
|
| + gfx::RectF(0.f, 0.f, 100.f / 128.f, 100.f / 128.f).ToString(),
|
| + render_pass_quad->mask_uv_rect.ToString());
|
| + } else {
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(),
|
| + render_pass_quad->mask_uv_rect.ToString());
|
| + }
|
| break;
|
| case 1:
|
| // Applying a DSF should change the render surface size, but won't
|
| // affect which part of the mask is used.
|
| EXPECT_EQ(gfx::Rect(0, 0, 200, 200).ToString(),
|
| render_pass_quad->rect.ToString());
|
| - EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(),
|
| - render_pass_quad->mask_uv_rect.ToString());
|
| + if (host_impl->settings().enable_mask_tiling) {
|
| + EXPECT_EQ(
|
| + gfx::RectF(0.f, 0.f, 100.f / 128.f, 100.f / 128.f).ToString(),
|
| + render_pass_quad->mask_uv_rect.ToString());
|
| + } else {
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(),
|
| + render_pass_quad->mask_uv_rect.ToString());
|
| + }
|
| EndTest();
|
| break;
|
| }
|
| @@ -6741,8 +6887,19 @@ class LayerTreeTestMaskLayerWithDifferentBounds : public LayerTreeTest {
|
| FakePictureLayer::Create(&client_);
|
| root->AddChild(content_layer);
|
|
|
| + std::unique_ptr<RecordingSource> recording_source =
|
| + FakeRecordingSource::CreateFilledRecordingSource(gfx::Size(100, 100));
|
| + PaintFlags paint1, paint2;
|
| + static_cast<FakeRecordingSource*>(recording_source.get())
|
| + ->add_draw_rect_with_flags(gfx::Rect(0, 0, 100, 90), paint1);
|
| + static_cast<FakeRecordingSource*>(recording_source.get())
|
| + ->add_draw_rect_with_flags(gfx::Rect(0, 90, 100, 10), paint2);
|
| + client_.set_fill_with_nonsolid_color(true);
|
| + static_cast<FakeRecordingSource*>(recording_source.get())->Rerecord();
|
| +
|
| scoped_refptr<FakePictureLayer> mask_layer =
|
| - FakePictureLayer::Create(&client_);
|
| + FakePictureLayer::CreateWithRecordingSource(
|
| + &client_, std::move(recording_source));
|
| content_layer->SetMaskLayer(mask_layer.get());
|
|
|
| gfx::Size root_size(100, 100);
|
| @@ -6780,16 +6937,26 @@ class LayerTreeTestMaskLayerWithDifferentBounds : public LayerTreeTest {
|
| // Check that the mask fills the surface.
|
| EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(),
|
| render_pass_quad->rect.ToString());
|
| - EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(),
|
| - render_pass_quad->mask_uv_rect.ToString());
|
| + if (host_impl->settings().enable_mask_tiling) {
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 50.f / 128.f, 50.f / 128.f).ToString(),
|
| + render_pass_quad->mask_uv_rect.ToString());
|
| + } else {
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(),
|
| + render_pass_quad->mask_uv_rect.ToString());
|
| + }
|
| break;
|
| case 1:
|
| // Applying a DSF should change the render surface size, but won't
|
| // affect which part of the mask is used.
|
| EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(),
|
| render_pass_quad->rect.ToString());
|
| - EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(),
|
| - render_pass_quad->mask_uv_rect.ToString());
|
| + if (host_impl->settings().enable_mask_tiling) {
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 50.f / 128.f, 50.f / 128.f).ToString(),
|
| + render_pass_quad->mask_uv_rect.ToString());
|
| + } else {
|
| + EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(),
|
| + render_pass_quad->mask_uv_rect.ToString());
|
| + }
|
| EndTest();
|
| break;
|
| }
|
|
|