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