Chromium Code Reviews| 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 "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 256 } | 256 } |
| 257 | 257 |
| 258 bool RenderWidgetHostViewAndroid::PopulateBitmapWithContents(jobject jbitmap) { | 258 bool RenderWidgetHostViewAndroid::PopulateBitmapWithContents(jobject jbitmap) { |
| 259 if (!CompositorImpl::IsInitialized() || | 259 if (!CompositorImpl::IsInitialized() || |
| 260 texture_id_in_layer_ == 0 || | 260 texture_id_in_layer_ == 0 || |
| 261 texture_size_in_layer_.IsEmpty()) | 261 texture_size_in_layer_.IsEmpty()) |
| 262 return false; | 262 return false; |
| 263 | 263 |
| 264 gfx::JavaBitmap bitmap(jbitmap); | 264 gfx::JavaBitmap bitmap(jbitmap); |
| 265 | 265 |
| 266 // TODO(dtrainor): Eventually add support for multiple formats here. | 266 DCHECK((bitmap.format() == ANDROID_BITMAP_FORMAT_RGBA_8888) || |
| 267 DCHECK(bitmap.format() == ANDROID_BITMAP_FORMAT_RGBA_8888); | 267 (bitmap.format() == ANDROID_BITMAP_FORMAT_RGB_565)); |
| 268 | |
| 269 SkBitmap rgba_bitmap; | |
| 270 void* jbitmap_buffer = NULL; | |
| 271 void* gl_read_pass_buffer = NULL; | |
| 272 | |
| 273 const gfx::Rect& bitmap_rect = gfx::Rect(bitmap.size()); | |
| 274 int bitmap_width = bitmap_rect.width(); | |
| 275 int bitmap_height = bitmap_rect.height(); | |
| 276 jbitmap_buffer = reinterpret_cast<void*> (bitmap.pixels()); | |
| 277 | |
| 278 switch (bitmap.format()) { | |
| 279 case ANDROID_BITMAP_FORMAT_RGBA_8888: | |
| 280 gl_read_pass_buffer = jbitmap_buffer; | |
| 281 break; | |
| 282 case ANDROID_BITMAP_FORMAT_RGB_565: | |
| 283 rgba_bitmap.setConfig(SkBitmap::kARGB_8888_Config, | |
| 284 bitmap_width, | |
| 285 bitmap_height); | |
| 286 rgba_bitmap.allocPixels(); | |
| 287 gl_read_pass_buffer = rgba_bitmap.getPixels(); | |
| 288 break; | |
| 289 default: | |
| 290 NOTREACHED(); | |
| 291 break; | |
| 292 } | |
| 268 | 293 |
| 269 GLHelper* helper = ImageTransportFactoryAndroid::GetInstance()->GetGLHelper(); | 294 GLHelper* helper = ImageTransportFactoryAndroid::GetInstance()->GetGLHelper(); |
| 270 | 295 |
| 271 blink::WebGLId texture = helper->CopyAndScaleTexture( | 296 blink::WebGLId texture = helper->CopyAndScaleTexture( |
| 272 texture_id_in_layer_, | 297 texture_id_in_layer_, |
| 273 texture_size_in_layer_, | 298 texture_size_in_layer_, |
| 274 bitmap.size(), | 299 bitmap.size(), |
| 275 true, | 300 true, |
| 276 GLHelper::SCALER_QUALITY_FAST); | 301 GLHelper::SCALER_QUALITY_FAST); |
| 277 if (texture == 0) | 302 if (texture == 0) |
| 278 return false; | 303 return false; |
| 279 | 304 |
| 280 helper->ReadbackTextureSync(texture, | 305 helper->ReadbackTextureSync(texture, |
| 281 gfx::Rect(bitmap.size()), | 306 gfx::Rect(bitmap.size()), |
| 282 static_cast<unsigned char*> (bitmap.pixels())); | 307 static_cast<unsigned char*> (gl_read_pass_buffer)); |
| 283 | 308 |
| 284 blink::WebGraphicsContext3D* context = | 309 blink::WebGraphicsContext3D* context = |
| 285 ImageTransportFactoryAndroid::GetInstance()->GetContext3D(); | 310 ImageTransportFactoryAndroid::GetInstance()->GetContext3D(); |
| 286 context->deleteTexture(texture); | 311 context->deleteTexture(texture); |
| 287 | 312 |
| 313 if(bitmap.format() == ANDROID_BITMAP_FORMAT_RGB_565){ | |
| 314 SkBitmap rgb565_bitmap; | |
| 315 rgb565_bitmap.setConfig(SkBitmap::kRGB_565_Config, | |
| 316 bitmap_width, | |
| 317 bitmap_height, 0); | |
| 318 rgb565_bitmap.setPixels(jbitmap_buffer); | |
| 319 SkCanvas rgb565_canvas(rgb565_bitmap); | |
| 320 SkRect draw_rect = SkRect::MakeXYWH(SkIntToScalar(0), | |
| 321 SkIntToScalar(0), | |
| 322 SkIntToScalar(bitmap_width), | |
| 323 SkIntToScalar(bitmap_height)); | |
| 324 | |
| 325 rgb565_canvas.drawBitmapRectToRect(rgba_bitmap, | |
| 326 &draw_rect, | |
|
no sievers
2013/11/26 21:45:27
Isn't the point of this to reduce the readback siz
| |
| 327 draw_rect, | |
| 328 NULL); | |
| 329 } | |
| 330 | |
| 288 return true; | 331 return true; |
| 289 } | 332 } |
| 290 | 333 |
| 291 bool RenderWidgetHostViewAndroid::HasValidFrame() const { | 334 bool RenderWidgetHostViewAndroid::HasValidFrame() const { |
| 292 if (!content_view_core_) | 335 if (!content_view_core_) |
| 293 return false; | 336 return false; |
| 294 if (texture_size_in_layer_.IsEmpty()) | 337 if (texture_size_in_layer_.IsEmpty()) |
| 295 return false; | 338 return false; |
| 296 | 339 |
| 297 if (UsingDelegatedRenderer()) { | 340 if (UsingDelegatedRenderer()) { |
| (...skipping 1078 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1376 // RenderWidgetHostView, public: | 1419 // RenderWidgetHostView, public: |
| 1377 | 1420 |
| 1378 // static | 1421 // static |
| 1379 RenderWidgetHostView* | 1422 RenderWidgetHostView* |
| 1380 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { | 1423 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { |
| 1381 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); | 1424 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
| 1382 return new RenderWidgetHostViewAndroid(rwhi, NULL); | 1425 return new RenderWidgetHostViewAndroid(rwhi, NULL); |
| 1383 } | 1426 } |
| 1384 | 1427 |
| 1385 } // namespace content | 1428 } // namespace content |
| OLD | NEW |