Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a36b28e4 authored by arthurhung's avatar arthurhung Committed by Arthur Hung
Browse files

Fix coordinate error after rotation and scaling in TouchInputMapper

The 'rotateAndScale' will transform raw coordinate into surface
coordinate, but the raw (x, y) values range would be defined in
RawPointerAxes, so we have to transform the raw event using the
RawPointerAxes and the scaling ratio into surface coordinate, then
calculate the offset by the surface frame.

Test: atest inputflinger_test
Bug: 176138152
Change-Id: I2d428fcbdc4bb879525754aafef05ebebbf131c5
parent 57563a10
Loading
Loading
Loading
Loading
+7 −4
Original line number Original line Diff line number Diff line
@@ -3644,6 +3644,9 @@ void TouchInputMapper::rotateAndScale(float& x, float& y) {
    const float xScaled = float(x - mRawPointerAxes.x.minValue) * mXScale;
    const float xScaled = float(x - mRawPointerAxes.x.minValue) * mXScale;
    const float yScaled = float(y - mRawPointerAxes.y.minValue) * mYScale;
    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.
    // Rotate to surface coordinate.
    // 0 - no swap and reverse.
    // 0 - no swap and reverse.
    // 90 - swap x/y and reverse y.
    // 90 - swap x/y and reverse y.
@@ -3655,16 +3658,16 @@ void TouchInputMapper::rotateAndScale(float& x, float& y) {
            y = yScaled + mYTranslate;
            y = yScaled + mYTranslate;
            break;
            break;
        case DISPLAY_ORIENTATION_90:
        case DISPLAY_ORIENTATION_90:
            y = mSurfaceRight - xScaled;
            y = xScaledMax - (mRawSurfaceWidth - mSurfaceRight);
            x = yScaled + mYTranslate;
            x = yScaled + mYTranslate;
            break;
            break;
        case DISPLAY_ORIENTATION_180:
        case DISPLAY_ORIENTATION_180:
            x = mSurfaceRight - xScaled;
            x = xScaledMax - (mRawSurfaceWidth - mSurfaceRight);
            y = mSurfaceBottom - yScaled;
            y = yScaledMax - (mRawSurfaceHeight - mSurfaceBottom);
            break;
            break;
        case DISPLAY_ORIENTATION_270:
        case DISPLAY_ORIENTATION_270:
            y = xScaled + mXTranslate;
            y = xScaled + mXTranslate;
            x = mSurfaceBottom - yScaled;
            x = yScaledMax - (mRawSurfaceHeight - mSurfaceBottom);
            break;
            break;
        default:
        default:
            assert(false);
            assert(false);
+28 −0
Original line number Original line Diff line number Diff line
@@ -8017,6 +8017,34 @@ TEST_F(MultiTouchInputMapperTest_SurfaceRange, Viewports_SurfaceRange_270) {
    processPositionAndVerify(mapper, x - 1, y, x + 1, y, xExpected, yExpected);
    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) {
TEST_F(MultiTouchInputMapperTest, Process_TouchpadCapture) {
    // we need a pointer controller for mouse mode of touchpad (start pointer at 0,0)
    // we need a pointer controller for mouse mode of touchpad (start pointer at 0,0)
    std::shared_ptr<FakePointerController> fakePointerController =
    std::shared_ptr<FakePointerController> fakePointerController =