Chromium Code Reviews| 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/tiles/picture_layer_tiling_set.h" | 5 #include "cc/tiles/picture_layer_tiling_set.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "cc/playback/display_list_raster_source.h" | 11 #include "cc/playback/display_list_raster_source.h" |
| 12 | 12 |
| 13 namespace cc { | 13 namespace cc { |
| 14 | 14 |
| 15 namespace { | 15 namespace { |
| 16 | 16 |
| 17 class LargestToSmallestScaleFunctor { | 17 class LargestToSmallestScaleFunctor { |
| 18 public: | 18 public: |
| 19 bool operator() (PictureLayerTiling* left, PictureLayerTiling* right) { | 19 bool operator()(const scoped_ptr<PictureLayerTiling>& left, |
| 20 const scoped_ptr<PictureLayerTiling>& right) { | |
| 20 return left->contents_scale() > right->contents_scale(); | 21 return left->contents_scale() > right->contents_scale(); |
| 21 } | 22 } |
| 22 }; | 23 }; |
| 23 | 24 |
| 24 inline float LargerRatio(float float1, float float2) { | 25 inline float LargerRatio(float float1, float float2) { |
| 25 DCHECK_GT(float1, 0.f); | 26 DCHECK_GT(float1, 0.f); |
| 26 DCHECK_GT(float2, 0.f); | 27 DCHECK_GT(float2, 0.f); |
| 27 return float1 > float2 ? float1 / float2 : float2 / float1; | 28 return float1 > float2 ? float1 / float2 : float2 / float1; |
| 28 } | 29 } |
| 29 | 30 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 64 const Region& layer_invalidation) { | 65 const Region& layer_invalidation) { |
| 65 if (pending_twin_set->tilings_.empty()) { | 66 if (pending_twin_set->tilings_.empty()) { |
| 66 // If the twin (pending) tiling set is empty, it was not updated for the | 67 // If the twin (pending) tiling set is empty, it was not updated for the |
| 67 // current frame. So we drop tilings from our set as well, instead of | 68 // current frame. So we drop tilings from our set as well, instead of |
| 68 // leaving behind unshared tilings that are all non-ideal. | 69 // leaving behind unshared tilings that are all non-ideal. |
| 69 RemoveAllTilings(); | 70 RemoveAllTilings(); |
| 70 return; | 71 return; |
| 71 } | 72 } |
| 72 | 73 |
| 73 bool tiling_sort_required = false; | 74 bool tiling_sort_required = false; |
| 74 for (PictureLayerTiling* pending_twin_tiling : pending_twin_set->tilings_) { | 75 for (const scoped_ptr<PictureLayerTiling>& pending_twin_tiling : |
|
danakj
2015/11/17 01:12:18
auto
vmpstr
2015/11/17 23:26:24
Done.
| |
| 76 pending_twin_set->tilings_) { | |
| 75 float contents_scale = pending_twin_tiling->contents_scale(); | 77 float contents_scale = pending_twin_tiling->contents_scale(); |
| 76 PictureLayerTiling* this_tiling = FindTilingWithScale(contents_scale); | 78 PictureLayerTiling* this_tiling = FindTilingWithScale(contents_scale); |
| 77 if (!this_tiling) { | 79 if (!this_tiling) { |
| 78 scoped_ptr<PictureLayerTiling> new_tiling = PictureLayerTiling::Create( | 80 scoped_ptr<PictureLayerTiling> new_tiling = PictureLayerTiling::Create( |
| 79 tree_, contents_scale, raster_source, client_, | 81 tree_, contents_scale, raster_source, client_, |
| 80 tiling_interest_area_padding_, skewport_target_time_in_seconds_, | 82 tiling_interest_area_padding_, skewport_target_time_in_seconds_, |
| 81 skewport_extrapolation_limit_in_content_pixels_); | 83 skewport_extrapolation_limit_in_content_pixels_); |
| 82 tilings_.push_back(new_tiling.Pass()); | 84 tilings_.push_back(new_tiling.Pass()); |
| 83 this_tiling = tilings_.back(); | 85 this_tiling = tilings_.back().get(); |
| 84 tiling_sort_required = true; | 86 tiling_sort_required = true; |
| 85 } | 87 } |
| 86 this_tiling->TakeTilesAndPropertiesFrom(pending_twin_tiling, | 88 this_tiling->TakeTilesAndPropertiesFrom(pending_twin_tiling.get(), |
| 87 layer_invalidation); | 89 layer_invalidation); |
| 88 } | 90 } |
| 89 | 91 |
| 90 if (tiling_sort_required) | 92 if (tiling_sort_required) { |
| 91 tilings_.sort(LargestToSmallestScaleFunctor()); | 93 std::sort(tilings_.begin(), tilings_.end(), |
| 94 LargestToSmallestScaleFunctor()); | |
| 95 } | |
| 92 } | 96 } |
| 93 | 97 |
| 94 void PictureLayerTilingSet::UpdateTilingsToCurrentRasterSourceForActivation( | 98 void PictureLayerTilingSet::UpdateTilingsToCurrentRasterSourceForActivation( |
| 95 scoped_refptr<DisplayListRasterSource> raster_source, | 99 scoped_refptr<DisplayListRasterSource> raster_source, |
| 96 const PictureLayerTilingSet* pending_twin_set, | 100 const PictureLayerTilingSet* pending_twin_set, |
| 97 const Region& layer_invalidation, | 101 const Region& layer_invalidation, |
| 98 float minimum_contents_scale, | 102 float minimum_contents_scale, |
| 99 float maximum_contents_scale) { | 103 float maximum_contents_scale) { |
| 100 RemoveTilingsBelowScale(minimum_contents_scale); | 104 RemoveTilingsBelowScale(minimum_contents_scale); |
| 101 RemoveTilingsAboveScale(maximum_contents_scale); | 105 RemoveTilingsAboveScale(maximum_contents_scale); |
| 102 | 106 |
| 103 // Copy over tilings that are shared with the |pending_twin_set| tiling set. | 107 // Copy over tilings that are shared with the |pending_twin_set| tiling set. |
| 104 // Also, copy all of the properties from twin tilings. | 108 // Also, copy all of the properties from twin tilings. |
| 105 CopyTilingsAndPropertiesFromPendingTwin(pending_twin_set, raster_source, | 109 CopyTilingsAndPropertiesFromPendingTwin(pending_twin_set, raster_source, |
| 106 layer_invalidation); | 110 layer_invalidation); |
| 107 | 111 |
| 108 // If the tiling is not shared (FindTilingWithScale returns nullptr), then | 112 // If the tiling is not shared (FindTilingWithScale returns nullptr), then |
| 109 // invalidate tiles and update them to the new raster source. | 113 // invalidate tiles and update them to the new raster source. |
| 110 for (PictureLayerTiling* tiling : tilings_) { | 114 for (const scoped_ptr<PictureLayerTiling>& tiling : tilings_) { |
|
danakj
2015/11/17 01:12:18
auto
vmpstr
2015/11/17 23:26:24
Done.
| |
| 111 if (pending_twin_set->FindTilingWithScale(tiling->contents_scale())) | 115 if (pending_twin_set->FindTilingWithScale(tiling->contents_scale())) |
| 112 continue; | 116 continue; |
| 113 | 117 |
| 114 tiling->SetRasterSourceAndResize(raster_source); | 118 tiling->SetRasterSourceAndResize(raster_source); |
| 115 tiling->Invalidate(layer_invalidation); | 119 tiling->Invalidate(layer_invalidation); |
| 116 // This is needed for cases where the live tiles rect didn't change but | 120 // This is needed for cases where the live tiles rect didn't change but |
| 117 // recordings exist in the raster source that did not exist on the last | 121 // recordings exist in the raster source that did not exist on the last |
| 118 // raster source. | 122 // raster source. |
| 119 tiling->CreateMissingTilesInLiveTilesRect(); | 123 tiling->CreateMissingTilesInLiveTilesRect(); |
| 120 | 124 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 132 | 136 |
| 133 void PictureLayerTilingSet::UpdateTilingsToCurrentRasterSourceForCommit( | 137 void PictureLayerTilingSet::UpdateTilingsToCurrentRasterSourceForCommit( |
| 134 scoped_refptr<DisplayListRasterSource> raster_source, | 138 scoped_refptr<DisplayListRasterSource> raster_source, |
| 135 const Region& layer_invalidation, | 139 const Region& layer_invalidation, |
| 136 float minimum_contents_scale, | 140 float minimum_contents_scale, |
| 137 float maximum_contents_scale) { | 141 float maximum_contents_scale) { |
| 138 RemoveTilingsBelowScale(minimum_contents_scale); | 142 RemoveTilingsBelowScale(minimum_contents_scale); |
| 139 RemoveTilingsAboveScale(maximum_contents_scale); | 143 RemoveTilingsAboveScale(maximum_contents_scale); |
| 140 | 144 |
| 141 // Invalidate tiles and update them to the new raster source. | 145 // Invalidate tiles and update them to the new raster source. |
| 142 for (PictureLayerTiling* tiling : tilings_) { | 146 for (const scoped_ptr<PictureLayerTiling>& tiling : tilings_) { |
|
danakj
2015/11/17 01:12:18
auto
vmpstr
2015/11/17 23:26:24
Done.
| |
| 143 DCHECK(tree_ != PENDING_TREE || !tiling->has_tiles()); | 147 DCHECK(tree_ != PENDING_TREE || !tiling->has_tiles()); |
| 144 tiling->SetRasterSourceAndResize(raster_source); | 148 tiling->SetRasterSourceAndResize(raster_source); |
| 145 | 149 |
| 146 // We can commit on either active or pending trees, but only active one can | 150 // We can commit on either active or pending trees, but only active one can |
| 147 // have tiles at this point. | 151 // have tiles at this point. |
| 148 if (tree_ == ACTIVE_TREE) | 152 if (tree_ == ACTIVE_TREE) |
| 149 tiling->Invalidate(layer_invalidation); | 153 tiling->Invalidate(layer_invalidation); |
| 150 | 154 |
| 151 // This is needed for cases where the live tiles rect didn't change but | 155 // This is needed for cases where the live tiles rect didn't change but |
| 152 // recordings exist in the raster source that did not exist on the last | 156 // recordings exist in the raster source that did not exist on the last |
| 153 // raster source. | 157 // raster source. |
| 154 tiling->CreateMissingTilesInLiveTilesRect(); | 158 tiling->CreateMissingTilesInLiveTilesRect(); |
| 155 } | 159 } |
| 156 VerifyTilings(nullptr /* pending_twin_set */); | 160 VerifyTilings(nullptr /* pending_twin_set */); |
| 157 } | 161 } |
| 158 | 162 |
| 159 void PictureLayerTilingSet::UpdateRasterSourceDueToLCDChange( | 163 void PictureLayerTilingSet::UpdateRasterSourceDueToLCDChange( |
| 160 const scoped_refptr<DisplayListRasterSource>& raster_source, | 164 const scoped_refptr<DisplayListRasterSource>& raster_source, |
| 161 const Region& layer_invalidation) { | 165 const Region& layer_invalidation) { |
| 162 for (PictureLayerTiling* tiling : tilings_) { | 166 for (const scoped_ptr<PictureLayerTiling>& tiling : tilings_) { |
|
danakj
2015/11/17 01:12:18
auto
vmpstr
2015/11/17 23:26:24
Done.
| |
| 163 tiling->SetRasterSourceAndResize(raster_source); | 167 tiling->SetRasterSourceAndResize(raster_source); |
| 164 tiling->Invalidate(layer_invalidation); | 168 tiling->Invalidate(layer_invalidation); |
| 165 // Since the invalidation changed, we need to create any missing tiles in | 169 // Since the invalidation changed, we need to create any missing tiles in |
| 166 // the live tiles rect again. | 170 // the live tiles rect again. |
| 167 tiling->CreateMissingTilesInLiveTilesRect(); | 171 tiling->CreateMissingTilesInLiveTilesRect(); |
| 168 } | 172 } |
| 169 } | 173 } |
| 170 | 174 |
| 171 void PictureLayerTilingSet::VerifyTilings( | 175 void PictureLayerTilingSet::VerifyTilings( |
| 172 const PictureLayerTilingSet* pending_twin_set) const { | 176 const PictureLayerTilingSet* pending_twin_set) const { |
| 173 #if DCHECK_IS_ON() | 177 #if DCHECK_IS_ON() |
| 174 for (PictureLayerTiling* tiling : tilings_) { | 178 for (const scoped_ptr<PictureLayerTiling>& tiling : tilings_) { |
|
danakj
2015/11/17 01:12:18
auto
vmpstr
2015/11/17 23:26:24
Done.
| |
| 175 DCHECK(tiling->tile_size() == | 179 DCHECK(tiling->tile_size() == |
| 176 client_->CalculateTileSize(tiling->tiling_size())) | 180 client_->CalculateTileSize(tiling->tiling_size())) |
| 177 << "tile_size: " << tiling->tile_size().ToString() | 181 << "tile_size: " << tiling->tile_size().ToString() |
| 178 << " tiling_size: " << tiling->tiling_size().ToString() | 182 << " tiling_size: " << tiling->tiling_size().ToString() |
| 179 << " CalculateTileSize: " | 183 << " CalculateTileSize: " |
| 180 << client_->CalculateTileSize(tiling->tiling_size()).ToString(); | 184 << client_->CalculateTileSize(tiling->tiling_size()).ToString(); |
| 181 } | 185 } |
| 182 | 186 |
| 183 if (!tilings_.empty()) { | 187 if (!tilings_.empty()) { |
| 184 DCHECK_LE(NumHighResTilings(), 1); | 188 DCHECK_LE(NumHighResTilings(), 1); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 195 } | 199 } |
| 196 #endif | 200 #endif |
| 197 } | 201 } |
| 198 | 202 |
| 199 void PictureLayerTilingSet::CleanUpTilings( | 203 void PictureLayerTilingSet::CleanUpTilings( |
| 200 float min_acceptable_high_res_scale, | 204 float min_acceptable_high_res_scale, |
| 201 float max_acceptable_high_res_scale, | 205 float max_acceptable_high_res_scale, |
| 202 const std::vector<PictureLayerTiling*>& needed_tilings, | 206 const std::vector<PictureLayerTiling*>& needed_tilings, |
| 203 PictureLayerTilingSet* twin_set) { | 207 PictureLayerTilingSet* twin_set) { |
| 204 std::vector<PictureLayerTiling*> to_remove; | 208 std::vector<PictureLayerTiling*> to_remove; |
| 205 for (auto* tiling : tilings_) { | 209 for (const scoped_ptr<PictureLayerTiling>& tiling : tilings_) { |
|
danakj
2015/11/17 01:12:18
auto
vmpstr
2015/11/17 23:26:25
Done.
| |
| 206 // Keep all tilings within the min/max scales. | 210 // Keep all tilings within the min/max scales. |
| 207 if (tiling->contents_scale() >= min_acceptable_high_res_scale && | 211 if (tiling->contents_scale() >= min_acceptable_high_res_scale && |
| 208 tiling->contents_scale() <= max_acceptable_high_res_scale) { | 212 tiling->contents_scale() <= max_acceptable_high_res_scale) { |
| 209 continue; | 213 continue; |
| 210 } | 214 } |
| 211 | 215 |
| 212 // Keep low resolution tilings. | 216 // Keep low resolution tilings. |
| 213 if (tiling->resolution() == LOW_RESOLUTION) | 217 if (tiling->resolution() == LOW_RESOLUTION) |
| 214 continue; | 218 continue; |
| 215 | 219 |
| 216 // Don't remove tilings that are required. | 220 // Don't remove tilings that are required. |
| 217 if (std::find(needed_tilings.begin(), needed_tilings.end(), tiling) != | 221 if (std::find(needed_tilings.begin(), needed_tilings.end(), tiling) != |
| 218 needed_tilings.end()) { | 222 needed_tilings.end()) { |
| 219 continue; | 223 continue; |
| 220 } | 224 } |
| 221 | 225 |
| 222 to_remove.push_back(tiling); | 226 to_remove.push_back(tiling.get()); |
| 223 } | 227 } |
| 224 | 228 |
| 225 for (auto* tiling : to_remove) { | 229 for (auto* tiling : to_remove) { |
| 226 DCHECK_NE(HIGH_RESOLUTION, tiling->resolution()); | 230 DCHECK_NE(HIGH_RESOLUTION, tiling->resolution()); |
| 227 Remove(tiling); | 231 Remove(tiling); |
| 228 } | 232 } |
| 229 } | 233 } |
| 230 | 234 |
| 231 void PictureLayerTilingSet::RemoveNonIdealTilings() { | 235 void PictureLayerTilingSet::RemoveNonIdealTilings() { |
| 232 auto to_remove = tilings_.remove_if([](PictureLayerTiling* t) { | 236 auto to_remove = |
| 233 return t->resolution() == NON_IDEAL_RESOLUTION; | 237 std::remove_if(tilings_.begin(), tilings_.end(), |
| 234 }); | 238 [](const scoped_ptr<PictureLayerTiling>& t) { |
| 239 return t->resolution() == NON_IDEAL_RESOLUTION; | |
| 240 }); | |
| 235 tilings_.erase(to_remove, tilings_.end()); | 241 tilings_.erase(to_remove, tilings_.end()); |
| 236 } | 242 } |
| 237 | 243 |
| 238 void PictureLayerTilingSet::MarkAllTilingsNonIdeal() { | 244 void PictureLayerTilingSet::MarkAllTilingsNonIdeal() { |
| 239 for (auto* tiling : tilings_) | 245 for (const scoped_ptr<PictureLayerTiling>& tiling : tilings_) |
|
danakj
2015/11/17 01:12:18
auto
vmpstr
2015/11/17 23:26:25
Done.
| |
| 240 tiling->set_resolution(NON_IDEAL_RESOLUTION); | 246 tiling->set_resolution(NON_IDEAL_RESOLUTION); |
| 241 } | 247 } |
| 242 | 248 |
| 243 PictureLayerTiling* PictureLayerTilingSet::AddTiling( | 249 PictureLayerTiling* PictureLayerTilingSet::AddTiling( |
| 244 float contents_scale, | 250 float contents_scale, |
| 245 scoped_refptr<DisplayListRasterSource> raster_source) { | 251 scoped_refptr<DisplayListRasterSource> raster_source) { |
| 246 for (size_t i = 0; i < tilings_.size(); ++i) { | 252 for (size_t i = 0; i < tilings_.size(); ++i) { |
| 247 DCHECK_NE(tilings_[i]->contents_scale(), contents_scale); | 253 DCHECK_NE(tilings_[i]->contents_scale(), contents_scale); |
| 248 DCHECK_EQ(tilings_[i]->raster_source(), raster_source.get()); | 254 DCHECK_EQ(tilings_[i]->raster_source(), raster_source.get()); |
| 249 } | 255 } |
| 250 | 256 |
| 251 tilings_.push_back(PictureLayerTiling::Create( | 257 tilings_.push_back(PictureLayerTiling::Create( |
| 252 tree_, contents_scale, raster_source, client_, | 258 tree_, contents_scale, raster_source, client_, |
| 253 tiling_interest_area_padding_, skewport_target_time_in_seconds_, | 259 tiling_interest_area_padding_, skewport_target_time_in_seconds_, |
| 254 skewport_extrapolation_limit_in_content_pixels_)); | 260 skewport_extrapolation_limit_in_content_pixels_)); |
| 255 PictureLayerTiling* appended = tilings_.back(); | 261 PictureLayerTiling* appended = tilings_.back().get(); |
| 256 | 262 |
| 257 tilings_.sort(LargestToSmallestScaleFunctor()); | 263 std::sort(tilings_.begin(), tilings_.end(), LargestToSmallestScaleFunctor()); |
| 258 return appended; | 264 return appended; |
| 259 } | 265 } |
| 260 | 266 |
| 261 int PictureLayerTilingSet::NumHighResTilings() const { | 267 int PictureLayerTilingSet::NumHighResTilings() const { |
| 262 return std::count_if(tilings_.begin(), tilings_.end(), | 268 return std::count_if(tilings_.begin(), tilings_.end(), |
| 263 [](PictureLayerTiling* tiling) { | 269 [](const scoped_ptr<PictureLayerTiling>& tiling) { |
| 264 return tiling->resolution() == HIGH_RESOLUTION; | 270 return tiling->resolution() == HIGH_RESOLUTION; |
| 265 }); | 271 }); |
| 266 } | 272 } |
| 267 | 273 |
| 268 PictureLayerTiling* PictureLayerTilingSet::FindTilingWithScale( | 274 PictureLayerTiling* PictureLayerTilingSet::FindTilingWithScale( |
| 269 float scale) const { | 275 float scale) const { |
| 270 for (size_t i = 0; i < tilings_.size(); ++i) { | 276 for (size_t i = 0; i < tilings_.size(); ++i) { |
| 271 if (tilings_[i]->contents_scale() == scale) | 277 if (tilings_[i]->contents_scale() == scale) |
| 272 return tilings_[i]; | 278 return tilings_[i].get(); |
| 273 } | 279 } |
| 274 return NULL; | 280 return nullptr; |
|
danakj
2015/11/17 01:12:18
thx
vmpstr
2015/11/17 23:26:24
Done.
| |
| 275 } | 281 } |
| 276 | 282 |
| 277 PictureLayerTiling* PictureLayerTilingSet::FindTilingWithResolution( | 283 PictureLayerTiling* PictureLayerTilingSet::FindTilingWithResolution( |
| 278 TileResolution resolution) const { | 284 TileResolution resolution) const { |
| 279 auto iter = std::find_if(tilings_.begin(), tilings_.end(), | 285 auto iter = |
| 280 [resolution](const PictureLayerTiling* tiling) { | 286 std::find_if(tilings_.begin(), tilings_.end(), |
| 281 return tiling->resolution() == resolution; | 287 [resolution](const scoped_ptr<PictureLayerTiling>& tiling) { |
| 282 }); | 288 return tiling->resolution() == resolution; |
| 289 }); | |
| 283 if (iter == tilings_.end()) | 290 if (iter == tilings_.end()) |
| 284 return NULL; | 291 return nullptr; |
| 285 return *iter; | 292 return iter->get(); |
| 286 } | 293 } |
| 287 | 294 |
| 288 void PictureLayerTilingSet::RemoveTilingsBelowScale(float minimum_scale) { | 295 void PictureLayerTilingSet::RemoveTilingsBelowScale(float minimum_scale) { |
| 289 auto to_remove = | 296 auto to_remove = std::remove_if( |
| 290 tilings_.remove_if([minimum_scale](PictureLayerTiling* tiling) { | 297 tilings_.begin(), tilings_.end(), |
| 298 [minimum_scale](const scoped_ptr<PictureLayerTiling>& tiling) { | |
| 291 return tiling->contents_scale() < minimum_scale; | 299 return tiling->contents_scale() < minimum_scale; |
| 292 }); | 300 }); |
| 293 tilings_.erase(to_remove, tilings_.end()); | 301 tilings_.erase(to_remove, tilings_.end()); |
| 294 } | 302 } |
| 295 | 303 |
| 296 void PictureLayerTilingSet::RemoveTilingsAboveScale(float maximum_scale) { | 304 void PictureLayerTilingSet::RemoveTilingsAboveScale(float maximum_scale) { |
| 297 auto to_remove = | 305 auto to_remove = std::remove_if( |
| 298 tilings_.remove_if([maximum_scale](PictureLayerTiling* tiling) { | 306 tilings_.begin(), tilings_.end(), |
| 307 [maximum_scale](const scoped_ptr<PictureLayerTiling>& tiling) { | |
| 299 return tiling->contents_scale() > maximum_scale; | 308 return tiling->contents_scale() > maximum_scale; |
| 300 }); | 309 }); |
| 301 tilings_.erase(to_remove, tilings_.end()); | 310 tilings_.erase(to_remove, tilings_.end()); |
| 302 } | 311 } |
| 303 | 312 |
| 304 void PictureLayerTilingSet::RemoveAllTilings() { | 313 void PictureLayerTilingSet::RemoveAllTilings() { |
| 305 tilings_.clear(); | 314 tilings_.clear(); |
| 306 } | 315 } |
| 307 | 316 |
| 308 void PictureLayerTilingSet::Remove(PictureLayerTiling* tiling) { | 317 void PictureLayerTilingSet::Remove(PictureLayerTiling* tiling) { |
| 309 ScopedPtrVector<PictureLayerTiling>::iterator iter = | 318 std::vector<scoped_ptr<PictureLayerTiling>>::iterator iter = |
| 310 std::find(tilings_.begin(), tilings_.end(), tiling); | 319 std::find_if(tilings_.begin(), tilings_.end(), |
| 320 [tiling](const scoped_ptr<PictureLayerTiling>& candidate) { | |
| 321 return candidate.get() == tiling; | |
| 322 }); | |
| 311 if (iter == tilings_.end()) | 323 if (iter == tilings_.end()) |
| 312 return; | 324 return; |
| 313 tilings_.erase(iter); | 325 tilings_.erase(iter); |
| 314 } | 326 } |
| 315 | 327 |
| 316 void PictureLayerTilingSet::RemoveAllTiles() { | 328 void PictureLayerTilingSet::RemoveAllTiles() { |
| 317 for (size_t i = 0; i < tilings_.size(); ++i) | 329 for (size_t i = 0; i < tilings_.size(); ++i) |
| 318 tilings_[i]->Reset(); | 330 tilings_[i]->Reset(); |
| 319 } | 331 } |
| 320 | 332 |
| 321 float PictureLayerTilingSet::GetSnappedContentsScale( | 333 float PictureLayerTilingSet::GetSnappedContentsScale( |
| 322 float start_scale, | 334 float start_scale, |
| 323 float snap_to_existing_tiling_ratio) const { | 335 float snap_to_existing_tiling_ratio) const { |
| 324 // If a tiling exists within the max snapping ratio, snap to its scale. | 336 // If a tiling exists within the max snapping ratio, snap to its scale. |
| 325 float snapped_contents_scale = start_scale; | 337 float snapped_contents_scale = start_scale; |
| 326 float snapped_ratio = snap_to_existing_tiling_ratio; | 338 float snapped_ratio = snap_to_existing_tiling_ratio; |
| 327 for (const auto* tiling : tilings_) { | 339 for (const scoped_ptr<PictureLayerTiling>& tiling : tilings_) { |
|
danakj
2015/11/17 01:12:18
auto
vmpstr
2015/11/17 23:26:24
Done.
| |
| 328 float tiling_contents_scale = tiling->contents_scale(); | 340 float tiling_contents_scale = tiling->contents_scale(); |
| 329 float ratio = LargerRatio(tiling_contents_scale, start_scale); | 341 float ratio = LargerRatio(tiling_contents_scale, start_scale); |
| 330 if (ratio < snapped_ratio) { | 342 if (ratio < snapped_ratio) { |
| 331 snapped_contents_scale = tiling_contents_scale; | 343 snapped_contents_scale = tiling_contents_scale; |
| 332 snapped_ratio = ratio; | 344 snapped_ratio = ratio; |
| 333 } | 345 } |
| 334 } | 346 } |
| 335 return snapped_contents_scale; | 347 return snapped_contents_scale; |
| 336 } | 348 } |
| 337 | 349 |
| 338 float PictureLayerTilingSet::GetMaximumContentsScale() const { | 350 float PictureLayerTilingSet::GetMaximumContentsScale() const { |
| 339 if (tilings_.empty()) | 351 if (tilings_.empty()) |
| 340 return 0.f; | 352 return 0.f; |
| 341 // The first tiling has the largest contents scale. | 353 // The first tiling has the largest contents scale. |
| 342 return tilings_[0]->contents_scale(); | 354 return tilings_[0]->contents_scale(); |
| 343 } | 355 } |
| 344 | 356 |
| 345 bool PictureLayerTilingSet::UpdateTilePriorities( | 357 bool PictureLayerTilingSet::UpdateTilePriorities( |
| 346 const gfx::Rect& required_rect_in_layer_space, | 358 const gfx::Rect& required_rect_in_layer_space, |
| 347 float ideal_contents_scale, | 359 float ideal_contents_scale, |
| 348 double current_frame_time_in_seconds, | 360 double current_frame_time_in_seconds, |
| 349 const Occlusion& occlusion_in_layer_space, | 361 const Occlusion& occlusion_in_layer_space, |
| 350 bool can_require_tiles_for_activation) { | 362 bool can_require_tiles_for_activation) { |
| 351 bool updated = false; | 363 bool updated = false; |
| 352 for (auto* tiling : tilings_) { | 364 for (const scoped_ptr<PictureLayerTiling>& tiling : tilings_) { |
|
danakj
2015/11/17 01:12:18
auto
vmpstr
2015/11/17 23:26:24
Done.
| |
| 353 tiling->set_can_require_tiles_for_activation( | 365 tiling->set_can_require_tiles_for_activation( |
| 354 can_require_tiles_for_activation); | 366 can_require_tiles_for_activation); |
| 355 updated |= tiling->ComputeTilePriorityRects( | 367 updated |= tiling->ComputeTilePriorityRects( |
| 356 required_rect_in_layer_space, ideal_contents_scale, | 368 required_rect_in_layer_space, ideal_contents_scale, |
| 357 current_frame_time_in_seconds, occlusion_in_layer_space); | 369 current_frame_time_in_seconds, occlusion_in_layer_space); |
| 358 } | 370 } |
| 359 return updated; | 371 return updated; |
| 360 } | 372 } |
| 361 | 373 |
| 362 void PictureLayerTilingSet::GetAllPrioritizedTilesForTracing( | 374 void PictureLayerTilingSet::GetAllPrioritizedTilesForTracing( |
| 363 std::vector<PrioritizedTile>* prioritized_tiles) const { | 375 std::vector<PrioritizedTile>* prioritized_tiles) const { |
| 364 for (auto* tiling : tilings_) | 376 for (const scoped_ptr<PictureLayerTiling>& tiling : tilings_) |
|
danakj
2015/11/17 01:12:18
auto
vmpstr
2015/11/17 23:26:24
Done.
| |
| 365 tiling->GetAllPrioritizedTilesForTracing(prioritized_tiles); | 377 tiling->GetAllPrioritizedTilesForTracing(prioritized_tiles); |
| 366 } | 378 } |
| 367 | 379 |
| 368 PictureLayerTilingSet::CoverageIterator::CoverageIterator( | 380 PictureLayerTilingSet::CoverageIterator::CoverageIterator( |
| 369 const PictureLayerTilingSet* set, | 381 const PictureLayerTilingSet* set, |
| 370 float contents_scale, | 382 float contents_scale, |
| 371 const gfx::Rect& content_rect, | 383 const gfx::Rect& content_rect, |
| 372 float ideal_contents_scale) | 384 float ideal_contents_scale) |
| 373 : set_(set), | 385 : set_(set), |
| 374 contents_scale_(contents_scale), | 386 contents_scale_(contents_scale), |
| 375 ideal_contents_scale_(ideal_contents_scale), | 387 ideal_contents_scale_(ideal_contents_scale), |
| 376 current_tiling_(std::numeric_limits<size_t>::max()) { | 388 current_tiling_(std::numeric_limits<size_t>::max()) { |
| 377 missing_region_.Union(content_rect); | 389 missing_region_.Union(content_rect); |
| 378 | 390 |
| 379 size_t tilings_size = set_->tilings_.size(); | 391 size_t tilings_size = set_->tilings_.size(); |
| 380 for (ideal_tiling_ = 0; ideal_tiling_ < tilings_size; ++ideal_tiling_) { | 392 for (ideal_tiling_ = 0; ideal_tiling_ < tilings_size; ++ideal_tiling_) { |
| 381 PictureLayerTiling* tiling = set_->tilings_[ideal_tiling_]; | 393 PictureLayerTiling* tiling = set_->tilings_[ideal_tiling_].get(); |
| 382 if (tiling->contents_scale() < ideal_contents_scale_) { | 394 if (tiling->contents_scale() < ideal_contents_scale_) { |
| 383 if (ideal_tiling_ > 0) | 395 if (ideal_tiling_ > 0) |
| 384 ideal_tiling_--; | 396 ideal_tiling_--; |
| 385 break; | 397 break; |
| 386 } | 398 } |
| 387 } | 399 } |
| 388 | 400 |
| 389 if (ideal_tiling_ == tilings_size && ideal_tiling_ > 0) | 401 if (ideal_tiling_ == tilings_size && ideal_tiling_ > 0) |
| 390 ideal_tiling_--; | 402 ideal_tiling_--; |
| 391 | 403 |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 405 } | 417 } |
| 406 | 418 |
| 407 gfx::RectF PictureLayerTilingSet::CoverageIterator::texture_rect() const { | 419 gfx::RectF PictureLayerTilingSet::CoverageIterator::texture_rect() const { |
| 408 if (!tiling_iter_) | 420 if (!tiling_iter_) |
| 409 return gfx::RectF(); | 421 return gfx::RectF(); |
| 410 return tiling_iter_.texture_rect(); | 422 return tiling_iter_.texture_rect(); |
| 411 } | 423 } |
| 412 | 424 |
| 413 Tile* PictureLayerTilingSet::CoverageIterator::operator->() const { | 425 Tile* PictureLayerTilingSet::CoverageIterator::operator->() const { |
| 414 if (!tiling_iter_) | 426 if (!tiling_iter_) |
| 415 return NULL; | 427 return nullptr; |
| 416 return *tiling_iter_; | 428 return *tiling_iter_; |
| 417 } | 429 } |
| 418 | 430 |
| 419 Tile* PictureLayerTilingSet::CoverageIterator::operator*() const { | 431 Tile* PictureLayerTilingSet::CoverageIterator::operator*() const { |
| 420 if (!tiling_iter_) | 432 if (!tiling_iter_) |
| 421 return NULL; | 433 return nullptr; |
| 422 return *tiling_iter_; | 434 return *tiling_iter_; |
| 423 } | 435 } |
| 424 | 436 |
| 425 TileResolution PictureLayerTilingSet::CoverageIterator::resolution() const { | 437 TileResolution PictureLayerTilingSet::CoverageIterator::resolution() const { |
| 426 const PictureLayerTiling* tiling = CurrentTiling(); | 438 const PictureLayerTiling* tiling = CurrentTiling(); |
| 427 DCHECK(tiling); | 439 DCHECK(tiling); |
| 428 return tiling->resolution(); | 440 return tiling->resolution(); |
| 429 } | 441 } |
| 430 | 442 |
| 431 PictureLayerTiling* PictureLayerTilingSet::CoverageIterator::CurrentTiling() | 443 PictureLayerTiling* PictureLayerTilingSet::CoverageIterator::CurrentTiling() |
| 432 const { | 444 const { |
| 433 if (current_tiling_ == std::numeric_limits<size_t>::max()) | 445 if (current_tiling_ == std::numeric_limits<size_t>::max()) |
| 434 return NULL; | 446 return nullptr; |
| 435 if (current_tiling_ >= set_->tilings_.size()) | 447 if (current_tiling_ >= set_->tilings_.size()) |
| 436 return NULL; | 448 return nullptr; |
| 437 return set_->tilings_[current_tiling_]; | 449 return set_->tilings_[current_tiling_].get(); |
| 438 } | 450 } |
| 439 | 451 |
| 440 size_t PictureLayerTilingSet::CoverageIterator::NextTiling() const { | 452 size_t PictureLayerTilingSet::CoverageIterator::NextTiling() const { |
| 441 // Order returned by this method is: | 453 // Order returned by this method is: |
| 442 // 1. Ideal tiling index | 454 // 1. Ideal tiling index |
| 443 // 2. Tiling index < Ideal in decreasing order (higher res than ideal) | 455 // 2. Tiling index < Ideal in decreasing order (higher res than ideal) |
| 444 // 3. Tiling index > Ideal in increasing order (lower res than ideal) | 456 // 3. Tiling index > Ideal in increasing order (lower res than ideal) |
| 445 // 4. Tiling index > tilings.size() (invalid index) | 457 // 4. Tiling index > tilings.size() (invalid index) |
| 446 if (current_tiling_ == std::numeric_limits<size_t>::max()) | 458 if (current_tiling_ == std::numeric_limits<size_t>::max()) |
| 447 return ideal_tiling_; | 459 return ideal_tiling_; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 498 gfx::Rect last_rect = region_iter_.rect(); | 510 gfx::Rect last_rect = region_iter_.rect(); |
| 499 region_iter_.next(); | 511 region_iter_.next(); |
| 500 | 512 |
| 501 // Done, found next checkerboard rect to return. | 513 // Done, found next checkerboard rect to return. |
| 502 if (current_tiling_ >= set_->tilings_.size()) | 514 if (current_tiling_ >= set_->tilings_.size()) |
| 503 return *this; | 515 return *this; |
| 504 | 516 |
| 505 // Construct a new iterator for the next tiling, but we need to loop | 517 // Construct a new iterator for the next tiling, but we need to loop |
| 506 // again until we get to a valid one. | 518 // again until we get to a valid one. |
| 507 tiling_iter_ = PictureLayerTiling::CoverageIterator( | 519 tiling_iter_ = PictureLayerTiling::CoverageIterator( |
| 508 set_->tilings_[current_tiling_], | 520 set_->tilings_[current_tiling_].get(), contents_scale_, last_rect); |
| 509 contents_scale_, | |
| 510 last_rect); | |
| 511 } | 521 } |
| 512 | 522 |
| 513 return *this; | 523 return *this; |
| 514 } | 524 } |
| 515 | 525 |
| 516 PictureLayerTilingSet::CoverageIterator::operator bool() const { | 526 PictureLayerTilingSet::CoverageIterator::operator bool() const { |
| 517 return current_tiling_ < set_->tilings_.size() || region_iter_.has_rect(); | 527 return current_tiling_ < set_->tilings_.size() || region_iter_.has_rect(); |
| 518 } | 528 } |
| 519 | 529 |
| 520 void PictureLayerTilingSet::AsValueInto( | 530 void PictureLayerTilingSet::AsValueInto( |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 535 | 545 |
| 536 PictureLayerTilingSet::TilingRange PictureLayerTilingSet::GetTilingRange( | 546 PictureLayerTilingSet::TilingRange PictureLayerTilingSet::GetTilingRange( |
| 537 TilingRangeType type) const { | 547 TilingRangeType type) const { |
| 538 // Doesn't seem to be the case right now but if it ever becomes a performance | 548 // Doesn't seem to be the case right now but if it ever becomes a performance |
| 539 // problem to compute these ranges each time this function is called, we can | 549 // problem to compute these ranges each time this function is called, we can |
| 540 // compute them only when the tiling set has changed instead. | 550 // compute them only when the tiling set has changed instead. |
| 541 size_t tilings_size = tilings_.size(); | 551 size_t tilings_size = tilings_.size(); |
| 542 TilingRange high_res_range(0, 0); | 552 TilingRange high_res_range(0, 0); |
| 543 TilingRange low_res_range(tilings_.size(), tilings_.size()); | 553 TilingRange low_res_range(tilings_.size(), tilings_.size()); |
| 544 for (size_t i = 0; i < tilings_size; ++i) { | 554 for (size_t i = 0; i < tilings_size; ++i) { |
| 545 const PictureLayerTiling* tiling = tilings_[i]; | 555 const PictureLayerTiling* tiling = tilings_[i].get(); |
| 546 if (tiling->resolution() == HIGH_RESOLUTION) | 556 if (tiling->resolution() == HIGH_RESOLUTION) |
| 547 high_res_range = TilingRange(i, i + 1); | 557 high_res_range = TilingRange(i, i + 1); |
| 548 if (tiling->resolution() == LOW_RESOLUTION) | 558 if (tiling->resolution() == LOW_RESOLUTION) |
| 549 low_res_range = TilingRange(i, i + 1); | 559 low_res_range = TilingRange(i, i + 1); |
| 550 } | 560 } |
| 551 | 561 |
| 552 TilingRange range(0, 0); | 562 TilingRange range(0, 0); |
| 553 switch (type) { | 563 switch (type) { |
| 554 case HIGHER_THAN_HIGH_RES: | 564 case HIGHER_THAN_HIGH_RES: |
| 555 range = TilingRange(0, high_res_range.start); | 565 range = TilingRange(0, high_res_range.start); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 575 case LOWER_THAN_LOW_RES: | 585 case LOWER_THAN_LOW_RES: |
| 576 range = TilingRange(low_res_range.end, tilings_size); | 586 range = TilingRange(low_res_range.end, tilings_size); |
| 577 break; | 587 break; |
| 578 } | 588 } |
| 579 | 589 |
| 580 DCHECK_LE(range.start, range.end); | 590 DCHECK_LE(range.start, range.end); |
| 581 return range; | 591 return range; |
| 582 } | 592 } |
| 583 | 593 |
| 584 } // namespace cc | 594 } // namespace cc |
| OLD | NEW |