Index: content/browser/android/content_readback_handler.cc |
diff --git a/content/browser/android/content_readback_handler.cc b/content/browser/android/content_readback_handler.cc |
index 432b23099ead6aaf2bf47bafe0c3745e1016469a..841ef5f051ae0b8eb390a8f9ea8c57649563f58e 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 |