OSDN Git Service

Fix pointer indexing issue in VelocityTracker.
authorJeff Brown <jeffbrown@google.com>
Tue, 15 May 2012 01:44:17 +0000 (18:44 -0700)
committerJeff Brown <jeffbrown@google.com>
Tue, 15 May 2012 01:44:17 +0000 (18:44 -0700)
VelocityTracker was implicitly assuming that the pointer ids in
a MotionEvent were ordered.  That is not necessarily the case
so we need to be careful while copying the pointer coordinates out.

Bug: 6413587
Change-Id: I3b23a954f893eebdf786f2a94207149b092ef036

libs/androidfw/VelocityTracker.cpp

index de214f8..a212948 100644 (file)
@@ -145,8 +145,8 @@ void VelocityTracker::addMovement(nsecs_t eventTime, BitSet32 idBits, const Posi
                 "estimator (degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f)",
                 id, positions[index].x, positions[index].y,
                 int(estimator.degree),
-                vectorToString(estimator.xCoeff, estimator.degree).string(),
-                vectorToString(estimator.yCoeff, estimator.degree).string(),
+                vectorToString(estimator.xCoeff, estimator.degree + 1).string(),
+                vectorToString(estimator.yCoeff, estimator.degree + 1).string(),
                 estimator.confidence);
     }
 #endif
@@ -195,6 +195,11 @@ void VelocityTracker::addMovement(const MotionEvent* event) {
         idBits.markBit(event->getPointerId(i));
     }
 
+    uint32_t pointerIndex[MAX_POINTERS];
+    for (size_t i = 0; i < pointerCount; i++) {
+        pointerIndex[i] = idBits.getIndexOfBit(event->getPointerId(i));
+    }
+
     nsecs_t eventTime;
     Position positions[pointerCount];
 
@@ -202,16 +207,18 @@ void VelocityTracker::addMovement(const MotionEvent* event) {
     for (size_t h = 0; h < historySize; h++) {
         eventTime = event->getHistoricalEventTime(h);
         for (size_t i = 0; i < pointerCount; i++) {
-            positions[i].x = event->getHistoricalX(i, h);
-            positions[i].y = event->getHistoricalY(i, h);
+            uint32_t index = pointerIndex[i];
+            positions[index].x = event->getHistoricalX(i, h);
+            positions[index].y = event->getHistoricalY(i, h);
         }
         addMovement(eventTime, idBits, positions);
     }
 
     eventTime = event->getEventTime();
     for (size_t i = 0; i < pointerCount; i++) {
-        positions[i].x = event->getX(i);
-        positions[i].y = event->getY(i);
+        uint32_t index = pointerIndex[i];
+        positions[index].x = event->getX(i);
+        positions[index].y = event->getY(i);
     }
     addMovement(eventTime, idBits, positions);
 }