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