OLD | NEW |
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/build_info.h" | 9 #include "base/android/build_info.h" |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
427 // resize the view on Android. | 427 // resize the view on Android. |
428 default_size_ = size; | 428 default_size_ = size; |
429 } | 429 } |
430 | 430 |
431 void RenderWidgetHostViewAndroid::SetBounds(const gfx::Rect& rect) { | 431 void RenderWidgetHostViewAndroid::SetBounds(const gfx::Rect& rect) { |
432 SetSize(rect.size()); | 432 SetSize(rect.size()); |
433 } | 433 } |
434 | 434 |
435 void RenderWidgetHostViewAndroid::GetScaledContentBitmap( | 435 void RenderWidgetHostViewAndroid::GetScaledContentBitmap( |
436 float scale, | 436 float scale, |
437 SkColorType color_type, | 437 SkColorType preferred_color_type, |
438 gfx::Rect src_subrect, | 438 gfx::Rect src_subrect, |
439 ReadbackRequestCallback& result_callback) { | 439 ReadbackRequestCallback& result_callback) { |
440 if (!host_ || host_->is_hidden() || !IsSurfaceAvailableForCopy()) { | 440 if (!host_ || host_->is_hidden() || !IsSurfaceAvailableForCopy()) { |
441 result_callback.Run(SkBitmap(), READBACK_NOT_SUPPORTED); | 441 result_callback.Run(SkBitmap(), READBACK_SURFACE_UNAVAILABLE); |
442 return; | 442 return; |
443 } | 443 } |
444 gfx::Size bounds = layer_->bounds(); | 444 gfx::Size bounds = layer_->bounds(); |
445 if (src_subrect.IsEmpty()) | 445 if (src_subrect.IsEmpty()) |
446 src_subrect = gfx::Rect(bounds); | 446 src_subrect = gfx::Rect(bounds); |
447 DCHECK_LE(src_subrect.width() + src_subrect.x(), bounds.width()); | 447 DCHECK_LE(src_subrect.width() + src_subrect.x(), bounds.width()); |
448 DCHECK_LE(src_subrect.height() + src_subrect.y(), bounds.height()); | 448 DCHECK_LE(src_subrect.height() + src_subrect.y(), bounds.height()); |
449 const gfx::Display& display = | 449 const gfx::Display& display = |
450 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); | 450 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); |
451 float device_scale_factor = display.device_scale_factor(); | 451 float device_scale_factor = display.device_scale_factor(); |
452 DCHECK_GT(device_scale_factor, 0); | 452 DCHECK_GT(device_scale_factor, 0); |
453 gfx::Size dst_size( | 453 gfx::Size dst_size( |
454 gfx::ToCeiledSize(gfx::ScaleSize(bounds, scale / device_scale_factor))); | 454 gfx::ToCeiledSize(gfx::ScaleSize(bounds, scale / device_scale_factor))); |
455 CopyFromCompositingSurface( | 455 CopyFromCompositingSurface(src_subrect, dst_size, result_callback, |
456 src_subrect, dst_size, result_callback, color_type); | 456 preferred_color_type); |
457 } | 457 } |
458 | 458 |
459 scoped_refptr<cc::Layer> RenderWidgetHostViewAndroid::CreateDelegatedLayer() | 459 scoped_refptr<cc::Layer> RenderWidgetHostViewAndroid::CreateDelegatedLayer() |
460 const { | 460 const { |
461 scoped_refptr<cc::Layer> delegated_layer; | 461 scoped_refptr<cc::Layer> delegated_layer; |
462 if (!surface_id_.is_null()) { | 462 if (!surface_id_.is_null()) { |
463 cc::SurfaceManager* manager = CompositorImpl::GetSurfaceManager(); | 463 cc::SurfaceManager* manager = CompositorImpl::GetSurfaceManager(); |
464 DCHECK(manager); | 464 DCHECK(manager); |
465 // manager must outlive compositors using it. | 465 // manager must outlive compositors using it. |
466 scoped_refptr<cc::SurfaceLayer> surface_layer = cc::SurfaceLayer::Create( | 466 scoped_refptr<cc::SurfaceLayer> surface_layer = cc::SurfaceLayer::Create( |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
911 void RenderWidgetHostViewAndroid::SetBackgroundColor(SkColor color) { | 911 void RenderWidgetHostViewAndroid::SetBackgroundColor(SkColor color) { |
912 RenderWidgetHostViewBase::SetBackgroundColor(color); | 912 RenderWidgetHostViewBase::SetBackgroundColor(color); |
913 host_->SetBackgroundOpaque(GetBackgroundOpaque()); | 913 host_->SetBackgroundOpaque(GetBackgroundOpaque()); |
914 OnDidChangeBodyBackgroundColor(color); | 914 OnDidChangeBodyBackgroundColor(color); |
915 } | 915 } |
916 | 916 |
917 void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( | 917 void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( |
918 const gfx::Rect& src_subrect, | 918 const gfx::Rect& src_subrect, |
919 const gfx::Size& dst_size, | 919 const gfx::Size& dst_size, |
920 ReadbackRequestCallback& callback, | 920 ReadbackRequestCallback& callback, |
921 const SkColorType color_type) { | 921 const SkColorType preferred_color_type) { |
922 TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::CopyFromCompositingSurface"); | 922 TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::CopyFromCompositingSurface"); |
923 if (!host_ || host_->is_hidden()) { | 923 if (!host_ || host_->is_hidden()) { |
924 callback.Run(SkBitmap(), READBACK_SURFACE_UNAVAILABLE); | 924 callback.Run(SkBitmap(), READBACK_SURFACE_UNAVAILABLE); |
925 return; | 925 return; |
926 } | 926 } |
927 base::TimeTicks start_time = base::TimeTicks::Now(); | 927 base::TimeTicks start_time = base::TimeTicks::Now(); |
928 if (using_browser_compositor_ && !IsSurfaceAvailableForCopy()) { | 928 if (using_browser_compositor_ && !IsSurfaceAvailableForCopy()) { |
929 callback.Run(SkBitmap(), READBACK_NOT_SUPPORTED); | 929 callback.Run(SkBitmap(), READBACK_SURFACE_UNAVAILABLE); |
930 return; | 930 return; |
931 } | 931 } |
932 const gfx::Display& display = | 932 const gfx::Display& display = |
933 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); | 933 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); |
934 float device_scale_factor = display.device_scale_factor(); | 934 float device_scale_factor = display.device_scale_factor(); |
935 gfx::Size dst_size_in_pixel = | 935 gfx::Size dst_size_in_pixel = |
936 gfx::ConvertRectToPixel(device_scale_factor, gfx::Rect(dst_size)).size(); | 936 gfx::ConvertRectToPixel(device_scale_factor, gfx::Rect(dst_size)).size(); |
937 gfx::Rect src_subrect_in_pixel = | 937 gfx::Rect src_subrect_in_pixel = |
938 gfx::ConvertRectToPixel(device_scale_factor, src_subrect); | 938 gfx::ConvertRectToPixel(device_scale_factor, src_subrect); |
939 | 939 |
940 if (!using_browser_compositor_) { | 940 if (!using_browser_compositor_) { |
941 SynchronousCopyContents(src_subrect_in_pixel, dst_size_in_pixel, callback, | 941 SynchronousCopyContents(src_subrect_in_pixel, dst_size_in_pixel, callback, |
942 color_type); | 942 preferred_color_type); |
943 UMA_HISTOGRAM_TIMES("Compositing.CopyFromSurfaceTimeSynchronous", | 943 UMA_HISTOGRAM_TIMES("Compositing.CopyFromSurfaceTimeSynchronous", |
944 base::TimeTicks::Now() - start_time); | 944 base::TimeTicks::Now() - start_time); |
945 return; | 945 return; |
946 } | 946 } |
947 | 947 |
948 scoped_ptr<cc::CopyOutputRequest> request; | 948 scoped_ptr<cc::CopyOutputRequest> request; |
949 scoped_refptr<cc::Layer> readback_layer; | 949 scoped_refptr<cc::Layer> readback_layer; |
950 DCHECK(content_view_core_window_android_); | 950 DCHECK(content_view_core_window_android_); |
951 ui::WindowAndroidCompositor* compositor = | 951 ui::WindowAndroidCompositor* compositor = |
952 content_view_core_window_android_->GetCompositor(); | 952 content_view_core_window_android_->GetCompositor(); |
953 DCHECK(compositor); | 953 DCHECK(compositor); |
954 DCHECK(frame_provider_.get() || !surface_id_.is_null()); | 954 DCHECK(frame_provider_.get() || !surface_id_.is_null()); |
955 scoped_refptr<cc::Layer> layer = CreateDelegatedLayer(); | 955 scoped_refptr<cc::Layer> layer = CreateDelegatedLayer(); |
956 DCHECK(layer); | 956 DCHECK(layer); |
957 layer->SetHideLayerAndSubtree(true); | 957 layer->SetHideLayerAndSubtree(true); |
958 compositor->AttachLayerForReadback(layer); | 958 compositor->AttachLayerForReadback(layer); |
959 | 959 |
960 readback_layer = layer; | 960 readback_layer = layer; |
961 request = cc::CopyOutputRequest::CreateRequest( | 961 request = cc::CopyOutputRequest::CreateRequest( |
962 base::Bind(&RenderWidgetHostViewAndroid:: | 962 base::Bind(&RenderWidgetHostViewAndroid:: |
963 PrepareTextureCopyOutputResultForDelegatedReadback, | 963 PrepareTextureCopyOutputResultForDelegatedReadback, |
964 dst_size_in_pixel, | 964 dst_size_in_pixel, preferred_color_type, start_time, |
965 color_type, | 965 readback_layer, callback)); |
966 start_time, | |
967 readback_layer, | |
968 callback)); | |
969 if (!src_subrect_in_pixel.IsEmpty()) | 966 if (!src_subrect_in_pixel.IsEmpty()) |
970 request->set_area(src_subrect_in_pixel); | 967 request->set_area(src_subrect_in_pixel); |
971 readback_layer->RequestCopyOfOutput(request.Pass()); | 968 readback_layer->RequestCopyOfOutput(request.Pass()); |
972 } | 969 } |
973 | 970 |
974 void RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceToVideoFrame( | 971 void RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceToVideoFrame( |
975 const gfx::Rect& src_subrect, | 972 const gfx::Rect& src_subrect, |
976 const scoped_refptr<media::VideoFrame>& target, | 973 const scoped_refptr<media::VideoFrame>& target, |
977 const base::Callback<void(bool)>& callback) { | 974 const base::Callback<void(bool)>& callback) { |
978 NOTIMPLEMENTED(); | 975 NOTIMPLEMENTED(); |
(...skipping 908 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1887 GLHelper* gl_helper = GetPostReadbackGLHelper(); | 1884 GLHelper* gl_helper = GetPostReadbackGLHelper(); |
1888 if (!gl_helper) | 1885 if (!gl_helper) |
1889 return; | 1886 return; |
1890 if (!gl_helper->IsReadbackConfigSupported(color_type)) | 1887 if (!gl_helper->IsReadbackConfigSupported(color_type)) |
1891 color_type = kRGBA_8888_SkColorType; | 1888 color_type = kRGBA_8888_SkColorType; |
1892 scoped_ptr<SkBitmap> bitmap(new SkBitmap); | 1889 scoped_ptr<SkBitmap> bitmap(new SkBitmap); |
1893 if (!bitmap->tryAllocPixels(SkImageInfo::Make(output_size_in_pixel.width(), | 1890 if (!bitmap->tryAllocPixels(SkImageInfo::Make(output_size_in_pixel.width(), |
1894 output_size_in_pixel.height(), | 1891 output_size_in_pixel.height(), |
1895 color_type, | 1892 color_type, |
1896 kOpaque_SkAlphaType))) { | 1893 kOpaque_SkAlphaType))) { |
| 1894 scoped_callback_runner.Reset( |
| 1895 base::Bind(callback, SkBitmap(), READBACK_BITMAP_ALLOCATION_FAILURE)); |
1897 return; | 1896 return; |
1898 } | 1897 } |
1899 | 1898 |
1900 | 1899 |
1901 scoped_ptr<SkAutoLockPixels> bitmap_pixels_lock( | 1900 scoped_ptr<SkAutoLockPixels> bitmap_pixels_lock( |
1902 new SkAutoLockPixels(*bitmap)); | 1901 new SkAutoLockPixels(*bitmap)); |
1903 uint8* pixels = static_cast<uint8*>(bitmap->getPixels()); | 1902 uint8* pixels = static_cast<uint8*>(bitmap->getPixels()); |
1904 | 1903 |
1905 cc::TextureMailbox texture_mailbox; | 1904 cc::TextureMailbox texture_mailbox; |
1906 scoped_ptr<cc::SingleReleaseCallback> release_callback; | 1905 scoped_ptr<cc::SingleReleaseCallback> release_callback; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1967 results->orientationAngle = display.RotationAsDegree(); | 1966 results->orientationAngle = display.RotationAsDegree(); |
1968 results->orientationType = | 1967 results->orientationType = |
1969 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display); | 1968 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display); |
1970 gfx::DeviceDisplayInfo info; | 1969 gfx::DeviceDisplayInfo info; |
1971 results->depth = info.GetBitsPerPixel(); | 1970 results->depth = info.GetBitsPerPixel(); |
1972 results->depthPerComponent = info.GetBitsPerComponent(); | 1971 results->depthPerComponent = info.GetBitsPerComponent(); |
1973 results->isMonochrome = (results->depthPerComponent == 0); | 1972 results->isMonochrome = (results->depthPerComponent == 0); |
1974 } | 1973 } |
1975 | 1974 |
1976 } // namespace content | 1975 } // namespace content |
OLD | NEW |