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