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