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

Side by Side Diff: ui/android/delegated_frame_host_android.cc

Issue 2302023003: Set content opacity of DFHAndroid surfacelayer based on renderer frame contents. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: modify background color Created 4 years, 3 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 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 "cc/layers/solid_color_layer.h" 9 #include "cc/layers/solid_color_layer.h"
10 #include "cc/layers/surface_layer.h" 10 #include "cc/layers/surface_layer.h"
(...skipping 27 matching lines...) Expand all
38 if (!surface) { 38 if (!surface) {
39 LOG(ERROR) << "Attempting to require callback on nonexistent surface"; 39 LOG(ERROR) << "Attempting to require callback on nonexistent surface";
40 return; 40 return;
41 } 41 }
42 surface->AddDestructionDependency(sequence); 42 surface->AddDestructionDependency(sequence);
43 } 43 }
44 44
45 scoped_refptr<cc::SurfaceLayer> CreateSurfaceLayer( 45 scoped_refptr<cc::SurfaceLayer> CreateSurfaceLayer(
46 cc::SurfaceManager* surface_manager, 46 cc::SurfaceManager* surface_manager,
47 cc::SurfaceId surface_id, 47 cc::SurfaceId surface_id,
48 const gfx::Size surface_size) { 48 const gfx::Size surface_size,
49 bool surface_opaque) {
49 // manager must outlive compositors using it. 50 // manager must outlive compositors using it.
50 scoped_refptr<cc::SurfaceLayer> layer = cc::SurfaceLayer::Create( 51 scoped_refptr<cc::SurfaceLayer> layer = cc::SurfaceLayer::Create(
51 base::Bind(&SatisfyCallback, base::Unretained(surface_manager)), 52 base::Bind(&SatisfyCallback, base::Unretained(surface_manager)),
52 base::Bind(&RequireCallback, base::Unretained(surface_manager))); 53 base::Bind(&RequireCallback, base::Unretained(surface_manager)));
53 layer->SetSurfaceId(surface_id, 1.f, surface_size); 54 layer->SetSurfaceId(surface_id, 1.f, surface_size);
54 layer->SetBounds(surface_size); 55 layer->SetBounds(surface_size);
55 layer->SetIsDrawable(true); 56 layer->SetIsDrawable(true);
56 layer->SetContentsOpaque(true); 57 layer->SetContentsOpaque(surface_opaque);
57 58
58 return layer; 59 return layer;
59 } 60 }
60 61
61 void CopyOutputRequestCallback( 62 void CopyOutputRequestCallback(
62 scoped_refptr<cc::Layer> readback_layer, 63 scoped_refptr<cc::Layer> readback_layer,
63 cc::CopyOutputRequest::CopyOutputRequestCallback result_callback, 64 cc::CopyOutputRequest::CopyOutputRequestCallback result_callback,
64 std::unique_ptr<cc::CopyOutputResult> copy_output_result) { 65 std::unique_ptr<cc::CopyOutputResult> copy_output_result) {
65 readback_layer->RemoveFromParent(); 66 readback_layer->RemoveFromParent();
66 result_callback.Run(std::move(copy_output_result)); 67 result_callback.Run(std::move(copy_output_result));
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 116
116 if (!current_frame_ || surface_size != current_frame_->surface_size || 117 if (!current_frame_ || surface_size != current_frame_->surface_size ||
117 current_frame_->top_controls_height != 118 current_frame_->top_controls_height !=
118 frame.metadata.top_controls_height || 119 frame.metadata.top_controls_height ||
119 current_frame_->top_controls_shown_ratio != 120 current_frame_->top_controls_shown_ratio !=
120 frame.metadata.top_controls_shown_ratio || 121 frame.metadata.top_controls_shown_ratio ||
121 current_frame_->bottom_controls_height != 122 current_frame_->bottom_controls_height !=
122 frame.metadata.bottom_controls_height || 123 frame.metadata.bottom_controls_height ||
123 current_frame_->bottom_controls_shown_ratio != 124 current_frame_->bottom_controls_shown_ratio !=
124 frame.metadata.bottom_controls_shown_ratio || 125 frame.metadata.bottom_controls_shown_ratio ||
125 current_frame_->viewport_selection != frame.metadata.selection) { 126 current_frame_->viewport_selection != frame.metadata.selection ||
127 current_frame_->has_transparent_background !=
128 root_pass->has_transparent_background) {
126 DestroyDelegatedContent(); 129 DestroyDelegatedContent();
127 DCHECK(!content_layer_); 130 DCHECK(!content_layer_);
128 DCHECK(!current_frame_); 131 DCHECK(!current_frame_);
129 132
130 current_frame_ = base::MakeUnique<FrameData>(); 133 current_frame_ = base::MakeUnique<FrameData>();
131 current_frame_->surface_id = surface_id_allocator_->GenerateId(); 134 current_frame_->surface_id = surface_id_allocator_->GenerateId();
132 surface_factory_->Create(current_frame_->surface_id); 135 surface_factory_->Create(current_frame_->surface_id);
133 136
134 current_frame_->surface_size = surface_size; 137 current_frame_->surface_size = surface_size;
135 current_frame_->top_controls_height = frame.metadata.top_controls_height; 138 current_frame_->top_controls_height = frame.metadata.top_controls_height;
136 current_frame_->top_controls_shown_ratio = 139 current_frame_->top_controls_shown_ratio =
137 frame.metadata.top_controls_shown_ratio; 140 frame.metadata.top_controls_shown_ratio;
138 current_frame_->bottom_controls_height = 141 current_frame_->bottom_controls_height =
139 frame.metadata.bottom_controls_height; 142 frame.metadata.bottom_controls_height;
140 current_frame_->bottom_controls_shown_ratio = 143 current_frame_->bottom_controls_shown_ratio =
141 frame.metadata.bottom_controls_shown_ratio; 144 frame.metadata.bottom_controls_shown_ratio;
145 current_frame_->has_transparent_background =
146 root_pass->has_transparent_background;
142 147
143 current_frame_->viewport_selection = frame.metadata.selection; 148 current_frame_->viewport_selection = frame.metadata.selection;
144 content_layer_ = 149 content_layer_ =
145 CreateSurfaceLayer(surface_manager_, current_frame_->surface_id, 150 CreateSurfaceLayer(surface_manager_, current_frame_->surface_id,
146 current_frame_->surface_size); 151 current_frame_->surface_size,
152 !current_frame_->has_transparent_background);
147 view_->GetLayer()->AddChild(content_layer_); 153 view_->GetLayer()->AddChild(content_layer_);
148 UpdateBackgroundLayer(); 154 UpdateBackgroundLayer();
149 } 155 }
150 156
151 surface_factory_->SubmitCompositorFrame(current_frame_->surface_id, 157 surface_factory_->SubmitCompositorFrame(current_frame_->surface_id,
152 std::move(frame), draw_callback); 158 std::move(frame), draw_callback);
153 } 159 }
154 160
155 uint32_t DelegatedFrameHostAndroid::GetSurfaceClientId() const { 161 uint32_t DelegatedFrameHostAndroid::GetSurfaceClientId() const {
156 return surface_id_allocator_->client_id(); 162 return surface_id_allocator_->client_id();
157 } 163 }
158 164
159 void DelegatedFrameHostAndroid::RequestCopyOfSurface( 165 void DelegatedFrameHostAndroid::RequestCopyOfSurface(
160 WindowAndroidCompositor* compositor, 166 WindowAndroidCompositor* compositor,
161 const gfx::Rect& src_subrect_in_pixel, 167 const gfx::Rect& src_subrect_in_pixel,
162 cc::CopyOutputRequest::CopyOutputRequestCallback result_callback) { 168 cc::CopyOutputRequest::CopyOutputRequestCallback result_callback) {
163 DCHECK(current_frame_); 169 DCHECK(current_frame_);
164 DCHECK(!result_callback.is_null()); 170 DCHECK(!result_callback.is_null());
165 171
166 scoped_refptr<cc::Layer> readback_layer = 172 scoped_refptr<cc::Layer> readback_layer =
167 CreateSurfaceLayer(surface_manager_, current_frame_->surface_id, 173 CreateSurfaceLayer(surface_manager_, current_frame_->surface_id,
168 current_frame_->surface_size); 174 current_frame_->surface_size,
175 !current_frame_->has_transparent_background);
no sievers 2016/09/02 22:06:52 nit: maybe just make the readback layer always opa
169 readback_layer->SetHideLayerAndSubtree(true); 176 readback_layer->SetHideLayerAndSubtree(true);
170 compositor->AttachLayerForReadback(readback_layer); 177 compositor->AttachLayerForReadback(readback_layer);
171 std::unique_ptr<cc::CopyOutputRequest> copy_output_request = 178 std::unique_ptr<cc::CopyOutputRequest> copy_output_request =
172 cc::CopyOutputRequest::CreateRequest(base::Bind( 179 cc::CopyOutputRequest::CreateRequest(base::Bind(
173 &CopyOutputRequestCallback, readback_layer, result_callback)); 180 &CopyOutputRequestCallback, readback_layer, result_callback));
174 181
175 if (!src_subrect_in_pixel.IsEmpty()) 182 if (!src_subrect_in_pixel.IsEmpty())
176 copy_output_request->set_area(src_subrect_in_pixel); 183 copy_output_request->set_area(src_subrect_in_pixel);
177 184
178 readback_layer->RequestCopyOfOutput(std::move(copy_output_request)); 185 readback_layer->RequestCopyOfOutput(std::move(copy_output_request));
(...skipping 20 matching lines...) Expand all
199 206
200 void DelegatedFrameHostAndroid::OutputSurfaceChanged() { 207 void DelegatedFrameHostAndroid::OutputSurfaceChanged() {
201 DestroyDelegatedContent(); 208 DestroyDelegatedContent();
202 surface_factory_.reset(); 209 surface_factory_.reset();
203 } 210 }
204 211
205 void DelegatedFrameHostAndroid::UpdateBackgroundColor(SkColor color) { 212 void DelegatedFrameHostAndroid::UpdateBackgroundColor(SkColor color) {
206 background_layer_->SetBackgroundColor(color); 213 background_layer_->SetBackgroundColor(color);
207 } 214 }
208 215
209 void DelegatedFrameHostAndroid::SetContentsOpaque(bool opaque) {
210 if (!content_layer_)
211 return;
212 content_layer_->SetContentsOpaque(opaque);
213 }
214
215 void DelegatedFrameHostAndroid::UpdateContainerSizeinDIP( 216 void DelegatedFrameHostAndroid::UpdateContainerSizeinDIP(
216 const gfx::Size& size_in_dip) { 217 const gfx::Size& size_in_dip) {
217 container_size_in_dip_ = size_in_dip; 218 container_size_in_dip_ = size_in_dip;
218 background_layer_->SetBounds(gfx::ConvertSizeToPixel( 219 background_layer_->SetBounds(gfx::ConvertSizeToPixel(
219 gfx::DeviceDisplayInfo().GetDIPScale(), container_size_in_dip_)); 220 gfx::DeviceDisplayInfo().GetDIPScale(), container_size_in_dip_));
220 UpdateBackgroundLayer(); 221 UpdateBackgroundLayer();
221 } 222 }
222 223
223 void DelegatedFrameHostAndroid::ReturnResources( 224 void DelegatedFrameHostAndroid::ReturnResources(
224 const cc::ReturnedResourceArray& resources) { 225 const cc::ReturnedResourceArray& resources) {
(...skipping 20 matching lines...) Expand all
245 content_size_in_dip.width() < container_size_in_dip_.width() || 246 content_size_in_dip.width() < container_size_in_dip_.width() ||
246 content_size_in_dip.height() < container_size_in_dip_.height(); 247 content_size_in_dip.height() < container_size_in_dip_.height();
247 } else { 248 } else {
248 background_is_drawable = true; 249 background_is_drawable = true;
249 } 250 }
250 251
251 background_layer_->SetIsDrawable(background_is_drawable); 252 background_layer_->SetIsDrawable(background_is_drawable);
252 } 253 }
253 254
254 } // namespace ui 255 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698