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 "cc/animation/layer_animation_controller.h" | 7 #include "cc/animation/layer_animation_controller.h" |
8 #include "cc/base/math_util.h" | 8 #include "cc/base/math_util.h" |
9 #include "cc/base/thread.h" | 9 #include "cc/base/thread.h" |
10 #include "cc/layers/content_layer.h" | 10 #include "cc/layers/content_layer.h" |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 } | 141 } |
142 | 142 |
143 template <class LayerType> | 143 template <class LayerType> |
144 void ExecuteCalculateDrawProperties(LayerType* root_layer, | 144 void ExecuteCalculateDrawProperties(LayerType* root_layer, |
145 float device_scale_factor, | 145 float device_scale_factor, |
146 float page_scale_factor) { | 146 float page_scale_factor) { |
147 ExecuteCalculateDrawProperties( | 147 ExecuteCalculateDrawProperties( |
148 root_layer, device_scale_factor, page_scale_factor, false); | 148 root_layer, device_scale_factor, page_scale_factor, false); |
149 } | 149 } |
150 | 150 |
151 scoped_ptr<LayerImpl> CreateTreeForFixedPositionTests( | |
152 LayerTreeHostImpl* host_impl) { | |
153 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl->active_tree(), 1); | |
154 scoped_ptr<LayerImpl> child = LayerImpl::Create(host_impl->active_tree(), 2); | |
155 scoped_ptr<LayerImpl> grand_child = | |
156 LayerImpl::Create(host_impl->active_tree(), 3); | |
157 scoped_ptr<LayerImpl> great_grand_child = | |
158 LayerImpl::Create(host_impl->active_tree(), 4); | |
159 | |
160 gfx::Transform IdentityMatrix; | |
161 gfx::PointF anchor; | |
162 gfx::PointF position; | |
163 gfx::Size bounds(100, 100); | |
164 SetLayerPropertiesForTesting(root.get(), | |
165 IdentityMatrix, | |
166 IdentityMatrix, | |
167 anchor, | |
168 position, | |
169 bounds, | |
170 false); | |
171 SetLayerPropertiesForTesting(child.get(), | |
172 IdentityMatrix, | |
173 IdentityMatrix, | |
174 anchor, | |
175 position, | |
176 bounds, | |
177 false); | |
178 SetLayerPropertiesForTesting(grand_child.get(), | |
179 IdentityMatrix, | |
180 IdentityMatrix, | |
181 anchor, | |
182 position, | |
183 bounds, | |
184 false); | |
185 SetLayerPropertiesForTesting(great_grand_child.get(), | |
186 IdentityMatrix, | |
187 IdentityMatrix, | |
188 anchor, | |
189 position, | |
190 bounds, | |
191 false); | |
192 | |
193 grand_child->AddChild(great_grand_child.Pass()); | |
194 child->AddChild(grand_child.Pass()); | |
195 root->AddChild(child.Pass()); | |
196 | |
197 return root.Pass(); | |
198 } | |
199 | |
200 class LayerWithForcedDrawsContent : public Layer { | 151 class LayerWithForcedDrawsContent : public Layer { |
201 public: | 152 public: |
202 LayerWithForcedDrawsContent() : Layer() {} | 153 LayerWithForcedDrawsContent() : Layer() {} |
203 | 154 |
204 virtual bool DrawsContent() const OVERRIDE; | 155 virtual bool DrawsContent() const OVERRIDE; |
205 | 156 |
206 private: | 157 private: |
207 virtual ~LayerWithForcedDrawsContent() {} | 158 virtual ~LayerWithForcedDrawsContent() {} |
208 }; | 159 }; |
209 | 160 |
(...skipping 1467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1677 1.f, | 1628 1.f, |
1678 1.f, | 1629 1.f, |
1679 dummy_max_texture_size, | 1630 dummy_max_texture_size, |
1680 false, | 1631 false, |
1681 &render_surface_layer_list); | 1632 &render_surface_layer_list); |
1682 EXPECT_TRUE(parent->render_surface()); | 1633 EXPECT_TRUE(parent->render_surface()); |
1683 EXPECT_FALSE(render_surface1->render_surface()); | 1634 EXPECT_FALSE(render_surface1->render_surface()); |
1684 EXPECT_EQ(1U, render_surface_layer_list.size()); | 1635 EXPECT_EQ(1U, render_surface_layer_list.size()); |
1685 } | 1636 } |
1686 | 1637 |
1687 TEST(LayerTreeHostCommonTest, | |
1688 ScrollCompensationForFixedPositionLayerWithDirectContainer) { | |
1689 // This test checks for correct scroll compensation when the fixed-position | |
1690 // container is the direct parent of the fixed-position layer. | |
1691 FakeImplProxy proxy; | |
1692 FakeLayerTreeHostImpl host_impl(&proxy); | |
1693 scoped_ptr<LayerImpl> root = CreateTreeForFixedPositionTests(&host_impl); | |
1694 LayerImpl* child = root->children()[0]; | |
1695 LayerImpl* grand_child = child->children()[0]; | |
1696 | |
1697 child->SetIsContainerForFixedPositionLayers(true); | |
1698 grand_child->SetFixedToContainerLayer(true); | |
1699 | |
1700 // Case 1: scroll delta of 0, 0 | |
1701 child->SetScrollDelta(gfx::Vector2d(0, 0)); | |
1702 ExecuteCalculateDrawProperties(root.get()); | |
1703 | |
1704 gfx::Transform expected_child_transform; | |
1705 gfx::Transform expected_grand_child_transform = expected_child_transform; | |
1706 | |
1707 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
1708 child->draw_transform()); | |
1709 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
1710 grand_child->draw_transform()); | |
1711 | |
1712 // Case 2: scroll delta of 10, 10 | |
1713 child->SetScrollDelta(gfx::Vector2d(10, 10)); | |
1714 ExecuteCalculateDrawProperties(root.get()); | |
1715 | |
1716 // Here the child is affected by scroll delta, but the fixed position | |
1717 // grand_child should not be affected. | |
1718 expected_child_transform.MakeIdentity(); | |
1719 expected_child_transform.Translate(-10.0, -10.0); | |
1720 | |
1721 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
1722 child->draw_transform()); | |
1723 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
1724 grand_child->draw_transform()); | |
1725 } | |
1726 | |
1727 TEST(LayerTreeHostCommonTest, | |
1728 ScrollCompensationForFixedPositionLayerWithTransformedDirectContainer) { | |
1729 // This test checks for correct scroll compensation when the fixed-position | |
1730 // container is the direct parent of the fixed-position layer, but that | |
1731 // container is transformed. In this case, the fixed position element | |
1732 // inherits the container's transform, but the scroll delta that has to be | |
1733 // undone should not be affected by that transform. | |
1734 // | |
1735 // gfx::Transforms are in general non-commutative; using something like a | |
1736 // non-uniform scale helps to verify that translations and non-uniform scales | |
1737 // are applied in the correct order. | |
1738 FakeImplProxy proxy; | |
1739 FakeLayerTreeHostImpl host_impl(&proxy); | |
1740 scoped_ptr<LayerImpl> root = CreateTreeForFixedPositionTests(&host_impl); | |
1741 LayerImpl* child = root->children()[0]; | |
1742 LayerImpl* grand_child = child->children()[0]; | |
1743 | |
1744 // This scale will cause child and grand_child to be effectively 200 x 800 | |
1745 // with respect to the render target. | |
1746 gfx::Transform non_uniform_scale; | |
1747 non_uniform_scale.Scale(2.0, 8.0); | |
1748 child->SetTransform(non_uniform_scale); | |
1749 | |
1750 child->SetIsContainerForFixedPositionLayers(true); | |
1751 grand_child->SetFixedToContainerLayer(true); | |
1752 | |
1753 // Case 1: scroll delta of 0, 0 | |
1754 child->SetScrollDelta(gfx::Vector2d(0, 0)); | |
1755 ExecuteCalculateDrawProperties(root.get()); | |
1756 | |
1757 gfx::Transform expected_child_transform; | |
1758 expected_child_transform.PreconcatTransform(non_uniform_scale); | |
1759 | |
1760 gfx::Transform expected_grand_child_transform = expected_child_transform; | |
1761 | |
1762 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
1763 child->draw_transform()); | |
1764 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
1765 grand_child->draw_transform()); | |
1766 | |
1767 // Case 2: scroll delta of 10, 20 | |
1768 child->SetScrollDelta(gfx::Vector2d(10, 20)); | |
1769 ExecuteCalculateDrawProperties(root.get()); | |
1770 | |
1771 // The child should be affected by scroll delta, but the fixed position | |
1772 // grand_child should not be affected. | |
1773 expected_child_transform.MakeIdentity(); | |
1774 expected_child_transform.Translate(-10.0, -20.0); // scroll delta | |
1775 expected_child_transform.PreconcatTransform(non_uniform_scale); | |
1776 | |
1777 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
1778 child->draw_transform()); | |
1779 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
1780 grand_child->draw_transform()); | |
1781 } | |
1782 | |
1783 TEST(LayerTreeHostCommonTest, | |
1784 ScrollCompensationForFixedPositionLayerWithDistantContainer) { | |
1785 // This test checks for correct scroll compensation when the fixed-position | |
1786 // container is NOT the direct parent of the fixed-position layer. | |
1787 FakeImplProxy proxy; | |
1788 FakeLayerTreeHostImpl host_impl(&proxy); | |
1789 scoped_ptr<LayerImpl> root = CreateTreeForFixedPositionTests(&host_impl); | |
1790 LayerImpl* child = root->children()[0]; | |
1791 LayerImpl* grand_child = child->children()[0]; | |
1792 LayerImpl* great_grand_child = grand_child->children()[0]; | |
1793 | |
1794 child->SetIsContainerForFixedPositionLayers(true); | |
1795 grand_child->SetPosition(gfx::PointF(8.f, 6.f)); | |
1796 great_grand_child->SetFixedToContainerLayer(true); | |
1797 | |
1798 // Case 1: scroll delta of 0, 0 | |
1799 child->SetScrollDelta(gfx::Vector2d(0, 0)); | |
1800 ExecuteCalculateDrawProperties(root.get()); | |
1801 | |
1802 gfx::Transform expected_child_transform; | |
1803 gfx::Transform expected_grand_child_transform; | |
1804 expected_grand_child_transform.Translate(8.0, 6.0); | |
1805 | |
1806 gfx::Transform expected_great_grand_child_transform = | |
1807 expected_grand_child_transform; | |
1808 | |
1809 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
1810 child->draw_transform()); | |
1811 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
1812 grand_child->draw_transform()); | |
1813 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_great_grand_child_transform, | |
1814 great_grand_child->draw_transform()); | |
1815 | |
1816 // Case 2: scroll delta of 10, 10 | |
1817 child->SetScrollDelta(gfx::Vector2d(10, 10)); | |
1818 ExecuteCalculateDrawProperties(root.get()); | |
1819 | |
1820 // Here the child and grand_child are affected by scroll delta, but the fixed | |
1821 // position great_grand_child should not be affected. | |
1822 expected_child_transform.MakeIdentity(); | |
1823 expected_child_transform.Translate(-10.0, -10.0); | |
1824 expected_grand_child_transform.MakeIdentity(); | |
1825 expected_grand_child_transform.Translate(-2.0, -4.0); | |
1826 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
1827 child->draw_transform()); | |
1828 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
1829 grand_child->draw_transform()); | |
1830 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_great_grand_child_transform, | |
1831 great_grand_child->draw_transform()); | |
1832 } | |
1833 | |
1834 TEST(LayerTreeHostCommonTest, | |
1835 ScrollCompensationForFixedPositionLayerWithDistantContainerAndTransforms) { | |
1836 // This test checks for correct scroll compensation when the fixed-position | |
1837 // container is NOT the direct parent of the fixed-position layer, and the | |
1838 // hierarchy has various transforms that have to be processed in the correct | |
1839 // order. | |
1840 FakeImplProxy proxy; | |
1841 FakeLayerTreeHostImpl host_impl(&proxy); | |
1842 scoped_ptr<LayerImpl> root = CreateTreeForFixedPositionTests(&host_impl); | |
1843 LayerImpl* child = root->children()[0]; | |
1844 LayerImpl* grand_child = child->children()[0]; | |
1845 LayerImpl* great_grand_child = grand_child->children()[0]; | |
1846 | |
1847 gfx::Transform rotation_about_z; | |
1848 rotation_about_z.RotateAboutZAxis(90.0); | |
1849 | |
1850 child->SetIsContainerForFixedPositionLayers(true); | |
1851 child->SetTransform(rotation_about_z); | |
1852 grand_child->SetPosition(gfx::PointF(8.f, 6.f)); | |
1853 grand_child->SetTransform(rotation_about_z); | |
1854 // great_grand_child is positioned upside-down with respect to the render | |
1855 // target. | |
1856 great_grand_child->SetFixedToContainerLayer(true); | |
1857 | |
1858 // Case 1: scroll delta of 0, 0 | |
1859 child->SetScrollDelta(gfx::Vector2d(0, 0)); | |
1860 ExecuteCalculateDrawProperties(root.get()); | |
1861 | |
1862 gfx::Transform expected_child_transform; | |
1863 expected_child_transform.PreconcatTransform(rotation_about_z); | |
1864 | |
1865 gfx::Transform expected_grand_child_transform; | |
1866 expected_grand_child_transform.PreconcatTransform( | |
1867 rotation_about_z); // child's local transform is inherited | |
1868 // translation because of position occurs before layer's local transform. | |
1869 expected_grand_child_transform.Translate(8.0, 6.0); | |
1870 expected_grand_child_transform.PreconcatTransform( | |
1871 rotation_about_z); // grand_child's local transform | |
1872 | |
1873 gfx::Transform expected_great_grand_child_transform = | |
1874 expected_grand_child_transform; | |
1875 | |
1876 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
1877 child->draw_transform()); | |
1878 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
1879 grand_child->draw_transform()); | |
1880 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_great_grand_child_transform, | |
1881 great_grand_child->draw_transform()); | |
1882 | |
1883 // Case 2: scroll delta of 10, 20 | |
1884 child->SetScrollDelta(gfx::Vector2d(10, 20)); | |
1885 ExecuteCalculateDrawProperties(root.get()); | |
1886 | |
1887 // Here the child and grand_child are affected by scroll delta, but the fixed | |
1888 // position great_grand_child should not be affected. | |
1889 expected_child_transform.MakeIdentity(); | |
1890 expected_child_transform.Translate(-10.0, -20.0); // scroll delta | |
1891 expected_child_transform.PreconcatTransform(rotation_about_z); | |
1892 | |
1893 expected_grand_child_transform.MakeIdentity(); | |
1894 expected_grand_child_transform.Translate( | |
1895 -10.0, -20.0); // child's scroll delta is inherited | |
1896 expected_grand_child_transform.PreconcatTransform( | |
1897 rotation_about_z); // child's local transform is inherited | |
1898 // translation because of position occurs before layer's local transform. | |
1899 expected_grand_child_transform.Translate(8.0, 6.0); | |
1900 expected_grand_child_transform.PreconcatTransform( | |
1901 rotation_about_z); // grand_child's local transform | |
1902 | |
1903 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
1904 child->draw_transform()); | |
1905 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
1906 grand_child->draw_transform()); | |
1907 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_great_grand_child_transform, | |
1908 great_grand_child->draw_transform()); | |
1909 } | |
1910 | |
1911 TEST(LayerTreeHostCommonTest, | |
1912 ScrollCompensationForFixedPositionLayerWithMultipleScrollDeltas) { | |
1913 // This test checks for correct scroll compensation when the fixed-position | |
1914 // container has multiple ancestors that have nonzero scroll delta before | |
1915 // reaching the space where the layer is fixed. In this test, each scroll | |
1916 // delta occurs in a different space because of each layer's local transform. | |
1917 // This test checks for correct scroll compensation when the fixed-position | |
1918 // container is NOT the direct parent of the fixed-position layer, and the | |
1919 // hierarchy has various transforms that have to be processed in the correct | |
1920 // order. | |
1921 FakeImplProxy proxy; | |
1922 FakeLayerTreeHostImpl host_impl(&proxy); | |
1923 scoped_ptr<LayerImpl> root = CreateTreeForFixedPositionTests(&host_impl); | |
1924 LayerImpl* child = root->children()[0]; | |
1925 LayerImpl* grand_child = child->children()[0]; | |
1926 LayerImpl* great_grand_child = grand_child->children()[0]; | |
1927 | |
1928 gfx::Transform rotation_about_z; | |
1929 rotation_about_z.RotateAboutZAxis(90.0); | |
1930 | |
1931 child->SetIsContainerForFixedPositionLayers(true); | |
1932 child->SetTransform(rotation_about_z); | |
1933 grand_child->SetPosition(gfx::PointF(8.f, 6.f)); | |
1934 grand_child->SetTransform(rotation_about_z); | |
1935 // great_grand_child is positioned upside-down with respect to the render | |
1936 // target. | |
1937 great_grand_child->SetFixedToContainerLayer(true); | |
1938 | |
1939 // Case 1: scroll delta of 0, 0 | |
1940 child->SetScrollDelta(gfx::Vector2d(0, 0)); | |
1941 ExecuteCalculateDrawProperties(root.get()); | |
1942 | |
1943 gfx::Transform expected_child_transform; | |
1944 expected_child_transform.PreconcatTransform(rotation_about_z); | |
1945 | |
1946 gfx::Transform expected_grand_child_transform; | |
1947 expected_grand_child_transform.PreconcatTransform( | |
1948 rotation_about_z); // child's local transform is inherited | |
1949 // translation because of position occurs before layer's local transform. | |
1950 expected_grand_child_transform.Translate(8.0, 6.0); | |
1951 expected_grand_child_transform.PreconcatTransform( | |
1952 rotation_about_z); // grand_child's local transform | |
1953 | |
1954 gfx::Transform expected_great_grand_child_transform = | |
1955 expected_grand_child_transform; | |
1956 | |
1957 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
1958 child->draw_transform()); | |
1959 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
1960 grand_child->draw_transform()); | |
1961 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_great_grand_child_transform, | |
1962 great_grand_child->draw_transform()); | |
1963 | |
1964 // Case 2: scroll delta of 10, 20 | |
1965 child->SetScrollDelta(gfx::Vector2d(10, 0)); | |
1966 grand_child->SetScrollDelta(gfx::Vector2d(5, 0)); | |
1967 ExecuteCalculateDrawProperties(root.get()); | |
1968 | |
1969 // Here the child and grand_child are affected by scroll delta, but the fixed | |
1970 // position great_grand_child should not be affected. | |
1971 expected_child_transform.MakeIdentity(); | |
1972 expected_child_transform.Translate(-10.0, 0.0); // scroll delta | |
1973 expected_child_transform.PreconcatTransform(rotation_about_z); | |
1974 | |
1975 expected_grand_child_transform.MakeIdentity(); | |
1976 expected_grand_child_transform.Translate( | |
1977 -10.0, 0.0); // child's scroll delta is inherited | |
1978 expected_grand_child_transform.PreconcatTransform( | |
1979 rotation_about_z); // child's local transform is inherited | |
1980 expected_grand_child_transform.Translate(-5.0, | |
1981 0.0); // grand_child's scroll delta | |
1982 // translation because of position occurs before layer's local transform. | |
1983 expected_grand_child_transform.Translate(8.0, 6.0); | |
1984 expected_grand_child_transform.PreconcatTransform( | |
1985 rotation_about_z); // grand_child's local transform | |
1986 | |
1987 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
1988 child->draw_transform()); | |
1989 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
1990 grand_child->draw_transform()); | |
1991 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_great_grand_child_transform, | |
1992 great_grand_child->draw_transform()); | |
1993 } | |
1994 | |
1995 TEST(LayerTreeHostCommonTest, | |
1996 ScrollCompensationForFixedPositionWithIntermediateSurfaceAndTransforms) { | |
1997 // This test checks for correct scroll compensation when the fixed-position | |
1998 // container contributes to a different render surface than the fixed-position | |
1999 // layer. In this case, the surface draw transforms also have to be accounted | |
2000 // for when checking the scroll delta. | |
2001 FakeImplProxy proxy; | |
2002 FakeLayerTreeHostImpl host_impl(&proxy); | |
2003 scoped_ptr<LayerImpl> root = CreateTreeForFixedPositionTests(&host_impl); | |
2004 LayerImpl* child = root->children()[0]; | |
2005 LayerImpl* grand_child = child->children()[0]; | |
2006 LayerImpl* great_grand_child = grand_child->children()[0]; | |
2007 | |
2008 child->SetIsContainerForFixedPositionLayers(true); | |
2009 grand_child->SetPosition(gfx::PointF(8.f, 6.f)); | |
2010 grand_child->SetForceRenderSurface(true); | |
2011 great_grand_child->SetFixedToContainerLayer(true); | |
2012 great_grand_child->SetDrawsContent(true); | |
2013 | |
2014 gfx::Transform rotation_about_z; | |
2015 rotation_about_z.RotateAboutZAxis(90.0); | |
2016 grand_child->SetTransform(rotation_about_z); | |
2017 | |
2018 // Case 1: scroll delta of 0, 0 | |
2019 child->SetScrollDelta(gfx::Vector2d(0, 0)); | |
2020 ExecuteCalculateDrawProperties(root.get()); | |
2021 | |
2022 gfx::Transform expected_child_transform; | |
2023 gfx::Transform expected_surface_draw_transform; | |
2024 expected_surface_draw_transform.Translate(8.0, 6.0); | |
2025 expected_surface_draw_transform.PreconcatTransform(rotation_about_z); | |
2026 gfx::Transform expected_grand_child_transform; | |
2027 gfx::Transform expected_great_grand_child_transform; | |
2028 ASSERT_TRUE(grand_child->render_surface()); | |
2029 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
2030 child->draw_transform()); | |
2031 EXPECT_TRANSFORMATION_MATRIX_EQ( | |
2032 expected_surface_draw_transform, | |
2033 grand_child->render_surface()->draw_transform()); | |
2034 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
2035 grand_child->draw_transform()); | |
2036 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_great_grand_child_transform, | |
2037 great_grand_child->draw_transform()); | |
2038 | |
2039 // Case 2: scroll delta of 10, 30 | |
2040 child->SetScrollDelta(gfx::Vector2d(10, 30)); | |
2041 ExecuteCalculateDrawProperties(root.get()); | |
2042 | |
2043 // Here the grand_child remains unchanged, because it scrolls along with the | |
2044 // render surface, and the translation is actually in the render surface. But, | |
2045 // the fixed position great_grand_child is more awkward: its actually being | |
2046 // drawn with respect to the render surface, but it needs to remain fixed with | |
2047 // resepct to a container beyond that surface. So, the net result is that, | |
2048 // unlike previous tests where the fixed position layer's transform remains | |
2049 // unchanged, here the fixed position layer's transform explicitly contains | |
2050 // the translation that cancels out the scroll. | |
2051 expected_child_transform.MakeIdentity(); | |
2052 expected_child_transform.Translate(-10.0, -30.0); // scroll delta | |
2053 | |
2054 expected_surface_draw_transform.MakeIdentity(); | |
2055 expected_surface_draw_transform.Translate(-10.0, -30.0); // scroll delta | |
2056 expected_surface_draw_transform.Translate(8.0, 6.0); | |
2057 expected_surface_draw_transform.PreconcatTransform(rotation_about_z); | |
2058 | |
2059 // The rotation and its inverse are needed to place the scroll delta | |
2060 // compensation in the correct space. This test will fail if the | |
2061 // rotation/inverse are backwards, too, so it requires perfect order of | |
2062 // operations. | |
2063 expected_great_grand_child_transform.MakeIdentity(); | |
2064 expected_great_grand_child_transform.PreconcatTransform( | |
2065 Inverse(rotation_about_z)); | |
2066 // explicit canceling out the scroll delta that gets embedded in the fixed | |
2067 // position layer's surface. | |
2068 expected_great_grand_child_transform.Translate(10.0, 30.0); | |
2069 expected_great_grand_child_transform.PreconcatTransform(rotation_about_z); | |
2070 | |
2071 ASSERT_TRUE(grand_child->render_surface()); | |
2072 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
2073 child->draw_transform()); | |
2074 EXPECT_TRANSFORMATION_MATRIX_EQ( | |
2075 expected_surface_draw_transform, | |
2076 grand_child->render_surface()->draw_transform()); | |
2077 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
2078 grand_child->draw_transform()); | |
2079 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_great_grand_child_transform, | |
2080 great_grand_child->draw_transform()); | |
2081 } | |
2082 | |
2083 TEST(LayerTreeHostCommonTest, | |
2084 ScrollCompensationForFixedPositionLayerWithMultipleIntermediateSurfaces) { | |
2085 // This test checks for correct scroll compensation when the fixed-position | |
2086 // container contributes to a different render surface than the fixed-position | |
2087 // layer, with additional render surfaces in-between. This checks that the | |
2088 // conversion to ancestor surfaces is accumulated properly in the final matrix | |
2089 // transform. | |
2090 FakeImplProxy proxy; | |
2091 FakeLayerTreeHostImpl host_impl(&proxy); | |
2092 scoped_ptr<LayerImpl> root = CreateTreeForFixedPositionTests(&host_impl); | |
2093 LayerImpl* child = root->children()[0]; | |
2094 LayerImpl* grand_child = child->children()[0]; | |
2095 LayerImpl* great_grand_child = grand_child->children()[0]; | |
2096 | |
2097 // Add one more layer to the test tree for this scenario. | |
2098 { | |
2099 gfx::Transform identity; | |
2100 scoped_ptr<LayerImpl> fixed_position_child = | |
2101 LayerImpl::Create(host_impl.active_tree(), 5); | |
2102 SetLayerPropertiesForTesting(fixed_position_child.get(), | |
2103 identity, | |
2104 identity, | |
2105 gfx::PointF(), | |
2106 gfx::PointF(), | |
2107 gfx::Size(100, 100), | |
2108 false); | |
2109 great_grand_child->AddChild(fixed_position_child.Pass()); | |
2110 } | |
2111 LayerImpl* fixed_position_child = great_grand_child->children()[0]; | |
2112 | |
2113 // Actually set up the scenario here. | |
2114 child->SetIsContainerForFixedPositionLayers(true); | |
2115 grand_child->SetPosition(gfx::PointF(8.f, 6.f)); | |
2116 grand_child->SetForceRenderSurface(true); | |
2117 great_grand_child->SetPosition(gfx::PointF(40.f, 60.f)); | |
2118 great_grand_child->SetForceRenderSurface(true); | |
2119 fixed_position_child->SetFixedToContainerLayer(true); | |
2120 fixed_position_child->SetDrawsContent(true); | |
2121 | |
2122 // The additional rotations, which are non-commutative with translations, help | |
2123 // to verify that we have correct order-of-operations in the final scroll | |
2124 // compensation. Note that rotating about the center of the layer ensures we | |
2125 // do not accidentally clip away layers that we want to test. | |
2126 gfx::Transform rotation_about_z; | |
2127 rotation_about_z.Translate(50.0, 50.0); | |
2128 rotation_about_z.RotateAboutZAxis(90.0); | |
2129 rotation_about_z.Translate(-50.0, -50.0); | |
2130 grand_child->SetTransform(rotation_about_z); | |
2131 great_grand_child->SetTransform(rotation_about_z); | |
2132 | |
2133 // Case 1: scroll delta of 0, 0 | |
2134 child->SetScrollDelta(gfx::Vector2d(0, 0)); | |
2135 ExecuteCalculateDrawProperties(root.get()); | |
2136 | |
2137 gfx::Transform expected_child_transform; | |
2138 | |
2139 gfx::Transform expected_grand_child_surface_draw_transform; | |
2140 expected_grand_child_surface_draw_transform.Translate(8.0, 6.0); | |
2141 expected_grand_child_surface_draw_transform.PreconcatTransform( | |
2142 rotation_about_z); | |
2143 | |
2144 gfx::Transform expected_grand_child_transform; | |
2145 | |
2146 gfx::Transform expected_great_grand_child_surface_draw_transform; | |
2147 expected_great_grand_child_surface_draw_transform.Translate(40.0, 60.0); | |
2148 expected_great_grand_child_surface_draw_transform.PreconcatTransform( | |
2149 rotation_about_z); | |
2150 | |
2151 gfx::Transform expected_great_grand_child_transform; | |
2152 | |
2153 gfx::Transform expected_fixed_position_child_transform; | |
2154 | |
2155 ASSERT_TRUE(grand_child->render_surface()); | |
2156 ASSERT_TRUE(great_grand_child->render_surface()); | |
2157 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
2158 child->draw_transform()); | |
2159 EXPECT_TRANSFORMATION_MATRIX_EQ( | |
2160 expected_grand_child_surface_draw_transform, | |
2161 grand_child->render_surface()->draw_transform()); | |
2162 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
2163 grand_child->draw_transform()); | |
2164 EXPECT_TRANSFORMATION_MATRIX_EQ( | |
2165 expected_great_grand_child_surface_draw_transform, | |
2166 great_grand_child->render_surface()->draw_transform()); | |
2167 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_great_grand_child_transform, | |
2168 great_grand_child->draw_transform()); | |
2169 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_fixed_position_child_transform, | |
2170 fixed_position_child->draw_transform()); | |
2171 | |
2172 // Case 2: scroll delta of 10, 30 | |
2173 child->SetScrollDelta(gfx::Vector2d(10, 30)); | |
2174 ExecuteCalculateDrawProperties(root.get()); | |
2175 | |
2176 expected_child_transform.MakeIdentity(); | |
2177 expected_child_transform.Translate(-10.0, -30.0); // scroll delta | |
2178 | |
2179 expected_grand_child_surface_draw_transform.MakeIdentity(); | |
2180 expected_grand_child_surface_draw_transform.Translate(-10.0, | |
2181 -30.0); // scroll delta | |
2182 expected_grand_child_surface_draw_transform.Translate(8.0, 6.0); | |
2183 expected_grand_child_surface_draw_transform.PreconcatTransform( | |
2184 rotation_about_z); | |
2185 | |
2186 // grand_child, great_grand_child, and great_grand_child's surface are not | |
2187 // expected to change, since they are all not fixed, and they are all drawn | |
2188 // with respect to grand_child's surface that already has the scroll delta | |
2189 // accounted for. | |
2190 | |
2191 // But the great-great grandchild, "fixed_position_child", should have a | |
2192 // transform that explicitly cancels out the scroll delta. The expected | |
2193 // transform is: compound_draw_transform.Inverse() * translate(positive scroll | |
2194 // delta) * compound_origin_transform from great_grand_childSurface's origin | |
2195 // to the root surface. | |
2196 gfx::Transform compound_draw_transform; | |
2197 compound_draw_transform.Translate(8.0, | |
2198 6.0); // origin translation of grand_child | |
2199 compound_draw_transform.PreconcatTransform( | |
2200 rotation_about_z); // rotation of grand_child | |
2201 compound_draw_transform.Translate( | |
2202 40.0, 60.0); // origin translation of great_grand_child | |
2203 compound_draw_transform.PreconcatTransform( | |
2204 rotation_about_z); // rotation of great_grand_child | |
2205 | |
2206 expected_fixed_position_child_transform.MakeIdentity(); | |
2207 expected_fixed_position_child_transform.PreconcatTransform( | |
2208 Inverse(compound_draw_transform)); | |
2209 // explicit canceling out the scroll delta that gets embedded in the fixed | |
2210 // position layer's surface. | |
2211 expected_fixed_position_child_transform.Translate(10.0, 30.0); | |
2212 expected_fixed_position_child_transform.PreconcatTransform( | |
2213 compound_draw_transform); | |
2214 | |
2215 ASSERT_TRUE(grand_child->render_surface()); | |
2216 ASSERT_TRUE(great_grand_child->render_surface()); | |
2217 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
2218 child->draw_transform()); | |
2219 EXPECT_TRANSFORMATION_MATRIX_EQ( | |
2220 expected_grand_child_surface_draw_transform, | |
2221 grand_child->render_surface()->draw_transform()); | |
2222 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
2223 grand_child->draw_transform()); | |
2224 EXPECT_TRANSFORMATION_MATRIX_EQ( | |
2225 expected_great_grand_child_surface_draw_transform, | |
2226 great_grand_child->render_surface()->draw_transform()); | |
2227 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_great_grand_child_transform, | |
2228 great_grand_child->draw_transform()); | |
2229 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_fixed_position_child_transform, | |
2230 fixed_position_child->draw_transform()); | |
2231 } | |
2232 | |
2233 TEST(LayerTreeHostCommonTest, | |
2234 ScrollCompensationForFixedPositionLayerWithContainerLayerThatHasSurface) { | |
2235 // This test checks for correct scroll compensation when the fixed-position | |
2236 // container itself has a render surface. In this case, the container layer | |
2237 // should be treated like a layer that contributes to a render target, and | |
2238 // that render target is completely irrelevant; it should not affect the | |
2239 // scroll compensation. | |
2240 FakeImplProxy proxy; | |
2241 FakeLayerTreeHostImpl host_impl(&proxy); | |
2242 scoped_ptr<LayerImpl> root = CreateTreeForFixedPositionTests(&host_impl); | |
2243 LayerImpl* child = root->children()[0]; | |
2244 LayerImpl* grand_child = child->children()[0]; | |
2245 | |
2246 child->SetIsContainerForFixedPositionLayers(true); | |
2247 child->SetForceRenderSurface(true); | |
2248 grand_child->SetFixedToContainerLayer(true); | |
2249 grand_child->SetDrawsContent(true); | |
2250 | |
2251 // Case 1: scroll delta of 0, 0 | |
2252 child->SetScrollDelta(gfx::Vector2d(0, 0)); | |
2253 ExecuteCalculateDrawProperties(root.get()); | |
2254 | |
2255 gfx::Transform expected_surface_draw_transform; | |
2256 expected_surface_draw_transform.Translate(0.0, 0.0); | |
2257 gfx::Transform expected_child_transform; | |
2258 gfx::Transform expected_grand_child_transform; | |
2259 ASSERT_TRUE(child->render_surface()); | |
2260 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_surface_draw_transform, | |
2261 child->render_surface()->draw_transform()); | |
2262 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
2263 child->draw_transform()); | |
2264 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
2265 grand_child->draw_transform()); | |
2266 | |
2267 // Case 2: scroll delta of 10, 10 | |
2268 child->SetScrollDelta(gfx::Vector2d(10, 10)); | |
2269 ExecuteCalculateDrawProperties(root.get()); | |
2270 | |
2271 // The surface is translated by scroll delta, the child transform doesn't | |
2272 // change because it scrolls along with the surface, but the fixed position | |
2273 // grand_child needs to compensate for the scroll translation. | |
2274 expected_surface_draw_transform.MakeIdentity(); | |
2275 expected_surface_draw_transform.Translate(-10.0, -10.0); | |
2276 expected_grand_child_transform.MakeIdentity(); | |
2277 expected_grand_child_transform.Translate(10.0, 10.0); | |
2278 | |
2279 ASSERT_TRUE(child->render_surface()); | |
2280 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_surface_draw_transform, | |
2281 child->render_surface()->draw_transform()); | |
2282 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
2283 child->draw_transform()); | |
2284 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
2285 grand_child->draw_transform()); | |
2286 } | |
2287 | |
2288 TEST(LayerTreeHostCommonTest, | |
2289 ScrollCompensationForFixedPositionLayerThatIsAlsoFixedPositionContainer) { | |
2290 // This test checks the scenario where a fixed-position layer also happens to | |
2291 // be a container itself for a descendant fixed position layer. In particular, | |
2292 // the layer should not accidentally be fixed to itself. | |
2293 FakeImplProxy proxy; | |
2294 FakeLayerTreeHostImpl host_impl(&proxy); | |
2295 scoped_ptr<LayerImpl> root = CreateTreeForFixedPositionTests(&host_impl); | |
2296 LayerImpl* child = root->children()[0]; | |
2297 LayerImpl* grand_child = child->children()[0]; | |
2298 | |
2299 child->SetIsContainerForFixedPositionLayers(true); | |
2300 grand_child->SetFixedToContainerLayer(true); | |
2301 | |
2302 // This should not confuse the grand_child. If correct, the grand_child would | |
2303 // still be considered fixed to its container (i.e. "child"). | |
2304 grand_child->SetIsContainerForFixedPositionLayers(true); | |
2305 | |
2306 // Case 1: scroll delta of 0, 0 | |
2307 child->SetScrollDelta(gfx::Vector2d(0, 0)); | |
2308 ExecuteCalculateDrawProperties(root.get()); | |
2309 | |
2310 gfx::Transform expected_child_transform; | |
2311 gfx::Transform expected_grand_child_transform; | |
2312 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
2313 child->draw_transform()); | |
2314 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
2315 grand_child->draw_transform()); | |
2316 | |
2317 // Case 2: scroll delta of 10, 10 | |
2318 child->SetScrollDelta(gfx::Vector2d(10, 10)); | |
2319 ExecuteCalculateDrawProperties(root.get()); | |
2320 | |
2321 // Here the child is affected by scroll delta, but the fixed position | |
2322 // grand_child should not be affected. | |
2323 expected_child_transform.MakeIdentity(); | |
2324 expected_child_transform.Translate(-10.0, -10.0); | |
2325 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform, | |
2326 child->draw_transform()); | |
2327 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
2328 grand_child->draw_transform()); | |
2329 } | |
2330 | |
2331 TEST(LayerTreeHostCommonTest, | |
2332 ScrollCompensationForFixedPositionLayerThatHasNoContainer) { | |
2333 // This test checks scroll compensation when a fixed-position layer does not | |
2334 // find any ancestor that is a "containerForFixedPositionLayers". In this | |
2335 // situation, the layer should be fixed to the viewport -- not the root_layer, | |
2336 // which may have transforms of its own. | |
2337 FakeImplProxy proxy; | |
2338 FakeLayerTreeHostImpl host_impl(&proxy); | |
2339 scoped_ptr<LayerImpl> root = CreateTreeForFixedPositionTests(&host_impl); | |
2340 LayerImpl* child = root->children()[0]; | |
2341 LayerImpl* grand_child = child->children()[0]; | |
2342 | |
2343 gfx::Transform rotation_by_z; | |
2344 rotation_by_z.RotateAboutZAxis(90.0); | |
2345 | |
2346 root->SetTransform(rotation_by_z); | |
2347 grand_child->SetFixedToContainerLayer(true); | |
2348 | |
2349 // Case 1: root scroll delta of 0, 0 | |
2350 root->SetScrollDelta(gfx::Vector2d(0, 0)); | |
2351 ExecuteCalculateDrawProperties(root.get()); | |
2352 | |
2353 gfx::Transform identity_matrix; | |
2354 | |
2355 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, child->draw_transform()); | |
2356 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, | |
2357 grand_child->draw_transform()); | |
2358 | |
2359 // Case 2: root scroll delta of 10, 10 | |
2360 root->SetScrollDelta(gfx::Vector2d(10, 20)); | |
2361 ExecuteCalculateDrawProperties(root.get()); | |
2362 | |
2363 // The child is affected by scroll delta, but it is already implcitly | |
2364 // accounted for by the child's target surface (i.e. the root render surface). | |
2365 // The grand_child is not affected by the scroll delta, so its draw transform | |
2366 // needs to explicitly inverse-compensate for the scroll that's embedded in | |
2367 // the target surface. | |
2368 gfx::Transform expected_grand_child_transform; | |
2369 expected_grand_child_transform.PreconcatTransform(Inverse(rotation_by_z)); | |
2370 // explicit cancelling out the scroll delta that gets embedded in the fixed | |
2371 // position layer's surface. | |
2372 expected_grand_child_transform.Translate(10.0, 20.0); | |
2373 expected_grand_child_transform.PreconcatTransform(rotation_by_z); | |
2374 | |
2375 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, child->draw_transform()); | |
2376 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform, | |
2377 grand_child->draw_transform()); | |
2378 } | |
2379 | |
2380 TEST(LayerTreeHostCommonTest, ClipRectCullsRenderSurfaces) { | 1638 TEST(LayerTreeHostCommonTest, ClipRectCullsRenderSurfaces) { |
2381 // The entire subtree of layers that are outside the clip rect should be | 1639 // The entire subtree of layers that are outside the clip rect should be |
2382 // culled away, and should not affect the render_surface_layer_list. | 1640 // culled away, and should not affect the render_surface_layer_list. |
2383 // | 1641 // |
2384 // The test tree is set up as follows: | 1642 // The test tree is set up as follows: |
2385 // - all layers except the leaf_nodes are forced to be a new render surface | 1643 // - all layers except the leaf_nodes are forced to be a new render surface |
2386 // that have something to draw. | 1644 // that have something to draw. |
2387 // - parent is a large container layer. | 1645 // - parent is a large container layer. |
2388 // - child has masksToBounds=true to cause clipping. | 1646 // - child has masksToBounds=true to cause clipping. |
2389 // - grand_child is positioned outside of the child's bounds | 1647 // - grand_child is positioned outside of the child's bounds |
(...skipping 5757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8147 EXPECT_EQ(can_use_lcd_text_, child_->can_use_lcd_text()); | 7405 EXPECT_EQ(can_use_lcd_text_, child_->can_use_lcd_text()); |
8148 EXPECT_EQ(can_use_lcd_text_, grand_child_->can_use_lcd_text()); | 7406 EXPECT_EQ(can_use_lcd_text_, grand_child_->can_use_lcd_text()); |
8149 } | 7407 } |
8150 | 7408 |
8151 INSTANTIATE_TEST_CASE_P(LayerTreeHostCommonTest, | 7409 INSTANTIATE_TEST_CASE_P(LayerTreeHostCommonTest, |
8152 LCDTextTest, | 7410 LCDTextTest, |
8153 testing::Combine(testing::Bool(), testing::Bool())); | 7411 testing::Combine(testing::Bool(), testing::Bool())); |
8154 | 7412 |
8155 } // namespace | 7413 } // namespace |
8156 } // namespace cc | 7414 } // namespace cc |
OLD | NEW |