Merge "Implement additional proximity characters in the native code Bug: 4343280"

main
satok 2012-03-13 01:41:46 -07:00 committed by Android (Google) Code Review
commit 8e08bfb8de
7 changed files with 157 additions and 16 deletions

View File

@ -76,7 +76,7 @@ public class ProximityInfo {
public static ProximityInfo createSpellCheckerProximityInfo(final int[] proximity) { public static ProximityInfo createSpellCheckerProximityInfo(final int[] proximity) {
final ProximityInfo spellCheckerProximityInfo = createDummyProximityInfo(); final ProximityInfo spellCheckerProximityInfo = createDummyProximityInfo();
spellCheckerProximityInfo.mNativeProximityInfo = spellCheckerProximityInfo.mNativeProximityInfo =
spellCheckerProximityInfo.setProximityInfoNative( spellCheckerProximityInfo.setProximityInfoNative("",
SpellCheckerProximityInfo.ROW_SIZE, 480, 300, 11, 3, (480 / 10), proximity, SpellCheckerProximityInfo.ROW_SIZE, 480, 300, 11, 3, (480 / 10), proximity,
0, null, null, null, null, null, null, null, null); 0, null, null, null, null, null, null, null, null);
return spellCheckerProximityInfo; return spellCheckerProximityInfo;
@ -87,7 +87,8 @@ public class ProximityInfo {
JniUtils.loadNativeLibrary(); JniUtils.loadNativeLibrary();
} }
private native long setProximityInfoNative(int maxProximityCharsSize, int displayWidth, private native long setProximityInfoNative(
String locale, int maxProximityCharsSize, int displayWidth,
int displayHeight, int gridWidth, int gridHeight, int displayHeight, int gridWidth, int gridHeight,
int mostCommonKeyWidth, int[] proximityCharsArray, int mostCommonKeyWidth, int[] proximityCharsArray,
int keyCount, int[] keyXCoordinates, int[] keyYCoordinates, int keyCount, int[] keyXCoordinates, int[] keyYCoordinates,
@ -154,7 +155,7 @@ public class ProximityInfo {
calculateSweetSpotParams = false; calculateSweetSpotParams = false;
} }
mNativeProximityInfo = setProximityInfoNative(MAX_PROXIMITY_CHARS_SIZE, mNativeProximityInfo = setProximityInfoNative("", MAX_PROXIMITY_CHARS_SIZE,
keyboardWidth, keyboardHeight, mGridWidth, mGridHeight, mMostCommonKeyWidth, keyboardWidth, keyboardHeight, mGridWidth, mGridHeight, mMostCommonKeyWidth,
proximityCharsArray, proximityCharsArray,
keyCount, keyXCoordinates, keyYCoordinates, keyWidths, keyHeights, keyCharCodes, keyCount, keyXCoordinates, keyYCoordinates, keyWidths, keyHeights, keyCharCodes,

View File

@ -30,6 +30,7 @@ LATIN_IME_JNI_SRC_FILES := \
jni_common.cpp jni_common.cpp
LATIN_IME_CORE_SRC_FILES := \ LATIN_IME_CORE_SRC_FILES := \
additional_proximity_chars.cpp \
basechars.cpp \ basechars.cpp \
bigram_dictionary.cpp \ bigram_dictionary.cpp \
char_utils.cpp \ char_utils.cpp \

View File

@ -25,16 +25,19 @@
#include <assert.h> #include <assert.h>
#include <errno.h> #include <errno.h>
#include <stdio.h> #include <stdio.h>
#include <string>
namespace latinime { 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, jstring localejStr, jint maxProximityCharsSize, jint displayWidth, jint displayHeight,
jint gridHeight, jint mostCommonkeyWidth, jintArray proximityCharsArray, jint keyCount, jint gridWidth, jint gridHeight, jint mostCommonkeyWidth, jintArray proximityCharsArray,
jintArray keyXCoordinateArray, jintArray keyYCoordinateArray, jintArray keyWidthArray, jint keyCount, jintArray keyXCoordinateArray, jintArray keyYCoordinateArray,
jintArray keyHeightArray, jintArray keyCharCodeArray, jintArray keyWidthArray, jintArray keyHeightArray, jintArray keyCharCodeArray,
jfloatArray sweetSpotCenterXArray, jfloatArray sweetSpotCenterYArray, jfloatArray sweetSpotCenterXArray, jfloatArray sweetSpotCenterYArray,
jfloatArray sweetSpotRadiusArray) { jfloatArray sweetSpotRadiusArray) {
const char *localeStrPtr = env->GetStringUTFChars(localejStr, 0);
const std::string localeStr(localeStrPtr);
jint *proximityChars = env->GetIntArrayElements(proximityCharsArray, 0); jint *proximityChars = env->GetIntArrayElements(proximityCharsArray, 0);
jint *keyXCoordinates = safeGetIntArrayElements(env, keyXCoordinateArray); jint *keyXCoordinates = safeGetIntArrayElements(env, keyXCoordinateArray);
jint *keyYCoordinates = safeGetIntArrayElements(env, keyYCoordinateArray); jint *keyYCoordinates = safeGetIntArrayElements(env, keyYCoordinateArray);
@ -44,7 +47,7 @@ static jlong latinime_Keyboard_setProximityInfo(JNIEnv *env, jobject object,
jfloat *sweetSpotCenterXs = safeGetFloatArrayElements(env, sweetSpotCenterXArray); jfloat *sweetSpotCenterXs = safeGetFloatArrayElements(env, sweetSpotCenterXArray);
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(localeStr, maxProximityCharsSize, displayWidth,
displayHeight, gridWidth, gridHeight, mostCommonkeyWidth, displayHeight, gridWidth, gridHeight, mostCommonkeyWidth,
(const uint32_t*)proximityChars, (const uint32_t*)proximityChars,
keyCount, (const int32_t*)keyXCoordinates, (const int32_t*)keyYCoordinates, keyCount, (const int32_t*)keyXCoordinates, (const int32_t*)keyYCoordinates,
@ -60,6 +63,7 @@ static jlong latinime_Keyboard_setProximityInfo(JNIEnv *env, jobject object,
safeReleaseIntArrayElements(env, keyYCoordinateArray, keyYCoordinates); safeReleaseIntArrayElements(env, keyYCoordinateArray, keyYCoordinates);
safeReleaseIntArrayElements(env, keyXCoordinateArray, keyXCoordinates); safeReleaseIntArrayElements(env, keyXCoordinateArray, keyXCoordinates);
env->ReleaseIntArrayElements(proximityCharsArray, proximityChars, 0); env->ReleaseIntArrayElements(proximityCharsArray, proximityChars, 0);
env->ReleaseStringUTFChars(localejStr, localeStrPtr);
return (jlong)proximityInfo; return (jlong)proximityInfo;
} }
@ -70,7 +74,7 @@ static void latinime_Keyboard_release(JNIEnv *env, jobject object, jlong proximi
} }
static JNINativeMethod sKeyboardMethods[] = { static JNINativeMethod sKeyboardMethods[] = {
{"setProximityInfoNative", "(IIIIII[II[I[I[I[I[I[F[F[F)J", {"setProximityInfoNative", "(Ljava/lang/String;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}
}; };

View File

@ -0,0 +1,41 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "additional_proximity_chars.h"
namespace latinime {
const std::string AdditionalProximityChars::LOCALE_EN_US("en");
const uint16_t AdditionalProximityChars::EN_US_ADDITIONAL_A[EN_US_ADDITIONAL_A_SIZE] = {
'e', 'i', 'o', 'u'
};
const uint16_t AdditionalProximityChars::EN_US_ADDITIONAL_E[EN_US_ADDITIONAL_E_SIZE] = {
'a', 'i', 'o', 'u'
};
const uint16_t AdditionalProximityChars::EN_US_ADDITIONAL_I[EN_US_ADDITIONAL_I_SIZE] = {
'a', 'e', 'o', 'u'
};
const uint16_t AdditionalProximityChars::EN_US_ADDITIONAL_O[EN_US_ADDITIONAL_O_SIZE] = {
'a', 'e', 'i', 'u'
};
const uint16_t AdditionalProximityChars::EN_US_ADDITIONAL_U[EN_US_ADDITIONAL_U_SIZE] = {
'a', 'e', 'i', 'o'
};
}

View File

@ -0,0 +1,92 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef LATINIME_ADDITIONAL_PROXIMITY_CHARS_H
#define LATINIME_ADDITIONAL_PROXIMITY_CHARS_H
#include <stdint.h>
#include <string>
namespace latinime {
class AdditionalProximityChars {
private:
static const std::string LOCALE_EN_US;
static const int EN_US_ADDITIONAL_A_SIZE = 4;
static const uint16_t EN_US_ADDITIONAL_A[];
static const int EN_US_ADDITIONAL_E_SIZE = 4;
static const uint16_t EN_US_ADDITIONAL_E[];
static const int EN_US_ADDITIONAL_I_SIZE = 4;
static const uint16_t EN_US_ADDITIONAL_I[];
static const int EN_US_ADDITIONAL_O_SIZE = 4;
static const uint16_t EN_US_ADDITIONAL_O[];
static const int EN_US_ADDITIONAL_U_SIZE = 4;
static const uint16_t EN_US_ADDITIONAL_U[];
static bool isEnLocale(std::string* locale_str) {
return locale_str && locale_str->size() >= LOCALE_EN_US.size()
&& locale_str->compare(0, LOCALE_EN_US.size(), LOCALE_EN_US);
}
public:
static int getAdditionalCharsSize(std::string* locale_str, uint16_t c) {
if (!isEnLocale(locale_str)) {
return 0;
}
switch(c) {
case 'a':
return EN_US_ADDITIONAL_A_SIZE;
case 'e':
return EN_US_ADDITIONAL_E_SIZE;
case 'i':
return EN_US_ADDITIONAL_I_SIZE;
case 'o':
return EN_US_ADDITIONAL_O_SIZE;
case 'u':
return EN_US_ADDITIONAL_U_SIZE;
default:
return 0;
}
}
static const uint16_t* getAdditionalChars(std::string* locale_str, uint16_t c) {
if (!isEnLocale(locale_str)) {
return 0;
}
switch(c) {
case 'a':
return EN_US_ADDITIONAL_A;
case 'e':
return EN_US_ADDITIONAL_E;
case 'i':
return EN_US_ADDITIONAL_I;
case 'o':
return EN_US_ADDITIONAL_O;
case 'u':
return EN_US_ADDITIONAL_U;
default:
return 0;
}
}
static bool hasAdditionalChars(std::string* locale_str, uint16_t c) {
return getAdditionalCharsSize(locale_str, c) > 0;
}
};
}
#endif // LATINIME_ADDITIONAL_PROXIMITY_CHARS_H

View File

@ -16,10 +16,11 @@
#include <assert.h> #include <assert.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string>
#define LOG_TAG "LatinIME: proximity_info.cpp" #define LOG_TAG "LatinIME: proximity_info.cpp"
#include "additional_proximity_chars.h"
#include "dictionary.h" #include "dictionary.h"
#include "proximity_info.h" #include "proximity_info.h"
@ -33,9 +34,9 @@ inline void copyOrFillZero(void *to, const void *from, size_t size) {
} }
} }
ProximityInfo::ProximityInfo(const int maxProximityCharsSize, const int keyboardWidth, ProximityInfo::ProximityInfo(const std::string localeStr, const int maxProximityCharsSize,
const int keyboardHeight, const int gridWidth, const int gridHeight, const int keyboardWidth, const int keyboardHeight, const int gridWidth,
const int mostCommonKeyWidth, 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,

View File

@ -18,6 +18,7 @@
#define LATINIME_PROXIMITY_INFO_H #define LATINIME_PROXIMITY_INFO_H
#include <stdint.h> #include <stdint.h>
#include <string>
#include "defines.h" #include "defines.h"
@ -43,9 +44,9 @@ class ProximityInfo {
ADDITIONAL_PROXIMITY_CHAR ADDITIONAL_PROXIMITY_CHAR
} ProximityType; } ProximityType;
ProximityInfo(const int maxProximityCharsSize, const int keyboardWidth, ProximityInfo(const std::string localeStr, const int maxProximityCharsSize,
const int keybaordHeight, const int gridWidth, const int gridHeight, const int keyboardWidth, const int keybaordHeight, const int gridWidth,
const int mostCommonkeyWidth, 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,