content_view_render_view.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jni/ContentViewRenderView_jni.h" 198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ui/gfx/android/java_bitmap.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include <android/bitmap.h> 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <android/native_window_jni.h> 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ScopedJavaLocalRef; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ContentViewRenderView::RegisterContentViewRenderView(JNIEnv* env) { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RegisterNativesImpl(env); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ContentViewRenderView::ContentViewRenderView(JNIEnv* env, 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) jobject obj, 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::NativeWindow root_window) 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : buffers_swapped_during_composite_(false), 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_window_(root_window), 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_surface_format_(0) { 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) java_obj_.Reset(env, obj); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ContentViewRenderView::~ContentViewRenderView() { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static jlong Init(JNIEnv* env, jobject obj, jlong native_root_window) { 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::NativeWindow root_window = 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) reinterpret_cast<gfx::NativeWindow>(native_root_window); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentViewRenderView* content_view_render_view = 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new ContentViewRenderView(env, obj, root_window); 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return reinterpret_cast<intptr_t>(content_view_render_view); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewRenderView::Destroy(JNIEnv* env, jobject obj) { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete this; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ContentViewRenderView::SetCurrentContentViewCore( 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch JNIEnv* env, jobject obj, jlong native_content_view_core) { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitCompositor(); 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ContentViewCoreImpl* content_view_core = 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch reinterpret_cast<ContentViewCoreImpl*>(native_content_view_core); 64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (content_view_core) 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch compositor_->SetRootLayer(content_view_core->GetLayer()); 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) else 6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) compositor_->SetRootLayer(cc::Layer::Create()); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewRenderView::SurfaceCreated( 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) JNIEnv* env, jobject obj) { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitCompositor(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewRenderView::SurfaceDestroyed(JNIEnv* env, jobject obj) { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositor_->SetSurface(NULL); 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_surface_format_ = 0; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentViewRenderView::SurfaceChanged(JNIEnv* env, jobject obj, 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) jint format, jint width, jint height, jobject surface) { 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (current_surface_format_ != format) { 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_surface_format_ = format; 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) compositor_->SetSurface(surface); 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositor_->SetWindowBounds(gfx::Size(width, height)); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)jboolean ContentViewRenderView::Composite(JNIEnv* env, jobject obj) { 9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!compositor_) 9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) buffers_swapped_during_composite_ = false; 9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) compositor_->Composite(); 9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return buffers_swapped_during_composite_; 9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)jboolean ContentViewRenderView::CompositeToBitmap(JNIEnv* env, jobject obj, 998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) jobject java_bitmap) { 1008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::JavaBitmap bitmap(java_bitmap); 1018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!compositor_ || bitmap.format() != ANDROID_BITMAP_FORMAT_RGBA_8888) 1028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return false; 1038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return compositor_->CompositeAndReadback(bitmap.pixels(), 1048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Rect(bitmap.size())); 1058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 1068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentViewRenderView::SetOverlayVideoMode( 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) JNIEnv* env, jobject obj, bool enabled) { 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) compositor_->SetHasTransparentBackground(enabled); 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Java_ContentViewRenderView_requestRender(env, obj); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentViewRenderView::ScheduleComposite() { 11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Java_ContentViewRenderView_requestRender(env, java_obj_.obj()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ContentViewRenderView::OnSwapBuffersPosted() { 11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) buffers_swapped_during_composite_ = true; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ContentViewRenderView::OnSwapBuffersCompleted() { 12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Java_ContentViewRenderView_onSwapBuffersCompleted(env, java_obj_.obj()); 12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ContentViewRenderView::InitCompositor() { 12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!compositor_) 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) compositor_.reset(Compositor::Create(this, root_window_)); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 133