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())); |