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