Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac94f71d authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Update native font API to read updated font files." into sc-dev am: 2ce8aef9

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14191379

Change-Id: Ibd252eeaceb6d4b2cfbbe8397092355834ef0ae2
parents e993b8be 2ce8aef9
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.graphics.Typeface;
import android.os.SharedMemory;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.util.ArrayMap;

import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
@@ -55,9 +56,10 @@ public class TypefaceSerializationPerfTest {
        ByteBuffer buffer = memory.mapReadOnly().order(ByteOrder.BIG_ENDIAN);
        BenchmarkState state = mPerfStatusReporter.getBenchmarkState();

        ArrayMap<String, Typeface> out = new ArrayMap<>();
        while (state.keepRunning()) {
            buffer.position(0);
            Typeface.deserializeFontMap(buffer);
            Typeface.deserializeFontMap(buffer, out);
        }
    }

+1 −1
Original line number Diff line number Diff line
@@ -999,7 +999,7 @@ package android.graphics {
  }

  public class Typeface {
    method @NonNull public static java.util.Map<java.lang.String,android.graphics.Typeface> deserializeFontMap(@NonNull java.nio.ByteBuffer) throws java.io.IOException;
    method @NonNull public static long[] deserializeFontMap(@NonNull java.nio.ByteBuffer, @NonNull java.util.Map<java.lang.String,android.graphics.Typeface>) throws java.io.IOException;
    method @Nullable public static android.os.SharedMemory getSystemFontMapSharedMemory();
    method @NonNull public static android.os.SharedMemory serializeFontMap(@NonNull java.util.Map<java.lang.String,android.graphics.Typeface>) throws android.system.ErrnoException, java.io.IOException;
  }
+4 −2
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.graphics.fonts.FontFamily;
import android.graphics.fonts.SystemFonts;
import android.os.SharedMemory;
import android.text.FontConfig;
import android.util.ArrayMap;

import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
@@ -200,8 +201,9 @@ public class TypefaceTest {
        Map<String, Typeface> systemFontMap = SystemFonts.buildSystemTypefaces(fontConfig,
                fallbackMap);
        SharedMemory sharedMemory = Typeface.serializeFontMap(systemFontMap);
        Map<String, Typeface> copiedFontMap =
                Typeface.deserializeFontMap(sharedMemory.mapReadOnly().order(ByteOrder.BIG_ENDIAN));
        Map<String, Typeface> copiedFontMap = new ArrayMap<>();
        Typeface.deserializeFontMap(sharedMemory.mapReadOnly().order(ByteOrder.BIG_ENDIAN),
                copiedFontMap);
        assertEquals(systemFontMap.size(), copiedFontMap.size());
        for (String key : systemFontMap.keySet()) {
            assertTrue(copiedFontMap.containsKey(key));
+16 −5
Original line number Diff line number Diff line
@@ -1259,20 +1259,21 @@ public class Typeface {
     * @hide
     */
    @TestApi
    public static @NonNull Map<String, Typeface> deserializeFontMap(@NonNull ByteBuffer buffer)
    public static @NonNull long[] deserializeFontMap(
            @NonNull ByteBuffer buffer, @NonNull Map<String, Typeface> out)
            throws IOException {
        Map<String, Typeface> fontMap = new ArrayMap<>();
        int typefacesBytesCount = buffer.getInt();
        long[] nativePtrs = nativeReadTypefaces(buffer.slice());
        if (nativePtrs == null) {
            throw new IOException("Could not read typefaces");
        }
        out.clear();
        buffer.position(buffer.position() + typefacesBytesCount);
        for (long nativePtr : nativePtrs) {
            String name = readString(buffer);
            fontMap.put(name, new Typeface(nativePtr));
            out.put(name, new Typeface(nativePtr));
        }
        return fontMap;
        return nativePtrs;
    }

    private static String readString(ByteBuffer buffer) {
@@ -1330,7 +1331,14 @@ public class Typeface {
                return;
            }
            sSystemFontMapBuffer = sharedMemory.mapReadOnly().order(ByteOrder.BIG_ENDIAN);
            Map<String, Typeface> systemFontMap = deserializeFontMap(sSystemFontMapBuffer);
            Map<String, Typeface> systemFontMap = new ArrayMap<>();
            long[] nativePtrs = deserializeFontMap(sSystemFontMapBuffer, systemFontMap);

            // Initialize native font APIs. The native font API will read fonts.xml by itself if
            // Typeface is initialized with loadPreinstalledSystemFontMap.
            for (long ptr : nativePtrs) {
                nativeAddFontCollections(ptr);
            }
            setSystemFontMap(systemFontMap);
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS);
@@ -1528,5 +1536,8 @@ public class Typeface {

    private static native void nativeForceSetStaticFinalField(String fieldName, Typeface typeface);

    @CriticalNative
    private static native void nativeAddFontCollections(long nativePtr);

    private static native void nativeWarmUpCache(String fileName);
}
+7 −0
Original line number Diff line number Diff line
@@ -373,6 +373,12 @@ static void Typeface_warmUpCache(JNIEnv* env, jobject, jstring jFilePath) {
    makeSkDataCached(filePath.c_str(), false /* fs verity */);
}

// Critical Native
static void Typeface_addFontCollection(CRITICAL_JNI_PARAMS_COMMA jlong faceHandle) {
    std::shared_ptr<minikin::FontCollection> collection = toTypeface(faceHandle)->fFontCollection;
    minikin::SystemFonts::addFontMap(std::move(collection));
}

///////////////////////////////////////////////////////////////////////////////

static const JNINativeMethod gTypefaceMethods[] = {
@@ -397,6 +403,7 @@ static const JNINativeMethod gTypefaceMethods[] = {
        {"nativeGetFamilySize", "(J)I", (void*)Typeface_getFamilySize},
        {"nativeGetFamily", "(JI)J", (void*)Typeface_getFamily},
        {"nativeWarmUpCache", "(Ljava/lang/String;)V", (void*)Typeface_warmUpCache},
        {"nativeAddFontCollections", "(J)V", (void*)Typeface_addFontCollection},
};

int register_android_graphics_Typeface(JNIEnv* env)
Loading