| OLD | NEW |
| 1 // Copyright 2010 The Chromium Authors. All rights reserved. | 1 // Copyright 2010 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/layers/layer.h" | 5 #include "cc/layers/layer.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/atomic_sequence_num.h" | 9 #include "base/atomic_sequence_num.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 } | 330 } |
| 331 | 331 |
| 332 void Layer::ReplaceChild(Layer* reference, scoped_refptr<Layer> new_layer) { | 332 void Layer::ReplaceChild(Layer* reference, scoped_refptr<Layer> new_layer) { |
| 333 DCHECK(reference); | 333 DCHECK(reference); |
| 334 DCHECK_EQ(reference->parent(), this); | 334 DCHECK_EQ(reference->parent(), this); |
| 335 DCHECK(IsPropertyChangeAllowed()); | 335 DCHECK(IsPropertyChangeAllowed()); |
| 336 | 336 |
| 337 if (reference == new_layer.get()) | 337 if (reference == new_layer.get()) |
| 338 return; | 338 return; |
| 339 | 339 |
| 340 // Find the index of |reference| in |children_|. | 340 int reference_index = IndexOfChild(reference); |
| 341 auto reference_it = | 341 if (reference_index == -1) { |
| 342 std::find_if(children_.begin(), children_.end(), | 342 NOTREACHED(); |
| 343 [reference](const scoped_refptr<Layer>& layer) { | 343 return; |
| 344 return layer.get() == reference; | 344 } |
| 345 }); | 345 |
| 346 DCHECK(reference_it != children_.end()); | |
| 347 size_t reference_index = reference_it - children_.begin(); | |
| 348 reference->RemoveFromParent(); | 346 reference->RemoveFromParent(); |
| 349 | 347 |
| 350 if (new_layer.get()) { | 348 if (new_layer.get()) { |
| 351 new_layer->RemoveFromParent(); | 349 new_layer->RemoveFromParent(); |
| 352 InsertChild(new_layer, reference_index); | 350 InsertChild(new_layer, reference_index); |
| 353 } | 351 } |
| 354 } | 352 } |
| 355 | 353 |
| 354 int Layer::IndexOfChild(const Layer* reference) { |
| 355 for (size_t i = 0; i < children_.size(); ++i) { |
| 356 if (children_[i].get() == reference) |
| 357 return i; |
| 358 } |
| 359 return -1; |
| 360 } |
| 361 |
| 356 void Layer::SetBounds(const gfx::Size& size) { | 362 void Layer::SetBounds(const gfx::Size& size) { |
| 357 DCHECK(IsPropertyChangeAllowed()); | 363 DCHECK(IsPropertyChangeAllowed()); |
| 358 if (bounds() == size) | 364 if (bounds() == size) |
| 359 return; | 365 return; |
| 360 bounds_ = size; | 366 bounds_ = size; |
| 361 | 367 |
| 362 if (!layer_tree_host_) | 368 if (!layer_tree_host_) |
| 363 return; | 369 return; |
| 364 | 370 |
| 365 if (ClipNode* clip_node = layer_tree_host_->property_trees()->clip_tree.Node( | 371 if (ClipNode* clip_node = layer_tree_host_->property_trees()->clip_tree.Node( |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 for (const Layer* layer = parent(); layer; layer = layer->parent()) { | 409 for (const Layer* layer = parent(); layer; layer = layer->parent()) { |
| 404 if (layer == ancestor) | 410 if (layer == ancestor) |
| 405 return true; | 411 return true; |
| 406 } | 412 } |
| 407 return false; | 413 return false; |
| 408 } | 414 } |
| 409 | 415 |
| 410 void Layer::RequestCopyOfOutput( | 416 void Layer::RequestCopyOfOutput( |
| 411 scoped_ptr<CopyOutputRequest> request) { | 417 scoped_ptr<CopyOutputRequest> request) { |
| 412 DCHECK(IsPropertyChangeAllowed()); | 418 DCHECK(IsPropertyChangeAllowed()); |
| 413 bool had_no_copy_requests = copy_requests_.empty(); | 419 int size = copy_requests_.size(); |
| 414 if (void* source = request->source()) { | 420 if (void* source = request->source()) { |
| 415 auto it = std::find_if( | 421 auto it = std::find_if( |
| 416 copy_requests_.begin(), copy_requests_.end(), | 422 copy_requests_.begin(), copy_requests_.end(), |
| 417 [source](const CopyOutputRequest* x) { return x->source() == source; }); | 423 [source](const CopyOutputRequest* x) { return x->source() == source; }); |
| 418 if (it != copy_requests_.end()) | 424 if (it != copy_requests_.end()) |
| 419 copy_requests_.erase(it); | 425 copy_requests_.erase(it); |
| 420 } | 426 } |
| 421 if (request->IsEmpty()) | 427 if (request->IsEmpty()) |
| 422 return; | 428 return; |
| 423 copy_requests_.push_back(request.Pass()); | 429 copy_requests_.push_back(request.Pass()); |
| 424 if (had_no_copy_requests) { | 430 if (size == 0) { |
| 425 bool copy_request_added = true; | 431 bool copy_request_added = true; |
| 426 UpdateNumCopyRequestsForSubtree(copy_request_added); | 432 UpdateNumCopyRequestsForSubtree(copy_request_added); |
| 427 } | 433 } |
| 428 SetNeedsCommit(); | 434 SetNeedsCommit(); |
| 429 } | 435 } |
| 430 | 436 |
| 431 void Layer::UpdateNumCopyRequestsForSubtree(bool add) { | 437 void Layer::UpdateNumCopyRequestsForSubtree(bool add) { |
| 432 int change = add ? 1 : -1; | 438 int change = add ? 1 : -1; |
| 433 for (Layer* layer = this; layer; layer = layer->parent()) { | 439 for (Layer* layer = this; layer; layer = layer->parent()) { |
| 434 layer->num_layer_or_descendants_with_copy_request_ += change; | 440 layer->num_layer_or_descendants_with_copy_request_ += change; |
| (...skipping 826 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1261 // the pending tree will clobber any impl-side scrolling occuring on the | 1267 // the pending tree will clobber any impl-side scrolling occuring on the |
| 1262 // active tree. To do so, avoid scrolling the pending tree along with it | 1268 // active tree. To do so, avoid scrolling the pending tree along with it |
| 1263 // instead of trying to undo that scrolling later. | 1269 // instead of trying to undo that scrolling later. |
| 1264 if (layer_animation_controller_->scroll_offset_animation_was_interrupted()) | 1270 if (layer_animation_controller_->scroll_offset_animation_was_interrupted()) |
| 1265 layer->PushScrollOffsetFromMainThreadAndClobberActiveValue(scroll_offset_); | 1271 layer->PushScrollOffsetFromMainThreadAndClobberActiveValue(scroll_offset_); |
| 1266 else | 1272 else |
| 1267 layer->PushScrollOffsetFromMainThread(scroll_offset_); | 1273 layer->PushScrollOffsetFromMainThread(scroll_offset_); |
| 1268 layer->SetScrollCompensationAdjustment(ScrollCompensationAdjustment()); | 1274 layer->SetScrollCompensationAdjustment(ScrollCompensationAdjustment()); |
| 1269 | 1275 |
| 1270 // Wrap the copy_requests_ in a PostTask to the main thread. | 1276 // Wrap the copy_requests_ in a PostTask to the main thread. |
| 1271 bool had_copy_requests = !copy_requests_.empty(); | 1277 int size = copy_requests_.size(); |
| 1272 ScopedPtrVector<CopyOutputRequest> main_thread_copy_requests; | 1278 ScopedPtrVector<CopyOutputRequest> main_thread_copy_requests; |
| 1273 for (ScopedPtrVector<CopyOutputRequest>::iterator it = copy_requests_.begin(); | 1279 for (ScopedPtrVector<CopyOutputRequest>::iterator it = copy_requests_.begin(); |
| 1274 it != copy_requests_.end(); | 1280 it != copy_requests_.end(); |
| 1275 ++it) { | 1281 ++it) { |
| 1276 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner = | 1282 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner = |
| 1277 layer_tree_host()->proxy()->MainThreadTaskRunner(); | 1283 layer_tree_host()->proxy()->MainThreadTaskRunner(); |
| 1278 scoped_ptr<CopyOutputRequest> original_request = copy_requests_.take(it); | 1284 scoped_ptr<CopyOutputRequest> original_request = copy_requests_.take(it); |
| 1279 const CopyOutputRequest& original_request_ref = *original_request; | 1285 const CopyOutputRequest& original_request_ref = *original_request; |
| 1280 scoped_ptr<CopyOutputRequest> main_thread_request = | 1286 scoped_ptr<CopyOutputRequest> main_thread_request = |
| 1281 CopyOutputRequest::CreateRelayRequest( | 1287 CopyOutputRequest::CreateRelayRequest( |
| 1282 original_request_ref, | 1288 original_request_ref, |
| 1283 base::Bind(&PostCopyCallbackToMainThread, | 1289 base::Bind(&PostCopyCallbackToMainThread, |
| 1284 main_thread_task_runner, | 1290 main_thread_task_runner, |
| 1285 base::Passed(&original_request))); | 1291 base::Passed(&original_request))); |
| 1286 main_thread_copy_requests.push_back(main_thread_request.Pass()); | 1292 main_thread_copy_requests.push_back(main_thread_request.Pass()); |
| 1287 } | 1293 } |
| 1288 if (!copy_requests_.empty() && layer_tree_host_) | 1294 if (!copy_requests_.empty() && layer_tree_host_) |
| 1289 layer_tree_host_->property_trees()->needs_rebuild = true; | 1295 layer_tree_host_->property_trees()->needs_rebuild = true; |
| 1290 if (had_copy_requests) | 1296 if (size != 0) |
| 1291 UpdateNumCopyRequestsForSubtree(false); | 1297 UpdateNumCopyRequestsForSubtree(false); |
| 1292 copy_requests_.clear(); | 1298 copy_requests_.clear(); |
| 1293 layer->PassCopyRequests(&main_thread_copy_requests); | 1299 layer->PassCopyRequests(&main_thread_copy_requests); |
| 1294 | 1300 |
| 1295 // If the main thread commits multiple times before the impl thread actually | 1301 // If the main thread commits multiple times before the impl thread actually |
| 1296 // draws, then damage tracking will become incorrect if we simply clobber the | 1302 // draws, then damage tracking will become incorrect if we simply clobber the |
| 1297 // update_rect here. The LayerImpl's update_rect needs to accumulate (i.e. | 1303 // update_rect here. The LayerImpl's update_rect needs to accumulate (i.e. |
| 1298 // union) any update changes that have occurred on the main thread. | 1304 // union) any update changes that have occurred on the main thread. |
| 1299 update_rect_.Union(layer->update_rect()); | 1305 update_rect_.Union(layer->update_rect()); |
| 1300 layer->SetUpdateRect(update_rect_); | 1306 layer->SetUpdateRect(update_rect_); |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1641 ? layer_tree_host()->meta_information_sequence_number() | 1647 ? layer_tree_host()->meta_information_sequence_number() |
| 1642 : 0; | 1648 : 0; |
| 1643 } | 1649 } |
| 1644 | 1650 |
| 1645 bool Layer::sorted_for_recursion() { | 1651 bool Layer::sorted_for_recursion() { |
| 1646 return sorted_for_recursion_tracker_ == | 1652 return sorted_for_recursion_tracker_ == |
| 1647 layer_tree_host()->meta_information_sequence_number(); | 1653 layer_tree_host()->meta_information_sequence_number(); |
| 1648 } | 1654 } |
| 1649 | 1655 |
| 1650 } // namespace cc | 1656 } // namespace cc |
| OLD | NEW |