diff options
Diffstat (limited to 'native/src/proximity_info.cpp')
-rw-r--r-- | native/src/proximity_info.cpp | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/native/src/proximity_info.cpp b/native/src/proximity_info.cpp index 361bdacbf..94cccc382 100644 --- a/native/src/proximity_info.cpp +++ b/native/src/proximity_info.cpp @@ -14,11 +14,13 @@ * limitations under the License. */ +#include <assert.h> #include <stdio.h> #include <string.h> #define LOG_TAG "LatinIME: proximity_info.cpp" +#include "defines_touch_position_correction.h" #include "dictionary.h" #include "proximity_info.h" @@ -26,17 +28,59 @@ namespace latinime { ProximityInfo::ProximityInfo(const int maxProximityCharsSize, const int keyboardWidth, const int keyboardHeight, const int gridWidth, const int gridHeight, - const uint32_t *proximityCharsArray) + 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) : MAX_PROXIMITY_CHARS_SIZE(maxProximityCharsSize), KEYBOARD_WIDTH(keyboardWidth), KEYBOARD_HEIGHT(keyboardHeight), GRID_WIDTH(gridWidth), GRID_HEIGHT(gridHeight), 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)) { const int len = GRID_WIDTH * GRID_HEIGHT * MAX_PROXIMITY_CHARS_SIZE; mProximityCharsArray = new uint32_t[len]; if (DEBUG_PROXIMITY_INFO) { LOGI("Create proximity info array %d", len); } memcpy(mProximityCharsArray, proximityCharsArray, len * sizeof(mProximityCharsArray[0])); + + if (KEY_COUNT > 0) { + if (DEBUG_PROXIMITY_INFO) { + LOGI("Create key coordinate array %d", keyCount); + } + memcpy(mKeyXCoordinates, keyXCoordinates, KEY_COUNT * sizeof(mKeyXCoordinates[0])); + memcpy(mKeyYCoordinates, keyYCoordinates, KEY_COUNT * sizeof(mKeyYCoordinates[0])); + memcpy(mKeyWidths, keyWidths, KEY_COUNT * sizeof(mKeyWidths[0])); + memcpy(mKeyHeights, keyHeights, KEY_COUNT * sizeof(mKeyHeights[0])); + memcpy(mKeyCharCodes, keyCharCodes, KEY_COUNT * sizeof(mKeyCharCodes[0])); + } + + initializeCodeToGroup(); + initializeCodeToKeyIndex(); +} + +// Build the reversed look up table from the char code to the index in its group. +// see TOUCH_POSITION_CORRECTION_GROUPS +void ProximityInfo::initializeCodeToGroup() { + memset(mCodeToGroup, -1, (MAX_GROUPED_CHAR_CODE + 1) * sizeof(mCodeToGroup[0])); + for (int i = 0; i < CORRECTION_GROUP_COUNT; ++i) { + const char *group = TOUCH_POSITION_CORRECTION_GROUPS[i]; + for (int j = 0; group[j]; ++j) { + const int code = group[j]; + if (0 <= code && code <= MAX_GROUPED_CHAR_CODE) + mCodeToGroup[code] = i; + } + } +} + +// Build the reversed look up table from the char code to the index in mKeyXCoordinates, +// mKeyYCoordinates, mKeyWidths, mKeyHeights, mKeyCharCodes. +void ProximityInfo::initializeCodeToKeyIndex() { + memset(mCodeToKeyIndex, -1, (MAX_GROUPED_CHAR_CODE + 1) * sizeof(mCodeToKeyIndex[0])); + for (int i = 0; i < KEY_COUNT; ++i) { + const int code = mKeyCharCodes[i]; + if (0 <= code && code <= MAX_GROUPED_CHAR_CODE) + mCodeToKeyIndex[code] = i; + } } ProximityInfo::~ProximityInfo() { @@ -162,4 +206,7 @@ bool ProximityInfo::sameAsTyped(const unsigned short *word, int length) const { return true; } +const int ProximityInfo::MAX_KEY_COUNT_IN_A_KEYBOARD; +const int ProximityInfo::MAX_GROUPED_CHAR_CODE; + } // namespace latinime |