summaryrefslogtreecommitdiff
path: root/graphics/java/android
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2023-10-04 03:09:20 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-10-04 03:09:20 +0000
commit8b221ae6df74d7a4dcd79acaf8d44c7bdd3dd70e (patch)
tree6db7df77de872a1554810b29166b6101feac8ff1 /graphics/java/android
parent6275c6192f9970aa945cabbd1fcb01c33581711f (diff)
parent4b4024b5ab3a40c6658ee9466b4208f4b07425c3 (diff)
Merge "Use variable definition for variable font family" into main
Diffstat (limited to 'graphics/java/android')
-rw-r--r--graphics/java/android/graphics/FontListParser.java41
-rw-r--r--graphics/java/android/graphics/fonts/FontFamily.java35
-rw-r--r--graphics/java/android/graphics/fonts/SystemFonts.java12
3 files changed, 82 insertions, 6 deletions
diff --git a/graphics/java/android/graphics/FontListParser.java b/graphics/java/android/graphics/FontListParser.java
index 674246acafef..735bc180c015 100644
--- a/graphics/java/android/graphics/FontListParser.java
+++ b/graphics/java/android/graphics/FontListParser.java
@@ -16,6 +16,10 @@
package android.graphics;
+import static android.graphics.fonts.FontFamily.Builder.VARIABLE_FONT_FAMILY_TYPE_NONE;
+import static android.graphics.fonts.FontFamily.Builder.VARIABLE_FONT_FAMILY_TYPE_SINGLE_FONT_WGHT_ITAL;
+import static android.graphics.fonts.FontFamily.Builder.VARIABLE_FONT_FAMILY_TYPE_SINGLE_FONT_WGHT_ONLY;
+import static android.graphics.fonts.FontFamily.Builder.VARIABLE_FONT_FAMILY_TYPE_TWO_FONTS_WGHT;
import static android.text.FontConfig.NamedFamilyList;
import android.annotation.NonNull;
@@ -28,6 +32,7 @@ import android.os.Build;
import android.os.LocaleList;
import android.text.FontConfig;
import android.util.ArraySet;
+import android.util.Log;
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
@@ -256,6 +261,7 @@ public class FontListParser {
final String lang = parser.getAttributeValue("", "lang");
final String variant = parser.getAttributeValue(null, "variant");
final String ignore = parser.getAttributeValue(null, "ignore");
+ final String varFamilyTypeStr = parser.getAttributeValue(null, "varFamilyType");
final List<FontConfig.Font> fonts = new ArrayList<>();
while (keepReading(parser)) {
if (parser.getEventType() != XmlPullParser.START_TAG) continue;
@@ -278,12 +284,45 @@ public class FontListParser {
intVariant = FontConfig.FontFamily.VARIANT_ELEGANT;
}
}
+ int varFamilyType = VARIABLE_FONT_FAMILY_TYPE_NONE;
+ if (varFamilyTypeStr != null) {
+ varFamilyType = Integer.parseInt(varFamilyTypeStr);
+ if (varFamilyType <= -1 || varFamilyType > 3) {
+ Log.e(TAG, "Error: unexpected varFamilyType value: " + varFamilyTypeStr);
+ varFamilyType = VARIABLE_FONT_FAMILY_TYPE_NONE;
+ }
+
+ // validation but don't read font content for performance reasons.
+ switch (varFamilyType) {
+ case VARIABLE_FONT_FAMILY_TYPE_SINGLE_FONT_WGHT_ONLY:
+ if (fonts.size() != 1) {
+ Log.e(TAG, "Error: Single font support wght axis, but two or more fonts are"
+ + " included in the font family.");
+ varFamilyType = VARIABLE_FONT_FAMILY_TYPE_NONE;
+ }
+ break;
+ case VARIABLE_FONT_FAMILY_TYPE_SINGLE_FONT_WGHT_ITAL:
+ if (fonts.size() != 1) {
+ Log.e(TAG, "Error: Single font support both ital and wght axes, but two or"
+ + " more fonts are included in the font family.");
+ varFamilyType = VARIABLE_FONT_FAMILY_TYPE_NONE;
+ }
+ break;
+ case VARIABLE_FONT_FAMILY_TYPE_TWO_FONTS_WGHT:
+ if (fonts.size() != 2) {
+ Log.e(TAG, "Error: two fonts that support wght axis, but one or three or"
+ + " more fonts are included in the font family.");
+ varFamilyType = VARIABLE_FONT_FAMILY_TYPE_NONE;
+ }
+ }
+ }
boolean skip = (ignore != null && (ignore.equals("true") || ignore.equals("1")));
if (skip || fonts.isEmpty()) {
return null;
}
- return new FontConfig.FontFamily(fonts, LocaleList.forLanguageTags(lang), intVariant);
+ return new FontConfig.FontFamily(fonts, LocaleList.forLanguageTags(lang), intVariant,
+ varFamilyType);
}
private static void throwIfAttributeExists(String attrName, XmlPullParser parser) {
diff --git a/graphics/java/android/graphics/fonts/FontFamily.java b/graphics/java/android/graphics/fonts/FontFamily.java
index 5e4110590325..4c753565eb5b 100644
--- a/graphics/java/android/graphics/fonts/FontFamily.java
+++ b/graphics/java/android/graphics/fonts/FontFamily.java
@@ -18,7 +18,10 @@ package android.graphics.fonts;
import static com.android.text.flags.Flags.FLAG_DEPRECATE_FONTS_XML;
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
import android.annotation.FlaggedApi;
+import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -32,6 +35,7 @@ import dalvik.annotation.optimization.FastNative;
import libcore.util.NativeAllocationRegistry;
+import java.lang.annotation.Retention;
import java.util.ArrayList;
import java.util.Set;
@@ -184,32 +188,59 @@ public final class FontFamily {
}
/**
+ * A special variable font family type that indicates `analyzeAndResolveVariableType` could
+ * not be identified the variable font family type.
+ *
* @see #buildVariableFamily()
* @hide
*/
public static final int VARIABLE_FONT_FAMILY_TYPE_UNKNOWN = -1;
/**
+ * A variable font family type that indicates no variable font family can be used.
+ *
+ * The font family is used as bundle of static fonts.
* @see #buildVariableFamily()
* @hide
*/
public static final int VARIABLE_FONT_FAMILY_TYPE_NONE = 0;
/**
+ * A variable font family type that indicates single font file can be used for multiple
+ * weight. For the italic style, fake italic may be applied.
+ *
* @see #buildVariableFamily()
* @hide
*/
public static final int VARIABLE_FONT_FAMILY_TYPE_SINGLE_FONT_WGHT_ONLY = 1;
/**
+ * A variable font family type that indicates single font file can be used for multiple
+ * weight and italic.
+ *
* @see #buildVariableFamily()
* @hide
*/
public static final int VARIABLE_FONT_FAMILY_TYPE_SINGLE_FONT_WGHT_ITAL = 2;
/**
+ * A variable font family type that indicates two font files are included in the family:
+ * one can be used for upright with various weights, the other one can be used for italic
+ * with various weights.
+ *
* @see #buildVariableFamily()
* @hide
*/
public static final int VARIABLE_FONT_FAMILY_TYPE_TWO_FONTS_WGHT = 3;
+ /** @hide */
+ @Retention(SOURCE)
+ @IntDef(prefix = { "VARIABLE_FONT_FAMILY_TYPE_" }, value = {
+ VARIABLE_FONT_FAMILY_TYPE_UNKNOWN,
+ VARIABLE_FONT_FAMILY_TYPE_NONE,
+ VARIABLE_FONT_FAMILY_TYPE_SINGLE_FONT_WGHT_ONLY,
+ VARIABLE_FONT_FAMILY_TYPE_SINGLE_FONT_WGHT_ITAL,
+ VARIABLE_FONT_FAMILY_TYPE_TWO_FONTS_WGHT
+ })
+ public @interface VariableFontFamilyType {}
+
/**
* The registered italic axis used for adjusting requested style.
* https://learn.microsoft.com/en-us/typography/opentype/spec/dvaraxistag_ital
@@ -222,7 +253,9 @@ public final class FontFamily {
*/
private static final int TAG_wght = 0x77676874; // w(0x77), g(0x67), h(0x68), t(0x74)
- private static int analyzeAndResolveVariableType(ArrayList<Font> fonts) {
+ /** @hide */
+ public static @VariableFontFamilyType int analyzeAndResolveVariableType(
+ ArrayList<Font> fonts) {
if (fonts.size() > 2) {
return VARIABLE_FONT_FAMILY_TYPE_UNKNOWN;
}
diff --git a/graphics/java/android/graphics/fonts/SystemFonts.java b/graphics/java/android/graphics/fonts/SystemFonts.java
index 9810022abfed..d4e35b30c8d0 100644
--- a/graphics/java/android/graphics/fonts/SystemFonts.java
+++ b/graphics/java/android/graphics/fonts/SystemFonts.java
@@ -121,7 +121,8 @@ public final class SystemFonts {
final FontFamily defaultFamily = defaultFonts.isEmpty() ? null : createFontFamily(
- defaultFonts, languageTags, variant, false, cache);
+ defaultFonts, languageTags, variant, xmlFamily.getVariableFontFamilyType(), false,
+ cache);
// Insert family into fallback map.
for (int i = 0; i < fallbackMap.size(); i++) {
final String name = fallbackMap.keyAt(i);
@@ -138,8 +139,8 @@ public final class SystemFonts {
familyListSet.familyList.add(defaultFamily);
}
} else {
- final FontFamily family = createFontFamily(fallback, languageTags, variant, false,
- cache);
+ final FontFamily family = createFontFamily(fallback, languageTags, variant,
+ xmlFamily.getVariableFontFamilyType(), false, cache);
if (family != null) {
familyListSet.familyList.add(family);
} else if (defaultFamily != null) {
@@ -155,6 +156,7 @@ public final class SystemFonts {
@NonNull List<FontConfig.Font> fonts,
@NonNull String languageTags,
@FontConfig.FontFamily.Variant int variant,
+ int varFamilyType,
boolean isDefaultFallback,
@NonNull Map<String, ByteBuffer> cache) {
if (fonts.size() == 0) {
@@ -196,7 +198,7 @@ public final class SystemFonts {
}
}
return b == null ? null : b.build(languageTags, variant, false /* isCustomFallback */,
- isDefaultFallback, FontFamily.Builder.VARIABLE_FONT_FAMILY_TYPE_NONE);
+ isDefaultFallback, varFamilyType);
}
private static void appendNamedFamilyList(@NonNull FontConfig.NamedFamilyList namedFamilyList,
@@ -210,6 +212,7 @@ public final class SystemFonts {
final FontFamily family = createFontFamily(
xmlFamily.getFontList(),
xmlFamily.getLocaleList().toLanguageTags(), xmlFamily.getVariant(),
+ xmlFamily.getVariableFontFamilyType(),
true, // named family is always default
bufferCache);
if (family == null) {
@@ -291,6 +294,7 @@ public final class SystemFonts {
int configVersion
) {
try {
+ Log.i(TAG, "Loading font config from " + fontsXml);
return FontListParser.parse(fontsXml, systemFontDir, oemXml, productFontDir,
updatableFontMap, lastModifiedDate, configVersion);
} catch (IOException e) {