summaryrefslogtreecommitdiffstats
path: root/content/browser/renderer_host/render_widget_host_view_android.cc
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser/renderer_host/render_widget_host_view_android.cc')
-rw-r--r--content/browser/renderer_host/render_widget_host_view_android.cc30
1 files changed, 24 insertions, 6 deletions
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 2b78167..dc9ea5f 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -306,7 +306,8 @@ bool RenderWidgetHostViewAndroid::PopulateBitmapWithContents(jobject jbitmap) {
helper->ReadbackTextureSync(texture,
gfx::Rect(bitmap.size()),
- static_cast<unsigned char*> (bitmap.pixels()));
+ static_cast<unsigned char*> (bitmap.pixels()),
+ SkBitmap::kARGB_8888_Config);
gpu::gles2::GLES2Interface* gl =
ImageTransportFactoryAndroid::GetInstance()->GetContextGL();
@@ -626,12 +627,23 @@ void RenderWidgetHostViewAndroid::SetBackground(const SkBitmap& background) {
void RenderWidgetHostViewAndroid::CopyFromCompositingSurface(
const gfx::Rect& src_subrect,
const gfx::Size& dst_size,
- const base::Callback<void(bool, const SkBitmap&)>& callback) {
+ const base::Callback<void(bool, const SkBitmap&)>& callback,
+ bool readback_config_rgb565) {
if (!using_synchronous_compositor_ && !IsSurfaceAvailableForCopy()) {
callback.Run(false, SkBitmap());
return;
}
-
+ ImageTransportFactoryAndroid* factory =
+ ImageTransportFactoryAndroid::GetInstance();
+ GLHelper* gl_helper = factory->GetGLHelper();
+ if (!gl_helper)
+ return;
+ bool check_rgb565_support = gl_helper->CanUseRgb565Readback();
+ if (readback_config_rgb565 && !check_rgb565_support) {
+ LOG(ERROR) << "Readbackformat rgb565 not supported";
+ callback.Run(false, SkBitmap());
+ return;
+ }
const gfx::Display& display =
gfx::Screen::GetNativeScreen()->GetPrimaryDisplay();
float device_scale_factor = display.device_scale_factor();
@@ -647,7 +659,6 @@ void RenderWidgetHostViewAndroid::CopyFromCompositingSurface(
SynchronousCopyContents(src_subrect_in_pixel, dst_size_in_pixel, callback);
return;
}
-
scoped_ptr<cc::CopyOutputRequest> request;
if (src_subrect_in_pixel.size() == dst_size_in_pixel) {
request = cc::CopyOutputRequest::CreateBitmapRequest(base::Bind(
@@ -658,6 +669,7 @@ void RenderWidgetHostViewAndroid::CopyFromCompositingSurface(
request = cc::CopyOutputRequest::CreateRequest(base::Bind(
&RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult,
dst_size_in_pixel,
+ readback_config_rgb565,
callback));
}
request->set_area(src_subrect_in_pixel);
@@ -1370,6 +1382,7 @@ void RenderWidgetHostViewAndroid::OnLostResources() {
// static
void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult(
const gfx::Size& dst_size_in_pixel,
+ bool readback_config_rgb565,
const base::Callback<void(bool, const SkBitmap&)>& callback,
scoped_ptr<cc::CopyOutputResult> result) {
DCHECK(result->HasTexture());
@@ -1380,8 +1393,12 @@ void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult(
return;
scoped_ptr<SkBitmap> bitmap(new SkBitmap);
- bitmap->setConfig(SkBitmap::kARGB_8888_Config,
- dst_size_in_pixel.width(), dst_size_in_pixel.height(),
+ SkBitmap::Config bitmap_config = readback_config_rgb565 ?
+ SkBitmap::kRGB_565_Config :
+ SkBitmap::kARGB_8888_Config;
+ bitmap->setConfig(bitmap_config,
+ dst_size_in_pixel.width(),
+ dst_size_in_pixel.height(),
0, kOpaque_SkAlphaType);
if (!bitmap->allocPixels())
return;
@@ -1412,6 +1429,7 @@ void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult(
gfx::Rect(result->size()),
dst_size_in_pixel,
pixels,
+ readback_config_rgb565,
base::Bind(&CopyFromCompositingSurfaceFinished,
callback,
base::Passed(&release_callback),