aboutsummaryrefslogtreecommitdiffstats
path: root/native
diff options
context:
space:
mode:
Diffstat (limited to 'native')
-rw-r--r--native/jni/src/geometry_utils.h21
-rw-r--r--native/jni/src/proximity_info.cpp37
-rw-r--r--native/jni/src/proximity_info.h6
-rw-r--r--native/jni/src/proximity_info_state.cpp4
-rw-r--r--native/jni/src/proximity_info_state.h2
5 files changed, 31 insertions, 39 deletions
diff --git a/native/jni/src/geometry_utils.h b/native/jni/src/geometry_utils.h
index f30e9fcc0..bad5eda61 100644
--- a/native/jni/src/geometry_utils.h
+++ b/native/jni/src/geometry_utils.h
@@ -25,14 +25,17 @@
#define M_PI_F 3.14159265f
-namespace latinime {
+#define ROUND_FLOAT_10000(f) ((f) < 1000.0f && (f) > 0.001f) \
+ ? (floorf((f) * 10000.0f) / 10000.0f) : (f)
-static inline float squareFloat(float x) {
- return x * x;
-}
+#define SQUARE_FLOAT(x) ((x) * (x))
+
+namespace latinime {
static inline float getSquaredDistanceFloat(float x1, float y1, float x2, float y2) {
- return squareFloat(x1 - x2) + squareFloat(y1 - y2);
+ const float deltaX = x1 - x2;
+ const float deltaY = y1 - y2;
+ return SQUARE_FLOAT(deltaX) + SQUARE_FLOAT(deltaY);
}
static inline float getDistanceFloat(float x1, float y1, float x2, float y2) {
@@ -52,9 +55,11 @@ static inline float getAngle(int x1, int y1, int x2, int y2) {
}
static inline float getAngleDiff(float a1, float a2) {
- const float diff = fabsf(a1 - a2);
+ const float deltaA = fabsf(a1 - a2);
+ const float diff = ROUND_FLOAT_10000(deltaA);
if (diff > M_PI_F) {
- return 2.0f * M_PI_F - diff;
+ const float normalizedDiff = 2.0f * M_PI_F - diff;
+ return ROUND_FLOAT_10000(normalizedDiff);
}
return diff;
}
@@ -76,7 +81,7 @@ static inline float pointToLineSegSquaredDistanceFloat(
const float ray2y = y2 - y1;
const float dotProduct = ray1x * ray2x + ray1y * ray2y;
- const float lineLengthSqr = squareFloat(ray2x) + squareFloat(ray2y);
+ const float lineLengthSqr = SQUARE_FLOAT(ray2x) + SQUARE_FLOAT(ray2y);
const float projectionLengthSqr = dotProduct / lineLengthSqr;
float projectionX;
diff --git a/native/jni/src/proximity_info.cpp b/native/jni/src/proximity_info.cpp
index 9bb8b29ae..c9f83b62c 100644
--- a/native/jni/src/proximity_info.cpp
+++ b/native/jni/src/proximity_info.cpp
@@ -67,7 +67,8 @@ ProximityInfo::ProximityInfo(JNIEnv *env, const jstring localeJStr, const int ma
&& keyWidths && keyHeights && keyCharCodes && sweetSpotCenterXs
&& sweetSpotCenterYs && sweetSpotRadii),
mProximityCharsArray(new int32_t[GRID_WIDTH * GRID_HEIGHT * MAX_PROXIMITY_CHARS_SIZE
- /* proximityGridLength */]) {
+ /* proximityGridLength */]),
+ mCodeToKeyMap() {
const int proximityGridLength = GRID_WIDTH * GRID_HEIGHT * MAX_PROXIMITY_CHARS_SIZE;
if (DEBUG_PROXIMITY_INFO) {
AKLOGI("Create proximity info array %d", proximityGridLength);
@@ -88,22 +89,9 @@ ProximityInfo::ProximityInfo(JNIEnv *env, const jstring localeJStr, const int ma
safeGetOrFillZeroFloatArrayRegion(env, sweetSpotCenterXs, KEY_COUNT, mSweetSpotCenterXs);
safeGetOrFillZeroFloatArrayRegion(env, sweetSpotCenterYs, KEY_COUNT, mSweetSpotCenterYs);
safeGetOrFillZeroFloatArrayRegion(env, sweetSpotRadii, KEY_COUNT, mSweetSpotRadii);
- initializeCodePointToKeyIndex();
initializeG();
}
-// Build the reversed look up table from the char code to the index in mKeyXCoordinates,
-// mKeyYCoordinates, mKeyWidths, mKeyHeights, mKeyCharCodes.
-void ProximityInfo::initializeCodePointToKeyIndex() {
- memset(mCodePointToKeyIndex, -1, sizeof(mCodePointToKeyIndex));
- for (int i = 0; i < KEY_COUNT; ++i) {
- const int code = mKeyCodePoints[i];
- if (0 <= code && code <= MAX_CHAR_CODE) {
- mCodePointToKeyIndex[code] = i;
- }
- }
-}
-
ProximityInfo::~ProximityInfo() {
delete[] mProximityCharsArray;
}
@@ -141,7 +129,9 @@ bool ProximityInfo::hasSpaceProximity(const int x, const int y) const {
static inline float getNormalizedSquaredDistanceFloat(float x1, float y1, float x2, float y2,
float scale) {
- return squareFloat((x1 - x2) / scale) + squareFloat((y1 - y2) / scale);
+ const float deltaX = x1 - x2;
+ const float deltaY = y1 - y2;
+ return (SQUARE_FLOAT(deltaX) + SQUARE_FLOAT(deltaY)) / SQUARE_FLOAT(scale);
}
float ProximityInfo::getNormalizedSquaredDistanceFromCenterFloat(
@@ -237,11 +227,12 @@ int ProximityInfo::getKeyIndexOf(const int c) const {
// We do not have the coordinate data
return NOT_AN_INDEX;
}
- const unsigned short baseLowerC = toBaseLowerCase(c);
- if (baseLowerC > MAX_CHAR_CODE) {
- return NOT_AN_INDEX;
+ const int baseLowerC = static_cast<int>(toBaseLowerCase(c));
+ hash_map_compat<int, int>::const_iterator mapPos = mCodeToKeyMap.find(baseLowerC);
+ if (mapPos != mCodeToKeyMap.end()) {
+ return mapPos->second;
}
- return mCodePointToKeyIndex[baseLowerC];
+ return NOT_AN_INDEX;
}
int ProximityInfo::getCodePointOf(const int keyIndex) const {
@@ -258,12 +249,8 @@ void ProximityInfo::initializeG() {
const int lowerCode = toBaseLowerCase(code);
mCenterXsG[i] = mKeyXCoordinates[i] + mKeyWidths[i] / 2;
mCenterYsG[i] = mKeyYCoordinates[i] + mKeyHeights[i] / 2;
- if (code != lowerCode && lowerCode >= 0 && lowerCode <= MAX_CHAR_CODE) {
- mCodePointToKeyIndex[lowerCode] = i;
- mKeyIndexToCodePointG[i] = lowerCode;
- } else {
- mKeyIndexToCodePointG[i] = code;
- }
+ mCodeToKeyMap[lowerCode] = i;
+ mKeyIndexToCodePointG[i] = lowerCode;
}
for (int i = 0; i < KEY_COUNT; i++) {
mKeyKeyDistancesG[i][i] = 0;
diff --git a/native/jni/src/proximity_info.h b/native/jni/src/proximity_info.h
index 45df6ff6a..2f258ef86 100644
--- a/native/jni/src/proximity_info.h
+++ b/native/jni/src/proximity_info.h
@@ -20,6 +20,7 @@
#include <stdint.h>
#include "defines.h"
+#include "hash_map_compat.h"
#include "jni.h"
namespace latinime {
@@ -112,12 +113,9 @@ class ProximityInfo {
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(ProximityInfo);
- // The upper limit of the char code in mCodePointToKeyIndex
- static const int MAX_CHAR_CODE = 127;
static const float NOT_A_DISTANCE_FLOAT;
int getStartIndexFromCoordinates(const int x, const int y) const;
- void initializeCodePointToKeyIndex();
void initializeG();
float calculateNormalizedSquaredDistance(const int keyIndex, const int inputIndex) const;
float calculateSquaredDistanceFromSweetSpotCenter(
@@ -154,7 +152,7 @@ class ProximityInfo {
float mSweetSpotCenterXs[MAX_KEY_COUNT_IN_A_KEYBOARD];
float mSweetSpotCenterYs[MAX_KEY_COUNT_IN_A_KEYBOARD];
float mSweetSpotRadii[MAX_KEY_COUNT_IN_A_KEYBOARD];
- int mCodePointToKeyIndex[MAX_CHAR_CODE + 1];
+ hash_map_compat<int, int> mCodeToKeyMap;
int mKeyIndexToCodePointG[MAX_KEY_COUNT_IN_A_KEYBOARD];
int mCenterXsG[MAX_KEY_COUNT_IN_A_KEYBOARD];
diff --git a/native/jni/src/proximity_info_state.cpp b/native/jni/src/proximity_info_state.cpp
index 208b69356..7e917a929 100644
--- a/native/jni/src/proximity_info_state.cpp
+++ b/native/jni/src/proximity_info_state.cpp
@@ -177,6 +177,10 @@ void ProximityInfoState::initInputParams(const int pointerId, const float maxPoi
hypotf(mProximityInfo->getKeyboardWidth(), mProximityInfo->getKeyboardHeight())
* READ_FORWORD_LENGTH_SCALE);
for (int i = 0; i < mInputSize; ++i) {
+ if (DEBUG_GEO_FULL) {
+ AKLOGI("Sampled(%d): x = %d, y = %d, time = %d", i, mInputXs[i], mInputYs[i],
+ mTimes[i]);
+ }
for (int j = max(i + 1, lastSavedInputSize); j < mInputSize; ++j) {
if (mLengthCache[j] - mLengthCache[i] >= readForwordLength) {
break;
diff --git a/native/jni/src/proximity_info_state.h b/native/jni/src/proximity_info_state.h
index fce4b5bdc..453b1de4d 100644
--- a/native/jni/src/proximity_info_state.h
+++ b/native/jni/src/proximity_info_state.h
@@ -37,8 +37,6 @@ class ProximityInfoState {
static const int NORMALIZED_SQUARED_DISTANCE_SCALING_FACTOR_LOG_2 = 10;
static const int NORMALIZED_SQUARED_DISTANCE_SCALING_FACTOR =
1 << NORMALIZED_SQUARED_DISTANCE_SCALING_FACTOR_LOG_2;
- // The upper limit of the char code in mCodeToKeyIndex
- static const int MAX_CHAR_CODE = 127;
static const float NOT_A_DISTANCE_FLOAT = -1.0f;
static const int NOT_A_CODE = -1;