Index: cc/trees/layer_tree_host_impl.cc |
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc |
index d9f1a22aefd1c60effdaa1f527280a69a8ceda65..a4745800fc0d7c283d2add4f62fe5c0322fb3d95 100644 |
--- a/cc/trees/layer_tree_host_impl.cc |
+++ b/cc/trees/layer_tree_host_impl.cc |
@@ -72,6 +72,7 @@ |
#include "cc/trees/damage_tracker.h" |
#include "cc/trees/debug_rect_history.h" |
#include "cc/trees/draw_property_utils.h" |
+#include "cc/trees/effect_node.h" |
#include "cc/trees/frame_rate_counter.h" |
#include "cc/trees/latency_info_swap_promise_monitor.h" |
#include "cc/trees/layer_tree_host_common.h" |
@@ -79,6 +80,7 @@ |
#include "cc/trees/mutator_host.h" |
#include "cc/trees/scroll_node.h" |
#include "cc/trees/single_thread_proxy.h" |
+#include "cc/trees/transform_node.h" |
#include "cc/trees/tree_synchronizer.h" |
#include "gpu/GLES2/gl2extchromium.h" |
#include "gpu/command_buffer/client/context_support.h" |
@@ -2041,10 +2043,10 @@ void LayerTreeHostImpl::ActivateSyncTree() { |
else |
active_tree_->MoveChangeTrackingToLayers(); |
} |
+ TreeSynchronizer::PushLayerProperties(pending_tree(), active_tree()); |
active_tree_->property_trees()->PushOpacityIfNeeded( |
pending_tree_->property_trees()); |
- TreeSynchronizer::PushLayerProperties(pending_tree(), active_tree()); |
pending_tree_->PushPropertiesTo(active_tree_.get()); |
if (!pending_tree_->LayerListIsEmpty()) |
pending_tree_->property_trees()->ResetAllChangeTracking(); |
@@ -4120,13 +4122,75 @@ void LayerTreeHostImpl::ElementIsAnimatingChanged( |
ElementListType list_type, |
const PropertyAnimationState& mask, |
const PropertyAnimationState& state) { |
+ // TODO(weiliangc): Most of the code is duplicated with LayerTeeHost version |
+ // of function. Should try to share code. |
LayerTreeImpl* tree = |
list_type == ElementListType::ACTIVE ? active_tree() : pending_tree(); |
if (!tree) |
return; |
- LayerImpl* layer = tree->LayerByElementId(element_id); |
- if (layer) |
- layer->OnIsAnimatingChanged(mask, state); |
+ PropertyTrees* property_trees = tree->property_trees(); |
+ |
+ for (int property = TargetProperty::FIRST_TARGET_PROPERTY; |
+ property <= TargetProperty::LAST_TARGET_PROPERTY; ++property) { |
+ if (!mask.currently_running[property] && |
+ !mask.potentially_animating[property]) |
+ continue; |
+ |
+ switch (property) { |
+ case TargetProperty::TRANSFORM: |
+ if (TransformNode* transform_node = |
+ property_trees->transform_tree.FindNodeFromElementId( |
+ element_id)) { |
+ if (mask.currently_running[property]) |
+ transform_node->is_currently_animating = |
+ state.currently_running[property]; |
+ if (mask.potentially_animating[property]) { |
+ transform_node->has_potential_animation = |
+ state.potentially_animating[property]; |
+ transform_node->has_only_translation_animations = |
+ mutator_host()->HasOnlyTranslationTransforms(element_id, |
+ list_type); |
+ property_trees->transform_tree.set_needs_update(true); |
+ tree->set_needs_update_draw_properties(); |
+ // TODO(crbug.com/702777): |
+ // was_ever_ready_since_last_transform_animation should not live on |
+ // layers. |
+ if (LayerImpl* layer = tree->LayerByElementId(element_id)) { |
+ layer->set_was_ever_ready_since_last_transform_animation(false); |
+ } |
+ } |
+ } |
+ break; |
+ case TargetProperty::OPACITY: |
+ if (EffectNode* effect_node = |
+ property_trees->effect_tree.FindNodeFromElementId(element_id)) { |
+ if (mask.currently_running[property]) |
+ effect_node->is_currently_animating_opacity = |
+ state.currently_running[property]; |
+ if (mask.potentially_animating[property]) { |
+ effect_node->has_potential_opacity_animation = |
+ state.potentially_animating[property]; |
+ property_trees->effect_tree.set_needs_update(true); |
+ } |
+ } |
+ break; |
+ case TargetProperty::FILTER: |
+ if (EffectNode* effect_node = |
+ property_trees->effect_tree.FindNodeFromElementId(element_id)) { |
+ if (mask.currently_running[property]) |
+ effect_node->is_currently_animating_filter = |
+ state.currently_running[property]; |
+ if (mask.potentially_animating[property]) |
+ effect_node->has_potential_filter_animation = |
+ state.potentially_animating[property]; |
+ // Filter animation changes only the node, and the subtree does not |
+ // care. There is no need to request update on property trees here. |
+ } |
+ break; |
+ default: |
+ break; |
+ } |
+ } |
} |
void LayerTreeHostImpl::ScrollOffsetAnimationFinished() { |