Chromium Code Reviews| Index: cc/layers/layer.cc |
| diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc |
| index 8d07366441b10ff6e5d3359c64851d1cc9a64b47..a8e81b37b5f776c3e81237261a22c35c4ce8d46c 100644 |
| --- a/cc/layers/layer.cc |
| +++ b/cc/layers/layer.cc |
| @@ -47,6 +47,8 @@ Layer::Layer() |
| background_color_(0), |
| compositing_reasons_(kCompositingReasonUnknown), |
| opacity_(1.f), |
| + blend_mode_(SkXfermode::kSrcOver_Mode), |
| + is_root_for_isolated_group_(false), |
| anchor_point_z_(0.f), |
| is_container_for_fixed_position_layers_(false), |
| is_drawable_(false), |
| @@ -125,8 +127,7 @@ void Layer::SetLayerTreeHost(LayerTreeHost* host) { |
| if (host && layer_animation_controller_->has_any_animation()) |
| host->SetNeedsCommit(); |
| - if (host && (!filters_.IsEmpty() || !background_filters_.IsEmpty())) |
| - layer_tree_host_->set_needs_filter_context(); |
| + SetNeedsFilterContextIfNeeded(); |
| } |
| void Layer::SetNeedsUpdate() { |
| @@ -160,6 +161,15 @@ void Layer::SetNextCommitWaitsForActivation() { |
| layer_tree_host_->SetNextCommitWaitsForActivation(); |
| } |
| +void Layer::SetNeedsFilterContextIfNeeded() { |
| + if (!layer_tree_host_) |
| + return; |
| + |
| + if (!filters_.IsEmpty() || !background_filters_.IsEmpty() || |
| + !uses_default_blend_mode()) |
| + layer_tree_host_->set_needs_filter_context(); |
| +} |
| + |
| void Layer::SetNeedsPushProperties() { |
| if (needs_push_properties_) |
| return; |
| @@ -471,8 +481,7 @@ void Layer::SetFilters(const FilterOperations& filters) { |
| return; |
| filters_ = filters; |
| SetNeedsCommit(); |
| - if (!filters.IsEmpty() && layer_tree_host_) |
| - layer_tree_host_->set_needs_filter_context(); |
| + SetNeedsFilterContextIfNeeded(); |
| } |
| bool Layer::FilterIsAnimating() const { |
| @@ -485,8 +494,7 @@ void Layer::SetBackgroundFilters(const FilterOperations& filters) { |
| return; |
| background_filters_ = filters; |
| SetNeedsCommit(); |
| - if (!filters.IsEmpty() && layer_tree_host_) |
| - layer_tree_host_->set_needs_filter_context(); |
| + SetNeedsFilterContextIfNeeded(); |
| } |
| void Layer::SetOpacity(float opacity) { |
| @@ -505,6 +513,33 @@ bool Layer::OpacityCanAnimateOnImplThread() const { |
| return false; |
| } |
| +void Layer::SetBlendMode(SkXfermode::Mode blend_mode) { |
| + DCHECK(IsPropertyChangeAllowed()); |
| + if (blend_mode_ == blend_mode) |
| + return; |
| + |
| + // Allowing only blend modes that are defined in the CSS Compositing standard: |
| + // http://dev.w3.org/fxtf/compositing-1/#blending |
| + bool is_blend_mode = (blend_mode == SkXfermode::kSrcOver_Mode || |
|
enne (OOO)
2013/11/04 22:38:16
naming: is_blend_mode => supported_blend_mode or e
rosca
2013/11/05 19:14:09
We call the other modes "Compositing operators", b
|
| + (blend_mode >= SkXfermode::kScreen_Mode && |
| + blend_mode <= SkXfermode::kLastMode)); |
|
enne (OOO)
2013/11/04 22:38:16
This doesn't seem very futureproof. Could you jus
rosca
2013/11/05 19:14:09
Done.
|
| + DCHECK(is_blend_mode); |
| + if (!is_blend_mode) |
| + return; |
| + |
| + blend_mode_ = blend_mode; |
| + SetNeedsCommit(); |
| + SetNeedsFilterContextIfNeeded(); |
| +} |
| + |
| +void Layer::SetIsRootForIsolatedGroup(bool root) { |
| + DCHECK(IsPropertyChangeAllowed()); |
| + if (is_root_for_isolated_group_ == root) |
| + return; |
| + is_root_for_isolated_group_ = root; |
| + SetNeedsCommit(); |
| +} |
| + |
| void Layer::SetContentsOpaque(bool opaque) { |
| DCHECK(IsPropertyChangeAllowed()); |
| if (contents_opaque_ == opaque) |
| @@ -832,6 +867,8 @@ void Layer::PushPropertiesTo(LayerImpl* layer) { |
| if (!layer->OpacityIsAnimatingOnImplOnly() && !OpacityIsAnimating()) |
| layer->SetOpacity(opacity_); |
| DCHECK(!(OpacityIsAnimating() && layer->OpacityIsAnimatingOnImplOnly())); |
| + layer->SetBlendMode(blend_mode_); |
| + layer->SetIsRootForIsolatedGroup(is_root_for_isolated_group_); |
| layer->SetPosition(position_); |
| layer->SetIsContainerForFixedPositionLayers( |
| IsContainerForFixedPositionLayers()); |