proximity_info_state.cpp revision 3e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cd
13e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka/* 23e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * Copyright (C) 2012 The Android Open Source Project 33e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * 43e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * Licensed under the Apache License, Version 2.0 (the "License"); 53e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * you may not use this file except in compliance with the License. 63e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * You may obtain a copy of the License at 73e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * 83e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * http://www.apache.org/licenses/LICENSE-2.0 93e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * 103e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * Unless required by applicable law or agreed to in writing, software 113e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * distributed under the License is distributed on an "AS IS" BASIS, 123e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * See the License for the specific language governing permissions and 143e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka * limitations under the License. 153e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka */ 163e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 173e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#include <assert.h> 183e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#include <stdint.h> 193e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#include <string> 203e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 213e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#define LOG_TAG "LatinIME: proximity_info_state.cpp" 223e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 233e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#include "additional_proximity_chars.h" 243e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#include "defines.h" 253e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#include "dictionary.h" 263e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#include "proximity_info.h" 273e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka#include "proximity_info_state.h" 283e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 293e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataokanamespace latinime { 303e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataokavoid ProximityInfoState::initInputParams(const int32_t* inputCodes, const int inputLength, 313e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int* xCoordinates, const int* yCoordinates) { 323e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka memset(mInputCodes, 0, 333e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka MAX_WORD_LENGTH_INTERNAL * MAX_PROXIMITY_CHARS_SIZE * sizeof(mInputCodes[0])); 343e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 353e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka for (int i = 0; i < inputLength; ++i) { 363e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int32_t primaryKey = inputCodes[i]; 373e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int x = xCoordinates[i]; 383e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int y = yCoordinates[i]; 393e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka int *proximities = &mInputCodes[i * MAX_PROXIMITY_CHARS_SIZE]; 403e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka mProximityInfo->calculateNearbyKeyCodes(x, y, primaryKey, proximities); 413e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 423e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka 433e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka if (DEBUG_PROXIMITY_CHARS) { 443e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka for (int i = 0; i < inputLength; ++i) { 453e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka AKLOGI("---"); 463e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka for (int j = 0; j < MAX_PROXIMITY_CHARS_SIZE; ++j) { 473e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka int icc = mInputCodes[i * MAX_PROXIMITY_CHARS_SIZE + j]; 483e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka int icfjc = inputCodes[i * MAX_PROXIMITY_CHARS_SIZE + j]; 493e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka icc += 0; 503e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka icfjc += 0; 513e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka AKLOGI("--- (%d)%c,%c", i, icc, icfjc); AKLOGI("--- A<%d>,B<%d>", icc, icfjc); 523e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 533e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 543e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 553e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka mInputXCoordinates = xCoordinates; 563e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka mInputYCoordinates = yCoordinates; 573e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka mTouchPositionCorrectionEnabled = HAS_TOUCH_POSITION_CORRECTION_DATA && xCoordinates 583e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka && yCoordinates; 593e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka mInputLength = inputLength; 603e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka for (int i = 0; i < inputLength; ++i) { 613e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka mPrimaryInputWord[i] = getPrimaryCharAt(i); 623e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 633e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka mPrimaryInputWord[inputLength] = 0; 643e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka if (DEBUG_PROXIMITY_CHARS) { 653e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka AKLOGI("--- initInputParams"); 663e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 673e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka for (int i = 0; i < mInputLength; ++i) { 683e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int *proximityChars = getProximityCharsAt(i); 693e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int primaryKey = proximityChars[0]; 703e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int x = xCoordinates[i]; 713e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int y = yCoordinates[i]; 723e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka if (DEBUG_PROXIMITY_CHARS) { 733e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka int a = x + y + primaryKey; 743e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka a += 0; 753e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka AKLOGI("--- Primary = %c, x = %d, y = %d", primaryKey, x, y); 763e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 773e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka for (int j = 0; j < MAX_PROXIMITY_CHARS_SIZE && proximityChars[j] > 0; ++j) { 783e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const int currentChar = proximityChars[j]; 793e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka const float squaredDistance = 803e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka hasInputCoordinates() ? calculateNormalizedSquaredDistance( 813e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka mProximityInfo->getKeyIndex(currentChar), i) : 823e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka NOT_A_DISTANCE_FLOAT; 833e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka if (squaredDistance >= 0.0f) { 843e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka mNormalizedSquaredDistances[i * MAX_PROXIMITY_CHARS_SIZE + j] = 853e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka (int) (squaredDistance * NORMALIZED_SQUARED_DISTANCE_SCALING_FACTOR); 863e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } else { 873e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka mNormalizedSquaredDistances[i * MAX_PROXIMITY_CHARS_SIZE + j] = 883e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka (j == 0) ? EQUIVALENT_CHAR_WITHOUT_DISTANCE_INFO : 893e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka PROXIMITY_CHAR_WITHOUT_DISTANCE_INFO; 903e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 913e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka if (DEBUG_PROXIMITY_CHARS) { 923e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka AKLOGI("--- Proximity (%d) = %c", j, currentChar); 933e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 943e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 953e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka } 963e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka} 973e8c58f68d53e6cc9dbf59201c7bdfb8ad04a1cdSatoshi Kataoka} // namespace latinime 98