Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1216)

Side by Side Diff: cc/picture_layer_impl.cc

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

Powered by Google App Engine
This is Rietveld 408576698