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 fe64d9240c1ca08a6ab3fbb4bb6cd3e3cea82514..e80a1dfade75265b3cb5f59373a03e0b6ea8f82f 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_android.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
@@ -263,8 +263,33 @@ bool RenderWidgetHostViewAndroid::PopulateBitmapWithContents(jobject jbitmap) { |
gfx::JavaBitmap bitmap(jbitmap); |
- // TODO(dtrainor): Eventually add support for multiple formats here. |
- DCHECK(bitmap.format() == ANDROID_BITMAP_FORMAT_RGBA_8888); |
+ DCHECK((bitmap.format() == ANDROID_BITMAP_FORMAT_RGBA_8888) || |
+ (bitmap.format() == ANDROID_BITMAP_FORMAT_RGB_565)); |
+ |
+ SkBitmap rgba_bitmap; |
+ void* jbitmap_buffer = NULL; |
+ void* gl_read_pass_buffer = NULL; |
+ |
+ const gfx::Rect& bitmap_rect = gfx::Rect(bitmap.size()); |
+ int bitmap_width = bitmap_rect.width(); |
+ int bitmap_height = bitmap_rect.height(); |
+ jbitmap_buffer = reinterpret_cast<void*> (bitmap.pixels()); |
+ |
+ switch (bitmap.format()) { |
+ case ANDROID_BITMAP_FORMAT_RGBA_8888: |
+ gl_read_pass_buffer = jbitmap_buffer; |
+ break; |
+ case ANDROID_BITMAP_FORMAT_RGB_565: |
+ rgba_bitmap.setConfig(SkBitmap::kARGB_8888_Config, |
+ bitmap_width, |
+ bitmap_height); |
+ rgba_bitmap.allocPixels(); |
+ gl_read_pass_buffer = rgba_bitmap.getPixels(); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
GLHelper* helper = ImageTransportFactoryAndroid::GetInstance()->GetGLHelper(); |
@@ -278,13 +303,31 @@ bool RenderWidgetHostViewAndroid::PopulateBitmapWithContents(jobject jbitmap) { |
return false; |
helper->ReadbackTextureSync(texture, |
- gfx::Rect(bitmap.size()), |
- static_cast<unsigned char*> (bitmap.pixels())); |
+ gfx::Rect(bitmap.size()), |
+ static_cast<unsigned char*> (gl_read_pass_buffer)); |
blink::WebGraphicsContext3D* context = |
ImageTransportFactoryAndroid::GetInstance()->GetContext3D(); |
context->deleteTexture(texture); |
+ if(bitmap.format() == ANDROID_BITMAP_FORMAT_RGB_565){ |
+ SkBitmap rgb565_bitmap; |
+ rgb565_bitmap.setConfig(SkBitmap::kRGB_565_Config, |
+ bitmap_width, |
+ bitmap_height, 0); |
+ rgb565_bitmap.setPixels(jbitmap_buffer); |
+ SkCanvas rgb565_canvas(rgb565_bitmap); |
+ SkRect draw_rect = SkRect::MakeXYWH(SkIntToScalar(0), |
+ SkIntToScalar(0), |
+ SkIntToScalar(bitmap_width), |
+ SkIntToScalar(bitmap_height)); |
+ |
+ rgb565_canvas.drawBitmapRectToRect(rgba_bitmap, |
+ &draw_rect, |
no sievers
2013/11/26 21:45:27
Isn't the point of this to reduce the readback siz
|
+ draw_rect, |
+ NULL); |
+ } |
+ |
return true; |
} |