From d41cff2d3a95963a7aa348e502c6d42bae367235 Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Thu, 3 Mar 2011 02:09:54 -0800 Subject: Fix off by one errors in touch motion ranges. Report inclusive minimum and maximum ranges for all axes including X and Y. Set mouse pointer bounds to 0..width-1, 0..height-1. Rotate touch and mouse positions more carefully, paying attention to the maximum bounds when calculating the complement of an axis. Simplified the InputReader somewhat and removed support for a couple of poorly defined input device configuration parameters. We now assume that the touch device provides useful absolute axis ranges for the X and Y axes since the alternative does not actually make sense. Bug: 3413541 Change-Id: I682ce3729e4473de7f1bcf8addb49a3f4484126f --- services/input/PointerController.cpp | 61 +++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 28 deletions(-) (limited to 'services/input/PointerController.cpp') diff --git a/services/input/PointerController.cpp b/services/input/PointerController.cpp index 954872b2aa46..a4ee295a73b1 100644 --- a/services/input/PointerController.cpp +++ b/services/input/PointerController.cpp @@ -109,12 +109,12 @@ bool PointerController::getBoundsLocked(float* outMinX, float* outMinY, switch (mLocked.displayOrientation) { case DISPLAY_ORIENTATION_90: case DISPLAY_ORIENTATION_270: - *outMaxX = mLocked.displayHeight; - *outMaxY = mLocked.displayWidth; + *outMaxX = mLocked.displayHeight - 1; + *outMaxY = mLocked.displayWidth - 1; break; default: - *outMaxX = mLocked.displayWidth; - *outMaxY = mLocked.displayHeight; + *outMaxX = mLocked.displayWidth - 1; + *outMaxY = mLocked.displayHeight - 1; break; } return true; @@ -309,48 +309,53 @@ void PointerController::setDisplayOrientation(int32_t orientation) { AutoMutex _l(mLock); if (mLocked.displayOrientation != orientation) { - float absoluteX, absoluteY; - - // Map from oriented display coordinates to absolute display coordinates. + // Apply offsets to convert from the pixel top-left corner position to the pixel center. + // This creates an invariant frame of reference that we can easily rotate when + // taking into account that the pointer may be located at fractional pixel offsets. + float x = mLocked.pointerX + 0.5f; + float y = mLocked.pointerY + 0.5f; + float temp; + + // Undo the previous rotation. switch (mLocked.displayOrientation) { case DISPLAY_ORIENTATION_90: - absoluteX = mLocked.displayWidth - mLocked.pointerY; - absoluteY = mLocked.pointerX; + temp = x; + x = mLocked.displayWidth - y; + y = temp; break; case DISPLAY_ORIENTATION_180: - absoluteX = mLocked.displayWidth - mLocked.pointerX; - absoluteY = mLocked.displayHeight - mLocked.pointerY; + x = mLocked.displayWidth - x; + y = mLocked.displayHeight - y; break; case DISPLAY_ORIENTATION_270: - absoluteX = mLocked.pointerY; - absoluteY = mLocked.displayHeight - mLocked.pointerX; - break; - default: - absoluteX = mLocked.pointerX; - absoluteY = mLocked.pointerY; + temp = x; + x = y; + y = mLocked.displayHeight - temp; break; } - // Map from absolute display coordinates to oriented display coordinates. + // Perform the new rotation. switch (orientation) { case DISPLAY_ORIENTATION_90: - mLocked.pointerX = absoluteY; - mLocked.pointerY = mLocked.displayWidth - absoluteX; + temp = x; + x = y; + y = mLocked.displayWidth - x; break; case DISPLAY_ORIENTATION_180: - mLocked.pointerX = mLocked.displayWidth - absoluteX; - mLocked.pointerY = mLocked.displayHeight - absoluteY; + x = mLocked.displayWidth - x; + y = mLocked.displayHeight - y; break; case DISPLAY_ORIENTATION_270: - mLocked.pointerX = mLocked.displayHeight - absoluteY; - mLocked.pointerY = absoluteX; - break; - default: - mLocked.pointerX = absoluteX; - mLocked.pointerY = absoluteY; + temp = x; + x = mLocked.displayHeight - y; + y = temp; break; } + // Apply offsets to convert from the pixel center to the pixel top-left corner position + // and save the results. + mLocked.pointerX = x - 0.5f; + mLocked.pointerY = y - 0.5f; mLocked.displayOrientation = orientation; updateLocked(); -- cgit v1.2.3-59-g8ed1b