Resample touch events on frame boundaries.
Bug: 6375101
Change-Id: I8774e366306bb2b6b4e42b913525bf25b0380ec3
diff --git a/libs/androidfw/Input.cpp b/libs/androidfw/Input.cpp
index 1617a3f..fbe1926 100644
--- a/libs/androidfw/Input.cpp
+++ b/libs/androidfw/Input.cpp
@@ -229,6 +229,26 @@
scaleAxisValue(*this, AMOTION_EVENT_AXIS_TOOL_MINOR, scaleFactor);
}
+void PointerCoords::lerp(const PointerCoords& a, const PointerCoords& b, float alpha) {
+ bits = 0;
+ for (uint64_t bitsRemaining = a.bits | b.bits; bitsRemaining; ) {
+ int32_t axis = __builtin_ctz(bitsRemaining);
+ uint64_t axisBit = 1LL << axis;
+ bitsRemaining &= ~axisBit;
+ if (a.bits & axisBit) {
+ if (b.bits & axisBit) {
+ float aval = a.getAxisValue(axis);
+ float bval = b.getAxisValue(axis);
+ setAxisValue(axis, aval + alpha * (bval - aval));
+ } else {
+ setAxisValue(axis, a.getAxisValue(axis));
+ }
+ } else {
+ setAxisValue(axis, b.getAxisValue(axis));
+ }
+ }
+}
+
#ifdef HAVE_ANDROID_OS
status_t PointerCoords::readFromParcel(Parcel* parcel) {
bits = parcel->readInt64();