Index: remoting/android/java/src/org/chromium/chromoting/cardboard/Cursor.java |
diff --git a/remoting/android/java/src/org/chromium/chromoting/cardboard/Cursor.java b/remoting/android/java/src/org/chromium/chromoting/cardboard/Cursor.java |
deleted file mode 100644 |
index 0f49a82aafba704bfd5bc90658894a73a7e3d8a9..0000000000000000000000000000000000000000 |
--- a/remoting/android/java/src/org/chromium/chromoting/cardboard/Cursor.java |
+++ /dev/null |
@@ -1,248 +0,0 @@ |
-// Copyright 2015 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. |
- |
-package org.chromium.chromoting.cardboard; |
- |
-import static org.chromium.chromoting.cardboard.CardboardUtil.makeFloatBuffer; |
-import static org.chromium.chromoting.cardboard.CardboardUtil.makeRectangularTextureBuffer; |
- |
-import android.graphics.Bitmap; |
-import android.graphics.Point; |
-import android.graphics.PointF; |
-import android.opengl.GLES20; |
- |
-import org.chromium.chromoting.InputStub; |
-import org.chromium.chromoting.jni.Client; |
-import org.chromium.chromoting.jni.Display; |
- |
-import java.nio.FloatBuffer; |
- |
-/** |
- * Cardboard activity desktop cursor that is used to render the image of the mouse |
- * cursor onto the desktop. |
- */ |
-public class Cursor { |
- private static final String VERTEX_SHADER = |
- "uniform mat4 u_CombinedMatrix;" |
- + "attribute vec4 a_Position;" |
- + "attribute vec2 a_TexCoordinate;" |
- + "varying vec2 v_TexCoordinate;" |
- + "void main() {" |
- + " v_TexCoordinate = a_TexCoordinate;" |
- + " gl_Position = u_CombinedMatrix * a_Position;" |
- + "}"; |
- |
- private static final String FRAGMENT_SHADER = |
- "precision mediump float;" |
- + "uniform sampler2D u_Texture;" |
- + "varying vec2 v_TexCoordinate;" |
- + "void main() {" |
- + " gl_FragColor = texture2D(u_Texture, v_TexCoordinate);" |
- + "}"; |
- |
- private static final FloatBuffer TEXTURE_COORDINATES = makeRectangularTextureBuffer( |
- 0.0f, 1.0f, 0.0f, 1.0f); |
- |
- private static final int POSITION_COORDINATE_DATA_SIZE = 3; |
- private static final int TEXTURE_COORDINATE_DATA_SIZE = 2; |
- |
- // Number of vertices passed to glDrawArrays(). |
- private static final int VERTICES_NUMBER = 6; |
- |
- // Threshold to determine whether to send the mouse move event. |
- private static final float CURSOR_MOVE_THRESHOLD = 1.0f; |
- |
- private final Client mClient; |
- private final Display mDisplay; |
- |
- private FloatBuffer mPositionCoordinates; |
- |
- private int mVertexShaderHandle; |
- private int mFragmentShaderHandle; |
- private int mProgramHandle; |
- private int mCombinedMatrixHandle; |
- private int mTextureUniformHandle; |
- private int mPositionHandle; |
- private int mTextureDataHandle; |
- private int mTextureCoordinateHandle; |
- |
- // Flag to indicate whether to reload the desktop texture. |
- private boolean mReloadTexture; |
- |
- // Lock to allow multithreaded access to mReloadTexture. |
- private final Object mReloadTextureLock = new Object(); |
- |
- private Bitmap mCursorBitmap; |
- |
- // Half width and half height of the cursor. |
- private PointF mHalfFrameSize; |
- |
- private PointF mCursorPosition; |
- |
- public Cursor(Client client, Display display) { |
- mClient = client; |
- mDisplay = display; |
- mHalfFrameSize = new PointF(0.0f, 0.0f); |
- mCursorPosition = new PointF(0.0f, 0.0f); |
- |
- mVertexShaderHandle = |
- ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER, VERTEX_SHADER); |
- mFragmentShaderHandle = |
- ShaderHelper.compileShader(GLES20.GL_FRAGMENT_SHADER, FRAGMENT_SHADER); |
- mProgramHandle = ShaderHelper.createAndLinkProgram(mVertexShaderHandle, |
- mFragmentShaderHandle, new String[] {"a_Position", "a_TexCoordinate", |
- "u_CombinedMatrix", "u_Texture"}); |
- |
- mCombinedMatrixHandle = |
- GLES20.glGetUniformLocation(mProgramHandle, "u_CombinedMatrix"); |
- mTextureUniformHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_Texture"); |
- mPositionHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_Position"); |
- mTextureDataHandle = TextureHelper.createTextureHandle(); |
- mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_TexCoordinate"); |
- } |
- |
- /** |
- * Inform this object that a new cursor should be rendered. |
- * Called from native display thread. |
- */ |
- public void reloadTexture() { |
- synchronized (mReloadTextureLock) { |
- mReloadTexture = true; |
- } |
- } |
- |
- /** |
- * Return whether to move cursor. We only want to send the mouse move event |
- * when there is obvious change for cursor's location. |
- */ |
- private boolean moveCursor(PointF position) { |
- return Math.abs(mCursorPosition.x - position.x) > CURSOR_MOVE_THRESHOLD |
- || Math.abs(mCursorPosition.y - position.y) > CURSOR_MOVE_THRESHOLD; |
- } |
- |
- /** |
- * Send the mouse move event to host when {@link moveCursor} returns true. |
- */ |
- public void moveTo(PointF position) { |
- if (moveCursor(position)) { |
- mClient.sendMouseEvent((int) position.x, (int) position.y, |
- InputStub.BUTTON_UNDEFINED, false); |
- } |
- mCursorPosition = position; |
- } |
- |
- /** |
- * Link the texture data for cursor if {@link mReloadTexture} is true. |
- * Invoked from {@link com.google.vrtoolkit.cardboard.CardboardView.StereoRenderer.onNewFrame} |
- */ |
- public void maybeLoadTexture(Desktop desktop) { |
- synchronized (mReloadTextureLock) { |
- if (!mReloadTexture || !desktop.hasVideoFrame()) { |
- return; |
- } |
- } |
- |
- Bitmap cursorBitmap = mDisplay.getCursorBitmap(); |
- |
- if (cursorBitmap == mCursorBitmap) { |
- // Case when cursor image has not changed. |
- synchronized (mReloadTextureLock) { |
- mReloadTexture = false; |
- } |
- return; |
- } |
- |
- mCursorBitmap = cursorBitmap; |
- updatePosition(desktop, mCursorBitmap, mDisplay.getCursorHotspot()); |
- |
- TextureHelper.linkTexture(mTextureDataHandle, cursorBitmap); |
- |
- synchronized (mReloadTextureLock) { |
- mReloadTexture = false; |
- } |
- } |
- |
- public boolean hasImageFrame() { |
- return mCursorBitmap != null; |
- } |
- |
- /** |
- * Update the cursor position data if the cursor changes. |
- */ |
- private void updatePosition(Desktop desktop, Bitmap cursor, Point hotspot) { |
- Point desktopFrameSizePixels = desktop.getFrameSizePixels(); |
- float newHalfWidth = desktop.getHalfWidth() / desktopFrameSizePixels.x |
- * cursor.getWidth(); |
- float newHalfHeight = desktop.getHalfHeight() / desktopFrameSizePixels.y |
- * cursor.getHeight(); |
- |
- if (Math.abs(mHalfFrameSize.x - newHalfWidth) > 0.00001 |
- || Math.abs(mHalfFrameSize.y - newHalfHeight) > 0.00001) { |
- // Put the hotspot as the center of the cursor. |
- float hotspotX = (float) hotspot.x / desktopFrameSizePixels.x; |
- float hotspotY = (float) hotspot.y / desktopFrameSizePixels.y; |
- float left = -newHalfWidth + hotspotX; |
- float right = newHalfWidth + hotspotX; |
- float bottom = -newHalfHeight - hotspotY; |
- float top = newHalfHeight - hotspotY; |
- |
- mPositionCoordinates = makeFloatBuffer(new float[] { |
- // Desktop model coordinates. |
- left, top, 0.0f, |
- left, bottom, 0.0f, |
- right, top, 0.0f, |
- left, bottom, 0.0f, |
- right, bottom, 0.0f, |
- right, top, 0.0f |
- }); |
- |
- mHalfFrameSize = new PointF(newHalfWidth, newHalfHeight); |
- } |
- } |
- |
- /** |
- * Draw menu item according to the given model view projection matrix. |
- */ |
- public void draw(float[] combinedMatrix) { |
- GLES20.glUseProgram(mProgramHandle); |
- |
- GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT); |
- |
- // Pass in model view project matrix. |
- GLES20.glUniformMatrix4fv(mCombinedMatrixHandle, 1, false, combinedMatrix, 0); |
- |
- // Pass in model position. |
- GLES20.glVertexAttribPointer(mPositionHandle, POSITION_COORDINATE_DATA_SIZE, |
- GLES20.GL_FLOAT, false, 0, mPositionCoordinates); |
- GLES20.glEnableVertexAttribArray(mPositionHandle); |
- |
- // Pass in texture coordinate. |
- GLES20.glVertexAttribPointer(mTextureCoordinateHandle, TEXTURE_COORDINATE_DATA_SIZE, |
- GLES20.GL_FLOAT, false, 0, TEXTURE_COORDINATES); |
- GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle); |
- |
- // Enable the transparent background. |
- GLES20.glEnable(GLES20.GL_BLEND); |
- GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); |
- |
- GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |
- GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle); |
- GLES20.glUniform1i(mTextureUniformHandle, 0); |
- |
- GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, VERTICES_NUMBER); |
- |
- GLES20.glDisable(GLES20.GL_BLEND); |
- GLES20.glDisableVertexAttribArray(mPositionHandle); |
- GLES20.glDisableVertexAttribArray(mTextureCoordinateHandle); |
- } |
- |
- /* |
- * Clean cursor related opengl data. |
- */ |
- public void cleanup() { |
- GLES20.glDeleteShader(mVertexShaderHandle); |
- GLES20.glDeleteShader(mFragmentShaderHandle); |
- GLES20.glDeleteTextures(1, new int[] {mTextureDataHandle}, 0); |
- } |
-} |