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/picture_layer_impl.h" | 5 #include "cc/picture_layer_impl.h" |
6 | 6 |
7 #include "base/time.h" | 7 #include "base/time.h" |
8 #include "cc/append_quads_data.h" | 8 #include "cc/append_quads_data.h" |
9 #include "cc/checkerboard_draw_quad.h" | 9 #include "cc/checkerboard_draw_quad.h" |
10 #include "cc/debug_border_draw_quad.h" | 10 #include "cc/debug_border_draw_quad.h" |
11 #include "cc/debug_colors.h" | 11 #include "cc/debug_colors.h" |
12 #include "cc/layer_tree_impl.h" | 12 #include "cc/layer_tree_impl.h" |
13 #include "cc/math_util.h" | 13 #include "cc/math_util.h" |
14 #include "cc/quad_sink.h" | 14 #include "cc/quad_sink.h" |
15 #include "cc/solid_color_draw_quad.h" | 15 #include "cc/solid_color_draw_quad.h" |
16 #include "cc/tile_draw_quad.h" | 16 #include "cc/tile_draw_quad.h" |
17 #include "ui/gfx/quad_f.h" | 17 #include "ui/gfx/quad_f.h" |
18 #include "ui/gfx/size_conversions.h" | 18 #include "ui/gfx/size_conversions.h" |
19 | 19 |
20 namespace { | 20 namespace { |
21 const float kMaxScaleRatioDuringPinch = 2.0f; | 21 const float kMaxScaleRatioDuringPinch = 2.0f; |
22 } | 22 } |
23 | 23 |
24 namespace cc { | 24 namespace cc { |
25 | 25 |
26 PictureLayerImpl::PictureLayerImpl(LayerTreeImpl* treeImpl, int id) | 26 PictureLayerImpl::PictureLayerImpl(LayerTreeImpl* treeImpl, int id) |
27 : LayerImpl(treeImpl, id), | 27 : LayerImpl(treeImpl, id), |
28 tilings_(this), | |
29 pile_(PicturePileImpl::Create()), | 28 pile_(PicturePileImpl::Create()), |
30 last_update_time_(0), | 29 last_update_time_(0), |
31 last_content_scale_(0), | 30 last_content_scale_(0), |
32 ideal_contents_scale_(0), | 31 ideal_contents_scale_(0), |
33 is_mask_(false) { | 32 is_mask_(false) { |
34 } | 33 } |
35 | 34 |
36 PictureLayerImpl::~PictureLayerImpl() { | 35 PictureLayerImpl::~PictureLayerImpl() { |
37 } | 36 } |
38 | 37 |
39 const char* PictureLayerImpl::layerTypeAsString() const { | 38 const char* PictureLayerImpl::layerTypeAsString() const { |
40 return "PictureLayer"; | 39 return "PictureLayer"; |
41 } | 40 } |
42 | 41 |
| 42 scoped_ptr<LayerImpl> PictureLayerImpl::createLayerImpl( |
| 43 LayerTreeImpl* treeImpl) { |
| 44 return PictureLayerImpl::create(treeImpl, id()).PassAs<LayerImpl>(); |
| 45 } |
| 46 |
| 47 void PictureLayerImpl::CreateTilingSet() { |
| 48 DCHECK(layerTreeImpl()->IsPendingTree()); |
| 49 DCHECK(!tilings_); |
| 50 tilings_.reset(new PictureLayerTilingSet(this)); |
| 51 tilings_->SetLayerBounds(bounds()); |
| 52 } |
| 53 |
| 54 void PictureLayerImpl::TransferTilingSet(scoped_ptr<PictureLayerTilingSet> tilin
gs) { |
| 55 DCHECK(layerTreeImpl()->IsActiveTree()); |
| 56 tilings->SetClient(this); |
| 57 tilings_ = tilings.Pass(); |
| 58 } |
| 59 |
| 60 void PictureLayerImpl::pushPropertiesTo(LayerImpl* base_layer) { |
| 61 LayerImpl::pushPropertiesTo(base_layer); |
| 62 |
| 63 PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer); |
| 64 |
| 65 layer_impl->SetIsMask(is_mask_); |
| 66 layer_impl->TransferTilingSet(tilings_.Pass()); |
| 67 layer_impl->pile_ = pile_; |
| 68 pile_ = PicturePileImpl::Create(); |
| 69 } |
| 70 |
| 71 |
43 void PictureLayerImpl::appendQuads(QuadSink& quadSink, | 72 void PictureLayerImpl::appendQuads(QuadSink& quadSink, |
44 AppendQuadsData& appendQuadsData) { | 73 AppendQuadsData& appendQuadsData) { |
45 const gfx::Rect& rect = visibleContentRect(); | 74 const gfx::Rect& rect = visibleContentRect(); |
46 gfx::Rect content_rect(gfx::Point(), contentBounds()); | 75 gfx::Rect content_rect(gfx::Point(), contentBounds()); |
47 | 76 |
48 SharedQuadState* sharedQuadState = | 77 SharedQuadState* sharedQuadState = |
49 quadSink.useSharedQuadState(createSharedQuadState()); | 78 quadSink.useSharedQuadState(createSharedQuadState()); |
50 bool clipped = false; | 79 bool clipped = false; |
51 gfx::QuadF target_quad = MathUtil::mapQuad( | 80 gfx::QuadF target_quad = MathUtil::mapQuad( |
52 drawTransform(), | 81 drawTransform(), |
53 gfx::QuadF(rect), | 82 gfx::QuadF(rect), |
54 clipped); | 83 clipped); |
55 bool isAxisAlignedInTarget = !clipped && target_quad.IsRectilinear(); | 84 bool isAxisAlignedInTarget = !clipped && target_quad.IsRectilinear(); |
56 bool useAA = !isAxisAlignedInTarget; | 85 bool useAA = !isAxisAlignedInTarget; |
57 | 86 |
58 if (showDebugBorders()) { | 87 if (showDebugBorders()) { |
59 for (PictureLayerTilingSet::Iterator iter(&tilings_, | 88 for (PictureLayerTilingSet::Iterator iter(tilings_.get(), |
60 contentsScaleX(), | 89 contentsScaleX(), |
61 rect, | 90 rect, |
62 ideal_contents_scale_); | 91 ideal_contents_scale_); |
63 iter; | 92 iter; |
64 ++iter) { | 93 ++iter) { |
65 SkColor color; | 94 SkColor color; |
66 float width; | 95 float width; |
67 if (*iter && iter->GetResourceId()) { | 96 if (*iter && iter->GetResourceId()) { |
68 color = DebugColors::TileBorderColor(); | 97 color = DebugColors::TileBorderColor(); |
69 width = DebugColors::TileBorderWidth(layerTreeImpl()); | 98 width = DebugColors::TileBorderWidth(layerTreeImpl()); |
70 } else { | 99 } else { |
71 color = DebugColors::MissingTileBorderColor(); | 100 color = DebugColors::MissingTileBorderColor(); |
72 width = DebugColors::MissingTileBorderWidth(layerTreeImpl()); | 101 width = DebugColors::MissingTileBorderWidth(layerTreeImpl()); |
73 } | 102 } |
74 | 103 |
75 scoped_ptr<DebugBorderDrawQuad> debugBorderQuad = | 104 scoped_ptr<DebugBorderDrawQuad> debugBorderQuad = |
76 DebugBorderDrawQuad::Create(); | 105 DebugBorderDrawQuad::Create(); |
77 gfx::Rect geometry_rect = iter.geometry_rect(); | 106 gfx::Rect geometry_rect = iter.geometry_rect(); |
78 debugBorderQuad->SetNew(sharedQuadState, geometry_rect, color, width); | 107 debugBorderQuad->SetNew(sharedQuadState, geometry_rect, color, width); |
79 quadSink.append(debugBorderQuad.PassAs<DrawQuad>(), appendQuadsData); | 108 quadSink.append(debugBorderQuad.PassAs<DrawQuad>(), appendQuadsData); |
80 } | 109 } |
81 } | 110 } |
82 | 111 |
83 // Keep track of the tilings that were used so that tilings that are | 112 // Keep track of the tilings that were used so that tilings that are |
84 // unused can be considered for removal. | 113 // unused can be considered for removal. |
85 std::vector<PictureLayerTiling*> seen_tilings; | 114 std::vector<PictureLayerTiling*> seen_tilings; |
86 | 115 |
87 for (PictureLayerTilingSet::Iterator iter(&tilings_, | 116 for (PictureLayerTilingSet::Iterator iter(tilings_.get(), |
88 contentsScaleX(), | 117 contentsScaleX(), |
89 rect, | 118 rect, |
90 ideal_contents_scale_); | 119 ideal_contents_scale_); |
91 iter; | 120 iter; |
92 ++iter) { | 121 ++iter) { |
93 ResourceProvider::ResourceId resource = 0; | 122 ResourceProvider::ResourceId resource = 0; |
94 if (*iter) | 123 if (*iter) |
95 resource = iter->GetResourceId(); | 124 resource = iter->GetResourceId(); |
96 | 125 |
97 gfx::Rect geometry_rect = iter.geometry_rect(); | 126 gfx::Rect geometry_rect = iter.geometry_rect(); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 screenSpaceTransform(); | 184 screenSpaceTransform(); |
156 double current_time = | 185 double current_time = |
157 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); | 186 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); |
158 double time_delta = 0; | 187 double time_delta = 0; |
159 if (last_update_time_ != 0 && last_bounds_ == bounds() && | 188 if (last_update_time_ != 0 && last_bounds_ == bounds() && |
160 last_content_bounds_ == contentBounds() && | 189 last_content_bounds_ == contentBounds() && |
161 last_content_scale_ == contentsScaleX()) { | 190 last_content_scale_ == contentsScaleX()) { |
162 time_delta = current_time - last_update_time_; | 191 time_delta = current_time - last_update_time_; |
163 } | 192 } |
164 WhichTree tree = layerTreeImpl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE; | 193 WhichTree tree = layerTreeImpl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE; |
165 tilings_.UpdateTilePriorities( | 194 tilings_->UpdateTilePriorities( |
166 tree, | 195 tree, |
167 layerTreeImpl()->device_viewport_size(), | 196 layerTreeImpl()->device_viewport_size(), |
168 last_content_scale_, | 197 last_content_scale_, |
169 contentsScaleX(), | 198 contentsScaleX(), |
170 last_screen_space_transform_, | 199 last_screen_space_transform_, |
171 current_screen_space_transform, | 200 current_screen_space_transform, |
172 time_delta); | 201 time_delta); |
173 | 202 |
174 last_screen_space_transform_ = current_screen_space_transform; | 203 last_screen_space_transform_ = current_screen_space_transform; |
175 last_update_time_ = current_time; | 204 last_update_time_ = current_time; |
176 last_bounds_ = bounds(); | 205 last_bounds_ = bounds(); |
177 last_content_bounds_ = contentBounds(); | 206 last_content_bounds_ = contentBounds(); |
178 last_content_scale_ = contentsScaleX(); | 207 last_content_scale_ = contentsScaleX(); |
179 } | 208 } |
180 | 209 |
181 void PictureLayerImpl::didBecomeActive() { | 210 void PictureLayerImpl::didBecomeActive() { |
182 tilings_.DidBecomeActive(); | 211 LayerImpl::didBecomeActive(); |
| 212 tilings_->DidBecomeActive(); |
183 } | 213 } |
184 | 214 |
185 void PictureLayerImpl::didLoseOutputSurface() { | 215 void PictureLayerImpl::didLoseOutputSurface() { |
186 tilings_.RemoveAllTilings(); | 216 if (tilings_) |
| 217 tilings_->RemoveAllTilings(); |
187 } | 218 } |
188 | 219 |
189 void PictureLayerImpl::calculateContentsScale( | 220 void PictureLayerImpl::calculateContentsScale( |
190 float ideal_contents_scale, | 221 float ideal_contents_scale, |
191 float* contents_scale_x, | 222 float* contents_scale_x, |
192 float* contents_scale_y, | 223 float* contents_scale_y, |
193 gfx::Size* content_bounds) { | 224 gfx::Size* content_bounds) { |
194 if (!drawsContent()) { | 225 if (!drawsContent()) { |
195 DCHECK(!tilings_.num_tilings()); | 226 DCHECK(!tilings_->num_tilings()); |
196 return; | 227 return; |
197 } | 228 } |
198 | 229 |
199 float min_contents_scale = layerTreeImpl()->settings().minimumContentsScale; | 230 float min_contents_scale = layerTreeImpl()->settings().minimumContentsScale; |
200 ideal_contents_scale_ = std::max(ideal_contents_scale, min_contents_scale); | 231 ideal_contents_scale_ = std::max(ideal_contents_scale, min_contents_scale); |
201 | 232 |
202 ManageTilings(ideal_contents_scale_); | 233 ManageTilings(ideal_contents_scale_); |
203 | 234 |
204 // The content scale and bounds for a PictureLayerImpl is somewhat fictitious. | 235 // The content scale and bounds for a PictureLayerImpl is somewhat fictitious. |
205 // There are (usually) several tilings at different scales. However, the | 236 // There are (usually) several tilings at different scales. However, the |
206 // content bounds is the (integer!) space in which quads are generated. | 237 // content bounds is the (integer!) space in which quads are generated. |
207 // In order to guarantee that we can fill this integer space with any set of | 238 // In order to guarantee that we can fill this integer space with any set of |
208 // tilings (and then map back to floating point texture coordinates), the | 239 // tilings (and then map back to floating point texture coordinates), the |
209 // contents scale must be at least as large as the largest of the tilings. | 240 // contents scale must be at least as large as the largest of the tilings. |
210 float max_contents_scale = min_contents_scale; | 241 float max_contents_scale = min_contents_scale; |
211 for (size_t i = 0; i < tilings_.num_tilings(); ++i) { | 242 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { |
212 const PictureLayerTiling* tiling = tilings_.tiling_at(i); | 243 const PictureLayerTiling* tiling = tilings_->tiling_at(i); |
213 max_contents_scale = std::max(max_contents_scale, tiling->contents_scale()); | 244 max_contents_scale = std::max(max_contents_scale, tiling->contents_scale()); |
214 } | 245 } |
215 | 246 |
216 *contents_scale_x = max_contents_scale; | 247 *contents_scale_x = max_contents_scale; |
217 *contents_scale_y = max_contents_scale; | 248 *contents_scale_y = max_contents_scale; |
218 *content_bounds = gfx::ToCeiledSize( | 249 *content_bounds = gfx::ToCeiledSize( |
219 gfx::ScaleSize(bounds(), max_contents_scale, max_contents_scale)); | 250 gfx::ScaleSize(bounds(), max_contents_scale, max_contents_scale)); |
220 } | 251 } |
221 | 252 |
222 skia::RefPtr<SkPicture> PictureLayerImpl::getPicture() { | 253 skia::RefPtr<SkPicture> PictureLayerImpl::getPicture() { |
(...skipping 26 matching lines...) Expand all Loading... |
249 // tiles. This needs to be done last, after setting invalidation and the | 280 // tiles. This needs to be done last, after setting invalidation and the |
250 // pile. | 281 // pile. |
251 PictureLayerImpl* active_twin = static_cast<PictureLayerImpl*>( | 282 PictureLayerImpl* active_twin = static_cast<PictureLayerImpl*>( |
252 layerTreeImpl()->FindActiveTreeLayerById(id())); | 283 layerTreeImpl()->FindActiveTreeLayerById(id())); |
253 if (!active_twin) | 284 if (!active_twin) |
254 return; | 285 return; |
255 SyncFromActiveLayer(active_twin); | 286 SyncFromActiveLayer(active_twin); |
256 } | 287 } |
257 | 288 |
258 void PictureLayerImpl::SyncFromActiveLayer(const PictureLayerImpl* other) { | 289 void PictureLayerImpl::SyncFromActiveLayer(const PictureLayerImpl* other) { |
259 tilings_.CloneAll(other->tilings_, invalidation_); | 290 tilings_->CloneAll(*other->tilings_, invalidation_); |
260 DCHECK(bounds() == tilings_.LayerBounds()); | 291 DCHECK(bounds() == tilings_->LayerBounds()); |
261 } | 292 } |
262 | 293 |
263 void PictureLayerImpl::SyncTiling( | 294 void PictureLayerImpl::SyncTiling( |
264 const PictureLayerTiling* tiling) { | 295 const PictureLayerTiling* tiling) { |
265 tilings_.Clone(tiling, invalidation_); | 296 tilings_->Clone(tiling, invalidation_); |
266 } | 297 } |
267 | 298 |
268 void PictureLayerImpl::SetIsMask(bool is_mask) { | 299 void PictureLayerImpl::SetIsMask(bool is_mask) { |
269 if (is_mask_ == is_mask) | 300 if (is_mask_ == is_mask) |
270 return; | 301 return; |
271 is_mask_ = is_mask; | 302 is_mask_ = is_mask; |
272 tilings_.RemoveAllTiles(); | 303 tilings_->RemoveAllTiles(); |
273 } | 304 } |
274 | 305 |
275 ResourceProvider::ResourceId PictureLayerImpl::contentsResourceId() const { | 306 ResourceProvider::ResourceId PictureLayerImpl::contentsResourceId() const { |
276 gfx::Rect content_rect(gfx::Point(), contentBounds()); | 307 gfx::Rect content_rect(gfx::Point(), contentBounds()); |
277 float scale = contentsScaleX(); | 308 float scale = contentsScaleX(); |
278 for (PictureLayerTilingSet::Iterator iter(&tilings_, | 309 for (PictureLayerTilingSet::Iterator iter(tilings_.get(), |
279 scale, | 310 scale, |
280 content_rect, | 311 content_rect, |
281 ideal_contents_scale_); | 312 ideal_contents_scale_); |
282 iter; | 313 iter; |
283 ++iter) { | 314 ++iter) { |
284 // Mask resource not ready yet. | 315 // Mask resource not ready yet. |
285 if (!*iter || !iter->GetResourceId()) | 316 if (!*iter || !iter->GetResourceId()) |
286 return 0; | 317 return 0; |
287 // Masks only supported if they fit on exactly one tile. | 318 // Masks only supported if they fit on exactly one tile. |
288 if (iter.geometry_rect() != content_rect) | 319 if (iter.geometry_rect() != content_rect) |
289 return 0; | 320 return 0; |
290 return iter->GetResourceId(); | 321 return iter->GetResourceId(); |
291 } | 322 } |
292 return 0; | 323 return 0; |
293 } | 324 } |
294 | 325 |
295 bool PictureLayerImpl::areVisibleResourcesReady() const { | 326 bool PictureLayerImpl::areVisibleResourcesReady() const { |
296 const gfx::Rect& rect = visibleContentRect(); | 327 const gfx::Rect& rect = visibleContentRect(); |
297 | 328 |
298 for (size_t i = 0; i < tilings_.num_tilings(); ++i) { | 329 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { |
299 const PictureLayerTiling* tiling = tilings_.tiling_at(i); | 330 const PictureLayerTiling* tiling = tilings_->tiling_at(i); |
300 | 331 |
301 // Ignore non-high resolution tilings. | 332 // Ignore non-high resolution tilings. |
302 if (tiling->resolution() != HIGH_RESOLUTION) | 333 if (tiling->resolution() != HIGH_RESOLUTION) |
303 continue; | 334 continue; |
304 | 335 |
305 for (PictureLayerTiling::Iterator iter(tiling, | 336 for (PictureLayerTiling::Iterator iter(tiling, |
306 tiling->contents_scale(), | 337 tiling->contents_scale(), |
307 rect); | 338 rect); |
308 iter; | 339 iter; |
309 ++iter) { | 340 ++iter) { |
310 // Resource not ready yet. | 341 // Resource not ready yet. |
311 if (!*iter || !iter->GetResourceId()) | 342 if (!*iter || !iter->GetResourceId()) |
312 return false; | 343 return false; |
313 } | 344 } |
314 return true; | 345 return true; |
315 } | 346 } |
316 return false; | 347 return false; |
317 } | 348 } |
318 | 349 |
319 PictureLayerTiling* PictureLayerImpl::AddTiling(float contents_scale) { | 350 PictureLayerTiling* PictureLayerImpl::AddTiling(float contents_scale) { |
320 if (contents_scale < layerTreeImpl()->settings().minimumContentsScale) | 351 if (contents_scale < layerTreeImpl()->settings().minimumContentsScale) |
321 return NULL; | 352 return NULL; |
322 | 353 |
323 PictureLayerTiling* tiling = tilings_.AddTiling( | 354 PictureLayerTiling* tiling = tilings_->AddTiling( |
324 contents_scale, | 355 contents_scale, |
325 TileSize()); | 356 TileSize()); |
326 | 357 |
327 // If a new tiling is created on the active tree, sync it to the pending tree | 358 // If a new tiling is created on the active tree, sync it to the pending tree |
328 // so that it can share the same tiles. | 359 // so that it can share the same tiles. |
329 if (layerTreeImpl()->IsPendingTree()) | 360 if (layerTreeImpl()->IsPendingTree()) |
330 return tiling; | 361 return tiling; |
331 | 362 |
332 PictureLayerImpl* pending_twin = static_cast<PictureLayerImpl*>( | 363 PictureLayerImpl* pending_twin = static_cast<PictureLayerImpl*>( |
333 layerTreeImpl()->FindPendingTreeLayerById(id())); | 364 layerTreeImpl()->FindPendingTreeLayerById(id())); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 float low_res_factor = layerTreeImpl()->settings().lowResContentsScaleFactor; | 405 float low_res_factor = layerTreeImpl()->settings().lowResContentsScaleFactor; |
375 float low_res_contents_scale = ideal_contents_scale * low_res_factor; | 406 float low_res_contents_scale = ideal_contents_scale * low_res_factor; |
376 | 407 |
377 // Remove any tilings from the pending tree that don't exactly match the | 408 // Remove any tilings from the pending tree that don't exactly match the |
378 // contents scale. The pending tree should always come in crisp. However, | 409 // contents scale. The pending tree should always come in crisp. However, |
379 // don't do this during a pinch, to avoid throwing away a tiling that should | 410 // don't do this during a pinch, to avoid throwing away a tiling that should |
380 // have been kept. | 411 // have been kept. |
381 if (layerTreeImpl()->IsPendingTree() && | 412 if (layerTreeImpl()->IsPendingTree() && |
382 !layerTreeImpl()->PinchGestureActive()) { | 413 !layerTreeImpl()->PinchGestureActive()) { |
383 std::vector<PictureLayerTiling*> remove_list; | 414 std::vector<PictureLayerTiling*> remove_list; |
384 for (size_t i = 0; i < tilings_.num_tilings(); ++i) { | 415 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { |
385 PictureLayerTiling* tiling = tilings_.tiling_at(i); | 416 PictureLayerTiling* tiling = tilings_->tiling_at(i); |
386 if (tiling->contents_scale() == ideal_contents_scale) | 417 if (tiling->contents_scale() == ideal_contents_scale) |
387 continue; | 418 continue; |
388 if (tiling->contents_scale() == low_res_contents_scale) | 419 if (tiling->contents_scale() == low_res_contents_scale) |
389 continue; | 420 continue; |
390 remove_list.push_back(tiling); | 421 remove_list.push_back(tiling); |
391 } | 422 } |
392 | 423 |
393 for (size_t i = 0; i < remove_list.size(); ++i) | 424 for (size_t i = 0; i < remove_list.size(); ++i) |
394 tilings_.Remove(remove_list[i]); | 425 tilings_->Remove(remove_list[i]); |
395 } | 426 } |
396 | 427 |
397 // Find existing tilings closest to ideal high / low res. | 428 // Find existing tilings closest to ideal high / low res. |
398 PictureLayerTiling* high_res = NULL; | 429 PictureLayerTiling* high_res = NULL; |
399 PictureLayerTiling* low_res = NULL; | 430 PictureLayerTiling* low_res = NULL; |
400 for (size_t i = 0; i < tilings_.num_tilings(); ++i) { | 431 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { |
401 PictureLayerTiling* tiling = tilings_.tiling_at(i); | 432 PictureLayerTiling* tiling = tilings_->tiling_at(i); |
402 if (!high_res || IsCloserToThan(tiling, high_res, ideal_contents_scale)) | 433 if (!high_res || IsCloserToThan(tiling, high_res, ideal_contents_scale)) |
403 high_res = tiling; | 434 high_res = tiling; |
404 if (!low_res || IsCloserToThan(tiling, low_res, low_res_contents_scale)) | 435 if (!low_res || IsCloserToThan(tiling, low_res, low_res_contents_scale)) |
405 low_res = tiling; | 436 low_res = tiling; |
406 | 437 |
407 // Reset all tilings to non-ideal until the end of this function. | 438 // Reset all tilings to non-ideal until the end of this function. |
408 tiling->set_resolution(NON_IDEAL_RESOLUTION); | 439 tiling->set_resolution(NON_IDEAL_RESOLUTION); |
409 } | 440 } |
410 | 441 |
411 // The active tree always has calcDrawProperties called on it first, and | 442 // The active tree always has calcDrawProperties called on it first, and |
(...skipping 23 matching lines...) Expand all Loading... |
435 if (high_res) | 466 if (high_res) |
436 high_res->set_resolution(HIGH_RESOLUTION); | 467 high_res->set_resolution(HIGH_RESOLUTION); |
437 if (low_res && low_res != high_res) | 468 if (low_res && low_res != high_res) |
438 low_res->set_resolution(LOW_RESOLUTION); | 469 low_res->set_resolution(LOW_RESOLUTION); |
439 } | 470 } |
440 | 471 |
441 void PictureLayerImpl::CleanUpUnusedTilings( | 472 void PictureLayerImpl::CleanUpUnusedTilings( |
442 std::vector<PictureLayerTiling*> used_tilings) { | 473 std::vector<PictureLayerTiling*> used_tilings) { |
443 std::vector<PictureLayerTiling*> to_remove; | 474 std::vector<PictureLayerTiling*> to_remove; |
444 | 475 |
445 for (size_t i = 0; i < tilings_.num_tilings(); ++i) { | 476 for (size_t i = 0; i < tilings_->num_tilings(); ++i) { |
446 PictureLayerTiling* tiling = tilings_.tiling_at(i); | 477 PictureLayerTiling* tiling = tilings_->tiling_at(i); |
447 // Don't remove the current high or low res tilinig. | 478 // Don't remove the current high or low res tilinig. |
448 if (tiling->resolution() != NON_IDEAL_RESOLUTION) | 479 if (tiling->resolution() != NON_IDEAL_RESOLUTION) |
449 continue; | 480 continue; |
450 if (std::find(used_tilings.begin(), used_tilings.end(), tiling) == | 481 if (std::find(used_tilings.begin(), used_tilings.end(), tiling) == |
451 used_tilings.end()) | 482 used_tilings.end()) |
452 to_remove.push_back(tiling); | 483 to_remove.push_back(tiling); |
453 } | 484 } |
454 | 485 |
455 for (size_t i = 0; i < to_remove.size(); ++i) | 486 for (size_t i = 0; i < to_remove.size(); ++i) |
456 tilings_.Remove(to_remove[i]); | 487 tilings_->Remove(to_remove[i]); |
457 } | 488 } |
458 | 489 |
459 } // namespace cc | 490 } // namespace cc |
OLD | NEW |