Index: cc/trees/layer_tree_host_common_unittest.cc |
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc |
index d7bd2169d2ed444240f4228abceec5423c79cd83..8a0d4a5efadcac07ce59e5b1923a9342eb120255 100644 |
--- a/cc/trees/layer_tree_host_common_unittest.cc |
+++ b/cc/trees/layer_tree_host_common_unittest.cc |
@@ -49,7 +49,9 @@ |
#include "cc/trees/task_runner_provider.h" |
#include "cc/trees/transform_node.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+#include "third_party/skia/include/core/SkImageFilter.h" |
#include "third_party/skia/include/effects/SkOffsetImageFilter.h" |
+#include "third_party/skia/include/effects/SkXfermodeImageFilter.h" |
#include "ui/gfx/geometry/quad_f.h" |
#include "ui/gfx/geometry/vector2d_conversions.h" |
#include "ui/gfx/transform.h" |
@@ -3119,6 +3121,180 @@ TEST_F(LayerTreeHostCommonTest, VisibleContentRectWithClippingAndScaling) { |
EXPECT_EQ(gfx::Rect(41, 41), grand_child->visible_layer_rect()); |
} |
+TEST_F(LayerTreeHostCommonTest, VisibleRectWithClippingAndFilters) { |
+ LayerImpl* root = root_layer_for_testing(); |
+ LayerImpl* clip = AddChild<LayerImpl>(root); |
+ LayerImpl* filter = AddChild<LayerImpl>(clip); |
+ LayerImpl* filter_child = AddChild<LayerImpl>(filter); |
+ |
+ root->SetBounds(gfx::Size(100, 100)); |
+ clip->SetBounds(gfx::Size(10, 10)); |
+ filter->test_properties()->force_render_surface = true; |
+ filter_child->SetBounds(gfx::Size(2000, 2000)); |
+ filter_child->SetPosition(gfx::PointF(-50, -50)); |
+ filter_child->SetDrawsContent(true); |
+ |
+ clip->SetMasksToBounds(true); |
+ |
+ ExecuteCalculateDrawProperties(root); |
+ EXPECT_EQ(gfx::Rect(50, 50, 10, 10), filter_child->visible_layer_rect()); |
+ EXPECT_EQ(gfx::Rect(10, 10), filter->render_surface()->content_rect()); |
+ |
+ FilterOperations blur_filter; |
+ blur_filter.Append(FilterOperation::CreateBlurFilter(4.0f)); |
+ filter->test_properties()->filters = blur_filter; |
+ host_impl()->active_tree()->property_trees()->needs_rebuild = true; |
+ |
+ ExecuteCalculateDrawProperties(root); |
+ |
+ EXPECT_EQ(gfx::Rect(38, 38, 34, 34), filter_child->visible_layer_rect()); |
+ EXPECT_EQ(gfx::Rect(-12, -12, 34, 34), |
+ filter->render_surface()->content_rect()); |
+ |
+ gfx::Transform vertical_flip; |
+ vertical_flip.Scale(1, -1); |
+ sk_sp<SkImageFilter> flip_filter = SkImageFilter::MakeMatrixFilter( |
+ vertical_flip.matrix(), kLow_SkFilterQuality, nullptr); |
+ FilterOperations reflection_filter; |
+ reflection_filter.Append( |
+ FilterOperation::CreateReferenceFilter(SkXfermodeImageFilter::Make( |
+ SkBlendMode::kSrcOver, std::move(flip_filter)))); |
+ filter->test_properties()->filters = reflection_filter; |
+ host_impl()->active_tree()->property_trees()->needs_rebuild = true; |
+ |
+ ExecuteCalculateDrawProperties(root); |
+ |
+ EXPECT_EQ(gfx::Rect(50, 40, 10, 20), filter_child->visible_layer_rect()); |
+ EXPECT_EQ(gfx::Rect(0, -10, 10, 20), |
+ filter->render_surface()->content_rect()); |
+} |
+ |
+TEST_F(LayerTreeHostCommonTest, VisibleRectWithScalingClippingAndFilters) { |
+ LayerImpl* root = root_layer_for_testing(); |
+ LayerImpl* scale = AddChild<LayerImpl>(root); |
+ LayerImpl* clip = AddChild<LayerImpl>(scale); |
+ LayerImpl* filter = AddChild<LayerImpl>(clip); |
+ LayerImpl* filter_child = AddChild<LayerImpl>(filter); |
+ |
+ root->SetBounds(gfx::Size(100, 100)); |
+ clip->SetBounds(gfx::Size(10, 10)); |
+ filter->test_properties()->force_render_surface = true; |
+ filter_child->SetBounds(gfx::Size(2000, 2000)); |
+ filter_child->SetPosition(gfx::PointF(-50, -50)); |
+ filter_child->SetDrawsContent(true); |
+ |
+ clip->SetMasksToBounds(true); |
+ |
+ gfx::Transform scale_transform; |
+ scale_transform.Scale(3, 3); |
+ scale->test_properties()->transform = scale_transform; |
+ |
+ ExecuteCalculateDrawProperties(root); |
+ EXPECT_EQ(gfx::Rect(50, 50, 10, 10), filter_child->visible_layer_rect()); |
+ EXPECT_EQ(gfx::Rect(30, 30), filter->render_surface()->content_rect()); |
+ |
+ FilterOperations blur_filter; |
+ blur_filter.Append(FilterOperation::CreateBlurFilter(4.0f)); |
+ filter->test_properties()->filters = blur_filter; |
+ host_impl()->active_tree()->property_trees()->needs_rebuild = true; |
+ |
+ ExecuteCalculateDrawProperties(root); |
+ |
+ EXPECT_EQ(gfx::Rect(38, 38, 34, 34), filter_child->visible_layer_rect()); |
+ EXPECT_EQ(gfx::Rect(-36, -36, 102, 102), |
+ filter->render_surface()->content_rect()); |
+ |
+ gfx::Transform vertical_flip; |
+ vertical_flip.Scale(1, -1); |
+ sk_sp<SkImageFilter> flip_filter = SkImageFilter::MakeMatrixFilter( |
+ vertical_flip.matrix(), kLow_SkFilterQuality, nullptr); |
+ FilterOperations reflection_filter; |
+ reflection_filter.Append( |
+ FilterOperation::CreateReferenceFilter(SkXfermodeImageFilter::Make( |
+ SkBlendMode::kSrcOver, std::move(flip_filter)))); |
+ filter->test_properties()->filters = reflection_filter; |
+ host_impl()->active_tree()->property_trees()->needs_rebuild = true; |
+ |
+ ExecuteCalculateDrawProperties(root); |
+ |
+ EXPECT_EQ(gfx::Rect(50, 40, 10, 20), filter_child->visible_layer_rect()); |
+ EXPECT_EQ(gfx::Rect(0, -30, 30, 60), |
+ filter->render_surface()->content_rect()); |
+} |
+ |
+TEST_F(LayerTreeHostCommonTest, ClipRectWithClipParentAndFilters) { |
+ LayerImpl* root = root_layer_for_testing(); |
+ LayerImpl* clip = AddChild<LayerImpl>(root); |
+ LayerImpl* filter = AddChild<LayerImpl>(clip); |
+ LayerImpl* filter_child_1 = AddChild<LayerImpl>(filter); |
+ LayerImpl* filter_child_2 = AddChild<LayerImpl>(filter); |
+ |
+ root->SetBounds(gfx::Size(100, 100)); |
+ clip->SetBounds(gfx::Size(10, 10)); |
+ filter->test_properties()->force_render_surface = true; |
+ |
+ filter_child_1->SetBounds(gfx::Size(20, 20)); |
+ filter_child_1->SetDrawsContent(true); |
+ filter_child_2->SetBounds(gfx::Size(20, 20)); |
+ filter_child_2->SetDrawsContent(true); |
+ |
+ root->SetMasksToBounds(true); |
+ clip->SetMasksToBounds(true); |
+ |
+ root->test_properties()->clip_children = |
+ base::MakeUnique<std::set<LayerImpl*>>(); |
+ root->test_properties()->clip_children->insert(filter_child_1); |
+ filter_child_1->test_properties()->clip_parent = root; |
+ |
+ ExecuteCalculateDrawProperties(root); |
+ EXPECT_TRUE(filter_child_1->is_clipped()); |
+ EXPECT_TRUE(filter_child_2->is_clipped()); |
+ EXPECT_EQ(gfx::Rect(100, 100), filter_child_1->clip_rect()); |
+ EXPECT_EQ(gfx::Rect(10, 10), filter_child_2->clip_rect()); |
+ |
+ FilterOperations blur_filter; |
+ blur_filter.Append(FilterOperation::CreateBlurFilter(4.0f)); |
+ filter->test_properties()->filters = blur_filter; |
+ host_impl()->active_tree()->property_trees()->needs_rebuild = true; |
+ |
+ ExecuteCalculateDrawProperties(root); |
+ |
+ EXPECT_TRUE(filter_child_1->is_clipped()); |
+ EXPECT_TRUE(filter_child_2->is_clipped()); |
+ EXPECT_EQ(gfx::Rect(100, 100), filter_child_1->clip_rect()); |
+ EXPECT_EQ(gfx::Rect(10, 10), filter_child_2->clip_rect()); |
+} |
+ |
+TEST_F(LayerTreeHostCommonTest, ClipRectWithClippedDescendantOfFilter) { |
+ LayerImpl* root = root_layer_for_testing(); |
+ LayerImpl* filter = AddChild<LayerImpl>(root); |
+ LayerImpl* clip = AddChild<LayerImpl>(filter); |
+ LayerImpl* filter_grand_child = AddChild<LayerImpl>(clip); |
+ |
+ root->SetBounds(gfx::Size(100, 100)); |
+ filter->test_properties()->force_render_surface = true; |
+ |
+ clip->SetBounds(gfx::Size(10, 10)); |
+ clip->SetMasksToBounds(true); |
+ |
+ filter_grand_child->SetBounds(gfx::Size(20, 20)); |
+ filter_grand_child->SetDrawsContent(true); |
+ |
+ ExecuteCalculateDrawProperties(root); |
+ EXPECT_TRUE(filter_grand_child->is_clipped()); |
+ EXPECT_EQ(gfx::Rect(10, 10), filter_grand_child->clip_rect()); |
+ |
+ FilterOperations blur_filter; |
+ blur_filter.Append(FilterOperation::CreateBlurFilter(4.0f)); |
+ filter->test_properties()->filters = blur_filter; |
+ host_impl()->active_tree()->property_trees()->needs_rebuild = true; |
+ |
+ ExecuteCalculateDrawProperties(root); |
+ |
+ EXPECT_TRUE(filter_grand_child->is_clipped()); |
+ EXPECT_EQ(gfx::Rect(10, 10), filter_grand_child->clip_rect()); |
+} |
+ |
TEST_F(LayerTreeHostCommonTest, |
DrawableAndVisibleContentRectsForLayersInUnclippedRenderSurface) { |
LayerImpl* root = root_layer_for_testing(); |