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

Commit 5b6347a6 authored by Seigo Nonaka's avatar Seigo Nonaka
Browse files

Introduce setFallbackTypeface

setFallbackTypeface is returned by Builder.build() method when the
provided font is not loaded due to some reasons.
The fallback family is resolved with width/italic passed to Builder.

Bug: 36794225
Test: android.graphics.cts.TypefaceTest passes
Change-Id: I65e220aca823fd815a52437b11c8e6dc952de8e2
parent 061db23b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -13788,6 +13788,7 @@ package android.graphics {
    ctor public Typeface.Builder(java.lang.String);
    ctor public Typeface.Builder(android.content.res.AssetManager, java.lang.String);
    method public android.graphics.Typeface build();
    method public android.graphics.Typeface.Builder setFallback(java.lang.String);
    method public android.graphics.Typeface.Builder setFontVariationSettings(java.lang.String) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
    method public android.graphics.Typeface.Builder setFontVariationSettings(android.graphics.fonts.FontVariationAxis[]);
    method public android.graphics.Typeface.Builder setItalic(boolean);
+1 −0
Original line number Diff line number Diff line
@@ -14555,6 +14555,7 @@ package android.graphics {
    ctor public Typeface.Builder(java.lang.String);
    ctor public Typeface.Builder(android.content.res.AssetManager, java.lang.String);
    method public android.graphics.Typeface build();
    method public android.graphics.Typeface.Builder setFallback(java.lang.String);
    method public android.graphics.Typeface.Builder setFontVariationSettings(java.lang.String) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
    method public android.graphics.Typeface.Builder setFontVariationSettings(android.graphics.fonts.FontVariationAxis[]);
    method public android.graphics.Typeface.Builder setItalic(boolean);
+1 −0
Original line number Diff line number Diff line
@@ -13839,6 +13839,7 @@ package android.graphics {
    ctor public Typeface.Builder(java.lang.String);
    ctor public Typeface.Builder(android.content.res.AssetManager, java.lang.String);
    method public android.graphics.Typeface build();
    method public android.graphics.Typeface.Builder setFallback(java.lang.String);
    method public android.graphics.Typeface.Builder setFontVariationSettings(java.lang.String) throws android.graphics.fonts.FontVariationAxis.InvalidFormatException;
    method public android.graphics.Typeface.Builder setFontVariationSettings(android.graphics.fonts.FontVariationAxis[]);
    method public android.graphics.Typeface.Builder setItalic(boolean);
+2 −6
Original line number Diff line number Diff line
@@ -448,15 +448,11 @@ public class FontsContract {
            int weight, boolean italic, @Nullable String fallbackFontName) {
        final Map<Uri, ByteBuffer> uriBuffer =
                prepareFontData(context, fonts, cancellationSignal);
        Typeface typeface = new Typeface.Builder(fonts, uriBuffer)
        return new Typeface.Builder(fonts, uriBuffer)
            .setFallback(fallbackFontName)
            .setWeight(weight)
            .setItalic(italic)
            .build();
        // TODO: Use Typeface fallback instead.
        if (typeface == null) {
            typeface = Typeface.create(fallbackFontName, Typeface.NORMAL);
        }
        return typeface;
    }

    /**
+23 −9
Original line number Diff line number Diff line
@@ -45,21 +45,24 @@ namespace android {
constexpr jint RESOLVE_BY_FONT_TABLE = -1;

struct NativeFamilyBuilder {
    NativeFamilyBuilder(uint32_t langId, int variant)
        : langId(langId), variant(variant), allowUnsupportedFont(false) {}
    uint32_t langId;
    int variant;
    bool allowUnsupportedFont;
    std::vector<minikin::Font> fonts;
    std::vector<minikin::FontVariation> axes;
};

static jlong FontFamily_initBuilder(JNIEnv* env, jobject clazz, jstring lang, jint variant) {
    NativeFamilyBuilder* builder = new NativeFamilyBuilder();
    NativeFamilyBuilder* builder;
    if (lang != nullptr) {
        ScopedUtfChars str(env, lang);
        builder->langId = minikin::FontStyle::registerLanguageList(str.c_str());
        builder = new NativeFamilyBuilder(
                minikin::FontStyle::registerLanguageList(str.c_str()), variant);
    } else {
        builder->langId = minikin::FontStyle::registerLanguageList("");
        builder = new NativeFamilyBuilder(minikin::FontStyle::registerLanguageList(""), variant);
    }
    builder->variant = variant;
    return reinterpret_cast<jlong>(builder);
}

@@ -67,12 +70,22 @@ static jlong FontFamily_create(jlong builderPtr) {
    if (builderPtr == 0) {
        return 0;
    }
    std::unique_ptr<NativeFamilyBuilder> builder(
            reinterpret_cast<NativeFamilyBuilder*>(builderPtr));
    std::shared_ptr<minikin::FontFamily> family = std::make_shared<minikin::FontFamily>(
            builder->langId, builder->variant, std::move(builder->fonts));
    if (family->getCoverage().length() == 0 && !builder->allowUnsupportedFont) {
        return 0;
    }
    return reinterpret_cast<jlong>(new FontFamilyWrapper(std::move(family)));
}

static void FontFamily_allowUnsupportedFont(jlong builderPtr) {
    if (builderPtr == 0) {
        return;
    }
    NativeFamilyBuilder* builder = reinterpret_cast<NativeFamilyBuilder*>(builderPtr);
    FontFamilyWrapper* family = new FontFamilyWrapper(
            std::make_shared<minikin::FontFamily>(
                    builder->langId, builder->variant, std::move(builder->fonts)));
    delete builder;
    return reinterpret_cast<jlong>(family);
    builder->allowUnsupportedFont = true;
}

static void FontFamily_abort(jlong builderPtr) {
@@ -258,6 +271,7 @@ static void FontFamily_addAxisValue(jlong builderPtr, jint tag, jfloat value) {
static const JNINativeMethod gFontFamilyMethods[] = {
    { "nInitBuilder",          "(Ljava/lang/String;I)J", (void*)FontFamily_initBuilder },
    { "nCreateFamily",         "(J)J", (void*)FontFamily_create },
    { "nAllowUnsupportedFont", "(J)V", (void*)FontFamily_allowUnsupportedFont },
    { "nAbort",                "(J)V", (void*)FontFamily_abort },
    { "nUnrefFamily",          "(J)V", (void*)FontFamily_unref },
    { "nAddFont",              "(JLjava/nio/ByteBuffer;III)Z", (void*)FontFamily_addFont },
Loading