Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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_impl.h" | 5 #include "cc/trees/layer_tree_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 619 layer->id()); | 619 layer->id()); |
| 620 | 620 |
| 621 layer_tree_host_impl_->mutator_host()->UnregisterElement( | 621 layer_tree_host_impl_->mutator_host()->UnregisterElement( |
| 622 layer->element_id(), | 622 layer->element_id(), |
| 623 IsActiveTree() ? ElementListType::ACTIVE : ElementListType::PENDING); | 623 IsActiveTree() ? ElementListType::ACTIVE : ElementListType::PENDING); |
| 624 | 624 |
| 625 element_layers_map_.erase(layer->element_id()); | 625 element_layers_map_.erase(layer->element_id()); |
| 626 } | 626 } |
| 627 | 627 |
| 628 void LayerTreeImpl::AddToOpacityAnimationsMap(int id, float opacity) { | 628 void LayerTreeImpl::AddToOpacityAnimationsMap(int id, float opacity) { |
| 629 opacity_animations_map_[id] = opacity; | 629 if (LayerImpl* layer = LayerById(id)) |
| 630 element_id_to_opacity_animations_[layer->element_id()] = opacity; | |
| 630 } | 631 } |
| 631 | 632 |
| 632 void LayerTreeImpl::AddToTransformAnimationsMap(int id, | 633 void LayerTreeImpl::AddToTransformAnimationsMap(int id, |
| 633 gfx::Transform transform) { | 634 gfx::Transform transform) { |
| 634 transform_animations_map_[id] = transform; | 635 if (LayerImpl* layer = LayerById(id)) |
| 636 element_id_to_transform_animations_[layer->element_id()] = transform; | |
| 635 } | 637 } |
| 636 | 638 |
| 637 void LayerTreeImpl::AddToFilterAnimationsMap(int id, | 639 void LayerTreeImpl::AddToFilterAnimationsMap(int id, |
| 638 const FilterOperations& filters) { | 640 const FilterOperations& filters) { |
| 639 filter_animations_map_[id] = filters; | 641 if (LayerImpl* layer = LayerById(id)) |
| 642 element_id_to_filter_animations_[layer->element_id()] = filters; | |
| 640 } | 643 } |
| 641 | 644 |
| 642 LayerImpl* LayerTreeImpl::InnerViewportContainerLayer() const { | 645 LayerImpl* LayerTreeImpl::InnerViewportContainerLayer() const { |
| 643 return InnerViewportScrollLayer() | 646 return InnerViewportScrollLayer() |
| 644 ? InnerViewportScrollLayer()->scroll_clip_layer() | 647 ? InnerViewportScrollLayer()->scroll_clip_layer() |
| 645 : NULL; | 648 : NULL; |
| 646 } | 649 } |
| 647 | 650 |
| 648 LayerImpl* LayerTreeImpl::OuterViewportContainerLayer() const { | 651 LayerImpl* LayerTreeImpl::OuterViewportContainerLayer() const { |
| 649 return OuterViewportScrollLayer() | 652 return OuterViewportScrollLayer() |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 716 | 719 |
| 717 void LayerTreeImpl::UpdatePropertyTreeScrollingAndAnimationFromMainThread() { | 720 void LayerTreeImpl::UpdatePropertyTreeScrollingAndAnimationFromMainThread() { |
| 718 // TODO(enne): This should get replaced by pulling out scrolling and | 721 // TODO(enne): This should get replaced by pulling out scrolling and |
| 719 // animations into their own trees. Then scrolls and animations would have | 722 // animations into their own trees. Then scrolls and animations would have |
| 720 // their own ways of synchronizing across commits. This occurs to push | 723 // their own ways of synchronizing across commits. This occurs to push |
| 721 // updates from scrolling deltas on the compositor thread that have occurred | 724 // updates from scrolling deltas on the compositor thread that have occurred |
| 722 // after begin frame and updates from animations that have ticked since begin | 725 // after begin frame and updates from animations that have ticked since begin |
| 723 // frame to a newly-committed property tree. | 726 // frame to a newly-committed property tree. |
| 724 if (layer_list_.empty()) | 727 if (layer_list_.empty()) |
| 725 return; | 728 return; |
| 726 std::vector<int> layer_ids_to_remove; | 729 auto element_id_to_opacity = element_id_to_opacity_animations_.begin(); |
| 727 for (auto& layer_id_to_opacity : opacity_animations_map_) { | 730 while (element_id_to_opacity != element_id_to_opacity_animations_.end()) { |
| 728 const int id = layer_id_to_opacity.first; | 731 const ElementId id = element_id_to_opacity->first; |
| 729 if (EffectNode* node = | 732 if (EffectNode* node = |
| 730 property_trees_.effect_tree.UpdateNodeFromOwningLayerId(id)) { | 733 property_trees_.effect_tree.FindNodeFromElementId(id)) { |
| 731 if (!node->is_currently_animating_opacity || | 734 if (!node->is_currently_animating_opacity || |
| 732 node->opacity == layer_id_to_opacity.second) { | 735 node->opacity == element_id_to_opacity->second) { |
| 733 layer_ids_to_remove.push_back(id); | 736 element_id_to_opacity_animations_.erase(element_id_to_opacity++); |
| 734 continue; | 737 continue; |
| 735 } | 738 } |
| 736 node->opacity = layer_id_to_opacity.second; | 739 node->opacity = element_id_to_opacity->second; |
| 737 property_trees_.effect_tree.set_needs_update(true); | 740 property_trees_.effect_tree.set_needs_update(true); |
| 738 } | 741 } |
| 742 ++element_id_to_opacity; | |
| 739 } | 743 } |
| 740 for (auto id : layer_ids_to_remove) | |
| 741 opacity_animations_map_.erase(id); | |
| 742 layer_ids_to_remove.clear(); | |
| 743 | 744 |
| 744 for (auto& layer_id_to_transform : transform_animations_map_) { | 745 auto element_id_to_filter = element_id_to_filter_animations_.begin(); |
| 745 const int id = layer_id_to_transform.first; | 746 while (element_id_to_filter != element_id_to_filter_animations_.end()) { |
| 746 if (TransformNode* node = | 747 const ElementId id = element_id_to_filter->first; |
| 747 property_trees_.transform_tree.UpdateNodeFromOwningLayerId(id)) { | 748 if (EffectNode* node = |
| 748 if (!node->is_currently_animating || | 749 property_trees_.effect_tree.FindNodeFromElementId(id)) { |
| 749 node->local == layer_id_to_transform.second) { | 750 if (!node->is_currently_animating_filter || |
| 750 layer_ids_to_remove.push_back(id); | 751 node->filters == element_id_to_filter->second) { |
| 752 element_id_to_filter_animations_.erase(element_id_to_filter++); | |
| 751 continue; | 753 continue; |
| 752 } | 754 } |
| 753 node->local = layer_id_to_transform.second; | 755 node->filters = element_id_to_filter->second; |
| 756 property_trees_.effect_tree.set_needs_update(true); | |
| 757 } | |
| 758 ++element_id_to_filter; | |
| 759 } | |
| 760 | |
| 761 auto element_id_to_transform = element_id_to_transform_animations_.begin(); | |
| 762 while (element_id_to_transform != element_id_to_transform_animations_.end()) { | |
| 763 const ElementId id = element_id_to_transform->first; | |
| 764 if (TransformNode* node = | |
| 765 property_trees_.transform_tree.FindNodeFromElementId(id)) { | |
| 766 if (!node->is_currently_animating || | |
| 767 node->local == element_id_to_transform->second) { | |
| 768 element_id_to_transform_animations_.erase(element_id_to_transform++); | |
| 769 continue; | |
| 770 } | |
| 771 node->local = element_id_to_transform->second; | |
| 754 node->needs_local_transform_update = true; | 772 node->needs_local_transform_update = true; |
| 755 property_trees_.transform_tree.set_needs_update(true); | 773 property_trees_.transform_tree.set_needs_update(true); |
| 756 } | 774 } |
| 775 ++element_id_to_transform; | |
| 757 } | 776 } |
| 758 for (auto id : layer_ids_to_remove) | |
| 759 transform_animations_map_.erase(id); | |
| 760 layer_ids_to_remove.clear(); | |
| 761 | |
| 762 for (auto& layer_id_to_filters : filter_animations_map_) { | |
| 763 const int id = layer_id_to_filters.first; | |
| 764 if (EffectNode* node = | |
| 765 property_trees_.effect_tree.UpdateNodeFromOwningLayerId(id)) { | |
| 766 if (!node->is_currently_animating_filter || | |
| 767 node->filters == layer_id_to_filters.second) { | |
| 768 layer_ids_to_remove.push_back(id); | |
| 769 continue; | |
| 770 } | |
| 771 node->filters = layer_id_to_filters.second; | |
| 772 property_trees_.effect_tree.set_needs_update(true); | |
| 773 } | |
| 774 } | |
| 775 for (auto id : layer_ids_to_remove) | |
| 776 filter_animations_map_.erase(id); | |
| 777 | 777 |
| 778 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [](LayerImpl* layer) { | 778 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [](LayerImpl* layer) { |
| 779 layer->UpdatePropertyTreeForScrollingAndAnimationIfNeeded(); | 779 layer->UpdatePropertyTreeForScrollingAndAnimationIfNeeded(); |
| 780 }); | 780 }); |
| 781 } | 781 } |
| 782 | 782 |
| 783 void LayerTreeImpl::SetPageScaleOnActiveTree(float active_page_scale) { | 783 void LayerTreeImpl::SetPageScaleOnActiveTree(float active_page_scale) { |
| 784 DCHECK(IsActiveTree()); | 784 DCHECK(IsActiveTree()); |
| 785 if (page_scale_factor()->SetCurrent( | 785 if (page_scale_factor()->SetCurrent( |
| 786 ClampPageScaleFactorToLimits(active_page_scale))) { | 786 ClampPageScaleFactorToLimits(active_page_scale))) { |
| (...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1180 << "CalcDrawProperties should not set_needs_update_draw_properties()"; | 1180 << "CalcDrawProperties should not set_needs_update_draw_properties()"; |
| 1181 return true; | 1181 return true; |
| 1182 } | 1182 } |
| 1183 | 1183 |
| 1184 void LayerTreeImpl::BuildLayerListAndPropertyTreesForTesting() { | 1184 void LayerTreeImpl::BuildLayerListAndPropertyTreesForTesting() { |
| 1185 BuildLayerListForTesting(); | 1185 BuildLayerListForTesting(); |
| 1186 BuildPropertyTreesForTesting(); | 1186 BuildPropertyTreesForTesting(); |
| 1187 } | 1187 } |
| 1188 | 1188 |
| 1189 void LayerTreeImpl::BuildPropertyTreesForTesting() { | 1189 void LayerTreeImpl::BuildPropertyTreesForTesting() { |
| 1190 SetElementIdsForTesting(); | |
|
ajuma
2017/03/22 19:28:22
It looks like this is conflicting with CompositorM
| |
| 1190 PropertyTreeBuilder::PreCalculateMetaInformationForTesting(layer_list_[0]); | 1191 PropertyTreeBuilder::PreCalculateMetaInformationForTesting(layer_list_[0]); |
| 1191 property_trees_.needs_rebuild = true; | 1192 property_trees_.needs_rebuild = true; |
| 1192 property_trees_.transform_tree.set_source_to_parent_updates_allowed(true); | 1193 property_trees_.transform_tree.set_source_to_parent_updates_allowed(true); |
| 1193 PropertyTreeBuilder::BuildPropertyTrees( | 1194 PropertyTreeBuilder::BuildPropertyTrees( |
| 1194 layer_list_[0], PageScaleLayer(), InnerViewportScrollLayer(), | 1195 layer_list_[0], PageScaleLayer(), InnerViewportScrollLayer(), |
| 1195 OuterViewportScrollLayer(), OverscrollElasticityLayer(), | 1196 OuterViewportScrollLayer(), OverscrollElasticityLayer(), |
| 1196 elastic_overscroll()->Current(IsActiveTree()), | 1197 elastic_overscroll()->Current(IsActiveTree()), |
| 1197 current_page_scale_factor(), device_scale_factor(), | 1198 current_page_scale_factor(), device_scale_factor(), |
| 1198 gfx::Rect(DrawViewportSize()), layer_tree_host_impl_->DrawTransform(), | 1199 gfx::Rect(DrawViewportSize()), layer_tree_host_impl_->DrawTransform(), |
| 1199 &property_trees_); | 1200 &property_trees_); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1252 } | 1253 } |
| 1253 | 1254 |
| 1254 void LayerTreeImpl::RegisterLayer(LayerImpl* layer) { | 1255 void LayerTreeImpl::RegisterLayer(LayerImpl* layer) { |
| 1255 DCHECK(!LayerById(layer->id())); | 1256 DCHECK(!LayerById(layer->id())); |
| 1256 layer_id_map_[layer->id()] = layer; | 1257 layer_id_map_[layer->id()] = layer; |
| 1257 } | 1258 } |
| 1258 | 1259 |
| 1259 void LayerTreeImpl::UnregisterLayer(LayerImpl* layer) { | 1260 void LayerTreeImpl::UnregisterLayer(LayerImpl* layer) { |
| 1260 DCHECK(LayerById(layer->id())); | 1261 DCHECK(LayerById(layer->id())); |
| 1261 layers_that_should_push_properties_.erase(layer); | 1262 layers_that_should_push_properties_.erase(layer); |
| 1262 transform_animations_map_.erase(layer->id()); | 1263 element_id_to_transform_animations_.erase(layer->element_id()); |
| 1263 opacity_animations_map_.erase(layer->id()); | 1264 element_id_to_opacity_animations_.erase(layer->element_id()); |
| 1265 element_id_to_filter_animations_.erase(layer->element_id()); | |
| 1264 layer_id_map_.erase(layer->id()); | 1266 layer_id_map_.erase(layer->id()); |
| 1265 } | 1267 } |
| 1266 | 1268 |
| 1267 // These manage ownership of the LayerImpl. | 1269 // These manage ownership of the LayerImpl. |
| 1268 void LayerTreeImpl::AddLayer(std::unique_ptr<LayerImpl> layer) { | 1270 void LayerTreeImpl::AddLayer(std::unique_ptr<LayerImpl> layer) { |
| 1269 DCHECK(std::find(layers_->begin(), layers_->end(), layer) == layers_->end()); | 1271 DCHECK(std::find(layers_->begin(), layers_->end(), layer) == layers_->end()); |
| 1270 | 1272 |
| 1271 // TODO(ajuma): Change this to a DCHECK once we've figured out what's causing | 1273 // TODO(ajuma): Change this to a DCHECK once we've figured out what's causing |
| 1272 // crbug.com/701279. | 1274 // crbug.com/701279. |
| 1273 CHECK(layer); | 1275 CHECK(layer); |
| (...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2151 | 2153 |
| 2152 void LayerTreeImpl::ResetAllChangeTracking() { | 2154 void LayerTreeImpl::ResetAllChangeTracking() { |
| 2153 layers_that_should_push_properties_.clear(); | 2155 layers_that_should_push_properties_.clear(); |
| 2154 // Iterate over all layers, including masks. | 2156 // Iterate over all layers, including masks. |
| 2155 for (auto& layer : *layers_) | 2157 for (auto& layer : *layers_) |
| 2156 layer->ResetChangeTracking(); | 2158 layer->ResetChangeTracking(); |
| 2157 property_trees_.ResetAllChangeTracking(); | 2159 property_trees_.ResetAllChangeTracking(); |
| 2158 } | 2160 } |
| 2159 | 2161 |
| 2160 } // namespace cc | 2162 } // namespace cc |
| OLD | NEW |