blob: 22bbdf165abdfe13250b5d2f1bbb42f3b0f03d65 [file] [log] [blame]
satok8fbd5522011-02-22 17:28:55 +09001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef LATINIME_PROXIMITY_INFO_H
18#define LATINIME_PROXIMITY_INFO_H
19
satok8fbd5522011-02-22 17:28:55 +090020#include "defines.h"
Tom Ouyang13216852012-09-03 12:50:21 -070021#include "hash_map_compat.h"
Ken Wakasabb005f72012-08-08 20:43:47 +090022#include "jni.h"
Satoshi Kataokabf78e132013-01-17 19:46:12 +090023#include "proximity_info_utils.h"
satok8fbd5522011-02-22 17:28:55 +090024
25namespace latinime {
26
satokcfca3c62011-08-10 14:30:10 +090027class Correction;
satok2df30602011-07-15 13:49:00 +090028
satok8fbd5522011-02-22 17:28:55 +090029class ProximityInfo {
Ken Wakasae12e9b52012-01-06 12:24:38 +090030 public:
Ken Wakasa6c224392013-01-22 13:14:53 +090031 ProximityInfo(JNIEnv *env, const jstring localeJStr,
Tadashi G. Takaokaa58ebc72012-04-18 15:44:34 +090032 const int keyboardWidth, const int keyboardHeight, const int gridWidth,
Ken Wakasabb005f72012-08-08 20:43:47 +090033 const int gridHeight, const int mostCommonKeyWidth, const jintArray proximityChars,
34 const int keyCount, const jintArray keyXCoordinates, const jintArray keyYCoordinates,
35 const jintArray keyWidths, const jintArray keyHeights, const jintArray keyCharCodes,
36 const jfloatArray sweetSpotCenterXs, const jfloatArray sweetSpotCenterYs,
37 const jfloatArray sweetSpotRadii);
satok8fbd5522011-02-22 17:28:55 +090038 ~ProximityInfo();
satok817e5172011-03-04 06:06:45 -080039 bool hasSpaceProximity(const int x, const int y) const;
Satoshi Kataoka3e8c58f2012-06-05 17:55:52 +090040 int getNormalizedSquaredDistance(const int inputIndex, const int proximityIndex) const;
Satoshi Kataoka0edab9d2012-09-24 18:29:31 +090041 float getNormalizedSquaredDistanceFromCenterFloatG(
Satoshi Kataokae7398cd2012-08-13 20:20:04 +090042 const int keyId, const int x, const int y) const;
Satoshi Kataoka3e8c58f2012-06-05 17:55:52 +090043 bool sameAsTyped(const unsigned short *word, int length) const;
Ken Wakasaf2789812012-09-04 12:49:46 +090044 int getCodePointOf(const int keyIndex) const;
Satoshi Kataoka3e8c58f2012-06-05 17:55:52 +090045 bool hasSweetSpotData(const int keyIndex) const {
46 // When there are no calibration data for a key,
47 // the radius of the key is assigned to zero.
Ken Wakasafee0ac62012-08-16 19:34:02 +090048 return mSweetSpotRadii[keyIndex] > 0.0f;
Satoshi Kataoka3e8c58f2012-06-05 17:55:52 +090049 }
Ken Wakasaa47c6992013-01-30 18:37:58 +090050 float getSweetSpotRadiiAt(int keyIndex) const { return mSweetSpotRadii[keyIndex]; }
51 float getSweetSpotCenterXAt(int keyIndex) const { return mSweetSpotCenterXs[keyIndex]; }
52 float getSweetSpotCenterYAt(int keyIndex) const { return mSweetSpotCenterYs[keyIndex]; }
Satoshi Kataoka3e8c58f2012-06-05 17:55:52 +090053 void calculateNearbyKeyCodes(
Ken Wakasa1d516fb2012-12-03 19:43:15 +090054 const int x, const int y, const int primaryKey, int *inputCodes) const;
Ken Wakasaa47c6992013-01-30 18:37:58 +090055 bool hasTouchPositionCorrectionData() const { return HAS_TOUCH_POSITION_CORRECTION_DATA; }
56 int getMostCommonKeyWidth() const { return MOST_COMMON_KEY_WIDTH; }
57 int getMostCommonKeyWidthSquare() const { return MOST_COMMON_KEY_WIDTH_SQUARE; }
58 int getKeyCount() const { return KEY_COUNT; }
59 int getCellHeight() const { return CELL_HEIGHT; }
60 int getCellWidth() const { return CELL_WIDTH; }
61 int getGridWidth() const { return GRID_WIDTH; }
62 int getGridHeight() const { return GRID_HEIGHT; }
63 int getKeyboardWidth() const { return KEYBOARD_WIDTH; }
64 int getKeyboardHeight() const { return KEYBOARD_HEIGHT; }
Tom Ouyang625778f2013-02-08 11:35:19 -080065 float getKeyboardHypotenuse() const { return KEYBOARD_HYPOTENUSE; }
Keisuke Kuroyanagi95a49a52012-09-04 17:00:24 +090066
Ken Wakasa5964d4e2012-09-10 16:49:36 +090067 int getKeyCenterXOfCodePointG(int charCode) const;
68 int getKeyCenterYOfCodePointG(int charCode) const;
69 int getKeyCenterXOfKeyIdG(int keyId) const;
70 int getKeyCenterYOfKeyIdG(int keyId) const;
Keisuke Kuroyanagiff74cc32012-10-11 13:08:06 +090071 int getKeyKeyDistanceG(int keyId0, int keyId1) const;
Satoshi Kataoka6b4a1d72012-08-10 15:42:56 +090072
Ken Wakasad74214d2013-02-13 19:56:19 +090073 void AK_FORCE_INLINE initializeProximities(const int *const inputCodes,
74 const int *const inputXCoordinates, const int *const inputYCoordinates,
75 const int inputSize, int *allInputCodes) const {
Satoshi Kataokabf78e132013-01-17 19:46:12 +090076 ProximityInfoUtils::initializeProximities(inputCodes, inputXCoordinates, inputYCoordinates,
77 inputSize, mKeyXCoordinates, mKeyYCoordinates, mKeyWidths, mKeyHeights,
Ken Wakasa6e2ba9b2013-01-30 19:24:03 +090078 mProximityCharsArray, CELL_HEIGHT, CELL_WIDTH, GRID_WIDTH, MOST_COMMON_KEY_WIDTH,
79 KEY_COUNT, mLocaleStr, &mCodeToKeyMap, allInputCodes);
Satoshi Kataokabf78e132013-01-17 19:46:12 +090080 }
81
Ken Wakasad74214d2013-02-13 19:56:19 +090082 int AK_FORCE_INLINE getKeyIndexOf(const int c) const {
Satoshi Kataokabf78e132013-01-17 19:46:12 +090083 return ProximityInfoUtils::getKeyIndexOf(KEY_COUNT, c, &mCodeToKeyMap);
84 }
85
Ken Wakasae12e9b52012-01-06 12:24:38 +090086 private:
satok1bc038c2012-06-14 11:25:50 -070087 DISALLOW_IMPLICIT_CONSTRUCTORS(ProximityInfo);
Yusuke Nojima0e1f6562011-09-21 12:02:47 +090088
Satoshi Kataoka6b4a1d72012-08-10 15:42:56 +090089 void initializeG();
Yusuke Nojimaa4c1f1c2011-10-06 19:12:20 +090090 float calculateNormalizedSquaredDistance(const int keyIndex, const int inputIndex) const;
satok1caff472012-03-14 23:17:12 +090091 bool hasInputCoordinates() const;
Yusuke Nojimac25c7cc2011-10-03 16:44:29 +090092
satok8fbd5522011-02-22 17:28:55 +090093 const int GRID_WIDTH;
94 const int GRID_HEIGHT;
Satoshi Kataoka6b4a1d72012-08-10 15:42:56 +090095 const int MOST_COMMON_KEY_WIDTH;
satoka70ee6e2012-03-07 15:12:22 +090096 const int MOST_COMMON_KEY_WIDTH_SQUARE;
Ken Wakasade3070a2011-03-19 09:16:42 +090097 const int CELL_WIDTH;
98 const int CELL_HEIGHT;
Yusuke Nojima0e1f6562011-09-21 12:02:47 +090099 const int KEY_COUNT;
Keisuke Kuroyanagi95a49a52012-09-04 17:00:24 +0900100 const int KEYBOARD_WIDTH;
101 const int KEYBOARD_HEIGHT;
Tom Ouyang625778f2013-02-08 11:35:19 -0800102 const float KEYBOARD_HYPOTENUSE;
Yusuke Nojimaa4c1f1c2011-10-06 19:12:20 +0900103 const bool HAS_TOUCH_POSITION_CORRECTION_DATA;
Ken Wakasa9e0c7112012-08-09 22:26:58 +0900104 char mLocaleStr[MAX_LOCALE_STRING_LENGTH];
Ken Wakasa1d516fb2012-12-03 19:43:15 +0900105 int *mProximityCharsArray;
106 int mKeyXCoordinates[MAX_KEY_COUNT_IN_A_KEYBOARD];
107 int mKeyYCoordinates[MAX_KEY_COUNT_IN_A_KEYBOARD];
108 int mKeyWidths[MAX_KEY_COUNT_IN_A_KEYBOARD];
109 int mKeyHeights[MAX_KEY_COUNT_IN_A_KEYBOARD];
110 int mKeyCodePoints[MAX_KEY_COUNT_IN_A_KEYBOARD];
Yusuke Nojimaad358352011-09-29 16:44:54 +0900111 float mSweetSpotCenterXs[MAX_KEY_COUNT_IN_A_KEYBOARD];
112 float mSweetSpotCenterYs[MAX_KEY_COUNT_IN_A_KEYBOARD];
113 float mSweetSpotRadii[MAX_KEY_COUNT_IN_A_KEYBOARD];
Tom Ouyang13216852012-09-03 12:50:21 -0700114 hash_map_compat<int, int> mCodeToKeyMap;
Satoshi Kataoka6b4a1d72012-08-10 15:42:56 +0900115
Ken Wakasaf2789812012-09-04 12:49:46 +0900116 int mKeyIndexToCodePointG[MAX_KEY_COUNT_IN_A_KEYBOARD];
Satoshi Kataoka6b4a1d72012-08-10 15:42:56 +0900117 int mCenterXsG[MAX_KEY_COUNT_IN_A_KEYBOARD];
118 int mCenterYsG[MAX_KEY_COUNT_IN_A_KEYBOARD];
119 int mKeyKeyDistancesG[MAX_KEY_COUNT_IN_A_KEYBOARD][MAX_KEY_COUNT_IN_A_KEYBOARD];
Satoshi Kataoka3e8c58f2012-06-05 17:55:52 +0900120 // TODO: move to correction.h
satok8fbd5522011-02-22 17:28:55 +0900121};
Ken Wakasace9e52a2011-06-18 13:09:55 +0900122} // namespace latinime
satok8fbd5522011-02-22 17:28:55 +0900123#endif // LATINIME_PROXIMITY_INFO_H