| 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_common.h" | 5 #include "cc/trees/layer_tree_host_common.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 2948 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2959 | 2959 |
| 2960 gfx::Rect expected_visible_layer_rect = gfx::Rect(0, 1, 10, 1); | 2960 gfx::Rect expected_visible_layer_rect = gfx::Rect(0, 1, 10, 1); |
| 2961 gfx::Rect expected_drawable_content_rect = target_surface_rect; | 2961 gfx::Rect expected_drawable_content_rect = target_surface_rect; |
| 2962 LayerImpl* drawing_layer = TestVisibleRectAndDrawableContentRect( | 2962 LayerImpl* drawing_layer = TestVisibleRectAndDrawableContentRect( |
| 2963 target_surface_rect, layer_to_surface_transform, layer_content_rect); | 2963 target_surface_rect, layer_to_surface_transform, layer_content_rect); |
| 2964 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); | 2964 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); |
| 2965 EXPECT_EQ(expected_drawable_content_rect, | 2965 EXPECT_EQ(expected_drawable_content_rect, |
| 2966 drawing_layer->drawable_content_rect()); | 2966 drawing_layer->drawable_content_rect()); |
| 2967 } | 2967 } |
| 2968 | 2968 |
| 2969 static bool ProjectionClips(const gfx::Transform& map_transform, |
| 2970 const gfx::RectF& mapped_rect) { |
| 2971 gfx::Transform inverse(Inverse(map_transform)); |
| 2972 bool clipped = false; |
| 2973 if (!clipped) |
| 2974 MathUtil::ProjectPoint(inverse, mapped_rect.top_right(), &clipped); |
| 2975 if (!clipped) |
| 2976 MathUtil::ProjectPoint(inverse, mapped_rect.origin(), &clipped); |
| 2977 if (!clipped) |
| 2978 MathUtil::ProjectPoint(inverse, mapped_rect.bottom_right(), &clipped); |
| 2979 if (!clipped) |
| 2980 MathUtil::ProjectPoint(inverse, mapped_rect.bottom_left(), &clipped); |
| 2981 return clipped; |
| 2982 } |
| 2983 |
| 2969 TEST_F(LayerTreeHostCommonDrawRectsTest, DrawRectsForPerspectiveUnprojection) { | 2984 TEST_F(LayerTreeHostCommonDrawRectsTest, DrawRectsForPerspectiveUnprojection) { |
| 2970 // To determine visible rect in layer space, there needs to be an | 2985 // To determine visible rect in layer space, there needs to be an |
| 2971 // un-projection from surface space to layer space. When the original | 2986 // un-projection from surface space to layer space. When the original |
| 2972 // transform was a perspective projection that was clipped, it returns a rect | 2987 // transform was a perspective projection that was clipped, it returns a rect |
| 2973 // that encloses the clipped bounds. Un-projecting this new rect may require | 2988 // that encloses the clipped bounds. Un-projecting this new rect may require |
| 2974 // clipping again. | 2989 // clipping again. |
| 2975 | 2990 |
| 2976 // This sequence of transforms causes one corner of the layer to protrude | 2991 // This sequence of transforms causes one corner of the layer to protrude |
| 2977 // across the w = 0 plane, and should be clipped. | 2992 // across the w = 0 plane, and should be clipped. |
| 2978 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 150, 150); | 2993 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 150, 150); |
| 2979 gfx::Rect layer_content_rect = gfx::Rect(0, 0, 20, 20); | 2994 gfx::Rect layer_content_rect = gfx::Rect(0, 0, 20, 20); |
| 2980 gfx::Transform layer_to_surface_transform; | 2995 gfx::Transform layer_to_surface_transform; |
| 2981 layer_to_surface_transform.MakeIdentity(); | 2996 layer_to_surface_transform.MakeIdentity(); |
| 2982 layer_to_surface_transform.Translate(10, 10); | 2997 layer_to_surface_transform.Translate(10, 10); |
| 2983 layer_to_surface_transform.ApplyPerspectiveDepth(1.0); | 2998 layer_to_surface_transform.ApplyPerspectiveDepth(1.0); |
| 2984 layer_to_surface_transform.Translate3d(0.0, 0.0, -5.0); | 2999 layer_to_surface_transform.Translate3d(0.0, 0.0, -5.0); |
| 2985 layer_to_surface_transform.RotateAboutYAxis(45.0); | 3000 layer_to_surface_transform.RotateAboutYAxis(45.0); |
| 2986 layer_to_surface_transform.RotateAboutXAxis(80.0); | 3001 layer_to_surface_transform.RotateAboutXAxis(80.0); |
| 2987 layer_to_surface_transform.Translate(-10, -10); | 3002 layer_to_surface_transform.Translate(-10, -10); |
| 2988 | 3003 |
| 2989 // Sanity check that un-projection does indeed cause w < 0, otherwise this | 3004 // Sanity check that un-projection does indeed cause w < 0, otherwise this |
| 2990 // code is not testing the intended scenario. | 3005 // code is not testing the intended scenario. |
| 2991 bool clipped; | |
| 2992 gfx::RectF clipped_rect = MathUtil::MapClippedRect( | 3006 gfx::RectF clipped_rect = MathUtil::MapClippedRect( |
| 2993 layer_to_surface_transform, gfx::RectF(layer_content_rect)); | 3007 layer_to_surface_transform, gfx::RectF(layer_content_rect)); |
| 2994 MathUtil::ProjectQuad( | 3008 ASSERT_TRUE(ProjectionClips(layer_to_surface_transform, clipped_rect)); |
| 2995 Inverse(layer_to_surface_transform), gfx::QuadF(clipped_rect), &clipped); | |
| 2996 ASSERT_TRUE(clipped); | |
| 2997 | 3009 |
| 2998 // Only the corner of the layer is not visible on the surface because of being | 3010 // Only the corner of the layer is not visible on the surface because of being |
| 2999 // clipped. But, the net result of rounding visible region to an axis-aligned | 3011 // clipped. But, the net result of rounding visible region to an axis-aligned |
| 3000 // rect is that the entire layer should still be considered visible. | 3012 // rect is that the entire layer should still be considered visible. |
| 3001 gfx::Rect expected_visible_layer_rect = layer_content_rect; | 3013 gfx::Rect expected_visible_layer_rect = layer_content_rect; |
| 3002 gfx::Rect expected_drawable_content_rect = target_surface_rect; | 3014 gfx::Rect expected_drawable_content_rect = target_surface_rect; |
| 3003 LayerImpl* drawing_layer = TestVisibleRectAndDrawableContentRect( | 3015 LayerImpl* drawing_layer = TestVisibleRectAndDrawableContentRect( |
| 3004 target_surface_rect, layer_to_surface_transform, layer_content_rect); | 3016 target_surface_rect, layer_to_surface_transform, layer_content_rect); |
| 3005 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); | 3017 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); |
| 3006 EXPECT_EQ(expected_drawable_content_rect, | 3018 EXPECT_EQ(expected_drawable_content_rect, |
| (...skipping 7759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10766 EXPECT_EQ(scroll_child6.id, grand_child10->scroll_tree_index()); | 10778 EXPECT_EQ(scroll_child6.id, grand_child10->scroll_tree_index()); |
| 10767 EXPECT_EQ(scroll_root1.id, parent3->scroll_tree_index()); | 10779 EXPECT_EQ(scroll_root1.id, parent3->scroll_tree_index()); |
| 10768 EXPECT_EQ(scroll_child7.id, child8->scroll_tree_index()); | 10780 EXPECT_EQ(scroll_child7.id, child8->scroll_tree_index()); |
| 10769 EXPECT_EQ(scroll_root1.id, parent4->scroll_tree_index()); | 10781 EXPECT_EQ(scroll_root1.id, parent4->scroll_tree_index()); |
| 10770 EXPECT_EQ(scroll_root1.id, child9->scroll_tree_index()); | 10782 EXPECT_EQ(scroll_root1.id, child9->scroll_tree_index()); |
| 10771 EXPECT_EQ(scroll_root1.id, grand_child12->scroll_tree_index()); | 10783 EXPECT_EQ(scroll_root1.id, grand_child12->scroll_tree_index()); |
| 10772 } | 10784 } |
| 10773 | 10785 |
| 10774 } // namespace | 10786 } // namespace |
| 10775 } // namespace cc | 10787 } // namespace cc |
| OLD | NEW |