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

Unified Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 176943004: [Android] Implement asynchronous zero-copy bitmap capture API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 10 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 side-by-side diff with in-line comments
Download patch
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 16e367f02c2a92117c27160011fc4630ff6d6c8c..b0fd37f286625699bde6302a2dc2eca9f9fbeee2 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -253,13 +253,18 @@ void RenderWidgetHostViewAndroid::SetBounds(const gfx::Rect& rect) {
void RenderWidgetHostViewAndroid::GetScaledContentBitmap(
float scale,
- const base::Callback<void(bool, const SkBitmap&)>& result_callback) {
+ const base::Callback<void(bool, const SkBitmap&)>& result_callback,
+ SkBitmap::Config bitmap_config,
+ const gfx::Rect& bounding_rect,
+ const BitmapAllocator bitmap_allocator) {
if (!IsSurfaceAvailableForCopy()) {
result_callback.Run(false, SkBitmap());
return;
}
- gfx::Size bounds = layer_->bounds();
+ gfx::Size bounds = bounding_rect.IsEmpty() ?
+ layer_->bounds() :
+ gfx::Size(bounding_rect.width(), bounding_rect.height());
gfx::Rect src_subrect(bounds);
const gfx::Display& display =
gfx::Screen::GetNativeScreen()->GetPrimaryDisplay();
@@ -267,8 +272,21 @@ void RenderWidgetHostViewAndroid::GetScaledContentBitmap(
DCHECK_GT(device_scale_factor, 0);
gfx::Size dst_size(
gfx::ToCeiledSize(gfx::ScaleSize(bounds, scale / device_scale_factor)));
+
+ scoped_ptr<SkBitmap> bitmap;
+ if (!bitmap_allocator.is_null()) {
+ SkBitmap* bitmap_ptr = NULL;
+ bitmap_allocator.Run(bitmap_ptr, dst_size, bitmap_config);
+ DCHECK(bitmap_ptr);
+ DCHECK_EQ(bitmap_ptr->width(), bounds.width());
+ DCHECK_EQ(bitmap_ptr->height(), bounds.height());
+ DCHECK_EQ(bitmap_ptr->config(), bitmap_config);
+ DCHECK_NE(bitmap_ptr->getPixels(), static_cast<void*>(NULL));
+ bitmap.reset(bitmap_ptr);
+ }
+
CopyFromCompositingSurface(
- src_subrect, dst_size, result_callback, SkBitmap::kARGB_8888_Config);
+ src_subrect, dst_size, result_callback, bitmap_config, bitmap.Pass());
}
bool RenderWidgetHostViewAndroid::PopulateBitmapWithContents(jobject jbitmap) {
@@ -621,7 +639,8 @@ void RenderWidgetHostViewAndroid::CopyFromCompositingSurface(
const gfx::Rect& src_subrect,
const gfx::Size& dst_size,
const base::Callback<void(bool, const SkBitmap&)>& callback,
- const SkBitmap::Config bitmap_config) {
+ const SkBitmap::Config bitmap_config,
+ scoped_ptr<SkBitmap> bitmap) {
// Only ARGB888 and RGB565 supported as of now.
bool format_support = ((bitmap_config == SkBitmap::kRGB_565_Config) ||
(bitmap_config == SkBitmap::kARGB_8888_Config));
@@ -668,6 +687,7 @@ void RenderWidgetHostViewAndroid::CopyFromCompositingSurface(
dst_size_in_pixel,
bitmap_config,
start_time,
+ base::Passed(&bitmap),
callback));
request->set_area(src_subrect_in_pixel);
layer_->RequestCopyOfOutput(request.Pass());
@@ -1335,6 +1355,7 @@ void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult(
const gfx::Size& dst_size_in_pixel,
const SkBitmap::Config bitmap_config,
const base::TimeTicks& start_time,
+ scoped_ptr<SkBitmap> bitmap,
const base::Callback<void(bool, const SkBitmap&)>& callback,
scoped_ptr<cc::CopyOutputResult> result) {
base::ScopedClosureRunner scoped_callback_runner(
@@ -1343,13 +1364,15 @@ void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult(
if (!result->HasTexture() || result->IsEmpty() || result->size().IsEmpty())
return;
- scoped_ptr<SkBitmap> bitmap(new SkBitmap);
- bitmap->setConfig(bitmap_config,
- dst_size_in_pixel.width(),
- dst_size_in_pixel.height(),
- 0, kOpaque_SkAlphaType);
- if (!bitmap->allocPixels())
- return;
+ if (!bitmap.get()) {
+ bitmap.reset(new SkBitmap);
+ bitmap->setConfig(bitmap_config,
+ dst_size_in_pixel.width(),
+ dst_size_in_pixel.height(),
+ 0, kOpaque_SkAlphaType);
+ if (!bitmap->allocPixels())
+ return;
+ }
ImageTransportFactoryAndroid* factory =
ImageTransportFactoryAndroid::GetInstance();

Powered by Google App Engine
This is Rietveld 408576698