Chromium Code Reviews| 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; |
| } |