diff options
Diffstat (limited to 'content/browser/android')
-rw-r--r-- | content/browser/android/content_readback_handler.cc | 83 | ||||
-rw-r--r-- | content/browser/android/content_readback_handler.h | 14 |
2 files changed, 77 insertions, 20 deletions
diff --git a/content/browser/android/content_readback_handler.cc b/content/browser/android/content_readback_handler.cc index 432b230..841ef5f 100644 --- a/content/browser/android/content_readback_handler.cc +++ b/content/browser/android/content_readback_handler.cc @@ -6,14 +6,36 @@ #include "base/android/jni_android.h" #include "base/bind.h" +#include "cc/output/copy_output_request.h" +#include "cc/output/copy_output_result.h" #include "content/browser/android/content_view_core_impl.h" #include "jni/ContentReadbackHandler_jni.h" #include "third_party/skia/include/core/SkBitmap.h" +#include "ui/base/android/window_android.h" +#include "ui/base/android/window_android_compositor.h" #include "ui/gfx/android/java_bitmap.h" #include "ui/gfx/rect.h" namespace content { +namespace { + +typedef base::Callback<void(bool, const SkBitmap&)> ResultCallback; + +void OnFinishCopyOutputRequest( + const ResultCallback& result_callback, + scoped_ptr<cc::CopyOutputResult> copy_output_result) { + if (!copy_output_result->HasBitmap()) { + result_callback.Run(false, SkBitmap()); + return; + } + + scoped_ptr<SkBitmap> bitmap = copy_output_result->TakeBitmap(); + result_callback.Run(true, *bitmap.Pass()); +} + +} // anonymous namespace + // static bool ContentReadbackHandler::RegisterContentReadbackHandler(JNIEnv* env) { return RegisterNativesImpl(env); @@ -24,24 +46,10 @@ ContentReadbackHandler::ContentReadbackHandler(JNIEnv* env, jobject obj) java_obj_.Reset(env, obj); } -ContentReadbackHandler::~ContentReadbackHandler() {} - void ContentReadbackHandler::Destroy(JNIEnv* env, jobject obj) { delete this; } -void ContentReadbackHandler::OnFinishContentReadback(int readback_id, - bool success, - const SkBitmap& bitmap) { - JNIEnv* env = base::android::AttachCurrentThread(); - ScopedJavaLocalRef<jobject> java_bitmap; - if (success) - java_bitmap = gfx::ConvertToJavaBitmap(&bitmap); - - Java_ContentReadbackHandler_notifyGetContentBitmapFinished( - env, java_obj_.obj(), readback_id, success, java_bitmap.obj()); -} - void ContentReadbackHandler::GetContentBitmap(JNIEnv* env, jobject obj, jint readback_id, @@ -56,14 +64,55 @@ void ContentReadbackHandler::GetContentBitmap(JNIEnv* env, ContentViewCore::GetNativeContentViewCore(env, content_view_core); DCHECK(view); - base::Callback<void(bool, const SkBitmap&)> result_callback = - base::Bind(&ContentReadbackHandler::OnFinishContentReadback, + ResultCallback result_callback = + base::Bind(&ContentReadbackHandler::OnFinishReadback, weak_factory_.GetWeakPtr(), readback_id); view->GetScaledContentBitmap( scale, config, gfx::Rect(x, y, width, height), result_callback); - return; +} + +void ContentReadbackHandler::GetCompositorBitmap(JNIEnv* env, + jobject obj, + jint readback_id, + jlong native_window_android) { + ui::WindowAndroid* window_android = + reinterpret_cast<ui::WindowAndroid*>(native_window_android); + DCHECK(window_android); + + ResultCallback result_callback = + base::Bind(&ContentReadbackHandler::OnFinishReadback, + weak_factory_.GetWeakPtr(), + readback_id); + + base::Callback<void(scoped_ptr<cc::CopyOutputResult>)> copy_output_callback = + base::Bind(&OnFinishCopyOutputRequest, + result_callback); + + ui::WindowAndroidCompositor* compositor = window_android->GetCompositor(); + + if (!compositor) { + copy_output_callback.Run(cc::CopyOutputResult::CreateEmptyResult()); + return; + } + + compositor->RequestCopyOfOutputOnRootLayer( + cc::CopyOutputRequest::CreateBitmapRequest(copy_output_callback)); +} + +ContentReadbackHandler::~ContentReadbackHandler() {} + +void ContentReadbackHandler::OnFinishReadback(int readback_id, + bool success, + const SkBitmap& bitmap) { + JNIEnv* env = base::android::AttachCurrentThread(); + ScopedJavaLocalRef<jobject> java_bitmap; + if (success) + java_bitmap = gfx::ConvertToJavaBitmap(&bitmap); + + Java_ContentReadbackHandler_notifyGetBitmapFinished( + env, java_obj_.obj(), readback_id, success, java_bitmap.obj()); } // static diff --git a/content/browser/android/content_readback_handler.h b/content/browser/android/content_readback_handler.h index 11d5aa3..403bdd0 100644 --- a/content/browser/android/content_readback_handler.h +++ b/content/browser/android/content_readback_handler.h @@ -13,6 +13,10 @@ class SkBitmap; +namespace cc { +class CopyOutputResult; +} + namespace content { // Native side of the ContentReadbackHandler.java, which issues content @@ -35,13 +39,17 @@ class ContentReadbackHandler { jfloat width, jfloat height, jobject content_view_core); + void GetCompositorBitmap(JNIEnv* env, + jobject obj, + jint readback_id, + jlong native_window_android); private: virtual ~ContentReadbackHandler(); - void OnFinishContentReadback(int readback_id, - bool success, - const SkBitmap& bitmap); + void OnFinishReadback(int readback_id, + bool success, + const SkBitmap& bitmap); base::android::ScopedJavaGlobalRef<jobject> java_obj_; base::WeakPtrFactory<ContentReadbackHandler> weak_factory_; |