Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(32)

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 311253004: Invert DSF to map from delegated frame to layer space (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: scale android layer up, remove cc::DRL::SetDisplaySize Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/renderer_host/render_widget_host_view_android.h" 5 #include "content/browser/renderer_host/render_widget_host_view_android.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 8
9 #include "base/android/sys_utils.h" 9 #include "base/android/sys_utils.h"
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 scoped_ptr<cc::CopyOutputRequest> request; 681 scoped_ptr<cc::CopyOutputRequest> request;
682 scoped_refptr<cc::Layer> readback_layer; 682 scoped_refptr<cc::Layer> readback_layer;
683 DCHECK(content_view_core_); 683 DCHECK(content_view_core_);
684 DCHECK(content_view_core_->GetWindowAndroid()); 684 DCHECK(content_view_core_->GetWindowAndroid());
685 ui::WindowAndroidCompositor* compositor = 685 ui::WindowAndroidCompositor* compositor =
686 content_view_core_->GetWindowAndroid()->GetCompositor(); 686 content_view_core_->GetWindowAndroid()->GetCompositor();
687 DCHECK(compositor); 687 DCHECK(compositor);
688 DCHECK(frame_provider_); 688 DCHECK(frame_provider_);
689 scoped_refptr<cc::DelegatedRendererLayer> delegated_layer = 689 scoped_refptr<cc::DelegatedRendererLayer> delegated_layer =
690 cc::DelegatedRendererLayer::Create(frame_provider_); 690 cc::DelegatedRendererLayer::Create(frame_provider_);
691 delegated_layer->SetDisplaySize(texture_size_in_layer_);
692 delegated_layer->SetBounds(content_size_in_layer_); 691 delegated_layer->SetBounds(content_size_in_layer_);
693 delegated_layer->SetHideLayerAndSubtree(true); 692 delegated_layer->SetHideLayerAndSubtree(true);
694 delegated_layer->SetIsDrawable(true); 693 delegated_layer->SetIsDrawable(true);
695 delegated_layer->SetContentsOpaque(true); 694 delegated_layer->SetContentsOpaque(true);
695 gfx::Transform layer_scale(
696 device_scale_factor, 0.f, 0.f, device_scale_factor, 0.f, 0.f);
697 delegated_layer->SetTransform(layer_scale);
696 compositor->AttachLayerForReadback(delegated_layer); 698 compositor->AttachLayerForReadback(delegated_layer);
697 699
698 readback_layer = delegated_layer; 700 readback_layer = delegated_layer;
699 request = cc::CopyOutputRequest::CreateRequest( 701 request = cc::CopyOutputRequest::CreateRequest(
700 base::Bind(&RenderWidgetHostViewAndroid:: 702 base::Bind(&RenderWidgetHostViewAndroid::
701 PrepareTextureCopyOutputResultForDelegatedReadback, 703 PrepareTextureCopyOutputResultForDelegatedReadback,
702 dst_size_in_pixel, 704 dst_size_in_pixel,
703 bitmap_config, 705 bitmap_config,
704 start_time, 706 start_time,
705 readback_layer, 707 readback_layer,
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 frame_provider_ = new cc::DelegatedFrameProvider( 807 frame_provider_ = new cc::DelegatedFrameProvider(
806 resource_collection_.get(), frame_data.Pass()); 808 resource_collection_.get(), frame_data.Pass());
807 layer_ = cc::DelegatedRendererLayer::Create(frame_provider_); 809 layer_ = cc::DelegatedRendererLayer::Create(frame_provider_);
808 AttachLayers(); 810 AttachLayers();
809 } else { 811 } else {
810 frame_provider_->SetFrameData(frame_data.Pass()); 812 frame_provider_->SetFrameData(frame_data.Pass());
811 } 813 }
812 } 814 }
813 815
814 if (layer_.get()) { 816 if (layer_.get()) {
815 layer_->SetDisplaySize(texture_size_in_layer_);
816 layer_->SetIsDrawable(true); 817 layer_->SetIsDrawable(true);
817 layer_->SetContentsOpaque(true); 818 layer_->SetContentsOpaque(true);
818 layer_->SetBounds(content_size_in_layer_); 819 layer_->SetBounds(content_size_in_layer_);
819 layer_->SetNeedsDisplay(); 820 layer_->SetNeedsDisplay();
821 // DelegatedRendererLayer scales the frame data from physical space to DIPs
822 // by inverting the frame's device scale factor, assuming that the browser
823 // compositor will map from DIPs back to physical pixels using its own
824 // device scale factor. However, the Android browser compositor always uses
825 // a device scale factor of 1.0, so we have to transform the delegated
826 // layer by the device scale to get it into the same physical pixel space as
827 // the rest of the UI.
828 const gfx::Display& display =
829 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay();
830 float device_scale_factor = display.device_scale_factor();
831 gfx::Transform layer_scale(
832 device_scale_factor, 0.f, 0.f, device_scale_factor, 0.f, 0.f);
833 layer_->SetTransform(layer_scale);
820 } 834 }
821 835
822 base::Closure ack_callback = 836 base::Closure ack_callback =
823 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck, 837 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck,
824 weak_ptr_factory_.GetWeakPtr(), 838 weak_ptr_factory_.GetWeakPtr(),
825 output_surface_id); 839 output_surface_id);
826 840
827 ack_callbacks_.push(ack_callback); 841 ack_callbacks_.push(ack_callback);
828 if (host_->is_hidden()) 842 if (host_->is_hidden())
829 RunAckCallbacks(); 843 RunAckCallbacks();
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after
1440 results->availableRect = display.work_area(); 1454 results->availableRect = display.work_area();
1441 results->deviceScaleFactor = display.device_scale_factor(); 1455 results->deviceScaleFactor = display.device_scale_factor();
1442 results->orientationAngle = display.RotationAsDegree(); 1456 results->orientationAngle = display.RotationAsDegree();
1443 gfx::DeviceDisplayInfo info; 1457 gfx::DeviceDisplayInfo info;
1444 results->depth = info.GetBitsPerPixel(); 1458 results->depth = info.GetBitsPerPixel();
1445 results->depthPerComponent = info.GetBitsPerComponent(); 1459 results->depthPerComponent = info.GetBitsPerComponent();
1446 results->isMonochrome = (results->depthPerComponent == 0); 1460 results->isMonochrome = (results->depthPerComponent == 0);
1447 } 1461 }
1448 1462
1449 } // namespace content 1463 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698