diff options
Diffstat (limited to 'native')
-rw-r--r-- | native/jni/src/geometry_utils.h | 21 | ||||
-rw-r--r-- | native/jni/src/proximity_info.cpp | 37 | ||||
-rw-r--r-- | native/jni/src/proximity_info.h | 6 | ||||
-rw-r--r-- | native/jni/src/proximity_info_state.cpp | 4 | ||||
-rw-r--r-- | native/jni/src/proximity_info_state.h | 2 |
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; |