proximity_info_state.cpp revision 687a244703a02323ebd64433cbaead5def499861
13e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka/* 23e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * Copyright (C) 2012 The Android Open Source Project 33e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * 43e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * Licensed under the Apache License, Version 2.0 (the "License"); 53e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * you may not use this file except in compliance with the License. 63e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * You may obtain a copy of the License at 73e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * 83e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * http://www.apache.org/licenses/LICENSE-2.0 93e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * 103e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * Unless required by applicable law or agreed to in writing, software 113e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * distributed under the License is distributed on an "AS IS" BASIS, 123e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * See the License for the specific language governing permissions and 143e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * limitations under the License. 153e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka */ 163e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 1777e8e81ad95cfc1eb8f8407fc872674b8d08bbe9Ken Wakasa#include <cstring> // for memset() 183e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#include <stdint.h> 193e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 203e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#define LOG_TAG "LatinIME: proximity_info_state.cpp" 213e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 223e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#include "defines.h" 23687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka#include "geometry_utils.h" 243e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#include "proximity_info.h" 253e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#include "proximity_info_state.h" 263e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 273e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataokanamespace latinime { 28687a244703a02323ebd64433cbaead5def499861Satoshi Kataokavoid ProximityInfoState::initInputParams(const int pointerId, const float maxLength, 29687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const ProximityInfo *proximityInfo, const int32_t *inputCodes, const int inputSize, 30687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int *const xCoordinates, const int *const yCoordinates, const int *const times, 31687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int *const pointerIds, const bool isGeometric) { 324a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka mProximityInfo = proximityInfo; 334a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka mHasTouchPositionCorrectionData = proximityInfo->hasTouchPositionCorrectionData(); 344a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka mMostCommonKeyWidthSquare = proximityInfo->getMostCommonKeyWidthSquare(); 354a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka mLocaleStr = proximityInfo->getLocaleStr(); 364a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka mKeyCount = proximityInfo->getKeyCount(); 374a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka mCellHeight = proximityInfo->getCellHeight(); 384a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka mCellWidth = proximityInfo->getCellWidth(); 394a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka mGridHeight = proximityInfo->getGridWidth(); 404a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka mGridWidth = proximityInfo->getGridHeight(); 414a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka const int normalizedSquaredDistancesLength = 424a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka MAX_PROXIMITY_CHARS_SIZE_INTERNAL * MAX_WORD_LENGTH_INTERNAL; 434a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka for (int i = 0; i < normalizedSquaredDistancesLength; ++i) { 444a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka mNormalizedSquaredDistances[i] = NOT_A_DISTANCE; 454a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka } 464a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka 473e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka memset(mInputCodes, 0, 484a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka MAX_WORD_LENGTH_INTERNAL * MAX_PROXIMITY_CHARS_SIZE_INTERNAL * sizeof(mInputCodes[0])); 493e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 50687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka for (int i = 0; i < inputSize; ++i) { 513e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int32_t primaryKey = inputCodes[i]; 523e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int x = xCoordinates[i]; 533e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int y = yCoordinates[i]; 544a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka int *proximities = &mInputCodes[i * MAX_PROXIMITY_CHARS_SIZE_INTERNAL]; 553e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka mProximityInfo->calculateNearbyKeyCodes(x, y, primaryKey, proximities); 563e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 573e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 583e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka if (DEBUG_PROXIMITY_CHARS) { 59687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka for (int i = 0; i < inputSize; ++i) { 603e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka AKLOGI("---"); 614a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka for (int j = 0; j < MAX_PROXIMITY_CHARS_SIZE_INTERNAL; ++j) { 624a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka int icc = mInputCodes[i * MAX_PROXIMITY_CHARS_SIZE_INTERNAL + j]; 634a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka int icfjc = inputCodes[i * MAX_PROXIMITY_CHARS_SIZE_INTERNAL + j]; 643e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka icc += 0; 653e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka icfjc += 0; 663e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka AKLOGI("--- (%d)%c,%c", i, icc, icfjc); AKLOGI("--- A<%d>,B<%d>", icc, icfjc); 673e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 683e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 693e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 70687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka 71687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mMaxPointToKeyLength = maxLength; 72687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka /////////////////////// 73687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka // Setup touch points 74687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mInputXs.clear(); 75687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mInputYs.clear(); 76687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mTimes.clear(); 77687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mLengthCache.clear(); 78687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mDistanceCache.clear(); 79687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka 80687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mInputSize = 0; 81687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka if (xCoordinates && yCoordinates) { 82687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const bool proximityOnly = !isGeometric && (xCoordinates[0] < 0 || yCoordinates[0] < 0); 83687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka for (int i = 0; i < inputSize; ++i) { 84687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka ++mInputSize; 85687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka // Assuming pointerId == 0 if pointerIds is null. 86687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int pid = pointerIds ? pointerIds[i] : 0; 87687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka if (pointerId == pid) { 88687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int c = isGeometric ? NOT_A_COORDINATE : getPrimaryCharAt(i); 89687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int x = proximityOnly ? NOT_A_COORDINATE : xCoordinates[i]; 90687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int y = proximityOnly ? NOT_A_COORDINATE : yCoordinates[i]; 91687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int time = times ? times[i] : -1; 92687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka pushTouchPoint(c, x, y, time, isGeometric); 93687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka } 94687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka } 953e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 96687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka 97687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka if (mInputSize > 0) { 98687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int keyCount = mProximityInfo->getKeyCount(); 99687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mDistanceCache.resize(mInputSize * keyCount); 100687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka for (int i = 0; i < mInputSize; ++i) { 101687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka for (int k = 0; k < keyCount; ++k) { 102687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int index = i * keyCount + k; 103687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int x = mInputXs[i]; 104687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int y = mInputYs[i]; 105687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mDistanceCache[index] = 106687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mProximityInfo->getNormalizedSquaredDistanceFromCenterFloat(k, x, y); 107687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka } 108687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka } 109687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka } 110687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka // end 111687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka /////////////////////// 112687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka 113687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka for (int i = 0; i < inputSize; ++i) { 114687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mPrimaryInputWord[i] = getPrimaryCharAt(i); 1153e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 116687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mPrimaryInputWord[inputSize] = 0; 117687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka 118687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mTouchPositionCorrectionEnabled = 119687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mHasTouchPositionCorrectionData && xCoordinates && yCoordinates && !isGeometric; 120687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka for (int i = 0; i < mInputSize && mTouchPositionCorrectionEnabled; ++i) { 1213e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int *proximityChars = getProximityCharsAt(i); 1223e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int primaryKey = proximityChars[0]; 1233e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int x = xCoordinates[i]; 1243e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int y = yCoordinates[i]; 1253e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka if (DEBUG_PROXIMITY_CHARS) { 1263e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka int a = x + y + primaryKey; 1273e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka a += 0; 1283e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka AKLOGI("--- Primary = %c, x = %d, y = %d", primaryKey, x, y); 1293e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 1304a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka for (int j = 0; j < MAX_PROXIMITY_CHARS_SIZE_INTERNAL && proximityChars[j] > 0; ++j) { 1313e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int currentChar = proximityChars[j]; 1323e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const float squaredDistance = 1333e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka hasInputCoordinates() ? calculateNormalizedSquaredDistance( 1343e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka mProximityInfo->getKeyIndex(currentChar), i) : 1353e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka NOT_A_DISTANCE_FLOAT; 1363e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka if (squaredDistance >= 0.0f) { 1374a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka mNormalizedSquaredDistances[i * MAX_PROXIMITY_CHARS_SIZE_INTERNAL + j] = 1383e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka (int) (squaredDistance * NORMALIZED_SQUARED_DISTANCE_SCALING_FACTOR); 1393e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } else { 1404a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka mNormalizedSquaredDistances[i * MAX_PROXIMITY_CHARS_SIZE_INTERNAL + j] = 1413e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka (j == 0) ? EQUIVALENT_CHAR_WITHOUT_DISTANCE_INFO : 1423e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka PROXIMITY_CHAR_WITHOUT_DISTANCE_INFO; 1433e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 1443e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka if (DEBUG_PROXIMITY_CHARS) { 1453e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka AKLOGI("--- Proximity (%d) = %c", j, currentChar); 1463e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 1473e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 1483e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 1493e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka} 1504a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka 151687a244703a02323ebd64433cbaead5def499861Satoshi Kataokavoid ProximityInfoState::pushTouchPoint(const int nodeChar, int x, int y, 152687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int time, const bool sample) { 153687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const uint32_t size = mInputXs.size(); 154687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka // TODO: Should have a const variable for 10 155687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int sampleRate = mProximityInfo->getMostCommonKeyWidth() / 10; 156687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka if (size > 0) { 157687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int dist = getDistanceInt(x, y, mInputXs[size - 1], mInputYs[size - 1]); 158687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka if (sample && dist < sampleRate) { 159687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka return; 160687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka } 161687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mLengthCache.push_back(mLengthCache[size - 1] + dist); 162687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka } else { 163687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mLengthCache.push_back(0); 164687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka } 165687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka if (nodeChar >= 0 && (x < 0 || y < 0)) { 166687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int keyId = mProximityInfo->getKeyIndex(nodeChar); 167687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka if (keyId >= 0) { 168687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka x = mProximityInfo->getKeyCenterXOfIdG(keyId); 169687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka y = mProximityInfo->getKeyCenterYOfIdG(keyId); 170687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka } 171687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka } 172687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mInputXs.push_back(x); 173687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mInputYs.push_back(y); 174687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka mTimes.push_back(time); 175687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka} 176687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka 1774a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataokafloat ProximityInfoState::calculateNormalizedSquaredDistance( 1784a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka const int keyIndex, const int inputIndex) const { 1794a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka if (keyIndex == NOT_AN_INDEX) { 1804a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka return NOT_A_DISTANCE_FLOAT; 1814a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka } 1824a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka if (!mProximityInfo->hasSweetSpotData(keyIndex)) { 1834a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka return NOT_A_DISTANCE_FLOAT; 1844a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka } 185687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka if (NOT_A_COORDINATE == mInputXs[inputIndex]) { 1864a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka return NOT_A_DISTANCE_FLOAT; 1874a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka } 1884a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka const float squaredDistance = calculateSquaredDistanceFromSweetSpotCenter( 1894a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka keyIndex, inputIndex); 1904a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka const float squaredRadius = square(mProximityInfo->getSweetSpotRadiiAt(keyIndex)); 1914a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka return squaredDistance / squaredRadius; 1924a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka} 1934a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka 194687a244703a02323ebd64433cbaead5def499861Satoshi Kataokaint ProximityInfoState::getDuration(const int index) const { 195687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka if (mTimes.size() == 0 || index <= 0 || index >= static_cast<int>(mInputSize) - 1) { 196687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka return 0; 197687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka } 198687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka return mTimes[index + 1] - mTimes[index - 1]; 199687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka} 200687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka 201687a244703a02323ebd64433cbaead5def499861Satoshi Kataokafloat ProximityInfoState::getPointToKeyLength(int inputIndex, int charCode, float scale) { 202687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int keyId = mProximityInfo->getKeyIndex(charCode); 203687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka if (keyId >= 0) { 204687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int index = inputIndex * mProximityInfo->getKeyCount() + keyId; 205687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka return min(mDistanceCache[index] * scale, mMaxPointToKeyLength); 206687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka } 207687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka return 0; 208687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka} 209687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka 210687a244703a02323ebd64433cbaead5def499861Satoshi Kataokaint ProximityInfoState::getKeyKeyDistance(int key0, int key1) { 211687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka return mProximityInfo->getKeyKeyDistanceG(key0, key1); 212687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka} 213687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka 214687a244703a02323ebd64433cbaead5def499861Satoshi Kataokaint ProximityInfoState::getSpaceY() { 215687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const int keyId = mProximityInfo->getKeyIndex(' '); 216687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka return mProximityInfo->getKeyCenterYOfIdG(keyId); 217687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka} 218687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka 2194a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataokafloat ProximityInfoState::calculateSquaredDistanceFromSweetSpotCenter( 2204a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka const int keyIndex, const int inputIndex) const { 2214a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka const float sweetSpotCenterX = mProximityInfo->getSweetSpotCenterXAt(keyIndex); 2224a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka const float sweetSpotCenterY = mProximityInfo->getSweetSpotCenterYAt(keyIndex); 223687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const float inputX = static_cast<float>(mInputXs[inputIndex]); 224687a244703a02323ebd64433cbaead5def499861Satoshi Kataoka const float inputY = static_cast<float>(mInputYs[inputIndex]); 2254a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka return square(inputX - sweetSpotCenterX) + square(inputY - sweetSpotCenterY); 2264a3db7057f77dc85311fb1f94934b5a004ab613eSatoshi Kataoka} 2273e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka} // namespace latinime 228