From f69e7037bad4c8108ef2ce2805fb874e03b6dec9 Mon Sep 17 00:00:00 2001 From: Seigo Nonaka Date: Thu, 1 Nov 2018 14:30:18 -0700 Subject: [PATCH] Pass custom fallback info to minikin The custom fallback info is used for determine the priority between custom fallback and locale fallback. The custom fallback should be given priority over locale fallback. Bug: 116512426 Test: minikin_tests Test: atest TypefaceCustomFallbackBuilderTest Change-Id: I79cc82fa990d7705ea5c40e9b0be40d062c218dc --- core/jni/android/graphics/FontFamily.cpp | 3 ++- core/jni/android/graphics/fonts/FontFamily.cpp | 7 ++++--- graphics/java/android/graphics/fonts/FontFamily.java | 10 ++++++---- graphics/java/android/graphics/fonts/SystemFonts.java | 2 +- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/core/jni/android/graphics/FontFamily.cpp b/core/jni/android/graphics/FontFamily.cpp index e07a20880b946..2e7501f0e0bef 100644 --- a/core/jni/android/graphics/FontFamily.cpp +++ b/core/jni/android/graphics/FontFamily.cpp @@ -83,7 +83,8 @@ static jlong FontFamily_create(jlong builderPtr) { return 0; } std::shared_ptr family = std::make_shared( - builder->langId, builder->variant, std::move(builder->fonts)); + builder->langId, builder->variant, std::move(builder->fonts), + true /* isCustomFallback */); if (family->getCoverage().length() == 0) { return 0; } diff --git a/core/jni/android/graphics/fonts/FontFamily.cpp b/core/jni/android/graphics/fonts/FontFamily.cpp index 767e068381d99..249e4f3e9212d 100644 --- a/core/jni/android/graphics/fonts/FontFamily.cpp +++ b/core/jni/android/graphics/fonts/FontFamily.cpp @@ -57,7 +57,7 @@ static void FontFamily_Builder_addFont(jlong builderPtr, jlong fontPtr) { // Regular JNI static jlong FontFamily_Builder_build(JNIEnv* env, jobject clazz, jlong builderPtr, - jstring langTags, jint variant) { + jstring langTags, jint variant, jboolean isCustomFallback) { std::unique_ptr builder(toBuilder(builderPtr)); uint32_t localeId; if (langTags == nullptr) { @@ -67,7 +67,8 @@ static jlong FontFamily_Builder_build(JNIEnv* env, jobject clazz, jlong builderP localeId = minikin::registerLocaleList(str.c_str()); } std::shared_ptr family = std::make_shared( - localeId, static_cast(variant), std::move(builder->fonts)); + localeId, static_cast(variant), std::move(builder->fonts), + isCustomFallback); if (family->getCoverage().length() == 0) { // No coverage means minikin rejected given font for some reasons. jniThrowException(env, "java/lang/IllegalArgumentException", @@ -87,7 +88,7 @@ static jlong FontFamily_Builder_GetReleaseFunc() { static const JNINativeMethod gFontFamilyBuilderMethods[] = { { "nInitBuilder", "()J", (void*) FontFamily_Builder_initBuilder }, { "nAddFont", "(JJ)V", (void*) FontFamily_Builder_addFont }, - { "nBuild", "(JLjava/lang/String;I)J", (void*) FontFamily_Builder_build }, + { "nBuild", "(JLjava/lang/String;IZ)J", (void*) FontFamily_Builder_build }, { "nGetReleaseNativeFamily", "()J", (void*) FontFamily_Builder_GetReleaseFunc }, }; diff --git a/graphics/java/android/graphics/fonts/FontFamily.java b/graphics/java/android/graphics/fonts/FontFamily.java index 14d31d9dfd86b..c0f1b163ea114 100644 --- a/graphics/java/android/graphics/fonts/FontFamily.java +++ b/graphics/java/android/graphics/fonts/FontFamily.java @@ -108,16 +108,17 @@ public final class FontFamily { * @return a font family */ public @NonNull FontFamily build() { - return build("", FontConfig.Family.VARIANT_DEFAULT); + return build("", FontConfig.Family.VARIANT_DEFAULT, true /* isCustomFallback */); } /** @hide */ - public @NonNull FontFamily build(@NonNull String langTags, int variant) { + public @NonNull FontFamily build(@NonNull String langTags, int variant, + boolean isCustomFallback) { final long builderPtr = nInitBuilder(); for (int i = 0; i < mFonts.size(); ++i) { nAddFont(builderPtr, mFonts.get(i).getNativePtr()); } - final long ptr = nBuild(builderPtr, langTags, variant); + final long ptr = nBuild(builderPtr, langTags, variant, isCustomFallback); final FontFamily family = new FontFamily(mFonts, ptr); sFamilyRegistory.registerNativeAllocation(family, ptr); return family; @@ -130,7 +131,8 @@ public final class FontFamily { private static native long nInitBuilder(); @CriticalNative private static native void nAddFont(long builderPtr, long fontPtr); - private static native long nBuild(long builderPtr, String langTags, int variant); + private static native long nBuild(long builderPtr, String langTags, int variant, + boolean isCustomFallback); @CriticalNative private static native long nGetReleaseNativeFamily(); } diff --git a/graphics/java/android/graphics/fonts/SystemFonts.java b/graphics/java/android/graphics/fonts/SystemFonts.java index 750adb2757c8a..4a9cf14d04a5c 100644 --- a/graphics/java/android/graphics/fonts/SystemFonts.java +++ b/graphics/java/android/graphics/fonts/SystemFonts.java @@ -208,7 +208,7 @@ public final class SystemFonts { b.addFont(font); } } - return b == null ? null : b.build(languageTags, variant); + return b == null ? null : b.build(languageTags, variant, false /* isCustomFallback */); } private static void appendNamedFamily(@NonNull FontConfig.Family xmlFamily,