Loading graphics/java/android/graphics/Typeface.java +3 −3 Original line number Original line Diff line number Diff line Loading @@ -42,6 +42,7 @@ import android.provider.FontsContract; import android.system.ErrnoException; import android.system.ErrnoException; import android.system.OsConstants; import android.system.OsConstants; import android.text.FontConfig; import android.text.FontConfig; import android.util.ArrayMap; import android.util.Base64; import android.util.Base64; import android.util.LongSparseArray; import android.util.LongSparseArray; import android.util.LruCache; import android.util.LruCache; Loading @@ -67,7 +68,6 @@ import java.nio.ByteOrder; import java.util.ArrayList; import java.util.ArrayList; import java.util.Arrays; import java.util.Arrays; import java.util.Collections; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.List; import java.util.Map; import java.util.Map; import java.util.Objects; import java.util.Objects; Loading Loading @@ -147,7 +147,7 @@ public class Typeface { */ */ @GuardedBy("SYSTEM_FONT_MAP_LOCK") @GuardedBy("SYSTEM_FONT_MAP_LOCK") @UnsupportedAppUsage(trackingBug = 123769347) @UnsupportedAppUsage(trackingBug = 123769347) static final Map<String, Typeface> sSystemFontMap = new HashMap<>(); static final Map<String, Typeface> sSystemFontMap = new ArrayMap<>(); // DirectByteBuffer object to hold sSystemFontMap's backing memory mapping. // DirectByteBuffer object to hold sSystemFontMap's backing memory mapping. static ByteBuffer sSystemFontMapBuffer = null; static ByteBuffer sSystemFontMapBuffer = null; Loading Loading @@ -1231,7 +1231,7 @@ public class Typeface { /** @hide */ /** @hide */ @VisibleForTesting @VisibleForTesting public static Map<String, Typeface> deserializeFontMap(ByteBuffer buffer) throws IOException { public static Map<String, Typeface> deserializeFontMap(ByteBuffer buffer) throws IOException { Map<String, Typeface> fontMap = new HashMap<>(); Map<String, Typeface> fontMap = new ArrayMap<>(); int typefacesBytesCount = buffer.getInt(); int typefacesBytesCount = buffer.getInt(); long[] nativePtrs = nativeReadTypefaces(buffer.slice()); long[] nativePtrs = nativeReadTypefaces(buffer.slice()); if (nativePtrs == null) { if (nativePtrs == null) { Loading graphics/java/android/graphics/fonts/FontFamily.java +19 −12 Original line number Original line Diff line number Diff line Loading @@ -20,15 +20,16 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; import android.text.FontConfig; import android.text.FontConfig; import android.util.SparseIntArray; import com.android.internal.util.Preconditions; import com.android.internal.util.Preconditions; import dalvik.annotation.optimization.CriticalNative; import dalvik.annotation.optimization.CriticalNative; import dalvik.annotation.optimization.FastNative; import libcore.util.NativeAllocationRegistry; import libcore.util.NativeAllocationRegistry; import java.util.ArrayList; import java.util.ArrayList; import java.util.HashSet; /** /** * A font family class can be used for creating Typeface. * A font family class can be used for creating Typeface. Loading Loading @@ -68,7 +69,9 @@ public final class FontFamily { nGetReleaseNativeFamily()); nGetReleaseNativeFamily()); private final ArrayList<Font> mFonts = new ArrayList<>(); private final ArrayList<Font> mFonts = new ArrayList<>(); private final HashSet<Integer> mStyleHashSet = new HashSet<>(); // Most FontFamily only has regular, bold, italic, bold-italic. Thus 4 should be good for // initial capacity. private final SparseIntArray mStyles = new SparseIntArray(4); /** /** * Constructs a builder. * Constructs a builder. Loading @@ -77,7 +80,7 @@ public final class FontFamily { */ */ public Builder(@NonNull Font font) { public Builder(@NonNull Font font) { Preconditions.checkNotNull(font, "font can not be null"); Preconditions.checkNotNull(font, "font can not be null"); mStyleHashSet.add(makeStyleIdentifier(font)); mStyles.append(makeStyleIdentifier(font), 0); mFonts.add(font); mFonts.add(font); } } Loading @@ -97,9 +100,11 @@ public final class FontFamily { */ */ public @NonNull Builder addFont(@NonNull Font font) { public @NonNull Builder addFont(@NonNull Font font) { Preconditions.checkNotNull(font, "font can not be null"); Preconditions.checkNotNull(font, "font can not be null"); if (!mStyleHashSet.add(makeStyleIdentifier(font))) { int key = makeStyleIdentifier(font); if (mStyles.indexOfKey(key) >= 0) { throw new IllegalArgumentException(font + " has already been added"); throw new IllegalArgumentException(font + " has already been added"); } } mStyles.append(key, 0); mFonts.add(font); mFonts.add(font); return this; return this; } } Loading @@ -120,7 +125,7 @@ public final class FontFamily { nAddFont(builderPtr, mFonts.get(i).getNativePtr()); nAddFont(builderPtr, mFonts.get(i).getNativePtr()); } } final long ptr = nBuild(builderPtr, langTags, variant, isCustomFallback); final long ptr = nBuild(builderPtr, langTags, variant, isCustomFallback); final FontFamily family = new FontFamily(mFonts, langTags, variant, ptr); final FontFamily family = new FontFamily(mFonts, ptr); sFamilyRegistory.registerNativeAllocation(family, ptr); sFamilyRegistory.registerNativeAllocation(family, ptr); return family; return family; } } Loading @@ -139,15 +144,11 @@ public final class FontFamily { } } private final ArrayList<Font> mFonts; private final ArrayList<Font> mFonts; private final String mLangTags; private final int mVariant; private final long mNativePtr; private final long mNativePtr; // Use Builder instead. // Use Builder instead. private FontFamily(@NonNull ArrayList<Font> fonts, String langTags, int variant, long ptr) { private FontFamily(@NonNull ArrayList<Font> fonts, long ptr) { mFonts = fonts; mFonts = fonts; mLangTags = langTags; mVariant = variant; mNativePtr = ptr; mNativePtr = ptr; } } Loading @@ -157,7 +158,7 @@ public final class FontFamily { * @return a BCP-47 compliant language tag. * @return a BCP-47 compliant language tag. */ */ public @Nullable String getLangTags() { public @Nullable String getLangTags() { return mLangTags; return nGetLangTags(mNativePtr); } } /** /** Loading @@ -165,7 +166,7 @@ public final class FontFamily { * @return a family variant * @return a family variant */ */ public int getVariant() { public int getVariant() { return mVariant; return nGetVariant(mNativePtr); } } /** /** Loading @@ -191,4 +192,10 @@ public final class FontFamily { public long getNativePtr() { public long getNativePtr() { return mNativePtr; return mNativePtr; } } @FastNative private static native String nGetLangTags(long family); @CriticalNative private static native int nGetVariant(long family); } } graphics/java/android/graphics/fonts/SystemFonts.java +7 −8 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.graphics.FontListParser; import android.graphics.Typeface; import android.graphics.Typeface; import android.text.FontConfig; import android.text.FontConfig; import android.util.ArrayMap; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy; Loading @@ -36,8 +37,6 @@ import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.ArrayList; import java.util.Collections; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.List; import java.util.Map; import java.util.Map; import java.util.Set; import java.util.Set; Loading Loading @@ -76,7 +75,7 @@ public final class SystemFonts { if (Typeface.ENABLE_LAZY_TYPEFACE_INITIALIZATION) { if (Typeface.ENABLE_LAZY_TYPEFACE_INITIALIZATION) { sAvailableFonts = collectAllFonts(); sAvailableFonts = collectAllFonts(); } else { } else { Set<Font> set = new HashSet<>(); Set<Font> set = new ArraySet<>(); for (FontFamily[] items : sFamilyMap.values()) { for (FontFamily[] items : sFamilyMap.values()) { for (FontFamily family : items) { for (FontFamily family : items) { for (int i = 0; i < family.getSize(); ++i) { for (int i = 0; i < family.getSize(); ++i) { Loading @@ -96,7 +95,7 @@ public final class SystemFonts { FontConfig fontConfig = getSystemPreinstalledFontConfig(); FontConfig fontConfig = getSystemPreinstalledFontConfig(); Map<String, FontFamily[]> map = buildSystemFallback(fontConfig); Map<String, FontFamily[]> map = buildSystemFallback(fontConfig); Set<Font> res = new HashSet<>(); Set<Font> res = new ArraySet<>(); for (FontFamily[] families : map.values()) { for (FontFamily[] families : map.values()) { for (FontFamily family : families) { for (FontFamily family : families) { for (int i = 0; i < family.getSize(); ++i) { for (int i = 0; i < family.getSize(); ++i) { Loading Loading @@ -218,7 +217,7 @@ public final class SystemFonts { } } private static void appendNamedFamily(@NonNull FontConfig.FontFamily xmlFamily, private static void appendNamedFamily(@NonNull FontConfig.FontFamily xmlFamily, @NonNull HashMap<String, ByteBuffer> bufferCache, @NonNull ArrayMap<String, ByteBuffer> bufferCache, @NonNull ArrayMap<String, ArrayList<FontFamily>> fallbackListMap) { @NonNull ArrayMap<String, ArrayList<FontFamily>> fallbackListMap) { final String familyName = xmlFamily.getName(); final String familyName = xmlFamily.getName(); final FontFamily family = createFontFamily( final FontFamily family = createFontFamily( Loading Loading @@ -284,8 +283,8 @@ public final class SystemFonts { */ */ @VisibleForTesting @VisibleForTesting public static Map<String, FontFamily[]> buildSystemFallback(FontConfig fontConfig) { public static Map<String, FontFamily[]> buildSystemFallback(FontConfig fontConfig) { final Map<String, FontFamily[]> fallbackMap = new HashMap<>(); final Map<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final HashMap<String, ByteBuffer> bufferCache = new HashMap<>(); final ArrayMap<String, ByteBuffer> bufferCache = new ArrayMap<>(); final List<FontConfig.FontFamily> xmlFamilies = fontConfig.getFontFamilies(); final List<FontConfig.FontFamily> xmlFamilies = fontConfig.getFontFamilies(); final ArrayMap<String, ArrayList<FontFamily>> fallbackListMap = new ArrayMap<>(); final ArrayMap<String, ArrayList<FontFamily>> fallbackListMap = new ArrayMap<>(); Loading Loading @@ -326,7 +325,7 @@ public final class SystemFonts { public static Map<String, Typeface> buildSystemTypefaces( public static Map<String, Typeface> buildSystemTypefaces( FontConfig fontConfig, FontConfig fontConfig, Map<String, FontFamily[]> fallbackMap) { Map<String, FontFamily[]> fallbackMap) { final HashMap<String, Typeface> result = new HashMap<>(); final ArrayMap<String, Typeface> result = new ArrayMap<>(); Typeface.initSystemDefaultTypefaces(fallbackMap, fontConfig.getAliases(), result); Typeface.initSystemDefaultTypefaces(fallbackMap, fontConfig.getAliases(), result); return result; return result; } } Loading libs/hwui/jni/fonts/FontFamily.cpp +25 −1 Original line number Original line Diff line number Diff line Loading @@ -83,6 +83,23 @@ static jlong FontFamily_Builder_GetReleaseFunc(CRITICAL_JNI_PARAMS) { return reinterpret_cast<jlong>(releaseFontFamily); return reinterpret_cast<jlong>(releaseFontFamily); } } // FastNative static jstring FontFamily_getLangTags(JNIEnv* env, jobject, jlong familyPtr) { FontFamilyWrapper* family = reinterpret_cast<FontFamilyWrapper*>(familyPtr); uint32_t localeListId = family->family->localeListId(); if (localeListId == 0) { return nullptr; } std::string langTags = minikin::getLocaleString(localeListId); return env->NewStringUTF(langTags.c_str()); } // CriticalNative static jint FontFamily_getVariant(jlong familyPtr) { FontFamilyWrapper* family = reinterpret_cast<FontFamilyWrapper*>(familyPtr); return static_cast<jint>(family->family->variant()); } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// static const JNINativeMethod gFontFamilyBuilderMethods[] = { static const JNINativeMethod gFontFamilyBuilderMethods[] = { Loading @@ -93,9 +110,16 @@ static const JNINativeMethod gFontFamilyBuilderMethods[] = { { "nGetReleaseNativeFamily", "()J", (void*) FontFamily_Builder_GetReleaseFunc }, { "nGetReleaseNativeFamily", "()J", (void*) FontFamily_Builder_GetReleaseFunc }, }; }; static const JNINativeMethod gFontFamilyMethods[] = { {"nGetLangTags", "(J)Ljava/lang/String;", (void*)FontFamily_getLangTags}, {"nGetVariant", "(J)I", (void*)FontFamily_getVariant}, }; int register_android_graphics_fonts_FontFamily(JNIEnv* env) { int register_android_graphics_fonts_FontFamily(JNIEnv* env) { return RegisterMethodsOrDie(env, "android/graphics/fonts/FontFamily$Builder", return RegisterMethodsOrDie(env, "android/graphics/fonts/FontFamily$Builder", gFontFamilyBuilderMethods, NELEM(gFontFamilyBuilderMethods)); gFontFamilyBuilderMethods, NELEM(gFontFamilyBuilderMethods)) + RegisterMethodsOrDie(env, "android/graphics/fonts/FontFamily", gFontFamilyMethods, NELEM(gFontFamilyMethods)); } } } } services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java +4 −4 Original line number Original line Diff line number Diff line Loading @@ -27,6 +27,7 @@ import android.os.FileUtils; import android.system.ErrnoException; import android.system.ErrnoException; import android.system.Os; import android.system.Os; import android.text.FontConfig; import android.text.FontConfig; import android.util.ArrayMap; import android.util.Base64; import android.util.Base64; import android.util.Slog; import android.util.Slog; Loading @@ -39,7 +40,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.IOException; import java.security.SecureRandom; import java.security.SecureRandom; import java.time.Instant; import java.time.Instant; import java.util.HashMap; import java.util.List; import java.util.List; import java.util.Map; import java.util.Map; Loading Loading @@ -116,7 +116,7 @@ final class UpdatableFontDir { * FontFileInfo}. All files in this map are validated, and have higher revision numbers than * FontFileInfo}. All files in this map are validated, and have higher revision numbers than * corresponding font files in {@link #mPreinstalledFontDirs}. * corresponding font files in {@link #mPreinstalledFontDirs}. */ */ private final Map<String, FontFileInfo> mFontFileInfoMap = new HashMap<>(); private final ArrayMap<String, FontFileInfo> mFontFileInfoMap = new ArrayMap<>(); UpdatableFontDir(File filesDir, List<File> preinstalledFontDirs, FontFileParser parser, UpdatableFontDir(File filesDir, List<File> preinstalledFontDirs, FontFileParser parser, FsverityUtil fsverityUtil) { FsverityUtil fsverityUtil) { Loading Loading @@ -205,7 +205,7 @@ final class UpdatableFontDir { */ */ public void update(List<FontUpdateRequest> requests) throws SystemFontException { public void update(List<FontUpdateRequest> requests) throws SystemFontException { // Backup the mapping for rollback. // Backup the mapping for rollback. HashMap<String, FontFileInfo> backupMap = new HashMap<>(mFontFileInfoMap); ArrayMap<String, FontFileInfo> backupMap = new ArrayMap<>(mFontFileInfoMap); long backupLastModifiedDate = mLastModifiedDate; long backupLastModifiedDate = mLastModifiedDate; boolean success = false; boolean success = false; try { try { Loading Loading @@ -464,7 +464,7 @@ final class UpdatableFontDir { } } Map<String, File> getFontFileMap() { Map<String, File> getFontFileMap() { Map<String, File> map = new HashMap<>(); Map<String, File> map = new ArrayMap<>(); for (Map.Entry<String, FontFileInfo> entry : mFontFileInfoMap.entrySet()) { for (Map.Entry<String, FontFileInfo> entry : mFontFileInfoMap.entrySet()) { map.put(entry.getKey(), entry.getValue().getFile()); map.put(entry.getKey(), entry.getValue().getFile()); } } Loading Loading
graphics/java/android/graphics/Typeface.java +3 −3 Original line number Original line Diff line number Diff line Loading @@ -42,6 +42,7 @@ import android.provider.FontsContract; import android.system.ErrnoException; import android.system.ErrnoException; import android.system.OsConstants; import android.system.OsConstants; import android.text.FontConfig; import android.text.FontConfig; import android.util.ArrayMap; import android.util.Base64; import android.util.Base64; import android.util.LongSparseArray; import android.util.LongSparseArray; import android.util.LruCache; import android.util.LruCache; Loading @@ -67,7 +68,6 @@ import java.nio.ByteOrder; import java.util.ArrayList; import java.util.ArrayList; import java.util.Arrays; import java.util.Arrays; import java.util.Collections; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.List; import java.util.Map; import java.util.Map; import java.util.Objects; import java.util.Objects; Loading Loading @@ -147,7 +147,7 @@ public class Typeface { */ */ @GuardedBy("SYSTEM_FONT_MAP_LOCK") @GuardedBy("SYSTEM_FONT_MAP_LOCK") @UnsupportedAppUsage(trackingBug = 123769347) @UnsupportedAppUsage(trackingBug = 123769347) static final Map<String, Typeface> sSystemFontMap = new HashMap<>(); static final Map<String, Typeface> sSystemFontMap = new ArrayMap<>(); // DirectByteBuffer object to hold sSystemFontMap's backing memory mapping. // DirectByteBuffer object to hold sSystemFontMap's backing memory mapping. static ByteBuffer sSystemFontMapBuffer = null; static ByteBuffer sSystemFontMapBuffer = null; Loading Loading @@ -1231,7 +1231,7 @@ public class Typeface { /** @hide */ /** @hide */ @VisibleForTesting @VisibleForTesting public static Map<String, Typeface> deserializeFontMap(ByteBuffer buffer) throws IOException { public static Map<String, Typeface> deserializeFontMap(ByteBuffer buffer) throws IOException { Map<String, Typeface> fontMap = new HashMap<>(); Map<String, Typeface> fontMap = new ArrayMap<>(); int typefacesBytesCount = buffer.getInt(); int typefacesBytesCount = buffer.getInt(); long[] nativePtrs = nativeReadTypefaces(buffer.slice()); long[] nativePtrs = nativeReadTypefaces(buffer.slice()); if (nativePtrs == null) { if (nativePtrs == null) { Loading
graphics/java/android/graphics/fonts/FontFamily.java +19 −12 Original line number Original line Diff line number Diff line Loading @@ -20,15 +20,16 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; import android.text.FontConfig; import android.text.FontConfig; import android.util.SparseIntArray; import com.android.internal.util.Preconditions; import com.android.internal.util.Preconditions; import dalvik.annotation.optimization.CriticalNative; import dalvik.annotation.optimization.CriticalNative; import dalvik.annotation.optimization.FastNative; import libcore.util.NativeAllocationRegistry; import libcore.util.NativeAllocationRegistry; import java.util.ArrayList; import java.util.ArrayList; import java.util.HashSet; /** /** * A font family class can be used for creating Typeface. * A font family class can be used for creating Typeface. Loading Loading @@ -68,7 +69,9 @@ public final class FontFamily { nGetReleaseNativeFamily()); nGetReleaseNativeFamily()); private final ArrayList<Font> mFonts = new ArrayList<>(); private final ArrayList<Font> mFonts = new ArrayList<>(); private final HashSet<Integer> mStyleHashSet = new HashSet<>(); // Most FontFamily only has regular, bold, italic, bold-italic. Thus 4 should be good for // initial capacity. private final SparseIntArray mStyles = new SparseIntArray(4); /** /** * Constructs a builder. * Constructs a builder. Loading @@ -77,7 +80,7 @@ public final class FontFamily { */ */ public Builder(@NonNull Font font) { public Builder(@NonNull Font font) { Preconditions.checkNotNull(font, "font can not be null"); Preconditions.checkNotNull(font, "font can not be null"); mStyleHashSet.add(makeStyleIdentifier(font)); mStyles.append(makeStyleIdentifier(font), 0); mFonts.add(font); mFonts.add(font); } } Loading @@ -97,9 +100,11 @@ public final class FontFamily { */ */ public @NonNull Builder addFont(@NonNull Font font) { public @NonNull Builder addFont(@NonNull Font font) { Preconditions.checkNotNull(font, "font can not be null"); Preconditions.checkNotNull(font, "font can not be null"); if (!mStyleHashSet.add(makeStyleIdentifier(font))) { int key = makeStyleIdentifier(font); if (mStyles.indexOfKey(key) >= 0) { throw new IllegalArgumentException(font + " has already been added"); throw new IllegalArgumentException(font + " has already been added"); } } mStyles.append(key, 0); mFonts.add(font); mFonts.add(font); return this; return this; } } Loading @@ -120,7 +125,7 @@ public final class FontFamily { nAddFont(builderPtr, mFonts.get(i).getNativePtr()); nAddFont(builderPtr, mFonts.get(i).getNativePtr()); } } final long ptr = nBuild(builderPtr, langTags, variant, isCustomFallback); final long ptr = nBuild(builderPtr, langTags, variant, isCustomFallback); final FontFamily family = new FontFamily(mFonts, langTags, variant, ptr); final FontFamily family = new FontFamily(mFonts, ptr); sFamilyRegistory.registerNativeAllocation(family, ptr); sFamilyRegistory.registerNativeAllocation(family, ptr); return family; return family; } } Loading @@ -139,15 +144,11 @@ public final class FontFamily { } } private final ArrayList<Font> mFonts; private final ArrayList<Font> mFonts; private final String mLangTags; private final int mVariant; private final long mNativePtr; private final long mNativePtr; // Use Builder instead. // Use Builder instead. private FontFamily(@NonNull ArrayList<Font> fonts, String langTags, int variant, long ptr) { private FontFamily(@NonNull ArrayList<Font> fonts, long ptr) { mFonts = fonts; mFonts = fonts; mLangTags = langTags; mVariant = variant; mNativePtr = ptr; mNativePtr = ptr; } } Loading @@ -157,7 +158,7 @@ public final class FontFamily { * @return a BCP-47 compliant language tag. * @return a BCP-47 compliant language tag. */ */ public @Nullable String getLangTags() { public @Nullable String getLangTags() { return mLangTags; return nGetLangTags(mNativePtr); } } /** /** Loading @@ -165,7 +166,7 @@ public final class FontFamily { * @return a family variant * @return a family variant */ */ public int getVariant() { public int getVariant() { return mVariant; return nGetVariant(mNativePtr); } } /** /** Loading @@ -191,4 +192,10 @@ public final class FontFamily { public long getNativePtr() { public long getNativePtr() { return mNativePtr; return mNativePtr; } } @FastNative private static native String nGetLangTags(long family); @CriticalNative private static native int nGetVariant(long family); } }
graphics/java/android/graphics/fonts/SystemFonts.java +7 −8 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.graphics.FontListParser; import android.graphics.Typeface; import android.graphics.Typeface; import android.text.FontConfig; import android.text.FontConfig; import android.util.ArrayMap; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy; Loading @@ -36,8 +37,6 @@ import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.ArrayList; import java.util.Collections; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.List; import java.util.Map; import java.util.Map; import java.util.Set; import java.util.Set; Loading Loading @@ -76,7 +75,7 @@ public final class SystemFonts { if (Typeface.ENABLE_LAZY_TYPEFACE_INITIALIZATION) { if (Typeface.ENABLE_LAZY_TYPEFACE_INITIALIZATION) { sAvailableFonts = collectAllFonts(); sAvailableFonts = collectAllFonts(); } else { } else { Set<Font> set = new HashSet<>(); Set<Font> set = new ArraySet<>(); for (FontFamily[] items : sFamilyMap.values()) { for (FontFamily[] items : sFamilyMap.values()) { for (FontFamily family : items) { for (FontFamily family : items) { for (int i = 0; i < family.getSize(); ++i) { for (int i = 0; i < family.getSize(); ++i) { Loading @@ -96,7 +95,7 @@ public final class SystemFonts { FontConfig fontConfig = getSystemPreinstalledFontConfig(); FontConfig fontConfig = getSystemPreinstalledFontConfig(); Map<String, FontFamily[]> map = buildSystemFallback(fontConfig); Map<String, FontFamily[]> map = buildSystemFallback(fontConfig); Set<Font> res = new HashSet<>(); Set<Font> res = new ArraySet<>(); for (FontFamily[] families : map.values()) { for (FontFamily[] families : map.values()) { for (FontFamily family : families) { for (FontFamily family : families) { for (int i = 0; i < family.getSize(); ++i) { for (int i = 0; i < family.getSize(); ++i) { Loading Loading @@ -218,7 +217,7 @@ public final class SystemFonts { } } private static void appendNamedFamily(@NonNull FontConfig.FontFamily xmlFamily, private static void appendNamedFamily(@NonNull FontConfig.FontFamily xmlFamily, @NonNull HashMap<String, ByteBuffer> bufferCache, @NonNull ArrayMap<String, ByteBuffer> bufferCache, @NonNull ArrayMap<String, ArrayList<FontFamily>> fallbackListMap) { @NonNull ArrayMap<String, ArrayList<FontFamily>> fallbackListMap) { final String familyName = xmlFamily.getName(); final String familyName = xmlFamily.getName(); final FontFamily family = createFontFamily( final FontFamily family = createFontFamily( Loading Loading @@ -284,8 +283,8 @@ public final class SystemFonts { */ */ @VisibleForTesting @VisibleForTesting public static Map<String, FontFamily[]> buildSystemFallback(FontConfig fontConfig) { public static Map<String, FontFamily[]> buildSystemFallback(FontConfig fontConfig) { final Map<String, FontFamily[]> fallbackMap = new HashMap<>(); final Map<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final HashMap<String, ByteBuffer> bufferCache = new HashMap<>(); final ArrayMap<String, ByteBuffer> bufferCache = new ArrayMap<>(); final List<FontConfig.FontFamily> xmlFamilies = fontConfig.getFontFamilies(); final List<FontConfig.FontFamily> xmlFamilies = fontConfig.getFontFamilies(); final ArrayMap<String, ArrayList<FontFamily>> fallbackListMap = new ArrayMap<>(); final ArrayMap<String, ArrayList<FontFamily>> fallbackListMap = new ArrayMap<>(); Loading Loading @@ -326,7 +325,7 @@ public final class SystemFonts { public static Map<String, Typeface> buildSystemTypefaces( public static Map<String, Typeface> buildSystemTypefaces( FontConfig fontConfig, FontConfig fontConfig, Map<String, FontFamily[]> fallbackMap) { Map<String, FontFamily[]> fallbackMap) { final HashMap<String, Typeface> result = new HashMap<>(); final ArrayMap<String, Typeface> result = new ArrayMap<>(); Typeface.initSystemDefaultTypefaces(fallbackMap, fontConfig.getAliases(), result); Typeface.initSystemDefaultTypefaces(fallbackMap, fontConfig.getAliases(), result); return result; return result; } } Loading
libs/hwui/jni/fonts/FontFamily.cpp +25 −1 Original line number Original line Diff line number Diff line Loading @@ -83,6 +83,23 @@ static jlong FontFamily_Builder_GetReleaseFunc(CRITICAL_JNI_PARAMS) { return reinterpret_cast<jlong>(releaseFontFamily); return reinterpret_cast<jlong>(releaseFontFamily); } } // FastNative static jstring FontFamily_getLangTags(JNIEnv* env, jobject, jlong familyPtr) { FontFamilyWrapper* family = reinterpret_cast<FontFamilyWrapper*>(familyPtr); uint32_t localeListId = family->family->localeListId(); if (localeListId == 0) { return nullptr; } std::string langTags = minikin::getLocaleString(localeListId); return env->NewStringUTF(langTags.c_str()); } // CriticalNative static jint FontFamily_getVariant(jlong familyPtr) { FontFamilyWrapper* family = reinterpret_cast<FontFamilyWrapper*>(familyPtr); return static_cast<jint>(family->family->variant()); } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// static const JNINativeMethod gFontFamilyBuilderMethods[] = { static const JNINativeMethod gFontFamilyBuilderMethods[] = { Loading @@ -93,9 +110,16 @@ static const JNINativeMethod gFontFamilyBuilderMethods[] = { { "nGetReleaseNativeFamily", "()J", (void*) FontFamily_Builder_GetReleaseFunc }, { "nGetReleaseNativeFamily", "()J", (void*) FontFamily_Builder_GetReleaseFunc }, }; }; static const JNINativeMethod gFontFamilyMethods[] = { {"nGetLangTags", "(J)Ljava/lang/String;", (void*)FontFamily_getLangTags}, {"nGetVariant", "(J)I", (void*)FontFamily_getVariant}, }; int register_android_graphics_fonts_FontFamily(JNIEnv* env) { int register_android_graphics_fonts_FontFamily(JNIEnv* env) { return RegisterMethodsOrDie(env, "android/graphics/fonts/FontFamily$Builder", return RegisterMethodsOrDie(env, "android/graphics/fonts/FontFamily$Builder", gFontFamilyBuilderMethods, NELEM(gFontFamilyBuilderMethods)); gFontFamilyBuilderMethods, NELEM(gFontFamilyBuilderMethods)) + RegisterMethodsOrDie(env, "android/graphics/fonts/FontFamily", gFontFamilyMethods, NELEM(gFontFamilyMethods)); } } } }
services/core/java/com/android/server/graphics/fonts/UpdatableFontDir.java +4 −4 Original line number Original line Diff line number Diff line Loading @@ -27,6 +27,7 @@ import android.os.FileUtils; import android.system.ErrnoException; import android.system.ErrnoException; import android.system.Os; import android.system.Os; import android.text.FontConfig; import android.text.FontConfig; import android.util.ArrayMap; import android.util.Base64; import android.util.Base64; import android.util.Slog; import android.util.Slog; Loading @@ -39,7 +40,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.IOException; import java.security.SecureRandom; import java.security.SecureRandom; import java.time.Instant; import java.time.Instant; import java.util.HashMap; import java.util.List; import java.util.List; import java.util.Map; import java.util.Map; Loading Loading @@ -116,7 +116,7 @@ final class UpdatableFontDir { * FontFileInfo}. All files in this map are validated, and have higher revision numbers than * FontFileInfo}. All files in this map are validated, and have higher revision numbers than * corresponding font files in {@link #mPreinstalledFontDirs}. * corresponding font files in {@link #mPreinstalledFontDirs}. */ */ private final Map<String, FontFileInfo> mFontFileInfoMap = new HashMap<>(); private final ArrayMap<String, FontFileInfo> mFontFileInfoMap = new ArrayMap<>(); UpdatableFontDir(File filesDir, List<File> preinstalledFontDirs, FontFileParser parser, UpdatableFontDir(File filesDir, List<File> preinstalledFontDirs, FontFileParser parser, FsverityUtil fsverityUtil) { FsverityUtil fsverityUtil) { Loading Loading @@ -205,7 +205,7 @@ final class UpdatableFontDir { */ */ public void update(List<FontUpdateRequest> requests) throws SystemFontException { public void update(List<FontUpdateRequest> requests) throws SystemFontException { // Backup the mapping for rollback. // Backup the mapping for rollback. HashMap<String, FontFileInfo> backupMap = new HashMap<>(mFontFileInfoMap); ArrayMap<String, FontFileInfo> backupMap = new ArrayMap<>(mFontFileInfoMap); long backupLastModifiedDate = mLastModifiedDate; long backupLastModifiedDate = mLastModifiedDate; boolean success = false; boolean success = false; try { try { Loading Loading @@ -464,7 +464,7 @@ final class UpdatableFontDir { } } Map<String, File> getFontFileMap() { Map<String, File> getFontFileMap() { Map<String, File> map = new HashMap<>(); Map<String, File> map = new ArrayMap<>(); for (Map.Entry<String, FontFileInfo> entry : mFontFileInfoMap.entrySet()) { for (Map.Entry<String, FontFileInfo> entry : mFontFileInfoMap.entrySet()) { map.put(entry.getKey(), entry.getValue().getFile()); map.put(entry.getKey(), entry.getValue().getFile()); } } Loading