Merge "Refactor Typeface construction logic"
diff --git a/api/current.txt b/api/current.txt
index a8c23b7..c1cd0fb 100755
--- a/api/current.txt
+++ b/api/current.txt
@@ -14771,8 +14771,7 @@
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 {
@@ -15417,9 +15416,8 @@
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 6a4aae6..14eb11a 100644
--- a/core/java/android/content/res/FontResourcesParser.java
+++ b/core/java/android/content/res/FontResourcesParser.java
@@ -76,6 +76,10 @@
// 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 @@
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 dfa30a2..1d1eaf3 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -944,7 +944,8 @@
}
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 a1d1c57..76607e9 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.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.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.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 @@
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 5c0c38e..a09b063 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -27,10 +27,11 @@
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 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 @@
// 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 @@
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 @@
/**
* @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 @@
// 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 @@
/** @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 @@
* @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 @@
* @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 @@
* @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 @@
* @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.
+ * Constructs a builder from an asset manager and a file path in an asset directory.
*
- * 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.
- *
- * @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 Builder setWeight(@IntRange(from = 1, to = 1000) int weight) {
mWeight = weight;
+ mFontBuilder.setWeight(weight);
return this;
}
@@ -434,7 +415,8 @@
* @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 @@
* 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 @@
* 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 @@
* @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 @@
* @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 (key != null) {
+ // Dynamic cache lookup is only for assets.
+ synchronized (sDynamicCacheLock) {
+ final Typeface typeface = sDynamicTypefaceCache.get(key);
+ if (typeface != null) {
+ return typeface;
+ }
}
- 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);
+ }
+ final Typeface typeface = builder.build();
+ if (key != null) {
+ synchronized (sDynamicCacheLock) {
+ sDynamicTypefaceCache.put(key, 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();
- }
- 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 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 @@
// 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 @@
}
/**
- * 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 @@
* @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 @@
}
}
- typeface = new Typeface(nativeCreateFromTypeface(ni, style));
+ typeface = new Typeface(nativeCreateFromTypeface(ni, style), family.mFamilies);
styles.put(style, typeface);
}
return typeface;
@@ -919,7 +819,7 @@
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 @@
/** @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 @@
*/
@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 @@
*
* @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 @@
* 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 @@
* @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 @@
}
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 @@
/** @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 @@
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 0a8c685..7f165bf 100644
--- a/graphics/java/android/graphics/fonts/Font.java
+++ b/graphics/java/android/graphics/fonts/Font.java
@@ -151,7 +151,21 @@
* @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 @@
* 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 @@
}
/**
- * Get a weight value associated with this font.
+ * Get a style associated with this font.
*
* @see Builder#setWeight(int)
- * @return a weight value
+ * @see Builder#setSlant(int)
+ * @return a font style
*/
- 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
- */
- 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 52a37da..14d31d9 100644
--- a/graphics/java/android/graphics/fonts/FontFamily.java
+++ b/graphics/java/android/graphics/fonts/FontFamily.java
@@ -124,7 +124,7 @@
}
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();