Merge "Register generic font families in Zygote"
diff --git a/core/jni/android/graphics/Typeface.cpp b/core/jni/android/graphics/Typeface.cpp
index 34ec365..30d6ff4 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 @@
// 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 @@
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 @@
(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 ba47300..5c0c38e 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -1115,6 +1115,13 @@
}
}
+ 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 @@
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 @@
@CriticalNative
private static native long nativeGetReleaseFunc();
+
+ private static native void nativeRegisterGenericFamily(String str, long nativePtr);
}