void VelocityTrackerState::computeCurrentVelocity(int32_t units, float maxVelocity) { BitSet32 idBits(mVelocityTracker.getCurrentPointerIdBits()); mCalculatedIdBits = idBits; for (uint32_t index = 0; !idBits.isEmpty(); index++) { uint32_t id = idBits.clearFirstMarkedBit(); float vx, vy; mVelocityTracker.getVelocity(id, &vx, &vy); vx = vx * units / 1000; vy = vy * units / 1000; if (vx > maxVelocity) { vx = maxVelocity; } else if (vx < -maxVelocity) { vx = -maxVelocity; } if (vy > maxVelocity) { vy = maxVelocity; } else if (vy < -maxVelocity) { vy = -maxVelocity; } Velocity& velocity = mCalculatedVelocity[index]; velocity.vx = vx; velocity.vy = vy; } }
void PointerController::setSpots(const PointerCoords* spotCoords, const uint32_t* spotIdToIndex, BitSet32 spotIdBits) { #if DEBUG_POINTER_UPDATES ALOGD("setSpots: idBits=%08x", spotIdBits.value); for (BitSet32 idBits(spotIdBits); !idBits.isEmpty(); ) { uint32_t id = idBits.firstMarkedBit(); idBits.clearBit(id); const PointerCoords& c = spotCoords[spotIdToIndex[id]]; ALOGD(" spot %d: position=(%0.3f, %0.3f), pressure=%0.3f", id, c.getAxisValue(AMOTION_EVENT_AXIS_X), c.getAxisValue(AMOTION_EVENT_AXIS_Y), c.getAxisValue(AMOTION_EVENT_AXIS_PRESSURE)); } #endif AutoMutex _l(mLock); mSpriteController->openTransaction(); // Add or move spots for fingers that are down. for (BitSet32 idBits(spotIdBits); !idBits.isEmpty(); ) { uint32_t id = idBits.clearFirstMarkedBit(); const PointerCoords& c = spotCoords[spotIdToIndex[id]]; const SpriteIcon& icon = c.getAxisValue(AMOTION_EVENT_AXIS_PRESSURE) > 0 ? mResources.spotTouch : mResources.spotHover; float x = c.getAxisValue(AMOTION_EVENT_AXIS_X); float y = c.getAxisValue(AMOTION_EVENT_AXIS_Y); Spot* spot = getSpotLocked(id); if (!spot) { spot = createAndAddSpotLocked(id); } spot->updateSprite(&icon, x, y); } // Remove spots for fingers that went up. for (size_t i = 0; i < mLocked.spots.size(); i++) { Spot* spot = mLocked.spots.itemAt(i); if (spot->id != Spot::INVALID_ID && !spotIdBits.hasBit(spot->id)) { fadeOutAndReleaseSpotLocked(spot); } } mSpriteController->closeTransaction(); }