Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/trees/layer_tree_host_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 4487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4498 const char* name; | 4498 const char* name; |
| 4499 const char* init_script; | 4499 const char* init_script; |
| 4500 const char* expected_result; | 4500 const char* expected_result; |
| 4501 }; | 4501 }; |
| 4502 | 4502 |
| 4503 TestCase remove_render_passes_cases[] = { | 4503 TestCase remove_render_passes_cases[] = { |
| 4504 { | 4504 { |
| 4505 "Single root pass", | 4505 "Single root pass", |
| 4506 "R0ssss\n", | 4506 "R0ssss\n", |
| 4507 "R0ssss\n" | 4507 "R0ssss\n" |
| 4508 }, | 4508 }, { |
| 4509 { | |
| 4510 "Single pass - no quads", | 4509 "Single pass - no quads", |
| 4511 "R0\n", | 4510 "R0\n", |
| 4512 "R0\n" | 4511 "R0\n" |
| 4513 }, | 4512 }, { |
| 4514 { | |
| 4515 "Two passes, no removal", | 4513 "Two passes, no removal", |
| 4516 "R0ssssA0sss\n" | 4514 "R0ssssA0sss\n" |
| 4517 "A0ssss\n", | 4515 "A0ssss\n", |
| 4518 "R0ssssA0sss\n" | 4516 "R0ssssA0sss\n" |
| 4519 "A0ssss\n" | 4517 "A0ssss\n" |
| 4520 }, | 4518 }, { |
| 4521 { | |
| 4522 "Two passes, remove last", | 4519 "Two passes, remove last", |
| 4523 "R0ssssA0[ct]sss\n" | 4520 "R0ssssA0[ct]sss\n" |
| 4524 "A0ssss\n", | 4521 "A0ssss\n", |
| 4525 "R0ssssA0sss\n" | 4522 "R0ssssA0sss\n" |
| 4526 }, | 4523 }, { |
| 4527 { | |
| 4528 "Have texture but contents changed - leave pass", | 4524 "Have texture but contents changed - leave pass", |
| 4529 "R0ssssA0[t]sss\n" | 4525 "R0ssssA0[t]sss\n" |
| 4530 "A0ssss\n", | 4526 "A0ssss\n", |
| 4531 "R0ssssA0sss\n" | 4527 "R0ssssA0sss\n" |
| 4532 "A0ssss\n" | 4528 "A0ssss\n" |
| 4533 }, | 4529 }, { |
| 4534 { | |
| 4535 "Contents didn't change but no texture - leave pass", | 4530 "Contents didn't change but no texture - leave pass", |
| 4536 "R0ssssA0[c]sss\n" | 4531 "R0ssssA0[c]sss\n" |
| 4537 "A0ssss\n", | 4532 "A0ssss\n", |
| 4538 "R0ssssA0sss\n" | 4533 "R0ssssA0sss\n" |
| 4539 "A0ssss\n" | 4534 "A0ssss\n" |
| 4540 }, | 4535 }, { |
| 4541 { | |
| 4542 "Replica: two quads reference the same pass; remove", | 4536 "Replica: two quads reference the same pass; remove", |
| 4543 "R0ssssA0[ct]A0[ct]sss\n" | 4537 "R0ssssA0[ct]A0[ct]sss\n" |
| 4544 "A0ssss\n", | 4538 "A0ssss\n", |
| 4545 "R0ssssA0A0sss\n" | 4539 "R0ssssA0A0sss\n" |
| 4546 }, | 4540 }, { |
| 4547 { | |
| 4548 "Replica: two quads reference the same pass; leave", | 4541 "Replica: two quads reference the same pass; leave", |
| 4549 "R0ssssA0[c]A0[c]sss\n" | 4542 "R0ssssA0[c]A0[c]sss\n" |
| 4550 "A0ssss\n", | 4543 "A0ssss\n", |
| 4551 "R0ssssA0A0sss\n" | 4544 "R0ssssA0A0sss\n" |
| 4552 "A0ssss\n", | 4545 "A0ssss\n", |
| 4553 }, | 4546 }, { |
| 4554 { | |
| 4555 "Many passes, remove all", | 4547 "Many passes, remove all", |
| 4556 "R0ssssA0[ct]sss\n" | 4548 "R0ssssA0[ct]sss\n" |
| 4557 "A0sssB0[ct]C0[ct]s\n" | 4549 "A0sssB0[ct]C0[ct]s\n" |
| 4558 "B0sssD0[ct]ssE0[ct]F0[ct]\n" | 4550 "B0sssD0[ct]ssE0[ct]F0[ct]\n" |
| 4559 "E0ssssss\n" | 4551 "E0ssssss\n" |
| 4560 "C0G0[ct]\n" | 4552 "C0G0[ct]\n" |
| 4561 "D0sssssss\n" | 4553 "D0sssssss\n" |
| 4562 "F0sssssss\n" | 4554 "F0sssssss\n" |
| 4563 "G0sss\n", | 4555 "G0sss\n", |
| 4564 | 4556 |
| 4565 "R0ssssA0sss\n" | 4557 "R0ssssA0sss\n" |
| 4566 }, | 4558 }, { |
| 4567 { | |
| 4568 "Deep recursion, remove all", | 4559 "Deep recursion, remove all", |
| 4569 | 4560 |
| 4570 "R0sssssA0[ct]ssss\n" | 4561 "R0sssssA0[ct]ssss\n" |
| 4571 "A0ssssB0sss\n" | 4562 "A0ssssB0sss\n" |
| 4572 "B0C0\n" | 4563 "B0C0\n" |
| 4573 "C0D0\n" | 4564 "C0D0\n" |
| 4574 "D0E0\n" | 4565 "D0E0\n" |
| 4575 "E0F0\n" | 4566 "E0F0\n" |
| 4576 "F0G0\n" | 4567 "F0G0\n" |
| 4577 "G0H0\n" | 4568 "G0H0\n" |
| 4578 "H0sssI0sss\n" | 4569 "H0sssI0sss\n" |
| 4579 "I0J0\n" | 4570 "I0J0\n" |
| 4580 "J0ssss\n", | 4571 "J0ssss\n", |
| 4581 | 4572 |
| 4582 "R0sssssA0ssss\n" | 4573 "R0sssssA0ssss\n" |
| 4583 }, | 4574 }, { |
| 4584 { | |
| 4585 "Wide recursion, remove all", | 4575 "Wide recursion, remove all", |
| 4586 "R0A0[ct]B0[ct]C0[ct]D0[ct]E0[ct]F0[ct]G0[ct]H0[ct]I0[ct]J0[ct]\n" | 4576 "R0A0[ct]B0[ct]C0[ct]D0[ct]E0[ct]F0[ct]G0[ct]H0[ct]I0[ct]J0[ct]\n" |
| 4587 "A0s\n" | 4577 "A0s\n" |
| 4588 "B0s\n" | 4578 "B0s\n" |
| 4589 "C0ssss\n" | 4579 "C0ssss\n" |
| 4590 "D0ssss\n" | 4580 "D0ssss\n" |
| 4591 "E0s\n" | 4581 "E0s\n" |
| 4592 "F0\n" | 4582 "F0\n" |
| 4593 "G0s\n" | 4583 "G0s\n" |
| 4594 "H0s\n" | 4584 "H0s\n" |
| 4595 "I0s\n" | 4585 "I0s\n" |
| 4596 "J0ssss\n", | 4586 "J0ssss\n", |
| 4597 | 4587 |
| 4598 "R0A0B0C0D0E0F0G0H0I0J0\n" | 4588 "R0A0B0C0D0E0F0G0H0I0J0\n" |
| 4599 }, | 4589 }, { |
| 4600 { | |
| 4601 "Remove passes regardless of cache state", | 4590 "Remove passes regardless of cache state", |
| 4602 "R0ssssA0[ct]sss\n" | 4591 "R0ssssA0[ct]sss\n" |
| 4603 "A0sssB0C0s\n" | 4592 "A0sssB0C0s\n" |
| 4604 "B0sssD0[c]ssE0[t]F0\n" | 4593 "B0sssD0[c]ssE0[t]F0\n" |
| 4605 "E0ssssss\n" | 4594 "E0ssssss\n" |
| 4606 "C0G0\n" | 4595 "C0G0\n" |
| 4607 "D0sssssss\n" | 4596 "D0sssssss\n" |
| 4608 "F0sssssss\n" | 4597 "F0sssssss\n" |
| 4609 "G0sss\n", | 4598 "G0sss\n", |
| 4610 | 4599 |
| 4611 "R0ssssA0sss\n" | 4600 "R0ssssA0sss\n" |
| 4612 }, | 4601 }, { |
| 4613 { | |
| 4614 "Leave some passes, remove others", | 4602 "Leave some passes, remove others", |
| 4615 | 4603 |
| 4616 "R0ssssA0[c]sss\n" | 4604 "R0ssssA0[c]sss\n" |
| 4617 "A0sssB0[t]C0[ct]s\n" | 4605 "A0sssB0[t]C0[ct]s\n" |
| 4618 "B0sssD0[c]ss\n" | 4606 "B0sssD0[c]ss\n" |
| 4619 "C0G0\n" | 4607 "C0G0\n" |
| 4620 "D0sssssss\n" | 4608 "D0sssssss\n" |
| 4621 "G0sss\n", | 4609 "G0sss\n", |
| 4622 | 4610 |
| 4623 "R0ssssA0sss\n" | 4611 "R0ssssA0sss\n" |
| 4624 "A0sssB0C0s\n" | 4612 "A0sssB0C0s\n" |
| 4625 "B0sssD0ss\n" | 4613 "B0sssD0ss\n" |
| 4626 "D0sssssss\n" | 4614 "D0sssssss\n" |
| 4627 }, | 4615 }, { |
| 4628 { | |
| 4629 0, 0, 0 | 4616 0, 0, 0 |
| 4630 } | 4617 } |
| 4631 }; | 4618 }; |
| 4632 | 4619 |
| 4633 static void VerifyRenderPassTestData( | 4620 static void VerifyRenderPassTestData( |
| 4634 const TestCase& test_case, | 4621 const TestCase& test_case, |
| 4635 const RenderPassRemovalTestData& test_data) { | 4622 const RenderPassRemovalTestData& test_data) { |
| 4636 char actual_result[1024]; | 4623 char actual_result[1024]; |
| 4637 DumpRenderPassTestData(test_data, actual_result); | 4624 DumpRenderPassTestData(test_data, actual_result); |
| 4638 EXPECT_STREQ(test_case.expected_result, actual_result) << "In test case: " << | 4625 EXPECT_STREQ(test_case.expected_result, actual_result) << "In test case: " << |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4932 content_layer->SetAnchorPoint(gfx::PointF()); | 4919 content_layer->SetAnchorPoint(gfx::PointF()); |
| 4933 content_layer->SetDrawsContent(true); | 4920 content_layer->SetDrawsContent(true); |
| 4934 | 4921 |
| 4935 gfx::Size mask_size(100, 100); | 4922 gfx::Size mask_size(100, 100); |
| 4936 mask_layer->SetBounds(mask_size); | 4923 mask_layer->SetBounds(mask_size); |
| 4937 mask_layer->SetContentBounds(mask_size); | 4924 mask_layer->SetContentBounds(mask_size); |
| 4938 mask_layer->SetPosition(gfx::PointF()); | 4925 mask_layer->SetPosition(gfx::PointF()); |
| 4939 mask_layer->SetAnchorPoint(gfx::PointF()); | 4926 mask_layer->SetAnchorPoint(gfx::PointF()); |
| 4940 mask_layer->SetDrawsContent(true); | 4927 mask_layer->SetDrawsContent(true); |
| 4941 | 4928 |
| 4942 | |
| 4943 // Check that the mask fills the surface. | 4929 // Check that the mask fills the surface. |
| 4944 float device_scale_factor = 1.f; | 4930 float device_scale_factor = 1.f; |
| 4945 host_impl_->SetViewportSize(root_size); | 4931 host_impl_->SetViewportSize(root_size); |
| 4946 host_impl_->SetDeviceScaleFactor(device_scale_factor); | 4932 host_impl_->SetDeviceScaleFactor(device_scale_factor); |
| 4947 { | 4933 { |
| 4948 LayerTreeHostImpl::FrameData frame; | 4934 LayerTreeHostImpl::FrameData frame; |
| 4949 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | 4935 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); |
| 4950 | 4936 |
| 4951 ASSERT_EQ(1u, frame.render_passes.size()); | 4937 ASSERT_EQ(1u, frame.render_passes.size()); |
| 4952 ASSERT_EQ(1u, frame.render_passes[0]->quad_list.size()); | 4938 ASSERT_EQ(1u, frame.render_passes[0]->quad_list.size()); |
| 4953 ASSERT_EQ(DrawQuad::RENDER_PASS, | 4939 ASSERT_EQ(DrawQuad::RENDER_PASS, |
| 4954 frame.render_passes[0]->quad_list[0]->material); | 4940 frame.render_passes[0]->quad_list[0]->material); |
| 4955 const RenderPassDrawQuad* render_pass_quad = | 4941 const RenderPassDrawQuad* render_pass_quad = |
| 4956 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); | 4942 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); |
| 4957 EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(), | 4943 EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(), |
| 4958 render_pass_quad->rect.ToString()); | 4944 render_pass_quad->rect.ToString()); |
| 4959 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), | 4945 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), |
| 4960 render_pass_quad->mask_uv_rect.ToString()); | 4946 render_pass_quad->mask_uv_rect.ToString()); |
| 4961 | 4947 |
| 4962 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | 4948 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); |
| 4963 host_impl_->DidDrawAllLayers(frame); | 4949 host_impl_->DidDrawAllLayers(frame); |
| 4964 } | 4950 } |
| 4965 | 4951 |
| 4966 | |
| 4967 // Applying a DSF should change the render surface size, but won't affect | 4952 // Applying a DSF should change the render surface size, but won't affect |
| 4968 // which part of the mask is used. | 4953 // which part of the mask is used. |
| 4969 device_scale_factor = 2.f; | 4954 device_scale_factor = 2.f; |
| 4970 gfx::Size device_viewport = | 4955 gfx::Size device_viewport = |
| 4971 gfx::ToFlooredSize(gfx::ScaleSize(root_size, device_scale_factor)); | 4956 gfx::ToFlooredSize(gfx::ScaleSize(root_size, device_scale_factor)); |
| 4972 host_impl_->SetViewportSize(device_viewport); | 4957 host_impl_->SetViewportSize(device_viewport); |
| 4973 host_impl_->SetDeviceScaleFactor(device_scale_factor); | 4958 host_impl_->SetDeviceScaleFactor(device_scale_factor); |
| 4974 host_impl_->active_tree()->set_needs_update_draw_properties(); | 4959 host_impl_->active_tree()->set_needs_update_draw_properties(); |
| 4975 { | 4960 { |
| 4976 LayerTreeHostImpl::FrameData frame; | 4961 LayerTreeHostImpl::FrameData frame; |
| 4977 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | 4962 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); |
| 4978 | 4963 |
| 4979 ASSERT_EQ(1u, frame.render_passes.size()); | 4964 ASSERT_EQ(1u, frame.render_passes.size()); |
| 4980 ASSERT_EQ(1u, frame.render_passes[0]->quad_list.size()); | 4965 ASSERT_EQ(1u, frame.render_passes[0]->quad_list.size()); |
| 4981 ASSERT_EQ(DrawQuad::RENDER_PASS, | 4966 ASSERT_EQ(DrawQuad::RENDER_PASS, |
| 4982 frame.render_passes[0]->quad_list[0]->material); | 4967 frame.render_passes[0]->quad_list[0]->material); |
| 4983 const RenderPassDrawQuad* render_pass_quad = | 4968 const RenderPassDrawQuad* render_pass_quad = |
| 4984 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); | 4969 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); |
| 4985 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), | 4970 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), |
| 4986 render_pass_quad->rect.ToString()); | 4971 render_pass_quad->rect.ToString()); |
| 4987 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), | 4972 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), |
| 4988 render_pass_quad->mask_uv_rect.ToString()); | 4973 render_pass_quad->mask_uv_rect.ToString()); |
| 4989 | 4974 |
| 4990 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | 4975 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); |
| 4991 host_impl_->DidDrawAllLayers(frame); | 4976 host_impl_->DidDrawAllLayers(frame); |
| 4992 } | 4977 } |
| 4993 | 4978 |
| 4994 | |
| 4995 // Applying an equivalent content scale on the content layer and the mask | 4979 // Applying an equivalent content scale on the content layer and the mask |
| 4996 // should still result in the same part of the mask being used. | 4980 // should still result in the same part of the mask being used. |
| 4997 gfx::Size layer_size_large = | 4981 gfx::Size layer_size_large = |
| 4998 gfx::ToRoundedSize(gfx::ScaleSize(layer_size, device_scale_factor)); | 4982 gfx::ToRoundedSize(gfx::ScaleSize(layer_size, device_scale_factor)); |
| 4999 content_layer->SetContentBounds(layer_size_large); | 4983 content_layer->SetContentBounds(layer_size_large); |
| 5000 content_layer->SetContentsScale(device_scale_factor, device_scale_factor); | 4984 content_layer->SetContentsScale(device_scale_factor, device_scale_factor); |
| 5001 gfx::Size mask_size_large = | 4985 gfx::Size mask_size_large = |
| 5002 gfx::ToRoundedSize(gfx::ScaleSize(mask_size, device_scale_factor)); | 4986 gfx::ToRoundedSize(gfx::ScaleSize(mask_size, device_scale_factor)); |
| 5003 mask_layer->SetContentBounds(mask_size_large); | 4987 mask_layer->SetContentBounds(mask_size_large); |
| 5004 mask_layer->SetContentsScale(device_scale_factor, device_scale_factor); | 4988 mask_layer->SetContentsScale(device_scale_factor, device_scale_factor); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 5015 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); | 4999 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); |
| 5016 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), | 5000 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), |
| 5017 render_pass_quad->rect.ToString()); | 5001 render_pass_quad->rect.ToString()); |
| 5018 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), | 5002 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), |
| 5019 render_pass_quad->mask_uv_rect.ToString()); | 5003 render_pass_quad->mask_uv_rect.ToString()); |
| 5020 | 5004 |
| 5021 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | 5005 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); |
| 5022 host_impl_->DidDrawAllLayers(frame); | 5006 host_impl_->DidDrawAllLayers(frame); |
| 5023 } | 5007 } |
| 5024 | 5008 |
| 5025 // Applying a different contents scale to the mask layer will still result | 5009 // Applying a different contents scale to the mask layer means it will have |
| 5026 // in the mask covering the owning layer. | 5010 // to scale itself to cover the same area its bounds should cover. Since |
| 5011 // the contents scale is halved, the mask will have to be stretched double | |
| 5012 // to cover the right area. | |
| 5027 mask_layer->SetContentBounds(mask_size); | 5013 mask_layer->SetContentBounds(mask_size); |
| 5028 mask_layer->SetContentsScale(device_scale_factor, device_scale_factor); | 5014 mask_layer->SetContentsScale(1.f, 1.f); |
| 5029 host_impl_->active_tree()->set_needs_update_draw_properties(); | 5015 host_impl_->active_tree()->set_needs_update_draw_properties(); |
| 5030 { | 5016 { |
| 5031 LayerTreeHostImpl::FrameData frame; | 5017 LayerTreeHostImpl::FrameData frame; |
| 5032 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | 5018 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); |
| 5033 | 5019 |
| 5034 ASSERT_EQ(1u, frame.render_passes.size()); | 5020 ASSERT_EQ(1u, frame.render_passes.size()); |
| 5035 ASSERT_EQ(1u, frame.render_passes[0]->quad_list.size()); | 5021 ASSERT_EQ(1u, frame.render_passes[0]->quad_list.size()); |
| 5036 ASSERT_EQ(DrawQuad::RENDER_PASS, | 5022 ASSERT_EQ(DrawQuad::RENDER_PASS, |
| 5037 frame.render_passes[0]->quad_list[0]->material); | 5023 frame.render_passes[0]->quad_list[0]->material); |
| 5038 const RenderPassDrawQuad* render_pass_quad = | 5024 const RenderPassDrawQuad* render_pass_quad = |
| 5039 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); | 5025 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); |
| 5040 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), | 5026 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), |
| 5041 render_pass_quad->rect.ToString()); | 5027 render_pass_quad->rect.ToString()); |
| 5028 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.5f, 0.5f).ToString(), | |
| 5029 render_pass_quad->mask_uv_rect.ToString()); | |
| 5030 | |
| 5031 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | |
| 5032 host_impl_->DidDrawAllLayers(frame); | |
| 5033 } | |
| 5034 } | |
| 5035 | |
| 5036 TEST_F(LayerTreeHostImplTest, ReflectionMaskLayerWithDifferentBounds) { | |
| 5037 // The replica's mask layer has bounds 100x100 but the replica is of a | |
| 5038 // layer with bounds 50x50. | |
| 5039 | |
| 5040 scoped_ptr<LayerImpl> scoped_root = | |
| 5041 LayerImpl::Create(host_impl_->active_tree(), 1); | |
| 5042 LayerImpl* root = scoped_root.get(); | |
| 5043 host_impl_->active_tree()->SetRootLayer(scoped_root.Pass()); | |
| 5044 | |
| 5045 scoped_ptr<LayerImpl> scoped_content_layer = | |
| 5046 LayerImpl::Create(host_impl_->active_tree(), 3); | |
| 5047 LayerImpl* content_layer = scoped_content_layer.get(); | |
| 5048 root->AddChild(scoped_content_layer.Pass()); | |
| 5049 | |
| 5050 scoped_ptr<LayerImpl> scoped_replica_layer = | |
| 5051 LayerImpl::Create(host_impl_->active_tree(), 2); | |
| 5052 LayerImpl* replica_layer = scoped_replica_layer.get(); | |
| 5053 content_layer->SetReplicaLayer(scoped_replica_layer.Pass()); | |
| 5054 | |
| 5055 scoped_ptr<FakeMaskLayerImpl> scoped_mask_layer = | |
| 5056 FakeMaskLayerImpl::Create(host_impl_->active_tree(), 4); | |
| 5057 FakeMaskLayerImpl* mask_layer = scoped_mask_layer.get(); | |
| 5058 replica_layer->SetMaskLayer(scoped_mask_layer.PassAs<LayerImpl>()); | |
| 5059 | |
| 5060 gfx::Size root_size(100, 100); | |
| 5061 root->SetBounds(root_size); | |
| 5062 root->SetContentBounds(root_size); | |
| 5063 root->SetPosition(gfx::PointF()); | |
| 5064 root->SetAnchorPoint(gfx::PointF()); | |
| 5065 | |
| 5066 gfx::Size layer_size(50, 50); | |
| 5067 content_layer->SetBounds(layer_size); | |
| 5068 content_layer->SetContentBounds(layer_size); | |
| 5069 content_layer->SetPosition(gfx::PointF()); | |
| 5070 content_layer->SetAnchorPoint(gfx::PointF()); | |
| 5071 content_layer->SetDrawsContent(true); | |
| 5072 | |
| 5073 gfx::Size mask_size(100, 100); | |
| 5074 mask_layer->SetBounds(mask_size); | |
| 5075 mask_layer->SetContentBounds(mask_size); | |
| 5076 mask_layer->SetPosition(gfx::PointF()); | |
| 5077 mask_layer->SetAnchorPoint(gfx::PointF()); | |
| 5078 mask_layer->SetDrawsContent(true); | |
| 5079 | |
| 5080 // Check that the mask fills the surface. | |
| 5081 float device_scale_factor = 1.f; | |
| 5082 host_impl_->SetViewportSize(root_size); | |
| 5083 host_impl_->SetDeviceScaleFactor(device_scale_factor); | |
| 5084 { | |
| 5085 LayerTreeHostImpl::FrameData frame; | |
| 5086 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | |
| 5087 | |
| 5088 ASSERT_EQ(1u, frame.render_passes.size()); | |
| 5089 ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); | |
| 5090 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
| 5091 frame.render_passes[0]->quad_list[1]->material); | |
| 5092 const RenderPassDrawQuad* replica_quad = | |
| 5093 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); | |
| 5094 EXPECT_TRUE(replica_quad->is_replica); | |
| 5095 EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(), | |
| 5096 replica_quad->rect.ToString()); | |
| 5042 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), | 5097 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), |
| 5098 replica_quad->mask_uv_rect.ToString()); | |
| 5099 | |
| 5100 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | |
| 5101 host_impl_->DidDrawAllLayers(frame); | |
| 5102 } | |
| 5103 | |
| 5104 // Applying a DSF should change the render surface size, but won't affect | |
| 5105 // which part of the mask is used. | |
| 5106 device_scale_factor = 2.f; | |
| 5107 gfx::Size device_viewport = | |
| 5108 gfx::ToFlooredSize(gfx::ScaleSize(root_size, device_scale_factor)); | |
| 5109 host_impl_->SetViewportSize(device_viewport); | |
| 5110 host_impl_->SetDeviceScaleFactor(device_scale_factor); | |
| 5111 host_impl_->active_tree()->set_needs_update_draw_properties(); | |
| 5112 { | |
| 5113 LayerTreeHostImpl::FrameData frame; | |
| 5114 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | |
| 5115 | |
| 5116 ASSERT_EQ(1u, frame.render_passes.size()); | |
| 5117 ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); | |
| 5118 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
| 5119 frame.render_passes[0]->quad_list[1]->material); | |
| 5120 const RenderPassDrawQuad* replica_quad = | |
| 5121 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); | |
| 5122 EXPECT_TRUE(replica_quad->is_replica); | |
| 5123 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), | |
| 5124 replica_quad->rect.ToString()); | |
| 5125 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), | |
| 5126 replica_quad->mask_uv_rect.ToString()); | |
| 5127 | |
| 5128 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | |
| 5129 host_impl_->DidDrawAllLayers(frame); | |
| 5130 } | |
| 5131 | |
| 5132 // Applying an equivalent content scale on the content layer and the mask | |
| 5133 // should still result in the same part of the mask being used. | |
| 5134 gfx::Size layer_size_large = | |
| 5135 gfx::ToRoundedSize(gfx::ScaleSize(layer_size, device_scale_factor)); | |
| 5136 content_layer->SetContentBounds(layer_size_large); | |
| 5137 content_layer->SetContentsScale(device_scale_factor, device_scale_factor); | |
| 5138 gfx::Size mask_size_large = | |
| 5139 gfx::ToRoundedSize(gfx::ScaleSize(mask_size, device_scale_factor)); | |
| 5140 mask_layer->SetContentBounds(mask_size_large); | |
| 5141 mask_layer->SetContentsScale(device_scale_factor, device_scale_factor); | |
| 5142 host_impl_->active_tree()->set_needs_update_draw_properties(); | |
| 5143 { | |
| 5144 LayerTreeHostImpl::FrameData frame; | |
| 5145 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | |
| 5146 | |
| 5147 ASSERT_EQ(1u, frame.render_passes.size()); | |
| 5148 ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); | |
| 5149 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
| 5150 frame.render_passes[0]->quad_list[1]->material); | |
| 5151 const RenderPassDrawQuad* replica_quad = | |
| 5152 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); | |
| 5153 EXPECT_TRUE(replica_quad->is_replica); | |
| 5154 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), | |
| 5155 replica_quad->rect.ToString()); | |
| 5156 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), | |
| 5157 replica_quad->mask_uv_rect.ToString()); | |
| 5158 | |
| 5159 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | |
| 5160 host_impl_->DidDrawAllLayers(frame); | |
| 5161 } | |
| 5162 | |
| 5163 // Applying a different contents scale to the mask layer means it will have | |
| 5164 // to scale itself to cover the same area its bounds should cover. Since | |
| 5165 // the contents scale is halved, the mask will have to be stretched double | |
| 5166 // to cover the right area. | |
| 5167 mask_layer->SetContentBounds(mask_size); | |
| 5168 mask_layer->SetContentsScale(1.f, 1.f); | |
| 5169 host_impl_->active_tree()->set_needs_update_draw_properties(); | |
| 5170 { | |
| 5171 LayerTreeHostImpl::FrameData frame; | |
| 5172 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | |
| 5173 | |
| 5174 ASSERT_EQ(1u, frame.render_passes.size()); | |
| 5175 ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); | |
| 5176 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
| 5177 frame.render_passes[0]->quad_list[1]->material); | |
| 5178 const RenderPassDrawQuad* replica_quad = | |
| 5179 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); | |
| 5180 EXPECT_TRUE(replica_quad->is_replica); | |
| 5181 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), | |
| 5182 replica_quad->rect.ToString()); | |
| 5183 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.5f, 0.5f).ToString(), | |
|
enne (OOO)
2013/04/16 21:06:44
Can you explain this? These uv coords look like y
danakj
2013/04/16 21:21:01
The shader takes a tex coord in the surface textur
| |
| 5184 replica_quad->mask_uv_rect.ToString()); | |
| 5185 | |
| 5186 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | |
| 5187 host_impl_->DidDrawAllLayers(frame); | |
| 5188 } | |
| 5189 } | |
| 5190 | |
| 5191 TEST_F(LayerTreeHostImplTest, ReflectionMaskLayerForSurfaceWithUnclippedChild) { | |
| 5192 // The replica is of a layer with bounds 50x50, but it has a child that causes | |
| 5193 // the surface bounds to be larger. | |
| 5194 | |
| 5195 scoped_ptr<LayerImpl> scoped_root = | |
| 5196 LayerImpl::Create(host_impl_->active_tree(), 1); | |
| 5197 LayerImpl* root = scoped_root.get(); | |
| 5198 host_impl_->active_tree()->SetRootLayer(scoped_root.Pass()); | |
| 5199 | |
| 5200 scoped_ptr<LayerImpl> scoped_content_layer = | |
| 5201 LayerImpl::Create(host_impl_->active_tree(), 2); | |
| 5202 LayerImpl* content_layer = scoped_content_layer.get(); | |
| 5203 root->AddChild(scoped_content_layer.Pass()); | |
| 5204 | |
| 5205 scoped_ptr<LayerImpl> scoped_content_child_layer = | |
| 5206 LayerImpl::Create(host_impl_->active_tree(), 3); | |
| 5207 LayerImpl* content_child_layer = scoped_content_child_layer.get(); | |
| 5208 content_layer->AddChild(scoped_content_child_layer.Pass()); | |
| 5209 | |
| 5210 scoped_ptr<LayerImpl> scoped_replica_layer = | |
| 5211 LayerImpl::Create(host_impl_->active_tree(), 4); | |
| 5212 LayerImpl* replica_layer = scoped_replica_layer.get(); | |
| 5213 content_layer->SetReplicaLayer(scoped_replica_layer.Pass()); | |
| 5214 | |
| 5215 scoped_ptr<FakeMaskLayerImpl> scoped_mask_layer = | |
| 5216 FakeMaskLayerImpl::Create(host_impl_->active_tree(), 5); | |
| 5217 FakeMaskLayerImpl* mask_layer = scoped_mask_layer.get(); | |
| 5218 replica_layer->SetMaskLayer(scoped_mask_layer.PassAs<LayerImpl>()); | |
| 5219 | |
| 5220 gfx::Size root_size(100, 100); | |
| 5221 root->SetBounds(root_size); | |
| 5222 root->SetContentBounds(root_size); | |
| 5223 root->SetPosition(gfx::PointF()); | |
| 5224 root->SetAnchorPoint(gfx::PointF()); | |
| 5225 | |
| 5226 gfx::Size layer_size(50, 50); | |
| 5227 content_layer->SetBounds(layer_size); | |
| 5228 content_layer->SetContentBounds(layer_size); | |
| 5229 content_layer->SetPosition(gfx::PointF()); | |
| 5230 content_layer->SetAnchorPoint(gfx::PointF()); | |
| 5231 content_layer->SetDrawsContent(true); | |
| 5232 | |
| 5233 gfx::Size child_size(50, 50); | |
| 5234 content_child_layer->SetBounds(child_size); | |
| 5235 content_child_layer->SetContentBounds(child_size); | |
| 5236 content_child_layer->SetPosition(gfx::Point(50, 0)); | |
| 5237 content_child_layer->SetAnchorPoint(gfx::PointF()); | |
| 5238 content_child_layer->SetDrawsContent(true); | |
| 5239 | |
| 5240 gfx::Size mask_size(50, 50); | |
| 5241 mask_layer->SetBounds(mask_size); | |
| 5242 mask_layer->SetContentBounds(mask_size); | |
| 5243 mask_layer->SetPosition(gfx::PointF()); | |
| 5244 mask_layer->SetAnchorPoint(gfx::PointF()); | |
| 5245 mask_layer->SetDrawsContent(true); | |
| 5246 | |
| 5247 float device_scale_factor = 1.f; | |
| 5248 host_impl_->SetViewportSize(root_size); | |
| 5249 host_impl_->SetDeviceScaleFactor(device_scale_factor); | |
| 5250 { | |
| 5251 LayerTreeHostImpl::FrameData frame; | |
| 5252 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | |
| 5253 | |
| 5254 ASSERT_EQ(1u, frame.render_passes.size()); | |
| 5255 ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); | |
| 5256 | |
| 5257 // The surface is 100x50. | |
| 5258 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
| 5259 frame.render_passes[0]->quad_list[0]->material); | |
| 5260 const RenderPassDrawQuad* render_pass_quad = | |
| 5261 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); | |
| 5262 EXPECT_FALSE(render_pass_quad->is_replica); | |
| 5263 EXPECT_EQ(gfx::Rect(0, 0, 100, 50).ToString(), | |
| 5264 render_pass_quad->rect.ToString()); | |
| 5265 | |
| 5266 // The mask covers the owning layer only. | |
|
enne (OOO)
2013/04/16 21:06:44
This does not jibe with the numbers below. 0011 m
danakj
2013/04/16 21:21:01
If the mask is 50px wide, and the surface texture
| |
| 5267 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
| 5268 frame.render_passes[0]->quad_list[1]->material); | |
| 5269 const RenderPassDrawQuad* replica_quad = | |
| 5270 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); | |
| 5271 EXPECT_TRUE(replica_quad->is_replica); | |
| 5272 EXPECT_EQ(gfx::Rect(0, 0, 100, 50).ToString(), | |
| 5273 replica_quad->rect.ToString()); | |
| 5274 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), | |
| 5275 replica_quad->mask_uv_rect.ToString()); | |
| 5276 | |
| 5277 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | |
| 5278 host_impl_->DidDrawAllLayers(frame); | |
| 5279 } | |
| 5280 | |
| 5281 // Move the child to (-50, 0) instead. Now the mask should be moved to still | |
| 5282 // cover the layer being replicated. | |
| 5283 content_child_layer->SetPosition(gfx::Point(-50, 0)); | |
| 5284 { | |
| 5285 LayerTreeHostImpl::FrameData frame; | |
| 5286 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | |
| 5287 | |
| 5288 ASSERT_EQ(1u, frame.render_passes.size()); | |
| 5289 ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); | |
| 5290 | |
| 5291 // The surface is 100x50 with its origin at (-50, 0). | |
| 5292 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
| 5293 frame.render_passes[0]->quad_list[0]->material); | |
| 5294 const RenderPassDrawQuad* render_pass_quad = | |
| 5295 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); | |
| 5296 EXPECT_FALSE(render_pass_quad->is_replica); | |
| 5297 EXPECT_EQ(gfx::Rect(-50, 0, 100, 50).ToString(), | |
| 5298 render_pass_quad->rect.ToString()); | |
| 5299 | |
| 5300 // The mask covers the owning layer only. | |
| 5301 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
| 5302 frame.render_passes[0]->quad_list[1]->material); | |
| 5303 const RenderPassDrawQuad* replica_quad = | |
| 5304 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); | |
| 5305 EXPECT_TRUE(replica_quad->is_replica); | |
| 5306 EXPECT_EQ(gfx::Rect(-50, 0, 100, 50).ToString(), | |
| 5307 replica_quad->rect.ToString()); | |
| 5308 EXPECT_EQ(gfx::RectF(-0.5f, 0.f, 1.f, 1.f).ToString(), | |
|
enne (OOO)
2013/04/16 21:06:44
Previously, I mentioned that 2.f as a texcoord was
danakj
2013/04/16 21:21:01
The offset is not applied the same way as the scal
enne (OOO)
2013/04/17 16:24:40
I still think this is wrong, and this is why I sug
danakj
2013/04/17 16:55:59
Oh I replied to the pictures one about this before
| |
| 5309 replica_quad->mask_uv_rect.ToString()); | |
| 5310 | |
| 5311 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | |
| 5312 host_impl_->DidDrawAllLayers(frame); | |
| 5313 } | |
| 5314 } | |
| 5315 | |
| 5316 TEST_F(LayerTreeHostImplTest, MaskLayerForSurfaceWithClippedLayer) { | |
| 5317 // The masked layer has bounds 50x50, but it has a child that causes | |
| 5318 // the surface bounds to be larger. It also has a parent that clips the | |
| 5319 // masked layer and its surface. | |
| 5320 | |
| 5321 scoped_ptr<LayerImpl> scoped_root = | |
| 5322 LayerImpl::Create(host_impl_->active_tree(), 1); | |
| 5323 LayerImpl* root = scoped_root.get(); | |
| 5324 host_impl_->active_tree()->SetRootLayer(scoped_root.Pass()); | |
| 5325 | |
| 5326 scoped_ptr<LayerImpl> scoped_clipping_layer = | |
| 5327 LayerImpl::Create(host_impl_->active_tree(), 2); | |
| 5328 LayerImpl* clipping_layer = scoped_clipping_layer.get(); | |
| 5329 root->AddChild(scoped_clipping_layer.Pass()); | |
| 5330 | |
| 5331 scoped_ptr<LayerImpl> scoped_content_layer = | |
| 5332 LayerImpl::Create(host_impl_->active_tree(), 3); | |
| 5333 LayerImpl* content_layer = scoped_content_layer.get(); | |
| 5334 clipping_layer->AddChild(scoped_content_layer.Pass()); | |
| 5335 | |
| 5336 scoped_ptr<LayerImpl> scoped_content_child_layer = | |
| 5337 LayerImpl::Create(host_impl_->active_tree(), 4); | |
| 5338 LayerImpl* content_child_layer = scoped_content_child_layer.get(); | |
| 5339 content_layer->AddChild(scoped_content_child_layer.Pass()); | |
| 5340 | |
| 5341 scoped_ptr<FakeMaskLayerImpl> scoped_mask_layer = | |
| 5342 FakeMaskLayerImpl::Create(host_impl_->active_tree(), 6); | |
| 5343 FakeMaskLayerImpl* mask_layer = scoped_mask_layer.get(); | |
| 5344 content_layer->SetMaskLayer(scoped_mask_layer.PassAs<LayerImpl>()); | |
| 5345 | |
| 5346 gfx::Size root_size(100, 100); | |
| 5347 root->SetBounds(root_size); | |
| 5348 root->SetContentBounds(root_size); | |
| 5349 root->SetPosition(gfx::PointF()); | |
| 5350 root->SetAnchorPoint(gfx::PointF()); | |
| 5351 | |
| 5352 gfx::Rect clipping_rect(20, 10, 10, 20); | |
| 5353 clipping_layer->SetBounds(clipping_rect.size()); | |
| 5354 clipping_layer->SetContentBounds(clipping_rect.size()); | |
| 5355 clipping_layer->SetPosition(clipping_rect.origin()); | |
| 5356 clipping_layer->SetAnchorPoint(gfx::PointF()); | |
| 5357 clipping_layer->SetMasksToBounds(true); | |
| 5358 | |
| 5359 gfx::Size layer_size(50, 50); | |
| 5360 content_layer->SetBounds(layer_size); | |
| 5361 content_layer->SetContentBounds(layer_size); | |
| 5362 content_layer->SetPosition(gfx::Point() - clipping_rect.OffsetFromOrigin()); | |
| 5363 content_layer->SetAnchorPoint(gfx::PointF()); | |
| 5364 content_layer->SetDrawsContent(true); | |
| 5365 | |
| 5366 gfx::Size child_size(50, 50); | |
| 5367 content_child_layer->SetBounds(child_size); | |
| 5368 content_child_layer->SetContentBounds(child_size); | |
| 5369 content_child_layer->SetPosition(gfx::Point(50, 0)); | |
| 5370 content_child_layer->SetAnchorPoint(gfx::PointF()); | |
| 5371 content_child_layer->SetDrawsContent(true); | |
| 5372 | |
| 5373 gfx::Size mask_size(100, 100); | |
| 5374 mask_layer->SetBounds(mask_size); | |
| 5375 mask_layer->SetContentBounds(mask_size); | |
| 5376 mask_layer->SetPosition(gfx::PointF()); | |
| 5377 mask_layer->SetAnchorPoint(gfx::PointF()); | |
| 5378 mask_layer->SetDrawsContent(true); | |
| 5379 | |
| 5380 float device_scale_factor = 1.f; | |
| 5381 host_impl_->SetViewportSize(root_size); | |
| 5382 host_impl_->SetDeviceScaleFactor(device_scale_factor); | |
| 5383 { | |
| 5384 LayerTreeHostImpl::FrameData frame; | |
| 5385 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | |
| 5386 | |
| 5387 ASSERT_EQ(1u, frame.render_passes.size()); | |
| 5388 ASSERT_EQ(1u, frame.render_passes[0]->quad_list.size()); | |
| 5389 | |
| 5390 // The surface is clipped to 10x20. | |
| 5391 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
| 5392 frame.render_passes[0]->quad_list[0]->material); | |
| 5393 const RenderPassDrawQuad* render_pass_quad = | |
| 5394 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); | |
| 5395 EXPECT_FALSE(render_pass_quad->is_replica); | |
| 5396 EXPECT_EQ(gfx::Rect(20, 10, 10, 20).ToString(), | |
| 5397 render_pass_quad->rect.ToString()); | |
| 5398 | |
| 5399 // The masked layer is 50x50, but the surface size is 10x20. So the texture | |
| 5400 // coords in the mask are scaled by 10/50 and 20/50. | |
| 5401 // The surface is clipped to (20,10) so the mask texture coords are offset | |
| 5402 // by 20/50 and 10/50 | |
| 5403 EXPECT_EQ(gfx::ScaleRect(gfx::RectF(20.f, 10.f, 10.f, 20.f), | |
| 5404 1.f / 50.f).ToString(), | |
| 5043 render_pass_quad->mask_uv_rect.ToString()); | 5405 render_pass_quad->mask_uv_rect.ToString()); |
| 5044 | 5406 |
| 5045 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | 5407 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); |
| 5046 host_impl_->DidDrawAllLayers(frame); | 5408 host_impl_->DidDrawAllLayers(frame); |
| 5047 } | 5409 } |
| 5048 } | 5410 } |
| 5049 | 5411 |
| 5050 } // namespace | 5412 } // namespace |
| 5051 } // namespace cc | 5413 } // namespace cc |
| OLD | NEW |