Merge "Move Language normalization code from Paint.cpp to Minikin."

This commit is contained in:
Roozbeh Pournader
2016-01-05 19:27:32 +00:00
committed by Android (Google) Code Review
2 changed files with 6 additions and 90 deletions

View File

@@ -36,12 +36,12 @@
namespace android {
static jlong FontFamily_create(JNIEnv* env, jobject clazz, jstring lang, jint variant) {
FontLanguage fontLanguage;
if (lang != NULL) {
ScopedUtfChars str(env, lang);
fontLanguage = FontLanguage(str.c_str(), str.size());
if (lang == NULL) {
return (jlong)new FontFamily(variant);
}
return (jlong)new FontFamily(fontLanguage, variant);
ScopedUtfChars str(env, lang);
uint32_t langId = FontStyle::registerLanguageList(str.c_str());
return (jlong)new FontFamily(langId, variant);
}
static void FontFamily_unref(JNIEnv* env, jobject clazz, jlong familyPtr) {

View File

@@ -313,94 +313,10 @@ namespace PaintGlue {
obj->setTextAlign(align);
}
// generate bcp47 identifier for the supplied locale
static void toLanguageTag(char* output, size_t outSize,
const char* locale) {
if (output == NULL || outSize <= 0) {
return;
}
if (locale == NULL) {
output[0] = '\0';
return;
}
char canonicalChars[ULOC_FULLNAME_CAPACITY];
UErrorCode uErr = U_ZERO_ERROR;
uloc_canonicalize(locale, canonicalChars, ULOC_FULLNAME_CAPACITY,
&uErr);
if (U_SUCCESS(uErr)) {
char likelyChars[ULOC_FULLNAME_CAPACITY];
uErr = U_ZERO_ERROR;
uloc_addLikelySubtags(canonicalChars, likelyChars,
ULOC_FULLNAME_CAPACITY, &uErr);
if (U_SUCCESS(uErr)) {
uErr = U_ZERO_ERROR;
uloc_toLanguageTag(likelyChars, output, outSize, FALSE, &uErr);
if (U_SUCCESS(uErr)) {
return;
} else {
ALOGD("uloc_toLanguageTag(\"%s\") failed: %s", likelyChars,
u_errorName(uErr));
}
} else {
ALOGD("uloc_addLikelySubtags(\"%s\") failed: %s",
canonicalChars, u_errorName(uErr));
}
} else {
ALOGD("uloc_canonicalize(\"%s\") failed: %s", locale,
u_errorName(uErr));
}
// unable to build a proper language identifier
output[0] = '\0';
}
static void toLanguageTags(std::string* output, const char* locales) {
if (output == NULL) {
return;
}
if (locales == NULL) {
output->clear();
return;
}
char langTag[ULOC_FULLNAME_CAPACITY];
const char* commaLoc = strchr(locales, ',');
if (commaLoc == NULL) {
assert(locales[0] != '\0'); // the string should not be empty
toLanguageTag(langTag, ULOC_FULLNAME_CAPACITY, locales);
*output = langTag;
return;
}
size_t len = strlen(locales);
char locale[len];
output->clear();
output->reserve(len);
const char* lastStart = locales;
do {
assert(lastStart > commaLoc); // the substring should not be empty
strncpy(locale, lastStart, commaLoc - lastStart);
locale[commaLoc - lastStart] = '\0';
toLanguageTag(langTag, ULOC_FULLNAME_CAPACITY, locale);
if (langTag[0] != '\0') {
output->append(langTag);
output->push_back(',');
}
lastStart = commaLoc + 1;
commaLoc = strchr(lastStart, ',');
} while (commaLoc != NULL);
assert(lastStart[0] != '\0'); // the final substring should not be empty
toLanguageTag(langTag, ULOC_FULLNAME_CAPACITY, lastStart);
if (langTag[0] != '\0') {
output->append(langTag);
}
}
static jint setTextLocales(JNIEnv* env, jobject clazz, jlong objHandle, jstring locales) {
Paint* obj = reinterpret_cast<Paint*>(objHandle);
ScopedUtfChars localesChars(env, locales);
std::string buf;
toLanguageTags(&buf, localesChars.c_str());
jint minikinLangListId = FontStyle::registerLanguageList(buf);
jint minikinLangListId = FontStyle::registerLanguageList(localesChars.c_str());
obj->setMinikinLangListId(minikinLangListId);
return minikinLangListId;
}