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/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 // resize the view on Android. | 284 // resize the view on Android. |
285 default_size_ = size; | 285 default_size_ = size; |
286 } | 286 } |
287 | 287 |
288 void RenderWidgetHostViewAndroid::SetBounds(const gfx::Rect& rect) { | 288 void RenderWidgetHostViewAndroid::SetBounds(const gfx::Rect& rect) { |
289 SetSize(rect.size()); | 289 SetSize(rect.size()); |
290 } | 290 } |
291 | 291 |
292 void RenderWidgetHostViewAndroid::GetScaledContentBitmap( | 292 void RenderWidgetHostViewAndroid::GetScaledContentBitmap( |
293 float scale, | 293 float scale, |
294 SkBitmap::Config bitmap_config, | 294 SkColorType color_type, |
295 gfx::Rect src_subrect, | 295 gfx::Rect src_subrect, |
296 const base::Callback<void(bool, const SkBitmap&)>& result_callback) { | 296 const base::Callback<void(bool, const SkBitmap&)>& result_callback) { |
297 if (!IsSurfaceAvailableForCopy()) { | 297 if (!IsSurfaceAvailableForCopy()) { |
298 result_callback.Run(false, SkBitmap()); | 298 result_callback.Run(false, SkBitmap()); |
299 return; | 299 return; |
300 } | 300 } |
301 | 301 |
302 gfx::Size bounds = layer_->bounds(); | 302 gfx::Size bounds = layer_->bounds(); |
303 if (src_subrect.IsEmpty()) | 303 if (src_subrect.IsEmpty()) |
304 src_subrect = gfx::Rect(bounds); | 304 src_subrect = gfx::Rect(bounds); |
305 DCHECK_LE(src_subrect.width() + src_subrect.x(), bounds.width()); | 305 DCHECK_LE(src_subrect.width() + src_subrect.x(), bounds.width()); |
306 DCHECK_LE(src_subrect.height() + src_subrect.y(), bounds.height()); | 306 DCHECK_LE(src_subrect.height() + src_subrect.y(), bounds.height()); |
307 const gfx::Display& display = | 307 const gfx::Display& display = |
308 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); | 308 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); |
309 float device_scale_factor = display.device_scale_factor(); | 309 float device_scale_factor = display.device_scale_factor(); |
310 DCHECK_GT(device_scale_factor, 0); | 310 DCHECK_GT(device_scale_factor, 0); |
311 gfx::Size dst_size( | 311 gfx::Size dst_size( |
312 gfx::ToCeiledSize(gfx::ScaleSize(bounds, scale / device_scale_factor))); | 312 gfx::ToCeiledSize(gfx::ScaleSize(bounds, scale / device_scale_factor))); |
313 CopyFromCompositingSurface( | 313 CopyFromCompositingSurface( |
314 src_subrect, dst_size, result_callback, bitmap_config); | 314 src_subrect, dst_size, result_callback, color_type); |
315 } | 315 } |
316 | 316 |
317 bool RenderWidgetHostViewAndroid::HasValidFrame() const { | 317 bool RenderWidgetHostViewAndroid::HasValidFrame() const { |
318 if (!content_view_core_) | 318 if (!content_view_core_) |
319 return false; | 319 return false; |
320 if (!layer_) | 320 if (!layer_) |
321 return false; | 321 return false; |
322 | 322 |
323 if (texture_size_in_layer_.IsEmpty()) | 323 if (texture_size_in_layer_.IsEmpty()) |
324 return false; | 324 return false; |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
657 | 657 |
658 void RenderWidgetHostViewAndroid::SetBackgroundOpaque(bool opaque) { | 658 void RenderWidgetHostViewAndroid::SetBackgroundOpaque(bool opaque) { |
659 RenderWidgetHostViewBase::SetBackgroundOpaque(opaque); | 659 RenderWidgetHostViewBase::SetBackgroundOpaque(opaque); |
660 host_->SetBackgroundOpaque(opaque); | 660 host_->SetBackgroundOpaque(opaque); |
661 } | 661 } |
662 | 662 |
663 void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( | 663 void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( |
664 const gfx::Rect& src_subrect, | 664 const gfx::Rect& src_subrect, |
665 const gfx::Size& dst_size, | 665 const gfx::Size& dst_size, |
666 const base::Callback<void(bool, const SkBitmap&)>& callback, | 666 const base::Callback<void(bool, const SkBitmap&)>& callback, |
667 const SkBitmap::Config bitmap_config) { | 667 const SkColorType color_type) { |
668 if (!IsReadbackConfigSupported(bitmap_config)) { | 668 if (!IsReadbackConfigSupported(color_type)) { |
669 callback.Run(false, SkBitmap()); | 669 callback.Run(false, SkBitmap()); |
670 return; | 670 return; |
671 } | 671 } |
672 base::TimeTicks start_time = base::TimeTicks::Now(); | 672 base::TimeTicks start_time = base::TimeTicks::Now(); |
673 if (!using_synchronous_compositor_ && !IsSurfaceAvailableForCopy()) { | 673 if (!using_synchronous_compositor_ && !IsSurfaceAvailableForCopy()) { |
674 callback.Run(false, SkBitmap()); | 674 callback.Run(false, SkBitmap()); |
675 return; | 675 return; |
676 } | 676 } |
677 const gfx::Display& display = | 677 const gfx::Display& display = |
678 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); | 678 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); |
679 float device_scale_factor = display.device_scale_factor(); | 679 float device_scale_factor = display.device_scale_factor(); |
680 gfx::Size dst_size_in_pixel = | 680 gfx::Size dst_size_in_pixel = |
681 ConvertRectToPixel(device_scale_factor, gfx::Rect(dst_size)).size(); | 681 ConvertRectToPixel(device_scale_factor, gfx::Rect(dst_size)).size(); |
682 gfx::Rect src_subrect_in_pixel = | 682 gfx::Rect src_subrect_in_pixel = |
683 ConvertRectToPixel(device_scale_factor, src_subrect); | 683 ConvertRectToPixel(device_scale_factor, src_subrect); |
684 | 684 |
685 if (using_synchronous_compositor_) { | 685 if (using_synchronous_compositor_) { |
686 SynchronousCopyContents(src_subrect_in_pixel, dst_size_in_pixel, callback, | 686 SynchronousCopyContents(src_subrect_in_pixel, dst_size_in_pixel, callback, |
687 bitmap_config); | 687 color_type); |
688 UMA_HISTOGRAM_TIMES("Compositing.CopyFromSurfaceTimeSynchronous", | 688 UMA_HISTOGRAM_TIMES("Compositing.CopyFromSurfaceTimeSynchronous", |
689 base::TimeTicks::Now() - start_time); | 689 base::TimeTicks::Now() - start_time); |
690 return; | 690 return; |
691 } | 691 } |
692 | 692 |
693 scoped_ptr<cc::CopyOutputRequest> request; | 693 scoped_ptr<cc::CopyOutputRequest> request; |
694 scoped_refptr<cc::Layer> readback_layer; | 694 scoped_refptr<cc::Layer> readback_layer; |
695 DCHECK(content_view_core_); | 695 DCHECK(content_view_core_); |
696 DCHECK(content_view_core_->GetWindowAndroid()); | 696 DCHECK(content_view_core_->GetWindowAndroid()); |
697 ui::WindowAndroidCompositor* compositor = | 697 ui::WindowAndroidCompositor* compositor = |
698 content_view_core_->GetWindowAndroid()->GetCompositor(); | 698 content_view_core_->GetWindowAndroid()->GetCompositor(); |
699 DCHECK(compositor); | 699 DCHECK(compositor); |
700 DCHECK(frame_provider_); | 700 DCHECK(frame_provider_); |
701 scoped_refptr<cc::DelegatedRendererLayer> delegated_layer = | 701 scoped_refptr<cc::DelegatedRendererLayer> delegated_layer = |
702 cc::DelegatedRendererLayer::Create(frame_provider_); | 702 cc::DelegatedRendererLayer::Create(frame_provider_); |
703 delegated_layer->SetBounds(content_size_in_layer_); | 703 delegated_layer->SetBounds(content_size_in_layer_); |
704 delegated_layer->SetHideLayerAndSubtree(true); | 704 delegated_layer->SetHideLayerAndSubtree(true); |
705 delegated_layer->SetIsDrawable(true); | 705 delegated_layer->SetIsDrawable(true); |
706 delegated_layer->SetContentsOpaque(true); | 706 delegated_layer->SetContentsOpaque(true); |
707 compositor->AttachLayerForReadback(delegated_layer); | 707 compositor->AttachLayerForReadback(delegated_layer); |
708 | 708 |
709 readback_layer = delegated_layer; | 709 readback_layer = delegated_layer; |
710 request = cc::CopyOutputRequest::CreateRequest( | 710 request = cc::CopyOutputRequest::CreateRequest( |
711 base::Bind(&RenderWidgetHostViewAndroid:: | 711 base::Bind(&RenderWidgetHostViewAndroid:: |
712 PrepareTextureCopyOutputResultForDelegatedReadback, | 712 PrepareTextureCopyOutputResultForDelegatedReadback, |
713 dst_size_in_pixel, | 713 dst_size_in_pixel, |
714 bitmap_config, | 714 color_type, |
715 start_time, | 715 start_time, |
716 readback_layer, | 716 readback_layer, |
717 callback)); | 717 callback)); |
718 request->set_area(src_subrect_in_pixel); | 718 request->set_area(src_subrect_in_pixel); |
719 readback_layer->RequestCopyOfOutput(request.Pass()); | 719 readback_layer->RequestCopyOfOutput(request.Pass()); |
720 } | 720 } |
721 | 721 |
722 void RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceToVideoFrame( | 722 void RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceToVideoFrame( |
723 const gfx::Rect& src_subrect, | 723 const gfx::Rect& src_subrect, |
724 const scoped_refptr<media::VideoFrame>& target, | 724 const scoped_refptr<media::VideoFrame>& target, |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
948 | 948 |
949 void RenderWidgetHostViewAndroid::SetOverlayVideoMode(bool enabled) { | 949 void RenderWidgetHostViewAndroid::SetOverlayVideoMode(bool enabled) { |
950 if (layer_) | 950 if (layer_) |
951 layer_->SetContentsOpaque(!enabled); | 951 layer_->SetContentsOpaque(!enabled); |
952 } | 952 } |
953 | 953 |
954 void RenderWidgetHostViewAndroid::SynchronousCopyContents( | 954 void RenderWidgetHostViewAndroid::SynchronousCopyContents( |
955 const gfx::Rect& src_subrect_in_pixel, | 955 const gfx::Rect& src_subrect_in_pixel, |
956 const gfx::Size& dst_size_in_pixel, | 956 const gfx::Size& dst_size_in_pixel, |
957 const base::Callback<void(bool, const SkBitmap&)>& callback, | 957 const base::Callback<void(bool, const SkBitmap&)>& callback, |
958 const SkBitmap::Config config) { | 958 const SkColorType color_type) { |
959 SynchronousCompositor* compositor = | 959 SynchronousCompositor* compositor = |
960 SynchronousCompositorImpl::FromID(host_->GetProcess()->GetID(), | 960 SynchronousCompositorImpl::FromID(host_->GetProcess()->GetID(), |
961 host_->GetRoutingID()); | 961 host_->GetRoutingID()); |
962 if (!compositor) { | 962 if (!compositor) { |
963 callback.Run(false, SkBitmap()); | 963 callback.Run(false, SkBitmap()); |
964 return; | 964 return; |
965 } | 965 } |
966 | 966 |
967 SkBitmap bitmap; | 967 SkBitmap bitmap; |
968 bitmap.allocPixels(SkImageInfo::Make(dst_size_in_pixel.width(), | 968 bitmap.allocPixels(SkImageInfo::Make(dst_size_in_pixel.width(), |
969 dst_size_in_pixel.height(), | 969 dst_size_in_pixel.height(), |
970 SkBitmapConfigToColorType(config), | 970 color_type, |
971 kPremul_SkAlphaType)); | 971 kPremul_SkAlphaType)); |
972 SkCanvas canvas(bitmap); | 972 SkCanvas canvas(bitmap); |
973 canvas.scale( | 973 canvas.scale( |
974 (float)dst_size_in_pixel.width() / (float)src_subrect_in_pixel.width(), | 974 (float)dst_size_in_pixel.width() / (float)src_subrect_in_pixel.width(), |
975 (float)dst_size_in_pixel.height() / (float)src_subrect_in_pixel.height()); | 975 (float)dst_size_in_pixel.height() / (float)src_subrect_in_pixel.height()); |
976 compositor->DemandDrawSw(&canvas); | 976 compositor->DemandDrawSw(&canvas); |
977 callback.Run(true, bitmap); | 977 callback.Run(true, bitmap); |
978 } | 978 } |
979 | 979 |
980 void RenderWidgetHostViewAndroid::OnFrameMetadataUpdated( | 980 void RenderWidgetHostViewAndroid::OnFrameMetadataUpdated( |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1348 ReleaseLocksOnSurface(); | 1348 ReleaseLocksOnSurface(); |
1349 if (layer_.get()) | 1349 if (layer_.get()) |
1350 DestroyDelegatedContent(); | 1350 DestroyDelegatedContent(); |
1351 DCHECK(ack_callbacks_.empty()); | 1351 DCHECK(ack_callbacks_.empty()); |
1352 } | 1352 } |
1353 | 1353 |
1354 // static | 1354 // static |
1355 void | 1355 void |
1356 RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResultForDelegatedReadback( | 1356 RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResultForDelegatedReadback( |
1357 const gfx::Size& dst_size_in_pixel, | 1357 const gfx::Size& dst_size_in_pixel, |
1358 const SkBitmap::Config config, | 1358 const SkColorType color_type, |
1359 const base::TimeTicks& start_time, | 1359 const base::TimeTicks& start_time, |
1360 scoped_refptr<cc::Layer> readback_layer, | 1360 scoped_refptr<cc::Layer> readback_layer, |
1361 const base::Callback<void(bool, const SkBitmap&)>& callback, | 1361 const base::Callback<void(bool, const SkBitmap&)>& callback, |
1362 scoped_ptr<cc::CopyOutputResult> result) { | 1362 scoped_ptr<cc::CopyOutputResult> result) { |
1363 readback_layer->RemoveFromParent(); | 1363 readback_layer->RemoveFromParent(); |
1364 PrepareTextureCopyOutputResult( | 1364 PrepareTextureCopyOutputResult( |
1365 dst_size_in_pixel, config, start_time, callback, result.Pass()); | 1365 dst_size_in_pixel, color_type, start_time, callback, result.Pass()); |
1366 } | 1366 } |
1367 | 1367 |
1368 // static | 1368 // static |
1369 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( | 1369 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( |
1370 const gfx::Size& dst_size_in_pixel, | 1370 const gfx::Size& dst_size_in_pixel, |
1371 const SkBitmap::Config bitmap_config, | 1371 const SkColorType color_type, |
1372 const base::TimeTicks& start_time, | 1372 const base::TimeTicks& start_time, |
1373 const base::Callback<void(bool, const SkBitmap&)>& callback, | 1373 const base::Callback<void(bool, const SkBitmap&)>& callback, |
1374 scoped_ptr<cc::CopyOutputResult> result) { | 1374 scoped_ptr<cc::CopyOutputResult> result) { |
1375 base::ScopedClosureRunner scoped_callback_runner( | 1375 base::ScopedClosureRunner scoped_callback_runner( |
1376 base::Bind(callback, false, SkBitmap())); | 1376 base::Bind(callback, false, SkBitmap())); |
1377 | 1377 |
1378 if (!result->HasTexture() || result->IsEmpty() || result->size().IsEmpty()) | 1378 if (!result->HasTexture() || result->IsEmpty() || result->size().IsEmpty()) |
1379 return; | 1379 return; |
1380 | 1380 |
1381 scoped_ptr<SkBitmap> bitmap(new SkBitmap); | 1381 scoped_ptr<SkBitmap> bitmap(new SkBitmap); |
1382 SkColorType color_type = SkBitmapConfigToColorType(bitmap_config); | |
1383 if (!bitmap->allocPixels(SkImageInfo::Make(dst_size_in_pixel.width(), | 1382 if (!bitmap->allocPixels(SkImageInfo::Make(dst_size_in_pixel.width(), |
1384 dst_size_in_pixel.height(), | 1383 dst_size_in_pixel.height(), |
1385 color_type, | 1384 color_type, |
1386 kOpaque_SkAlphaType))) | 1385 kOpaque_SkAlphaType))) |
1387 return; | 1386 return; |
1388 | 1387 |
1389 ImageTransportFactoryAndroid* factory = | 1388 ImageTransportFactoryAndroid* factory = |
1390 ImageTransportFactoryAndroid::GetInstance(); | 1389 ImageTransportFactoryAndroid::GetInstance(); |
1391 GLHelper* gl_helper = factory->GetGLHelper(); | 1390 GLHelper* gl_helper = factory->GetGLHelper(); |
1392 | 1391 |
(...skipping 13 matching lines...) Expand all Loading... |
1406 | 1405 |
1407 ignore_result(scoped_callback_runner.Release()); | 1406 ignore_result(scoped_callback_runner.Release()); |
1408 | 1407 |
1409 gl_helper->CropScaleReadbackAndCleanMailbox( | 1408 gl_helper->CropScaleReadbackAndCleanMailbox( |
1410 texture_mailbox.mailbox(), | 1409 texture_mailbox.mailbox(), |
1411 texture_mailbox.sync_point(), | 1410 texture_mailbox.sync_point(), |
1412 result->size(), | 1411 result->size(), |
1413 gfx::Rect(result->size()), | 1412 gfx::Rect(result->size()), |
1414 dst_size_in_pixel, | 1413 dst_size_in_pixel, |
1415 pixels, | 1414 pixels, |
1416 bitmap_config, | 1415 color_type, |
1417 base::Bind(&CopyFromCompositingSurfaceFinished, | 1416 base::Bind(&CopyFromCompositingSurfaceFinished, |
1418 callback, | 1417 callback, |
1419 base::Passed(&release_callback), | 1418 base::Passed(&release_callback), |
1420 base::Passed(&bitmap), | 1419 base::Passed(&bitmap), |
1421 start_time, | 1420 start_time, |
1422 base::Passed(&bitmap_pixels_lock)), | 1421 base::Passed(&bitmap_pixels_lock)), |
1423 GLHelper::SCALER_QUALITY_GOOD); | 1422 GLHelper::SCALER_QUALITY_GOOD); |
1424 } | 1423 } |
1425 | 1424 |
1426 bool RenderWidgetHostViewAndroid::IsReadbackConfigSupported( | 1425 bool RenderWidgetHostViewAndroid::IsReadbackConfigSupported( |
1427 SkBitmap::Config bitmap_config) { | 1426 SkColorType color_type) { |
1428 ImageTransportFactoryAndroid* factory = | 1427 ImageTransportFactoryAndroid* factory = |
1429 ImageTransportFactoryAndroid::GetInstance(); | 1428 ImageTransportFactoryAndroid::GetInstance(); |
1430 GLHelper* gl_helper = factory->GetGLHelper(); | 1429 GLHelper* gl_helper = factory->GetGLHelper(); |
1431 if (!gl_helper) | 1430 if (!gl_helper) |
1432 return false; | 1431 return false; |
1433 return gl_helper->IsReadbackConfigSupported(bitmap_config); | 1432 return gl_helper->IsReadbackConfigSupported(color_type); |
1434 } | 1433 } |
1435 | 1434 |
1436 SkBitmap::Config RenderWidgetHostViewAndroid::PreferredReadbackFormat() { | 1435 SkColorType RenderWidgetHostViewAndroid::PreferredReadbackFormat() { |
1437 // Define the criteria here. If say the 16 texture readback is | 1436 // Define the criteria here. If say the 16 texture readback is |
1438 // supported we should go with that (this degrades quality) | 1437 // supported we should go with that (this degrades quality) |
1439 // or stick back to the default format. | 1438 // or stick back to the default format. |
1440 if (base::SysInfo::IsLowEndDevice()) { | 1439 if (base::SysInfo::IsLowEndDevice()) { |
1441 if (IsReadbackConfigSupported(SkBitmap::kRGB_565_Config)) | 1440 if (IsReadbackConfigSupported(kRGB_565_SkColorType)) |
1442 return SkBitmap::kRGB_565_Config; | 1441 return kRGB_565_SkColorType; |
1443 } | 1442 } |
1444 return SkBitmap::kARGB_8888_Config; | 1443 return kN32_SkColorType; |
1445 } | 1444 } |
1446 | 1445 |
1447 void RenderWidgetHostViewAndroid::ShowSelectionHandlesAutomatically() { | 1446 void RenderWidgetHostViewAndroid::ShowSelectionHandlesAutomatically() { |
1448 if (content_view_core_) | 1447 if (content_view_core_) |
1449 content_view_core_->ShowSelectionHandlesAutomatically(); | 1448 content_view_core_->ShowSelectionHandlesAutomatically(); |
1450 } | 1449 } |
1451 | 1450 |
1452 void RenderWidgetHostViewAndroid::SelectRange( | 1451 void RenderWidgetHostViewAndroid::SelectRange( |
1453 float x1, float y1, float x2, float y2) { | 1452 float x1, float y1, float x2, float y2) { |
1454 if (content_view_core_) | 1453 if (content_view_core_) |
(...skipping 26 matching lines...) Expand all Loading... |
1481 results->orientationAngle = display.RotationAsDegree(); | 1480 results->orientationAngle = display.RotationAsDegree(); |
1482 results->orientationType = | 1481 results->orientationType = |
1483 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display); | 1482 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display); |
1484 gfx::DeviceDisplayInfo info; | 1483 gfx::DeviceDisplayInfo info; |
1485 results->depth = info.GetBitsPerPixel(); | 1484 results->depth = info.GetBitsPerPixel(); |
1486 results->depthPerComponent = info.GetBitsPerComponent(); | 1485 results->depthPerComponent = info.GetBitsPerComponent(); |
1487 results->isMonochrome = (results->depthPerComponent == 0); | 1486 results->isMonochrome = (results->depthPerComponent == 0); |
1488 } | 1487 } |
1489 | 1488 |
1490 } // namespace content | 1489 } // namespace content |
OLD | NEW |