blob: 7222d0d5df883217d9d29f5437f4ab343da285a0 [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
20#include <stdint.h>
satok552c3c22012-03-13 16:33:47 +090021#include <string>
satok8fbd5522011-02-22 17:28:55 +090022
23#include "defines.h"
Ken Wakasabb005f72012-08-08 20:43:47 +090024#include "jni.h"
satok8fbd5522011-02-22 17:28:55 +090025
26namespace latinime {
27
satokcfca3c62011-08-10 14:30:10 +090028class Correction;
satok2df30602011-07-15 13:49:00 +090029
satok8fbd5522011-02-22 17:28:55 +090030class ProximityInfo {
Ken Wakasae12e9b52012-01-06 12:24:38 +090031 public:
Ken Wakasa01511452012-08-09 15:58:15 +090032 ProximityInfo(JNIEnv *env, const jstring localeJStr, const int maxProximityCharsSize,
Tadashi G. Takaokaa58ebc72012-04-18 15:44:34 +090033 const int keyboardWidth, const int keyboardHeight, const int gridWidth,
Ken Wakasabb005f72012-08-08 20:43:47 +090034 const int gridHeight, const int mostCommonKeyWidth, const jintArray proximityChars,
35 const int keyCount, const jintArray keyXCoordinates, const jintArray keyYCoordinates,
36 const jintArray keyWidths, const jintArray keyHeights, const jintArray keyCharCodes,
37 const jfloatArray sweetSpotCenterXs, const jfloatArray sweetSpotCenterYs,
38 const jfloatArray sweetSpotRadii);
satok8fbd5522011-02-22 17:28:55 +090039 ~ProximityInfo();
satok817e5172011-03-04 06:06:45 -080040 bool hasSpaceProximity(const int x, const int y) const;
Satoshi Kataoka3e8c58f2012-06-05 17:55:52 +090041 int getNormalizedSquaredDistance(const int inputIndex, const int proximityIndex) const;
42 bool sameAsTyped(const unsigned short *word, int length) const;
43 int squaredDistanceToEdge(const int keyId, const int x, const int y) const;
44 bool isOnKey(const int keyId, const int x, const int y) const {
45 if (keyId < 0) return true; // NOT_A_ID is -1, but return whenever < 0 just in case
46 const int left = mKeyXCoordinates[keyId];
47 const int top = mKeyYCoordinates[keyId];
48 const int right = left + mKeyWidths[keyId] + 1;
49 const int bottom = top + mKeyHeights[keyId];
50 return left < right && top < bottom && x >= left && x < right && y >= top && y < bottom;
51 }
52 int getKeyIndex(const int c) const;
53 bool hasSweetSpotData(const int keyIndex) const {
54 // When there are no calibration data for a key,
55 // the radius of the key is assigned to zero.
56 return mSweetSpotRadii[keyIndex] > 0.0;
57 }
58 float getSweetSpotRadiiAt(int keyIndex) const {
59 return mSweetSpotRadii[keyIndex];
60 }
61 float getSweetSpotCenterXAt(int keyIndex) const {
62 return mSweetSpotCenterXs[keyIndex];
63 }
64 float getSweetSpotCenterYAt(int keyIndex) const {
65 return mSweetSpotCenterYs[keyIndex];
66 }
67 void calculateNearbyKeyCodes(
68 const int x, const int y, const int32_t primaryKey, int *inputCodes) const;
69
Satoshi Kataoka4a3db702012-06-08 15:29:44 +090070 bool hasTouchPositionCorrectionData() const {
71 return HAS_TOUCH_POSITION_CORRECTION_DATA;
72 }
73
74 int getMostCommonKeyWidthSquare() const {
75 return MOST_COMMON_KEY_WIDTH_SQUARE;
76 }
77
78 std::string getLocaleStr() const {
Ken Wakasa01511452012-08-09 15:58:15 +090079 return *mLocaleStr;
Satoshi Kataoka4a3db702012-06-08 15:29:44 +090080 }
81
82 int getKeyCount() const {
83 return KEY_COUNT;
84 }
85
86 int getCellHeight() const {
87 return CELL_HEIGHT;
88 }
89
90 int getCellWidth() const {
91 return CELL_WIDTH;
92 }
93
94 int getGridWidth() const {
95 return GRID_WIDTH;
96 }
97
98 int getGridHeight() const {
99 return GRID_HEIGHT;
100 }
satok635f68e2011-08-10 22:19:33 +0900101
Satoshi Kataokaefb63242012-06-27 14:52:40 +0900102 // Returns the keyboard key-center information.
103 void getCenters(int *centersX, int *centersY, int *codeToKeyIndex, int *keyToCodeIndex,
104 int *keyCount, int *keyWidth) const;
105
Ken Wakasae12e9b52012-01-06 12:24:38 +0900106 private:
satok1bc038c2012-06-14 11:25:50 -0700107 DISALLOW_IMPLICIT_CONSTRUCTORS(ProximityInfo);
Yusuke Nojima0e1f6562011-09-21 12:02:47 +0900108 // The max number of the keys in one keyboard layout
109 static const int MAX_KEY_COUNT_IN_A_KEYBOARD = 64;
Yusuke Nojimaad358352011-09-29 16:44:54 +0900110 // The upper limit of the char code in mCodeToKeyIndex
111 static const int MAX_CHAR_CODE = 127;
satok1caff472012-03-14 23:17:12 +0900112 static const float NOT_A_DISTANCE_FLOAT = -1.0f;
113 static const int NOT_A_CODE = -1;
Yusuke Nojima0e1f6562011-09-21 12:02:47 +0900114
satok817e5172011-03-04 06:06:45 -0800115 int getStartIndexFromCoordinates(const int x, const int y) const;
Yusuke Nojima0e1f6562011-09-21 12:02:47 +0900116 void initializeCodeToKeyIndex();
Yusuke Nojimaa4c1f1c2011-10-06 19:12:20 +0900117 float calculateNormalizedSquaredDistance(const int keyIndex, const int inputIndex) const;
118 float calculateSquaredDistanceFromSweetSpotCenter(
119 const int keyIndex, const int inputIndex) const;
satok1caff472012-03-14 23:17:12 +0900120 bool hasInputCoordinates() const;
Yusuke Nojimac25c7cc2011-10-03 16:44:29 +0900121
Ken Wakasade3070a2011-03-19 09:16:42 +0900122 const int MAX_PROXIMITY_CHARS_SIZE;
satok817e5172011-03-04 06:06:45 -0800123 const int KEYBOARD_WIDTH;
124 const int KEYBOARD_HEIGHT;
satok8fbd5522011-02-22 17:28:55 +0900125 const int GRID_WIDTH;
126 const int GRID_HEIGHT;
satoka70ee6e2012-03-07 15:12:22 +0900127 const int MOST_COMMON_KEY_WIDTH_SQUARE;
Ken Wakasade3070a2011-03-19 09:16:42 +0900128 const int CELL_WIDTH;
129 const int CELL_HEIGHT;
Yusuke Nojima0e1f6562011-09-21 12:02:47 +0900130 const int KEY_COUNT;
Yusuke Nojimaa4c1f1c2011-10-06 19:12:20 +0900131 const bool HAS_TOUCH_POSITION_CORRECTION_DATA;
Ken Wakasa01511452012-08-09 15:58:15 +0900132 const std::string *mLocaleStr;
satok0cb20972012-03-13 22:07:56 +0900133 int32_t *mProximityCharsArray;
Yusuke Nojima0e1f6562011-09-21 12:02:47 +0900134 int32_t mKeyXCoordinates[MAX_KEY_COUNT_IN_A_KEYBOARD];
135 int32_t mKeyYCoordinates[MAX_KEY_COUNT_IN_A_KEYBOARD];
136 int32_t mKeyWidths[MAX_KEY_COUNT_IN_A_KEYBOARD];
137 int32_t mKeyHeights[MAX_KEY_COUNT_IN_A_KEYBOARD];
138 int32_t mKeyCharCodes[MAX_KEY_COUNT_IN_A_KEYBOARD];
Yusuke Nojimaad358352011-09-29 16:44:54 +0900139 float mSweetSpotCenterXs[MAX_KEY_COUNT_IN_A_KEYBOARD];
140 float mSweetSpotCenterYs[MAX_KEY_COUNT_IN_A_KEYBOARD];
141 float mSweetSpotRadii[MAX_KEY_COUNT_IN_A_KEYBOARD];
Yusuke Nojimaad358352011-09-29 16:44:54 +0900142 int mCodeToKeyIndex[MAX_CHAR_CODE + 1];
Satoshi Kataoka3e8c58f2012-06-05 17:55:52 +0900143 // TODO: move to correction.h
satok8fbd5522011-02-22 17:28:55 +0900144};
Ken Wakasace9e52a2011-06-18 13:09:55 +0900145} // namespace latinime
satok8fbd5522011-02-22 17:28:55 +0900146#endif // LATINIME_PROXIMITY_INFO_H