From e78184bca305bf510f882f7c26d46b1b0b2c0cf7 Mon Sep 17 00:00:00 2001 From: Harry Cutts Date: Mon, 8 Jan 2024 15:54:58 +0000 Subject: CursorInputMapper: share acceleration curves with touchpad The new touchpad mapper implemented in Android 14 replaced our simple cursor movement acceleration curves (where the acceleration factor increased linearly with speed between minimum and maximum values) with more sophisticated multi-segment curves. However, cursor movement using mice remained on the old curves. For consistency and to improve pointing accuracy, use the same curves for mice, too. This is also a good opportunity to improve the documentation comments and naming now that I've wrapped my head around the maths a bit better. Bug: 315313622 Test: atest inputflinger_tests Test: check pointer movement with a mouse, including changing the pointer speed setting and checking that the movement speed changes Change-Id: Ifcf43f4de6017f06b66f37d5e03a13cc257d92d5 --- libs/input/AccelerationCurve.cpp | 63 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 libs/input/AccelerationCurve.cpp (limited to 'libs/input/AccelerationCurve.cpp') diff --git a/libs/input/AccelerationCurve.cpp b/libs/input/AccelerationCurve.cpp new file mode 100644 index 0000000000..0a92a71596 --- /dev/null +++ b/libs/input/AccelerationCurve.cpp @@ -0,0 +1,63 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include +#include + +#include + +#define LOG_TAG "AccelerationCurve" + +namespace android { + +namespace { + +// The last segment must have an infinite maximum speed, so that all speeds are covered. +constexpr std::array kSegments = {{ + {32.002, 3.19, 0}, + {52.83, 4.79, -51.254}, + {119.124, 7.28, -182.737}, + {std::numeric_limits::infinity(), 15.04, -1107.556}, +}}; + +static_assert(kSegments.back().maxPointerSpeedMmPerS == std::numeric_limits::infinity()); + +constexpr std::array kSensitivityFactors = {1, 2, 4, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 16, 18, 20}; + +} // namespace + +std::vector createAccelerationCurveForPointerSensitivity( + int32_t sensitivity) { + LOG_ALWAYS_FATAL_IF(sensitivity < -7 || sensitivity > 7, "Invalid pointer sensitivity value"); + std::vector output; + output.reserve(kSegments.size()); + + // The curves we want to produce for different sensitivity values are actually the same curve, + // just scaled in the Y (gain) axis by a sensitivity factor and a couple of constants. + double commonFactor = 0.64 * kSensitivityFactors[sensitivity + 7] / 10; + for (AccelerationCurveSegment seg : kSegments) { + output.push_back(AccelerationCurveSegment{seg.maxPointerSpeedMmPerS, + commonFactor * seg.baseGain, + commonFactor * seg.reciprocal}); + } + + return output; +} + +} // namespace android \ No newline at end of file -- cgit v1.2.3-59-g8ed1b