| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/android/delegated_frame_host_android.h" | 5 #include "ui/android/delegated_frame_host_android.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "cc/layers/solid_color_layer.h" | 10 #include "cc/layers/solid_color_layer.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 cc::CopyOutputRequest::CopyOutputRequestCallback result_callback, | 46 cc::CopyOutputRequest::CopyOutputRequestCallback result_callback, |
| 47 std::unique_ptr<cc::CopyOutputResult> copy_output_result) { | 47 std::unique_ptr<cc::CopyOutputResult> copy_output_result) { |
| 48 readback_layer->RemoveFromParent(); | 48 readback_layer->RemoveFromParent(); |
| 49 result_callback.Run(std::move(copy_output_result)); | 49 result_callback.Run(std::move(copy_output_result)); |
| 50 } | 50 } |
| 51 | 51 |
| 52 } // namespace | 52 } // namespace |
| 53 | 53 |
| 54 DelegatedFrameHostAndroid::DelegatedFrameHostAndroid( | 54 DelegatedFrameHostAndroid::DelegatedFrameHostAndroid( |
| 55 ui::ViewAndroid* view, | 55 ui::ViewAndroid* view, |
| 56 SkColor background_color, | |
| 57 Client* client, | 56 Client* client, |
| 58 const cc::FrameSinkId& frame_sink_id) | 57 const cc::FrameSinkId& frame_sink_id) |
| 59 : frame_sink_id_(frame_sink_id), | 58 : frame_sink_id_(frame_sink_id), view_(view), client_(client) { |
| 60 view_(view), | |
| 61 client_(client), | |
| 62 background_layer_(cc::SolidColorLayer::Create()) { | |
| 63 DCHECK(view_); | 59 DCHECK(view_); |
| 64 DCHECK(client_); | 60 DCHECK(client_); |
| 65 | 61 |
| 66 surface_manager_ = | 62 surface_manager_ = |
| 67 ui::ContextProviderFactory::GetInstance()->GetSurfaceManager(); | 63 ui::ContextProviderFactory::GetInstance()->GetSurfaceManager(); |
| 68 local_surface_id_allocator_.reset(new cc::LocalSurfaceIdAllocator()); | 64 local_surface_id_allocator_.reset(new cc::LocalSurfaceIdAllocator()); |
| 69 surface_manager_->RegisterFrameSinkId(frame_sink_id_); | 65 surface_manager_->RegisterFrameSinkId(frame_sink_id_); |
| 70 surface_factory_ = base::WrapUnique( | 66 surface_factory_ = base::WrapUnique( |
| 71 new cc::SurfaceFactory(frame_sink_id_, surface_manager_, this)); | 67 new cc::SurfaceFactory(frame_sink_id_, surface_manager_, this)); |
| 72 | |
| 73 background_layer_->SetBackgroundColor(background_color); | |
| 74 view_->GetLayer()->AddChild(background_layer_); | |
| 75 UpdateBackgroundLayer(); | |
| 76 } | 68 } |
| 77 | 69 |
| 78 DelegatedFrameHostAndroid::~DelegatedFrameHostAndroid() { | 70 DelegatedFrameHostAndroid::~DelegatedFrameHostAndroid() { |
| 79 DestroyDelegatedContent(); | 71 DestroyDelegatedContent(); |
| 80 surface_factory_.reset(); | 72 surface_factory_.reset(); |
| 81 DetachFromCompositor(); | 73 DetachFromCompositor(); |
| 82 surface_manager_->InvalidateFrameSinkId(frame_sink_id_); | 74 surface_manager_->InvalidateFrameSinkId(frame_sink_id_); |
| 83 background_layer_->RemoveFromParent(); | |
| 84 } | 75 } |
| 85 | 76 |
| 86 DelegatedFrameHostAndroid::FrameData::FrameData() = default; | 77 DelegatedFrameHostAndroid::FrameData::FrameData() = default; |
| 87 | 78 |
| 88 DelegatedFrameHostAndroid::FrameData::~FrameData() = default; | 79 DelegatedFrameHostAndroid::FrameData::~FrameData() = default; |
| 89 | 80 |
| 90 void DelegatedFrameHostAndroid::SubmitCompositorFrame( | 81 void DelegatedFrameHostAndroid::SubmitCompositorFrame( |
| 91 cc::CompositorFrame frame, | 82 cc::CompositorFrame frame, |
| 92 cc::SurfaceFactory::DrawCallback draw_callback) { | 83 cc::SurfaceFactory::DrawCallback draw_callback) { |
| 93 cc::RenderPass* root_pass = frame.render_pass_list.back().get(); | 84 cc::RenderPass* root_pass = frame.render_pass_list.back().get(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 current_frame_->viewport_selection = frame.metadata.selection; | 116 current_frame_->viewport_selection = frame.metadata.selection; |
| 126 surface_factory_->SubmitCompositorFrame(current_frame_->local_surface_id, | 117 surface_factory_->SubmitCompositorFrame(current_frame_->local_surface_id, |
| 127 std::move(frame), draw_callback); | 118 std::move(frame), draw_callback); |
| 128 | 119 |
| 129 content_layer_ = CreateSurfaceLayer( | 120 content_layer_ = CreateSurfaceLayer( |
| 130 surface_manager_, cc::SurfaceId(surface_factory_->frame_sink_id(), | 121 surface_manager_, cc::SurfaceId(surface_factory_->frame_sink_id(), |
| 131 current_frame_->local_surface_id), | 122 current_frame_->local_surface_id), |
| 132 current_frame_->surface_size, | 123 current_frame_->surface_size, |
| 133 !current_frame_->has_transparent_background); | 124 !current_frame_->has_transparent_background); |
| 134 view_->GetLayer()->AddChild(content_layer_); | 125 view_->GetLayer()->AddChild(content_layer_); |
| 135 UpdateBackgroundLayer(); | |
| 136 } else { | 126 } else { |
| 137 surface_factory_->SubmitCompositorFrame(current_frame_->local_surface_id, | 127 surface_factory_->SubmitCompositorFrame(current_frame_->local_surface_id, |
| 138 std::move(frame), draw_callback); | 128 std::move(frame), draw_callback); |
| 139 } | 129 } |
| 140 } | 130 } |
| 141 | 131 |
| 142 cc::FrameSinkId DelegatedFrameHostAndroid::GetFrameSinkId() const { | 132 cc::FrameSinkId DelegatedFrameHostAndroid::GetFrameSinkId() const { |
| 143 return frame_sink_id_; | 133 return frame_sink_id_; |
| 144 } | 134 } |
| 145 | 135 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 170 void DelegatedFrameHostAndroid::DestroyDelegatedContent() { | 160 void DelegatedFrameHostAndroid::DestroyDelegatedContent() { |
| 171 if (!current_frame_) | 161 if (!current_frame_) |
| 172 return; | 162 return; |
| 173 | 163 |
| 174 DCHECK(content_layer_); | 164 DCHECK(content_layer_); |
| 175 | 165 |
| 176 content_layer_->RemoveFromParent(); | 166 content_layer_->RemoveFromParent(); |
| 177 content_layer_ = nullptr; | 167 content_layer_ = nullptr; |
| 178 surface_factory_->EvictSurface(); | 168 surface_factory_->EvictSurface(); |
| 179 current_frame_.reset(); | 169 current_frame_.reset(); |
| 180 | |
| 181 UpdateBackgroundLayer(); | |
| 182 } | 170 } |
| 183 | 171 |
| 184 bool DelegatedFrameHostAndroid::HasDelegatedContent() const { | 172 bool DelegatedFrameHostAndroid::HasDelegatedContent() const { |
| 185 return current_frame_.get() != nullptr; | 173 return current_frame_.get() != nullptr; |
| 186 } | 174 } |
| 187 | 175 |
| 188 void DelegatedFrameHostAndroid::CompositorFrameSinkChanged() { | 176 void DelegatedFrameHostAndroid::CompositorFrameSinkChanged() { |
| 189 DestroyDelegatedContent(); | 177 DestroyDelegatedContent(); |
| 190 surface_factory_->Reset(); | 178 surface_factory_->Reset(); |
| 191 } | 179 } |
| 192 | 180 |
| 193 void DelegatedFrameHostAndroid::UpdateBackgroundColor(SkColor color) { | |
| 194 background_layer_->SetBackgroundColor(color); | |
| 195 } | |
| 196 | |
| 197 void DelegatedFrameHostAndroid::UpdateContainerSizeinDIP( | |
| 198 const gfx::Size& size_in_dip) { | |
| 199 container_size_in_dip_ = size_in_dip; | |
| 200 float device_scale_factor = display::Screen::GetScreen() | |
| 201 ->GetDisplayNearestWindow(view_).device_scale_factor(); | |
| 202 background_layer_->SetBounds( | |
| 203 gfx::ConvertSizeToPixel(device_scale_factor, container_size_in_dip_)); | |
| 204 UpdateBackgroundLayer(); | |
| 205 } | |
| 206 | |
| 207 void DelegatedFrameHostAndroid::AttachToCompositor( | 181 void DelegatedFrameHostAndroid::AttachToCompositor( |
| 208 WindowAndroidCompositor* compositor) { | 182 WindowAndroidCompositor* compositor) { |
| 209 if (registered_parent_compositor_) | 183 if (registered_parent_compositor_) |
| 210 DetachFromCompositor(); | 184 DetachFromCompositor(); |
| 211 surface_manager_->RegisterSurfaceFactoryClient(frame_sink_id_, this); | 185 surface_manager_->RegisterSurfaceFactoryClient(frame_sink_id_, this); |
| 212 compositor->AddChildFrameSink(frame_sink_id_); | 186 compositor->AddChildFrameSink(frame_sink_id_); |
| 213 registered_parent_compositor_ = compositor; | 187 registered_parent_compositor_ = compositor; |
| 214 } | 188 } |
| 215 | 189 |
| 216 void DelegatedFrameHostAndroid::DetachFromCompositor() { | 190 void DelegatedFrameHostAndroid::DetachFromCompositor() { |
| 217 if (!registered_parent_compositor_) | 191 if (!registered_parent_compositor_) |
| 218 return; | 192 return; |
| 219 surface_manager_->UnregisterSurfaceFactoryClient(frame_sink_id_); | 193 surface_manager_->UnregisterSurfaceFactoryClient(frame_sink_id_); |
| 220 registered_parent_compositor_->RemoveChildFrameSink(frame_sink_id_); | 194 registered_parent_compositor_->RemoveChildFrameSink(frame_sink_id_); |
| 221 registered_parent_compositor_ = nullptr; | 195 registered_parent_compositor_ = nullptr; |
| 222 } | 196 } |
| 223 | 197 |
| 224 void DelegatedFrameHostAndroid::ReturnResources( | 198 void DelegatedFrameHostAndroid::ReturnResources( |
| 225 const cc::ReturnedResourceArray& resources) { | 199 const cc::ReturnedResourceArray& resources) { |
| 226 client_->ReturnResources(resources); | 200 client_->ReturnResources(resources); |
| 227 } | 201 } |
| 228 | 202 |
| 229 void DelegatedFrameHostAndroid::SetBeginFrameSource( | 203 void DelegatedFrameHostAndroid::SetBeginFrameSource( |
| 230 cc::BeginFrameSource* begin_frame_source) { | 204 cc::BeginFrameSource* begin_frame_source) { |
| 231 client_->SetBeginFrameSource(begin_frame_source); | 205 client_->SetBeginFrameSource(begin_frame_source); |
| 232 } | 206 } |
| 233 | 207 |
| 234 void DelegatedFrameHostAndroid::UpdateBackgroundLayer() { | |
| 235 // The background layer draws in 2 cases: | |
| 236 // 1) When we don't have any content from the renderer. | |
| 237 // 2) When the bounds of the content received from the renderer does not match | |
| 238 // the desired content bounds. | |
| 239 bool background_is_drawable = false; | |
| 240 | |
| 241 if (current_frame_) { | |
| 242 float device_scale_factor = display::Screen::GetScreen() | |
| 243 ->GetDisplayNearestWindow(view_).device_scale_factor(); | |
| 244 gfx::Size content_size_in_dip = gfx::ConvertSizeToDIP( | |
| 245 device_scale_factor, current_frame_->surface_size); | |
| 246 background_is_drawable = | |
| 247 content_size_in_dip.width() < container_size_in_dip_.width() || | |
| 248 content_size_in_dip.height() < container_size_in_dip_.height(); | |
| 249 } else { | |
| 250 background_is_drawable = true; | |
| 251 } | |
| 252 | |
| 253 background_layer_->SetIsDrawable(background_is_drawable); | |
| 254 } | |
| 255 | |
| 256 } // namespace ui | 208 } // namespace ui |
| OLD | NEW |