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 2deba2c846f34210a7724a9892939d23a70eb836..729f49a93ac41c004cfa75bccc7bd2e782ea3283 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_android.cc |
| +++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
| @@ -4,6 +4,8 @@ |
| #include "content/browser/renderer_host/render_widget_host_view_android.h" |
| +#include <android/bitmap.h> |
| + |
| #include "base/bind.h" |
| #include "base/logging.h" |
| #include "base/message_loop.h" |
| @@ -15,11 +17,16 @@ |
| #include "content/browser/renderer_host/image_transport_factory_android.h" |
| #include "content/browser/renderer_host/render_widget_host_impl.h" |
| #include "content/common/android/device_info.h" |
| +#include "content/common/gpu/client/gl_helper.h" |
| #include "content/common/gpu/gpu_messages.h" |
| #include "content/common/view_messages.h" |
| +#include "third_party/khronos/GLES2/gl2.h" |
| +#include "third_party/khronos/GLES2/gl2ext.h" |
| #include "third_party/WebKit/Source/Platform/chromium/public/Platform.h" |
| #include "third_party/WebKit/Source/Platform/chromium/public/WebCompositorSupport.h" |
| +#include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3D.h" |
| #include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" |
| +#include "ui/gfx/android/java_bitmap.h" |
| namespace content { |
| @@ -49,7 +56,8 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
| is_hidden_(!content_view_core), |
| content_view_core_(content_view_core), |
| ime_adapter_android_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
| - texture_layer_(WebKit::WebExternalTextureLayer::create()) { |
| + texture_layer_(WebKit::WebExternalTextureLayer::create()), |
| + texture_id_in_layer_(0) { |
| host_->SetView(this); |
| // RenderWidgetHost is initialized as visible. If is_hidden_ is true, tell |
| // RenderWidgetHost to hide. |
| @@ -124,6 +132,52 @@ void RenderWidgetHostViewAndroid::SetBounds(const gfx::Rect& rect) { |
| SetSize(rect.size()); |
| } |
| +WebKit::WebGLId RenderWidgetHostViewAndroid::GetScaledContentTexture( |
| + const gfx::Size& size) { |
| + if (texture_id_in_layer_ == 0) |
| + return 0; |
| + |
| + GLHelper* helper = ImageTransportFactoryAndroid::GetInstance()->GetGLHelper(); |
| + return helper->CopyTexture(texture_id_in_layer_, requested_size_, size); |
| +} |
| + |
| +bool RenderWidgetHostViewAndroid::PopulateBitmapWithContents(jobject jbitmap) { |
| + if (texture_id_in_layer_ == 0) |
| + return false; |
| + |
| + gfx::JavaBitmap bitmap(jbitmap); |
| + |
| + // TODO(dtrainor): Eventually add support for multiple formats here. |
| + DCHECK(bitmap.format() == ANDROID_BITMAP_FORMAT_RGBA_8888); |
| + |
| + WebKit::WebGLId texture = texture_id_in_layer_; |
| + |
| + GLHelper* helper = ImageTransportFactoryAndroid::GetInstance()->GetGLHelper(); |
| + |
| + // If we're trying to read to a bitmap of a different size, we need to copy |
| + // and scale the texture before we can read it back. |
| + if (bitmap.size() != requested_size_) { |
| + texture = helper->CopyTexture(texture_id_in_layer_, |
| + requested_size_, |
| + bitmap.size()); |
| + if (texture == 0) |
| + return false; |
| + } |
| + |
| + helper->SyncCopyRawTextureTo(texture, |
| + bitmap.size(), |
| + (unsigned char*) bitmap.pixels()); |
|
piman
2012/10/19 22:10:10
nit: static_cast or reinterpret_cast
David Trainor- moved to gerrit
2012/10/19 23:11:27
Done.
|
| + |
| + if (texture != texture_id_in_layer_) { |
| + // We created a temporary texture. We need to clean it up. |
| + WebKit::WebGraphicsContext3D* context = |
| + ImageTransportFactoryAndroid::GetInstance()->GetContext3D(); |
| + context->deleteTexture(texture); |
| + } |
| + |
| + return true; |
| +} |
| + |
| gfx::NativeView RenderWidgetHostViewAndroid::GetNativeView() const { |
| return content_view_core_; |
| } |
| @@ -310,6 +364,7 @@ void RenderWidgetHostViewAndroid::AcceleratedSurfaceBuffersSwapped( |
| const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params, |
| int gpu_host_id) { |
| texture_layer_->setTextureId(params.surface_handle); |
| + texture_id_in_layer_ = params.surface_handle; |
| texture_layer_->layer()->invalidate(); |
| // TODO(sievers): The view and layer should get sized proactively. |
| if (((gfx::Size)texture_layer_->layer()->bounds()).IsEmpty()) |