diff options
-rw-r--r-- | services/inputflinger/reader/mapper/TouchInputMapper.cpp | 11 | ||||
-rw-r--r-- | services/inputflinger/tests/InputReader_test.cpp | 28 |
2 files changed, 35 insertions, 4 deletions
diff --git a/services/inputflinger/reader/mapper/TouchInputMapper.cpp b/services/inputflinger/reader/mapper/TouchInputMapper.cpp index ce12c27470..18168d8a68 100644 --- a/services/inputflinger/reader/mapper/TouchInputMapper.cpp +++ b/services/inputflinger/reader/mapper/TouchInputMapper.cpp @@ -3644,6 +3644,9 @@ void TouchInputMapper::rotateAndScale(float& x, float& y) { const float xScaled = float(x - mRawPointerAxes.x.minValue) * mXScale; const float yScaled = float(y - mRawPointerAxes.y.minValue) * mYScale; + const float xScaledMax = float(mRawPointerAxes.x.maxValue - x) * mXScale; + const float yScaledMax = float(mRawPointerAxes.y.maxValue - y) * mYScale; + // Rotate to surface coordinate. // 0 - no swap and reverse. // 90 - swap x/y and reverse y. @@ -3655,16 +3658,16 @@ void TouchInputMapper::rotateAndScale(float& x, float& y) { y = yScaled + mYTranslate; break; case DISPLAY_ORIENTATION_90: - y = mSurfaceRight - xScaled; + y = xScaledMax - (mRawSurfaceWidth - mSurfaceRight); x = yScaled + mYTranslate; break; case DISPLAY_ORIENTATION_180: - x = mSurfaceRight - xScaled; - y = mSurfaceBottom - yScaled; + x = xScaledMax - (mRawSurfaceWidth - mSurfaceRight); + y = yScaledMax - (mRawSurfaceHeight - mSurfaceBottom); break; case DISPLAY_ORIENTATION_270: y = xScaled + mXTranslate; - x = mSurfaceBottom - yScaled; + x = yScaledMax - (mRawSurfaceHeight - mSurfaceBottom); break; default: assert(false); diff --git a/services/inputflinger/tests/InputReader_test.cpp b/services/inputflinger/tests/InputReader_test.cpp index 23f30260bc..3e7a03e449 100644 --- a/services/inputflinger/tests/InputReader_test.cpp +++ b/services/inputflinger/tests/InputReader_test.cpp @@ -8017,6 +8017,34 @@ TEST_F(MultiTouchInputMapperTest_SurfaceRange, Viewports_SurfaceRange_270) { processPositionAndVerify(mapper, x - 1, y, x + 1, y, xExpected, yExpected); } +TEST_F(MultiTouchInputMapperTest_SurfaceRange, Viewports_SurfaceRange_Corner) { + addConfigurationProperty("touch.deviceType", "touchScreen"); + prepareDisplay(DISPLAY_ORIENTATION_0); + prepareAxes(POSITION); + MultiTouchInputMapper& mapper = addMapperAndConfigure<MultiTouchInputMapper>(); + + const int32_t x = 0; + const int32_t y = 0; + + const int32_t xExpected = x; + const int32_t yExpected = y; + processPositionAndVerify(mapper, x - 1, y, x, y, xExpected, yExpected); + + clearViewports(); + prepareDisplay(DISPLAY_ORIENTATION_90); + // expect x/y = swap x/y then reverse y. + const int32_t xExpected90 = y; + const int32_t yExpected90 = DISPLAY_WIDTH - 1; + processPositionAndVerify(mapper, x - 1, y, x, y, xExpected90, yExpected90); + + clearViewports(); + prepareDisplay(DISPLAY_ORIENTATION_270); + // expect x/y = swap x/y then reverse x. + const int32_t xExpected270 = DISPLAY_HEIGHT - 1; + const int32_t yExpected270 = x; + processPositionAndVerify(mapper, x - 1, y, x, y, xExpected270, yExpected270); +} + TEST_F(MultiTouchInputMapperTest, Process_TouchpadCapture) { // we need a pointer controller for mouse mode of touchpad (start pointer at 0,0) std::shared_ptr<FakePointerController> fakePointerController = |