| 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 394707f70c645ed827eed5b45b8ffe83735ef699..f9393b982ea4a023772a16b1c13d534f8b2b6642 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,26 @@ 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;
|
| + gfx::Size* out_size,
|
| + const base::Callback<void(bool, const SkBitmap&)>& result_callback) {
|
| + if (!IsSurfaceAvailableForCopy()) {
|
| + result_callback.Run(false, SkBitmap());
|
| + return;
|
| }
|
|
|
| - 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 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;
|
| + CopyFromCompositingSurface(
|
| + src_subrect, dst_size, result_callback, SkBitmap::kARGB_8888_Config);
|
| }
|
|
|
| bool RenderWidgetHostViewAndroid::PopulateBitmapWithContents(jobject jbitmap) {
|
| @@ -323,6 +318,9 @@ bool RenderWidgetHostViewAndroid::PopulateBitmapWithContents(jobject jbitmap) {
|
| bool RenderWidgetHostViewAndroid::HasValidFrame() const {
|
| if (!content_view_core_)
|
| return false;
|
| + if (!layer_)
|
| + return false;
|
| +
|
| if (texture_size_in_layer_.IsEmpty())
|
| return false;
|
|
|
| @@ -387,22 +385,24 @@ bool RenderWidgetHostViewAndroid::IsSurfaceAvailableForCopy() const {
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::Show() {
|
| - if (are_layers_attached_)
|
| + if (is_showing_)
|
| return;
|
|
|
| - are_layers_attached_ = true;
|
| - AttachLayers();
|
| + is_showing_ = true;
|
| + if (layer_)
|
| + layer_->SetHideLayerAndSubtree(false);
|
|
|
| frame_evictor_->SetVisible(true);
|
| WasShown();
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::Hide() {
|
| - if (!are_layers_attached_)
|
| + if (!is_showing_)
|
| return;
|
|
|
| - are_layers_attached_ = false;
|
| - RemoveLayers();
|
| + is_showing_ = false;
|
| + if (layer_)
|
| + layer_->SetHideLayerAndSubtree(true);
|
|
|
| frame_evictor_->SetVisible(false);
|
| WasHidden();
|
| @@ -412,7 +412,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() {
|
| @@ -661,11 +661,8 @@ void RenderWidgetHostViewAndroid::CopyFromCompositingSurface(
|
| const gfx::Display& display =
|
| gfx::Screen::GetNativeScreen()->GetPrimaryDisplay();
|
| float device_scale_factor = display.device_scale_factor();
|
| -
|
| - DCHECK_EQ(device_scale_factor,
|
| - ui::GetImageScale(GetScaleFactorForView(this)));
|
| -
|
| - const gfx::Size& dst_size_in_pixel = ConvertViewSizeToPixel(this, dst_size);
|
| + gfx::Size dst_size_in_pixel =
|
| + ConvertRectToPixel(device_scale_factor, gfx::Rect(dst_size)).size();
|
| gfx::Rect src_subrect_in_pixel =
|
| ConvertRectToPixel(device_scale_factor, src_subrect);
|
|
|
| @@ -756,8 +753,7 @@ void RenderWidgetHostViewAndroid::UnusedResourcesAreAvailable() {
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::DestroyDelegatedContent() {
|
| - if (are_layers_attached_)
|
| - RemoveLayers();
|
| + RemoveLayers();
|
| frame_provider_ = NULL;
|
| delegated_renderer_layer_ = NULL;
|
| layer_ = NULL;
|
| @@ -792,15 +788,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());
|
| }
|
| @@ -859,6 +853,7 @@ void RenderWidgetHostViewAndroid::OnSwapCompositorFrame(
|
| ComputeContentsSize(frame->metadata);
|
|
|
| SwapDelegatedFrame(output_surface_id, frame->delegated_frame_data.Pass());
|
| + frame_evictor_->SwappedFrame(!host_->is_hidden());
|
| return;
|
| }
|
|
|
| @@ -1011,6 +1006,7 @@ void RenderWidgetHostViewAndroid::AttachLayers() {
|
| content_view_core_->AttachLayer(layer_);
|
| if (overscroll_effect_enabled_)
|
| overscroll_effect_->Enable();
|
| + layer_->SetHideLayerAndSubtree(!is_showing_);
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::RemoveLayers() {
|
| @@ -1331,7 +1327,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(),
|
| @@ -1351,9 +1347,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);
|
|
|
| @@ -1367,11 +1361,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);
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::RunAckCallbacks() {
|
| @@ -1407,7 +1399,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());
|
| base::ScopedClosureRunner scoped_callback_runner(
|
| base::Bind(callback, false, SkBitmap()));
|
|
|
|
|