Index: ui/compositor/layer.cc |
diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc |
index 31c5da6a17361ba1bbf196762a28e83b1428a66f..5a1e0b9cb79136a480eb413907dcea982d994fdd 100644 |
--- a/ui/compositor/layer.cc |
+++ b/ui/compositor/layer.cc |
@@ -28,7 +28,6 @@ |
#include "ui/compositor/compositor_switches.h" |
#include "ui/compositor/dip_util.h" |
#include "ui/compositor/layer_animator.h" |
-#include "ui/compositor/layer_observer.h" |
#include "ui/compositor/paint_context.h" |
#include "ui/gfx/animation/animation.h" |
#include "ui/gfx/canvas.h" |
@@ -95,7 +94,37 @@ Layer::Layer(LayerType type) |
CreateCcLayer(); |
} |
+Layer::Layer(const Layer& layer) |
+ : Layer(layer.type_) { |
+ SetVisible(layer.GetTargetVisibility()); |
+ SetOpacity(layer.GetTargetOpacity()); |
+ SetBounds(layer.bounds_); |
+ SetMasksToBounds(layer.GetMasksToBounds()); |
+ set_name(layer.name_); |
+ SetFillsBoundsOpaquely(layer.fills_bounds_opaquely_); |
+ SetFillsBoundsCompletely(layer.fills_bounds_completely_); |
+ SetSubpixelPositionOffset(layer.subpixel_position_offset_); |
+ SetLayerInverted(layer.layer_inverted_); |
+ SetTransform(layer.GetTargetTransform()); |
+ if (layer.type_ == LAYER_SOLID_COLOR) |
+ SetColor(layer.GetTargetColor()); |
+ if (SkRegion* alpha_shape = layer.alpha_shape()) |
+ SetAlphaShape(base::MakeUnique<SkRegion>(*alpha_shape)); |
+ |
+ const cc::SurfaceLayer* const surface = layer.surface_layer_.get(); |
+ if (surface && !surface->surface_id().is_null()) { |
+ SetShowSurface( |
+ surface->surface_id(), |
+ surface->satisfy_callback(), surface->require_callback(), |
+ surface->surface_size(), surface->surface_scale(), |
+ layer.frame_size_in_dip_); |
+ } |
+} |
+ |
Layer::~Layer() { |
+ for (auto* mirror : mirrors_) |
+ mirror->RemoveObserver(this); |
+ |
FOR_EACH_OBSERVER(LayerObserver, observer_list_, LayerDestroyed(this)); |
// Destroying the animator may cause observers to use the layer (and |
@@ -592,7 +621,17 @@ void Layer::SetShowSurface( |
frame_size_in_dip_ = frame_size_in_dip; |
RecomputeDrawsContentAndUVRect(); |
- FOR_EACH_OBSERVER(LayerObserver, observer_list_, SurfaceChanged(this)); |
+ for (auto* mirror : mirrors_) { |
+ mirror->SetShowSurface(surface_id, satisfy_callback, require_callback, |
+ surface_size, scale, frame_size_in_dip); |
+ } |
+} |
+ |
+std::unique_ptr<Layer> Layer::Mirror() { |
+ std::unique_ptr<Layer> mirror(new Layer(*this)); |
+ mirror->AddObserver(this); |
+ mirrors_.push_back(mirror.get()); |
+ return mirror; |
} |
void Layer::SetShowSolidColorContent() { |
@@ -649,9 +688,10 @@ void Layer::UpdateNinePatchOcclusion(const gfx::Rect& occlusion) { |
void Layer::SetColor(SkColor color) { GetAnimator()->SetColor(color); } |
-SkColor Layer::GetTargetColor() { |
- if (GetAnimator()->IsAnimatingProperty(LayerAnimationElement::COLOR)) |
- return GetAnimator()->GetTargetColor(); |
+SkColor Layer::GetTargetColor() const { |
+ if (animator_.get() && animator_->IsAnimatingProperty( |
+ LayerAnimationElement::COLOR)) |
+ return animator_->GetTargetColor(); |
return cc_layer_->background_color(); |
} |
@@ -914,6 +954,11 @@ void Layer::SetBoundsFromAnimation(const gfx::Rect& bounds) { |
// Always schedule a paint, even if we're invisible. |
SchedulePaint(gfx::Rect(bounds.size())); |
} |
+ |
+ if (sync_bounds_) { |
+ for (auto* mirror : mirrors_) |
+ mirror->SetBounds(bounds); |
sky
2016/10/13 19:21:33
I don't think it's always the case that the mirror
Dominik Laskowski
2016/10/13 22:19:39
Good point. I've added an option to disable bounds
|
+ } |
} |
void Layer::SetTransformFromAnimation(const gfx::Transform& transform) { |
@@ -1003,6 +1048,12 @@ LayerThreadedAnimationDelegate* Layer::GetThreadedAnimationDelegate() { |
return animator_.get(); |
} |
+void Layer::LayerDestroyed(Layer* mirror) { |
+ const auto it = std::find(mirrors_.begin(), mirrors_.end(), mirror); |
sky
2016/10/13 19:21:33
mirror->RemoveObserver(this).
Dominik Laskowski
2016/10/13 22:19:39
The caller is the destructor of |mirror|, so that'
|
+ DCHECK(it != mirrors_.end()); |
+ mirrors_.erase(it); |
+} |
+ |
void Layer::CreateCcLayer() { |
if (type_ == LAYER_SOLID_COLOR) { |
solid_color_layer_ = cc::SolidColorLayer::Create(); |