| Index: trunk/src/content/browser/renderer_host/render_widget_host_view_android.cc
|
| ===================================================================
|
| --- trunk/src/content/browser/renderer_host/render_widget_host_view_android.cc (revision 248975)
|
| +++ trunk/src/content/browser/renderer_host/render_widget_host_view_android.cc (working copy)
|
| @@ -139,7 +139,7 @@
|
| ContentViewCoreImpl* content_view_core)
|
| : host_(widget_host),
|
| needs_begin_frame_(false),
|
| - is_showing_(!widget_host->is_hidden()),
|
| + are_layers_attached_(!widget_host->is_hidden()),
|
| content_view_core_(NULL),
|
| ime_adapter_android_(this),
|
| cached_background_color_(SK_ColorWHITE),
|
| @@ -259,26 +259,31 @@
|
| SetSize(rect.size());
|
| }
|
|
|
| -void RenderWidgetHostViewAndroid::GetScaledContentBitmap(
|
| +blink::WebGLId RenderWidgetHostViewAndroid::GetScaledContentTexture(
|
| float scale,
|
| - gfx::Size* out_size,
|
| - const base::Callback<void(bool, const SkBitmap&)>& result_callback) {
|
| - if (!IsSurfaceAvailableForCopy()) {
|
| - result_callback.Run(false, SkBitmap());
|
| - return;
|
| + 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 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);
|
| + 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);
|
| }
|
|
|
| bool RenderWidgetHostViewAndroid::PopulateBitmapWithContents(jobject jbitmap) {
|
| @@ -318,9 +323,6 @@
|
| bool RenderWidgetHostViewAndroid::HasValidFrame() const {
|
| if (!content_view_core_)
|
| return false;
|
| - if (!layer_)
|
| - return false;
|
| -
|
| if (texture_size_in_layer_.IsEmpty())
|
| return false;
|
|
|
| @@ -385,24 +387,22 @@
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::Show() {
|
| - if (is_showing_)
|
| + if (are_layers_attached_)
|
| return;
|
|
|
| - is_showing_ = true;
|
| - if (layer_)
|
| - layer_->SetHideLayerAndSubtree(false);
|
| + are_layers_attached_ = true;
|
| + AttachLayers();
|
|
|
| frame_evictor_->SetVisible(true);
|
| WasShown();
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::Hide() {
|
| - if (!is_showing_)
|
| + if (!are_layers_attached_)
|
| return;
|
|
|
| - is_showing_ = false;
|
| - if (layer_)
|
| - layer_->SetHideLayerAndSubtree(true);
|
| + are_layers_attached_ = false;
|
| + RemoveLayers();
|
|
|
| frame_evictor_->SetVisible(false);
|
| WasHidden();
|
| @@ -412,7 +412,7 @@
|
| // 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 is_showing_ && content_view_core_;
|
| + return are_layers_attached_ && content_view_core_;
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::LockResources() {
|
| @@ -756,7 +756,8 @@
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::DestroyDelegatedContent() {
|
| - RemoveLayers();
|
| + if (are_layers_attached_)
|
| + RemoveLayers();
|
| frame_provider_ = NULL;
|
| delegated_renderer_layer_ = NULL;
|
| layer_ = NULL;
|
| @@ -791,13 +792,15 @@
|
| }
|
| if (!frame_provider_ ||
|
| texture_size_in_layer_ != frame_provider_->frame_size()) {
|
| - RemoveLayers();
|
| + if (are_layers_attached_)
|
| + RemoveLayers();
|
| frame_provider_ = new cc::DelegatedFrameProvider(
|
| resource_collection_.get(), frame_data.Pass());
|
| delegated_renderer_layer_ =
|
| cc::DelegatedRendererLayer::Create(frame_provider_);
|
| layer_ = delegated_renderer_layer_;
|
| - AttachLayers();
|
| + if (are_layers_attached_)
|
| + AttachLayers();
|
| } else {
|
| frame_provider_->SetFrameData(frame_data.Pass());
|
| }
|
| @@ -856,7 +859,6 @@
|
| ComputeContentsSize(frame->metadata);
|
|
|
| SwapDelegatedFrame(output_surface_id, frame->delegated_frame_data.Pass());
|
| - frame_evictor_->SwappedFrame(!host_->is_hidden());
|
| return;
|
| }
|
|
|
| @@ -1009,7 +1011,6 @@
|
| content_view_core_->AttachLayer(layer_);
|
| if (overscroll_effect_enabled_)
|
| overscroll_effect_->Enable();
|
| - layer_->SetHideLayerAndSubtree(!is_showing_);
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::RemoveLayers() {
|
| @@ -1330,7 +1331,7 @@
|
| void RenderWidgetHostViewAndroid::OnOverscrolled(
|
| gfx::Vector2dF accumulated_overscroll,
|
| gfx::Vector2dF current_fling_velocity) {
|
| - if (!content_view_core_ || !layer_ || !is_showing_)
|
| + if (!content_view_core_ || !are_layers_attached_)
|
| return;
|
|
|
| if (overscroll_effect_->OnOverscrolled(content_view_core_->GetLayer(),
|
| @@ -1350,7 +1351,9 @@
|
| ContentViewCoreImpl* content_view_core) {
|
| RunAckCallbacks();
|
|
|
| - RemoveLayers();
|
| + if (are_layers_attached_)
|
| + RemoveLayers();
|
| +
|
| if (content_view_core_ && !using_synchronous_compositor_)
|
| content_view_core_->GetWindowAndroid()->RemoveObserver(this);
|
|
|
| @@ -1364,9 +1367,11 @@
|
| SetContentViewCore(obj);
|
| }
|
|
|
| - AttachLayers();
|
| - if (content_view_core_ && !using_synchronous_compositor_)
|
| - content_view_core_->GetWindowAndroid()->AddObserver(this);
|
| + if (are_layers_attached_) {
|
| + AttachLayers();
|
| + if (content_view_core_ && !using_synchronous_compositor_)
|
| + content_view_core_->GetWindowAndroid()->AddObserver(this);
|
| + }
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::RunAckCallbacks() {
|
| @@ -1402,6 +1407,7 @@
|
| 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()));
|
|
|
|
|