diff options
| -rw-r--r-- | core/jni/android/graphics/Typeface.cpp | 11 | ||||
| -rw-r--r-- | graphics/java/android/graphics/Typeface.java | 18 | 
2 files changed, 29 insertions, 0 deletions
diff --git a/core/jni/android/graphics/Typeface.cpp b/core/jni/android/graphics/Typeface.cpp index 34ec365c0bdc..30d6ff466785 100644 --- a/core/jni/android/graphics/Typeface.cpp +++ b/core/jni/android/graphics/Typeface.cpp @@ -20,11 +20,13 @@  #include "FontUtils.h"  #include "GraphicsJNI.h"  #include <nativehelper/ScopedPrimitiveArray.h> +#include <nativehelper/ScopedUtfChars.h>  #include "SkTypeface.h"  #include <android_runtime/android_util_AssetManager.h>  #include <androidfw/AssetManager.h>  #include <hwui/Typeface.h>  #include <minikin/FontFamily.h> +#include <minikin/SystemFonts.h>  using namespace android; @@ -108,6 +110,7 @@ static jlong Typeface_createFromArray(JNIEnv *env, jobject, jlongArray familyArr  // CriticalNative  static void Typeface_setDefault(jlong faceHandle) {      Typeface::setDefault(toTypeface(faceHandle)); +    minikin::SystemFonts::registerDefault(toTypeface(faceHandle)->fFontCollection);  }  static jobject Typeface_getSupportedAxes(JNIEnv *env, jobject, jlong faceHandle) { @@ -128,6 +131,12 @@ static jobject Typeface_getSupportedAxes(JNIEnv *env, jobject, jlong faceHandle)      return result;  } +static void Typeface_registerGenericFamily(JNIEnv *env, jobject, jstring familyName, jlong ptr) { +    ScopedUtfChars familyNameChars(env, familyName); +    minikin::SystemFonts::registerFallback(familyNameChars.c_str(), +                                           toTypeface(ptr)->fFontCollection); +} +  ///////////////////////////////////////////////////////////////////////////////  static const JNINativeMethod gTypefaceMethods[] = { @@ -144,6 +153,8 @@ static const JNINativeMethod gTypefaceMethods[] = {                                             (void*)Typeface_createFromArray },      { "nativeSetDefault",         "(J)V",   (void*)Typeface_setDefault },      { "nativeGetSupportedAxes",   "(J)[I",  (void*)Typeface_getSupportedAxes }, +    { "nativeRegisterGenericFamily", "(Ljava/lang/String;J)V", +          (void*)Typeface_registerGenericFamily },  };  int register_android_graphics_Typeface(JNIEnv* env) diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java index ba47300210cd..5c0c38ee7666 100644 --- a/graphics/java/android/graphics/Typeface.java +++ b/graphics/java/android/graphics/Typeface.java @@ -1115,6 +1115,13 @@ public class Typeface {          }      } +    private static void registerGenericFamilyNative(@NonNull String familyName, +            @Nullable Typeface typeface) { +        if (typeface != null) { +            nativeRegisterGenericFamily(familyName, typeface.native_instance); +        } +    } +      static {          final HashMap<String, Typeface> systemFontMap = new HashMap<>();          initSystemDefaultTypefaces(systemFontMap, SystemFonts.getRawSystemFallbackMap(), @@ -1140,6 +1147,15 @@ public class Typeface {              create((String) null, Typeface.BOLD_ITALIC),          }; +        // A list of generic families to be registered in native. +        // https://www.w3.org/TR/css-fonts-4/#generic-font-families +        String[] genericFamilies = { +            "serif", "sans-serif", "cursive", "fantasy", "monospace", "system-ui" +        }; + +        for (String genericFamily : genericFamilies) { +            registerGenericFamilyNative(genericFamily, systemFontMap.get(genericFamily)); +        }      }      @Override @@ -1202,4 +1218,6 @@ public class Typeface {      @CriticalNative      private static native long nativeGetReleaseFunc(); + +    private static native void nativeRegisterGenericFamily(String str, long nativePtr);  }  |