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 |