 Chromium Code Reviews
 Chromium Code Reviews Issue 2383263002:
  Generalize layer mirroring for phantom windows  (Closed)
    
  
    Issue 2383263002:
  Generalize layer mirroring for phantom windows  (Closed) 
  | OLD | NEW | 
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "ui/compositor/layer.h" | 5 #include "ui/compositor/layer.h" | 
| 6 | 6 | 
| 7 #include <algorithm> | 7 #include <algorithm> | 
| 8 #include <memory> | 8 #include <memory> | 
| 9 #include <utility> | 9 #include <utility> | 
| 10 | 10 | 
| (...skipping 10 matching lines...) Expand all Loading... | |
| 21 #include "cc/layers/texture_layer.h" | 21 #include "cc/layers/texture_layer.h" | 
| 22 #include "cc/output/copy_output_request.h" | 22 #include "cc/output/copy_output_request.h" | 
| 23 #include "cc/output/filter_operation.h" | 23 #include "cc/output/filter_operation.h" | 
| 24 #include "cc/output/filter_operations.h" | 24 #include "cc/output/filter_operations.h" | 
| 25 #include "cc/playback/display_item_list_settings.h" | 25 #include "cc/playback/display_item_list_settings.h" | 
| 26 #include "cc/resources/transferable_resource.h" | 26 #include "cc/resources/transferable_resource.h" | 
| 27 #include "cc/trees/layer_tree_settings.h" | 27 #include "cc/trees/layer_tree_settings.h" | 
| 28 #include "ui/compositor/compositor_switches.h" | 28 #include "ui/compositor/compositor_switches.h" | 
| 29 #include "ui/compositor/dip_util.h" | 29 #include "ui/compositor/dip_util.h" | 
| 30 #include "ui/compositor/layer_animator.h" | 30 #include "ui/compositor/layer_animator.h" | 
| 31 #include "ui/compositor/layer_observer.h" | |
| 32 #include "ui/compositor/paint_context.h" | 31 #include "ui/compositor/paint_context.h" | 
| 33 #include "ui/gfx/animation/animation.h" | 32 #include "ui/gfx/animation/animation.h" | 
| 34 #include "ui/gfx/canvas.h" | 33 #include "ui/gfx/canvas.h" | 
| 35 #include "ui/gfx/geometry/point3_f.h" | 34 #include "ui/gfx/geometry/point3_f.h" | 
| 36 #include "ui/gfx/geometry/point_conversions.h" | 35 #include "ui/gfx/geometry/point_conversions.h" | 
| 37 #include "ui/gfx/geometry/size_conversions.h" | 36 #include "ui/gfx/geometry/size_conversions.h" | 
| 38 #include "ui/gfx/interpolated_transform.h" | 37 #include "ui/gfx/interpolated_transform.h" | 
| 39 | 38 | 
| 40 namespace { | 39 namespace { | 
| 41 | 40 | 
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 89 zoom_(1), | 88 zoom_(1), | 
| 90 zoom_inset_(0), | 89 zoom_inset_(0), | 
| 91 delegate_(NULL), | 90 delegate_(NULL), | 
| 92 owner_(NULL), | 91 owner_(NULL), | 
| 93 cc_layer_(NULL), | 92 cc_layer_(NULL), | 
| 94 device_scale_factor_(1.0f) { | 93 device_scale_factor_(1.0f) { | 
| 95 CreateCcLayer(); | 94 CreateCcLayer(); | 
| 96 } | 95 } | 
| 97 | 96 | 
| 98 Layer::~Layer() { | 97 Layer::~Layer() { | 
| 98 for (auto* mirror : mirrors_) | |
| 99 mirror->RemoveObserver(this); | |
| 100 | |
| 99 for (auto& observer : observer_list_) | 101 for (auto& observer : observer_list_) | 
| 100 observer.LayerDestroyed(this); | 102 observer.LayerDestroyed(this); | 
| 101 | 103 | 
| 102 // Destroying the animator may cause observers to use the layer (and | 104 // Destroying the animator may cause observers to use the layer (and | 
| 103 // indirectly the WebLayer). Destroy the animator first so that the WebLayer | 105 // indirectly the WebLayer). Destroy the animator first so that the WebLayer | 
| 104 // is still around. | 106 // is still around. | 
| 105 SetAnimator(nullptr); | 107 SetAnimator(nullptr); | 
| 106 if (compositor_) | 108 if (compositor_) | 
| 107 compositor_->SetRootLayer(NULL); | 109 compositor_->SetRootLayer(NULL); | 
| 108 if (parent_) | 110 if (parent_) | 
| 109 parent_->Remove(this); | 111 parent_->Remove(this); | 
| 110 if (layer_mask_) | 112 if (layer_mask_) | 
| 111 SetMaskLayer(NULL); | 113 SetMaskLayer(NULL); | 
| 112 if (layer_mask_back_link_) | 114 if (layer_mask_back_link_) | 
| 113 layer_mask_back_link_->SetMaskLayer(NULL); | 115 layer_mask_back_link_->SetMaskLayer(NULL); | 
| 114 for (size_t i = 0; i < children_.size(); ++i) | 116 for (size_t i = 0; i < children_.size(); ++i) | 
| 115 children_[i]->parent_ = NULL; | 117 children_[i]->parent_ = NULL; | 
| 116 | 118 | 
| 117 cc_layer_->RemoveFromParent(); | 119 cc_layer_->RemoveFromParent(); | 
| 118 if (mailbox_release_callback_) | 120 if (mailbox_release_callback_) | 
| 119 mailbox_release_callback_->Run(gpu::SyncToken(), false); | 121 mailbox_release_callback_->Run(gpu::SyncToken(), false); | 
| 120 } | 122 } | 
| 121 | 123 | 
| 124 std::unique_ptr<Layer> Layer::Clone() const { | |
| 125 auto clone = base::MakeUnique<Layer>(type_); | |
| 126 | |
| 127 clone->SetVisible(GetTargetVisibility()); | |
| 128 clone->SetOpacity(GetTargetOpacity()); | |
| 
sky
2016/10/14 22:36:37
What about
int background_blur_radius_, satuations
 
Dominik Laskowski
2016/10/17 19:53:21
This code was pulled from LayerOwner::RecreateLaye
 | |
| 129 clone->SetBounds(bounds_); | |
| 130 clone->SetMasksToBounds(GetMasksToBounds()); | |
| 131 clone->set_name(name_); | |
| 132 clone->SetFillsBoundsOpaquely(fills_bounds_opaquely_); | |
| 133 clone->SetFillsBoundsCompletely(fills_bounds_completely_); | |
| 134 clone->SetSubpixelPositionOffset(subpixel_position_offset_); | |
| 135 clone->SetLayerInverted(layer_inverted_); | |
| 136 clone->SetTransform(GetTargetTransform()); | |
| 137 | |
| 138 if (type_ == LAYER_SOLID_COLOR) | |
| 139 clone->SetColor(GetTargetColor()); | |
| 140 if (alpha_shape_) | |
| 141 clone->SetAlphaShape(base::MakeUnique<SkRegion>(*alpha_shape_)); | |
| 142 | |
| 143 if (surface_layer_ && !surface_layer_->surface_id().is_null()) { | |
| 144 clone->SetShowSurface( | |
| 145 surface_layer_->surface_id(), | |
| 146 surface_layer_->satisfy_callback(), | |
| 147 surface_layer_->require_callback(), | |
| 148 surface_layer_->surface_size(), | |
| 149 surface_layer_->surface_scale(), | |
| 150 frame_size_in_dip_); | |
| 151 } | |
| 152 return clone; | |
| 153 } | |
| 154 | |
| 122 const Compositor* Layer::GetCompositor() const { | 155 const Compositor* Layer::GetCompositor() const { | 
| 123 return GetRoot(this)->compositor_; | 156 return GetRoot(this)->compositor_; | 
| 124 } | 157 } | 
| 125 | 158 | 
| 126 float Layer::opacity() const { | 159 float Layer::opacity() const { | 
| 127 return cc_layer_->opacity(); | 160 return cc_layer_->opacity(); | 
| 128 } | 161 } | 
| 129 | 162 | 
| 130 void Layer::SetCompositor(Compositor* compositor, | 163 void Layer::SetCompositor(Compositor* compositor, | 
| 131 scoped_refptr<cc::Layer> root_layer) { | 164 scoped_refptr<cc::Layer> root_layer) { | 
| (...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 586 | 619 | 
| 587 scoped_refptr<cc::SurfaceLayer> new_layer = | 620 scoped_refptr<cc::SurfaceLayer> new_layer = | 
| 588 cc::SurfaceLayer::Create(satisfy_callback, require_callback); | 621 cc::SurfaceLayer::Create(satisfy_callback, require_callback); | 
| 589 new_layer->SetSurfaceId(surface_id, scale, surface_size); | 622 new_layer->SetSurfaceId(surface_id, scale, surface_size); | 
| 590 SwitchToLayer(new_layer); | 623 SwitchToLayer(new_layer); | 
| 591 surface_layer_ = new_layer; | 624 surface_layer_ = new_layer; | 
| 592 | 625 | 
| 593 frame_size_in_dip_ = frame_size_in_dip; | 626 frame_size_in_dip_ = frame_size_in_dip; | 
| 594 RecomputeDrawsContentAndUVRect(); | 627 RecomputeDrawsContentAndUVRect(); | 
| 595 | 628 | 
| 596 for (auto& observer : observer_list_) | 629 for (auto* mirror : mirrors_) { | 
| 597 observer.SurfaceChanged(this); | 630 mirror->SetShowSurface(surface_id, satisfy_callback, require_callback, | 
| 631 surface_size, scale, frame_size_in_dip); | |
| 632 } | |
| 633 } | |
| 634 | |
| 635 std::unique_ptr<Layer> Layer::Mirror() { | |
| 636 std::unique_ptr<Layer> mirror = Clone(); | |
| 637 mirror->AddObserver(this); | |
| 638 mirrors_.push_back(mirror.get()); | |
| 639 return mirror; | |
| 598 } | 640 } | 
| 599 | 641 | 
| 600 void Layer::SetShowSolidColorContent() { | 642 void Layer::SetShowSolidColorContent() { | 
| 601 DCHECK_EQ(type_, LAYER_SOLID_COLOR); | 643 DCHECK_EQ(type_, LAYER_SOLID_COLOR); | 
| 602 | 644 | 
| 603 if (solid_color_layer_.get()) | 645 if (solid_color_layer_.get()) | 
| 604 return; | 646 return; | 
| 605 | 647 | 
| 606 scoped_refptr<cc::SolidColorLayer> new_layer = cc::SolidColorLayer::Create(); | 648 scoped_refptr<cc::SolidColorLayer> new_layer = cc::SolidColorLayer::Create(); | 
| 607 SwitchToLayer(new_layer); | 649 SwitchToLayer(new_layer); | 
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 644 nine_patch_layer_->SetBorder(border); | 686 nine_patch_layer_->SetBorder(border); | 
| 645 } | 687 } | 
| 646 | 688 | 
| 647 void Layer::UpdateNinePatchOcclusion(const gfx::Rect& occlusion) { | 689 void Layer::UpdateNinePatchOcclusion(const gfx::Rect& occlusion) { | 
| 648 DCHECK(type_ == LAYER_NINE_PATCH && nine_patch_layer_.get()); | 690 DCHECK(type_ == LAYER_NINE_PATCH && nine_patch_layer_.get()); | 
| 649 nine_patch_layer_->SetLayerOcclusion(occlusion); | 691 nine_patch_layer_->SetLayerOcclusion(occlusion); | 
| 650 } | 692 } | 
| 651 | 693 | 
| 652 void Layer::SetColor(SkColor color) { GetAnimator()->SetColor(color); } | 694 void Layer::SetColor(SkColor color) { GetAnimator()->SetColor(color); } | 
| 653 | 695 | 
| 654 SkColor Layer::GetTargetColor() { | 696 SkColor Layer::GetTargetColor() const { | 
| 655 if (GetAnimator()->IsAnimatingProperty(LayerAnimationElement::COLOR)) | 697 if (animator_.get() && animator_->IsAnimatingProperty( | 
| 656 return GetAnimator()->GetTargetColor(); | 698 LayerAnimationElement::COLOR)) | 
| 699 return animator_->GetTargetColor(); | |
| 657 return cc_layer_->background_color(); | 700 return cc_layer_->background_color(); | 
| 658 } | 701 } | 
| 659 | 702 | 
| 660 SkColor Layer::background_color() const { | 703 SkColor Layer::background_color() const { | 
| 661 return cc_layer_->background_color(); | 704 return cc_layer_->background_color(); | 
| 662 } | 705 } | 
| 663 | 706 | 
| 664 bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) { | 707 bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) { | 
| 665 if ((type_ == LAYER_SOLID_COLOR && !texture_layer_.get()) || | 708 if ((type_ == LAYER_SOLID_COLOR && !texture_layer_.get()) || | 
| 666 type_ == LAYER_NINE_PATCH || (!delegate_ && !mailbox_.IsValid())) | 709 type_ == LAYER_NINE_PATCH || (!delegate_ && !mailbox_.IsValid())) | 
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 909 | 952 | 
| 910 if (bounds.size() == old_bounds.size()) { | 953 if (bounds.size() == old_bounds.size()) { | 
| 911 // Don't schedule a draw if we're invisible. We'll schedule one | 954 // Don't schedule a draw if we're invisible. We'll schedule one | 
| 912 // automatically when we get visible. | 955 // automatically when we get visible. | 
| 913 if (IsDrawn()) | 956 if (IsDrawn()) | 
| 914 ScheduleDraw(); | 957 ScheduleDraw(); | 
| 915 } else { | 958 } else { | 
| 916 // Always schedule a paint, even if we're invisible. | 959 // Always schedule a paint, even if we're invisible. | 
| 917 SchedulePaint(gfx::Rect(bounds.size())); | 960 SchedulePaint(gfx::Rect(bounds.size())); | 
| 918 } | 961 } | 
| 962 | |
| 963 if (sync_bounds_) { | |
| 964 for (auto* mirror : mirrors_) | |
| 965 mirror->SetBounds(bounds); | |
| 966 } | |
| 919 } | 967 } | 
| 920 | 968 | 
| 921 void Layer::SetTransformFromAnimation(const gfx::Transform& transform) { | 969 void Layer::SetTransformFromAnimation(const gfx::Transform& transform) { | 
| 922 cc_layer_->SetTransform(transform); | 970 cc_layer_->SetTransform(transform); | 
| 923 } | 971 } | 
| 924 | 972 | 
| 925 void Layer::SetOpacityFromAnimation(float opacity) { | 973 void Layer::SetOpacityFromAnimation(float opacity) { | 
| 926 cc_layer_->SetOpacity(opacity); | 974 cc_layer_->SetOpacity(opacity); | 
| 927 ScheduleDraw(); | 975 ScheduleDraw(); | 
| 928 } | 976 } | 
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 998 | 1046 | 
| 999 cc::Layer* Layer::GetCcLayer() const { | 1047 cc::Layer* Layer::GetCcLayer() const { | 
| 1000 return cc_layer_; | 1048 return cc_layer_; | 
| 1001 } | 1049 } | 
| 1002 | 1050 | 
| 1003 LayerThreadedAnimationDelegate* Layer::GetThreadedAnimationDelegate() { | 1051 LayerThreadedAnimationDelegate* Layer::GetThreadedAnimationDelegate() { | 
| 1004 DCHECK(animator_); | 1052 DCHECK(animator_); | 
| 1005 return animator_.get(); | 1053 return animator_.get(); | 
| 1006 } | 1054 } | 
| 1007 | 1055 | 
| 1056 void Layer::LayerDestroyed(Layer* mirror) { | |
| 1057 const auto it = std::find(mirrors_.begin(), mirrors_.end(), mirror); | |
| 1058 DCHECK(it != mirrors_.end()); | |
| 1059 mirrors_.erase(it); | |
| 1060 } | |
| 1061 | |
| 1008 void Layer::CreateCcLayer() { | 1062 void Layer::CreateCcLayer() { | 
| 1009 if (type_ == LAYER_SOLID_COLOR) { | 1063 if (type_ == LAYER_SOLID_COLOR) { | 
| 1010 solid_color_layer_ = cc::SolidColorLayer::Create(); | 1064 solid_color_layer_ = cc::SolidColorLayer::Create(); | 
| 1011 cc_layer_ = solid_color_layer_.get(); | 1065 cc_layer_ = solid_color_layer_.get(); | 
| 1012 } else if (type_ == LAYER_NINE_PATCH) { | 1066 } else if (type_ == LAYER_NINE_PATCH) { | 
| 1013 nine_patch_layer_ = cc::NinePatchLayer::Create(); | 1067 nine_patch_layer_ = cc::NinePatchLayer::Create(); | 
| 1014 cc_layer_ = nine_patch_layer_.get(); | 1068 cc_layer_ = nine_patch_layer_.get(); | 
| 1015 } else { | 1069 } else { | 
| 1016 content_layer_ = cc::PictureLayer::Create(this); | 1070 content_layer_ = cc::PictureLayer::Create(this); | 
| 1017 cc_layer_ = content_layer_.get(); | 1071 cc_layer_ = content_layer_.get(); | 
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1070 if (animator_) { | 1124 if (animator_) { | 
| 1071 animator_->DetachLayerAndTimeline(compositor); | 1125 animator_->DetachLayerAndTimeline(compositor); | 
| 1072 animator_->RemoveFromCollection(collection); | 1126 animator_->RemoveFromCollection(collection); | 
| 1073 } | 1127 } | 
| 1074 | 1128 | 
| 1075 for (auto* child : children_) | 1129 for (auto* child : children_) | 
| 1076 child->ResetCompositorForAnimatorsInTree(compositor); | 1130 child->ResetCompositorForAnimatorsInTree(compositor); | 
| 1077 } | 1131 } | 
| 1078 | 1132 | 
| 1079 } // namespace ui | 1133 } // namespace ui | 
| OLD | NEW |