Index: remoting/android/java/src/org/chromium/chromoting/DesktopCanvas.java |
diff --git a/remoting/android/java/src/org/chromium/chromoting/DesktopCanvas.java b/remoting/android/java/src/org/chromium/chromoting/DesktopCanvas.java |
index 874697800986af858b459db23e285607a52b3cd1..16739441b950bfe51a15de8fd1b8c3df904d10ec 100644 |
--- a/remoting/android/java/src/org/chromium/chromoting/DesktopCanvas.java |
+++ b/remoting/android/java/src/org/chromium/chromoting/DesktopCanvas.java |
@@ -4,7 +4,9 @@ |
package org.chromium.chromoting; |
+import android.graphics.Matrix; |
import android.graphics.PointF; |
+import android.graphics.Rect; |
import android.graphics.RectF; |
/** |
@@ -28,16 +30,9 @@ public class DesktopCanvas { |
private PointF mViewportPosition = new PointF(); |
/** |
- * Represents the amount of vertical space in pixels used by the soft input device and |
- * accompanying system UI. |
+ * Represents the amount of space, in pixels, used by system UI. |
*/ |
- private int mInputMethodOffsetY = 0; |
- |
- /** |
- * Represents the amount of horizontal space in pixels used by the soft input device and |
- * accompanying system UI. |
- */ |
- private int mInputMethodOffsetX = 0; |
+ private Rect mSystemUiOffsetPixels = new Rect(); |
public DesktopCanvas(DesktopViewInterface viewer, RenderData renderData) { |
mViewer = viewer; |
@@ -45,50 +40,91 @@ public class DesktopCanvas { |
} |
/** |
- * Returns the desired center position of the viewport. Note that this may not represent the |
- * true center of the viewport as other calculations are done to maximize the viewable area. |
+ * Shifts the viewport by the passed in deltas (in image coordinates). |
* |
- * @return A point representing the desired position of the viewport. |
+ * @param useScreenCenter Determines whether to use the desired viewport position or the actual |
+ * center of the screen for positioning. |
+ * @param deltaX The distance (in image coordinates) to move the viewport along the x-axis. |
+ * @param deltaY The distance (in image coordinates) to move the viewport along the y-axis. |
+ * @return A point representing the new center position of the viewport. |
*/ |
- public PointF getViewportPosition() { |
- return new PointF(mViewportPosition.x, mViewportPosition.y); |
+ public PointF moveViewportCenter(boolean useScreenCenter, float deltaX, float deltaY) { |
+ PointF viewportCenter; |
+ synchronized (mRenderData) { |
+ RectF bounds = new RectF(0, 0, mRenderData.imageWidth, mRenderData.imageHeight); |
+ if (useScreenCenter) { |
+ viewportCenter = getTrueViewportCenter(); |
+ } else { |
+ viewportCenter = new PointF(mViewportPosition.x, mViewportPosition.y); |
+ } |
+ |
+ viewportCenter.offset(deltaX, deltaY); |
+ if (viewportCenter.x < bounds.left) { |
+ viewportCenter.x = bounds.left; |
+ } else if (viewportCenter.x > bounds.right) { |
+ viewportCenter.x = bounds.right; |
+ } |
+ |
+ if (viewportCenter.y < bounds.top) { |
+ viewportCenter.y = bounds.top; |
+ } else if (viewportCenter.y > bounds.bottom) { |
+ viewportCenter.y = bounds.bottom; |
+ } |
+ |
+ mViewportPosition.set(viewportCenter); |
+ } |
+ |
+ return viewportCenter; |
} |
/** |
- * Sets the desired center position of the viewport. |
+ * Returns the current size of the viewport. This size includes the offset calculations for |
+ * any visible system UI. |
* |
- * @param newX The new x coordinate value for the desired center position. |
- * @param newY The new y coordinate value for the desired center position. |
+ * @return A point representing the current size of the viewport. |
*/ |
- public void setViewportPosition(float newX, float newY) { |
- mViewportPosition.set(newX, newY); |
+ private PointF getViewportSize() { |
+ float adjustedScreenWidth, adjustedScreenHeight; |
+ synchronized (mRenderData) { |
+ adjustedScreenWidth = mRenderData.screenWidth - mSystemUiOffsetPixels.right; |
+ adjustedScreenHeight = mRenderData.screenHeight - mSystemUiOffsetPixels.bottom; |
+ } |
+ |
+ return new PointF(adjustedScreenWidth, adjustedScreenHeight); |
} |
/** |
- * Sets the offset values used to calculate the space used by the current soft input method. |
+ * Returns the true center position of the viewport (in image coordinates). |
* |
- * @param offsetX The space used by the soft input method UI on the right edge of the screen. |
- * @param offsetY The space used by the soft input method UI on the bottom edge of the screen. |
+ * @return A point representing the true center position of the viewport. |
*/ |
- public void setInputMethodOffsetValues(int offsetX, int offsetY) { |
- mInputMethodOffsetX = offsetX; |
- mInputMethodOffsetY = offsetY; |
+ private PointF getTrueViewportCenter() { |
+ synchronized (mRenderData) { |
+ PointF viewportSize = getViewportSize(); |
+ |
+ // Find the center point of the viewport on the screen. |
+ float[] viewportPosition = {((float) viewportSize.x / 2), ((float) viewportSize.y / 2)}; |
+ |
+ // Convert the screen position to an image position. |
+ Matrix screenToImage = new Matrix(); |
+ mRenderData.transform.invert(screenToImage); |
+ screenToImage.mapPoints(viewportPosition); |
+ return new PointF(viewportPosition[0], viewportPosition[1]); |
+ } |
} |
/** |
- * Returns the current size of the viewport. This size includes the offset calculations for |
- * any visible Input Method UI. |
+ * Sets the offset values used to calculate the space used by system UI. |
* |
- * @return A point representing the current size of the viewport. |
+ * @param left The space used by system UI on the left edge of the screen. |
+ * @param top The space used by system UI on the top edge of the screen. |
+ * @param right The space used by system UI on the right edge of the screen. |
+ * @param bottom The space used by system UI on the bottom edge of the screen. |
*/ |
- public PointF getViewportSize() { |
- float adjustedScreenWidth, adjustedScreenHeight; |
+ public void setSystemUiOffsetValues(int left, int top, int right, int bottom) { |
synchronized (mRenderData) { |
- adjustedScreenWidth = mRenderData.screenWidth - mInputMethodOffsetX; |
- adjustedScreenHeight = mRenderData.screenHeight - mInputMethodOffsetY; |
+ mSystemUiOffsetPixels.set(left, top, right, bottom); |
} |
- |
- return new PointF(adjustedScreenWidth, adjustedScreenHeight); |
} |
/** Repositions the image by zooming it such that the image is displayed without borders. */ |
@@ -120,7 +156,7 @@ public class DesktopCanvas { |
* center position before being adjusted to fit the screen boundaries. |
*/ |
public void repositionImage(boolean centerViewport) { |
- PointF adjustedViewportSize = getViewportSize(); |
+ PointF viewportSize = getViewportSize(); |
synchronized (mRenderData) { |
// The goal of the code below is to position the viewport as close to the desired center |
// position as possible whilst keeping as much of the desktop in view as possible. |
@@ -133,8 +169,8 @@ public class DesktopCanvas { |
// Translate so the viewport is displayed in the middle of the screen. |
mRenderData.transform.postTranslate( |
- (float) adjustedViewportSize.x / 2 - viewportPosition[0], |
- (float) adjustedViewportSize.y / 2 - viewportPosition[1]); |
+ ((float) viewportSize.x / 2) - viewportPosition[0], |
+ ((float) viewportSize.y / 2) - viewportPosition[1]); |
} |
// Get the coordinates of the desktop rectangle (top-left/bottom-right corners) in |
@@ -143,13 +179,15 @@ public class DesktopCanvas { |
mRenderData.transform.mapRect(rectScreen); |
float leftDelta = rectScreen.left; |
- float rightDelta = rectScreen.right - mRenderData.screenWidth + mInputMethodOffsetX; |
+ float rightDelta = |
+ rectScreen.right - mRenderData.screenWidth + mSystemUiOffsetPixels.right; |
float topDelta = rectScreen.top; |
- float bottomDelta = rectScreen.bottom - mRenderData.screenHeight + mInputMethodOffsetY; |
+ float bottomDelta = |
+ rectScreen.bottom - mRenderData.screenHeight + mSystemUiOffsetPixels.bottom; |
float xAdjust = 0; |
float yAdjust = 0; |
- if (rectScreen.right - rectScreen.left < adjustedViewportSize.x) { |
+ if (rectScreen.right - rectScreen.left < viewportSize.x) { |
// Image is narrower than the screen, so center it. |
xAdjust = -(rightDelta + leftDelta) / 2; |
} else if (leftDelta > 0 && rightDelta > 0) { |
@@ -161,7 +199,7 @@ public class DesktopCanvas { |
} |
// Apply similar logic for yAdjust. |
- if (rectScreen.bottom - rectScreen.top < adjustedViewportSize.y) { |
+ if (rectScreen.bottom - rectScreen.top < viewportSize.y) { |
yAdjust = -(bottomDelta + topDelta) / 2; |
} else if (topDelta > 0 && bottomDelta > 0) { |
yAdjust = -Math.min(topDelta, bottomDelta); |