proximity_info.cpp revision 830ba67498c6da53b38212dd9ac5ba318a00de11
18fbd55229243cb66c03d5ea1f79dfb39f596590dsatok/* 28fbd55229243cb66c03d5ea1f79dfb39f596590dsatok * Copyright (C) 2011 The Android Open Source Project 38fbd55229243cb66c03d5ea1f79dfb39f596590dsatok * 48fbd55229243cb66c03d5ea1f79dfb39f596590dsatok * Licensed under the Apache License, Version 2.0 (the "License"); 58fbd55229243cb66c03d5ea1f79dfb39f596590dsatok * you may not use this file except in compliance with the License. 68fbd55229243cb66c03d5ea1f79dfb39f596590dsatok * You may obtain a copy of the License at 78fbd55229243cb66c03d5ea1f79dfb39f596590dsatok * 88fbd55229243cb66c03d5ea1f79dfb39f596590dsatok * http://www.apache.org/licenses/LICENSE-2.0 98fbd55229243cb66c03d5ea1f79dfb39f596590dsatok * 108fbd55229243cb66c03d5ea1f79dfb39f596590dsatok * Unless required by applicable law or agreed to in writing, software 118fbd55229243cb66c03d5ea1f79dfb39f596590dsatok * distributed under the License is distributed on an "AS IS" BASIS, 128fbd55229243cb66c03d5ea1f79dfb39f596590dsatok * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138fbd55229243cb66c03d5ea1f79dfb39f596590dsatok * See the License for the specific language governing permissions and 148fbd55229243cb66c03d5ea1f79dfb39f596590dsatok * limitations under the License. 158fbd55229243cb66c03d5ea1f79dfb39f596590dsatok */ 168fbd55229243cb66c03d5ea1f79dfb39f596590dsatok 17f1008c550168e50f930ea1e043000b395ce0f129Ken Wakasa#include <cstring> 18625778fd36f4b304d9bc70c87be7fdc0f717cb50Tom Ouyang#include <cmath> 198fbd55229243cb66c03d5ea1f79dfb39f596590dsatok 20817e517e463cb32726ff5a62196ac8744848e29bsatok#define LOG_TAG "LatinIME: proximity_info.cpp" 21817e517e463cb32726ff5a62196ac8744848e29bsatok 22552c3c27f04e6769e40cffbce3a9e8eed1269294satok#include "additional_proximity_chars.h" 2377e8e81ad95cfc1eb8f8407fc872674b8d08bbe9Ken Wakasa#include "char_utils.h" 243b088a2f365a9ce06f58243c83cb961ea2920b7eKen Wakasa#include "defines.h" 256b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka#include "geometry_utils.h" 26bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa#include "jni.h" 278fbd55229243cb66c03d5ea1f79dfb39f596590dsatok#include "proximity_info.h" 28ee456af9d4c7ce4fe2dc0513a8b2cf08c21b5f21Ken Wakasa#include "proximity_info_params.h" 298fbd55229243cb66c03d5ea1f79dfb39f596590dsatok 308fbd55229243cb66c03d5ea1f79dfb39f596590dsatoknamespace latinime { 31ce9e52a12a6af8fca0eba42aaae24602fbd5c998Ken Wakasa 326e66349ed1d37c24a1a23bf117df6750ad53d322Ken Wakasastatic AK_FORCE_INLINE void safeGetOrFillZeroIntArrayRegion(JNIEnv *env, jintArray jArray, 336e66349ed1d37c24a1a23bf117df6750ad53d322Ken Wakasa jsize len, jint *buffer) { 34bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa if (jArray && buffer) { 35bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa env->GetIntArrayRegion(jArray, 0, len, buffer); 36bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa } else if (buffer) { 3744d9c1ebfc2a847233190f6201ae97b22df30ae7Ken Wakasa memset(buffer, 0, len * sizeof(buffer[0])); 38de2f8424ea7e201ab8ee0d3c64fac0b52514d24eYusuke Nojima } 39de2f8424ea7e201ab8ee0d3c64fac0b52514d24eYusuke Nojima} 40de2f8424ea7e201ab8ee0d3c64fac0b52514d24eYusuke Nojima 416e66349ed1d37c24a1a23bf117df6750ad53d322Ken Wakasastatic AK_FORCE_INLINE void safeGetOrFillZeroFloatArrayRegion(JNIEnv *env, jfloatArray jArray, 426e66349ed1d37c24a1a23bf117df6750ad53d322Ken Wakasa jsize len, jfloat *buffer) { 43bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa if (jArray && buffer) { 44bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa env->GetFloatArrayRegion(jArray, 0, len, buffer); 45bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa } else if (buffer) { 4644d9c1ebfc2a847233190f6201ae97b22df30ae7Ken Wakasa memset(buffer, 0, len * sizeof(buffer[0])); 47bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa } 48bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa} 49bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa 506c22439bf80da08576e86c1282afc5cfa431e235Ken WakasaProximityInfo::ProximityInfo(JNIEnv *env, const jstring localeJStr, 51552c3c27f04e6769e40cffbce3a9e8eed1269294satok const int keyboardWidth, const int keyboardHeight, const int gridWidth, 52bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa const int gridHeight, const int mostCommonKeyWidth, const jintArray proximityChars, 53bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa const int keyCount, const jintArray keyXCoordinates, const jintArray keyYCoordinates, 54bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa const jintArray keyWidths, const jintArray keyHeights, const jintArray keyCharCodes, 55bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa const jfloatArray sweetSpotCenterXs, const jfloatArray sweetSpotCenterYs, 56bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa const jfloatArray sweetSpotRadii) 576c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa : GRID_WIDTH(gridWidth), GRID_HEIGHT(gridHeight), MOST_COMMON_KEY_WIDTH(mostCommonKeyWidth), 58a70ee6e3b3fe65acab205b935ebd52e7bb0eccb8satok MOST_COMMON_KEY_WIDTH_SQUARE(mostCommonKeyWidth * mostCommonKeyWidth), 59817e517e463cb32726ff5a62196ac8744848e29bsatok CELL_WIDTH((keyboardWidth + gridWidth - 1) / gridWidth), 600e1f656c1be7f2916cf57c94d99b001795856270Yusuke Nojima CELL_HEIGHT((keyboardHeight + gridHeight - 1) / gridHeight), 61258bfe66e0fcfc89b59534a9cc7f50ff07d5f78dYusuke Nojima KEY_COUNT(min(keyCount, MAX_KEY_COUNT_IN_A_KEYBOARD)), 6295a49a527ac9c2c97cfcc758bd6f0d58fb4ad9c0Keisuke Kuroyanagi KEYBOARD_WIDTH(keyboardWidth), KEYBOARD_HEIGHT(keyboardHeight), 63625778fd36f4b304d9bc70c87be7fdc0f717cb50Tom Ouyang KEYBOARD_HYPOTENUSE(hypotf(KEYBOARD_WIDTH, KEYBOARD_HEIGHT)), 64a4c1f1c1fde5e9492523842dd95a4c9f17f40c3aYusuke Nojima HAS_TOUCH_POSITION_CORRECTION_DATA(keyCount > 0 && keyXCoordinates && keyYCoordinates 65a4c1f1c1fde5e9492523842dd95a4c9f17f40c3aYusuke Nojima && keyWidths && keyHeights && keyCharCodes && sweetSpotCenterXs 66162c211b44c1546b2e9be36e0cec50de497217a9Ken Wakasa && sweetSpotCenterYs && sweetSpotRadii), 671d516fb1b08002cea6db060c9f8196d96ba5e428Ken Wakasa mProximityCharsArray(new int[GRID_WIDTH * GRID_HEIGHT * MAX_PROXIMITY_CHARS_SIZE 686c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa /* proximityCharsLength */]), 69132168519e1d681ea1b8fd7fcf283155a0b3997eTom Ouyang mCodeToKeyMap() { 706c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa /* Let's check the input array length here to make sure */ 716c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa const jsize proximityCharsLength = env->GetArrayLength(proximityChars); 726c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa if (proximityCharsLength != GRID_WIDTH * GRID_HEIGHT * MAX_PROXIMITY_CHARS_SIZE) { 736c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa AKLOGE("Invalid proximityCharsLength: %d", proximityCharsLength); 746c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa ASSERT(false); 756c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa return; 766c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa } 77817e517e463cb32726ff5a62196ac8744848e29bsatok if (DEBUG_PROXIMITY_INFO) { 786c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa AKLOGI("Create proximity info array %d", proximityCharsLength); 79817e517e463cb32726ff5a62196ac8744848e29bsatok } 80015114592460cca82e5196f2c2e2eff23f9d97aeKen Wakasa const jsize localeCStrUtf8Length = env->GetStringUTFLength(localeJStr); 819e0c711a6230af1db0753af401804c95e4bee69dKen Wakasa if (localeCStrUtf8Length >= MAX_LOCALE_STRING_LENGTH) { 829e0c711a6230af1db0753af401804c95e4bee69dKen Wakasa AKLOGI("Locale string length too long: length=%d", localeCStrUtf8Length); 83ccebd5cefe0b6b17676edd8639f62bb708a7dd2eKen Wakasa ASSERT(false); 849e0c711a6230af1db0753af401804c95e4bee69dKen Wakasa } 859e0c711a6230af1db0753af401804c95e4bee69dKen Wakasa memset(mLocaleStr, 0, sizeof(mLocaleStr)); 869e0c711a6230af1db0753af401804c95e4bee69dKen Wakasa env->GetStringUTFRegion(localeJStr, 0, env->GetStringLength(localeJStr), mLocaleStr); 876c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa safeGetOrFillZeroIntArrayRegion(env, proximityChars, proximityCharsLength, 886c22439bf80da08576e86c1282afc5cfa431e235Ken Wakasa mProximityCharsArray); 89bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa safeGetOrFillZeroIntArrayRegion(env, keyXCoordinates, KEY_COUNT, mKeyXCoordinates); 90bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa safeGetOrFillZeroIntArrayRegion(env, keyYCoordinates, KEY_COUNT, mKeyYCoordinates); 91bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa safeGetOrFillZeroIntArrayRegion(env, keyWidths, KEY_COUNT, mKeyWidths); 92bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa safeGetOrFillZeroIntArrayRegion(env, keyHeights, KEY_COUNT, mKeyHeights); 93f2789819bd005b5b0581e8439601b5501306327dKen Wakasa safeGetOrFillZeroIntArrayRegion(env, keyCharCodes, KEY_COUNT, mKeyCodePoints); 94bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa safeGetOrFillZeroFloatArrayRegion(env, sweetSpotCenterXs, KEY_COUNT, mSweetSpotCenterXs); 95bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa safeGetOrFillZeroFloatArrayRegion(env, sweetSpotCenterYs, KEY_COUNT, mSweetSpotCenterYs); 96bb005f787f4e00bd832e6a78797be10af2994061Ken Wakasa safeGetOrFillZeroFloatArrayRegion(env, sweetSpotRadii, KEY_COUNT, mSweetSpotRadii); 976b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka initializeG(); 980e1f656c1be7f2916cf57c94d99b001795856270Yusuke Nojima} 990e1f656c1be7f2916cf57c94d99b001795856270Yusuke Nojima 1008fbd55229243cb66c03d5ea1f79dfb39f596590dsatokProximityInfo::~ProximityInfo() { 1018fbd55229243cb66c03d5ea1f79dfb39f596590dsatok delete[] mProximityCharsArray; 1028fbd55229243cb66c03d5ea1f79dfb39f596590dsatok} 103817e517e463cb32726ff5a62196ac8744848e29bsatok 104817e517e463cb32726ff5a62196ac8744848e29bsatokbool ProximityInfo::hasSpaceProximity(const int x, const int y) const { 105744dab691e45ff8c5ca9745ee673f50060bcb7a9satok if (x < 0 || y < 0) { 106744dab691e45ff8c5ca9745ee673f50060bcb7a9satok if (DEBUG_DICT) { 1079fb6f47a6a11f62d134d4d6259181ac987fc1ad3satok AKLOGI("HasSpaceProximity: Illegal coordinates (%d, %d)", x, y); 108f2789819bd005b5b0581e8439601b5501306327dKen Wakasa // TODO: Enable this assertion. 109ccebd5cefe0b6b17676edd8639f62bb708a7dd2eKen Wakasa //ASSERT(false); 110744dab691e45ff8c5ca9745ee673f50060bcb7a9satok } 111744dab691e45ff8c5ca9745ee673f50060bcb7a9satok return false; 112744dab691e45ff8c5ca9745ee673f50060bcb7a9satok } 113744dab691e45ff8c5ca9745ee673f50060bcb7a9satok 1146e2ba9b01e61d214e8d6fad8d7093a80a97dd243Ken Wakasa const int startIndex = ProximityInfoUtils::getStartIndexFromCoordinates(x, y, 1156e2ba9b01e61d214e8d6fad8d7093a80a97dd243Ken Wakasa CELL_HEIGHT, CELL_WIDTH, GRID_WIDTH); 116817e517e463cb32726ff5a62196ac8744848e29bsatok if (DEBUG_PROXIMITY_INFO) { 1179fb6f47a6a11f62d134d4d6259181ac987fc1ad3satok AKLOGI("hasSpaceProximity: index %d, %d, %d", startIndex, x, y); 118817e517e463cb32726ff5a62196ac8744848e29bsatok } 1191d516fb1b08002cea6db060c9f8196d96ba5e428Ken Wakasa int *proximityCharsArray = mProximityCharsArray; 120817e517e463cb32726ff5a62196ac8744848e29bsatok for (int i = 0; i < MAX_PROXIMITY_CHARS_SIZE; ++i) { 121817e517e463cb32726ff5a62196ac8744848e29bsatok if (DEBUG_PROXIMITY_INFO) { 1229fb6f47a6a11f62d134d4d6259181ac987fc1ad3satok AKLOGI("Index: %d", mProximityCharsArray[startIndex + i]); 123817e517e463cb32726ff5a62196ac8744848e29bsatok } 1243e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka if (proximityCharsArray[startIndex + i] == KEYCODE_SPACE) { 125817e517e463cb32726ff5a62196ac8744848e29bsatok return true; 126817e517e463cb32726ff5a62196ac8744848e29bsatok } 127817e517e463cb32726ff5a62196ac8744848e29bsatok } 128817e517e463cb32726ff5a62196ac8744848e29bsatok return false; 1298fbd55229243cb66c03d5ea1f79dfb39f596590dsatok} 130ce9e52a12a6af8fca0eba42aaae24602fbd5c998Ken Wakasa 1310edab9d2fcc30667c79aa9221dbb27f042d8b455Satoshi Kataokafloat ProximityInfo::getNormalizedSquaredDistanceFromCenterFloatG( 132e7398cdb2b48eb52dc9676c8efa75bc7cb9af3e9Satoshi Kataoka const int keyId, const int x, const int y) const { 1330edab9d2fcc30667c79aa9221dbb27f042d8b455Satoshi Kataoka const bool correctTouchPosition = hasTouchPositionCorrectionData(); 134ee456af9d4c7ce4fe2dc0513a8b2cf08c21b5f21Ken Wakasa const float centerX = static_cast<float>(correctTouchPosition ? getSweetSpotCenterXAt(keyId) 1350edab9d2fcc30667c79aa9221dbb27f042d8b455Satoshi Kataoka : getKeyCenterXOfKeyIdG(keyId)); 1360edab9d2fcc30667c79aa9221dbb27f042d8b455Satoshi Kataoka const float visualKeyCenterY = static_cast<float>(getKeyCenterYOfKeyIdG(keyId)); 1370edab9d2fcc30667c79aa9221dbb27f042d8b455Satoshi Kataoka float centerY; 1380edab9d2fcc30667c79aa9221dbb27f042d8b455Satoshi Kataoka if (correctTouchPosition) { 1390edab9d2fcc30667c79aa9221dbb27f042d8b455Satoshi Kataoka const float sweetSpotCenterY = static_cast<float>(getSweetSpotCenterYAt(keyId)); 1400edab9d2fcc30667c79aa9221dbb27f042d8b455Satoshi Kataoka const float gapY = sweetSpotCenterY - visualKeyCenterY; 141ee456af9d4c7ce4fe2dc0513a8b2cf08c21b5f21Ken Wakasa centerY = visualKeyCenterY + gapY * ProximityInfoParams::VERTICAL_SWEET_SPOT_SCALE_G; 1420edab9d2fcc30667c79aa9221dbb27f042d8b455Satoshi Kataoka } else { 1430edab9d2fcc30667c79aa9221dbb27f042d8b455Satoshi Kataoka centerY = visualKeyCenterY; 1440edab9d2fcc30667c79aa9221dbb27f042d8b455Satoshi Kataoka } 145e7398cdb2b48eb52dc9676c8efa75bc7cb9af3e9Satoshi Kataoka const float touchX = static_cast<float>(x); 146e7398cdb2b48eb52dc9676c8efa75bc7cb9af3e9Satoshi Kataoka const float touchY = static_cast<float>(y); 147e7398cdb2b48eb52dc9676c8efa75bc7cb9af3e9Satoshi Kataoka const float keyWidth = static_cast<float>(getMostCommonKeyWidth()); 1480c2227ab991774768414d8ea60a469f005eb9f1aKen Wakasa return ProximityInfoUtils::getSquaredDistanceFloat(centerX, centerY, touchX, touchY) 1490c2227ab991774768414d8ea60a469f005eb9f1aKen Wakasa / SQUARE_FLOAT(keyWidth); 150e7398cdb2b48eb52dc9676c8efa75bc7cb9af3e9Satoshi Kataoka} 151e7398cdb2b48eb52dc9676c8efa75bc7cb9af3e9Satoshi Kataoka 152f2789819bd005b5b0581e8439601b5501306327dKen Wakasaint ProximityInfo::getCodePointOf(const int keyIndex) const { 1536b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka if (keyIndex < 0 || keyIndex >= KEY_COUNT) { 154f2789819bd005b5b0581e8439601b5501306327dKen Wakasa return NOT_A_CODE_POINT; 1556b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka } 156f2789819bd005b5b0581e8439601b5501306327dKen Wakasa return mKeyIndexToCodePointG[keyIndex]; 1576b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka} 1586b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka 1596b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataokavoid ProximityInfo::initializeG() { 160e7398cdb2b48eb52dc9676c8efa75bc7cb9af3e9Satoshi Kataoka // TODO: Optimize 1616b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka for (int i = 0; i < KEY_COUNT; ++i) { 162f2789819bd005b5b0581e8439601b5501306327dKen Wakasa const int code = mKeyCodePoints[i]; 1631d516fb1b08002cea6db060c9f8196d96ba5e428Ken Wakasa const int lowerCode = toLowerCase(code); 1646b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka mCenterXsG[i] = mKeyXCoordinates[i] + mKeyWidths[i] / 2; 1656b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka mCenterYsG[i] = mKeyYCoordinates[i] + mKeyHeights[i] / 2; 166132168519e1d681ea1b8fd7fcf283155a0b3997eTom Ouyang mCodeToKeyMap[lowerCode] = i; 167132168519e1d681ea1b8fd7fcf283155a0b3997eTom Ouyang mKeyIndexToCodePointG[i] = lowerCode; 1686b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka } 1696b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka for (int i = 0; i < KEY_COUNT; i++) { 1706b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka mKeyKeyDistancesG[i][i] = 0; 1716b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka for (int j = i + 1; j < KEY_COUNT; j++) { 17247cc52415e3affb83eb4369190425b2a17b956c5Satoshi Kataoka mKeyKeyDistancesG[i][j] = getDistanceInt( 1736b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka mCenterXsG[i], mCenterYsG[i], mCenterXsG[j], mCenterYsG[j]); 1746b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka mKeyKeyDistancesG[j][i] = mKeyKeyDistancesG[i][j]; 1756b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka } 1766b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka } 1776b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka} 1786b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka 1795964d4e607008d29cca3bc07c878fbc7eb540a1bKen Wakasaint ProximityInfo::getKeyCenterXOfCodePointG(int charCode) const { 180bf78e1371c12d819020d60f0e585f5e6c26e6aa2Satoshi Kataoka return getKeyCenterXOfKeyIdG( 181bf78e1371c12d819020d60f0e585f5e6c26e6aa2Satoshi Kataoka ProximityInfoUtils::getKeyIndexOf(KEY_COUNT, charCode, &mCodeToKeyMap)); 1826b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka} 1836b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka 1845964d4e607008d29cca3bc07c878fbc7eb540a1bKen Wakasaint ProximityInfo::getKeyCenterYOfCodePointG(int charCode) const { 185bf78e1371c12d819020d60f0e585f5e6c26e6aa2Satoshi Kataoka return getKeyCenterYOfKeyIdG( 186bf78e1371c12d819020d60f0e585f5e6c26e6aa2Satoshi Kataoka ProximityInfoUtils::getKeyIndexOf(KEY_COUNT, charCode, &mCodeToKeyMap)); 1876b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka} 1886b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka 1895964d4e607008d29cca3bc07c878fbc7eb540a1bKen Wakasaint ProximityInfo::getKeyCenterXOfKeyIdG(int keyId) const { 1906b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka if (keyId >= 0) { 1916b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka return mCenterXsG[keyId]; 1926b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka } 1936b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka return 0; 1946b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka} 1956b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka 1965964d4e607008d29cca3bc07c878fbc7eb540a1bKen Wakasaint ProximityInfo::getKeyCenterYOfKeyIdG(int keyId) const { 1976b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka if (keyId >= 0) { 1986b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka return mCenterYsG[keyId]; 1996b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka } 2006b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka return 0; 2016b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka} 2026b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka 203ff74cc3e5e75fc0c6b9ffaa5e68d879775dc6115Keisuke Kuroyanagiint ProximityInfo::getKeyKeyDistanceG(const int keyId0, const int keyId1) const { 2046b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka if (keyId0 >= 0 && keyId1 >= 0) { 2056b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka return mKeyKeyDistancesG[keyId0][keyId1]; 2066b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka } 207830ba67498c6da53b38212dd9ac5ba318a00de11Satoshi Kataoka return MAX_VALUE_FOR_WEIGHTING; 2086b4a1d79eba19a55715e20b4ee75b3934f397db2Satoshi Kataoka} 209ce9e52a12a6af8fca0eba42aaae24602fbd5c998Ken Wakasa} // namespace latinime 210