| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "content/browser/android/content_view_render_view.h" |
| |
| #include "base/android/jni_android.h" |
| #include "base/android/jni_string.h" |
| #include "base/android/scoped_java_ref.h" |
| #include "base/bind.h" |
| #include "base/lazy_instance.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/message_loop/message_loop.h" |
| #include "cc/layers/layer.h" |
| #include "content/browser/android/content_view_core_impl.h" |
| #include "content/public/browser/android/compositor.h" |
| #include "content/public/browser/android/content_view_layer_renderer.h" |
| #include "content/public/browser/android/layer_tree_build_helper.h" |
| #include "content/public/browser/android/ui_resource_provider.h" |
| #include "jni/ContentViewRenderView_jni.h" |
| #include "ui/gfx/android/java_bitmap.h" |
| #include "ui/gfx/size.h" |
| |
| #include <android/bitmap.h> |
| #include <android/native_window_jni.h> |
| |
| using base::android::ScopedJavaLocalRef; |
| |
| namespace content { |
| |
| namespace { |
| |
| class LayerTreeBuildHelperImpl : public LayerTreeBuildHelper { |
| public: |
| LayerTreeBuildHelperImpl() {} |
| virtual ~LayerTreeBuildHelperImpl() {} |
| |
| virtual scoped_refptr<cc::Layer> GetLayerTree( |
| scoped_refptr<cc::Layer> content_root_layer) override { |
| return content_root_layer; |
| } |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(LayerTreeBuildHelperImpl); |
| }; |
| |
| } // anonymous namespace |
| |
| // static |
| bool ContentViewRenderView::RegisterContentViewRenderView(JNIEnv* env) { |
| return RegisterNativesImpl(env); |
| } |
| |
| ContentViewRenderView::ContentViewRenderView(JNIEnv* env, |
| jobject obj, |
| gfx::NativeWindow root_window) |
| : layer_tree_build_helper_(new LayerTreeBuildHelperImpl()), |
| root_window_(root_window), |
| current_surface_format_(0) { |
| java_obj_.Reset(env, obj); |
| } |
| |
| ContentViewRenderView::~ContentViewRenderView() { |
| } |
| |
| void ContentViewRenderView::SetLayerTreeBuildHelper(JNIEnv* env, |
| jobject obj, |
| jlong native_build_helper) { |
| CHECK(native_build_helper); |
| |
| LayerTreeBuildHelper* build_helper = |
| reinterpret_cast<LayerTreeBuildHelper*>(native_build_helper); |
| layer_tree_build_helper_.reset(build_helper); |
| InitCompositor(); |
| } |
| // static |
| static jlong Init(JNIEnv* env, |
| jobject obj, |
| jlong native_root_window) { |
| gfx::NativeWindow root_window = |
| reinterpret_cast<gfx::NativeWindow>(native_root_window); |
| ContentViewRenderView* content_view_render_view = |
| new ContentViewRenderView(env, obj, root_window); |
| return reinterpret_cast<intptr_t>(content_view_render_view); |
| } |
| |
| void ContentViewRenderView::Destroy(JNIEnv* env, jobject obj) { |
| delete this; |
| } |
| |
| void ContentViewRenderView::SetCurrentContentViewCore( |
| JNIEnv* env, jobject obj, jlong native_content_view_core) { |
| InitCompositor(); |
| ContentViewCoreImpl* content_view_core = |
| reinterpret_cast<ContentViewCoreImpl*>(native_content_view_core); |
| compositor_->SetRootLayer(content_view_core |
| ? layer_tree_build_helper_->GetLayerTree( |
| content_view_core->GetLayer()) |
| : scoped_refptr<cc::Layer>()); |
| } |
| |
| void ContentViewRenderView::SurfaceCreated( |
| JNIEnv* env, jobject obj) { |
| current_surface_format_ = 0; |
| InitCompositor(); |
| } |
| |
| void ContentViewRenderView::SurfaceDestroyed(JNIEnv* env, jobject obj) { |
| compositor_->SetSurface(NULL); |
| current_surface_format_ = 0; |
| } |
| |
| void ContentViewRenderView::SurfaceChanged(JNIEnv* env, jobject obj, |
| jint format, jint width, jint height, jobject surface) { |
| if (current_surface_format_ != format) { |
| current_surface_format_ = format; |
| compositor_->SetSurface(surface); |
| } |
| compositor_->SetWindowBounds(gfx::Size(width, height)); |
| } |
| |
| void ContentViewRenderView::SetOverlayVideoMode( |
| JNIEnv* env, jobject obj, bool enabled) { |
| compositor_->SetHasTransparentBackground(enabled); |
| SetNeedsComposite(env, obj); |
| } |
| |
| void ContentViewRenderView::SetNeedsComposite(JNIEnv* env, jobject obj) { |
| if (compositor_) |
| compositor_->SetNeedsComposite(); |
| } |
| |
| void ContentViewRenderView::Layout() { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| Java_ContentViewRenderView_onCompositorLayout(env, java_obj_.obj()); |
| } |
| |
| void ContentViewRenderView::OnSwapBuffersCompleted(int pending_swap_buffers) { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| Java_ContentViewRenderView_onSwapBuffersCompleted(env, java_obj_.obj()); |
| } |
| |
| void ContentViewRenderView::InitCompositor() { |
| if (!compositor_) |
| compositor_.reset(Compositor::Create(this, root_window_)); |
| } |
| |
| jlong ContentViewRenderView::GetUIResourceProvider(JNIEnv* env, |
| jobject obj) { |
| if (!compositor_) |
| return 0; |
| return reinterpret_cast<intptr_t>(&compositor_->GetUIResourceProvider()); |
| } |
| } // namespace content |