15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/android/content_view_render_view.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_android.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_string.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/scoped_java_ref.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/android/content_view_core_impl.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/android/compositor.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/android/content_view_layer_renderer.h" 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/android/layer_tree_build_helper.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/android/ui_resource_provider.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jni/ContentViewRenderView_jni.h" 218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ui/gfx/android/java_bitmap.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include <android/bitmap.h> 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <android/native_window_jni.h> 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ScopedJavaLocalRef; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace { 32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class LayerTreeBuildHelperImpl : public LayerTreeBuildHelper { 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LayerTreeBuildHelperImpl() {} 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual ~LayerTreeBuildHelperImpl() {} 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual scoped_refptr<cc::Layer> GetLayerTree( 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_refptr<cc::Layer> content_root_layer) OVERRIDE { 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return content_root_layer; 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private: 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LayerTreeBuildHelperImpl); 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // anonymous namespace 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ContentViewRenderView::RegisterContentViewRenderView(JNIEnv* env) { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RegisterNativesImpl(env); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ContentViewRenderView::ContentViewRenderView(JNIEnv* env, 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) jobject obj, 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::NativeWindow root_window) 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : layer_tree_build_helper_(new LayerTreeBuildHelperImpl()), 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_window_(root_window), 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_surface_format_(0) { 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) java_obj_.Reset(env, obj); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ContentViewRenderView::~ContentViewRenderView() { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid ContentViewRenderView::SetLayerTreeBuildHelper(JNIEnv* env, 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu jobject obj, 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu jlong native_build_helper) { 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CHECK(native_build_helper); 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu LayerTreeBuildHelper* build_helper = 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu reinterpret_cast<LayerTreeBuildHelper*>(native_build_helper); 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu layer_tree_build_helper_.reset(build_helper); 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitCompositor(); 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic jlong Init(JNIEnv* env, 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu jobject obj, 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu jlong native_root_window) { 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::NativeWindow root_window = 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) reinterpret_cast<gfx::NativeWindow>(native_root_window); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewRenderView* content_view_render_view = 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new ContentViewRenderView(env, obj, root_window); 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return reinterpret_cast<intptr_t>(content_view_render_view); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewRenderView::Destroy(JNIEnv* env, jobject obj) { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete this; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ContentViewRenderView::SetCurrentContentViewCore( 92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch JNIEnv* env, jobject obj, jlong native_content_view_core) { 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitCompositor(); 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ContentViewCoreImpl* content_view_core = 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch reinterpret_cast<ContentViewCoreImpl*>(native_content_view_core); 96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) compositor_->SetRootLayer(content_view_core 97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ? layer_tree_build_helper_->GetLayerTree( 98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) content_view_core->GetLayer()) 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : scoped_refptr<cc::Layer>()); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewRenderView::SurfaceCreated( 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) JNIEnv* env, jobject obj) { 104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch current_surface_format_ = 0; 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitCompositor(); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewRenderView::SurfaceDestroyed(JNIEnv* env, jobject obj) { 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositor_->SetSurface(NULL); 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_surface_format_ = 0; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentViewRenderView::SurfaceChanged(JNIEnv* env, jobject obj, 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) jint format, jint width, jint height, jobject surface) { 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (current_surface_format_ != format) { 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_surface_format_ = format; 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) compositor_->SetSurface(surface); 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositor_->SetWindowBounds(gfx::Size(width, height)); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentViewRenderView::SetOverlayVideoMode( 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) JNIEnv* env, jobject obj, bool enabled) { 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) compositor_->SetHasTransparentBackground(enabled); 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetNeedsComposite(env, obj); 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ContentViewRenderView::SetNeedsComposite(JNIEnv* env, jobject obj) { 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (compositor_) 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci compositor_->SetNeedsComposite(); 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ContentViewRenderView::Layout() { 13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Java_ContentViewRenderView_onCompositorLayout(env, java_obj_.obj()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ContentViewRenderView::OnSwapBuffersCompleted(int pending_swap_buffers) { 13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Java_ContentViewRenderView_onSwapBuffersCompleted(env, java_obj_.obj()); 14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ContentViewRenderView::InitCompositor() { 14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!compositor_) 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) compositor_.reset(Compositor::Create(this, root_window_)); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccijlong ContentViewRenderView::GetUIResourceProvider(JNIEnv* env, 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci jobject obj) { 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!compositor_) 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return reinterpret_cast<intptr_t>(&compositor_->GetUIResourceProvider()); 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 155