| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/resources/picture_layer_tiling_set.h" | 5 #include "cc/resources/picture_layer_tiling_set.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "cc/resources/resource_provider.h" | 10 #include "cc/resources/resource_provider.h" |
| 11 #include "cc/test/fake_output_surface.h" | 11 #include "cc/test/fake_output_surface.h" |
| 12 #include "cc/test/fake_output_surface_client.h" | 12 #include "cc/test/fake_output_surface_client.h" |
| 13 #include "cc/test/fake_picture_layer_tiling_client.h" | 13 #include "cc/test/fake_picture_layer_tiling_client.h" |
| 14 #include "cc/test/fake_picture_pile_impl.h" |
| 14 #include "cc/test/test_shared_bitmap_manager.h" | 15 #include "cc/test/test_shared_bitmap_manager.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 16 #include "ui/gfx/geometry/size_conversions.h" | 17 #include "ui/gfx/geometry/size_conversions.h" |
| 17 | 18 |
| 18 namespace cc { | 19 namespace cc { |
| 19 namespace { | 20 namespace { |
| 20 | 21 |
| 21 scoped_ptr<PictureLayerTilingSet> CreateTilingSet( | 22 scoped_ptr<PictureLayerTilingSet> CreateTilingSet( |
| 22 PictureLayerTilingClient* client) { | 23 PictureLayerTilingClient* client) { |
| 23 LayerTreeSettings defaults; | 24 LayerTreeSettings defaults; |
| 24 return PictureLayerTilingSet::Create( | 25 return PictureLayerTilingSet::Create( |
| 25 client, defaults.max_tiles_for_interest_area, | 26 client, defaults.max_tiles_for_interest_area, |
| 26 defaults.skewport_target_time_in_seconds, | 27 defaults.skewport_target_time_in_seconds, |
| 27 defaults.skewport_extrapolation_limit_in_content_pixels); | 28 defaults.skewport_extrapolation_limit_in_content_pixels); |
| 28 } | 29 } |
| 29 | 30 |
| 30 TEST(PictureLayerTilingSetTest, NoResources) { | 31 TEST(PictureLayerTilingSetTest, NoResources) { |
| 31 FakePictureLayerTilingClient client; | 32 FakePictureLayerTilingClient client; |
| 32 gfx::Size layer_bounds(1000, 800); | 33 gfx::Size layer_bounds(1000, 800); |
| 33 auto set = CreateTilingSet(&client); | 34 scoped_ptr<PictureLayerTilingSet> set = CreateTilingSet(&client); |
| 34 client.SetTileSize(gfx::Size(256, 256)); | 35 client.SetTileSize(gfx::Size(256, 256)); |
| 35 | 36 |
| 36 set->AddTiling(1.0, layer_bounds); | 37 scoped_refptr<FakePicturePileImpl> pile = |
| 37 set->AddTiling(1.5, layer_bounds); | 38 FakePicturePileImpl::CreateEmptyPileWithDefaultTileSize(layer_bounds); |
| 38 set->AddTiling(2.0, layer_bounds); | 39 |
| 40 set->AddTiling(1.0, pile); |
| 41 set->AddTiling(1.5, pile); |
| 42 set->AddTiling(2.0, pile); |
| 39 | 43 |
| 40 float contents_scale = 2.0; | 44 float contents_scale = 2.0; |
| 41 gfx::Size content_bounds( | 45 gfx::Size content_bounds( |
| 42 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, contents_scale))); | 46 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, contents_scale))); |
| 43 gfx::Rect content_rect(content_bounds); | 47 gfx::Rect content_rect(content_bounds); |
| 44 | 48 |
| 45 Region remaining(content_rect); | 49 Region remaining(content_rect); |
| 46 PictureLayerTilingSet::CoverageIterator iter(set.get(), contents_scale, | 50 PictureLayerTilingSet::CoverageIterator iter(set.get(), contents_scale, |
| 47 content_rect, contents_scale); | 51 content_rect, contents_scale); |
| 48 for (; iter; ++iter) { | 52 for (; iter; ++iter) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 61 FakePictureLayerTilingClient client; | 65 FakePictureLayerTilingClient client; |
| 62 gfx::Size layer_bounds(10, 10); | 66 gfx::Size layer_bounds(10, 10); |
| 63 PictureLayerTilingSet::TilingRange higher_than_high_res_range(0, 0); | 67 PictureLayerTilingSet::TilingRange higher_than_high_res_range(0, 0); |
| 64 PictureLayerTilingSet::TilingRange high_res_range(0, 0); | 68 PictureLayerTilingSet::TilingRange high_res_range(0, 0); |
| 65 PictureLayerTilingSet::TilingRange between_high_and_low_res_range(0, 0); | 69 PictureLayerTilingSet::TilingRange between_high_and_low_res_range(0, 0); |
| 66 PictureLayerTilingSet::TilingRange low_res_range(0, 0); | 70 PictureLayerTilingSet::TilingRange low_res_range(0, 0); |
| 67 PictureLayerTilingSet::TilingRange lower_than_low_res_range(0, 0); | 71 PictureLayerTilingSet::TilingRange lower_than_low_res_range(0, 0); |
| 68 PictureLayerTiling* high_res_tiling; | 72 PictureLayerTiling* high_res_tiling; |
| 69 PictureLayerTiling* low_res_tiling; | 73 PictureLayerTiling* low_res_tiling; |
| 70 | 74 |
| 71 auto set = CreateTilingSet(&client); | 75 scoped_refptr<FakePicturePileImpl> pile = |
| 72 set->AddTiling(2.0, layer_bounds); | 76 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds); |
| 73 high_res_tiling = set->AddTiling(1.0, layer_bounds); | 77 |
| 78 scoped_ptr<PictureLayerTilingSet> set = CreateTilingSet(&client); |
| 79 set->AddTiling(2.0, pile); |
| 80 high_res_tiling = set->AddTiling(1.0, pile); |
| 74 high_res_tiling->set_resolution(HIGH_RESOLUTION); | 81 high_res_tiling->set_resolution(HIGH_RESOLUTION); |
| 75 set->AddTiling(0.5, layer_bounds); | 82 set->AddTiling(0.5, pile); |
| 76 low_res_tiling = set->AddTiling(0.25, layer_bounds); | 83 low_res_tiling = set->AddTiling(0.25, pile); |
| 77 low_res_tiling->set_resolution(LOW_RESOLUTION); | 84 low_res_tiling->set_resolution(LOW_RESOLUTION); |
| 78 set->AddTiling(0.125, layer_bounds); | 85 set->AddTiling(0.125, pile); |
| 79 | 86 |
| 80 higher_than_high_res_range = | 87 higher_than_high_res_range = |
| 81 set->GetTilingRange(PictureLayerTilingSet::HIGHER_THAN_HIGH_RES); | 88 set->GetTilingRange(PictureLayerTilingSet::HIGHER_THAN_HIGH_RES); |
| 82 EXPECT_EQ(0u, higher_than_high_res_range.start); | 89 EXPECT_EQ(0u, higher_than_high_res_range.start); |
| 83 EXPECT_EQ(1u, higher_than_high_res_range.end); | 90 EXPECT_EQ(1u, higher_than_high_res_range.end); |
| 84 | 91 |
| 85 high_res_range = set->GetTilingRange(PictureLayerTilingSet::HIGH_RES); | 92 high_res_range = set->GetTilingRange(PictureLayerTilingSet::HIGH_RES); |
| 86 EXPECT_EQ(1u, high_res_range.start); | 93 EXPECT_EQ(1u, high_res_range.start); |
| 87 EXPECT_EQ(2u, high_res_range.end); | 94 EXPECT_EQ(2u, high_res_range.end); |
| 88 | 95 |
| 89 between_high_and_low_res_range = | 96 between_high_and_low_res_range = |
| 90 set->GetTilingRange(PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES); | 97 set->GetTilingRange(PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES); |
| 91 EXPECT_EQ(2u, between_high_and_low_res_range.start); | 98 EXPECT_EQ(2u, between_high_and_low_res_range.start); |
| 92 EXPECT_EQ(3u, between_high_and_low_res_range.end); | 99 EXPECT_EQ(3u, between_high_and_low_res_range.end); |
| 93 | 100 |
| 94 low_res_range = set->GetTilingRange(PictureLayerTilingSet::LOW_RES); | 101 low_res_range = set->GetTilingRange(PictureLayerTilingSet::LOW_RES); |
| 95 EXPECT_EQ(3u, low_res_range.start); | 102 EXPECT_EQ(3u, low_res_range.start); |
| 96 EXPECT_EQ(4u, low_res_range.end); | 103 EXPECT_EQ(4u, low_res_range.end); |
| 97 | 104 |
| 98 lower_than_low_res_range = | 105 lower_than_low_res_range = |
| 99 set->GetTilingRange(PictureLayerTilingSet::LOWER_THAN_LOW_RES); | 106 set->GetTilingRange(PictureLayerTilingSet::LOWER_THAN_LOW_RES); |
| 100 EXPECT_EQ(4u, lower_than_low_res_range.start); | 107 EXPECT_EQ(4u, lower_than_low_res_range.start); |
| 101 EXPECT_EQ(5u, lower_than_low_res_range.end); | 108 EXPECT_EQ(5u, lower_than_low_res_range.end); |
| 102 | 109 |
| 103 auto set_without_low_res = CreateTilingSet(&client); | 110 scoped_ptr<PictureLayerTilingSet> set_without_low_res = |
| 104 set_without_low_res->AddTiling(2.0, layer_bounds); | 111 CreateTilingSet(&client); |
| 105 high_res_tiling = set_without_low_res->AddTiling(1.0, layer_bounds); | 112 set_without_low_res->AddTiling(2.0, pile); |
| 113 high_res_tiling = set_without_low_res->AddTiling(1.0, pile); |
| 106 high_res_tiling->set_resolution(HIGH_RESOLUTION); | 114 high_res_tiling->set_resolution(HIGH_RESOLUTION); |
| 107 set_without_low_res->AddTiling(0.5, layer_bounds); | 115 set_without_low_res->AddTiling(0.5, pile); |
| 108 set_without_low_res->AddTiling(0.25, layer_bounds); | 116 set_without_low_res->AddTiling(0.25, pile); |
| 109 | 117 |
| 110 higher_than_high_res_range = set_without_low_res->GetTilingRange( | 118 higher_than_high_res_range = set_without_low_res->GetTilingRange( |
| 111 PictureLayerTilingSet::HIGHER_THAN_HIGH_RES); | 119 PictureLayerTilingSet::HIGHER_THAN_HIGH_RES); |
| 112 EXPECT_EQ(0u, higher_than_high_res_range.start); | 120 EXPECT_EQ(0u, higher_than_high_res_range.start); |
| 113 EXPECT_EQ(1u, higher_than_high_res_range.end); | 121 EXPECT_EQ(1u, higher_than_high_res_range.end); |
| 114 | 122 |
| 115 high_res_range = | 123 high_res_range = |
| 116 set_without_low_res->GetTilingRange(PictureLayerTilingSet::HIGH_RES); | 124 set_without_low_res->GetTilingRange(PictureLayerTilingSet::HIGH_RES); |
| 117 EXPECT_EQ(1u, high_res_range.start); | 125 EXPECT_EQ(1u, high_res_range.start); |
| 118 EXPECT_EQ(2u, high_res_range.end); | 126 EXPECT_EQ(2u, high_res_range.end); |
| 119 | 127 |
| 120 between_high_and_low_res_range = set_without_low_res->GetTilingRange( | 128 between_high_and_low_res_range = set_without_low_res->GetTilingRange( |
| 121 PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES); | 129 PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES); |
| 122 EXPECT_EQ(2u, between_high_and_low_res_range.start); | 130 EXPECT_EQ(2u, between_high_and_low_res_range.start); |
| 123 EXPECT_EQ(4u, between_high_and_low_res_range.end); | 131 EXPECT_EQ(4u, between_high_and_low_res_range.end); |
| 124 | 132 |
| 125 low_res_range = | 133 low_res_range = |
| 126 set_without_low_res->GetTilingRange(PictureLayerTilingSet::LOW_RES); | 134 set_without_low_res->GetTilingRange(PictureLayerTilingSet::LOW_RES); |
| 127 EXPECT_EQ(0u, low_res_range.end - low_res_range.start); | 135 EXPECT_EQ(0u, low_res_range.end - low_res_range.start); |
| 128 | 136 |
| 129 lower_than_low_res_range = set_without_low_res->GetTilingRange( | 137 lower_than_low_res_range = set_without_low_res->GetTilingRange( |
| 130 PictureLayerTilingSet::LOWER_THAN_LOW_RES); | 138 PictureLayerTilingSet::LOWER_THAN_LOW_RES); |
| 131 EXPECT_EQ(0u, lower_than_low_res_range.end - lower_than_low_res_range.start); | 139 EXPECT_EQ(0u, lower_than_low_res_range.end - lower_than_low_res_range.start); |
| 132 | 140 |
| 133 auto set_with_only_high_and_low_res = CreateTilingSet(&client); | 141 scoped_ptr<PictureLayerTilingSet> set_with_only_high_and_low_res = |
| 134 high_res_tiling = | 142 CreateTilingSet(&client); |
| 135 set_with_only_high_and_low_res->AddTiling(1.0, layer_bounds); | 143 high_res_tiling = set_with_only_high_and_low_res->AddTiling(1.0, pile); |
| 136 high_res_tiling->set_resolution(HIGH_RESOLUTION); | 144 high_res_tiling->set_resolution(HIGH_RESOLUTION); |
| 137 low_res_tiling = set_with_only_high_and_low_res->AddTiling(0.5, layer_bounds); | 145 low_res_tiling = set_with_only_high_and_low_res->AddTiling(0.5, pile); |
| 138 low_res_tiling->set_resolution(LOW_RESOLUTION); | 146 low_res_tiling->set_resolution(LOW_RESOLUTION); |
| 139 | 147 |
| 140 higher_than_high_res_range = set_with_only_high_and_low_res->GetTilingRange( | 148 higher_than_high_res_range = set_with_only_high_and_low_res->GetTilingRange( |
| 141 PictureLayerTilingSet::HIGHER_THAN_HIGH_RES); | 149 PictureLayerTilingSet::HIGHER_THAN_HIGH_RES); |
| 142 EXPECT_EQ(0u, | 150 EXPECT_EQ(0u, |
| 143 higher_than_high_res_range.end - higher_than_high_res_range.start); | 151 higher_than_high_res_range.end - higher_than_high_res_range.start); |
| 144 | 152 |
| 145 high_res_range = set_with_only_high_and_low_res->GetTilingRange( | 153 high_res_range = set_with_only_high_and_low_res->GetTilingRange( |
| 146 PictureLayerTilingSet::HIGH_RES); | 154 PictureLayerTilingSet::HIGH_RES); |
| 147 EXPECT_EQ(0u, high_res_range.start); | 155 EXPECT_EQ(0u, high_res_range.start); |
| 148 EXPECT_EQ(1u, high_res_range.end); | 156 EXPECT_EQ(1u, high_res_range.end); |
| 149 | 157 |
| 150 between_high_and_low_res_range = | 158 between_high_and_low_res_range = |
| 151 set_with_only_high_and_low_res->GetTilingRange( | 159 set_with_only_high_and_low_res->GetTilingRange( |
| 152 PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES); | 160 PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES); |
| 153 EXPECT_EQ(0u, between_high_and_low_res_range.end - | 161 EXPECT_EQ(0u, between_high_and_low_res_range.end - |
| 154 between_high_and_low_res_range.start); | 162 between_high_and_low_res_range.start); |
| 155 | 163 |
| 156 low_res_range = set_with_only_high_and_low_res->GetTilingRange( | 164 low_res_range = set_with_only_high_and_low_res->GetTilingRange( |
| 157 PictureLayerTilingSet::LOW_RES); | 165 PictureLayerTilingSet::LOW_RES); |
| 158 EXPECT_EQ(1u, low_res_range.start); | 166 EXPECT_EQ(1u, low_res_range.start); |
| 159 EXPECT_EQ(2u, low_res_range.end); | 167 EXPECT_EQ(2u, low_res_range.end); |
| 160 | 168 |
| 161 lower_than_low_res_range = set_with_only_high_and_low_res->GetTilingRange( | 169 lower_than_low_res_range = set_with_only_high_and_low_res->GetTilingRange( |
| 162 PictureLayerTilingSet::LOWER_THAN_LOW_RES); | 170 PictureLayerTilingSet::LOWER_THAN_LOW_RES); |
| 163 EXPECT_EQ(0u, lower_than_low_res_range.end - lower_than_low_res_range.start); | 171 EXPECT_EQ(0u, lower_than_low_res_range.end - lower_than_low_res_range.start); |
| 164 | 172 |
| 165 auto set_with_only_high_res = CreateTilingSet(&client); | 173 scoped_ptr<PictureLayerTilingSet> set_with_only_high_res = |
| 166 high_res_tiling = set_with_only_high_res->AddTiling(1.0, layer_bounds); | 174 CreateTilingSet(&client); |
| 175 high_res_tiling = set_with_only_high_res->AddTiling(1.0, pile); |
| 167 high_res_tiling->set_resolution(HIGH_RESOLUTION); | 176 high_res_tiling->set_resolution(HIGH_RESOLUTION); |
| 168 | 177 |
| 169 higher_than_high_res_range = set_with_only_high_res->GetTilingRange( | 178 higher_than_high_res_range = set_with_only_high_res->GetTilingRange( |
| 170 PictureLayerTilingSet::HIGHER_THAN_HIGH_RES); | 179 PictureLayerTilingSet::HIGHER_THAN_HIGH_RES); |
| 171 EXPECT_EQ(0u, | 180 EXPECT_EQ(0u, |
| 172 higher_than_high_res_range.end - higher_than_high_res_range.start); | 181 higher_than_high_res_range.end - higher_than_high_res_range.start); |
| 173 | 182 |
| 174 high_res_range = | 183 high_res_range = |
| 175 set_with_only_high_res->GetTilingRange(PictureLayerTilingSet::HIGH_RES); | 184 set_with_only_high_res->GetTilingRange(PictureLayerTilingSet::HIGH_RES); |
| 176 EXPECT_EQ(0u, high_res_range.start); | 185 EXPECT_EQ(0u, high_res_range.start); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 NULL, | 220 NULL, |
| 212 NULL, | 221 NULL, |
| 213 0, | 222 0, |
| 214 false, | 223 false, |
| 215 1); | 224 1); |
| 216 | 225 |
| 217 FakePictureLayerTilingClient client(resource_provider.get()); | 226 FakePictureLayerTilingClient client(resource_provider.get()); |
| 218 client.SetTileSize(gfx::Size(256, 256)); | 227 client.SetTileSize(gfx::Size(256, 256)); |
| 219 client.set_tree(PENDING_TREE); | 228 client.set_tree(PENDING_TREE); |
| 220 gfx::Size layer_bounds(1000, 800); | 229 gfx::Size layer_bounds(1000, 800); |
| 221 auto set = CreateTilingSet(&client); | 230 scoped_ptr<PictureLayerTilingSet> set = CreateTilingSet(&client); |
| 231 scoped_refptr<FakePicturePileImpl> pile = |
| 232 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds); |
| 222 | 233 |
| 223 float scale = min_scale; | 234 float scale = min_scale; |
| 224 for (int i = 0; i < num_tilings; ++i, scale += scale_increment) { | 235 for (int i = 0; i < num_tilings; ++i, scale += scale_increment) { |
| 225 PictureLayerTiling* tiling = set->AddTiling(scale, layer_bounds); | 236 PictureLayerTiling* tiling = set->AddTiling(scale, pile); |
| 226 tiling->CreateAllTilesForTesting(); | 237 tiling->CreateAllTilesForTesting(); |
| 227 std::vector<Tile*> tiles = tiling->AllTilesForTesting(); | 238 std::vector<Tile*> tiles = tiling->AllTilesForTesting(); |
| 228 client.tile_manager()->InitializeTilesWithResourcesForTesting(tiles); | 239 client.tile_manager()->InitializeTilesWithResourcesForTesting(tiles); |
| 229 } | 240 } |
| 230 | 241 |
| 231 float max_contents_scale = scale; | 242 float max_contents_scale = scale; |
| 232 gfx::Size content_bounds( | 243 gfx::Size content_bounds( |
| 233 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, max_contents_scale))); | 244 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, max_contents_scale))); |
| 234 gfx::Rect content_rect(content_bounds); | 245 gfx::Rect content_rect(content_bounds); |
| 235 | 246 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 } | 291 } |
| 281 | 292 |
| 282 TEST_F(PictureLayerTilingSetTestWithResources, ManyTilings_Equal) { | 293 TEST_F(PictureLayerTilingSetTestWithResources, ManyTilings_Equal) { |
| 283 runTest(10, 1.f, 1.f, 5.f, 5.f); | 294 runTest(10, 1.f, 1.f, 5.f, 5.f); |
| 284 } | 295 } |
| 285 | 296 |
| 286 TEST_F(PictureLayerTilingSetTestWithResources, ManyTilings_NotEqual) { | 297 TEST_F(PictureLayerTilingSetTestWithResources, ManyTilings_NotEqual) { |
| 287 runTest(10, 1.f, 1.f, 4.5f, 5.f); | 298 runTest(10, 1.f, 1.f, 4.5f, 5.f); |
| 288 } | 299 } |
| 289 | 300 |
| 290 class PictureLayerTilingSetSyncTest : public testing::Test { | 301 TEST(PictureLayerTilingSetTest, TileSizeChange) { |
| 291 public: | 302 FakePictureLayerTilingClient pending_client; |
| 292 PictureLayerTilingSetSyncTest() | 303 FakePictureLayerTilingClient active_client; |
| 293 : tile_size_(gfx::Size(10, 10)), | 304 scoped_ptr<PictureLayerTilingSet> pending_set = |
| 294 source_bounds_(gfx::Size(30, 20)), | 305 PictureLayerTilingSet::Create(&pending_client, 1000, 1.f, 1000); |
| 295 target_bounds_(gfx::Size(30, 30)) { | 306 scoped_ptr<PictureLayerTilingSet> active_set = |
| 296 source_client_.SetTileSize(tile_size_); | 307 PictureLayerTilingSet::Create(&active_client, 1000, 1.f, 1000); |
| 297 source_client_.set_tree(PENDING_TREE); | |
| 298 target_client_.SetTileSize(tile_size_); | |
| 299 target_client_.set_tree(PENDING_TREE); | |
| 300 source_ = CreateTilingSet(&source_client_); | |
| 301 target_ = CreateTilingSet(&target_client_); | |
| 302 } | |
| 303 | 308 |
| 304 // Sync from source to target. | 309 gfx::Size layer_bounds(100, 100); |
| 305 void SyncTilings(const gfx::Size& new_bounds, | 310 scoped_refptr<FakePicturePileImpl> pile = |
| 306 const Region& invalidation, | 311 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds); |
| 307 float minimum_scale) { | |
| 308 for (size_t i = 0; i < source_->num_tilings(); ++i) | |
| 309 source_->tiling_at(i)->CreateAllTilesForTesting(); | |
| 310 for (size_t i = 0; i < target_->num_tilings(); ++i) | |
| 311 target_->tiling_at(i)->CreateAllTilesForTesting(); | |
| 312 | 312 |
| 313 target_->SyncTilingsForTesting(*source_.get(), new_bounds, invalidation, | 313 gfx::Size tile_size1(10, 10); |
| 314 minimum_scale, | 314 gfx::Size tile_size2(30, 30); |
| 315 target_client_.raster_source()); | 315 gfx::Size tile_size3(20, 20); |
| 316 } | |
| 317 void SyncTilings(const gfx::Size& new_bounds) { | |
| 318 Region invalidation; | |
| 319 SyncTilings(new_bounds, invalidation, 0.f); | |
| 320 } | |
| 321 void SyncTilings(const gfx::Size& new_bounds, const Region& invalidation) { | |
| 322 SyncTilings(new_bounds, invalidation, 0.f); | |
| 323 } | |
| 324 void SyncTilings(const gfx::Size& new_bounds, float minimum_scale) { | |
| 325 Region invalidation; | |
| 326 SyncTilings(new_bounds, invalidation, minimum_scale); | |
| 327 } | |
| 328 | 316 |
| 329 void VerifyTargetEqualsSource(const gfx::Size& new_bounds) { | 317 pending_client.SetTileSize(tile_size1); |
| 330 ASSERT_FALSE(new_bounds.IsEmpty()); | 318 pending_set->AddTiling(1.f, pile); |
| 331 EXPECT_EQ(target_->num_tilings(), source_->num_tilings()); | 319 // New tilings get the correct tile size. |
| 320 EXPECT_EQ(tile_size1, pending_set->tiling_at(0)->tile_size()); |
| 332 | 321 |
| 333 for (size_t i = 0; i < target_->num_tilings(); ++i) { | 322 // Set some expected things for the tiling set to function. |
| 334 ASSERT_GT(source_->num_tilings(), i); | 323 pending_set->tiling_at(0)->set_resolution(HIGH_RESOLUTION); |
| 335 const PictureLayerTiling* source_tiling = source_->tiling_at(i); | 324 active_client.set_twin_tiling_set(pending_set.get()); |
| 336 const PictureLayerTiling* target_tiling = target_->tiling_at(i); | |
| 337 EXPECT_EQ(target_tiling->layer_bounds().ToString(), | |
| 338 new_bounds.ToString()); | |
| 339 EXPECT_EQ(source_tiling->contents_scale(), | |
| 340 target_tiling->contents_scale()); | |
| 341 } | |
| 342 | 325 |
| 343 EXPECT_EQ(source_->client(), &source_client_); | 326 // Set a priority rect so we get tiles. |
| 344 EXPECT_EQ(target_->client(), &target_client_); | 327 pending_set->UpdateTilePriorities(gfx::Rect(layer_bounds), 1.f, 1.0, |
| 345 ValidateTargetTilingSet(); | 328 Occlusion(), false); |
| 346 } | 329 EXPECT_EQ(tile_size1, pending_set->tiling_at(0)->tile_size()); |
| 347 | 330 |
| 348 void ValidateTargetTilingSet() { | 331 // The tiles should get the correct size. |
| 349 // Tilings should be sorted largest to smallest. | 332 std::vector<Tile*> pending_tiles = |
| 350 if (target_->num_tilings() > 0) { | 333 pending_set->tiling_at(0)->AllTilesForTesting(); |
| 351 float last_scale = target_->tiling_at(0)->contents_scale(); | 334 EXPECT_GT(pending_tiles.size(), 0u); |
| 352 for (size_t i = 1; i < target_->num_tilings(); ++i) { | 335 for (const auto& tile : pending_tiles) |
| 353 const PictureLayerTiling* target_tiling = target_->tiling_at(i); | 336 EXPECT_EQ(tile_size1, tile->content_rect().size()); |
| 354 EXPECT_LT(target_tiling->contents_scale(), last_scale); | |
| 355 last_scale = target_tiling->contents_scale(); | |
| 356 } | |
| 357 } | |
| 358 | 337 |
| 359 for (size_t i = 0; i < target_->num_tilings(); ++i) | 338 // Update to a new source frame with a new tile size. |
| 360 ValidateTiling(target_->tiling_at(i), target_client_.raster_source()); | 339 pending_client.SetTileSize(tile_size2); |
| 361 } | 340 pending_set->UpdateTilingsToCurrentRasterSource(pile.get(), nullptr, Region(), |
| 341 1.f, 1.f); |
| 342 // The tiling should get the correct tile size. |
| 343 EXPECT_EQ(tile_size2, pending_set->tiling_at(0)->tile_size()); |
| 362 | 344 |
| 363 void ValidateTiling(const PictureLayerTiling* tiling, | 345 // Set a priority rect so we get tiles. |
| 364 const RasterSource* raster_source) { | 346 pending_set->UpdateTilePriorities(gfx::Rect(layer_bounds), 1.f, 2.0, |
| 365 if (tiling->tiling_size().IsEmpty()) { | 347 Occlusion(), false); |
| 366 EXPECT_TRUE(tiling->live_tiles_rect().IsEmpty()); | 348 EXPECT_EQ(tile_size2, pending_set->tiling_at(0)->tile_size()); |
| 367 } else if (!tiling->live_tiles_rect().IsEmpty()) { | |
| 368 gfx::Rect tiling_rect(tiling->tiling_size()); | |
| 369 EXPECT_TRUE(tiling_rect.Contains(tiling->live_tiles_rect())); | |
| 370 } | |
| 371 | 349 |
| 372 std::vector<Tile*> tiles = tiling->AllTilesForTesting(); | 350 // Tiles should have the new correct size. |
| 373 for (size_t i = 0; i < tiles.size(); ++i) { | 351 pending_tiles = pending_set->tiling_at(0)->AllTilesForTesting(); |
| 374 const Tile* tile = tiles[i]; | 352 EXPECT_GT(pending_tiles.size(), 0u); |
| 375 ASSERT_TRUE(!!tile); | 353 for (const auto& tile : pending_tiles) |
| 376 EXPECT_EQ(tile->raster_source(), raster_source); | 354 EXPECT_EQ(tile_size2, tile->content_rect().size()); |
| 377 EXPECT_TRUE(tile->content_rect().Intersects(tiling->live_tiles_rect())) | |
| 378 << "All tiles must be inside the live tiles rect." | |
| 379 << " Tile rect: " << tile->content_rect().ToString() | |
| 380 << " Live rect: " << tiling->live_tiles_rect().ToString() | |
| 381 << " Scale: " << tiling->contents_scale(); | |
| 382 } | |
| 383 | 355 |
| 384 for (PictureLayerTiling::CoverageIterator iter( | 356 // Clone from the pending to the active tree. |
| 385 tiling, tiling->contents_scale(), tiling->live_tiles_rect()); | 357 active_client.SetTileSize(tile_size2); |
| 386 iter; | 358 active_set->UpdateTilingsToCurrentRasterSource(pile.get(), pending_set.get(), |
| 387 ++iter) { | 359 Region(), 1.f, 1.f); |
| 388 EXPECT_TRUE(*iter) << "The live tiles rect must be full."; | 360 // The active tiling should get the right tile size. |
| 389 } | 361 EXPECT_EQ(tile_size2, active_set->tiling_at(0)->tile_size()); |
| 390 } | |
| 391 | 362 |
| 392 gfx::Size tile_size_; | 363 // Cloned tiles should have the right size. |
| 364 std::vector<Tile*> active_tiles = |
| 365 active_set->tiling_at(0)->AllTilesForTesting(); |
| 366 EXPECT_GT(active_tiles.size(), 0u); |
| 367 for (const auto& tile : active_tiles) |
| 368 EXPECT_EQ(tile_size2, tile->content_rect().size()); |
| 393 | 369 |
| 394 FakePictureLayerTilingClient source_client_; | 370 // A new source frame with a new tile size. |
| 395 gfx::Size source_bounds_; | 371 pending_client.SetTileSize(tile_size3); |
| 396 scoped_ptr<PictureLayerTilingSet> source_; | 372 pending_set->UpdateTilingsToCurrentRasterSource(pile.get(), nullptr, Region(), |
| 373 1.f, 1.f); |
| 374 // The tiling gets the new size correctly. |
| 375 EXPECT_EQ(tile_size3, pending_set->tiling_at(0)->tile_size()); |
| 397 | 376 |
| 398 FakePictureLayerTilingClient target_client_; | 377 // Set a priority rect so we get tiles. |
| 399 gfx::Size target_bounds_; | 378 pending_set->UpdateTilePriorities(gfx::Rect(layer_bounds), 1.f, 3.0, |
| 400 scoped_ptr<PictureLayerTilingSet> target_; | 379 Occlusion(), false); |
| 401 }; | 380 EXPECT_EQ(tile_size3, pending_set->tiling_at(0)->tile_size()); |
| 402 | 381 |
| 403 TEST_F(PictureLayerTilingSetSyncTest, EmptyBounds) { | 382 // Tiles are resized for the new size. |
| 404 float source_scales[] = {1.f, 1.2f}; | 383 pending_tiles = pending_set->tiling_at(0)->AllTilesForTesting(); |
| 405 for (size_t i = 0; i < arraysize(source_scales); ++i) | 384 EXPECT_GT(pending_tiles.size(), 0u); |
| 406 source_->AddTiling(source_scales[i], source_bounds_); | 385 for (const auto& tile : pending_tiles) |
| 386 EXPECT_EQ(tile_size3, tile->content_rect().size()); |
| 407 | 387 |
| 408 gfx::Size empty_bounds; | 388 // Now we activate with a different tile size for the active tiling. |
| 409 SyncTilings(empty_bounds); | 389 active_client.SetTileSize(tile_size3); |
| 410 EXPECT_EQ(target_->num_tilings(), 0u); | 390 active_set->UpdateTilingsToCurrentRasterSource(pile.get(), pending_set.get(), |
| 391 Region(), 1.f, 1.f); |
| 392 // The active tiling changes its tile size. |
| 393 EXPECT_EQ(tile_size3, active_set->tiling_at(0)->tile_size()); |
| 394 |
| 395 // And its tiles are resized. |
| 396 active_tiles = active_set->tiling_at(0)->AllTilesForTesting(); |
| 397 EXPECT_GT(active_tiles.size(), 0u); |
| 398 for (const auto& tile : active_tiles) |
| 399 EXPECT_EQ(tile_size3, tile->content_rect().size()); |
| 411 } | 400 } |
| 412 | 401 |
| 413 TEST_F(PictureLayerTilingSetSyncTest, AllNew) { | 402 TEST(PictureLayerTilingSetTest, MaxContentScale) { |
| 414 float source_scales[] = {0.5f, 1.f, 1.2f}; | 403 FakePictureLayerTilingClient pending_client; |
| 415 for (size_t i = 0; i < arraysize(source_scales); ++i) | 404 FakePictureLayerTilingClient active_client; |
| 416 source_->AddTiling(source_scales[i], source_bounds_); | 405 scoped_ptr<PictureLayerTilingSet> pending_set = |
| 417 float target_scales[] = {0.75f, 1.4f, 3.f}; | 406 PictureLayerTilingSet::Create(&pending_client, 1000, 1.f, 1000); |
| 418 for (size_t i = 0; i < arraysize(target_scales); ++i) | 407 scoped_ptr<PictureLayerTilingSet> active_set = |
| 419 target_->AddTiling(target_scales[i], target_bounds_); | 408 PictureLayerTilingSet::Create(&active_client, 1000, 1.f, 1000); |
| 420 | 409 |
| 421 gfx::Size new_bounds(15, 40); | 410 gfx::Size layer_bounds(100, 105); |
| 422 SyncTilings(new_bounds); | 411 scoped_refptr<FakePicturePileImpl> pile = |
| 423 VerifyTargetEqualsSource(new_bounds); | 412 FakePicturePileImpl::CreateEmptyPileWithDefaultTileSize(layer_bounds); |
| 424 } | |
| 425 | 413 |
| 426 Tile* FindTileAtOrigin(PictureLayerTiling* tiling) { | 414 // Tilings can be added of any scale, the tiling client can controls this. |
| 427 std::vector<Tile*> tiles = tiling->AllTilesForTesting(); | 415 pending_set->AddTiling(1.f, pile); |
| 428 for (size_t i = 0; i < tiles.size(); ++i) { | 416 pending_set->AddTiling(2.f, pile); |
| 429 if (tiles[i]->content_rect().origin() == gfx::Point()) | 417 pending_set->AddTiling(3.f, pile); |
| 430 return tiles[i]; | |
| 431 } | |
| 432 return NULL; | |
| 433 } | |
| 434 | 418 |
| 435 TEST_F(PictureLayerTilingSetSyncTest, KeepExisting) { | 419 // Set some expected things for the tiling set to function. |
| 436 float source_scales[] = {0.7f, 1.f, 1.1f, 2.f}; | 420 pending_set->tiling_at(0)->set_resolution(HIGH_RESOLUTION); |
| 437 for (size_t i = 0; i < arraysize(source_scales); ++i) | 421 active_client.set_twin_tiling_set(pending_set.get()); |
| 438 source_->AddTiling(source_scales[i], source_bounds_); | |
| 439 float target_scales[] = {0.5f, 1.f, 2.f}; | |
| 440 for (size_t i = 0; i < arraysize(target_scales); ++i) | |
| 441 target_->AddTiling(target_scales[i], target_bounds_); | |
| 442 | 422 |
| 443 PictureLayerTiling* tiling1 = source_->FindTilingWithScale(1.f); | 423 // Update to a new source frame with a max content scale that is larger than |
| 444 ASSERT_TRUE(tiling1); | 424 // everything. |
| 445 tiling1->CreateAllTilesForTesting(); | 425 float max_content_scale = 3.f; |
| 446 EXPECT_EQ(tiling1->contents_scale(), 1.f); | 426 pending_set->UpdateTilingsToCurrentRasterSource(pile.get(), nullptr, Region(), |
| 447 Tile* tile1 = FindTileAtOrigin(tiling1); | 427 1.f, max_content_scale); |
| 448 ASSERT_TRUE(tile1); | 428 // All the tilings are there still. |
| 429 EXPECT_EQ(3u, pending_set->num_tilings()); |
| 449 | 430 |
| 450 PictureLayerTiling* tiling2 = source_->FindTilingWithScale(2.f); | 431 // Clone from the pending to the active tree with the same max content size. |
| 451 tiling2->CreateAllTilesForTesting(); | 432 active_set->UpdateTilingsToCurrentRasterSource( |
| 452 ASSERT_TRUE(tiling2); | 433 pile.get(), pending_set.get(), Region(), 1.f, max_content_scale); |
| 453 EXPECT_EQ(tiling2->contents_scale(), 2.f); | 434 // All the tilings are on the active tree. |
| 454 Tile* tile2 = FindTileAtOrigin(tiling2); | 435 EXPECT_EQ(3u, active_set->num_tilings()); |
| 455 ASSERT_TRUE(tile2); | |
| 456 | 436 |
| 457 gfx::Size new_bounds(15, 40); | 437 // Update to a new source frame with a max content scale that will drop one |
| 458 SyncTilings(new_bounds); | 438 // tiling. |
| 459 VerifyTargetEqualsSource(new_bounds); | 439 max_content_scale = 2.9f; |
| 440 pending_set->UpdateTilingsToCurrentRasterSource(pile.get(), nullptr, Region(), |
| 441 1.f, max_content_scale); |
| 442 // All the tilings are there still. |
| 443 EXPECT_EQ(2u, pending_set->num_tilings()); |
| 460 | 444 |
| 461 EXPECT_EQ(tiling1, source_->FindTilingWithScale(1.f)); | 445 pending_set->tiling_at(0)->set_resolution(HIGH_RESOLUTION); |
| 462 EXPECT_EQ(tile1, FindTileAtOrigin(tiling1)); | |
| 463 EXPECT_FALSE(tiling1->live_tiles_rect().IsEmpty()); | |
| 464 | 446 |
| 465 EXPECT_EQ(tiling2, source_->FindTilingWithScale(2.f)); | 447 // Clone from the pending to the active tree with the same max content size. |
| 466 EXPECT_EQ(tile2, FindTileAtOrigin(tiling2)); | 448 active_set->UpdateTilingsToCurrentRasterSource( |
| 467 EXPECT_FALSE(tiling2->live_tiles_rect().IsEmpty()); | 449 pile.get(), pending_set.get(), Region(), 1.f, max_content_scale); |
| 468 } | 450 // All the tilings are on the active tree. |
| 469 | 451 EXPECT_EQ(2u, active_set->num_tilings()); |
| 470 TEST_F(PictureLayerTilingSetSyncTest, EmptySet) { | |
| 471 float target_scales[] = {0.2f, 1.f}; | |
| 472 for (size_t i = 0; i < arraysize(target_scales); ++i) | |
| 473 target_->AddTiling(target_scales[i], target_bounds_); | |
| 474 | |
| 475 gfx::Size new_bounds(15, 40); | |
| 476 SyncTilings(new_bounds); | |
| 477 VerifyTargetEqualsSource(new_bounds); | |
| 478 } | |
| 479 | |
| 480 TEST_F(PictureLayerTilingSetSyncTest, MinimumScale) { | |
| 481 float source_scales[] = {0.7f, 1.f, 1.1f, 2.f}; | |
| 482 for (size_t i = 0; i < arraysize(source_scales); ++i) | |
| 483 source_->AddTiling(source_scales[i], source_bounds_); | |
| 484 float target_scales[] = {0.5f, 0.7f, 1.f, 1.1f, 2.f}; | |
| 485 for (size_t i = 0; i < arraysize(target_scales); ++i) | |
| 486 target_->AddTiling(target_scales[i], target_bounds_); | |
| 487 | |
| 488 gfx::Size new_bounds(15, 40); | |
| 489 float minimum_scale = 1.5f; | |
| 490 SyncTilings(new_bounds, minimum_scale); | |
| 491 | |
| 492 EXPECT_EQ(target_->num_tilings(), 1u); | |
| 493 EXPECT_EQ(target_->tiling_at(0)->contents_scale(), 2.f); | |
| 494 ValidateTargetTilingSet(); | |
| 495 } | |
| 496 | |
| 497 TEST_F(PictureLayerTilingSetSyncTest, Invalidation) { | |
| 498 source_->AddTiling(2.f, source_bounds_); | |
| 499 target_->AddTiling(2.f, target_bounds_); | |
| 500 target_->tiling_at(0)->CreateAllTilesForTesting(); | |
| 501 | |
| 502 Region layer_invalidation; | |
| 503 layer_invalidation.Union(gfx::Rect(0, 0, 1, 1)); | |
| 504 layer_invalidation.Union(gfx::Rect(0, 15, 1, 1)); | |
| 505 // Out of bounds layer_invalidation. | |
| 506 layer_invalidation.Union(gfx::Rect(100, 100, 1, 1)); | |
| 507 | |
| 508 Region content_invalidation; | |
| 509 for (Region::Iterator iter(layer_invalidation); iter.has_rect(); | |
| 510 iter.next()) { | |
| 511 gfx::Rect content_rect = gfx::ScaleToEnclosingRect(iter.rect(), 2.f); | |
| 512 content_invalidation.Union(content_rect); | |
| 513 } | |
| 514 | |
| 515 std::vector<Tile*> old_tiles = target_->tiling_at(0)->AllTilesForTesting(); | |
| 516 std::map<gfx::Point, scoped_refptr<Tile>> old_tile_map; | |
| 517 for (size_t i = 0; i < old_tiles.size(); ++i) | |
| 518 old_tile_map[old_tiles[i]->content_rect().origin()] = old_tiles[i]; | |
| 519 | |
| 520 SyncTilings(target_bounds_, layer_invalidation); | |
| 521 VerifyTargetEqualsSource(target_bounds_); | |
| 522 | |
| 523 std::vector<Tile*> new_tiles = target_->tiling_at(0)->AllTilesForTesting(); | |
| 524 for (size_t i = 0; i < new_tiles.size(); ++i) { | |
| 525 const Tile* tile = new_tiles[i]; | |
| 526 std::map<gfx::Point, scoped_refptr<Tile>>::iterator find = | |
| 527 old_tile_map.find(tile->content_rect().origin()); | |
| 528 if (content_invalidation.Intersects(tile->content_rect())) | |
| 529 EXPECT_NE(tile, find->second.get()); | |
| 530 else | |
| 531 EXPECT_EQ(tile, find->second.get()); | |
| 532 } | |
| 533 } | |
| 534 | |
| 535 TEST_F(PictureLayerTilingSetSyncTest, TileSizeChange) { | |
| 536 source_->AddTiling(1.f, source_bounds_); | |
| 537 target_->AddTiling(1.f, target_bounds_); | |
| 538 | |
| 539 target_->tiling_at(0)->CreateAllTilesForTesting(); | |
| 540 std::vector<Tile*> original_tiles = | |
| 541 target_->tiling_at(0)->AllTilesForTesting(); | |
| 542 EXPECT_GT(original_tiles.size(), 0u); | |
| 543 gfx::Size new_tile_size(100, 100); | |
| 544 target_client_.SetTileSize(new_tile_size); | |
| 545 EXPECT_NE(target_->tiling_at(0)->tile_size().ToString(), | |
| 546 new_tile_size.ToString()); | |
| 547 | |
| 548 gfx::Size new_bounds(15, 40); | |
| 549 SyncTilings(new_bounds); | |
| 550 VerifyTargetEqualsSource(new_bounds); | |
| 551 | |
| 552 EXPECT_EQ(target_->tiling_at(0)->tile_size().ToString(), | |
| 553 new_tile_size.ToString()); | |
| 554 | |
| 555 // All old tiles should not be present in new tiles. | |
| 556 std::vector<Tile*> new_tiles = target_->tiling_at(0)->AllTilesForTesting(); | |
| 557 for (size_t i = 0; i < original_tiles.size(); ++i) { | |
| 558 std::vector<Tile*>::iterator find = | |
| 559 std::find(new_tiles.begin(), new_tiles.end(), original_tiles[i]); | |
| 560 EXPECT_TRUE(find == new_tiles.end()); | |
| 561 } | |
| 562 } | 452 } |
| 563 | 453 |
| 564 } // namespace | 454 } // namespace |
| 565 } // namespace cc | 455 } // namespace cc |
| OLD | NEW |