Index: ui/compositor/layer.cc |
diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc |
index 119a1cfa868390103209691c432da434f32c665f..d35f8e352a4dfb2684c661abf04e43d5bb303da4 100644 |
--- a/ui/compositor/layer.cc |
+++ b/ui/compositor/layer.cc |
@@ -43,6 +43,7 @@ Layer::Layer() |
compositor_(NULL), |
parent_(NULL), |
visible_(true), |
+ is_drawn_(true), |
force_render_surface_(false), |
fills_bounds_opaquely_(true), |
layer_updated_externally_(false), |
@@ -70,6 +71,7 @@ Layer::Layer(LayerType type) |
compositor_(NULL), |
parent_(NULL), |
visible_(true), |
+ is_drawn_(true), |
force_render_surface_(false), |
fills_bounds_opaquely_(true), |
layer_updated_externally_(false), |
@@ -134,6 +136,7 @@ void Layer::Add(Layer* child) { |
children_.push_back(child); |
cc_layer_->addChild(child->cc_layer_); |
child->OnDeviceScaleFactorChanged(device_scale_factor_); |
+ child->UpdateIsDrawn(); |
} |
void Layer::Remove(Layer* child) { |
@@ -367,10 +370,21 @@ bool Layer::GetTargetVisibility() const { |
} |
bool Layer::IsDrawn() const { |
- const Layer* layer = this; |
- while (layer && layer->visible_) |
- layer = layer->parent_; |
- return layer == NULL; |
+ return is_drawn_; |
+} |
+ |
+void Layer::UpdateIsDrawn() { |
+ bool updated_is_drawn = visible_ && (!parent_ || parent_->IsDrawn()); |
+ |
+ if (updated_is_drawn == is_drawn_) |
+ return; |
+ |
+ is_drawn_ = updated_is_drawn; |
+ cc_layer_->setIsDrawable(is_drawn_ && type_ != LAYER_NOT_DRAWN); |
+ |
+ for (size_t i = 0; i < children_.size(); ++i) { |
+ children_[i]->UpdateIsDrawn(); |
+ } |
} |
bool Layer::ShouldDraw() const { |
@@ -438,9 +452,9 @@ void Layer::SetExternalTexture(Texture* texture) { |
} |
cc_layer_->setAnchorPoint(gfx::PointF()); |
cc_layer_->setContentsOpaque(fills_bounds_opaquely_); |
- cc_layer_->setOpacity(visible_ ? opacity_ : 0.f); |
+ cc_layer_->setOpacity(opacity_); |
cc_layer_->setForceRenderSurface(force_render_surface_); |
- cc_layer_->setIsDrawable(true); |
+ cc_layer_->setIsDrawable(IsDrawn()); |
RecomputeTransform(); |
} |
RecomputeDrawsContentAndUVRect(); |
@@ -642,13 +656,10 @@ void Layer::SetTransformImmediately(const gfx::Transform& transform) { |
} |
void Layer::SetOpacityImmediately(float opacity) { |
- bool schedule_draw = (opacity != opacity_ && IsDrawn()); |
opacity_ = opacity; |
- if (visible_) |
- cc_layer_->setOpacity(opacity); |
- if (schedule_draw) |
- ScheduleDraw(); |
+ cc_layer_->setOpacity(opacity); |
+ ScheduleDraw(); |
} |
void Layer::SetVisibilityImmediately(bool visible) { |
@@ -656,8 +667,7 @@ void Layer::SetVisibilityImmediately(bool visible) { |
return; |
visible_ = visible; |
- // TODO(piman): Expose a visibility flag on WebLayer. |
- cc_layer_->setOpacity(visible_ ? opacity_ : 0.f); |
+ UpdateIsDrawn(); |
} |
void Layer::SetBrightnessImmediately(float brightness) { |