Loading java/src/com/android/inputmethod/latin/BinaryDictionary.java +3 −2 Original line number Diff line number Diff line Loading @@ -144,9 +144,10 @@ public class BinaryDictionary extends Dictionary { ++len; } if (len > 0) { final int score = SuggestedWordInfo.KIND_WHITELIST == mOutputTypes[j] ? SuggestedWordInfo.MAX_SCORE : mOutputScores[j]; suggestions.add(new SuggestedWordInfo( new String(mOutputChars, start, len), mOutputScores[j], SuggestedWordInfo.KIND_CORRECTION, mDictType)); new String(mOutputChars, start, len), score, mOutputTypes[j], mDictType)); } } return suggestions; Loading native/jni/src/unigram_dictionary.cpp +10 −8 Original line number Diff line number Diff line Loading @@ -63,8 +63,8 @@ static inline unsigned int getCodesBufferSize(const int *codes, const int codesS // TODO: This needs to take a const unsigned short* and not tinker with its contents static inline void addWord( unsigned short *word, int length, int frequency, WordsPriorityQueue *queue) { queue->push(frequency, word, length); unsigned short *word, int length, int frequency, WordsPriorityQueue *queue, int type) { queue->push(frequency, word, length, type); } // Return the replacement code point for a digraph, or 0 if none. Loading Loading @@ -213,8 +213,8 @@ int UnigramDictionary::getSuggestions(ProximityInfo *proximityInfo, AKLOGI("Max normalized score = %f", ns); } const int suggestedWordsCount = queuePool.getMasterQueue()->outputSuggestions( masterCorrection.getPrimaryInputWord(), codesSize, frequencies, outWords); queuePool.getMasterQueue()->outputSuggestions(masterCorrection.getPrimaryInputWord(), codesSize, frequencies, outWords, outputTypes); if (DEBUG_DICT) { float ns = queuePool.getMasterQueue()->getHighestNormalizedScore( Loading Loading @@ -391,7 +391,8 @@ inline void UnigramDictionary::onTerminal(const int probability, const int finalProbability = correction->getFinalProbability(probability, &wordPointer, &wordLength); if (finalProbability != NOT_A_PROBABILITY) { addWord(wordPointer, wordLength, finalProbability, masterQueue); addWord(wordPointer, wordLength, finalProbability, masterQueue, Dictionary::KIND_CORRECTION); const int shortcutProbability = finalProbability > 0 ? finalProbability - 1 : 0; // Please note that the shortcut candidates will be added to the master queue only. Loading @@ -409,7 +410,7 @@ inline void UnigramDictionary::onTerminal(const int probability, const int shortcutTargetStringLength = iterator.getNextShortcutTarget( MAX_WORD_LENGTH_INTERNAL, shortcutTarget); addWord(shortcutTarget, shortcutTargetStringLength, shortcutProbability, masterQueue); masterQueue, Dictionary::KIND_CORRECTION); } } } Loading @@ -424,7 +425,7 @@ inline void UnigramDictionary::onTerminal(const int probability, } const int finalProbability = correction->getFinalProbabilityForSubQueue( probability, &wordPointer, &wordLength, inputIndex); addWord(wordPointer, wordLength, finalProbability, subQueue); addWord(wordPointer, wordLength, finalProbability, subQueue, Dictionary::KIND_CORRECTION); } } Loading Loading @@ -572,7 +573,8 @@ int UnigramDictionary::getSubStringSuggestion( AKLOGI("Split two words: freq = %d, length = %d, %d, isSpace ? %d", pairFreq, inputLength, tempOutputWordLength, isSpaceProximity); } addWord(outputWord, tempOutputWordLength, pairFreq, queuePool->getMasterQueue()); addWord(outputWord, tempOutputWordLength, pairFreq, queuePool->getMasterQueue(), Dictionary::KIND_CORRECTION); } return FLAG_MULTIPLE_SUGGEST_CONTINUE; } Loading native/jni/src/words_priority_queue.h +10 −7 Original line number Diff line number Diff line Loading @@ -33,12 +33,14 @@ class WordsPriorityQueue { unsigned short mWord[MAX_WORD_LENGTH_INTERNAL]; int mWordLength; bool mUsed; int mType; void setParams(int score, unsigned short *word, int wordLength) { void setParams(int score, unsigned short *word, int wordLength, int type) { mScore = score; mWordLength = wordLength; memcpy(mWord, word, sizeof(unsigned short) * wordLength); mUsed = true; mType = type; } }; Loading @@ -56,7 +58,7 @@ class WordsPriorityQueue { delete[] mSuggestedWords; } void push(int score, unsigned short *word, int wordLength) { void push(int score, unsigned short *word, int wordLength, int type) { SuggestedWord *sw = 0; if (mSuggestions.size() >= MAX_WORDS) { sw = mSuggestions.top(); Loading @@ -69,9 +71,9 @@ class WordsPriorityQueue { } } if (sw == 0) { sw = getFreeSuggestedWord(score, word, wordLength); sw = getFreeSuggestedWord(score, word, wordLength, type); } else { sw->setParams(score, word, wordLength); sw->setParams(score, word, wordLength, type); } if (sw == 0) { AKLOGE("SuggestedWord is accidentally null."); Loading @@ -94,7 +96,7 @@ class WordsPriorityQueue { } int outputSuggestions(const unsigned short *before, const int beforeLength, int *frequencies, unsigned short *outputChars) { int *frequencies, unsigned short *outputChars, int* outputTypes) { mHighestSuggestedWord = 0; const unsigned int size = min( MAX_WORDS, static_cast<unsigned int>(mSuggestions.size())); Loading Loading @@ -140,6 +142,7 @@ class WordsPriorityQueue { const unsigned int wordLength = sw->mWordLength; char *targetAdr = (char*) outputChars + i * MAX_WORD_LENGTH * sizeof(short); frequencies[i] = sw->mScore; outputTypes[i] = sw->mType; memcpy(targetAdr, sw->mWord, (wordLength) * sizeof(short)); if (wordLength < MAX_WORD_LENGTH) { ((unsigned short*) targetAdr)[wordLength] = 0; Loading Loading @@ -191,10 +194,10 @@ class WordsPriorityQueue { }; SuggestedWord *getFreeSuggestedWord(int score, unsigned short *word, int wordLength) { int wordLength, int type) { for (unsigned int i = 0; i < MAX_WORD_LENGTH; ++i) { if (!mSuggestedWords[i].mUsed) { mSuggestedWords[i].setParams(score, word, wordLength); mSuggestedWords[i].setParams(score, word, wordLength, type); return &mSuggestedWords[i]; } } Loading Loading
java/src/com/android/inputmethod/latin/BinaryDictionary.java +3 −2 Original line number Diff line number Diff line Loading @@ -144,9 +144,10 @@ public class BinaryDictionary extends Dictionary { ++len; } if (len > 0) { final int score = SuggestedWordInfo.KIND_WHITELIST == mOutputTypes[j] ? SuggestedWordInfo.MAX_SCORE : mOutputScores[j]; suggestions.add(new SuggestedWordInfo( new String(mOutputChars, start, len), mOutputScores[j], SuggestedWordInfo.KIND_CORRECTION, mDictType)); new String(mOutputChars, start, len), score, mOutputTypes[j], mDictType)); } } return suggestions; Loading
native/jni/src/unigram_dictionary.cpp +10 −8 Original line number Diff line number Diff line Loading @@ -63,8 +63,8 @@ static inline unsigned int getCodesBufferSize(const int *codes, const int codesS // TODO: This needs to take a const unsigned short* and not tinker with its contents static inline void addWord( unsigned short *word, int length, int frequency, WordsPriorityQueue *queue) { queue->push(frequency, word, length); unsigned short *word, int length, int frequency, WordsPriorityQueue *queue, int type) { queue->push(frequency, word, length, type); } // Return the replacement code point for a digraph, or 0 if none. Loading Loading @@ -213,8 +213,8 @@ int UnigramDictionary::getSuggestions(ProximityInfo *proximityInfo, AKLOGI("Max normalized score = %f", ns); } const int suggestedWordsCount = queuePool.getMasterQueue()->outputSuggestions( masterCorrection.getPrimaryInputWord(), codesSize, frequencies, outWords); queuePool.getMasterQueue()->outputSuggestions(masterCorrection.getPrimaryInputWord(), codesSize, frequencies, outWords, outputTypes); if (DEBUG_DICT) { float ns = queuePool.getMasterQueue()->getHighestNormalizedScore( Loading Loading @@ -391,7 +391,8 @@ inline void UnigramDictionary::onTerminal(const int probability, const int finalProbability = correction->getFinalProbability(probability, &wordPointer, &wordLength); if (finalProbability != NOT_A_PROBABILITY) { addWord(wordPointer, wordLength, finalProbability, masterQueue); addWord(wordPointer, wordLength, finalProbability, masterQueue, Dictionary::KIND_CORRECTION); const int shortcutProbability = finalProbability > 0 ? finalProbability - 1 : 0; // Please note that the shortcut candidates will be added to the master queue only. Loading @@ -409,7 +410,7 @@ inline void UnigramDictionary::onTerminal(const int probability, const int shortcutTargetStringLength = iterator.getNextShortcutTarget( MAX_WORD_LENGTH_INTERNAL, shortcutTarget); addWord(shortcutTarget, shortcutTargetStringLength, shortcutProbability, masterQueue); masterQueue, Dictionary::KIND_CORRECTION); } } } Loading @@ -424,7 +425,7 @@ inline void UnigramDictionary::onTerminal(const int probability, } const int finalProbability = correction->getFinalProbabilityForSubQueue( probability, &wordPointer, &wordLength, inputIndex); addWord(wordPointer, wordLength, finalProbability, subQueue); addWord(wordPointer, wordLength, finalProbability, subQueue, Dictionary::KIND_CORRECTION); } } Loading Loading @@ -572,7 +573,8 @@ int UnigramDictionary::getSubStringSuggestion( AKLOGI("Split two words: freq = %d, length = %d, %d, isSpace ? %d", pairFreq, inputLength, tempOutputWordLength, isSpaceProximity); } addWord(outputWord, tempOutputWordLength, pairFreq, queuePool->getMasterQueue()); addWord(outputWord, tempOutputWordLength, pairFreq, queuePool->getMasterQueue(), Dictionary::KIND_CORRECTION); } return FLAG_MULTIPLE_SUGGEST_CONTINUE; } Loading
native/jni/src/words_priority_queue.h +10 −7 Original line number Diff line number Diff line Loading @@ -33,12 +33,14 @@ class WordsPriorityQueue { unsigned short mWord[MAX_WORD_LENGTH_INTERNAL]; int mWordLength; bool mUsed; int mType; void setParams(int score, unsigned short *word, int wordLength) { void setParams(int score, unsigned short *word, int wordLength, int type) { mScore = score; mWordLength = wordLength; memcpy(mWord, word, sizeof(unsigned short) * wordLength); mUsed = true; mType = type; } }; Loading @@ -56,7 +58,7 @@ class WordsPriorityQueue { delete[] mSuggestedWords; } void push(int score, unsigned short *word, int wordLength) { void push(int score, unsigned short *word, int wordLength, int type) { SuggestedWord *sw = 0; if (mSuggestions.size() >= MAX_WORDS) { sw = mSuggestions.top(); Loading @@ -69,9 +71,9 @@ class WordsPriorityQueue { } } if (sw == 0) { sw = getFreeSuggestedWord(score, word, wordLength); sw = getFreeSuggestedWord(score, word, wordLength, type); } else { sw->setParams(score, word, wordLength); sw->setParams(score, word, wordLength, type); } if (sw == 0) { AKLOGE("SuggestedWord is accidentally null."); Loading @@ -94,7 +96,7 @@ class WordsPriorityQueue { } int outputSuggestions(const unsigned short *before, const int beforeLength, int *frequencies, unsigned short *outputChars) { int *frequencies, unsigned short *outputChars, int* outputTypes) { mHighestSuggestedWord = 0; const unsigned int size = min( MAX_WORDS, static_cast<unsigned int>(mSuggestions.size())); Loading Loading @@ -140,6 +142,7 @@ class WordsPriorityQueue { const unsigned int wordLength = sw->mWordLength; char *targetAdr = (char*) outputChars + i * MAX_WORD_LENGTH * sizeof(short); frequencies[i] = sw->mScore; outputTypes[i] = sw->mType; memcpy(targetAdr, sw->mWord, (wordLength) * sizeof(short)); if (wordLength < MAX_WORD_LENGTH) { ((unsigned short*) targetAdr)[wordLength] = 0; Loading Loading @@ -191,10 +194,10 @@ class WordsPriorityQueue { }; SuggestedWord *getFreeSuggestedWord(int score, unsigned short *word, int wordLength) { int wordLength, int type) { for (unsigned int i = 0; i < MAX_WORD_LENGTH; ++i) { if (!mSuggestedWords[i].mUsed) { mSuggestedWords[i].setParams(score, word, wordLength); mSuggestedWords[i].setParams(score, word, wordLength, type); return &mSuggestedWords[i]; } } Loading