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 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 layer_transforms_should_scale_layer_contents = true; | 97 layer_transforms_should_scale_layer_contents = true; |
98 } | 98 } |
99 }; | 99 }; |
100 | 100 |
101 class LayerTreeHostCommonScalingTest : public LayerTreeHostCommonTest { | 101 class LayerTreeHostCommonScalingTest : public LayerTreeHostCommonTest { |
102 public: | 102 public: |
103 LayerTreeHostCommonScalingTest() | 103 LayerTreeHostCommonScalingTest() |
104 : LayerTreeHostCommonTest(LayerTreeSettingsScaleContent()) {} | 104 : LayerTreeHostCommonTest(LayerTreeSettingsScaleContent()) {} |
105 }; | 105 }; |
106 | 106 |
| 107 class LayerTreeHostCommonDrawRectsTest : public LayerTreeHostCommonTest { |
| 108 public: |
| 109 LayerTreeHostCommonDrawRectsTest() : LayerTreeHostCommonTest() {} |
| 110 |
| 111 LayerImpl* TestVisibleRectAndDrawableContentRect( |
| 112 const gfx::Rect& target_rect, |
| 113 const gfx::Transform& layer_transform, |
| 114 const gfx::Rect& layer_rect) { |
| 115 LayerImpl* root = root_layer(); |
| 116 LayerImpl* target = AddChild<LayerImpl>(root); |
| 117 LayerImpl* drawing_layer = AddChild<LayerImpl>(target); |
| 118 |
| 119 root->SetDrawsContent(true); |
| 120 target->SetDrawsContent(true); |
| 121 target->SetMasksToBounds(true); |
| 122 drawing_layer->SetDrawsContent(true); |
| 123 |
| 124 gfx::Transform identity; |
| 125 |
| 126 SetLayerPropertiesForTesting(root, identity, gfx::Point3F(), gfx::PointF(), |
| 127 gfx::Size(500, 500), true, false, true); |
| 128 SetLayerPropertiesForTesting(target, identity, gfx::Point3F(), |
| 129 gfx::PointF(target_rect.origin()), |
| 130 target_rect.size(), true, false, true); |
| 131 SetLayerPropertiesForTesting(drawing_layer, layer_transform, gfx::Point3F(), |
| 132 gfx::PointF(layer_rect.origin()), |
| 133 layer_rect.size(), true, false, false); |
| 134 |
| 135 host_impl()->active_tree()->property_trees()->needs_rebuild = true; |
| 136 ExecuteCalculateDrawProperties(root); |
| 137 |
| 138 return drawing_layer; |
| 139 } |
| 140 }; |
| 141 |
107 TEST_F(LayerTreeHostCommonTest, TransformsForNoOpLayer) { | 142 TEST_F(LayerTreeHostCommonTest, TransformsForNoOpLayer) { |
108 // Sanity check: For layers positioned at zero, with zero size, | 143 // Sanity check: For layers positioned at zero, with zero size, |
109 // and with identity transforms, then the draw transform, | 144 // and with identity transforms, then the draw transform, |
110 // screen space transform, and the hierarchy passed on to children | 145 // screen space transform, and the hierarchy passed on to children |
111 // layers should also be identity transforms. | 146 // layers should also be identity transforms. |
112 | 147 |
113 LayerImpl* parent = root_layer(); | 148 LayerImpl* parent = root_layer(); |
114 LayerImpl* child = AddChild<LayerImpl>(parent); | 149 LayerImpl* child = AddChild<LayerImpl>(parent); |
115 LayerImpl* grand_child = AddChild<LayerImpl>(child); | 150 LayerImpl* grand_child = AddChild<LayerImpl>(child); |
116 | 151 |
(...skipping 2572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2689 | 2724 |
2690 EXPECT_FALSE(parent->screen_space_transform_is_animating()); | 2725 EXPECT_FALSE(parent->screen_space_transform_is_animating()); |
2691 EXPECT_FALSE(child->screen_space_transform_is_animating()); | 2726 EXPECT_FALSE(child->screen_space_transform_is_animating()); |
2692 | 2727 |
2693 EXPECT_FALSE(grand_child->TransformIsAnimating()); | 2728 EXPECT_FALSE(grand_child->TransformIsAnimating()); |
2694 EXPECT_TRUE(grand_child->HasPotentiallyRunningTransformAnimation()); | 2729 EXPECT_TRUE(grand_child->HasPotentiallyRunningTransformAnimation()); |
2695 EXPECT_TRUE(grand_child->screen_space_transform_is_animating()); | 2730 EXPECT_TRUE(grand_child->screen_space_transform_is_animating()); |
2696 EXPECT_TRUE(great_grand_child->screen_space_transform_is_animating()); | 2731 EXPECT_TRUE(great_grand_child->screen_space_transform_is_animating()); |
2697 } | 2732 } |
2698 | 2733 |
2699 TEST_F(LayerTreeHostCommonTest, VisibleRectForIdentityTransform) { | 2734 TEST_F(LayerTreeHostCommonDrawRectsTest, DrawRectsForIdentityTransform) { |
2700 // Test the calculateVisibleRect() function works correctly for identity | 2735 // Test visible layer rect and drawable content rect are calculated correctly |
2701 // transforms. | 2736 // correctly for identity transforms. |
2702 | 2737 |
2703 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100); | 2738 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100); |
2704 gfx::Transform layer_to_surface_transform; | 2739 gfx::Transform layer_to_surface_transform; |
2705 | 2740 |
2706 // Case 1: Layer is contained within the surface. | 2741 // Case 1: Layer is contained within the surface. |
2707 gfx::Rect layer_content_rect = gfx::Rect(10, 10, 30, 30); | 2742 gfx::Rect layer_content_rect = gfx::Rect(10, 10, 30, 30); |
2708 gfx::Rect expected = gfx::Rect(10, 10, 30, 30); | 2743 gfx::Rect expected_visible_layer_rect = gfx::Rect(30, 30); |
2709 gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect( | 2744 gfx::Rect expected_drawable_content_rect = gfx::Rect(10, 10, 30, 30); |
2710 target_surface_rect, layer_content_rect, layer_to_surface_transform); | 2745 LayerImpl* drawing_layer = TestVisibleRectAndDrawableContentRect( |
2711 EXPECT_EQ(expected, actual); | 2746 target_surface_rect, layer_to_surface_transform, layer_content_rect); |
| 2747 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); |
| 2748 EXPECT_EQ(expected_drawable_content_rect, |
| 2749 drawing_layer->drawable_content_rect()); |
2712 | 2750 |
2713 // Case 2: Layer is outside the surface rect. | 2751 // Case 2: Layer is outside the surface rect. |
2714 layer_content_rect = gfx::Rect(120, 120, 30, 30); | 2752 layer_content_rect = gfx::Rect(120, 120, 30, 30); |
2715 actual = LayerTreeHostCommon::CalculateVisibleRect( | 2753 expected_visible_layer_rect = gfx::Rect(); |
2716 target_surface_rect, layer_content_rect, layer_to_surface_transform); | 2754 expected_drawable_content_rect = gfx::Rect(); |
2717 EXPECT_TRUE(actual.IsEmpty()); | 2755 drawing_layer = TestVisibleRectAndDrawableContentRect( |
| 2756 target_surface_rect, layer_to_surface_transform, layer_content_rect); |
| 2757 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); |
| 2758 EXPECT_EQ(expected_drawable_content_rect, |
| 2759 drawing_layer->drawable_content_rect()); |
2718 | 2760 |
2719 // Case 3: Layer is partially overlapping the surface rect. | 2761 // Case 3: Layer is partially overlapping the surface rect. |
2720 layer_content_rect = gfx::Rect(80, 80, 30, 30); | 2762 layer_content_rect = gfx::Rect(80, 80, 30, 30); |
2721 expected = gfx::Rect(80, 80, 20, 20); | 2763 expected_visible_layer_rect = gfx::Rect(20, 20); |
2722 actual = LayerTreeHostCommon::CalculateVisibleRect( | 2764 expected_drawable_content_rect = gfx::Rect(80, 80, 20, 20); |
2723 target_surface_rect, layer_content_rect, layer_to_surface_transform); | 2765 drawing_layer = TestVisibleRectAndDrawableContentRect( |
2724 EXPECT_EQ(expected, actual); | 2766 target_surface_rect, layer_to_surface_transform, layer_content_rect); |
| 2767 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); |
| 2768 EXPECT_EQ(expected_drawable_content_rect, |
| 2769 drawing_layer->drawable_content_rect()); |
2725 } | 2770 } |
2726 | 2771 |
2727 TEST_F(LayerTreeHostCommonTest, VisibleRectForTranslations) { | 2772 TEST_F(LayerTreeHostCommonDrawRectsTest, DrawRectsFor2DRotations) { |
2728 // Test the calculateVisibleRect() function works correctly for scaling | 2773 // Test visible layer rect and drawable content rect are calculated correctly |
2729 // transforms. | 2774 // for rotations about z-axis (i.e. 2D rotations). |
2730 | 2775 |
2731 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100); | 2776 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100); |
2732 gfx::Rect layer_content_rect = gfx::Rect(0, 0, 30, 30); | 2777 gfx::Rect layer_content_rect = gfx::Rect(0, 0, 30, 30); |
2733 gfx::Transform layer_to_surface_transform; | |
2734 | |
2735 // Case 1: Layer is contained within the surface. | |
2736 layer_to_surface_transform.MakeIdentity(); | |
2737 layer_to_surface_transform.Translate(10.0, 10.0); | |
2738 gfx::Rect expected = gfx::Rect(0, 0, 30, 30); | |
2739 gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect( | |
2740 target_surface_rect, layer_content_rect, layer_to_surface_transform); | |
2741 EXPECT_EQ(expected, actual); | |
2742 | |
2743 // Case 2: Layer is outside the surface rect. | |
2744 layer_to_surface_transform.MakeIdentity(); | |
2745 layer_to_surface_transform.Translate(120.0, 120.0); | |
2746 actual = LayerTreeHostCommon::CalculateVisibleRect( | |
2747 target_surface_rect, layer_content_rect, layer_to_surface_transform); | |
2748 EXPECT_TRUE(actual.IsEmpty()); | |
2749 | |
2750 // Case 3: Layer is partially overlapping the surface rect. | |
2751 layer_to_surface_transform.MakeIdentity(); | |
2752 layer_to_surface_transform.Translate(80.0, 80.0); | |
2753 expected = gfx::Rect(0, 0, 20, 20); | |
2754 actual = LayerTreeHostCommon::CalculateVisibleRect( | |
2755 target_surface_rect, layer_content_rect, layer_to_surface_transform); | |
2756 EXPECT_EQ(expected, actual); | |
2757 } | |
2758 | |
2759 TEST_F(LayerTreeHostCommonTest, VisibleRectFor2DRotations) { | |
2760 // Test the calculateVisibleRect() function works correctly for rotations | |
2761 // about z-axis (i.e. 2D rotations). Remember that calculateVisibleRect() | |
2762 // should return the g in the layer's space. | |
2763 | |
2764 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100); | |
2765 gfx::Rect layer_content_rect = gfx::Rect(0, 0, 30, 30); | |
2766 gfx::Transform layer_to_surface_transform; | 2778 gfx::Transform layer_to_surface_transform; |
2767 | 2779 |
2768 // Case 1: Layer is contained within the surface. | 2780 // Case 1: Layer is contained within the surface. |
2769 layer_to_surface_transform.MakeIdentity(); | 2781 layer_to_surface_transform.MakeIdentity(); |
2770 layer_to_surface_transform.Translate(50.0, 50.0); | 2782 layer_to_surface_transform.Translate(50.0, 50.0); |
2771 layer_to_surface_transform.Rotate(45.0); | 2783 layer_to_surface_transform.Rotate(45.0); |
2772 gfx::Rect expected = gfx::Rect(0, 0, 30, 30); | 2784 gfx::Rect expected_visible_layer_rect = gfx::Rect(30, 30); |
2773 gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect( | 2785 gfx::Rect expected_drawable_content_rect = gfx::Rect(28, 50, 44, 43); |
2774 target_surface_rect, layer_content_rect, layer_to_surface_transform); | 2786 LayerImpl* drawing_layer = TestVisibleRectAndDrawableContentRect( |
2775 EXPECT_EQ(expected, actual); | 2787 target_surface_rect, layer_to_surface_transform, layer_content_rect); |
| 2788 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); |
| 2789 EXPECT_EQ(expected_drawable_content_rect, |
| 2790 drawing_layer->drawable_content_rect()); |
2776 | 2791 |
2777 // Case 2: Layer is outside the surface rect. | 2792 // Case 2: Layer is outside the surface rect. |
2778 layer_to_surface_transform.MakeIdentity(); | 2793 layer_to_surface_transform.MakeIdentity(); |
2779 layer_to_surface_transform.Translate(-50.0, 0.0); | 2794 layer_to_surface_transform.Translate(-50.0, 0.0); |
2780 layer_to_surface_transform.Rotate(45.0); | 2795 layer_to_surface_transform.Rotate(45.0); |
2781 actual = LayerTreeHostCommon::CalculateVisibleRect( | 2796 expected_visible_layer_rect = gfx::Rect(); |
2782 target_surface_rect, layer_content_rect, layer_to_surface_transform); | 2797 expected_drawable_content_rect = gfx::Rect(); |
2783 EXPECT_TRUE(actual.IsEmpty()); | 2798 drawing_layer = TestVisibleRectAndDrawableContentRect( |
| 2799 target_surface_rect, layer_to_surface_transform, layer_content_rect); |
| 2800 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); |
| 2801 EXPECT_EQ(expected_drawable_content_rect, |
| 2802 drawing_layer->drawable_content_rect()); |
2784 | 2803 |
2785 // Case 3: The layer is rotated about its top-left corner. In surface space, | 2804 // Case 3: The layer is rotated about its top-left corner. In surface space, |
2786 // the layer is oriented diagonally, with the left half outside of the render | 2805 // the layer is oriented diagonally, with the left half outside of the render |
2787 // surface. In this case, the g should still be the entire layer | 2806 // surface. In this case, the g should still be the entire layer |
2788 // (remember the g is computed in layer space); both the top-left | 2807 // (remember the g is computed in layer space); both the top-left |
2789 // and bottom-right corners of the layer are still visible. | 2808 // and bottom-right corners of the layer are still visible. |
2790 layer_to_surface_transform.MakeIdentity(); | 2809 layer_to_surface_transform.MakeIdentity(); |
2791 layer_to_surface_transform.Rotate(45.0); | 2810 layer_to_surface_transform.Rotate(45.0); |
2792 expected = gfx::Rect(0, 0, 30, 30); | 2811 expected_visible_layer_rect = gfx::Rect(30, 30); |
2793 actual = LayerTreeHostCommon::CalculateVisibleRect( | 2812 expected_drawable_content_rect = gfx::Rect(22, 43); |
2794 target_surface_rect, layer_content_rect, layer_to_surface_transform); | 2813 drawing_layer = TestVisibleRectAndDrawableContentRect( |
2795 EXPECT_EQ(expected, actual); | 2814 target_surface_rect, layer_to_surface_transform, layer_content_rect); |
| 2815 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); |
| 2816 EXPECT_EQ(expected_drawable_content_rect, |
| 2817 drawing_layer->drawable_content_rect()); |
2796 | 2818 |
2797 // Case 4: The layer is rotated about its top-left corner, and translated | 2819 // Case 4: The layer is rotated about its top-left corner, and translated |
2798 // upwards. In surface space, the layer is oriented diagonally, with only the | 2820 // upwards. In surface space, the layer is oriented diagonally, with only the |
2799 // top corner of the surface overlapping the layer. In layer space, the render | 2821 // top corner of the surface overlapping the layer. In layer space, the render |
2800 // surface overlaps the right side of the layer. The g should be | 2822 // surface overlaps the right side of the layer. The g should be |
2801 // the layer's right half. | 2823 // the layer's right half. |
2802 layer_to_surface_transform.MakeIdentity(); | 2824 layer_to_surface_transform.MakeIdentity(); |
2803 layer_to_surface_transform.Translate(0.0, -sqrt(2.0) * 15.0); | 2825 layer_to_surface_transform.Translate(0.0, -sqrt(2.0) * 15.0); |
2804 layer_to_surface_transform.Rotate(45.0); | 2826 layer_to_surface_transform.Rotate(45.0); |
2805 expected = gfx::Rect(15, 0, 15, 30); // Right half of layer bounds. | 2827 // Right half of layer bounds. |
2806 actual = LayerTreeHostCommon::CalculateVisibleRect( | 2828 expected_visible_layer_rect = gfx::Rect(15, 0, 15, 30); |
2807 target_surface_rect, layer_content_rect, layer_to_surface_transform); | 2829 expected_drawable_content_rect = gfx::Rect(22, 22); |
2808 EXPECT_EQ(expected, actual); | 2830 drawing_layer = TestVisibleRectAndDrawableContentRect( |
| 2831 target_surface_rect, layer_to_surface_transform, layer_content_rect); |
| 2832 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); |
| 2833 EXPECT_EQ(expected_drawable_content_rect, |
| 2834 drawing_layer->drawable_content_rect()); |
2809 } | 2835 } |
2810 | 2836 |
2811 TEST_F(LayerTreeHostCommonTest, VisibleRectFor3dOrthographicTransform) { | 2837 TEST_F(LayerTreeHostCommonDrawRectsTest, DrawRectsFor3dOrthographicTransform) { |
2812 // Test that the calculateVisibleRect() function works correctly for 3d | 2838 // Test visible layer rect and drawable content rect are calculated correctly |
2813 // transforms. | 2839 // for 3d transforms. |
2814 | 2840 |
2815 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100); | 2841 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100); |
2816 gfx::Rect layer_content_rect = gfx::Rect(0, 0, 100, 100); | 2842 gfx::Rect layer_content_rect = gfx::Rect(0, 0, 100, 100); |
2817 gfx::Transform layer_to_surface_transform; | 2843 gfx::Transform layer_to_surface_transform; |
2818 | 2844 |
2819 // Case 1: Orthographic projection of a layer rotated about y-axis by 45 | 2845 // Case 1: Orthographic projection of a layer rotated about y-axis by 45 |
2820 // degrees, should be fully contained in the render surface. | 2846 // degrees, should be fully contained in the render surface. |
| 2847 // 100 is the un-rotated layer width; divided by sqrt(2) is the rotated width. |
2821 layer_to_surface_transform.MakeIdentity(); | 2848 layer_to_surface_transform.MakeIdentity(); |
2822 layer_to_surface_transform.RotateAboutYAxis(45.0); | 2849 layer_to_surface_transform.RotateAboutYAxis(45.0); |
2823 gfx::Rect expected = gfx::Rect(0, 0, 100, 100); | 2850 gfx::Rect expected_visible_layer_rect = gfx::Rect(100, 100); |
2824 gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect( | 2851 gfx::Rect expected_drawable_content_rect = gfx::Rect(71, 100); |
2825 target_surface_rect, layer_content_rect, layer_to_surface_transform); | 2852 LayerImpl* drawing_layer = TestVisibleRectAndDrawableContentRect( |
2826 EXPECT_EQ(expected, actual); | 2853 target_surface_rect, layer_to_surface_transform, layer_content_rect); |
| 2854 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); |
| 2855 EXPECT_EQ(expected_drawable_content_rect, |
| 2856 drawing_layer->drawable_content_rect()); |
2827 | 2857 |
2828 // Case 2: Orthographic projection of a layer rotated about y-axis by 45 | 2858 // Case 2: Orthographic projection of a layer rotated about y-axis by 45 |
2829 // degrees, but shifted to the side so only the right-half the layer would be | 2859 // degrees, but shifted to the side so only the right-half the layer would be |
2830 // visible on the surface. | 2860 // visible on the surface. |
2831 // 100 is the un-rotated layer width; divided by sqrt(2) is the rotated width. | 2861 // 50 is the un-rotated layer width; divided by sqrt(2) is the rotated width. |
2832 SkMScalar half_width_of_rotated_layer = | 2862 SkMScalar half_width_of_rotated_layer = |
2833 SkDoubleToMScalar((100.0 / sqrt(2.0)) * 0.5); | 2863 SkDoubleToMScalar((100.0 / sqrt(2.0)) * 0.5); |
2834 layer_to_surface_transform.MakeIdentity(); | 2864 layer_to_surface_transform.MakeIdentity(); |
2835 layer_to_surface_transform.Translate(-half_width_of_rotated_layer, 0.0); | 2865 layer_to_surface_transform.Translate(-half_width_of_rotated_layer, 0.0); |
2836 layer_to_surface_transform.RotateAboutYAxis(45.0); // Rotates about the left | 2866 layer_to_surface_transform.RotateAboutYAxis(45.0); // Rotates about the left |
2837 // edge of the layer. | 2867 // edge of the layer. |
2838 expected = gfx::Rect(50, 0, 50, 100); // Tight half of the layer. | 2868 // Tight half of the layer. |
2839 actual = LayerTreeHostCommon::CalculateVisibleRect( | 2869 expected_visible_layer_rect = gfx::Rect(50, 0, 50, 100); |
2840 target_surface_rect, layer_content_rect, layer_to_surface_transform); | 2870 expected_drawable_content_rect = gfx::Rect(36, 100); |
2841 EXPECT_EQ(expected, actual); | 2871 drawing_layer = TestVisibleRectAndDrawableContentRect( |
| 2872 target_surface_rect, layer_to_surface_transform, layer_content_rect); |
| 2873 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); |
| 2874 EXPECT_EQ(expected_drawable_content_rect, |
| 2875 drawing_layer->drawable_content_rect()); |
2842 } | 2876 } |
2843 | 2877 |
2844 TEST_F(LayerTreeHostCommonTest, VisibleRectFor3dPerspectiveTransform) { | 2878 TEST_F(LayerTreeHostCommonDrawRectsTest, DrawRectsFor3dPerspectiveTransform) { |
2845 // Test the calculateVisibleRect() function works correctly when the layer has | 2879 // Test visible layer rect and drawable content rect are calculated correctly |
2846 // a perspective projection onto the target surface. | 2880 // when the layer has a perspective projection onto the target surface. |
2847 | 2881 |
2848 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100); | 2882 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100); |
2849 gfx::Rect layer_content_rect = gfx::Rect(-50, -50, 200, 200); | 2883 gfx::Rect layer_content_rect = gfx::Rect(-50, -50, 200, 200); |
2850 gfx::Transform layer_to_surface_transform; | 2884 gfx::Transform layer_to_surface_transform; |
2851 | 2885 |
2852 // Case 1: Even though the layer is twice as large as the surface, due to | 2886 // Case 1: Even though the layer is twice as large as the surface, due to |
2853 // perspective foreshortening, the layer will fit fully in the surface when | 2887 // perspective foreshortening, the layer will fit fully in the surface when |
2854 // its translated more than the perspective amount. | 2888 // its translated more than the perspective amount. |
2855 layer_to_surface_transform.MakeIdentity(); | 2889 layer_to_surface_transform.MakeIdentity(); |
2856 | 2890 |
2857 // The following sequence of transforms applies the perspective about the | 2891 // The following sequence of transforms applies the perspective about the |
2858 // center of the surface. | 2892 // center of the surface. |
2859 layer_to_surface_transform.Translate(50.0, 50.0); | 2893 layer_to_surface_transform.Translate(50.0, 50.0); |
2860 layer_to_surface_transform.ApplyPerspectiveDepth(9.0); | 2894 layer_to_surface_transform.ApplyPerspectiveDepth(9.0); |
2861 layer_to_surface_transform.Translate(-50.0, -50.0); | 2895 layer_to_surface_transform.Translate(-50.0, -50.0); |
2862 | 2896 |
2863 // This translate places the layer in front of the surface's projection plane. | 2897 // This translate places the layer in front of the surface's projection plane. |
2864 layer_to_surface_transform.Translate3d(0.0, 0.0, -27.0); | 2898 layer_to_surface_transform.Translate3d(0.0, 0.0, -27.0); |
2865 | 2899 |
2866 gfx::Rect expected = gfx::Rect(-50, -50, 200, 200); | 2900 // Layer position is (-50, -50), visible rect in layer space is layer bounds |
2867 gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect( | 2901 // offset by layer position. |
2868 target_surface_rect, layer_content_rect, layer_to_surface_transform); | 2902 gfx::Rect expected_visible_layer_rect = gfx::Rect(50, 50, 150, 150); |
2869 EXPECT_EQ(expected, actual); | 2903 gfx::Rect expected_drawable_content_rect = gfx::Rect(38, 38); |
| 2904 LayerImpl* drawing_layer = TestVisibleRectAndDrawableContentRect( |
| 2905 target_surface_rect, layer_to_surface_transform, layer_content_rect); |
| 2906 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); |
| 2907 EXPECT_EQ(expected_drawable_content_rect, |
| 2908 drawing_layer->drawable_content_rect()); |
2870 | 2909 |
2871 // Case 2: same projection as before, except that the layer is also translated | 2910 // Case 2: same projection as before, except that the layer is also translated |
2872 // to the side, so that only the right half of the layer should be visible. | 2911 // to the side, so that only the right half of the layer should be visible. |
2873 // | 2912 // |
2874 // Explanation of expected result: The perspective ratio is (z distance | 2913 // Explanation of expected result: The perspective ratio is (z distance |
2875 // between layer and camera origin) / (z distance between projection plane and | 2914 // between layer and camera origin) / (z distance between projection plane and |
2876 // camera origin) == ((-27 - 9) / 9) Then, by similar triangles, if we want to | 2915 // camera origin) == ((-27 - 9) / 9) Then, by similar triangles, if we want to |
2877 // move a layer by translating -50 units in projected surface units (so that | 2916 // move a layer by translating -25 units in projected surface units (so that |
2878 // only half of it is visible), then we would need to translate by (-36 / 9) * | 2917 // only half of it is visible), then we would need to translate by (-36 / 9) * |
2879 // -50 == -200 in the layer's units. | 2918 // -25 == -100 in the layer's units. |
2880 layer_to_surface_transform.Translate3d(-200.0, 0.0, 0.0); | 2919 layer_to_surface_transform.Translate3d(-100.0, 0.0, 0.0); |
2881 expected = gfx::Rect(gfx::Point(50, -50), | 2920 // Visible layer rect is moved by 100, and drawable content rect is in target |
2882 gfx::Size(100, 200)); // The right half of the layer's | 2921 // space and is moved by 25. |
2883 // bounding rect. | 2922 expected_visible_layer_rect = gfx::Rect(150, 50, 50, 150); |
2884 actual = LayerTreeHostCommon::CalculateVisibleRect( | 2923 expected_drawable_content_rect = gfx::Rect(13, 38); |
2885 target_surface_rect, layer_content_rect, layer_to_surface_transform); | 2924 drawing_layer = TestVisibleRectAndDrawableContentRect( |
2886 EXPECT_EQ(expected, actual); | 2925 target_surface_rect, layer_to_surface_transform, layer_content_rect); |
| 2926 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); |
| 2927 EXPECT_EQ(expected_drawable_content_rect, |
| 2928 drawing_layer->drawable_content_rect()); |
2887 } | 2929 } |
2888 | 2930 |
2889 TEST_F(LayerTreeHostCommonTest, | 2931 TEST_F(LayerTreeHostCommonDrawRectsTest, |
2890 VisibleRectFor3dOrthographicIsNotClippedBehindSurface) { | 2932 DrawRectsFor3dOrthographicIsNotClippedBehindSurface) { |
2891 // There is currently no explicit concept of an orthographic projection plane | 2933 // There is currently no explicit concept of an orthographic projection plane |
2892 // in our code (nor in the CSS spec to my knowledge). Therefore, layers that | 2934 // in our code (nor in the CSS spec to my knowledge). Therefore, layers that |
2893 // are technically behind the surface in an orthographic world should not be | 2935 // are technically behind the surface in an orthographic world should not be |
2894 // clipped when they are flattened to the surface. | 2936 // clipped when they are flattened to the surface. |
2895 | 2937 |
2896 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100); | 2938 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100); |
2897 gfx::Rect layer_content_rect = gfx::Rect(0, 0, 100, 100); | 2939 gfx::Rect layer_content_rect = gfx::Rect(0, 0, 100, 100); |
2898 gfx::Transform layer_to_surface_transform; | 2940 gfx::Transform layer_to_surface_transform; |
2899 | 2941 |
2900 // This sequence of transforms effectively rotates the layer about the y-axis | 2942 // This sequence of transforms effectively rotates the layer about the y-axis |
2901 // at the center of the layer. | 2943 // at the center of the layer. |
2902 layer_to_surface_transform.MakeIdentity(); | 2944 layer_to_surface_transform.MakeIdentity(); |
2903 layer_to_surface_transform.Translate(50.0, 0.0); | 2945 layer_to_surface_transform.Translate(50.0, 0.0); |
2904 layer_to_surface_transform.RotateAboutYAxis(45.0); | 2946 layer_to_surface_transform.RotateAboutYAxis(45.0); |
2905 layer_to_surface_transform.Translate(-50.0, 0.0); | 2947 layer_to_surface_transform.Translate(-50.0, 0.0); |
2906 | 2948 |
2907 gfx::Rect expected = gfx::Rect(0, 0, 100, 100); | 2949 // Layer is rotated about Y Axis, and its width is 100/sqrt(2) in surface |
2908 gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect( | 2950 // space. |
2909 target_surface_rect, layer_content_rect, layer_to_surface_transform); | 2951 gfx::Rect expected_visible_layer_rect = gfx::Rect(100, 100); |
2910 EXPECT_EQ(expected, actual); | 2952 gfx::Rect expected_drawable_content_rect = gfx::Rect(14, 0, 72, 100); |
| 2953 LayerImpl* drawing_layer = TestVisibleRectAndDrawableContentRect( |
| 2954 target_surface_rect, layer_to_surface_transform, layer_content_rect); |
| 2955 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); |
| 2956 EXPECT_EQ(expected_drawable_content_rect, |
| 2957 drawing_layer->drawable_content_rect()); |
2911 } | 2958 } |
2912 | 2959 |
2913 TEST_F(LayerTreeHostCommonTest, VisibleRectFor3dPerspectiveWhenClippedByW) { | 2960 TEST_F(LayerTreeHostCommonDrawRectsTest, |
2914 // Test the calculateVisibleRect() function works correctly when projecting a | 2961 DrawRectsFor3dPerspectiveWhenClippedByW) { |
2915 // surface onto a layer, but the layer is partially behind the camera (not | 2962 // Test visible layer rect and drawable content rect are calculated correctly |
2916 // just behind the projection plane). In this case, the cartesian coordinates | 2963 // when projecting a surface onto a layer, but the layer is partially behind |
2917 // may seem to be valid, but actually they are not. The visible rect needs to | 2964 // the camera (not just behind the projection plane). In this case, the |
2918 // be properly clipped by the w = 0 plane in homogeneous coordinates before | 2965 // cartesian coordinates may seem to be valid, but actually they are not. The |
2919 // converting to cartesian coordinates. | 2966 // visible rect needs to be properly clipped by the w = 0 plane in homogeneous |
| 2967 // coordinates before converting to cartesian coordinates. The drawable |
| 2968 // content rect would be entire surface rect because layer is rotated at the |
| 2969 // camera position. |
2920 | 2970 |
2921 gfx::Rect target_surface_rect = gfx::Rect(-50, -50, 100, 100); | 2971 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 200, 200); |
2922 gfx::Rect layer_content_rect = gfx::Rect(-10, -1, 20, 2); | 2972 gfx::Rect layer_content_rect = gfx::Rect(0, 0, 20, 2); |
2923 gfx::Transform layer_to_surface_transform; | 2973 gfx::Transform layer_to_surface_transform; |
2924 | 2974 |
2925 // The layer is positioned so that the right half of the layer should be in | 2975 // The layer is positioned so that the right half of the layer should be in |
2926 // front of the camera, while the other half is behind the surface's | 2976 // front of the camera, while the other half is behind the surface's |
2927 // projection plane. The following sequence of transforms applies the | 2977 // projection plane. The following sequence of transforms applies the |
2928 // perspective and rotation about the center of the layer. | 2978 // perspective and rotation about the center of the layer. |
2929 layer_to_surface_transform.MakeIdentity(); | 2979 layer_to_surface_transform.MakeIdentity(); |
2930 layer_to_surface_transform.ApplyPerspectiveDepth(1.0); | 2980 layer_to_surface_transform.ApplyPerspectiveDepth(1.0); |
2931 layer_to_surface_transform.Translate3d(-2.0, 0.0, 1.0); | 2981 layer_to_surface_transform.Translate3d(10.0, 0.0, 1.0); |
2932 layer_to_surface_transform.RotateAboutYAxis(45.0); | 2982 layer_to_surface_transform.RotateAboutYAxis(-45.0); |
| 2983 layer_to_surface_transform.Translate(-10, -1); |
2933 | 2984 |
2934 // Sanity check that this transform does indeed cause w < 0 when applying the | 2985 // Sanity check that this transform does indeed cause w < 0 when applying the |
2935 // transform, otherwise this code is not testing the intended scenario. | 2986 // transform, otherwise this code is not testing the intended scenario. |
2936 bool clipped; | 2987 bool clipped; |
2937 MathUtil::MapQuad(layer_to_surface_transform, | 2988 MathUtil::MapQuad(layer_to_surface_transform, |
2938 gfx::QuadF(gfx::RectF(layer_content_rect)), | 2989 gfx::QuadF(gfx::RectF(layer_content_rect)), |
2939 &clipped); | 2990 &clipped); |
2940 ASSERT_TRUE(clipped); | 2991 ASSERT_TRUE(clipped); |
2941 | 2992 |
2942 int expected_x_position = 0; | 2993 gfx::Rect expected_visible_layer_rect = gfx::Rect(0, 1, 10, 1); |
2943 int expected_width = 10; | 2994 gfx::Rect expected_drawable_content_rect = target_surface_rect; |
2944 gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect( | 2995 LayerImpl* drawing_layer = TestVisibleRectAndDrawableContentRect( |
2945 target_surface_rect, layer_content_rect, layer_to_surface_transform); | 2996 target_surface_rect, layer_to_surface_transform, layer_content_rect); |
2946 EXPECT_EQ(expected_x_position, actual.x()); | 2997 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); |
2947 EXPECT_EQ(expected_width, actual.width()); | 2998 EXPECT_EQ(expected_drawable_content_rect, |
| 2999 drawing_layer->drawable_content_rect()); |
2948 } | 3000 } |
2949 | 3001 |
2950 TEST_F(LayerTreeHostCommonTest, VisibleRectForPerspectiveUnprojection) { | 3002 TEST_F(LayerTreeHostCommonDrawRectsTest, DrawRectsForPerspectiveUnprojection) { |
2951 // To determine visible rect in layer space, there needs to be an | 3003 // To determine visible rect in layer space, there needs to be an |
2952 // un-projection from surface space to layer space. When the original | 3004 // un-projection from surface space to layer space. When the original |
2953 // transform was a perspective projection that was clipped, it returns a rect | 3005 // transform was a perspective projection that was clipped, it returns a rect |
2954 // that encloses the clipped bounds. Un-projecting this new rect may require | 3006 // that encloses the clipped bounds. Un-projecting this new rect may require |
2955 // clipping again. | 3007 // clipping again. |
2956 | 3008 |
2957 // This sequence of transforms causes one corner of the layer to protrude | 3009 // This sequence of transforms causes one corner of the layer to protrude |
2958 // across the w = 0 plane, and should be clipped. | 3010 // across the w = 0 plane, and should be clipped. |
2959 gfx::Rect target_surface_rect = gfx::Rect(-50, -50, 100, 100); | 3011 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 150, 150); |
2960 gfx::Rect layer_content_rect = gfx::Rect(-10, -10, 20, 20); | 3012 gfx::Rect layer_content_rect = gfx::Rect(0, 0, 20, 20); |
2961 gfx::Transform layer_to_surface_transform; | 3013 gfx::Transform layer_to_surface_transform; |
2962 layer_to_surface_transform.MakeIdentity(); | 3014 layer_to_surface_transform.MakeIdentity(); |
| 3015 layer_to_surface_transform.Translate(10, 10); |
2963 layer_to_surface_transform.ApplyPerspectiveDepth(1.0); | 3016 layer_to_surface_transform.ApplyPerspectiveDepth(1.0); |
2964 layer_to_surface_transform.Translate3d(0.0, 0.0, -5.0); | 3017 layer_to_surface_transform.Translate3d(0.0, 0.0, -5.0); |
2965 layer_to_surface_transform.RotateAboutYAxis(45.0); | 3018 layer_to_surface_transform.RotateAboutYAxis(45.0); |
2966 layer_to_surface_transform.RotateAboutXAxis(80.0); | 3019 layer_to_surface_transform.RotateAboutXAxis(80.0); |
| 3020 layer_to_surface_transform.Translate(-10, -10); |
2967 | 3021 |
2968 // Sanity check that un-projection does indeed cause w < 0, otherwise this | 3022 // Sanity check that un-projection does indeed cause w < 0, otherwise this |
2969 // code is not testing the intended scenario. | 3023 // code is not testing the intended scenario. |
2970 bool clipped; | 3024 bool clipped; |
2971 gfx::RectF clipped_rect = MathUtil::MapClippedRect( | 3025 gfx::RectF clipped_rect = MathUtil::MapClippedRect( |
2972 layer_to_surface_transform, gfx::RectF(layer_content_rect)); | 3026 layer_to_surface_transform, gfx::RectF(layer_content_rect)); |
2973 MathUtil::ProjectQuad( | 3027 MathUtil::ProjectQuad( |
2974 Inverse(layer_to_surface_transform), gfx::QuadF(clipped_rect), &clipped); | 3028 Inverse(layer_to_surface_transform), gfx::QuadF(clipped_rect), &clipped); |
2975 ASSERT_TRUE(clipped); | 3029 ASSERT_TRUE(clipped); |
2976 | 3030 |
2977 // Only the corner of the layer is not visible on the surface because of being | 3031 // Only the corner of the layer is not visible on the surface because of being |
2978 // clipped. But, the net result of rounding visible region to an axis-aligned | 3032 // clipped. But, the net result of rounding visible region to an axis-aligned |
2979 // rect is that the entire layer should still be considered visible. | 3033 // rect is that the entire layer should still be considered visible. |
2980 gfx::Rect expected = gfx::Rect(-10, -10, 20, 20); | 3034 gfx::Rect expected_visible_layer_rect = layer_content_rect; |
2981 gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect( | 3035 gfx::Rect expected_drawable_content_rect = target_surface_rect; |
2982 target_surface_rect, layer_content_rect, layer_to_surface_transform); | 3036 LayerImpl* drawing_layer = TestVisibleRectAndDrawableContentRect( |
2983 EXPECT_EQ(expected, actual); | 3037 target_surface_rect, layer_to_surface_transform, layer_content_rect); |
| 3038 EXPECT_EQ(expected_visible_layer_rect, drawing_layer->visible_layer_rect()); |
| 3039 EXPECT_EQ(expected_drawable_content_rect, |
| 3040 drawing_layer->drawable_content_rect()); |
2984 } | 3041 } |
2985 | 3042 |
2986 TEST_F(LayerTreeHostCommonTest, | 3043 TEST_F(LayerTreeHostCommonTest, |
2987 VisibleRectsForPositionedRootLayerClippedByViewport) { | 3044 VisibleRectsForPositionedRootLayerClippedByViewport) { |
2988 LayerImpl* root = root_layer(); | 3045 LayerImpl* root = root_layer(); |
2989 root->SetDrawsContent(true); | 3046 root->SetDrawsContent(true); |
2990 | 3047 |
2991 gfx::Transform identity_matrix; | 3048 gfx::Transform identity_matrix; |
2992 // Root layer is positioned at (60, 70). The default device viewport size | 3049 // Root layer is positioned at (60, 70). The default device viewport size |
2993 // is (0, 0, 100x100) in target space. So the root layer's visible rect | 3050 // is (0, 0, 100x100) in target space. So the root layer's visible rect |
(...skipping 7024 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10018 EXPECT_EQ(scroll_child6.id, grand_child10->scroll_tree_index()); | 10075 EXPECT_EQ(scroll_child6.id, grand_child10->scroll_tree_index()); |
10019 EXPECT_EQ(scroll_root1.id, parent3->scroll_tree_index()); | 10076 EXPECT_EQ(scroll_root1.id, parent3->scroll_tree_index()); |
10020 EXPECT_EQ(scroll_child7.id, child8->scroll_tree_index()); | 10077 EXPECT_EQ(scroll_child7.id, child8->scroll_tree_index()); |
10021 EXPECT_EQ(scroll_root1.id, parent4->scroll_tree_index()); | 10078 EXPECT_EQ(scroll_root1.id, parent4->scroll_tree_index()); |
10022 EXPECT_EQ(scroll_root1.id, child9->scroll_tree_index()); | 10079 EXPECT_EQ(scroll_root1.id, child9->scroll_tree_index()); |
10023 EXPECT_EQ(scroll_root1.id, grand_child12->scroll_tree_index()); | 10080 EXPECT_EQ(scroll_root1.id, grand_child12->scroll_tree_index()); |
10024 } | 10081 } |
10025 | 10082 |
10026 } // namespace | 10083 } // namespace |
10027 } // namespace cc | 10084 } // namespace cc |
OLD | NEW |