| 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 <utility> | 9 #include <utility> | 
| 10 | 10 | 
| (...skipping 852 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 863   host_->SetBackgroundOpaque(GetBackgroundOpaque()); | 863   host_->SetBackgroundOpaque(GetBackgroundOpaque()); | 
| 864   UpdateBackgroundColor(color); | 864   UpdateBackgroundColor(color); | 
| 865 } | 865 } | 
| 866 | 866 | 
| 867 void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( | 867 void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( | 
| 868     const gfx::Rect& src_subrect, | 868     const gfx::Rect& src_subrect, | 
| 869     const gfx::Size& dst_size, | 869     const gfx::Size& dst_size, | 
| 870     const ReadbackRequestCallback& callback, | 870     const ReadbackRequestCallback& callback, | 
| 871     const SkColorType preferred_color_type) { | 871     const SkColorType preferred_color_type) { | 
| 872   TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::CopyFromCompositingSurface"); | 872   TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::CopyFromCompositingSurface"); | 
| 873   if (!host_ || host_->is_hidden()) { | 873   if (!host_ || host_->is_hidden() || !IsSurfaceAvailableForCopy()) { | 
| 874     callback.Run(SkBitmap(), READBACK_SURFACE_UNAVAILABLE); | 874     callback.Run(SkBitmap(), READBACK_SURFACE_UNAVAILABLE); | 
| 875     return; | 875     return; | 
| 876   } | 876   } | 
| 877   base::TimeTicks start_time = base::TimeTicks::Now(); | 877   if (!content_view_core_ || !(content_view_core_->GetWindowAndroid())) { | 
| 878   if (!IsSurfaceAvailableForCopy()) { | 878     callback.Run(SkBitmap(), READBACK_FAILED); | 
| 879     callback.Run(SkBitmap(), READBACK_SURFACE_UNAVAILABLE); |  | 
| 880     return; | 879     return; | 
| 881   } | 880   } | 
|  | 881 | 
|  | 882   base::TimeTicks start_time = base::TimeTicks::Now(); | 
| 882   const display::Display& display = | 883   const display::Display& display = | 
| 883       display::Screen::GetScreen()->GetPrimaryDisplay(); | 884       display::Screen::GetScreen()->GetPrimaryDisplay(); | 
| 884   float device_scale_factor = display.device_scale_factor(); | 885   float device_scale_factor = display.device_scale_factor(); | 
| 885   gfx::Size dst_size_in_pixel = | 886   gfx::Size dst_size_in_pixel = | 
| 886       gfx::ConvertRectToPixel(device_scale_factor, gfx::Rect(dst_size)).size(); | 887       gfx::ConvertRectToPixel(device_scale_factor, gfx::Rect(dst_size)).size(); | 
| 887   gfx::Rect src_subrect_in_pixel = | 888   gfx::Rect src_subrect_in_pixel = | 
| 888       gfx::ConvertRectToPixel(device_scale_factor, src_subrect); | 889       gfx::ConvertRectToPixel(device_scale_factor, src_subrect); | 
| 889 | 890 | 
| 890   if (!using_browser_compositor_) { | 891   if (!using_browser_compositor_) { | 
| 891     SynchronousCopyContents(src_subrect_in_pixel, dst_size_in_pixel, callback, | 892     SynchronousCopyContents(src_subrect_in_pixel, dst_size_in_pixel, callback, | 
| 892                             preferred_color_type); | 893                             preferred_color_type); | 
| 893     UMA_HISTOGRAM_TIMES("Compositing.CopyFromSurfaceTimeSynchronous", | 894     UMA_HISTOGRAM_TIMES("Compositing.CopyFromSurfaceTimeSynchronous", | 
| 894                         base::TimeTicks::Now() - start_time); | 895                         base::TimeTicks::Now() - start_time); | 
| 895     return; | 896     return; | 
| 896   } | 897   } | 
| 897 | 898 | 
| 898   if (!content_view_core_ || !(content_view_core_->GetWindowAndroid())) { |  | 
| 899     callback.Run(SkBitmap(), READBACK_FAILED); |  | 
| 900     return; |  | 
| 901   } |  | 
| 902   ui::WindowAndroidCompositor* compositor = | 899   ui::WindowAndroidCompositor* compositor = | 
| 903       content_view_core_->GetWindowAndroid()->GetCompositor(); | 900       content_view_core_->GetWindowAndroid()->GetCompositor(); | 
| 904   DCHECK(compositor); | 901   DCHECK(compositor); | 
| 905   DCHECK(!surface_id_.is_null()); | 902   DCHECK(!surface_id_.is_null()); | 
| 906   std::unique_ptr<cc::CopyOutputRequest> request = | 903   std::unique_ptr<cc::CopyOutputRequest> request = | 
| 907       cc::CopyOutputRequest::CreateRequest( | 904       cc::CopyOutputRequest::CreateRequest(base::Bind( | 
| 908           base::Bind(&PrepareTextureCopyOutputResult, dst_size_in_pixel, | 905           &PrepareTextureCopyOutputResult, weak_ptr_factory_.GetWeakPtr(), | 
| 909                      preferred_color_type, start_time, callback)); | 906           dst_size_in_pixel, preferred_color_type, start_time, callback)); | 
| 910   if (!src_subrect_in_pixel.IsEmpty()) | 907   if (!src_subrect_in_pixel.IsEmpty()) | 
| 911     request->set_area(src_subrect_in_pixel); | 908     request->set_area(src_subrect_in_pixel); | 
|  | 909   // Make sure the layer doesn't get deleted until we fulfill the request. | 
|  | 910   LockCompositingSurface(); | 
| 912   layer_->RequestCopyOfOutput(std::move(request)); | 911   layer_->RequestCopyOfOutput(std::move(request)); | 
| 913 } | 912 } | 
| 914 | 913 | 
| 915 void RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceToVideoFrame( | 914 void RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceToVideoFrame( | 
| 916     const gfx::Rect& src_subrect, | 915     const gfx::Rect& src_subrect, | 
| 917     const scoped_refptr<media::VideoFrame>& target, | 916     const scoped_refptr<media::VideoFrame>& target, | 
| 918     const base::Callback<void(const gfx::Rect&, bool)>& callback) { | 917     const base::Callback<void(const gfx::Rect&, bool)>& callback) { | 
| 919   NOTIMPLEMENTED(); | 918   NOTIMPLEMENTED(); | 
| 920   callback.Run(gfx::Rect(), false); | 919   callback.Run(gfx::Rect(), false); | 
| 921 } | 920 } | 
| (...skipping 998 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1920   DCHECK(ack_callbacks_.empty()); | 1919   DCHECK(ack_callbacks_.empty()); | 
| 1921 } | 1920 } | 
| 1922 | 1921 | 
| 1923 // TODO(wjmaclean): There is significant overlap between | 1922 // TODO(wjmaclean): There is significant overlap between | 
| 1924 // PrepareTextureCopyOutputResult and CopyFromCompositingSurfaceFinished in | 1923 // PrepareTextureCopyOutputResult and CopyFromCompositingSurfaceFinished in | 
| 1925 // this file, and the versions in surface_utils.cc. They should | 1924 // this file, and the versions in surface_utils.cc. They should | 
| 1926 // be merged. See https://crbug.com/582955 | 1925 // be merged. See https://crbug.com/582955 | 
| 1927 | 1926 | 
| 1928 // static | 1927 // static | 
| 1929 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( | 1928 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( | 
|  | 1929     base::WeakPtr<RenderWidgetHostViewAndroid> rwhva, | 
| 1930     const gfx::Size& dst_size_in_pixel, | 1930     const gfx::Size& dst_size_in_pixel, | 
| 1931     SkColorType color_type, | 1931     SkColorType color_type, | 
| 1932     const base::TimeTicks& start_time, | 1932     const base::TimeTicks& start_time, | 
| 1933     const ReadbackRequestCallback& callback, | 1933     const ReadbackRequestCallback& callback, | 
| 1934     std::unique_ptr<cc::CopyOutputResult> result) { | 1934     std::unique_ptr<cc::CopyOutputResult> result) { | 
| 1935   base::ScopedClosureRunner scoped_callback_runner( | 1935   base::ScopedClosureRunner scoped_callback_runner( | 
| 1936       base::Bind(callback, SkBitmap(), READBACK_FAILED)); | 1936       base::Bind(callback, SkBitmap(), READBACK_FAILED)); | 
| 1937   TRACE_EVENT0("cc", | 1937   TRACE_EVENT0("cc", | 
| 1938                "RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult"); | 1938                "RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult"); | 
| 1939 | 1939   if (rwhva) | 
|  | 1940     rwhva->UnlockCompositingSurface(); | 
| 1940   if (!result->HasTexture() || result->IsEmpty() || result->size().IsEmpty()) | 1941   if (!result->HasTexture() || result->IsEmpty() || result->size().IsEmpty()) | 
| 1941     return; | 1942     return; | 
|  | 1943   cc::TextureMailbox texture_mailbox; | 
|  | 1944   std::unique_ptr<cc::SingleReleaseCallback> release_callback; | 
|  | 1945   result->TakeTexture(&texture_mailbox, &release_callback); | 
|  | 1946   DCHECK(texture_mailbox.IsTexture()); | 
|  | 1947   if (!texture_mailbox.IsTexture()) | 
|  | 1948     return; | 
|  | 1949   display_compositor::GLHelper* gl_helper = GetPostReadbackGLHelper(); | 
|  | 1950   if (!gl_helper) | 
|  | 1951     return; | 
|  | 1952   if (!gl_helper->IsReadbackConfigSupported(color_type)) | 
|  | 1953     color_type = kRGBA_8888_SkColorType; | 
| 1942 | 1954 | 
| 1943   gfx::Size output_size_in_pixel; | 1955   gfx::Size output_size_in_pixel; | 
| 1944   if (dst_size_in_pixel.IsEmpty()) | 1956   if (dst_size_in_pixel.IsEmpty()) | 
| 1945     output_size_in_pixel = result->size(); | 1957     output_size_in_pixel = result->size(); | 
| 1946   else | 1958   else | 
| 1947     output_size_in_pixel = dst_size_in_pixel; | 1959     output_size_in_pixel = dst_size_in_pixel; | 
| 1948 | 1960 | 
| 1949   display_compositor::GLHelper* gl_helper = GetPostReadbackGLHelper(); |  | 
| 1950   if (!gl_helper) |  | 
| 1951     return; |  | 
| 1952   if (!gl_helper->IsReadbackConfigSupported(color_type)) |  | 
| 1953     color_type = kRGBA_8888_SkColorType; |  | 
| 1954   std::unique_ptr<SkBitmap> bitmap(new SkBitmap); | 1961   std::unique_ptr<SkBitmap> bitmap(new SkBitmap); | 
| 1955   if (!bitmap->tryAllocPixels(SkImageInfo::Make(output_size_in_pixel.width(), | 1962   if (!bitmap->tryAllocPixels(SkImageInfo::Make(output_size_in_pixel.width(), | 
| 1956                                                 output_size_in_pixel.height(), | 1963                                                 output_size_in_pixel.height(), | 
| 1957                                                 color_type, | 1964                                                 color_type, | 
| 1958                                                 kOpaque_SkAlphaType))) { | 1965                                                 kOpaque_SkAlphaType))) { | 
| 1959     scoped_callback_runner.Reset( | 1966     scoped_callback_runner.Reset( | 
| 1960         base::Bind(callback, SkBitmap(), READBACK_BITMAP_ALLOCATION_FAILURE)); | 1967         base::Bind(callback, SkBitmap(), READBACK_BITMAP_ALLOCATION_FAILURE)); | 
| 1961     return; | 1968     return; | 
| 1962   } | 1969   } | 
| 1963 | 1970 | 
| 1964   std::unique_ptr<SkAutoLockPixels> bitmap_pixels_lock( | 1971   std::unique_ptr<SkAutoLockPixels> bitmap_pixels_lock( | 
| 1965       new SkAutoLockPixels(*bitmap)); | 1972       new SkAutoLockPixels(*bitmap)); | 
| 1966   uint8_t* pixels = static_cast<uint8_t*>(bitmap->getPixels()); | 1973   uint8_t* pixels = static_cast<uint8_t*>(bitmap->getPixels()); | 
| 1967 | 1974 | 
| 1968   cc::TextureMailbox texture_mailbox; |  | 
| 1969   std::unique_ptr<cc::SingleReleaseCallback> release_callback; |  | 
| 1970   result->TakeTexture(&texture_mailbox, &release_callback); |  | 
| 1971   DCHECK(texture_mailbox.IsTexture()); |  | 
| 1972   if (!texture_mailbox.IsTexture()) |  | 
| 1973     return; |  | 
| 1974 |  | 
| 1975   ignore_result(scoped_callback_runner.Release()); | 1975   ignore_result(scoped_callback_runner.Release()); | 
| 1976 | 1976 | 
| 1977   gl_helper->CropScaleReadbackAndCleanMailbox( | 1977   gl_helper->CropScaleReadbackAndCleanMailbox( | 
| 1978       texture_mailbox.mailbox(), texture_mailbox.sync_token(), result->size(), | 1978       texture_mailbox.mailbox(), texture_mailbox.sync_token(), result->size(), | 
| 1979       gfx::Rect(result->size()), output_size_in_pixel, pixels, color_type, | 1979       gfx::Rect(result->size()), output_size_in_pixel, pixels, color_type, | 
| 1980       base::Bind(&CopyFromCompositingSurfaceFinished, callback, | 1980       base::Bind(&CopyFromCompositingSurfaceFinished, callback, | 
| 1981                  base::Passed(&release_callback), base::Passed(&bitmap), | 1981                  base::Passed(&release_callback), base::Passed(&bitmap), | 
| 1982                  start_time, base::Passed(&bitmap_pixels_lock)), | 1982                  start_time, base::Passed(&bitmap_pixels_lock)), | 
| 1983       display_compositor::GLHelper::SCALER_QUALITY_GOOD); | 1983       display_compositor::GLHelper::SCALER_QUALITY_GOOD); | 
| 1984 } | 1984 } | 
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2045     case ui::MotionEvent::ACTION_UP: | 2045     case ui::MotionEvent::ACTION_UP: | 
| 2046     case ui::MotionEvent::ACTION_POINTER_UP: | 2046     case ui::MotionEvent::ACTION_POINTER_UP: | 
| 2047       UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.OS.TOUCH_RELEASED", | 2047       UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.OS.TOUCH_RELEASED", | 
| 2048                                   delta.InMicroseconds(), 1, 1000000, 50); | 2048                                   delta.InMicroseconds(), 1, 1000000, 50); | 
| 2049     default: | 2049     default: | 
| 2050       return; | 2050       return; | 
| 2051   } | 2051   } | 
| 2052 } | 2052 } | 
| 2053 | 2053 | 
| 2054 }  // namespace content | 2054 }  // namespace content | 
| OLD | NEW | 
|---|