Add functions to calculate proximity characters in the native code
Bug: 4343280 Change-Id: I17f8f6295b01900948b98680d0267753f33a46cfmain
parent
77541fc92e
commit
a70ee6e3b3
|
@ -44,10 +44,11 @@ public class ProximityInfo {
|
||||||
// TODO: Find a proper name for mKeyboardMinWidth
|
// TODO: Find a proper name for mKeyboardMinWidth
|
||||||
private final int mKeyboardMinWidth;
|
private final int mKeyboardMinWidth;
|
||||||
private final int mKeyboardHeight;
|
private final int mKeyboardHeight;
|
||||||
|
private final int mMostCommonKeyWidth;
|
||||||
private final Key[][] mGridNeighbors;
|
private final Key[][] mGridNeighbors;
|
||||||
|
|
||||||
ProximityInfo(int gridWidth, int gridHeight, int minWidth, int height, int keyWidth,
|
ProximityInfo(int gridWidth, int gridHeight, int minWidth, int height, int mostCommonKeyWidth,
|
||||||
int keyHeight, Set<Key> keys, TouchPositionCorrection touchPositionCorrection,
|
int mostCommonKeyHeight, Set<Key> keys, TouchPositionCorrection touchPositionCorrection,
|
||||||
Map<Integer, List<Integer>> additionalProximityChars) {
|
Map<Integer, List<Integer>> additionalProximityChars) {
|
||||||
mGridWidth = gridWidth;
|
mGridWidth = gridWidth;
|
||||||
mGridHeight = gridHeight;
|
mGridHeight = gridHeight;
|
||||||
|
@ -56,13 +57,15 @@ public class ProximityInfo {
|
||||||
mCellHeight = (height + mGridHeight - 1) / mGridHeight;
|
mCellHeight = (height + mGridHeight - 1) / mGridHeight;
|
||||||
mKeyboardMinWidth = minWidth;
|
mKeyboardMinWidth = minWidth;
|
||||||
mKeyboardHeight = height;
|
mKeyboardHeight = height;
|
||||||
mKeyHeight = keyHeight;
|
mKeyHeight = mostCommonKeyHeight;
|
||||||
|
mMostCommonKeyWidth = mostCommonKeyWidth;
|
||||||
mGridNeighbors = new Key[mGridSize][];
|
mGridNeighbors = new Key[mGridSize][];
|
||||||
if (minWidth == 0 || height == 0) {
|
if (minWidth == 0 || height == 0) {
|
||||||
// No proximity required. Keyboard might be more keys keyboard.
|
// No proximity required. Keyboard might be more keys keyboard.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
computeNearestNeighbors(keyWidth, keys, touchPositionCorrection, additionalProximityChars);
|
computeNearestNeighbors(
|
||||||
|
mostCommonKeyWidth, keys, touchPositionCorrection, additionalProximityChars);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ProximityInfo createDummyProximityInfo() {
|
public static ProximityInfo createDummyProximityInfo() {
|
||||||
|
@ -74,8 +77,8 @@ public class ProximityInfo {
|
||||||
final ProximityInfo spellCheckerProximityInfo = createDummyProximityInfo();
|
final ProximityInfo spellCheckerProximityInfo = createDummyProximityInfo();
|
||||||
spellCheckerProximityInfo.mNativeProximityInfo =
|
spellCheckerProximityInfo.mNativeProximityInfo =
|
||||||
spellCheckerProximityInfo.setProximityInfoNative(
|
spellCheckerProximityInfo.setProximityInfoNative(
|
||||||
SpellCheckerProximityInfo.ROW_SIZE, 480, 300, 11, 3, proximity, 0,
|
SpellCheckerProximityInfo.ROW_SIZE, 480, 300, 11, 3, (480 / 10), proximity,
|
||||||
null, null, null, null, null, null, null, null);
|
0, null, null, null, null, null, null, null, null);
|
||||||
return spellCheckerProximityInfo;
|
return spellCheckerProximityInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,7 +88,8 @@ public class ProximityInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
private native long setProximityInfoNative(int maxProximityCharsSize, int displayWidth,
|
private native long setProximityInfoNative(int maxProximityCharsSize, int displayWidth,
|
||||||
int displayHeight, int gridWidth, int gridHeight, int[] proximityCharsArray,
|
int displayHeight, int gridWidth, int gridHeight,
|
||||||
|
int mostCommonKeyWidth, int[] proximityCharsArray,
|
||||||
int keyCount, int[] keyXCoordinates, int[] keyYCoordinates,
|
int keyCount, int[] keyXCoordinates, int[] keyYCoordinates,
|
||||||
int[] keyWidths, int[] keyHeights, int[] keyCharCodes,
|
int[] keyWidths, int[] keyHeights, int[] keyCharCodes,
|
||||||
float[] sweetSpotCenterX, float[] sweetSpotCenterY, float[] sweetSpotRadii);
|
float[] sweetSpotCenterX, float[] sweetSpotCenterY, float[] sweetSpotRadii);
|
||||||
|
@ -151,7 +155,8 @@ public class ProximityInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
mNativeProximityInfo = setProximityInfoNative(MAX_PROXIMITY_CHARS_SIZE,
|
mNativeProximityInfo = setProximityInfoNative(MAX_PROXIMITY_CHARS_SIZE,
|
||||||
keyboardWidth, keyboardHeight, mGridWidth, mGridHeight, proximityCharsArray,
|
keyboardWidth, keyboardHeight, mGridWidth, mGridHeight, mMostCommonKeyWidth,
|
||||||
|
proximityCharsArray,
|
||||||
keyCount, keyXCoordinates, keyYCoordinates, keyWidths, keyHeights, keyCharCodes,
|
keyCount, keyXCoordinates, keyYCoordinates, keyWidths, keyHeights, keyCharCodes,
|
||||||
sweetSpotCenterXs, sweetSpotCenterYs, sweetSpotRadii);
|
sweetSpotCenterXs, sweetSpotCenterYs, sweetSpotRadii);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ namespace latinime {
|
||||||
|
|
||||||
static jlong latinime_Keyboard_setProximityInfo(JNIEnv *env, jobject object,
|
static jlong latinime_Keyboard_setProximityInfo(JNIEnv *env, jobject object,
|
||||||
jint maxProximityCharsSize, jint displayWidth, jint displayHeight, jint gridWidth,
|
jint maxProximityCharsSize, jint displayWidth, jint displayHeight, jint gridWidth,
|
||||||
jint gridHeight, jintArray proximityCharsArray, jint keyCount,
|
jint gridHeight, jint mostCommonkeyWidth, jintArray proximityCharsArray, jint keyCount,
|
||||||
jintArray keyXCoordinateArray, jintArray keyYCoordinateArray, jintArray keyWidthArray,
|
jintArray keyXCoordinateArray, jintArray keyYCoordinateArray, jintArray keyWidthArray,
|
||||||
jintArray keyHeightArray, jintArray keyCharCodeArray,
|
jintArray keyHeightArray, jintArray keyCharCodeArray,
|
||||||
jfloatArray sweetSpotCenterXArray, jfloatArray sweetSpotCenterYArray,
|
jfloatArray sweetSpotCenterXArray, jfloatArray sweetSpotCenterYArray,
|
||||||
|
@ -45,7 +45,8 @@ static jlong latinime_Keyboard_setProximityInfo(JNIEnv *env, jobject object,
|
||||||
jfloat *sweetSpotCenterYs = safeGetFloatArrayElements(env, sweetSpotCenterYArray);
|
jfloat *sweetSpotCenterYs = safeGetFloatArrayElements(env, sweetSpotCenterYArray);
|
||||||
jfloat *sweetSpotRadii = safeGetFloatArrayElements(env, sweetSpotRadiusArray);
|
jfloat *sweetSpotRadii = safeGetFloatArrayElements(env, sweetSpotRadiusArray);
|
||||||
ProximityInfo *proximityInfo = new ProximityInfo(maxProximityCharsSize, displayWidth,
|
ProximityInfo *proximityInfo = new ProximityInfo(maxProximityCharsSize, displayWidth,
|
||||||
displayHeight, gridWidth, gridHeight, (const uint32_t*)proximityChars,
|
displayHeight, gridWidth, gridHeight, mostCommonkeyWidth,
|
||||||
|
(const uint32_t*)proximityChars,
|
||||||
keyCount, (const int32_t*)keyXCoordinates, (const int32_t*)keyYCoordinates,
|
keyCount, (const int32_t*)keyXCoordinates, (const int32_t*)keyYCoordinates,
|
||||||
(const int32_t*)keyWidths, (const int32_t*)keyHeights, (const int32_t*)keyCharCodes,
|
(const int32_t*)keyWidths, (const int32_t*)keyHeights, (const int32_t*)keyCharCodes,
|
||||||
(const float*)sweetSpotCenterXs, (const float*)sweetSpotCenterYs,
|
(const float*)sweetSpotCenterXs, (const float*)sweetSpotCenterYs,
|
||||||
|
@ -69,7 +70,7 @@ static void latinime_Keyboard_release(JNIEnv *env, jobject object, jlong proximi
|
||||||
}
|
}
|
||||||
|
|
||||||
static JNINativeMethod sKeyboardMethods[] = {
|
static JNINativeMethod sKeyboardMethods[] = {
|
||||||
{"setProximityInfoNative", "(IIIII[II[I[I[I[I[I[F[F[F)J",
|
{"setProximityInfoNative", "(IIIIII[II[I[I[I[I[I[F[F[F)J",
|
||||||
(void*)latinime_Keyboard_setProximityInfo},
|
(void*)latinime_Keyboard_setProximityInfo},
|
||||||
{"releaseProximityInfoNative", "(J)V", (void*)latinime_Keyboard_release}
|
{"releaseProximityInfoNative", "(J)V", (void*)latinime_Keyboard_release}
|
||||||
};
|
};
|
||||||
|
|
|
@ -35,12 +35,14 @@ inline void copyOrFillZero(void *to, const void *from, size_t size) {
|
||||||
|
|
||||||
ProximityInfo::ProximityInfo(const int maxProximityCharsSize, const int keyboardWidth,
|
ProximityInfo::ProximityInfo(const int maxProximityCharsSize, const int keyboardWidth,
|
||||||
const int keyboardHeight, const int gridWidth, const int gridHeight,
|
const int keyboardHeight, const int gridWidth, const int gridHeight,
|
||||||
|
const int mostCommonKeyWidth,
|
||||||
const uint32_t *proximityCharsArray, const int keyCount, const int32_t *keyXCoordinates,
|
const uint32_t *proximityCharsArray, const int keyCount, const int32_t *keyXCoordinates,
|
||||||
const int32_t *keyYCoordinates, const int32_t *keyWidths, const int32_t *keyHeights,
|
const int32_t *keyYCoordinates, const int32_t *keyWidths, const int32_t *keyHeights,
|
||||||
const int32_t *keyCharCodes, const float *sweetSpotCenterXs, const float *sweetSpotCenterYs,
|
const int32_t *keyCharCodes, const float *sweetSpotCenterXs, const float *sweetSpotCenterYs,
|
||||||
const float *sweetSpotRadii)
|
const float *sweetSpotRadii)
|
||||||
: MAX_PROXIMITY_CHARS_SIZE(maxProximityCharsSize), KEYBOARD_WIDTH(keyboardWidth),
|
: MAX_PROXIMITY_CHARS_SIZE(maxProximityCharsSize), KEYBOARD_WIDTH(keyboardWidth),
|
||||||
KEYBOARD_HEIGHT(keyboardHeight), GRID_WIDTH(gridWidth), GRID_HEIGHT(gridHeight),
|
KEYBOARD_HEIGHT(keyboardHeight), GRID_WIDTH(gridWidth), GRID_HEIGHT(gridHeight),
|
||||||
|
MOST_COMMON_KEY_WIDTH_SQUARE(mostCommonKeyWidth * mostCommonKeyWidth),
|
||||||
CELL_WIDTH((keyboardWidth + gridWidth - 1) / gridWidth),
|
CELL_WIDTH((keyboardWidth + gridWidth - 1) / gridWidth),
|
||||||
CELL_HEIGHT((keyboardHeight + gridHeight - 1) / gridHeight),
|
CELL_HEIGHT((keyboardHeight + gridHeight - 1) / gridHeight),
|
||||||
KEY_COUNT(min(keyCount, MAX_KEY_COUNT_IN_A_KEYBOARD)),
|
KEY_COUNT(min(keyCount, MAX_KEY_COUNT_IN_A_KEYBOARD)),
|
||||||
|
@ -123,6 +125,47 @@ bool ProximityInfo::hasSpaceProximity(const int x, const int y) const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ProximityInfo::isOnKey(const int keyId, const int x, const int y) {
|
||||||
|
const int left = mKeyXCoordinates[keyId];
|
||||||
|
const int top = mKeyYCoordinates[keyId];
|
||||||
|
const int right = left + mKeyWidths[keyId] + 1;
|
||||||
|
const int bottom = top + mKeyHeights[keyId];
|
||||||
|
return left < right && top < bottom && x >= left && x < right && y >= top && y < bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ProximityInfo::squaredDistanceToEdge(const int keyId, const int x, const int y) {
|
||||||
|
const int left = mKeyXCoordinates[keyId];
|
||||||
|
const int top = mKeyYCoordinates[keyId];
|
||||||
|
const int right = left + mKeyWidths[keyId] + 1;
|
||||||
|
const int bottom = top + mKeyHeights[keyId];
|
||||||
|
const int edgeX = x < left ? left : (x > right ? right : x);
|
||||||
|
const int edgeY = y < top ? top : (y > bottom ? bottom : y);
|
||||||
|
const int dx = x - edgeX;
|
||||||
|
const int dy = y - edgeY;
|
||||||
|
return dx * dx + dy * dy;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProximityInfo::calculateNearbyKeyCodes(
|
||||||
|
const int x, const int y, const uint32_t primaryKey, int *inputCodes) {
|
||||||
|
int insertPos = 0;
|
||||||
|
inputCodes[insertPos++] = primaryKey;
|
||||||
|
const int startIndex = getStartIndexFromCoordinates(x, y);
|
||||||
|
for (int i = 0; i < MAX_PROXIMITY_CHARS_SIZE; ++i) {
|
||||||
|
const uint32_t c = mProximityCharsArray[startIndex + i];
|
||||||
|
if (c < KEYCODE_SPACE || c == primaryKey) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (int j = 0; j < KEY_COUNT; ++j) {
|
||||||
|
const bool onKey = isOnKey(j, x, y);
|
||||||
|
const int distance = squaredDistanceToEdge(j, x, y);
|
||||||
|
if (onKey || distance < MOST_COMMON_KEY_WIDTH_SQUARE) {
|
||||||
|
inputCodes[insertPos++] = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO: calculate additional chars
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Calculate nearby codes here.
|
// TODO: Calculate nearby codes here.
|
||||||
void ProximityInfo::setInputParams(const int* inputCodes, const int inputLength,
|
void ProximityInfo::setInputParams(const int* inputCodes, const int inputLength,
|
||||||
const int* xCoordinates, const int* yCoordinates) {
|
const int* xCoordinates, const int* yCoordinates) {
|
||||||
|
|
|
@ -45,6 +45,7 @@ class ProximityInfo {
|
||||||
|
|
||||||
ProximityInfo(const int maxProximityCharsSize, const int keyboardWidth,
|
ProximityInfo(const int maxProximityCharsSize, const int keyboardWidth,
|
||||||
const int keybaordHeight, const int gridWidth, const int gridHeight,
|
const int keybaordHeight, const int gridWidth, const int gridHeight,
|
||||||
|
const int mostCommonkeyWidth,
|
||||||
const uint32_t *proximityCharsArray, const int keyCount, const int32_t *keyXCoordinates,
|
const uint32_t *proximityCharsArray, const int keyCount, const int32_t *keyXCoordinates,
|
||||||
const int32_t *keyYCoordinates, const int32_t *keyWidths, const int32_t *keyHeights,
|
const int32_t *keyYCoordinates, const int32_t *keyWidths, const int32_t *keyHeights,
|
||||||
const int32_t *keyCharCodes, const float *sweetSpotCenterXs,
|
const int32_t *keyCharCodes, const float *sweetSpotCenterXs,
|
||||||
|
@ -87,12 +88,17 @@ class ProximityInfo {
|
||||||
// the radius of the key is assigned to zero.
|
// the radius of the key is assigned to zero.
|
||||||
return mSweetSpotRadii[keyIndex] > 0.0;
|
return mSweetSpotRadii[keyIndex] > 0.0;
|
||||||
}
|
}
|
||||||
|
bool isOnKey(const int keyId, const int x, const int y);
|
||||||
|
int squaredDistanceToEdge(const int keyId, const int x, const int y);
|
||||||
|
void calculateNearbyKeyCodes(
|
||||||
|
const int x, const int y, const uint32_t primaryKey, int *inputCodes);
|
||||||
|
|
||||||
const int MAX_PROXIMITY_CHARS_SIZE;
|
const int MAX_PROXIMITY_CHARS_SIZE;
|
||||||
const int KEYBOARD_WIDTH;
|
const int KEYBOARD_WIDTH;
|
||||||
const int KEYBOARD_HEIGHT;
|
const int KEYBOARD_HEIGHT;
|
||||||
const int GRID_WIDTH;
|
const int GRID_WIDTH;
|
||||||
const int GRID_HEIGHT;
|
const int GRID_HEIGHT;
|
||||||
|
const int MOST_COMMON_KEY_WIDTH_SQUARE;
|
||||||
const int CELL_WIDTH;
|
const int CELL_WIDTH;
|
||||||
const int CELL_HEIGHT;
|
const int CELL_HEIGHT;
|
||||||
const int KEY_COUNT;
|
const int KEY_COUNT;
|
||||||
|
|
Loading…
Reference in New Issue