summaryrefslogtreecommitdiffstats
path: root/content/browser/android
diff options
context:
space:
mode:
authorpowei@chromium.org <powei@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-27 21:03:50 +0000
committerpowei@chromium.org <powei@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-27 21:03:50 +0000
commit0389fc7056045a959ad4364775b37f0cfd79c19e (patch)
tree513caac368e10d908bc556b29759e0d801381e91 /content/browser/android
parenta1154f904109fa9e6e2f220054a4f7a8c2550cde (diff)
downloadchromium_src-0389fc7056045a959ad4364775b37f0cfd79c19e.zip
chromium_src-0389fc7056045a959ad4364775b37f0cfd79c19e.tar.gz
chromium_src-0389fc7056045a959ad4364775b37f0cfd79c19e.tar.bz2
android: add Java-side support for browser compositor async readback
The android browser compositor removed support for sync readback. Support for async readback was added (https://codereview.chromium.org/281003002/). This patch adds a Java-side API through the existing ContentReadbackHandler. android= https://chrome-internal-review.googlesource.com/#/c/164043/ BUG=252046 Review URL: https://codereview.chromium.org/297683005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@273026 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/android')
-rw-r--r--content/browser/android/content_readback_handler.cc83
-rw-r--r--content/browser/android/content_readback_handler.h14
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_;