Index: cc/layers/layer.cc |
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc |
index 2430f9ca74906d6c7b9eb46a3441a561bfb318b1..b643ac7e27faf6d7183d2e703ae646c0bedca412 100644 |
--- a/cc/layers/layer.cc |
+++ b/cc/layers/layer.cc |
@@ -88,6 +88,7 @@ Layer::Layer(const LayerSettings& settings) |
force_render_surface_(false), |
transform_is_invertible_(true), |
has_render_surface_(false), |
+ subtree_property_changed_(false), |
background_color_(0), |
opacity_(1.f), |
blend_mode_(SkXfermode::kSrcOver_Mode), |
@@ -424,6 +425,7 @@ void Layer::RequestCopyOfOutput( |
if (request->IsEmpty()) |
return; |
copy_requests_.push_back(std::move(request)); |
+ SetSubtreePropertyChanged(); |
SetNeedsCommit(); |
} |
@@ -460,6 +462,7 @@ void Layer::SetMasksToBounds(bool masks_to_bounds) { |
return; |
masks_to_bounds_ = masks_to_bounds; |
SetNeedsCommit(); |
+ SetSubtreePropertyChanged(); |
} |
void Layer::SetMaskLayer(Layer* mask_layer) { |
@@ -477,6 +480,7 @@ void Layer::SetMaskLayer(Layer* mask_layer) { |
mask_layer_->SetParent(this); |
mask_layer_->SetIsMask(true); |
} |
+ SetSubtreePropertyChanged(); |
SetNeedsFullTreeSync(); |
} |
@@ -494,6 +498,7 @@ void Layer::SetReplicaLayer(Layer* layer) { |
replica_layer_->RemoveFromParent(); |
replica_layer_->SetParent(this); |
} |
+ SetSubtreePropertyChanged(); |
SetNeedsFullTreeSync(); |
} |
@@ -610,6 +615,7 @@ void Layer::SetBlendMode(SkXfermode::Mode blend_mode) { |
blend_mode_ = blend_mode; |
SetNeedsCommit(); |
+ SetSubtreePropertyChanged(); |
} |
void Layer::SetIsRootForIsolatedGroup(bool root) { |
@@ -626,6 +632,7 @@ void Layer::SetContentsOpaque(bool opaque) { |
return; |
contents_opaque_ = opaque; |
SetNeedsCommit(); |
+ SetSubtreePropertyChanged(); |
} |
void Layer::SetPosition(const gfx::PointF& position) { |
@@ -1002,6 +1009,7 @@ void Layer::SetDoubleSided(bool double_sided) { |
return; |
double_sided_ = double_sided; |
SetNeedsCommit(); |
+ SetSubtreePropertyChanged(); |
} |
void Layer::Set3dSortingContextId(int id) { |
@@ -1010,6 +1018,7 @@ void Layer::Set3dSortingContextId(int id) { |
return; |
sorting_context_id_ = id; |
SetNeedsCommit(); |
+ SetSubtreePropertyChanged(); |
} |
void Layer::SetTransformTreeIndex(int index) { |
@@ -1093,6 +1102,7 @@ void Layer::SetShouldFlattenTransform(bool should_flatten) { |
return; |
should_flatten_transform_ = should_flatten; |
SetNeedsCommit(); |
+ SetSubtreePropertyChanged(); |
} |
void Layer::SetUseParentBackfaceVisibility(bool use) { |
@@ -1134,6 +1144,7 @@ void Layer::SetHideLayerAndSubtree(bool hide) { |
hide_layer_and_subtree_ = hide; |
SetNeedsCommit(); |
+ SetSubtreePropertyChanged(); |
} |
void Layer::SetNeedsDisplayRect(const gfx::Rect& dirty_rect) { |
@@ -1222,6 +1233,10 @@ void Layer::PushPropertiesTo(LayerImpl* layer) { |
layer->SetDrawsContent(DrawsContent()); |
layer->SetHideLayerAndSubtree(hide_layer_and_subtree_); |
layer->SetHasRenderSurface(has_render_surface_); |
+ // subtree_property_changed_ is propagated to all descendants while building |
+ // property trees. So, it is enough to check it only for the current layer. |
+ if (subtree_property_changed_) |
+ layer->NoteLayerPropertyChanged(); |
layer->SetForceRenderSurface(force_render_surface_); |
if (!layer->FilterIsAnimatingOnImplOnly() && !FilterIsAnimating()) |
layer->SetFilters(filters_); |
@@ -1359,6 +1374,7 @@ void Layer::PushPropertiesTo(LayerImpl* layer) { |
// Reset any state that should be cleared for the next update. |
stacking_order_changed_ = false; |
+ subtree_property_changed_ = false; |
update_rect_ = gfx::Rect(); |
needs_push_properties_ = false; |
@@ -1494,6 +1510,7 @@ void Layer::LayerSpecificPropertiesToProto(proto::LayerProperties* proto) { |
base->set_draws_content(draws_content_); |
base->set_hide_layer_and_subtree(hide_layer_and_subtree_); |
base->set_has_render_surface(has_render_surface_); |
+ base->set_subtree_property_changed(subtree_property_changed_); |
// TODO(nyquist): Add support for serializing FilterOperations for |
// |filters_| and |background_filters_|. See crbug.com/541321. |
@@ -1582,6 +1599,7 @@ void Layer::FromLayerSpecificPropertiesProto( |
draws_content_ = base.draws_content(); |
hide_layer_and_subtree_ = base.hide_layer_and_subtree(); |
has_render_surface_ = base.has_render_surface(); |
+ subtree_property_changed_ = base.subtree_property_changed(); |
masks_to_bounds_ = base.masks_to_bounds(); |
main_thread_scrolling_reasons_ = base.main_thread_scrolling_reasons(); |
non_fast_scrollable_region_ = |
@@ -1733,6 +1751,13 @@ void Layer::SetHasRenderSurface(bool has_render_surface) { |
SetNeedsPushProperties(); |
} |
+void Layer::SetSubtreePropertyChanged() { |
+ if (subtree_property_changed_) |
+ return; |
+ subtree_property_changed_ = true; |
+ SetNeedsPushProperties(); |
+} |
+ |
gfx::ScrollOffset Layer::ScrollOffsetForAnimation() const { |
return CurrentScrollOffset(); |
} |