Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(378)

Side by Side Diff: ui/compositor/layer.cc

Issue 2383263002: Generalize layer mirroring for phantom windows (Closed)
Patch Set: Rebase Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 layer_mask_back_link_(NULL), 87 layer_mask_back_link_(NULL),
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
97 Layer::Layer(const Layer& layer)
98 : Layer(layer.type_) {
99 SetVisible(layer.GetTargetVisibility());
100 SetOpacity(layer.GetTargetOpacity());
101 SetBounds(layer.bounds_);
102 SetMasksToBounds(layer.GetMasksToBounds());
103 set_name(layer.name_);
104 SetFillsBoundsOpaquely(layer.fills_bounds_opaquely_);
105 SetFillsBoundsCompletely(layer.fills_bounds_completely_);
106 SetSubpixelPositionOffset(layer.subpixel_position_offset_);
107 SetLayerInverted(layer.layer_inverted_);
108 SetTransform(layer.GetTargetTransform());
109 if (layer.type_ == LAYER_SOLID_COLOR)
110 SetColor(layer.GetTargetColor());
111 if (SkRegion* alpha_shape = layer.alpha_shape())
112 SetAlphaShape(base::MakeUnique<SkRegion>(*alpha_shape));
113
114 const cc::SurfaceLayer* const surface = layer.surface_layer_.get();
115 if (surface && !surface->surface_id().is_null()) {
116 SetShowSurface(
117 surface->surface_id(),
118 surface->satisfy_callback(), surface->require_callback(),
119 surface->surface_size(), surface->surface_scale(),
120 layer.frame_size_in_dip_);
121 }
122 }
123
98 Layer::~Layer() { 124 Layer::~Layer() {
125 for (auto* mirror : mirrors_)
126 mirror->RemoveObserver(this);
127
99 FOR_EACH_OBSERVER(LayerObserver, observer_list_, LayerDestroyed(this)); 128 FOR_EACH_OBSERVER(LayerObserver, observer_list_, LayerDestroyed(this));
100 129
101 // Destroying the animator may cause observers to use the layer (and 130 // Destroying the animator may cause observers to use the layer (and
102 // indirectly the WebLayer). Destroy the animator first so that the WebLayer 131 // indirectly the WebLayer). Destroy the animator first so that the WebLayer
103 // is still around. 132 // is still around.
104 SetAnimator(nullptr); 133 SetAnimator(nullptr);
105 if (compositor_) 134 if (compositor_)
106 compositor_->SetRootLayer(NULL); 135 compositor_->SetRootLayer(NULL);
107 if (parent_) 136 if (parent_)
108 parent_->Remove(this); 137 parent_->Remove(this);
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after
585 614
586 scoped_refptr<cc::SurfaceLayer> new_layer = 615 scoped_refptr<cc::SurfaceLayer> new_layer =
587 cc::SurfaceLayer::Create(satisfy_callback, require_callback); 616 cc::SurfaceLayer::Create(satisfy_callback, require_callback);
588 new_layer->SetSurfaceId(surface_id, scale, surface_size); 617 new_layer->SetSurfaceId(surface_id, scale, surface_size);
589 SwitchToLayer(new_layer); 618 SwitchToLayer(new_layer);
590 surface_layer_ = new_layer; 619 surface_layer_ = new_layer;
591 620
592 frame_size_in_dip_ = frame_size_in_dip; 621 frame_size_in_dip_ = frame_size_in_dip;
593 RecomputeDrawsContentAndUVRect(); 622 RecomputeDrawsContentAndUVRect();
594 623
595 FOR_EACH_OBSERVER(LayerObserver, observer_list_, SurfaceChanged(this)); 624 for (auto* mirror : mirrors_) {
625 mirror->SetShowSurface(surface_id, satisfy_callback, require_callback,
626 surface_size, scale, frame_size_in_dip);
627 }
628 }
629
630 std::unique_ptr<Layer> Layer::Mirror() {
631 std::unique_ptr<Layer> mirror(new Layer(*this));
632 mirror->AddObserver(this);
633 mirrors_.push_back(mirror.get());
634 return mirror;
596 } 635 }
597 636
598 void Layer::SetShowSolidColorContent() { 637 void Layer::SetShowSolidColorContent() {
599 DCHECK_EQ(type_, LAYER_SOLID_COLOR); 638 DCHECK_EQ(type_, LAYER_SOLID_COLOR);
600 639
601 if (solid_color_layer_.get()) 640 if (solid_color_layer_.get())
602 return; 641 return;
603 642
604 scoped_refptr<cc::SolidColorLayer> new_layer = cc::SolidColorLayer::Create(); 643 scoped_refptr<cc::SolidColorLayer> new_layer = cc::SolidColorLayer::Create();
605 SwitchToLayer(new_layer); 644 SwitchToLayer(new_layer);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 nine_patch_layer_->SetBorder(border); 681 nine_patch_layer_->SetBorder(border);
643 } 682 }
644 683
645 void Layer::UpdateNinePatchOcclusion(const gfx::Rect& occlusion) { 684 void Layer::UpdateNinePatchOcclusion(const gfx::Rect& occlusion) {
646 DCHECK(type_ == LAYER_NINE_PATCH && nine_patch_layer_.get()); 685 DCHECK(type_ == LAYER_NINE_PATCH && nine_patch_layer_.get());
647 nine_patch_layer_->SetLayerOcclusion(occlusion); 686 nine_patch_layer_->SetLayerOcclusion(occlusion);
648 } 687 }
649 688
650 void Layer::SetColor(SkColor color) { GetAnimator()->SetColor(color); } 689 void Layer::SetColor(SkColor color) { GetAnimator()->SetColor(color); }
651 690
652 SkColor Layer::GetTargetColor() { 691 SkColor Layer::GetTargetColor() const {
653 if (GetAnimator()->IsAnimatingProperty(LayerAnimationElement::COLOR)) 692 if (animator_.get() && animator_->IsAnimatingProperty(
654 return GetAnimator()->GetTargetColor(); 693 LayerAnimationElement::COLOR))
694 return animator_->GetTargetColor();
655 return cc_layer_->background_color(); 695 return cc_layer_->background_color();
656 } 696 }
657 697
658 SkColor Layer::background_color() const { 698 SkColor Layer::background_color() const {
659 return cc_layer_->background_color(); 699 return cc_layer_->background_color();
660 } 700 }
661 701
662 bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) { 702 bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) {
663 if ((type_ == LAYER_SOLID_COLOR && !texture_layer_.get()) || 703 if ((type_ == LAYER_SOLID_COLOR && !texture_layer_.get()) ||
664 type_ == LAYER_NINE_PATCH || (!delegate_ && !mailbox_.IsValid())) 704 type_ == LAYER_NINE_PATCH || (!delegate_ && !mailbox_.IsValid()))
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
907 947
908 if (bounds.size() == old_bounds.size()) { 948 if (bounds.size() == old_bounds.size()) {
909 // Don't schedule a draw if we're invisible. We'll schedule one 949 // Don't schedule a draw if we're invisible. We'll schedule one
910 // automatically when we get visible. 950 // automatically when we get visible.
911 if (IsDrawn()) 951 if (IsDrawn())
912 ScheduleDraw(); 952 ScheduleDraw();
913 } else { 953 } else {
914 // Always schedule a paint, even if we're invisible. 954 // Always schedule a paint, even if we're invisible.
915 SchedulePaint(gfx::Rect(bounds.size())); 955 SchedulePaint(gfx::Rect(bounds.size()));
916 } 956 }
957
958 if (sync_bounds_) {
959 for (auto* mirror : mirrors_)
960 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
961 }
917 } 962 }
918 963
919 void Layer::SetTransformFromAnimation(const gfx::Transform& transform) { 964 void Layer::SetTransformFromAnimation(const gfx::Transform& transform) {
920 cc_layer_->SetTransform(transform); 965 cc_layer_->SetTransform(transform);
921 } 966 }
922 967
923 void Layer::SetOpacityFromAnimation(float opacity) { 968 void Layer::SetOpacityFromAnimation(float opacity) {
924 cc_layer_->SetOpacity(opacity); 969 cc_layer_->SetOpacity(opacity);
925 ScheduleDraw(); 970 ScheduleDraw();
926 } 971 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
996 1041
997 cc::Layer* Layer::GetCcLayer() const { 1042 cc::Layer* Layer::GetCcLayer() const {
998 return cc_layer_; 1043 return cc_layer_;
999 } 1044 }
1000 1045
1001 LayerThreadedAnimationDelegate* Layer::GetThreadedAnimationDelegate() { 1046 LayerThreadedAnimationDelegate* Layer::GetThreadedAnimationDelegate() {
1002 DCHECK(animator_); 1047 DCHECK(animator_);
1003 return animator_.get(); 1048 return animator_.get();
1004 } 1049 }
1005 1050
1051 void Layer::LayerDestroyed(Layer* mirror) {
1052 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'
1053 DCHECK(it != mirrors_.end());
1054 mirrors_.erase(it);
1055 }
1056
1006 void Layer::CreateCcLayer() { 1057 void Layer::CreateCcLayer() {
1007 if (type_ == LAYER_SOLID_COLOR) { 1058 if (type_ == LAYER_SOLID_COLOR) {
1008 solid_color_layer_ = cc::SolidColorLayer::Create(); 1059 solid_color_layer_ = cc::SolidColorLayer::Create();
1009 cc_layer_ = solid_color_layer_.get(); 1060 cc_layer_ = solid_color_layer_.get();
1010 } else if (type_ == LAYER_NINE_PATCH) { 1061 } else if (type_ == LAYER_NINE_PATCH) {
1011 nine_patch_layer_ = cc::NinePatchLayer::Create(); 1062 nine_patch_layer_ = cc::NinePatchLayer::Create();
1012 cc_layer_ = nine_patch_layer_.get(); 1063 cc_layer_ = nine_patch_layer_.get();
1013 } else { 1064 } else {
1014 content_layer_ = cc::PictureLayer::Create(this); 1065 content_layer_ = cc::PictureLayer::Create(this);
1015 cc_layer_ = content_layer_.get(); 1066 cc_layer_ = content_layer_.get();
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1068 if (animator_) { 1119 if (animator_) {
1069 animator_->DetachLayerAndTimeline(compositor); 1120 animator_->DetachLayerAndTimeline(compositor);
1070 animator_->RemoveFromCollection(collection); 1121 animator_->RemoveFromCollection(collection);
1071 } 1122 }
1072 1123
1073 for (auto* child : children_) 1124 for (auto* child : children_)
1074 child->ResetCompositorForAnimatorsInTree(compositor); 1125 child->ResetCompositorForAnimatorsInTree(compositor);
1075 } 1126 }
1076 1127
1077 } // namespace ui 1128 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698