| Index: cc/trees/layer_tree_host.cc
|
| diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
|
| index fee2d6c61e4f92a745574b96d3008c01245076af..f26d8484a57b6f57e271e524def30574fbf2b07f 100644
|
| --- a/cc/trees/layer_tree_host.cc
|
| +++ b/cc/trees/layer_tree_host.cc
|
| @@ -1270,6 +1270,16 @@ Layer* LayerTreeHost::LayerById(int id) const {
|
| return iter != layer_id_map_.end() ? iter->second : NULL;
|
| }
|
|
|
| +Layer* LayerTreeHost::LayerForElementId(ElementId element_id) const {
|
| + auto iter = element_id_to_layer_map_.find(element_id);
|
| + return iter != element_id_to_layer_map_.end() ? iter->second.main : nullptr;
|
| +}
|
| +
|
| +Layer* LayerTreeHost::ScrollLayerForElementId(ElementId element_id) const {
|
| + auto iter = element_id_to_layer_map_.find(element_id);
|
| + return iter != element_id_to_layer_map_.end() ? iter->second.scroll : nullptr;
|
| +}
|
| +
|
| void LayerTreeHost::AddLayerShouldPushProperties(Layer* layer) {
|
| layers_that_should_push_properties_.insert(layer);
|
| }
|
| @@ -1291,20 +1301,56 @@ void LayerTreeHost::RegisterLayer(Layer* layer) {
|
| DCHECK(!LayerById(layer->id()));
|
| DCHECK(!in_paint_layer_contents_);
|
| layer_id_map_[layer->id()] = layer;
|
| - animation_host_->RegisterElement(layer->id(), ElementListType::ACTIVE);
|
| }
|
|
|
| void LayerTreeHost::UnregisterLayer(Layer* layer) {
|
| DCHECK(LayerById(layer->id()));
|
| DCHECK(!in_paint_layer_contents_);
|
| - animation_host_->UnregisterElement(layer->id(), ElementListType::ACTIVE);
|
| RemoveLayerShouldPushProperties(layer);
|
| layer_id_map_.erase(layer->id());
|
| }
|
|
|
| +void LayerTreeHost::RegisterLayerForElementId(Layer* layer) {
|
| + DCHECK(layer->element_id());
|
| + ElementLayers& element_layers = element_id_to_layer_map_[layer->element_id()];
|
| + if (layer->scrollable()) {
|
| + DCHECK(!element_layers.scroll);
|
| + element_layers.scroll = layer;
|
| + } else {
|
| + DCHECK(!element_layers.main);
|
| + element_layers.main = layer;
|
| + }
|
| + animation_host_->RegisterElement(layer->element_id(),
|
| + ElementListType::ACTIVE);
|
| +}
|
| +
|
| +void LayerTreeHost::UnregisterLayerForElementId(Layer* layer) {
|
| + DCHECK(layer->element_id());
|
| + animation_host_->UnregisterElement(layer->element_id(),
|
| + ElementListType::ACTIVE);
|
| +
|
| + auto iter = element_id_to_layer_map_.find(layer->element_id());
|
| + if (iter == element_id_to_layer_map_.end())
|
| + return;
|
| +
|
| + ElementLayers& element_layers = iter->second;
|
| + if (layer->scrollable()) {
|
| + DCHECK_EQ(element_layers.scroll, layer);
|
| + element_layers.scroll = nullptr;
|
| + } else {
|
| + DCHECK_EQ(element_layers.main, layer);
|
| + element_layers.main = nullptr;
|
| + }
|
| +
|
| + if (!element_layers.main && !element_layers.scroll)
|
| + element_id_to_layer_map_.erase(layer->element_id());
|
| +}
|
| +
|
| bool LayerTreeHost::IsElementInList(ElementId element_id,
|
| ElementListType list_type) const {
|
| - return list_type == ElementListType::ACTIVE && LayerById(element_id);
|
| + return list_type == ElementListType::ACTIVE &&
|
| + element_id_to_layer_map_.find(element_id) !=
|
| + element_id_to_layer_map_.end();
|
| }
|
|
|
| void LayerTreeHost::SetMutatorsNeedCommit() {
|
| @@ -1318,7 +1364,7 @@ void LayerTreeHost::SetMutatorsNeedRebuildPropertyTrees() {
|
| void LayerTreeHost::SetElementFilterMutated(ElementId element_id,
|
| ElementListType list_type,
|
| const FilterOperations& filters) {
|
| - Layer* layer = LayerById(element_id);
|
| + Layer* layer = LayerForElementId(element_id);
|
| DCHECK(layer);
|
| layer->OnFilterAnimated(filters);
|
| }
|
| @@ -1326,7 +1372,7 @@ void LayerTreeHost::SetElementFilterMutated(ElementId element_id,
|
| void LayerTreeHost::SetElementOpacityMutated(ElementId element_id,
|
| ElementListType list_type,
|
| float opacity) {
|
| - Layer* layer = LayerById(element_id);
|
| + Layer* layer = LayerForElementId(element_id);
|
| DCHECK(layer);
|
| layer->OnOpacityAnimated(opacity);
|
| }
|
| @@ -1335,7 +1381,7 @@ void LayerTreeHost::SetElementTransformMutated(
|
| ElementId element_id,
|
| ElementListType list_type,
|
| const gfx::Transform& transform) {
|
| - Layer* layer = LayerById(element_id);
|
| + Layer* layer = LayerForElementId(element_id);
|
| DCHECK(layer);
|
| layer->OnTransformAnimated(transform);
|
| }
|
| @@ -1344,7 +1390,7 @@ void LayerTreeHost::SetElementScrollOffsetMutated(
|
| ElementId element_id,
|
| ElementListType list_type,
|
| const gfx::ScrollOffset& scroll_offset) {
|
| - Layer* layer = LayerById(element_id);
|
| + Layer* layer = ScrollLayerForElementId(element_id);
|
| DCHECK(layer);
|
| layer->OnScrollOffsetAnimated(scroll_offset);
|
| }
|
| @@ -1353,90 +1399,133 @@ void LayerTreeHost::ElementTransformIsPotentiallyAnimatingChanged(
|
| ElementId element_id,
|
| ElementListType list_type,
|
| bool is_animating) {
|
| - Layer* layer = LayerById(element_id);
|
| - DCHECK(layer);
|
| - layer->OnTransformIsPotentiallyAnimatingChanged(is_animating);
|
| + Layer* layer = LayerForElementId(element_id);
|
| + if (layer)
|
| + layer->OnTransformIsPotentiallyAnimatingChanged(is_animating);
|
| }
|
|
|
| gfx::ScrollOffset LayerTreeHost::GetScrollOffsetForAnimation(
|
| ElementId element_id) const {
|
| - Layer* layer = LayerById(element_id);
|
| + Layer* layer = ScrollLayerForElementId(element_id);
|
| DCHECK(layer);
|
| return layer->ScrollOffsetForAnimation();
|
| }
|
|
|
| bool LayerTreeHost::ScrollOffsetAnimationWasInterrupted(
|
| const Layer* layer) const {
|
| - return animation_host_->ScrollOffsetAnimationWasInterrupted(layer->id());
|
| + if (!layer->element_id())
|
| + return false;
|
| +
|
| + return animation_host_->ScrollOffsetAnimationWasInterrupted(
|
| + layer->element_id());
|
| }
|
|
|
| bool LayerTreeHost::IsAnimatingFilterProperty(const Layer* layer) const {
|
| - return animation_host_->IsAnimatingFilterProperty(layer->id(),
|
| + if (!layer->element_id())
|
| + return false;
|
| +
|
| + return animation_host_->IsAnimatingFilterProperty(layer->element_id(),
|
| ElementListType::ACTIVE);
|
| }
|
|
|
| bool LayerTreeHost::IsAnimatingOpacityProperty(const Layer* layer) const {
|
| - return animation_host_->IsAnimatingOpacityProperty(layer->id(),
|
| + if (!layer->element_id())
|
| + return false;
|
| +
|
| + return animation_host_->IsAnimatingOpacityProperty(layer->element_id(),
|
| ElementListType::ACTIVE);
|
| }
|
|
|
| bool LayerTreeHost::IsAnimatingTransformProperty(const Layer* layer) const {
|
| - return animation_host_->IsAnimatingTransformProperty(layer->id(),
|
| + if (!layer->element_id())
|
| + return false;
|
| +
|
| + return animation_host_->IsAnimatingTransformProperty(layer->element_id(),
|
| ElementListType::ACTIVE);
|
| }
|
|
|
| bool LayerTreeHost::HasPotentiallyRunningFilterAnimation(
|
| const Layer* layer) const {
|
| + if (!layer->element_id())
|
| + return false;
|
| +
|
| return animation_host_->HasPotentiallyRunningFilterAnimation(
|
| - layer->id(), ElementListType::ACTIVE);
|
| + layer->element_id(), ElementListType::ACTIVE);
|
| }
|
|
|
| bool LayerTreeHost::HasPotentiallyRunningOpacityAnimation(
|
| const Layer* layer) const {
|
| + if (!layer->element_id())
|
| + return false;
|
| +
|
| return animation_host_->HasPotentiallyRunningOpacityAnimation(
|
| - layer->id(), ElementListType::ACTIVE);
|
| + layer->element_id(), ElementListType::ACTIVE);
|
| }
|
|
|
| bool LayerTreeHost::HasPotentiallyRunningTransformAnimation(
|
| const Layer* layer) const {
|
| + if (!layer->element_id())
|
| + return false;
|
| +
|
| return animation_host_->HasPotentiallyRunningTransformAnimation(
|
| - layer->id(), ElementListType::ACTIVE);
|
| + layer->element_id(), ElementListType::ACTIVE);
|
| }
|
|
|
| bool LayerTreeHost::HasOnlyTranslationTransforms(const Layer* layer) const {
|
| - return animation_host_->HasOnlyTranslationTransforms(layer->id(),
|
| + if (!layer->element_id())
|
| + return true;
|
| +
|
| + return animation_host_->HasOnlyTranslationTransforms(layer->element_id(),
|
| ElementListType::ACTIVE);
|
| }
|
|
|
| bool LayerTreeHost::MaximumTargetScale(const Layer* layer,
|
| float* max_scale) const {
|
| + if (!layer->element_id())
|
| + return true;
|
| +
|
| return animation_host_->MaximumTargetScale(
|
| - layer->id(), ElementListType::ACTIVE, max_scale);
|
| + layer->element_id(), ElementListType::ACTIVE, max_scale);
|
| }
|
|
|
| bool LayerTreeHost::AnimationStartScale(const Layer* layer,
|
| float* start_scale) const {
|
| + if (!layer->element_id())
|
| + return true;
|
| +
|
| return animation_host_->AnimationStartScale(
|
| - layer->id(), ElementListType::ACTIVE, start_scale);
|
| + layer->element_id(), ElementListType::ACTIVE, start_scale);
|
| }
|
|
|
| bool LayerTreeHost::HasAnyAnimationTargetingProperty(
|
| const Layer* layer,
|
| TargetProperty::Type property) const {
|
| - return animation_host_->HasAnyAnimationTargetingProperty(layer->id(),
|
| + if (!layer->element_id())
|
| + return false;
|
| +
|
| + return animation_host_->HasAnyAnimationTargetingProperty(layer->element_id(),
|
| property);
|
| }
|
|
|
| bool LayerTreeHost::AnimationsPreserveAxisAlignment(const Layer* layer) const {
|
| - return animation_host_->AnimationsPreserveAxisAlignment(layer->id());
|
| + if (!layer->element_id())
|
| + return true;
|
| +
|
| + return animation_host_->AnimationsPreserveAxisAlignment(layer->element_id());
|
| }
|
|
|
| bool LayerTreeHost::HasAnyAnimation(const Layer* layer) const {
|
| - return animation_host_->HasAnyAnimation(layer->id());
|
| + if (!layer->element_id())
|
| + return false;
|
| +
|
| + return animation_host_->HasAnyAnimation(layer->element_id());
|
| }
|
|
|
| bool LayerTreeHost::HasActiveAnimationForTesting(const Layer* layer) const {
|
| - return animation_host_->HasActiveAnimationForTesting(layer->id());
|
| + if (!layer->element_id())
|
| + return false;
|
| +
|
| + return animation_host_->HasActiveAnimationForTesting(layer->element_id());
|
| }
|
|
|
| bool LayerTreeHost::IsSingleThreaded() const {
|
|
|