Index: cc/layers/picture_layer_impl_unittest.cc |
diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc |
index 61ac6bb99b8dd4d47431757071940e6e5532e8dc..93c7b80e5991af140a99fbe7d68041e58d57a7bf 100644 |
--- a/cc/layers/picture_layer_impl_unittest.cc |
+++ b/cc/layers/picture_layer_impl_unittest.cc |
@@ -925,8 +925,12 @@ TEST_F(PictureLayerImplTest, CleanUpTilings) { |
float page_scale = 1.f; |
SetupDefaultTrees(layer_bounds); |
- EXPECT_EQ(2u, active_layer()->tilings()->num_tilings()); |
- EXPECT_EQ(1.f, active_layer()->HighResTiling()->contents_scale()); |
+ active_layer()->SetHasWillChangeTransformHint(true); |
+ EXPECT_FLOAT_EQ(2u, active_layer()->tilings()->num_tilings()); |
+ EXPECT_FLOAT_EQ(1.f, |
+ active_layer()->tilings()->tiling_at(0)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.f * low_res_factor, |
+ active_layer()->tilings()->tiling_at(1)->contents_scale()); |
// Ensure UpdateTiles won't remove any tilings. Note this is unrelated to |
// |used_tilings| variable, and it's here only to ensure that active_layer() |
@@ -936,7 +940,11 @@ TEST_F(PictureLayerImplTest, CleanUpTilings) { |
// We only have ideal tilings, so they aren't removed. |
used_tilings.clear(); |
active_layer()->CleanUpTilingsOnActiveLayer(used_tilings); |
- EXPECT_EQ(2u, active_layer()->tilings()->num_tilings()); |
+ EXPECT_FLOAT_EQ(2u, active_layer()->tilings()->num_tilings()); |
+ EXPECT_FLOAT_EQ(1.f, |
+ active_layer()->tilings()->tiling_at(0)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.f * low_res_factor, |
+ active_layer()->tilings()->tiling_at(1)->contents_scale()); |
host_impl()->PinchGestureBegin(); |
@@ -944,12 +952,20 @@ TEST_F(PictureLayerImplTest, CleanUpTilings) { |
scale = 1.5f; |
page_scale = 1.5f; |
SetContentsScaleOnBothLayers(scale, 1.f, page_scale, 1.f, 0.f, false); |
- EXPECT_EQ(2u, active_layer()->tilings()->num_tilings()); |
+ EXPECT_FLOAT_EQ(2u, active_layer()->tilings()->num_tilings()); |
+ EXPECT_FLOAT_EQ(1.f, |
+ active_layer()->tilings()->tiling_at(0)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.f * low_res_factor, |
+ active_layer()->tilings()->tiling_at(1)->contents_scale()); |
// The tilings are still our target scale, so they aren't removed. |
used_tilings.clear(); |
active_layer()->CleanUpTilingsOnActiveLayer(used_tilings); |
ASSERT_EQ(2u, active_layer()->tilings()->num_tilings()); |
+ EXPECT_FLOAT_EQ(1.f, |
+ active_layer()->tilings()->tiling_at(0)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.f * low_res_factor, |
+ active_layer()->tilings()->tiling_at(1)->contents_scale()); |
host_impl()->PinchGestureEnd(); |
@@ -958,8 +974,12 @@ TEST_F(PictureLayerImplTest, CleanUpTilings) { |
page_scale = 1.2f; |
SetContentsScaleOnBothLayers(1.2f, 1.f, page_scale, 1.f, 0.f, false); |
ASSERT_EQ(4u, active_layer()->tilings()->num_tilings()); |
+ EXPECT_FLOAT_EQ(1.2f, |
+ active_layer()->tilings()->tiling_at(0)->contents_scale()); |
EXPECT_FLOAT_EQ(1.f, |
active_layer()->tilings()->tiling_at(1)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.2f * low_res_factor, |
+ active_layer()->tilings()->tiling_at(2)->contents_scale()); |
EXPECT_FLOAT_EQ(1.f * low_res_factor, |
active_layer()->tilings()->tiling_at(3)->contents_scale()); |
@@ -972,6 +992,14 @@ TEST_F(PictureLayerImplTest, CleanUpTilings) { |
used_tilings.push_back(active_layer()->tilings()->tiling_at(3)); |
active_layer()->CleanUpTilingsOnActiveLayer(used_tilings); |
ASSERT_EQ(4u, active_layer()->tilings()->num_tilings()); |
+ EXPECT_FLOAT_EQ(1.2f, |
+ active_layer()->tilings()->tiling_at(0)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.f, |
+ active_layer()->tilings()->tiling_at(1)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.2f * low_res_factor, |
+ active_layer()->tilings()->tiling_at(2)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.f * low_res_factor, |
+ active_layer()->tilings()->tiling_at(3)->contents_scale()); |
// Now move the ideal scale to 0.5. Our target stays 1.2. |
SetContentsScaleOnBothLayers(0.5f, 1.f, page_scale, 1.f, 0.f, false); |
@@ -981,6 +1009,12 @@ TEST_F(PictureLayerImplTest, CleanUpTilings) { |
used_tilings.clear(); |
active_layer()->CleanUpTilingsOnActiveLayer(used_tilings); |
ASSERT_EQ(3u, active_layer()->tilings()->num_tilings()); |
+ EXPECT_FLOAT_EQ(1.2f, |
+ active_layer()->tilings()->tiling_at(0)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.f, |
+ active_layer()->tilings()->tiling_at(1)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.2f * low_res_factor, |
+ active_layer()->tilings()->tiling_at(2)->contents_scale()); |
// Now move the ideal scale to 1.0. Our target stays 1.2. |
SetContentsScaleOnBothLayers(1.f, 1.f, page_scale, 1.f, 0.f, false); |
@@ -990,6 +1024,12 @@ TEST_F(PictureLayerImplTest, CleanUpTilings) { |
used_tilings.clear(); |
active_layer()->CleanUpTilingsOnActiveLayer(used_tilings); |
ASSERT_EQ(3u, active_layer()->tilings()->num_tilings()); |
+ EXPECT_FLOAT_EQ(1.2f, |
+ active_layer()->tilings()->tiling_at(0)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.f, |
+ active_layer()->tilings()->tiling_at(1)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.2f * low_res_factor, |
+ active_layer()->tilings()->tiling_at(2)->contents_scale()); |
// Now move the ideal scale to 1.1 on the active layer. Our target stays 1.2. |
SetupDrawPropertiesAndUpdateTiles(active_layer(), 1.1f, 1.f, page_scale, 1.f, |
@@ -1000,6 +1040,12 @@ TEST_F(PictureLayerImplTest, CleanUpTilings) { |
used_tilings.clear(); |
active_layer()->CleanUpTilingsOnActiveLayer(used_tilings); |
ASSERT_EQ(3u, active_layer()->tilings()->num_tilings()); |
+ EXPECT_FLOAT_EQ(1.2f, |
+ active_layer()->tilings()->tiling_at(0)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.f, |
+ active_layer()->tilings()->tiling_at(1)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.2f * low_res_factor, |
+ active_layer()->tilings()->tiling_at(2)->contents_scale()); |
// Move the ideal scale on the pending layer to 1.1 as well. Our target stays |
// 1.2 still. |
@@ -1013,12 +1059,22 @@ TEST_F(PictureLayerImplTest, CleanUpTilings) { |
used_tilings.push_back(active_layer()->tilings()->tiling_at(1)); |
active_layer()->CleanUpTilingsOnActiveLayer(used_tilings); |
ASSERT_EQ(3u, active_layer()->tilings()->num_tilings()); |
+ EXPECT_FLOAT_EQ(1.2f, |
+ active_layer()->tilings()->tiling_at(0)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.f, |
+ active_layer()->tilings()->tiling_at(1)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.2f * low_res_factor, |
+ active_layer()->tilings()->tiling_at(2)->contents_scale()); |
// If we remove it from our used tilings set, it is outside the range to keep |
// so it is deleted. |
used_tilings.clear(); |
active_layer()->CleanUpTilingsOnActiveLayer(used_tilings); |
ASSERT_EQ(2u, active_layer()->tilings()->num_tilings()); |
+ EXPECT_FLOAT_EQ(1.2f, |
+ active_layer()->tilings()->tiling_at(0)->contents_scale()); |
+ EXPECT_FLOAT_EQ(1.2 * low_res_factor, |
+ active_layer()->tilings()->tiling_at(1)->contents_scale()); |
} |
TEST_F(PictureLayerImplTest, DontAddLowResDuringAnimation) { |
@@ -1829,6 +1885,7 @@ TEST_F(PictureLayerImplTest, |
SetInitialDeviceScaleFactor(2.f); |
SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, Region()); |
+ active_layer()->SetHasWillChangeTransformHint(true); |
// One ideal tile exists, this will get used when drawing. |
std::vector<Tile*> ideal_tiles; |
@@ -3119,22 +3176,53 @@ TEST_F(PictureLayerImplTest, RasterScaleChangeWithoutAnimation) { |
EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f); |
// Changing the source scale without being in an animation will cause |
- // the layer to reset its source scale to 1.f. |
+ // the layer to change scale. |
contents_scale = 3.f; |
SetContentsScaleOnBothLayers(contents_scale, device_scale, page_scale, |
maximum_animation_scale, |
starting_animation_scale, animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f); |
+ EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 3.f); |
+ |
+ contents_scale = 0.5f; |
+ |
+ SetContentsScaleOnBothLayers(contents_scale, device_scale, page_scale, |
+ maximum_animation_scale, |
+ starting_animation_scale, animating_transform); |
+ EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 0.5f); |
+ |
+ // However, if the layer has a will-change property, then the raster scale |
+ // will get fixed at the last value. |
+ active_layer()->SetHasWillChangeTransformHint(true); |
+ pending_layer()->SetHasWillChangeTransformHint(true); |
+ |
+ contents_scale = 3.f; |
+ |
+ SetContentsScaleOnBothLayers(contents_scale, device_scale, page_scale, |
+ maximum_animation_scale, |
+ starting_animation_scale, animating_transform); |
+ EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 0.5f); |
// Further changes to the source scale will no longer be reflected in the |
// contents scale. |
- contents_scale = 0.5f; |
+ contents_scale = 1.f; |
SetContentsScaleOnBothLayers(contents_scale, device_scale, page_scale, |
maximum_animation_scale, |
starting_animation_scale, animating_transform); |
- EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f); |
+ EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 0.5f); |
+ |
+ // Disabling the will-change hint will once again make the raster scale update |
+ // with the ideal scale. |
+ active_layer()->SetHasWillChangeTransformHint(false); |
+ pending_layer()->SetHasWillChangeTransformHint(false); |
+ |
+ contents_scale = 3.f; |
+ |
+ SetContentsScaleOnBothLayers(contents_scale, device_scale, page_scale, |
+ maximum_animation_scale, |
+ starting_animation_scale, animating_transform); |
+ EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 3.f); |
} |
TEST_F(PictureLayerImplTest, LowResReadyToDrawNotEnoughToActivate) { |
@@ -3385,6 +3473,7 @@ TEST_F(NoLowResPictureLayerImplTest, CleanUpTilings) { |
float page_scale = 3.2f; |
float scale = 1.f; |
+ active_layer()->SetHasWillChangeTransformHint(true); |
ResetTilingsAndRasterScales(); |
SetContentsScaleOnBothLayers(scale, device_scale, page_scale, 1.f, 0.f, |