Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f0d5a783 authored by satok's avatar satok Committed by Android (Google) Code Review
Browse files

Merge "Add functions to calculate proximity characters in the native code"

parents e03b4294 a70ee6e3
Loading
Loading
Loading
Loading
+13 −8
Original line number Diff line number Diff line
@@ -44,10 +44,11 @@ public class ProximityInfo {
    // TODO: Find a proper name for mKeyboardMinWidth
    private final int mKeyboardMinWidth;
    private final int mKeyboardHeight;
    private final int mMostCommonKeyWidth;
    private final Key[][] mGridNeighbors;

    ProximityInfo(int gridWidth, int gridHeight, int minWidth, int height, int keyWidth,
            int keyHeight, Set<Key> keys, TouchPositionCorrection touchPositionCorrection,
    ProximityInfo(int gridWidth, int gridHeight, int minWidth, int height, int mostCommonKeyWidth,
            int mostCommonKeyHeight, Set<Key> keys, TouchPositionCorrection touchPositionCorrection,
            Map<Integer, List<Integer>> additionalProximityChars) {
        mGridWidth = gridWidth;
        mGridHeight = gridHeight;
@@ -56,13 +57,15 @@ public class ProximityInfo {
        mCellHeight = (height + mGridHeight - 1) / mGridHeight;
        mKeyboardMinWidth = minWidth;
        mKeyboardHeight = height;
        mKeyHeight = keyHeight;
        mKeyHeight = mostCommonKeyHeight;
        mMostCommonKeyWidth = mostCommonKeyWidth;
        mGridNeighbors = new Key[mGridSize][];
        if (minWidth == 0 || height == 0) {
            // No proximity required. Keyboard might be more keys keyboard.
            return;
        }
        computeNearestNeighbors(keyWidth, keys, touchPositionCorrection, additionalProximityChars);
        computeNearestNeighbors(
                mostCommonKeyWidth, keys, touchPositionCorrection, additionalProximityChars);
    }

    public static ProximityInfo createDummyProximityInfo() {
@@ -74,8 +77,8 @@ public class ProximityInfo {
        final ProximityInfo spellCheckerProximityInfo = createDummyProximityInfo();
        spellCheckerProximityInfo.mNativeProximityInfo =
                spellCheckerProximityInfo.setProximityInfoNative(
                        SpellCheckerProximityInfo.ROW_SIZE, 480, 300, 11, 3, proximity, 0,
                        null, null, null, null, null, null, null, null);
                        SpellCheckerProximityInfo.ROW_SIZE, 480, 300, 11, 3, (480 / 10), proximity,
                        0, null, null, null, null, null, null, null, null);
        return spellCheckerProximityInfo;
    }

@@ -85,7 +88,8 @@ public class ProximityInfo {
    }

    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[] keyWidths, int[] keyHeights, int[] keyCharCodes,
            float[] sweetSpotCenterX, float[] sweetSpotCenterY, float[] sweetSpotRadii);
@@ -151,7 +155,8 @@ public class ProximityInfo {
        }

        mNativeProximityInfo = setProximityInfoNative(MAX_PROXIMITY_CHARS_SIZE,
                keyboardWidth, keyboardHeight, mGridWidth, mGridHeight, proximityCharsArray,
                keyboardWidth, keyboardHeight, mGridWidth, mGridHeight, mMostCommonKeyWidth,
                proximityCharsArray,
                keyCount, keyXCoordinates, keyYCoordinates, keyWidths, keyHeights, keyCharCodes,
                sweetSpotCenterXs, sweetSpotCenterYs, sweetSpotRadii);
    }
+4 −3
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ namespace latinime {

static jlong latinime_Keyboard_setProximityInfo(JNIEnv *env, jobject object,
        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 keyHeightArray, jintArray keyCharCodeArray,
        jfloatArray sweetSpotCenterXArray, jfloatArray sweetSpotCenterYArray,
@@ -45,7 +45,8 @@ static jlong latinime_Keyboard_setProximityInfo(JNIEnv *env, jobject object,
    jfloat *sweetSpotCenterYs = safeGetFloatArrayElements(env, sweetSpotCenterYArray);
    jfloat *sweetSpotRadii = safeGetFloatArrayElements(env, sweetSpotRadiusArray);
    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,
            (const int32_t*)keyWidths, (const int32_t*)keyHeights, (const int32_t*)keyCharCodes,
            (const float*)sweetSpotCenterXs, (const float*)sweetSpotCenterYs,
@@ -69,7 +70,7 @@ static void latinime_Keyboard_release(JNIEnv *env, jobject object, jlong proximi
}

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},
    {"releaseProximityInfoNative", "(J)V", (void*)latinime_Keyboard_release}
};
+43 −0
Original line number Diff line number Diff line
@@ -35,12 +35,14 @@ inline void copyOrFillZero(void *to, const void *from, size_t size) {

ProximityInfo::ProximityInfo(const int maxProximityCharsSize, const int keyboardWidth,
        const int keyboardHeight, const int gridWidth, const int gridHeight,
        const int mostCommonKeyWidth,
        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 *keyCharCodes, const float *sweetSpotCenterXs, const float *sweetSpotCenterYs,
        const float *sweetSpotRadii)
        : MAX_PROXIMITY_CHARS_SIZE(maxProximityCharsSize), KEYBOARD_WIDTH(keyboardWidth),
          KEYBOARD_HEIGHT(keyboardHeight), GRID_WIDTH(gridWidth), GRID_HEIGHT(gridHeight),
          MOST_COMMON_KEY_WIDTH_SQUARE(mostCommonKeyWidth * mostCommonKeyWidth),
          CELL_WIDTH((keyboardWidth + gridWidth - 1) / gridWidth),
          CELL_HEIGHT((keyboardHeight + gridHeight - 1) / gridHeight),
          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;
}

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.
void ProximityInfo::setInputParams(const int* inputCodes, const int inputLength,
        const int* xCoordinates, const int* yCoordinates) {
+7 −1
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ class ProximityInfo {

    ProximityInfo(const int maxProximityCharsSize, const int keyboardWidth,
            const int keybaordHeight, const int gridWidth, const int gridHeight,
            const int mostCommonkeyWidth,
            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 *keyCharCodes, const float *sweetSpotCenterXs,
@@ -87,12 +88,17 @@ class ProximityInfo {
        // the radius of the key is assigned to zero.
        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 KEYBOARD_WIDTH;
    const int KEYBOARD_HEIGHT;
    const int GRID_WIDTH;
    const int GRID_HEIGHT;
    const int MOST_COMMON_KEY_WIDTH_SQUARE;
    const int CELL_WIDTH;
    const int CELL_HEIGHT;
    const int KEY_COUNT;