diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/input/AccelerationCurve.h | 49 | ||||
| -rw-r--r-- | include/input/VelocityControl.h | 55 |
2 files changed, 95 insertions, 9 deletions
diff --git a/include/input/AccelerationCurve.h b/include/input/AccelerationCurve.h new file mode 100644 index 0000000000..0cf648a2f7 --- /dev/null +++ b/include/input/AccelerationCurve.h @@ -0,0 +1,49 @@ +/* + * 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. + */ + +#pragma once + +#include <cstdint> +#include <vector> + +namespace android { + +/** + * Describes a section of an acceleration curve as a function which outputs a scaling factor (gain) + * for the pointer movement, given the speed of the mouse or finger (in mm/s): + * + * gain(input_speed_mm_per_s) = baseGain + reciprocal / input_speed_mm_per_s + */ +struct AccelerationCurveSegment { + /** + * The maximum pointer speed at which this segment should apply, in mm/s. The last segment in a + * curve should always set this to infinity. + */ + double maxPointerSpeedMmPerS; + /** The gain for this segment before the reciprocal is taken into account. */ + double baseGain; + /** The reciprocal part of the formula, which should be divided by the input speed. */ + double reciprocal; +}; + +/** + * Creates an acceleration curve for the given pointer sensitivity value. The sensitivity value + * should be between -7 (for the lowest sensitivity) and 7, inclusive. + */ +std::vector<AccelerationCurveSegment> createAccelerationCurveForPointerSensitivity( + int32_t sensitivity); + +} // namespace android diff --git a/include/input/VelocityControl.h b/include/input/VelocityControl.h index b78f63e1ae..7c58c87f8b 100644 --- a/include/input/VelocityControl.h +++ b/include/input/VelocityControl.h @@ -16,7 +16,10 @@ #pragma once +#include <vector> + #include <android-base/stringprintf.h> +#include <input/AccelerationCurve.h> #include <input/Input.h> #include <input/VelocityTracker.h> #include <utils/Timers.h> @@ -86,12 +89,7 @@ struct VelocityControlParameters { class VelocityControl { public: VelocityControl(); - - /* Gets the various parameters. */ - const VelocityControlParameters& getParameters() const; - - /* Sets the various parameters. */ - void setParameters(const VelocityControlParameters& parameters); + virtual ~VelocityControl() {} /* Resets the current movement counters to zero. * This has the effect of nullifying any acceleration. */ @@ -101,16 +99,55 @@ public: * scaled / accelerated delta based on the current velocity. */ void move(nsecs_t eventTime, float* deltaX, float* deltaY); -private: +protected: + virtual void scaleDeltas(float* deltaX, float* deltaY) = 0; + // If no movements are received within this amount of time, // we assume the movement has stopped and reset the movement counters. static const nsecs_t STOP_TIME = 500 * 1000000; // 500 ms - VelocityControlParameters mParameters; - nsecs_t mLastMovementTime; float mRawPositionX, mRawPositionY; VelocityTracker mVelocityTracker; }; +/** + * Velocity control using a simple acceleration curve where the acceleration factor increases + * linearly with movement speed, subject to minimum and maximum values. + */ +class SimpleVelocityControl : public VelocityControl { +public: + /** Gets the various parameters. */ + const VelocityControlParameters& getParameters() const; + + /** Sets the various parameters. */ + void setParameters(const VelocityControlParameters& parameters); + +protected: + virtual void scaleDeltas(float* deltaX, float* deltaY) override; + +private: + VelocityControlParameters mParameters; +}; + +/** Velocity control using a curve made up of multiple reciprocal segments. */ +class CurvedVelocityControl : public VelocityControl { +public: + CurvedVelocityControl(); + + /** Sets the curve to be used for acceleration. */ + void setCurve(const std::vector<AccelerationCurveSegment>& curve); + + void setAccelerationEnabled(bool enabled); + +protected: + virtual void scaleDeltas(float* deltaX, float* deltaY) override; + +private: + const AccelerationCurveSegment& segmentForSpeed(float speedMmPerS); + + bool mAccelerationEnabled = true; + std::vector<AccelerationCurveSegment> mCurveSegments; +}; + } // namespace android |