OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/trees/layer_tree.h" | 5 #include "cc/trees/layer_tree.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/time/time.h" | 8 #include "base/time/time.h" |
9 #include "cc/animation/animation_host.h" | 9 #include "cc/animation/animation_host.h" |
10 #include "cc/input/page_scale_animation.h" | 10 #include "cc/input/page_scale_animation.h" |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 | 59 |
60 LayerTree::LayerTree(std::unique_ptr<AnimationHost> animation_host, | 60 LayerTree::LayerTree(std::unique_ptr<AnimationHost> animation_host, |
61 LayerTreeHost* layer_tree_host) | 61 LayerTreeHost* layer_tree_host) |
62 : needs_full_tree_sync_(true), | 62 : needs_full_tree_sync_(true), |
63 needs_meta_info_recomputation_(true), | 63 needs_meta_info_recomputation_(true), |
64 in_paint_layer_contents_(false), | 64 in_paint_layer_contents_(false), |
65 animation_host_(std::move(animation_host)), | 65 animation_host_(std::move(animation_host)), |
66 layer_tree_host_(layer_tree_host) { | 66 layer_tree_host_(layer_tree_host) { |
67 DCHECK(animation_host_); | 67 DCHECK(animation_host_); |
68 DCHECK(layer_tree_host_); | 68 DCHECK(layer_tree_host_); |
| 69 animation_host_->SetMutatorHostClient(this); |
69 } | 70 } |
70 | 71 |
71 LayerTree::~LayerTree() { | 72 LayerTree::~LayerTree() { |
72 animation_host_->SetMutatorHostClient(nullptr); | 73 animation_host_->SetMutatorHostClient(nullptr); |
73 | 74 |
74 // We must clear any pointers into the layer tree prior to destroying it. | 75 // We must clear any pointers into the layer tree prior to destroying it. |
75 RegisterViewportLayers(nullptr, nullptr, nullptr, nullptr); | 76 RegisterViewportLayers(nullptr, nullptr, nullptr, nullptr); |
76 | 77 |
77 if (inputs_.root_layer) { | 78 if (inputs_.root_layer) { |
78 inputs_.root_layer->SetLayerTreeHost(nullptr); | 79 inputs_.root_layer->SetLayerTreeHost(nullptr); |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
523 // It is required to create new PropertyTrees before deserializing it. | 524 // It is required to create new PropertyTrees before deserializing it. |
524 property_trees_ = PropertyTrees(); | 525 property_trees_ = PropertyTrees(); |
525 property_trees_.FromProtobuf(proto.property_trees()); | 526 property_trees_.FromProtobuf(proto.property_trees()); |
526 | 527 |
527 // Forcefully override the sequence number of all layers in the tree to have | 528 // Forcefully override the sequence number of all layers in the tree to have |
528 // a valid sequence number. Changing the sequence number for a layer does not | 529 // a valid sequence number. Changing the sequence number for a layer does not |
529 // need a commit, so the value will become out of date for layers that are not | 530 // need a commit, so the value will become out of date for layers that are not |
530 // updated for other reasons. All layers that at this point are part of the | 531 // updated for other reasons. All layers that at this point are part of the |
531 // layer tree are valid, so it is OK that they have a valid sequence number. | 532 // layer tree are valid, so it is OK that they have a valid sequence number. |
532 int seq_num = property_trees_.sequence_number; | 533 int seq_num = property_trees_.sequence_number; |
533 LayerTreeHostCommon::CallFunctionForEveryLayer( | 534 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [seq_num](Layer* layer) { |
534 layer_tree_host_, [seq_num](Layer* layer) { | 535 layer->set_property_tree_sequence_number(seq_num); |
535 layer->set_property_tree_sequence_number(seq_num); | 536 }); |
536 }); | 537 } |
| 538 |
| 539 Layer* LayerTree::LayerByElementId(ElementId element_id) const { |
| 540 ElementLayersMap::const_iterator iter = element_layers_map_.find(element_id); |
| 541 return iter != element_layers_map_.end() ? iter->second : nullptr; |
| 542 } |
| 543 |
| 544 void LayerTree::RegisterElement(ElementId element_id, |
| 545 ElementListType list_type, |
| 546 Layer* layer) { |
| 547 if (layer->element_id()) { |
| 548 element_layers_map_[layer->element_id()] = layer; |
| 549 } |
| 550 |
| 551 animation_host_->RegisterElement(element_id, list_type); |
| 552 } |
| 553 |
| 554 void LayerTree::UnregisterElement(ElementId element_id, |
| 555 ElementListType list_type, |
| 556 Layer* layer) { |
| 557 animation_host_->UnregisterElement(element_id, list_type); |
| 558 |
| 559 if (layer->element_id()) { |
| 560 element_layers_map_.erase(layer->element_id()); |
| 561 } |
| 562 } |
| 563 |
| 564 static void SetElementIdForTesting(Layer* layer) { |
| 565 layer->SetElementId(LayerIdToElementIdForTesting(layer->id())); |
| 566 } |
| 567 |
| 568 void LayerTree::SetElementIdsForTesting() { |
| 569 LayerTreeHostCommon::CallFunctionForEveryLayer(this, SetElementIdForTesting); |
| 570 } |
| 571 |
| 572 bool LayerTree::IsElementInList(ElementId element_id, |
| 573 ElementListType list_type) const { |
| 574 return list_type == ElementListType::ACTIVE && LayerByElementId(element_id); |
| 575 } |
| 576 |
| 577 void LayerTree::SetMutatorsNeedCommit() { |
| 578 layer_tree_host_->SetNeedsCommit(); |
| 579 } |
| 580 |
| 581 void LayerTree::SetMutatorsNeedRebuildPropertyTrees() { |
| 582 property_trees_.needs_rebuild = true; |
| 583 } |
| 584 |
| 585 void LayerTree::SetElementFilterMutated(ElementId element_id, |
| 586 ElementListType list_type, |
| 587 const FilterOperations& filters) { |
| 588 Layer* layer = LayerByElementId(element_id); |
| 589 DCHECK(layer); |
| 590 layer->OnFilterAnimated(filters); |
| 591 } |
| 592 |
| 593 void LayerTree::SetElementOpacityMutated(ElementId element_id, |
| 594 ElementListType list_type, |
| 595 float opacity) { |
| 596 Layer* layer = LayerByElementId(element_id); |
| 597 DCHECK(layer); |
| 598 layer->OnOpacityAnimated(opacity); |
| 599 } |
| 600 |
| 601 void LayerTree::SetElementTransformMutated(ElementId element_id, |
| 602 ElementListType list_type, |
| 603 const gfx::Transform& transform) { |
| 604 Layer* layer = LayerByElementId(element_id); |
| 605 DCHECK(layer); |
| 606 layer->OnTransformAnimated(transform); |
| 607 } |
| 608 |
| 609 void LayerTree::SetElementScrollOffsetMutated( |
| 610 ElementId element_id, |
| 611 ElementListType list_type, |
| 612 const gfx::ScrollOffset& scroll_offset) { |
| 613 Layer* layer = LayerByElementId(element_id); |
| 614 DCHECK(layer); |
| 615 layer->OnScrollOffsetAnimated(scroll_offset); |
| 616 } |
| 617 |
| 618 void LayerTree::ElementTransformIsAnimatingChanged( |
| 619 ElementId element_id, |
| 620 ElementListType list_type, |
| 621 AnimationChangeType change_type, |
| 622 bool is_animating) { |
| 623 Layer* layer = LayerByElementId(element_id); |
| 624 if (layer) { |
| 625 switch (change_type) { |
| 626 case AnimationChangeType::POTENTIAL: |
| 627 layer->OnTransformIsPotentiallyAnimatingChanged(is_animating); |
| 628 break; |
| 629 case AnimationChangeType::RUNNING: |
| 630 layer->OnTransformIsCurrentlyAnimatingChanged(is_animating); |
| 631 break; |
| 632 case AnimationChangeType::BOTH: |
| 633 layer->OnTransformIsPotentiallyAnimatingChanged(is_animating); |
| 634 layer->OnTransformIsCurrentlyAnimatingChanged(is_animating); |
| 635 break; |
| 636 } |
| 637 } |
| 638 } |
| 639 |
| 640 void LayerTree::ElementOpacityIsAnimatingChanged( |
| 641 ElementId element_id, |
| 642 ElementListType list_type, |
| 643 AnimationChangeType change_type, |
| 644 bool is_animating) { |
| 645 Layer* layer = LayerByElementId(element_id); |
| 646 if (layer) { |
| 647 switch (change_type) { |
| 648 case AnimationChangeType::POTENTIAL: |
| 649 layer->OnOpacityIsPotentiallyAnimatingChanged(is_animating); |
| 650 break; |
| 651 case AnimationChangeType::RUNNING: |
| 652 layer->OnOpacityIsCurrentlyAnimatingChanged(is_animating); |
| 653 break; |
| 654 case AnimationChangeType::BOTH: |
| 655 layer->OnOpacityIsPotentiallyAnimatingChanged(is_animating); |
| 656 layer->OnOpacityIsCurrentlyAnimatingChanged(is_animating); |
| 657 break; |
| 658 } |
| 659 } |
| 660 } |
| 661 |
| 662 void LayerTree::ElementFilterIsAnimatingChanged(ElementId element_id, |
| 663 ElementListType list_type, |
| 664 AnimationChangeType change_type, |
| 665 bool is_animating) { |
| 666 Layer* layer = LayerByElementId(element_id); |
| 667 if (layer) { |
| 668 switch (change_type) { |
| 669 case AnimationChangeType::POTENTIAL: |
| 670 layer->OnFilterIsPotentiallyAnimatingChanged(is_animating); |
| 671 break; |
| 672 case AnimationChangeType::RUNNING: |
| 673 layer->OnFilterIsCurrentlyAnimatingChanged(is_animating); |
| 674 break; |
| 675 case AnimationChangeType::BOTH: |
| 676 layer->OnFilterIsPotentiallyAnimatingChanged(is_animating); |
| 677 layer->OnFilterIsCurrentlyAnimatingChanged(is_animating); |
| 678 break; |
| 679 } |
| 680 } |
| 681 } |
| 682 |
| 683 gfx::ScrollOffset LayerTree::GetScrollOffsetForAnimation( |
| 684 ElementId element_id) const { |
| 685 Layer* layer = LayerByElementId(element_id); |
| 686 DCHECK(layer); |
| 687 return layer->ScrollOffsetForAnimation(); |
| 688 } |
| 689 |
| 690 LayerListIterator<Layer> LayerTree::begin() const { |
| 691 return LayerListIterator<Layer>(inputs_.root_layer.get()); |
| 692 } |
| 693 |
| 694 LayerListIterator<Layer> LayerTree::end() const { |
| 695 return LayerListIterator<Layer>(nullptr); |
| 696 } |
| 697 |
| 698 LayerListReverseIterator<Layer> LayerTree::rbegin() { |
| 699 return LayerListReverseIterator<Layer>(inputs_.root_layer.get()); |
| 700 } |
| 701 |
| 702 LayerListReverseIterator<Layer> LayerTree::rend() { |
| 703 return LayerListReverseIterator<Layer>(nullptr); |
| 704 } |
| 705 |
| 706 void LayerTree::SetNeedsDisplayOnAllLayers() { |
| 707 for (auto* layer : *this) |
| 708 layer->SetNeedsDisplay(); |
537 } | 709 } |
538 | 710 |
539 } // namespace cc | 711 } // namespace cc |
OLD | NEW |