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 e2ececadbd97ea0e98fa001a351ae3b9979dde93..1cc054cc632693c0d825b8ca3d4b0a683cbd5a78 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_android.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
@@ -688,11 +688,13 @@ void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( |
DCHECK(frame_provider_); |
scoped_refptr<cc::DelegatedRendererLayer> delegated_layer = |
cc::DelegatedRendererLayer::Create(frame_provider_); |
- delegated_layer->SetDisplaySize(texture_size_in_layer_); |
delegated_layer->SetBounds(content_size_in_layer_); |
delegated_layer->SetHideLayerAndSubtree(true); |
delegated_layer->SetIsDrawable(true); |
delegated_layer->SetContentsOpaque(true); |
+ gfx::Transform layer_scale( |
+ device_scale_factor, 0.f, 0.f, device_scale_factor, 0.f, 0.f); |
+ delegated_layer->SetTransform(layer_scale); |
compositor->AttachLayerForReadback(delegated_layer); |
readback_layer = delegated_layer; |
@@ -812,11 +814,23 @@ void RenderWidgetHostViewAndroid::SwapDelegatedFrame( |
} |
if (layer_.get()) { |
- layer_->SetDisplaySize(texture_size_in_layer_); |
layer_->SetIsDrawable(true); |
layer_->SetContentsOpaque(true); |
layer_->SetBounds(content_size_in_layer_); |
layer_->SetNeedsDisplay(); |
+ // DelegatedRendererLayer scales the frame data from physical space to DIPs |
+ // by inverting the frame's device scale factor, assuming that the browser |
+ // compositor will map from DIPs back to physical pixels using its own |
+ // device scale factor. However, the Android browser compositor always uses |
+ // a device scale factor of 1.0, so we have to transform the delegated |
+ // layer by the device scale to get it into the same physical pixel space as |
+ // the rest of the UI. |
+ const gfx::Display& display = |
+ gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); |
+ float device_scale_factor = display.device_scale_factor(); |
+ gfx::Transform layer_scale( |
+ device_scale_factor, 0.f, 0.f, device_scale_factor, 0.f, 0.f); |
+ layer_->SetTransform(layer_scale); |
} |
base::Closure ack_callback = |