diff options
| -rwxr-xr-x | api/current.txt | 6 | ||||
| -rw-r--r-- | core/java/android/content/res/FontResourcesParser.java | 6 | ||||
| -rw-r--r-- | core/java/android/content/res/ResourcesImpl.java | 3 | ||||
| -rw-r--r-- | core/java/android/provider/FontsContract.java | 44 | ||||
| -rw-r--r-- | graphics/java/android/graphics/Typeface.java | 352 | ||||
| -rw-r--r-- | graphics/java/android/graphics/fonts/Font.java | 37 | ||||
| -rw-r--r-- | graphics/java/android/graphics/fonts/FontFamily.java | 2 |
7 files changed, 198 insertions, 252 deletions
diff --git a/api/current.txt b/api/current.txt index 2d6c68c48493..931eed57e05c 100755 --- a/api/current.txt +++ b/api/current.txt @@ -14679,8 +14679,7 @@ package android.graphics { ctor public Typeface.CustomFallbackBuilder(android.graphics.fonts.FontFamily); method public android.graphics.Typeface build(); method public android.graphics.Typeface.CustomFallbackBuilder setFallback(java.lang.String); - method public android.graphics.Typeface.CustomFallbackBuilder setItalic(boolean); - method public android.graphics.Typeface.CustomFallbackBuilder setWeight(int); + method public android.graphics.Typeface.CustomFallbackBuilder setStyle(android.graphics.fonts.FontStyle); } public class Xfermode { @@ -15325,9 +15324,8 @@ package android.graphics.fonts { method public java.nio.ByteBuffer getBuffer(); method public java.io.File getFile(); method public android.os.LocaleList getLocaleList(); - method public int getSlant(); + method public android.graphics.fonts.FontStyle getStyle(); method public int getTtcIndex(); - method public int getWeight(); } public static class Font.Builder { diff --git a/core/java/android/content/res/FontResourcesParser.java b/core/java/android/content/res/FontResourcesParser.java index 6a4aae66c848..14eb11ab8863 100644 --- a/core/java/android/content/res/FontResourcesParser.java +++ b/core/java/android/content/res/FontResourcesParser.java @@ -76,6 +76,10 @@ public class FontResourcesParser { // A class represents font element in xml file which points a file in resource. public static final class FontFileResourceEntry { + public static final int RESOLVE_BY_FONT_TABLE = Typeface.RESOLVE_BY_FONT_TABLE; + public static final int UPRIGHT = 0; + public static final int ITALIC = 1; + private final @NonNull String mFileName; private int mWeight; private int mItalic; @@ -216,7 +220,7 @@ public class FontResourcesParser { int weight = array.getInt(R.styleable.FontFamilyFont_fontWeight, Typeface.RESOLVE_BY_FONT_TABLE); int italic = array.getInt(R.styleable.FontFamilyFont_fontStyle, - Typeface.RESOLVE_BY_FONT_TABLE); + FontFileResourceEntry.RESOLVE_BY_FONT_TABLE); String variationSettings = array.getString( R.styleable.FontFamilyFont_fontVariationSettings); int ttcIndex = array.getInt(R.styleable.FontFamilyFont_ttcIndex, 0); diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java index dfa30a22597e..1d1eaf3e4286 100644 --- a/core/java/android/content/res/ResourcesImpl.java +++ b/core/java/android/content/res/ResourcesImpl.java @@ -944,7 +944,8 @@ public class ResourcesImpl { } return Typeface.createFromResources(familyEntry, mAssets, file); } - return Typeface.createFromResources(mAssets, file, value.assetCookie); + return new Typeface.Builder(mAssets, file, false /* isAsset */, value.assetCookie) + .build(); } catch (XmlPullParserException e) { Log.e(TAG, "Failed to parse xml resource " + file, e); } catch (IOException e) { diff --git a/core/java/android/provider/FontsContract.java b/core/java/android/provider/FontsContract.java index a1d1c5736116..76607e9d42d2 100644 --- a/core/java/android/provider/FontsContract.java +++ b/core/java/android/provider/FontsContract.java @@ -15,8 +15,6 @@ */ package android.provider; -import static java.lang.annotation.RetentionPolicy.SOURCE; - import android.annotation.IntDef; import android.annotation.IntRange; import android.annotation.NonNull; @@ -25,22 +23,22 @@ import android.content.ContentResolver; import android.content.ContentUris; import android.content.Context; import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ProviderInfo; import android.content.pm.Signature; import android.database.Cursor; import android.graphics.Typeface; +import android.graphics.fonts.Font; +import android.graphics.fonts.FontFamily; +import android.graphics.fonts.FontStyle; import android.graphics.fonts.FontVariationAxis; import android.net.Uri; -import android.os.Bundle; import android.os.CancellationSignal; import android.os.Handler; import android.os.HandlerThread; import android.os.ParcelFileDescriptor; import android.os.Process; -import android.os.ResultReceiver; -import android.util.ArraySet; import android.util.Log; import android.util.LruCache; @@ -49,7 +47,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -64,11 +61,11 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; /** * Utility class to deal with Font ContentProviders. @@ -636,7 +633,34 @@ public class FontsContract { if (uriBuffer.isEmpty()) { return null; } - return new Typeface.Builder(fonts, uriBuffer).build(); + + FontFamily.Builder familyBuilder = null; + for (FontInfo fontInfo : fonts) { + final ByteBuffer buffer = uriBuffer.get(fontInfo.getUri()); + if (buffer == null) { + continue; + } + try { + final Font font = new Font.Builder(buffer) + .setWeight(fontInfo.getWeight()) + .setSlant(fontInfo.isItalic() + ? FontStyle.FONT_SLANT_ITALIC : FontStyle.FONT_SLANT_UPRIGHT) + .setTtcIndex(fontInfo.getTtcIndex()) + .setFontVariationSettings(fontInfo.getAxes()) + .build(); + if (familyBuilder == null) { + familyBuilder = new FontFamily.Builder(font); + } else { + familyBuilder.addFont(font); + } + } catch (IOException e) { + continue; + } + } + if (familyBuilder == null) { + return null; + } + return new Typeface.CustomFallbackBuilder(familyBuilder.build()).build(); } /** diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java index 5c0c38ee7666..a09b063e8afe 100644 --- a/graphics/java/android/graphics/Typeface.java +++ b/graphics/java/android/graphics/Typeface.java @@ -27,10 +27,11 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UnsupportedAppUsage; import android.content.res.AssetManager; +import android.graphics.fonts.Font; +import android.graphics.fonts.FontFamily; import android.graphics.fonts.FontStyle; import android.graphics.fonts.FontVariationAxis; import android.graphics.fonts.SystemFonts; -import android.net.Uri; import android.os.Build; import android.provider.FontRequest; import android.provider.FontsContract; @@ -50,13 +51,10 @@ import libcore.util.NativeAllocationRegistry; import java.io.File; import java.io.FileDescriptor; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -126,7 +124,8 @@ public class Typeface { // We cannot support sSystemFallbackMap since we will migrate to public FontFamily API. @UnsupportedAppUsage - static final Map<String, FontFamily[]> sSystemFallbackMap = Collections.emptyMap(); + static final Map<String, android.graphics.FontFamily[]> sSystemFallbackMap = + Collections.emptyMap(); /** * @hide @@ -164,6 +163,9 @@ public class Typeface { private int[] mSupportedAxes; private static final int[] EMPTY_AXES = {}; + // The underlying font families. + private final FontFamily[] mFamilies; + @UnsupportedAppUsage private static void setDefault(Typeface t) { sDefaultTypeface = t; @@ -192,38 +194,6 @@ public class Typeface { /** * @hide - * Used by Resources to load a font resource of type font file. - */ - @Nullable - public static Typeface createFromResources(AssetManager mgr, String path, int cookie) { - synchronized (sDynamicCacheLock) { - final String key = Builder.createAssetUid( - mgr, path, 0 /* ttcIndex */, null /* axes */, - RESOLVE_BY_FONT_TABLE /* weight */, RESOLVE_BY_FONT_TABLE /* italic */, - DEFAULT_FAMILY); - Typeface typeface = sDynamicTypefaceCache.get(key); - if (typeface != null) return typeface; - - FontFamily fontFamily = new FontFamily(); - // TODO: introduce ttc index and variation settings to resource type font. - if (fontFamily.addFontFromAssetManager(mgr, path, cookie, false /* isAsset */, - 0 /* ttcIndex */, RESOLVE_BY_FONT_TABLE /* weight */, - RESOLVE_BY_FONT_TABLE /* italic */, null /* axes */)) { - if (!fontFamily.freeze()) { - return null; - } - FontFamily[] families = {fontFamily}; - typeface = createFromFamiliesWithDefault(families, DEFAULT_FAMILY, - RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE); - sDynamicTypefaceCache.put(key, typeface); - return typeface; - } - } - return null; - } - - /** - * @hide * Used by Resources to load a font resource of type xml. */ @Nullable @@ -258,21 +228,34 @@ public class Typeface { // family is FontFamilyFilesResourceEntry final FontFamilyFilesResourceEntry filesEntry = (FontFamilyFilesResourceEntry) entry; - FontFamily fontFamily = new FontFamily(); - for (final FontFileResourceEntry fontFile : filesEntry.getEntries()) { - if (!fontFamily.addFontFromAssetManager(mgr, fontFile.getFileName(), - 0 /* resourceCookie */, false /* isAsset */, fontFile.getTtcIndex(), - fontFile.getWeight(), fontFile.getItalic(), - FontVariationAxis.fromFontVariationSettings(fontFile.getVariationSettings()))) { - return null; + try { + FontFamily.Builder familyBuilder = null; + for (final FontFileResourceEntry fontFile : filesEntry.getEntries()) { + final Font.Builder fontBuilder = new Font.Builder(mgr, fontFile.getFileName(), + false /* isAsset */, 0 /* cookie */) + .setTtcIndex(fontFile.getTtcIndex()) + .setFontVariationSettings(fontFile.getVariationSettings()); + if (fontFile.getWeight() != Typeface.RESOLVE_BY_FONT_TABLE) { + fontBuilder.setWeight(fontFile.getWeight()); + } + if (fontFile.getItalic() != Typeface.RESOLVE_BY_FONT_TABLE) { + fontBuilder.setSlant(fontFile.getItalic() == FontFileResourceEntry.ITALIC + ? FontStyle.FONT_SLANT_ITALIC : FontStyle.FONT_SLANT_UPRIGHT); + } + + if (familyBuilder == null) { + familyBuilder = new FontFamily.Builder(fontBuilder.build()); + } else { + familyBuilder.addFont(fontBuilder.build()); + } } + if (familyBuilder == null) { + return Typeface.DEFAULT; + } + typeface = new Typeface.CustomFallbackBuilder(familyBuilder.build()).build(); + } catch (IOException e) { + typeface = Typeface.DEFAULT; } - if (!fontFamily.freeze()) { - return null; - } - FontFamily[] familyChain = { fontFamily }; - typeface = createFromFamiliesWithDefault(familyChain, DEFAULT_FAMILY, - RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE); synchronized (sDynamicCacheLock) { final String key = Builder.createAssetUid(mgr, path, 0 /* ttcIndex */, null /* axes */, RESOLVE_BY_FONT_TABLE /* weight */, @@ -339,15 +322,11 @@ public class Typeface { /** @hide */ public static final int BOLD_WEIGHT = 700; - private int mTtcIndex; - private FontVariationAxis[] mAxes; + // Kept for generating asset cache key. + private final AssetManager mAssetManager; + private final String mPath; - private AssetManager mAssetManager; - private String mPath; - private FileDescriptor mFd; - - private FontsContract.FontInfo[] mFonts; - private Map<Uri, ByteBuffer> mFontBuffers; + private final Font.Builder mFontBuilder; private String mFallbackFamilyName; @@ -360,7 +339,9 @@ public class Typeface { * @param path The file object refers to the font file. */ public Builder(@NonNull File path) { - mPath = path.getAbsolutePath(); + mFontBuilder = new Font.Builder(path); + mAssetManager = null; + mPath = null; } /** @@ -372,7 +353,9 @@ public class Typeface { * @param fd The file descriptor. The passed fd must be mmap-able. */ public Builder(@NonNull FileDescriptor fd) { - mFd = fd; + mFontBuilder = new Font.Builder(fd); + mAssetManager = null; + mPath = null; } /** @@ -381,7 +364,9 @@ public class Typeface { * @param path The full path to the font file. */ public Builder(@NonNull String path) { - mPath = path; + mFontBuilder = new Font.Builder(new File(path)); + mAssetManager = null; + mPath = null; } /** @@ -391,27 +376,22 @@ public class Typeface { * @param path The file name of the font data in the asset directory */ public Builder(@NonNull AssetManager assetManager, @NonNull String path) { - mAssetManager = Preconditions.checkNotNull(assetManager); - mPath = Preconditions.checkStringNotEmpty(path); + this(assetManager, path, true /* is asset */, 0 /* cookie */); } /** - * Constracts a builder from an array of FontsContract.FontInfo. - * - * Since {@link FontsContract.FontInfo} holds information about TTC indices and - * variation settings, there is no need to call {@link #setTtcIndex} or - * {@link #setFontVariationSettings}. Similary, {@link FontsContract.FontInfo} holds - * weight and italic information, so {@link #setWeight} and {@link #setItalic} are used - * for style matching during font selection. + * Constructs a builder from an asset manager and a file path in an asset directory. * - * @param fonts The array of {@link FontsContract.FontInfo} - * @param buffers The mapping from URI to buffers to be used during building. + * @param assetManager The application's asset manager + * @param path The file name of the font data in the asset directory + * @param cookie a cookie for the asset * @hide */ - public Builder(@NonNull FontsContract.FontInfo[] fonts, - @NonNull Map<Uri, ByteBuffer> buffers) { - mFonts = fonts; - mFontBuffers = buffers; + public Builder(@NonNull AssetManager assetManager, @NonNull String path, boolean isAsset, + int cookie) { + mFontBuilder = new Font.Builder(assetManager, path, isAsset, cookie); + mAssetManager = assetManager; + mPath = path; } /** @@ -423,6 +403,7 @@ public class Typeface { */ public Builder setWeight(@IntRange(from = 1, to = 1000) int weight) { mWeight = weight; + mFontBuilder.setWeight(weight); return this; } @@ -434,7 +415,8 @@ public class Typeface { * @param italic {@code true} if the font is italic. Otherwise {@code false}. */ public Builder setItalic(boolean italic) { - mItalic = italic ? STYLE_ITALIC : STYLE_NORMAL; + mItalic = italic ? FontStyle.FONT_SLANT_ITALIC : FontStyle.FONT_SLANT_UPRIGHT; + mFontBuilder.setSlant(mItalic); return this; } @@ -446,11 +428,7 @@ public class Typeface { * collection, do not call this method or specify 0. */ public Builder setTtcIndex(@IntRange(from = 0) int ttcIndex) { - if (mFonts != null) { - throw new IllegalArgumentException( - "TTC index can not be specified for FontResult source."); - } - mTtcIndex = ttcIndex; + mFontBuilder.setTtcIndex(ttcIndex); return this; } @@ -462,14 +440,7 @@ public class Typeface { * format. */ public Builder setFontVariationSettings(@Nullable String variationSettings) { - if (mFonts != null) { - throw new IllegalArgumentException( - "Font variation settings can not be specified for FontResult source."); - } - if (mAxes != null) { - throw new IllegalStateException("Font variation settings are already set."); - } - mAxes = FontVariationAxis.fromFontVariationSettings(variationSettings); + mFontBuilder.setFontVariationSettings(variationSettings); return this; } @@ -479,14 +450,7 @@ public class Typeface { * @param axes An array of font variation axis tag-value pairs. */ public Builder setFontVariationSettings(@Nullable FontVariationAxis[] axes) { - if (mFonts != null) { - throw new IllegalArgumentException( - "Font variation settings can not be specified for FontResult source."); - } - if (mAxes != null) { - throw new IllegalStateException("Font variation settings are already set."); - } - mAxes = axes; + mFontBuilder.setFontVariationSettings(axes); return this; } @@ -579,91 +543,41 @@ public class Typeface { * @return Newly created Typeface. May return null if some parameters are invalid. */ public Typeface build() { - if (mFd != null) { // Builder is created with file descriptor. - try (FileInputStream fis = new FileInputStream(mFd)) { - FileChannel channel = fis.getChannel(); - long size = channel.size(); - ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, size); - - final FontFamily fontFamily = new FontFamily(); - if (!fontFamily.addFontFromBuffer(buffer, mTtcIndex, mAxes, mWeight, mItalic)) { - fontFamily.abortCreation(); - return resolveFallbackTypeface(); - } - if (!fontFamily.freeze()) { - return resolveFallbackTypeface(); - } - FontFamily[] families = { fontFamily }; - return createFromFamiliesWithDefault(families, mFallbackFamilyName, mWeight, - mItalic); - } catch (IOException e) { - return resolveFallbackTypeface(); - } - } else if (mAssetManager != null) { // Builder is created with asset manager. - final String key = createAssetUid( - mAssetManager, mPath, mTtcIndex, mAxes, mWeight, mItalic, + try { + final Font font = mFontBuilder.build(); + final String key = mAssetManager == null ? null : createAssetUid( + mAssetManager, mPath, font.getTtcIndex(), font.getAxes(), + font.getStyle().getWeight(), font.getStyle().getSlant(), mFallbackFamilyName); - synchronized (sDynamicCacheLock) { - Typeface typeface = sDynamicTypefaceCache.get(key); - if (typeface != null) return typeface; - final FontFamily fontFamily = new FontFamily(); - if (!fontFamily.addFontFromAssetManager(mAssetManager, mPath, mTtcIndex, - true /* isAsset */, mTtcIndex, mWeight, mItalic, mAxes)) { - fontFamily.abortCreation(); - return resolveFallbackTypeface(); - } - if (!fontFamily.freeze()) { - return resolveFallbackTypeface(); + if (key != null) { + // Dynamic cache lookup is only for assets. + synchronized (sDynamicCacheLock) { + final Typeface typeface = sDynamicTypefaceCache.get(key); + if (typeface != null) { + return typeface; + } } - FontFamily[] families = { fontFamily }; - typeface = createFromFamiliesWithDefault(families, mFallbackFamilyName, - mWeight, mItalic); - sDynamicTypefaceCache.put(key, typeface); - return typeface; - } - } else if (mPath != null) { // Builder is created with file path. - final FontFamily fontFamily = new FontFamily(); - if (!fontFamily.addFont(mPath, mTtcIndex, mAxes, mWeight, mItalic)) { - fontFamily.abortCreation(); - return resolveFallbackTypeface(); } - if (!fontFamily.freeze()) { - return resolveFallbackTypeface(); + final FontFamily family = new FontFamily.Builder(font).build(); + final int weight = mWeight == RESOLVE_BY_FONT_TABLE + ? font.getStyle().getWeight() : mWeight; + final int slant = mItalic == RESOLVE_BY_FONT_TABLE + ? font.getStyle().getSlant() : mItalic; + final CustomFallbackBuilder builder = new CustomFallbackBuilder(family) + .setStyle(new FontStyle(weight, slant)); + if (mFallbackFamilyName != null) { + builder.setFallback(mFallbackFamilyName); } - FontFamily[] families = { fontFamily }; - return createFromFamiliesWithDefault(families, mFallbackFamilyName, mWeight, - mItalic); - } else if (mFonts != null) { - final FontFamily fontFamily = new FontFamily(); - boolean atLeastOneFont = false; - for (FontsContract.FontInfo font : mFonts) { - final ByteBuffer fontBuffer = mFontBuffers.get(font.getUri()); - if (fontBuffer == null) { - continue; // skip + final Typeface typeface = builder.build(); + if (key != null) { + synchronized (sDynamicCacheLock) { + sDynamicTypefaceCache.put(key, typeface); } - final boolean success = fontFamily.addFontFromBuffer(fontBuffer, - font.getTtcIndex(), font.getAxes(), font.getWeight(), - font.isItalic() ? STYLE_ITALIC : STYLE_NORMAL); - if (!success) { - fontFamily.abortCreation(); - return null; - } - atLeastOneFont = true; - } - if (!atLeastOneFont) { - // No fonts are avaialble. No need to create new Typeface and returns fallback - // Typeface instead. - fontFamily.abortCreation(); - return null; } - fontFamily.freeze(); - FontFamily[] families = { fontFamily }; - return createFromFamiliesWithDefault(families, mFallbackFamilyName, mWeight, - mItalic); + return typeface; + } catch (IOException | IllegalArgumentException e) { + return resolveFallbackTypeface(); } - - // Must not reach here. - throw new IllegalArgumentException("No source was set."); } } @@ -713,8 +627,7 @@ public class Typeface { // TODO: Remove package modifier once android.graphics.FontFamily is deprecated. private final android.graphics.fonts.FontFamily mFamily; private String mFallbackName = null; - private @IntRange(from = 0, to = 1000) int mWeight = 400; - private boolean mItalic = false; + private @Nullable FontStyle mStyle; /** * Constructs a builder with a font family. @@ -740,35 +653,16 @@ public class Typeface { } /** - * Sets a weight of the Typeface. + * Sets a font style of the Typeface. * - * If the font family doesn't have a font of given weight, system will select the closest + * If the font family doesn't have a font of given style, system will select the closest * font from font family. For example, if a font family has fonts of 300 weight and 700 * weight then setWeight(400) is called, system will select the font of 300 weight. * - * @see Font#FONT_WEIGHT_THIN - * @see Font#FONT_WEIGHT_EXTRA_LIGHT - * @see Font#FONT_WEIGHT_LIGHT - * @see Font#FONT_WEIGHT_NORMAL - * @see Font#FONT_WEIGHT_MEDIUM - * @see Font#FONT_WEIGHT_SEMI_BOLD - * @see Font#FONT_WEIGHT_BOLD - * @see Font#FONT_WEIGHT_EXTRA_BOLD - * @see Font#FONT_WEIGHT_BLACK - * @param weight a weight value + * @param style a font style */ - public CustomFallbackBuilder setWeight(@IntRange(from = 0, to = 1000) int weight) { - mWeight = weight; - return this; - } - - /** - * Sets a italic style of the Typeface. - * - * @param italic true if italic, otherwise false - */ - public CustomFallbackBuilder setItalic(boolean italic) { - mItalic = italic; + public CustomFallbackBuilder setStyle(@NonNull FontStyle style) { + mStyle = style; return this; } @@ -778,14 +672,20 @@ public class Typeface { * @return the Typeface object */ public Typeface build() { - final android.graphics.fonts.FontFamily[] fallback = - SystemFonts.getSystemFallback(mFallbackName); + final FontFamily[] fallback = SystemFonts.getSystemFallback(mFallbackName); + final FontFamily[] fullFamilies = new FontFamily[fallback.length + 1]; final long[] ptrArray = new long[fallback.length + 1]; ptrArray[0] = mFamily.getNativePtr(); + fullFamilies[0] = mFamily; for (int i = 0; i < fallback.length; ++i) { ptrArray[i + 1] = fallback[i].getNativePtr(); + fullFamilies[i + 1] = fallback[i]; } - return new Typeface(nativeCreateFromArray(ptrArray, mWeight, mItalic ? 1 : 0)); + final int weight = mStyle == null ? 400 : mStyle.getWeight(); + final int italic = + (mStyle == null || mStyle.getSlant() == FontStyle.FONT_SLANT_UPRIGHT) ? 0 : 1; + + return new Typeface(nativeCreateFromArray(ptrArray, weight, italic), fullFamilies); } } @@ -850,7 +750,7 @@ public class Typeface { } } - typeface = new Typeface(nativeCreateFromTypeface(ni, style)); + typeface = new Typeface(nativeCreateFromTypeface(ni, style), family.mFamilies); styles.put(style, typeface); } return typeface; @@ -919,7 +819,7 @@ public class Typeface { typeface = new Typeface( nativeCreateFromTypefaceWithExactStyle( - base.native_instance, weight, italic)); + base.native_instance, weight, italic), base.mFamilies); innerCache.put(key, typeface); } return typeface; @@ -928,8 +828,9 @@ public class Typeface { /** @hide */ public static Typeface createFromTypefaceWithVariation(@Nullable Typeface family, @NonNull List<FontVariationAxis> axes) { - final long ni = family == null ? 0 : family.native_instance; - return new Typeface(nativeCreateFromTypefaceWithVariation(ni, axes)); + final Typeface base = family == null ? Typeface.DEFAULT : family; + return new Typeface(nativeCreateFromTypefaceWithVariation(base.native_instance, axes), + base.mFamilies); } /** @@ -1015,7 +916,7 @@ public class Typeface { */ @Deprecated @UnsupportedAppUsage - private static Typeface createFromFamilies(FontFamily[] families) { + private static Typeface createFromFamilies(android.graphics.FontFamily[] families) { long[] ptrArray = new long[families.length]; for (int i = 0; i < families.length; i++) { ptrArray[i] = families[i].mNativePtr; @@ -1029,14 +930,13 @@ public class Typeface { * * @param families array of font families */ - private static Typeface createFromFamilies( - @Nullable android.graphics.fonts.FontFamily[] families) { + private static Typeface createFromFamilies(@Nullable FontFamily[] families) { final long[] ptrArray = new long[families.length]; for (int i = 0; i < families.length; ++i) { ptrArray[i] = families[i].getNativePtr(); } return new Typeface(nativeCreateFromArray(ptrArray, - RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE)); + RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE), families); } /** @@ -1044,8 +944,8 @@ public class Typeface { * TODO: Remove private API use in supportlib: http://b/72665240 */ @UnsupportedAppUsage - private static Typeface createFromFamiliesWithDefault(FontFamily[] families, int weight, - int italic) { + private static Typeface createFromFamiliesWithDefault( + android.graphics.FontFamily[] families, int weight, int italic) { return createFromFamiliesWithDefault(families, DEFAULT_FAMILY, weight, italic); } @@ -1063,7 +963,7 @@ public class Typeface { * @param families array of font families */ @UnsupportedAppUsage - private static Typeface createFromFamiliesWithDefault(FontFamily[] families, + private static Typeface createFromFamiliesWithDefault(android.graphics.FontFamily[] families, String fallbackName, int weight, int italic) { android.graphics.fonts.FontFamily[] fallback = SystemFonts.getSystemFallback(fallbackName); long[] ptrArray = new long[families.length + fallback.length]; @@ -1084,6 +984,19 @@ public class Typeface { } native_instance = ni; + mFamilies = new FontFamily[0]; + sRegistry.registerNativeAllocation(this, native_instance); + mStyle = nativeGetStyle(ni); + mWeight = nativeGetWeight(ni); + } + + private Typeface(long ni, @NonNull FontFamily[] families) { + if (ni == 0) { + throw new IllegalStateException("native typeface cannot be made"); + } + + native_instance = ni; + mFamilies = families; sRegistry.registerNativeAllocation(this, native_instance); mStyle = nativeGetStyle(ni); mWeight = nativeGetWeight(ni); @@ -1097,9 +1010,9 @@ public class Typeface { /** @hide */ @VisibleForTesting public static void initSystemDefaultTypefaces(Map<String, Typeface> systemFontMap, - Map<String, android.graphics.fonts.FontFamily[]> fallbacks, + Map<String, FontFamily[]> fallbacks, FontConfig.Alias[] aliases) { - for (Map.Entry<String, android.graphics.fonts.FontFamily[]> entry : fallbacks.entrySet()) { + for (Map.Entry<String, FontFamily[]> entry : fallbacks.entrySet()) { systemFontMap.put(entry.getKey(), createFromFamilies(entry.getValue())); } @@ -1110,7 +1023,8 @@ public class Typeface { final Typeface base = systemFontMap.get(alias.getToName()); final int weight = alias.getWeight(); final Typeface newFace = weight == 400 ? base : - new Typeface(nativeCreateWeightAlias(base.native_instance, weight)); + new Typeface(nativeCreateWeightAlias(base.native_instance, weight), + base.mFamilies); systemFontMap.put(alias.getName(), newFace); } } diff --git a/graphics/java/android/graphics/fonts/Font.java b/graphics/java/android/graphics/fonts/Font.java index 0a8c68559c8c..7f165bfc6a7d 100644 --- a/graphics/java/android/graphics/fonts/Font.java +++ b/graphics/java/android/graphics/fonts/Font.java @@ -151,7 +151,21 @@ public final class Font { * @param path the file name of the font data in the asset directory */ public Builder(@NonNull AssetManager am, @NonNull String path) { - final long nativeAsset = nGetNativeAsset(am, path, true /* is asset */, 0 /* cookie */); + this(am, path, true /* is asset */, 0 /* cookie */); + } + + /** + * Constructs a builder from an asset manager and a file path in an asset directory. + * + * @param am the application's asset manager + * @param path the file name of the font data in the asset directory + * @param isAsset true if the undelying data is in asset + * @param cookie set asset cookie + * @hide + */ + public Builder(@NonNull AssetManager am, @NonNull String path, boolean isAsset, + int cookie) { + final long nativeAsset = nGetNativeAsset(am, path, isAsset, cookie); if (nativeAsset == 0) { mException = new FileNotFoundException("Unable to open " + path); return; @@ -293,7 +307,7 @@ public final class Font { * will resolve the style by reading font tables. * * For example, if you want to use italic font as upright font, call {@code - * setSlant(false)} explicitly. + * setSlant(FontStyle.FONT_SLANT_UPRIGHT)} explicitly. * * @return this builder */ @@ -447,23 +461,14 @@ public final class Font { } /** - * Get a weight value associated with this font. + * Get a style associated with this font. * * @see Builder#setWeight(int) - * @return a weight value - */ - public @IntRange(from = 0, to = 1000)int getWeight() { - return mFontStyle.getWeight(); - } - - /** - * Get a slant value associated with this font. - * - * @see Builder#setSlant(boolean) - * @return a slant value + * @see Builder#setSlant(int) + * @return a font style */ - public @FontStyle.FontSlant int getSlant() { - return mFontStyle.getSlant(); + public FontStyle getStyle() { + return mFontStyle; } /** diff --git a/graphics/java/android/graphics/fonts/FontFamily.java b/graphics/java/android/graphics/fonts/FontFamily.java index 52a37da47cff..14d31d9dfd86 100644 --- a/graphics/java/android/graphics/fonts/FontFamily.java +++ b/graphics/java/android/graphics/fonts/FontFamily.java @@ -124,7 +124,7 @@ public final class FontFamily { } private static int makeStyleIdentifier(@NonNull Font font) { - return font.getWeight() | (font.getSlant() << 16); + return font.getStyle().getWeight() | (font.getStyle().getSlant() << 16); } private static native long nInitBuilder(); |