summaryrefslogtreecommitdiff
path: root/graphics/java/android
diff options
context:
space:
mode:
authorSeigo Nonaka <nona@google.com>2021-06-03 23:26:17 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2021-06-03 23:26:17 +0000
commitcec02064d49ca13db96f14c5b2200e69dce4163d (patch)
treef0aab97e49578011f8c3bd66128d696a0e6180ca /graphics/java/android
parentf6d97cfa0b6b0faf117a2c6075659a58a26a89e8 (diff)
parentd5ecababb4c65db2c7f7fa2d7e5b8ddbbae94cf1 (diff)
Merge "Calculate set of available fonts in native" into sc-dev
Diffstat (limited to 'graphics/java/android')
-rw-r--r--graphics/java/android/graphics/fonts/Font.java18
-rw-r--r--graphics/java/android/graphics/fonts/SystemFonts.java52
2 files changed, 19 insertions, 51 deletions
diff --git a/graphics/java/android/graphics/fonts/Font.java b/graphics/java/android/graphics/fonts/Font.java
index 69cd8bdb3e70..cd7936d50dff 100644
--- a/graphics/java/android/graphics/fonts/Font.java
+++ b/graphics/java/android/graphics/fonts/Font.java
@@ -46,7 +46,10 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.FileChannel;
import java.util.Arrays;
+import java.util.Collections;
+import java.util.IdentityHashMap;
import java.util.Objects;
+import java.util.Set;
/**
* A font class can be used for creating FontFamily.
@@ -859,6 +862,18 @@ public final class Font {
+ "}";
}
+ /** @hide */
+ public static Set<Font> getAvailableFonts() {
+ // The font uniqueness is already calculated in the native code. So use IdentityHashMap
+ // for avoiding hash/equals calculation.
+ IdentityHashMap<Font, Font> map = new IdentityHashMap<>();
+ for (long nativePtr : nGetAvailableFontSet()) {
+ Font font = new Font(nativePtr);
+ map.put(font, font);
+ }
+ return Collections.unmodifiableSet(map.keySet());
+ }
+
@CriticalNative
private static native long nGetMinikinFontPtr(long font);
@@ -900,4 +915,7 @@ public final class Font {
@CriticalNative
private static native long nGetAxisInfo(long fontPtr, int i);
+
+ @FastNative
+ private static native long[] nGetAvailableFontSet();
}
diff --git a/graphics/java/android/graphics/fonts/SystemFonts.java b/graphics/java/android/graphics/fonts/SystemFonts.java
index 8d69d447f4e0..6278c0e23f27 100644
--- a/graphics/java/android/graphics/fonts/SystemFonts.java
+++ b/graphics/java/android/graphics/fonts/SystemFonts.java
@@ -22,7 +22,6 @@ import android.graphics.FontListParser;
import android.graphics.Typeface;
import android.text.FontConfig;
import android.util.ArrayMap;
-import android.util.ArraySet;
import android.util.Log;
import com.android.internal.annotations.GuardedBy;
@@ -39,7 +38,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.Set;
/**
@@ -61,36 +59,6 @@ public final class SystemFonts {
private static @GuardedBy("sLock") Set<Font> sAvailableFonts;
/**
- * Helper wrapper class for skipping buffer equality check of Font#equals.
- *
- * Due to historical reasons, the Font#equals checks the byte-by-byte buffer equality which
- * requires heavy IO work in getAvailableFonts. Since the fonts came from system are all regular
- * file backed font instance and stored in the unique place, just comparing file path should be
- * good enough for this case.
- */
- private static final class SystemFontHashWrapper {
- private final Font mFont;
- SystemFontHashWrapper(Font font) {
- mFont = font;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- // All system fonts are regular-file backed font instance, so no need to
- // compare buffers.
- return mFont.paramEquals(((SystemFontHashWrapper) o).mFont);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(mFont);
- }
- }
-
- /**
* Returns all available font files in the system.
*
* @return a set of system fonts
@@ -98,25 +66,7 @@ public final class SystemFonts {
public static @NonNull Set<Font> getAvailableFonts() {
synchronized (LOCK) {
if (sAvailableFonts == null) {
- Set<SystemFontHashWrapper> set = new ArraySet<>();
- for (Typeface tf : Typeface.getSystemFontMap().values()) {
- List<FontFamily> families = tf.getFallback();
- for (int i = 0; i < families.size(); ++i) {
- FontFamily family = families.get(i);
- for (int j = 0; j < family.getSize(); ++j) {
- set.add(new SystemFontHashWrapper(family.getFont(j)));
- }
- }
- }
-
- // Unwrapping font instance for Set<Font> interface. The ArraySet#add won't call
- // Font#equals function if none of two objects has the same hash, so following
- // unwrapping won't cause bad performance due to byte-by-byte equality check.
- ArraySet<Font> result = new ArraySet(set.size());
- for (SystemFontHashWrapper wrapper : set) {
- result.add(wrapper.mFont);
- }
- sAvailableFonts = Collections.unmodifiableSet(result);
+ sAvailableFonts = Font.getAvailableFonts();
}
return sAvailableFonts;
}