Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fb68de3f authored by Bart Sears's avatar Bart Sears Committed by Android (Google) Code Review
Browse files

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

parents e442872e 143f5078
Loading
Loading
Loading
Loading
+5 −5
Original line number Original line Diff line number Diff line
@@ -36,12 +36,12 @@
namespace android {
namespace android {


static jlong FontFamily_create(JNIEnv* env, jobject clazz, jstring lang, jint variant) {
static jlong FontFamily_create(JNIEnv* env, jobject clazz, jstring lang, jint variant) {
    if (lang == NULL) {
    FontLanguage fontLanguage;
        return (jlong)new FontFamily(variant);
    if (lang != NULL) {
    }
        ScopedUtfChars str(env, lang);
        ScopedUtfChars str(env, lang);
    uint32_t langId = FontStyle::registerLanguageList(str.c_str());
        fontLanguage = FontLanguage(str.c_str(), str.size());
    return (jlong)new FontFamily(langId, variant);
    }
    return (jlong)new FontFamily(fontLanguage, variant);
}
}


static void FontFamily_unref(JNIEnv* env, jobject clazz, jlong familyPtr) {
static void FontFamily_unref(JNIEnv* env, jobject clazz, jlong familyPtr) {
+85 −1
Original line number Original line Diff line number Diff line
@@ -313,10 +313,94 @@ namespace PaintGlue {
        obj->setTextAlign(align);
        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) {
    static jint setTextLocales(JNIEnv* env, jobject clazz, jlong objHandle, jstring locales) {
        Paint* obj = reinterpret_cast<Paint*>(objHandle);
        Paint* obj = reinterpret_cast<Paint*>(objHandle);
        ScopedUtfChars localesChars(env, locales);
        ScopedUtfChars localesChars(env, locales);
        jint minikinLangListId = FontStyle::registerLanguageList(localesChars.c_str());
        std::string buf;
        toLanguageTags(&buf, localesChars.c_str());
        jint minikinLangListId = FontStyle::registerLanguageList(buf);
        obj->setMinikinLangListId(minikinLangListId);
        obj->setMinikinLangListId(minikinLangListId);
        return minikinLangListId;
        return minikinLangListId;
    }
    }