Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host_view_android.cc |
| diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc |
| index c1aa70b52ef90ce1733e1576ad58885982f04060..7c263c4673f9c633dafb5c7ef67154f5f1e7da26 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_android.cc |
| +++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
| @@ -139,7 +139,7 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
| ContentViewCoreImpl* content_view_core) |
| : host_(widget_host), |
| needs_begin_frame_(false), |
| - are_layers_attached_(!widget_host->is_hidden()), |
| + is_showing_(!widget_host->is_hidden()), |
| content_view_core_(NULL), |
| ime_adapter_android_(this), |
| cached_background_color_(SK_ColorWHITE), |
| @@ -259,31 +259,21 @@ void RenderWidgetHostViewAndroid::SetBounds(const gfx::Rect& rect) { |
| SetSize(rect.size()); |
| } |
| -blink::WebGLId RenderWidgetHostViewAndroid::GetScaledContentTexture( |
| +void RenderWidgetHostViewAndroid::GetScaledContentBitmap( |
| float scale, |
| - gfx::Size* out_size) { |
| - gfx::Size size(gfx::ToCeiledSize( |
| - gfx::ScaleSize(texture_size_in_layer_, scale))); |
| - |
| - if (!CompositorImpl::IsInitialized() || |
| - texture_id_in_layer_ == 0 || |
| - texture_size_in_layer_.IsEmpty() || |
| - size.IsEmpty()) { |
| - if (out_size) |
| - out_size->SetSize(0, 0); |
| - |
| - return 0; |
| - } |
| - |
| - if (out_size) |
| - *out_size = size; |
| - |
| - GLHelper* helper = ImageTransportFactoryAndroid::GetInstance()->GetGLHelper(); |
| - return helper->CopyAndScaleTexture(texture_id_in_layer_, |
| - texture_size_in_layer_, |
| - size, |
| - true, |
| - GLHelper::SCALER_QUALITY_FAST); |
| + gfx::Size* out_size, |
| + const base::Callback<void(bool, const SkBitmap&)>& callback) { |
| + gfx::Size bounds = layer_->bounds(); |
| + gfx::Rect src_subrect(bounds); |
| + const gfx::Display& display = |
| + gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); |
| + float device_scale_factor = display.device_scale_factor(); |
| + DCHECK_GT(device_scale_factor, 0); |
| + gfx::Size dst_size( |
| + gfx::ToCeiledSize(gfx::ScaleSize(bounds, scale / device_scale_factor))); |
| + *out_size = dst_size; |
| + view->ResetClipping(); |
|
no sievers
2014/01/28 20:47:21
Not sure how this is used by the app, it's really
powei
2014/01/29 13:53:17
Done. Not affecting delegated rendering so remove
|
| + CopyFromCompositingSurface(src_subrect, dst_size, callback, false); |
| } |
| bool RenderWidgetHostViewAndroid::PopulateBitmapWithContents(jobject jbitmap) { |
| @@ -323,6 +313,9 @@ bool RenderWidgetHostViewAndroid::PopulateBitmapWithContents(jobject jbitmap) { |
| bool RenderWidgetHostViewAndroid::HasValidFrame() const { |
| if (!content_view_core_) |
| return false; |
|
no sievers
2014/01/28 20:47:21
nit: Can we just check for !layer_ here.
If the l
powei
2014/01/29 13:53:17
Done
|
| + if (!layer_ || !layer_->parent()) |
| + return false; |
| + |
| if (texture_size_in_layer_.IsEmpty()) |
| return false; |
| @@ -387,10 +380,10 @@ bool RenderWidgetHostViewAndroid::IsSurfaceAvailableForCopy() const { |
| } |
| void RenderWidgetHostViewAndroid::Show() { |
| - if (are_layers_attached_) |
| + if (is_showing_) |
| return; |
| - are_layers_attached_ = true; |
| + is_showing_ = true; |
| AttachLayers(); |
|
no sievers
2014/01/28 20:47:21
Can this just call layer_->SetHideLayerAndSubtree(
powei
2014/01/29 13:53:17
Done.
|
| frame_evictor_->SetVisible(true); |
| @@ -398,11 +391,11 @@ void RenderWidgetHostViewAndroid::Show() { |
| } |
| void RenderWidgetHostViewAndroid::Hide() { |
| - if (!are_layers_attached_) |
| + if (!is_showing_) |
| return; |
| - are_layers_attached_ = false; |
| - RemoveLayers(); |
| + is_showing_ = false; |
| + AttachLayers(); |
|
no sievers
2014/01/28 20:47:21
Can this just call layer_->SetHideLayerAndSubtree(
powei
2014/01/29 13:53:17
Done.
|
| frame_evictor_->SetVisible(false); |
| WasHidden(); |
| @@ -412,7 +405,7 @@ bool RenderWidgetHostViewAndroid::IsShowing() { |
| // ContentViewCoreImpl represents the native side of the Java |
| // ContentViewCore. It being NULL means that it is not attached |
| // to the View system yet, so we treat this RWHVA as hidden. |
| - return are_layers_attached_ && content_view_core_; |
| + return is_showing_ && content_view_core_; |
| } |
| void RenderWidgetHostViewAndroid::LockResources() { |
| @@ -690,6 +683,7 @@ void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( |
| start_time, |
| callback)); |
| } |
| + |
| request->set_area(src_subrect_in_pixel); |
| layer_->RequestCopyOfOutput(request.Pass()); |
| } |
| @@ -739,8 +733,7 @@ void RenderWidgetHostViewAndroid::UnusedResourcesAreAvailable() { |
| } |
| void RenderWidgetHostViewAndroid::DestroyDelegatedContent() { |
| - if (are_layers_attached_) |
| - RemoveLayers(); |
| + RemoveLayers(); |
| frame_provider_ = NULL; |
| delegated_renderer_layer_ = NULL; |
| layer_ = NULL; |
| @@ -776,15 +769,13 @@ void RenderWidgetHostViewAndroid::SwapDelegatedFrame( |
| } |
| if (!frame_provider_ || |
| texture_size_in_layer_ != frame_provider_->frame_size()) { |
| - if (are_layers_attached_) |
| - RemoveLayers(); |
| + RemoveLayers(); |
| frame_provider_ = new cc::DelegatedFrameProvider( |
| resource_collection_.get(), frame_data.Pass()); |
| delegated_renderer_layer_ = |
| cc::DelegatedRendererLayer::Create(frame_provider_); |
| layer_ = delegated_renderer_layer_; |
| - if (are_layers_attached_) |
| - AttachLayers(); |
| + AttachLayers(); |
| } else { |
| frame_provider_->SetFrameData(frame_data.Pass()); |
| } |
| @@ -843,6 +834,7 @@ void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( |
| ComputeContentsSize(frame->metadata); |
| SwapDelegatedFrame(output_surface_id, frame->delegated_frame_data.Pass()); |
| + frame_evictor_->SwappedFrame(!host_->is_hidden()); |
| return; |
| } |
| @@ -995,6 +987,7 @@ void RenderWidgetHostViewAndroid::AttachLayers() { |
| content_view_core_->AttachLayer(layer_); |
| if (overscroll_effect_enabled_) |
| overscroll_effect_->Enable(); |
| + layer_->SetHideLayerAndSubtree(!is_showing_); |
| } |
| void RenderWidgetHostViewAndroid::RemoveLayers() { |
| @@ -1326,7 +1319,7 @@ SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const { |
| void RenderWidgetHostViewAndroid::OnOverscrolled( |
| gfx::Vector2dF accumulated_overscroll, |
| gfx::Vector2dF current_fling_velocity) { |
| - if (!content_view_core_ || !are_layers_attached_) |
| + if (!content_view_core_ || !layer_ || !is_showing_) |
| return; |
| if (overscroll_effect_->OnOverscrolled(content_view_core_->GetLayer(), |
| @@ -1346,9 +1339,7 @@ void RenderWidgetHostViewAndroid::SetContentViewCore( |
| ContentViewCoreImpl* content_view_core) { |
| RunAckCallbacks(); |
| - if (are_layers_attached_) |
| - RemoveLayers(); |
| - |
| + RemoveLayers(); |
| if (content_view_core_ && !using_synchronous_compositor_) |
| content_view_core_->GetWindowAndroid()->RemoveObserver(this); |
| @@ -1362,11 +1353,9 @@ void RenderWidgetHostViewAndroid::SetContentViewCore( |
| SetContentViewCore(obj); |
| } |
| - if (are_layers_attached_) { |
| - AttachLayers(); |
| - if (content_view_core_ && !using_synchronous_compositor_) |
| - content_view_core_->GetWindowAndroid()->AddObserver(this); |
| - } |
| + AttachLayers(); |
| + if (content_view_core_ && !using_synchronous_compositor_) |
| + content_view_core_->GetWindowAndroid()->AddObserver(this); |
| // Ensure ContentsViewCore is aware of the current touch handling state, eg. |
| // in case we've already been running JS for the page as part of preload. |
| @@ -1413,7 +1402,6 @@ void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( |
| const base::TimeTicks& start_time, |
| const base::Callback<void(bool, const SkBitmap&)>& callback, |
| scoped_ptr<cc::CopyOutputResult> result) { |
| - DCHECK(result->HasTexture()); |
|
no sievers
2014/01/28 20:47:21
just wondering: when is this failing?
powei
2014/01/29 13:53:17
Don't have a consistent repo, but I do hit this so
|
| base::ScopedClosureRunner scoped_callback_runner( |
| base::Bind(callback, false, SkBitmap())); |