am 0052dbda: Support keys that have uncommon width.

* commit '0052dbda762b1871c3214a6abeb5e89f11e091cd':
  Support keys that have uncommon width.
main
Keisuke Kuroynagi 2013-06-14 05:25:56 -07:00 committed by Android Git Automerger
commit 0631f46c0d
5 changed files with 86 additions and 65 deletions

View File

@ -134,24 +134,13 @@ bool ProximityInfo::hasSpaceProximity(const int x, const int y) const {
} }
float ProximityInfo::getNormalizedSquaredDistanceFromCenterFloatG( float ProximityInfo::getNormalizedSquaredDistanceFromCenterFloatG(
const int keyId, const int x, const int y, const float verticalScale) const { const int keyId, const int x, const int y, const bool isGeometric) const {
const bool correctTouchPosition = hasTouchPositionCorrectionData(); const float centerX = static_cast<float>(getKeyCenterXOfKeyIdG(keyId, x, isGeometric));
const float centerX = static_cast<float>(correctTouchPosition ? getSweetSpotCenterXAt(keyId) const float centerY = static_cast<float>(getKeyCenterYOfKeyIdG(keyId, y, isGeometric));
: getKeyCenterXOfKeyIdG(keyId));
const float visualKeyCenterY = static_cast<float>(getKeyCenterYOfKeyIdG(keyId));
float centerY;
if (correctTouchPosition) {
const float sweetSpotCenterY = static_cast<float>(getSweetSpotCenterYAt(keyId));
const float gapY = sweetSpotCenterY - visualKeyCenterY;
centerY = visualKeyCenterY + gapY * verticalScale;
} else {
centerY = visualKeyCenterY;
}
const float touchX = static_cast<float>(x); const float touchX = static_cast<float>(x);
const float touchY = static_cast<float>(y); const float touchY = static_cast<float>(y);
const float keyWidth = static_cast<float>(getMostCommonKeyWidth());
return ProximityInfoUtils::getSquaredDistanceFloat(centerX, centerY, touchX, touchY) return ProximityInfoUtils::getSquaredDistanceFloat(centerX, centerY, touchX, touchY)
/ GeometryUtils::SQUARE_FLOAT(keyWidth); / GeometryUtils::SQUARE_FLOAT(static_cast<float>(getMostCommonKeyWidth()));
} }
int ProximityInfo::getCodePointOf(const int keyIndex) const { int ProximityInfo::getCodePointOf(const int keyIndex) const {
@ -168,41 +157,80 @@ void ProximityInfo::initializeG() {
const int lowerCode = CharUtils::toLowerCase(code); const int lowerCode = CharUtils::toLowerCase(code);
mCenterXsG[i] = mKeyXCoordinates[i] + mKeyWidths[i] / 2; mCenterXsG[i] = mKeyXCoordinates[i] + mKeyWidths[i] / 2;
mCenterYsG[i] = mKeyYCoordinates[i] + mKeyHeights[i] / 2; mCenterYsG[i] = mKeyYCoordinates[i] + mKeyHeights[i] / 2;
if (hasTouchPositionCorrectionData()) {
// Computes sweet spot center points for geometric input.
const float verticalScale = ProximityInfoParams::VERTICAL_SWEET_SPOT_SCALE_G;
const float sweetSpotCenterY = static_cast<float>(mSweetSpotCenterYs[i]);
const float gapY = sweetSpotCenterY - mCenterYsG[i];
mSweetSpotCenterYsG[i] = static_cast<int>(mCenterYsG[i] + gapY * verticalScale);
}
mCodeToKeyMap[lowerCode] = i; mCodeToKeyMap[lowerCode] = i;
mKeyIndexToCodePointG[i] = lowerCode; mKeyIndexToCodePointG[i] = lowerCode;
} }
for (int i = 0; i < KEY_COUNT; i++) { for (int i = 0; i < KEY_COUNT; i++) {
mKeyKeyDistancesG[i][i] = 0; mKeyKeyDistancesG[i][i] = 0;
for (int j = i + 1; j < KEY_COUNT; j++) { for (int j = i + 1; j < KEY_COUNT; j++) {
if (hasTouchPositionCorrectionData()) {
// Computes distances using sweet spots if they exist.
// We have two types of Y coordinate sweet spots, for geometric and for the others.
// The sweet spots for geometric input are used for calculating key-key distances
// here.
mKeyKeyDistancesG[i][j] = GeometryUtils::getDistanceInt(
mSweetSpotCenterXs[i], mSweetSpotCenterYsG[i],
mSweetSpotCenterXs[j], mSweetSpotCenterYsG[j]);
} else {
mKeyKeyDistancesG[i][j] = GeometryUtils::getDistanceInt( mKeyKeyDistancesG[i][j] = GeometryUtils::getDistanceInt(
mCenterXsG[i], mCenterYsG[i], mCenterXsG[j], mCenterYsG[j]); mCenterXsG[i], mCenterYsG[i], mCenterXsG[j], mCenterYsG[j]);
}
mKeyKeyDistancesG[j][i] = mKeyKeyDistancesG[i][j]; mKeyKeyDistancesG[j][i] = mKeyKeyDistancesG[i][j];
} }
} }
} }
int ProximityInfo::getKeyCenterXOfCodePointG(int charCode) const { // referencePointX is used only for keys wider than most common key width. When the referencePointX
return getKeyCenterXOfKeyIdG( // is NOT_A_COORDINATE, this method calculates the return value without using the line segment.
ProximityInfoUtils::getKeyIndexOf(KEY_COUNT, charCode, &mCodeToKeyMap)); // isGeometric is currently not used because we don't have extra X coordinates sweet spots for
} // geometric input.
int ProximityInfo::getKeyCenterXOfKeyIdG(
int ProximityInfo::getKeyCenterYOfCodePointG(int charCode) const { const int keyId, const int referencePointX, const bool isGeometric) const {
return getKeyCenterYOfKeyIdG( if (keyId < 0) {
ProximityInfoUtils::getKeyIndexOf(KEY_COUNT, charCode, &mCodeToKeyMap));
}
int ProximityInfo::getKeyCenterXOfKeyIdG(int keyId) const {
if (keyId >= 0) {
return mCenterXsG[keyId];
}
return 0; return 0;
}
int centerX = (hasTouchPositionCorrectionData()) ? static_cast<int>(mSweetSpotCenterXs[keyId])
: mCenterXsG[keyId];
const int keyWidth = mKeyWidths[keyId];
if (referencePointX != NOT_A_COORDINATE
&& keyWidth > getMostCommonKeyWidth()) {
// For keys wider than most common keys, we use a line segment instead of the center point;
// thus, centerX is adjusted depending on referencePointX.
const int keyWidthHalfDiff = (keyWidth - getMostCommonKeyWidth()) / 2;
if (referencePointX < centerX - keyWidthHalfDiff) {
centerX -= keyWidthHalfDiff;
} else if (referencePointX > centerX + keyWidthHalfDiff) {
centerX += keyWidthHalfDiff;
} else {
centerX = referencePointX;
}
}
return centerX;
} }
int ProximityInfo::getKeyCenterYOfKeyIdG(int keyId) const { // referencePointY is currently not used because we don't specially handle keys higher than the
if (keyId >= 0) { // most common key height. When the referencePointY is NOT_A_COORDINATE, this method should
// calculate the return value without using the line segment.
int ProximityInfo::getKeyCenterYOfKeyIdG(
const int keyId, const int referencePointY, const bool isGeometric) const {
// TODO: Remove "isGeometric" and have separate "proximity_info"s for gesture and typing.
if (keyId < 0) {
return 0;
}
if (!hasTouchPositionCorrectionData()) {
return mCenterYsG[keyId]; return mCenterYsG[keyId];
} else if (isGeometric) {
return static_cast<int>(mSweetSpotCenterYsG[keyId]);
} else {
return static_cast<int>(mSweetSpotCenterYs[keyId]);
} }
return 0;
} }
int ProximityInfo::getKeyKeyDistanceG(const int keyId0, const int keyId1) const { int ProximityInfo::getKeyKeyDistanceG(const int keyId0, const int keyId1) const {

View File

@ -37,8 +37,7 @@ class ProximityInfo {
bool hasSpaceProximity(const int x, const int y) const; bool hasSpaceProximity(const int x, const int y) const;
int getNormalizedSquaredDistance(const int inputIndex, const int proximityIndex) const; int getNormalizedSquaredDistance(const int inputIndex, const int proximityIndex) const;
float getNormalizedSquaredDistanceFromCenterFloatG( float getNormalizedSquaredDistanceFromCenterFloatG(
const int keyId, const int x, const int y, const int keyId, const int x, const int y, const bool isGeometric) const;
const float verticalScale) const;
int getCodePointOf(const int keyIndex) const; int getCodePointOf(const int keyIndex) const;
bool hasSweetSpotData(const int keyIndex) const { bool hasSweetSpotData(const int keyIndex) const {
// When there are no calibration data for a key, // When there are no calibration data for a key,
@ -65,10 +64,10 @@ class ProximityInfo {
int getKeyboardHeight() const { return KEYBOARD_HEIGHT; } int getKeyboardHeight() const { return KEYBOARD_HEIGHT; }
float getKeyboardHypotenuse() const { return KEYBOARD_HYPOTENUSE; } float getKeyboardHypotenuse() const { return KEYBOARD_HYPOTENUSE; }
int getKeyCenterXOfCodePointG(int charCode) const; int getKeyCenterXOfKeyIdG(
int getKeyCenterYOfCodePointG(int charCode) const; const int keyId, const int referencePointX, const bool isGeometric) const;
int getKeyCenterXOfKeyIdG(int keyId) const; int getKeyCenterYOfKeyIdG(
int getKeyCenterYOfKeyIdG(int keyId) const; const int keyId, const int referencePointY, const bool isGeometric) const;
int getKeyKeyDistanceG(int keyId0, int keyId1) const; int getKeyKeyDistanceG(int keyId0, int keyId1) const;
AK_FORCE_INLINE void initializeProximities(const int *const inputCodes, AK_FORCE_INLINE void initializeProximities(const int *const inputCodes,
@ -115,6 +114,8 @@ class ProximityInfo {
int mKeyCodePoints[MAX_KEY_COUNT_IN_A_KEYBOARD]; int mKeyCodePoints[MAX_KEY_COUNT_IN_A_KEYBOARD];
float mSweetSpotCenterXs[MAX_KEY_COUNT_IN_A_KEYBOARD]; float mSweetSpotCenterXs[MAX_KEY_COUNT_IN_A_KEYBOARD];
float mSweetSpotCenterYs[MAX_KEY_COUNT_IN_A_KEYBOARD]; float mSweetSpotCenterYs[MAX_KEY_COUNT_IN_A_KEYBOARD];
// Sweet spots for geometric input. Note that we have extra sweet spots only for Y coordinates.
float mSweetSpotCenterYsG[MAX_KEY_COUNT_IN_A_KEYBOARD];
float mSweetSpotRadii[MAX_KEY_COUNT_IN_A_KEYBOARD]; float mSweetSpotRadii[MAX_KEY_COUNT_IN_A_KEYBOARD];
hash_map_compat<int, int> mCodeToKeyMap; hash_map_compat<int, int> mCodeToKeyMap;

View File

@ -97,15 +97,10 @@ void ProximityInfoState::initInputParams(const int pointerId, const float maxPoi
pushTouchPointStartIndex, lastSavedInputSize); pushTouchPointStartIndex, lastSavedInputSize);
} }
// TODO: Remove the dependency of "isGeometric"
const float verticalSweetSpotScale = isGeometric
? ProximityInfoParams::VERTICAL_SWEET_SPOT_SCALE_G
: ProximityInfoParams::VERTICAL_SWEET_SPOT_SCALE;
if (xCoordinates && yCoordinates) { if (xCoordinates && yCoordinates) {
mSampledInputSize = ProximityInfoStateUtils::updateTouchPoints(mProximityInfo, mSampledInputSize = ProximityInfoStateUtils::updateTouchPoints(mProximityInfo,
mMaxPointToKeyLength, mInputProximities, xCoordinates, yCoordinates, times, mMaxPointToKeyLength, mInputProximities, xCoordinates, yCoordinates, times,
pointerIds, verticalSweetSpotScale, inputSize, isGeometric, pointerId, pointerIds, inputSize, isGeometric, pointerId,
pushTouchPointStartIndex, &mSampledInputXs, &mSampledInputYs, &mSampledTimes, pushTouchPointStartIndex, &mSampledInputXs, &mSampledInputYs, &mSampledTimes,
&mSampledLengthCache, &mSampledInputIndice); &mSampledLengthCache, &mSampledInputIndice);
} }
@ -123,7 +118,7 @@ void ProximityInfoState::initInputParams(const int pointerId, const float maxPoi
if (mSampledInputSize > 0) { if (mSampledInputSize > 0) {
ProximityInfoStateUtils::initGeometricDistanceInfos(mProximityInfo, mSampledInputSize, ProximityInfoStateUtils::initGeometricDistanceInfos(mProximityInfo, mSampledInputSize,
lastSavedInputSize, verticalSweetSpotScale, &mSampledInputXs, &mSampledInputYs, lastSavedInputSize, isGeometric, &mSampledInputXs, &mSampledInputYs,
&mSampledNearKeySets, &mSampledNormalizedSquaredLengthCache); &mSampledNearKeySets, &mSampledNormalizedSquaredLengthCache);
if (isGeometric) { if (isGeometric) {
// updates probabilities of skipping or mapping each key for all points. // updates probabilities of skipping or mapping each key for all points.

View File

@ -43,8 +43,8 @@ namespace latinime {
const ProximityInfo *const proximityInfo, const int maxPointToKeyLength, const ProximityInfo *const proximityInfo, const int maxPointToKeyLength,
const int *const inputProximities, const int *const inputXCoordinates, const int *const inputProximities, const int *const inputXCoordinates,
const int *const inputYCoordinates, const int *const times, const int *const pointerIds, const int *const inputYCoordinates, const int *const times, const int *const pointerIds,
const float verticalSweetSpotScale, const int inputSize, const bool isGeometric, const int inputSize, const bool isGeometric, const int pointerId,
const int pointerId, const int pushTouchPointStartIndex, std::vector<int> *sampledInputXs, const int pushTouchPointStartIndex, std::vector<int> *sampledInputXs,
std::vector<int> *sampledInputYs, std::vector<int> *sampledInputTimes, std::vector<int> *sampledInputYs, std::vector<int> *sampledInputTimes,
std::vector<int> *sampledLengthCache, std::vector<int> *sampledInputIndice) { std::vector<int> *sampledLengthCache, std::vector<int> *sampledInputIndice) {
if (DEBUG_SAMPLING_POINTS) { if (DEBUG_SAMPLING_POINTS) {
@ -113,7 +113,7 @@ namespace latinime {
} }
if (pushTouchPoint(proximityInfo, maxPointToKeyLength, i, c, x, y, time, if (pushTouchPoint(proximityInfo, maxPointToKeyLength, i, c, x, y, time,
verticalSweetSpotScale, isGeometric /* doSampling */, i == lastInputIndex, isGeometric, isGeometric /* doSampling */, i == lastInputIndex,
sumAngle, currentNearKeysDistances, prevNearKeysDistances, sumAngle, currentNearKeysDistances, prevNearKeysDistances,
prevPrevNearKeysDistances, sampledInputXs, sampledInputYs, sampledInputTimes, prevPrevNearKeysDistances, sampledInputXs, sampledInputYs, sampledInputTimes,
sampledLengthCache, sampledInputIndice)) { sampledLengthCache, sampledInputIndice)) {
@ -183,7 +183,7 @@ namespace latinime {
/* static */ void ProximityInfoStateUtils::initGeometricDistanceInfos( /* static */ void ProximityInfoStateUtils::initGeometricDistanceInfos(
const ProximityInfo *const proximityInfo, const int sampledInputSize, const ProximityInfo *const proximityInfo, const int sampledInputSize,
const int lastSavedInputSize, const float verticalSweetSpotScale, const int lastSavedInputSize, const bool isGeometric,
const std::vector<int> *const sampledInputXs, const std::vector<int> *const sampledInputXs,
const std::vector<int> *const sampledInputYs, const std::vector<int> *const sampledInputYs,
std::vector<NearKeycodesSet> *sampledNearKeySets, std::vector<NearKeycodesSet> *sampledNearKeySets,
@ -199,7 +199,7 @@ namespace latinime {
const int y = (*sampledInputYs)[i]; const int y = (*sampledInputYs)[i];
const float normalizedSquaredDistance = const float normalizedSquaredDistance =
proximityInfo->getNormalizedSquaredDistanceFromCenterFloatG( proximityInfo->getNormalizedSquaredDistanceFromCenterFloatG(
k, x, y, verticalSweetSpotScale); k, x, y, isGeometric);
(*sampledNormalizedSquaredLengthCache)[index] = normalizedSquaredDistance; (*sampledNormalizedSquaredLengthCache)[index] = normalizedSquaredDistance;
if (normalizedSquaredDistance if (normalizedSquaredDistance
< ProximityInfoParams::NEAR_KEY_NORMALIZED_SQUARED_THRESHOLD) { < ProximityInfoParams::NEAR_KEY_NORMALIZED_SQUARED_THRESHOLD) {
@ -317,14 +317,13 @@ namespace latinime {
// the given point and the nearest key position. // the given point and the nearest key position.
/* static */ float ProximityInfoStateUtils::updateNearKeysDistances( /* static */ float ProximityInfoStateUtils::updateNearKeysDistances(
const ProximityInfo *const proximityInfo, const float maxPointToKeyLength, const int x, const ProximityInfo *const proximityInfo, const float maxPointToKeyLength, const int x,
const int y, const float verticalSweetspotScale, const int y, const bool isGeometric, NearKeysDistanceMap *const currentNearKeysDistances) {
NearKeysDistanceMap *const currentNearKeysDistances) {
currentNearKeysDistances->clear(); currentNearKeysDistances->clear();
const int keyCount = proximityInfo->getKeyCount(); const int keyCount = proximityInfo->getKeyCount();
float nearestKeyDistance = maxPointToKeyLength; float nearestKeyDistance = maxPointToKeyLength;
for (int k = 0; k < keyCount; ++k) { for (int k = 0; k < keyCount; ++k) {
const float dist = proximityInfo->getNormalizedSquaredDistanceFromCenterFloatG(k, x, y, const float dist = proximityInfo->getNormalizedSquaredDistanceFromCenterFloatG(k, x, y,
verticalSweetspotScale); isGeometric);
if (dist < ProximityInfoParams::NEAR_KEY_THRESHOLD_FOR_DISTANCE) { if (dist < ProximityInfoParams::NEAR_KEY_THRESHOLD_FOR_DISTANCE) {
currentNearKeysDistances->insert(std::pair<int, float>(k, dist)); currentNearKeysDistances->insert(std::pair<int, float>(k, dist));
} }
@ -405,7 +404,7 @@ namespace latinime {
// Returning if previous point is popped or not. // Returning if previous point is popped or not.
/* static */ bool ProximityInfoStateUtils::pushTouchPoint(const ProximityInfo *const proximityInfo, /* static */ bool ProximityInfoStateUtils::pushTouchPoint(const ProximityInfo *const proximityInfo,
const int maxPointToKeyLength, const int inputIndex, const int nodeCodePoint, int x, int y, const int maxPointToKeyLength, const int inputIndex, const int nodeCodePoint, int x, int y,
const int time, const float verticalSweetSpotScale, const bool doSampling, const int time, const bool isGeometric, const bool doSampling,
const bool isLastPoint, const float sumAngle, const bool isLastPoint, const float sumAngle,
NearKeysDistanceMap *const currentNearKeysDistances, NearKeysDistanceMap *const currentNearKeysDistances,
const NearKeysDistanceMap *const prevNearKeysDistances, const NearKeysDistanceMap *const prevNearKeysDistances,
@ -419,7 +418,7 @@ namespace latinime {
bool popped = false; bool popped = false;
if (nodeCodePoint < 0 && doSampling) { if (nodeCodePoint < 0 && doSampling) {
const float nearest = updateNearKeysDistances(proximityInfo, maxPointToKeyLength, x, y, const float nearest = updateNearKeysDistances(proximityInfo, maxPointToKeyLength, x, y,
verticalSweetSpotScale, currentNearKeysDistances); isGeometric, currentNearKeysDistances);
const float score = getPointScore(mostCommonKeyWidth, x, y, time, isLastPoint, nearest, const float score = getPointScore(mostCommonKeyWidth, x, y, time, isLastPoint, nearest,
sumAngle, currentNearKeysDistances, prevNearKeysDistances, sumAngle, currentNearKeysDistances, prevNearKeysDistances,
prevPrevNearKeysDistances, sampledInputXs, sampledInputYs); prevPrevNearKeysDistances, sampledInputXs, sampledInputYs);
@ -453,8 +452,8 @@ namespace latinime {
if (nodeCodePoint >= 0 && (x < 0 || y < 0)) { if (nodeCodePoint >= 0 && (x < 0 || y < 0)) {
const int keyId = proximityInfo->getKeyIndexOf(nodeCodePoint); const int keyId = proximityInfo->getKeyIndexOf(nodeCodePoint);
if (keyId >= 0) { if (keyId >= 0) {
x = proximityInfo->getKeyCenterXOfKeyIdG(keyId); x = proximityInfo->getKeyCenterXOfKeyIdG(keyId, NOT_AN_INDEX, isGeometric);
y = proximityInfo->getKeyCenterYOfKeyIdG(keyId); y = proximityInfo->getKeyCenterYOfKeyIdG(keyId, NOT_AN_INDEX, isGeometric);
} }
} }

View File

@ -38,8 +38,7 @@ class ProximityInfoStateUtils {
static int updateTouchPoints(const ProximityInfo *const proximityInfo, static int updateTouchPoints(const ProximityInfo *const proximityInfo,
const int maxPointToKeyLength, const int *const inputProximities, const int maxPointToKeyLength, const int *const inputProximities,
const int *const inputXCoordinates, const int *const inputYCoordinates, const int *const inputXCoordinates, const int *const inputYCoordinates,
const int *const times, const int *const pointerIds, const int *const times, const int *const pointerIds, const int inputSize,
const float verticalSweetSpotScale, const int inputSize,
const bool isGeometric, const int pointerId, const int pushTouchPointStartIndex, const bool isGeometric, const int pointerId, const int pushTouchPointStartIndex,
std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs, std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs,
std::vector<int> *sampledInputTimes, std::vector<int> *sampledLengthCache, std::vector<int> *sampledInputTimes, std::vector<int> *sampledLengthCache,
@ -84,8 +83,7 @@ class ProximityInfoStateUtils {
const std::vector<float> *const sampledNormalizedSquaredLengthCache, const int keyCount, const std::vector<float> *const sampledNormalizedSquaredLengthCache, const int keyCount,
const int inputIndex, const int keyId); const int inputIndex, const int keyId);
static void initGeometricDistanceInfos(const ProximityInfo *const proximityInfo, static void initGeometricDistanceInfos(const ProximityInfo *const proximityInfo,
const int sampledInputSize, const int lastSavedInputSize, const int sampledInputSize, const int lastSavedInputSize, const bool isGeometric,
const float verticalSweetSpotScale,
const std::vector<int> *const sampledInputXs, const std::vector<int> *const sampledInputXs,
const std::vector<int> *const sampledInputYs, const std::vector<int> *const sampledInputYs,
std::vector<NearKeycodesSet> *sampledNearKeySets, std::vector<NearKeycodesSet> *sampledNearKeySets,
@ -120,7 +118,7 @@ class ProximityInfoStateUtils {
static float updateNearKeysDistances(const ProximityInfo *const proximityInfo, static float updateNearKeysDistances(const ProximityInfo *const proximityInfo,
const float maxPointToKeyLength, const int x, const int y, const float maxPointToKeyLength, const int x, const int y,
const float verticalSweetSpotScale, const bool isGeometric,
NearKeysDistanceMap *const currentNearKeysDistances); NearKeysDistanceMap *const currentNearKeysDistances);
static bool isPrevLocalMin(const NearKeysDistanceMap *const currentNearKeysDistances, static bool isPrevLocalMin(const NearKeysDistanceMap *const currentNearKeysDistances,
const NearKeysDistanceMap *const prevNearKeysDistances, const NearKeysDistanceMap *const prevNearKeysDistances,
@ -133,7 +131,7 @@ class ProximityInfoStateUtils {
std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs); std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs);
static bool pushTouchPoint(const ProximityInfo *const proximityInfo, static bool pushTouchPoint(const ProximityInfo *const proximityInfo,
const int maxPointToKeyLength, const int inputIndex, const int nodeCodePoint, int x, const int maxPointToKeyLength, const int inputIndex, const int nodeCodePoint, int x,
int y, const int time, const float verticalSweetSpotScale, int y, const int time, const bool isGeometric,
const bool doSampling, const bool isLastPoint, const bool doSampling, const bool isLastPoint,
const float sumAngle, NearKeysDistanceMap *const currentNearKeysDistances, const float sumAngle, NearKeysDistanceMap *const currentNearKeysDistances,
const NearKeysDistanceMap *const prevNearKeysDistances, const NearKeysDistanceMap *const prevNearKeysDistances,