blob: 5380a0725025c68fddb2b117290318555f0df036 [file] [log] [blame]
// Copyright 2016 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.
#ifndef REMOTING_CLIENT_JNI_JNI_GL_DISPLAY_HANDLER_H_
#define REMOTING_CLIENT_JNI_JNI_GL_DISPLAY_HANDLER_H_
#include <EGL/egl.h>
#include <jni.h>
#include "base/android/scoped_java_ref.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "remoting/client/gl_renderer.h"
#include "remoting/client/gl_renderer_delegate.h"
#include "remoting/client/jni/display_updater_factory.h"
#include "remoting/protocol/cursor_shape_stub.h"
namespace remoting {
class ChromotingJniRuntime;
class DualBufferFrameConsumer;
class EglThreadContext;
class QueuedTaskPoster;
// Handles OpenGL display operations. Draws desktop and cursor on the OpenGL
// surface.
// JNI functions should all be called on the UI thread. The display handler
// itself should be deleted on the display thread.
// Please see GlDisplay.java for documentations.
class JniGlDisplayHandler : public DisplayUpdaterFactory,
public protocol::CursorShapeStub,
public GlRendererDelegate {
public:
JniGlDisplayHandler(ChromotingJniRuntime* runtime);
~JniGlDisplayHandler() override;
// Sets the DesktopViewFactory for the Java client.
void InitializeClient(
const base::android::JavaRef<jobject>& java_client);
// DisplayUpdaterFactory interface.
std::unique_ptr<protocol::CursorShapeStub> CreateCursorShapeStub() override;
std::unique_ptr<protocol::VideoRenderer> CreateVideoRenderer() override;
static bool RegisterJni(JNIEnv* env);
void OnSurfaceCreated(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& caller,
const base::android::JavaParamRef<jobject>& surface);
void OnSurfaceChanged(JNIEnv* env,
const base::android::JavaParamRef<jobject>& caller,
int width,
int height);
void OnSurfaceDestroyed(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& caller);
void OnPixelTransformationChanged(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& caller,
const base::android::JavaParamRef<jfloatArray>& matrix
);
void OnCursorPixelPositionChanged(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& caller,
float x,
float y);
void OnCursorVisibilityChanged(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& caller,
bool visible);
void OnCursorInputFeedback(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& caller,
float x,
float y,
float diameter);
private:
// GlRendererDelegate interface.
bool CanRenderFrame() override;
void OnFrameRendered() override;
void OnSizeChanged(int width, int height) override;
// CursorShapeStub interface.
void SetCursorShape(const protocol::CursorShapeInfo& cursor_shape) override;
static void NotifyRenderDoneOnUiThread(
base::android::ScopedJavaGlobalRef<jobject> java_display);
void SurfaceCreatedOnDisplayThread(
base::android::ScopedJavaGlobalRef<jobject> surface);
void SurfaceDestroyedOnDisplayThread();
static void ChangeCanvasSizeOnUiThread(
base::android::ScopedJavaGlobalRef<jobject> java_display,
int width,
int height);
ChromotingJniRuntime* runtime_;
base::android::ScopedJavaGlobalRef<jobject> java_display_;
std::unique_ptr<EglThreadContext> egl_context_;
base::WeakPtr<DualBufferFrameConsumer> frame_consumer_;
// |renderer_| must be deleted earlier than |egl_context_|.
GlRenderer renderer_;
std::unique_ptr<QueuedTaskPoster> ui_task_poster_;
// Used on display thread.
base::WeakPtr<JniGlDisplayHandler> weak_ptr_;
base::WeakPtrFactory<JniGlDisplayHandler> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(JniGlDisplayHandler);
};
} // namespace remoting
#endif // REMOTING_CLIENT_JNI_JNI_GL_DISPLAY_HANDLER_H_