Loading core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java +254 −15 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue; import android.content.Context; import android.content.res.AssetManager; import android.graphics.fonts.Font; import android.graphics.fonts.FontCustomizationParser; import android.graphics.fonts.FontFamily; import android.graphics.fonts.SystemFonts; import android.support.test.InstrumentationRegistry; Loading @@ -36,12 +37,15 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.xmlpull.v1.XmlPullParserException; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.util.ArrayList; Loading @@ -62,6 +66,8 @@ public class TypefaceSystemFallbackTest { }; private static final String TEST_FONTS_XML; private static final String TEST_FONT_DIR; private static final String TEST_OEM_XML; private static final String TEST_OEM_DIR; private static final float GLYPH_1EM_WIDTH; private static final float GLYPH_2EM_WIDTH; Loading @@ -73,8 +79,13 @@ public class TypefaceSystemFallbackTest { if (!cacheDir.isDirectory()) { cacheDir.mkdirs(); } TEST_FONT_DIR = cacheDir.getAbsolutePath() + "/"; TEST_FONT_DIR = cacheDir.getAbsolutePath() + "/fonts/"; TEST_FONTS_XML = new File(cacheDir, "fonts.xml").getAbsolutePath(); TEST_OEM_DIR = cacheDir.getAbsolutePath() + "/oem_fonts/"; TEST_OEM_XML = new File(cacheDir, "fonts_customization.xml").getAbsolutePath(); new File(TEST_FONT_DIR).mkdirs(); new File(TEST_OEM_DIR).mkdirs(); final AssetManager am = InstrumentationRegistry.getInstrumentation().getContext().getAssets(); Loading @@ -99,6 +110,12 @@ public class TypefaceSystemFallbackTest { } catch (IOException e) { throw new RuntimeException(e); } final File outOemInCache = new File(TEST_OEM_DIR, fontFile); try (InputStream is = am.open(sourceInAsset)) { Files.copy(is, outOemInCache.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { throw new RuntimeException(e); } } } Loading @@ -107,11 +124,14 @@ public class TypefaceSystemFallbackTest { for (final String fontFile : TEST_FONT_FILES) { final File outInCache = new File(TEST_FONT_DIR, fontFile); outInCache.delete(); final File outOemInCache = new File(TEST_OEM_DIR, fontFile); outInCache.delete(); } } private static void buildSystemFallback(String xml, ArrayMap<String, Typeface> fontMap, ArrayMap<String, FontFamily[]> fallbackMap) { FontCustomizationParser.Result oemCustomization, ArrayMap<String, Typeface> fontMap, ArrayMap<String, FontFamily[]> fallbackMap) { final ArrayList<Font> availableFonts = new ArrayList<>(); try (FileOutputStream fos = new FileOutputStream(TEST_FONTS_XML)) { fos.write(xml.getBytes(Charset.forName("UTF-8"))); Loading @@ -119,18 +139,28 @@ public class TypefaceSystemFallbackTest { throw new RuntimeException(e); } final FontConfig.Alias[] aliases = SystemFonts.buildSystemFallback(TEST_FONTS_XML, TEST_FONT_DIR, fallbackMap, availableFonts); TEST_FONT_DIR, oemCustomization, fallbackMap, availableFonts); Typeface.initSystemDefaultTypefaces(fontMap, fallbackMap, aliases); } private static FontCustomizationParser.Result readFontCustomization(String oemXml) { try (InputStream is = new ByteArrayInputStream(oemXml.getBytes(StandardCharsets.UTF_8))) { return FontCustomizationParser.parse(is, TEST_OEM_DIR); } catch (IOException | XmlPullParserException e) { throw new RuntimeException(e); } } @Test public void testBuildSystemFallback() { final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final ArrayList<Font> availableFonts = new ArrayList<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); final FontConfig.Alias[] aliases = SystemFonts.buildSystemFallback(SYSTEM_FONTS_XML, SYSTEM_FONT_DIR, fallbackMap, availableFonts); SYSTEM_FONT_DIR, oemCustomization, fallbackMap, availableFonts); assertNotNull(aliases); assertFalse(fallbackMap.isEmpty()); Loading @@ -156,8 +186,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); assertEquals(1, fontMap.size()); assertTrue(fontMap.containsKey("sans-serif")); Loading @@ -184,8 +216,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading Loading @@ -230,8 +264,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading Loading @@ -275,8 +311,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading Loading @@ -325,8 +363,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading Loading @@ -371,8 +411,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading Loading @@ -410,8 +452,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading Loading @@ -449,8 +493,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading Loading @@ -497,8 +543,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); paint.setTypeface(fontMap.get("sans-serif")); Loading Loading @@ -539,8 +587,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading Loading @@ -578,8 +628,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading @@ -598,4 +650,191 @@ public class TypefaceSystemFallbackTest { assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); } @Test public void testBuildSystemFallback__Customization_new_named_family() { final String xml = "<?xml version='1.0' encoding='UTF-8'?>" + "<familyset>" + " <family name='sans-serif'>" + " <font weight='400' style='normal'>a3em.ttf</font>" + " </family>" + "</familyset>"; final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>" + "<fonts-modification version='1'>" + " <family customizationType='new-named-family' name='google-sans'>" + " <font weight='400' style='normal'>b3em.ttf</font>" + " </family>" + "</fonts-modification>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = readFontCustomization(oemXml); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Typeface testTypeface = fontMap.get("sans-serif"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); testTypeface = fontMap.get("google-sans"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); } @Test public void testBuildSystemFallback__Customization_new_named_family_override() { final String xml = "<?xml version='1.0' encoding='UTF-8'?>" + "<familyset>" + " <family name='sans-serif'>" + " <font weight='400' style='normal'>a3em.ttf</font>" + " </family>" + "</familyset>"; final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>" + "<fonts-modification version='1'>" + " <family customizationType='new-named-family' name='sans-serif'>" + " <font weight='400' style='normal'>b3em.ttf</font>" + " </family>" + "</fonts-modification>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = readFontCustomization(oemXml); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Typeface testTypeface = fontMap.get("sans-serif"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); } @Test public void testBuildSystemFallback__Customization_additional_alias() { final String xml = "<?xml version='1.0' encoding='UTF-8'?>" + "<familyset>" + " <family name='sans-serif'>" + " <font weight='400' style='normal'>a3em.ttf</font>" + " </family>" + "</familyset>"; final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>" + "<fonts-modification version='1'>" + " <family customizationType='new-named-family' name='google-sans'>" + " <font weight='400' style='normal'>b3em.ttf</font>" + " <font weight='700' style='normal'>c3em.ttf</font>" + " </family>" + " <alias name='another-google-sans' to='google-sans' />" + " <alias name='google-sans-bold' to='google-sans' weight='700' />" + "</fonts-modification>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = readFontCustomization(oemXml); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Typeface testTypeface = fontMap.get("sans-serif"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); testTypeface = fontMap.get("google-sans"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); testTypeface = fontMap.get("another-google-sans"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); testTypeface = fontMap.get("google-sans-bold"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("c"), 0.0f); } @Test public void testBuildSystemFallback__Customization_additional_alias_conflict_with_new_name() { final String xml = "<?xml version='1.0' encoding='UTF-8'?>" + "<familyset>" + " <family name='named-family'>" + " <font weight='400' style='normal'>a3em.ttf</font>" + " </family>" + " <alias name='named-alias' to='named-family' />" + "</familyset>"; final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>" + "<fonts-modification version='1'>" + " <family customizationType='new-named-family' name='named-alias'>" + " <font weight='400' style='normal'>b3em.ttf</font>" + " </family>" + "</fonts-modification>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = readFontCustomization(oemXml); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Typeface testTypeface = fontMap.get("named-family"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); testTypeface = fontMap.get("named-alias"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); } @Test(expected = IllegalArgumentException.class) public void testBuildSystemFallback__Customization_new_named_family_no_name_exception() { final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>" + "<fonts-modification version='1'>" + " <family customizationType='new-named-family'>" + " <font weight='400' style='normal'>b3em.ttf</font>" + " </family>" + "</fonts-modification>"; readFontCustomization(oemXml); } @Test(expected = IllegalArgumentException.class) public void testBuildSystemFallback__Customization_new_named_family_dup_name_exception() { final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>" + "<fonts-modification version='1'>" + " <family customizationType='new-named-family' name='google-sans'>" + " <font weight='400' style='normal'>b3em.ttf</font>" + " </family>" + " <family customizationType='new-named-family' name='google-sans'>" + " <font weight='400' style='normal'>b3em.ttf</font>" + " </family>" + "</fonts-modification>"; readFontCustomization(oemXml); } } core/tests/coretests/src/android/text/FontFallbackSetup.java +4 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.content.Context; import android.content.res.AssetManager; import android.graphics.Typeface; import android.graphics.fonts.Font; import android.graphics.fonts.FontCustomizationParser; import android.graphics.fonts.FontFamily; import android.graphics.fonts.SystemFonts; import android.support.test.InstrumentationRegistry; Loading Loading @@ -77,8 +78,10 @@ public class FontFallbackSetup implements AutoCloseable { final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final ArrayList<Font> availableFonts = new ArrayList<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); final FontConfig.Alias[] aliases = SystemFonts.buildSystemFallback(testFontsXml, mTestFontsDir, fallbackMap, availableFonts); mTestFontsDir, oemCustomization, fallbackMap, availableFonts); Typeface.initSystemDefaultTypefaces(mFontMap, fallbackMap, aliases); } Loading data/fonts/Android.mk +1 −17 Original line number Diff line number Diff line Loading @@ -89,23 +89,7 @@ include $(CLEAR_VARS) LOCAL_MODULE := fonts.xml LOCAL_MODULE_CLASS := ETC AOSP_FONTS_FILE := frameworks/base/data/fonts/fonts.xml ifdef ADDITIONAL_FONTS_FILE ADDITIONAL_FONTS_SCRIPT := frameworks/base/tools/fonts/add_additional_fonts.py ADD_ADDITIONAL_FONTS := $(local-generated-sources-dir)/fonts.xml $(ADD_ADDITIONAL_FONTS): PRIVATE_SCRIPT := $(ADDITIONAL_FONTS_SCRIPT) $(ADD_ADDITIONAL_FONTS): PRIVATE_ADDITIONAL_FONTS_FILE := $(ADDITIONAL_FONTS_FILE) $(ADD_ADDITIONAL_FONTS): $(ADDITIONAL_FONTS_SCRIPT) $(AOSP_FONTS_FILE) $(ADDITIONAL_FONTS_FILE) rm -f $@ python $(PRIVATE_SCRIPT) $@ $(PRIVATE_ADDITIONAL_FONTS_FILE) else ADD_ADDITIONAL_FONTS := $(AOSP_FONTS_FILE) endif LOCAL_PREBUILT_MODULE_FILE := $(ADD_ADDITIONAL_FONTS) LOCAL_PREBUILT_MODULE_FILE := frameworks/base/data/fonts/fonts.xml include $(BUILD_PREBUILT) Loading graphics/java/android/graphics/FontListParser.java +26 −9 Original line number Diff line number Diff line Loading @@ -40,17 +40,25 @@ public class FontListParser { /* Parse fallback list (no names) */ @UnsupportedAppUsage public static FontConfig parse(InputStream in) throws XmlPullParserException, IOException { return parse(in, "/system/fonts"); } /** * Parse the fonts.xml */ public static FontConfig parse(InputStream in, String fontDir) throws XmlPullParserException, IOException { try { XmlPullParser parser = Xml.newPullParser(); parser.setInput(in, null); parser.nextTag(); return readFamilies(parser); return readFamilies(parser, fontDir); } finally { in.close(); } } private static FontConfig readFamilies(XmlPullParser parser) private static FontConfig readFamilies(XmlPullParser parser, String fontDir) throws XmlPullParserException, IOException { List<FontConfig.Family> families = new ArrayList<>(); List<FontConfig.Alias> aliases = new ArrayList<>(); Loading @@ -60,7 +68,7 @@ public class FontListParser { if (parser.getEventType() != XmlPullParser.START_TAG) continue; String tag = parser.getName(); if (tag.equals("family")) { families.add(readFamily(parser)); families.add(readFamily(parser, fontDir)); } else if (tag.equals("alias")) { aliases.add(readAlias(parser)); } else { Loading @@ -71,7 +79,10 @@ public class FontListParser { aliases.toArray(new FontConfig.Alias[aliases.size()])); } private static FontConfig.Family readFamily(XmlPullParser parser) /** * Reads a family element */ public static FontConfig.Family readFamily(XmlPullParser parser, String fontDir) throws XmlPullParserException, IOException { final String name = parser.getAttributeValue(null, "name"); final String lang = parser.getAttributeValue("", "lang"); Loading @@ -81,7 +92,7 @@ public class FontListParser { if (parser.getEventType() != XmlPullParser.START_TAG) continue; final String tag = parser.getName(); if (tag.equals("font")) { fonts.add(readFont(parser)); fonts.add(readFont(parser, fontDir)); } else { skip(parser); } Loading @@ -102,7 +113,7 @@ public class FontListParser { private static final Pattern FILENAME_WHITESPACE_PATTERN = Pattern.compile("^[ \\n\\r\\t]+|[ \\n\\r\\t]+$"); private static FontConfig.Font readFont(XmlPullParser parser) private static FontConfig.Font readFont(XmlPullParser parser, String fontDir) throws XmlPullParserException, IOException { String indexStr = parser.getAttributeValue(null, "index"); int index = indexStr == null ? 0 : Integer.parseInt(indexStr); Loading @@ -125,7 +136,7 @@ public class FontListParser { } } String sanitizedName = FILENAME_WHITESPACE_PATTERN.matcher(filename).replaceAll(""); return new FontConfig.Font(sanitizedName, index, axes.toArray( return new FontConfig.Font(fontDir + sanitizedName, index, axes.toArray( new FontVariationAxis[axes.size()]), weight, isItalic, fallbackFor); } Loading @@ -137,7 +148,10 @@ public class FontListParser { return new FontVariationAxis(tagStr, Float.parseFloat(styleValueStr)); } private static FontConfig.Alias readAlias(XmlPullParser parser) /** * Reads alias elements */ public static FontConfig.Alias readAlias(XmlPullParser parser) throws XmlPullParserException, IOException { String name = parser.getAttributeValue(null, "name"); String toName = parser.getAttributeValue(null, "to"); Loading @@ -152,7 +166,10 @@ public class FontListParser { return new FontConfig.Alias(name, toName, weight); } private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException { /** * Skip until next element */ public static void skip(XmlPullParser parser) throws XmlPullParserException, IOException { int depth = 1; while (depth > 0) { switch (parser.next()) { Loading graphics/java/android/graphics/Typeface.java +3 −0 Original line number Diff line number Diff line Loading @@ -1103,6 +1103,9 @@ public class Typeface { } for (FontConfig.Alias alias : aliases) { if (systemFontMap.containsKey(alias.getName())) { continue; // If alias and named family are conflict, use named family. } final Typeface base = systemFontMap.get(alias.getToName()); final int weight = alias.getWeight(); final Typeface newFace = weight == 400 ? base : Loading Loading
core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java +254 −15 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue; import android.content.Context; import android.content.res.AssetManager; import android.graphics.fonts.Font; import android.graphics.fonts.FontCustomizationParser; import android.graphics.fonts.FontFamily; import android.graphics.fonts.SystemFonts; import android.support.test.InstrumentationRegistry; Loading @@ -36,12 +37,15 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.xmlpull.v1.XmlPullParserException; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.util.ArrayList; Loading @@ -62,6 +66,8 @@ public class TypefaceSystemFallbackTest { }; private static final String TEST_FONTS_XML; private static final String TEST_FONT_DIR; private static final String TEST_OEM_XML; private static final String TEST_OEM_DIR; private static final float GLYPH_1EM_WIDTH; private static final float GLYPH_2EM_WIDTH; Loading @@ -73,8 +79,13 @@ public class TypefaceSystemFallbackTest { if (!cacheDir.isDirectory()) { cacheDir.mkdirs(); } TEST_FONT_DIR = cacheDir.getAbsolutePath() + "/"; TEST_FONT_DIR = cacheDir.getAbsolutePath() + "/fonts/"; TEST_FONTS_XML = new File(cacheDir, "fonts.xml").getAbsolutePath(); TEST_OEM_DIR = cacheDir.getAbsolutePath() + "/oem_fonts/"; TEST_OEM_XML = new File(cacheDir, "fonts_customization.xml").getAbsolutePath(); new File(TEST_FONT_DIR).mkdirs(); new File(TEST_OEM_DIR).mkdirs(); final AssetManager am = InstrumentationRegistry.getInstrumentation().getContext().getAssets(); Loading @@ -99,6 +110,12 @@ public class TypefaceSystemFallbackTest { } catch (IOException e) { throw new RuntimeException(e); } final File outOemInCache = new File(TEST_OEM_DIR, fontFile); try (InputStream is = am.open(sourceInAsset)) { Files.copy(is, outOemInCache.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { throw new RuntimeException(e); } } } Loading @@ -107,11 +124,14 @@ public class TypefaceSystemFallbackTest { for (final String fontFile : TEST_FONT_FILES) { final File outInCache = new File(TEST_FONT_DIR, fontFile); outInCache.delete(); final File outOemInCache = new File(TEST_OEM_DIR, fontFile); outInCache.delete(); } } private static void buildSystemFallback(String xml, ArrayMap<String, Typeface> fontMap, ArrayMap<String, FontFamily[]> fallbackMap) { FontCustomizationParser.Result oemCustomization, ArrayMap<String, Typeface> fontMap, ArrayMap<String, FontFamily[]> fallbackMap) { final ArrayList<Font> availableFonts = new ArrayList<>(); try (FileOutputStream fos = new FileOutputStream(TEST_FONTS_XML)) { fos.write(xml.getBytes(Charset.forName("UTF-8"))); Loading @@ -119,18 +139,28 @@ public class TypefaceSystemFallbackTest { throw new RuntimeException(e); } final FontConfig.Alias[] aliases = SystemFonts.buildSystemFallback(TEST_FONTS_XML, TEST_FONT_DIR, fallbackMap, availableFonts); TEST_FONT_DIR, oemCustomization, fallbackMap, availableFonts); Typeface.initSystemDefaultTypefaces(fontMap, fallbackMap, aliases); } private static FontCustomizationParser.Result readFontCustomization(String oemXml) { try (InputStream is = new ByteArrayInputStream(oemXml.getBytes(StandardCharsets.UTF_8))) { return FontCustomizationParser.parse(is, TEST_OEM_DIR); } catch (IOException | XmlPullParserException e) { throw new RuntimeException(e); } } @Test public void testBuildSystemFallback() { final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final ArrayList<Font> availableFonts = new ArrayList<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); final FontConfig.Alias[] aliases = SystemFonts.buildSystemFallback(SYSTEM_FONTS_XML, SYSTEM_FONT_DIR, fallbackMap, availableFonts); SYSTEM_FONT_DIR, oemCustomization, fallbackMap, availableFonts); assertNotNull(aliases); assertFalse(fallbackMap.isEmpty()); Loading @@ -156,8 +186,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); assertEquals(1, fontMap.size()); assertTrue(fontMap.containsKey("sans-serif")); Loading @@ -184,8 +216,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading Loading @@ -230,8 +264,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading Loading @@ -275,8 +311,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading Loading @@ -325,8 +363,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading Loading @@ -371,8 +411,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading Loading @@ -410,8 +452,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading Loading @@ -449,8 +493,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading Loading @@ -497,8 +543,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); paint.setTypeface(fontMap.get("sans-serif")); Loading Loading @@ -539,8 +587,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading Loading @@ -578,8 +628,10 @@ public class TypefaceSystemFallbackTest { + "</familyset>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); buildSystemFallback(xml, fontMap, fallbackMap); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Loading @@ -598,4 +650,191 @@ public class TypefaceSystemFallbackTest { assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); } @Test public void testBuildSystemFallback__Customization_new_named_family() { final String xml = "<?xml version='1.0' encoding='UTF-8'?>" + "<familyset>" + " <family name='sans-serif'>" + " <font weight='400' style='normal'>a3em.ttf</font>" + " </family>" + "</familyset>"; final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>" + "<fonts-modification version='1'>" + " <family customizationType='new-named-family' name='google-sans'>" + " <font weight='400' style='normal'>b3em.ttf</font>" + " </family>" + "</fonts-modification>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = readFontCustomization(oemXml); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Typeface testTypeface = fontMap.get("sans-serif"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); testTypeface = fontMap.get("google-sans"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); } @Test public void testBuildSystemFallback__Customization_new_named_family_override() { final String xml = "<?xml version='1.0' encoding='UTF-8'?>" + "<familyset>" + " <family name='sans-serif'>" + " <font weight='400' style='normal'>a3em.ttf</font>" + " </family>" + "</familyset>"; final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>" + "<fonts-modification version='1'>" + " <family customizationType='new-named-family' name='sans-serif'>" + " <font weight='400' style='normal'>b3em.ttf</font>" + " </family>" + "</fonts-modification>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = readFontCustomization(oemXml); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Typeface testTypeface = fontMap.get("sans-serif"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); } @Test public void testBuildSystemFallback__Customization_additional_alias() { final String xml = "<?xml version='1.0' encoding='UTF-8'?>" + "<familyset>" + " <family name='sans-serif'>" + " <font weight='400' style='normal'>a3em.ttf</font>" + " </family>" + "</familyset>"; final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>" + "<fonts-modification version='1'>" + " <family customizationType='new-named-family' name='google-sans'>" + " <font weight='400' style='normal'>b3em.ttf</font>" + " <font weight='700' style='normal'>c3em.ttf</font>" + " </family>" + " <alias name='another-google-sans' to='google-sans' />" + " <alias name='google-sans-bold' to='google-sans' weight='700' />" + "</fonts-modification>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = readFontCustomization(oemXml); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Typeface testTypeface = fontMap.get("sans-serif"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); testTypeface = fontMap.get("google-sans"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); testTypeface = fontMap.get("another-google-sans"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); testTypeface = fontMap.get("google-sans-bold"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("c"), 0.0f); } @Test public void testBuildSystemFallback__Customization_additional_alias_conflict_with_new_name() { final String xml = "<?xml version='1.0' encoding='UTF-8'?>" + "<familyset>" + " <family name='named-family'>" + " <font weight='400' style='normal'>a3em.ttf</font>" + " </family>" + " <alias name='named-alias' to='named-family' />" + "</familyset>"; final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>" + "<fonts-modification version='1'>" + " <family customizationType='new-named-family' name='named-alias'>" + " <font weight='400' style='normal'>b3em.ttf</font>" + " </family>" + "</fonts-modification>"; final ArrayMap<String, Typeface> fontMap = new ArrayMap<>(); final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final FontCustomizationParser.Result oemCustomization = readFontCustomization(oemXml); buildSystemFallback(xml, oemCustomization, fontMap, fallbackMap); final Paint paint = new Paint(); Typeface testTypeface = fontMap.get("named-family"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); testTypeface = fontMap.get("named-alias"); assertNotNull(testTypeface); paint.setTypeface(testTypeface); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f); assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f); assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f); } @Test(expected = IllegalArgumentException.class) public void testBuildSystemFallback__Customization_new_named_family_no_name_exception() { final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>" + "<fonts-modification version='1'>" + " <family customizationType='new-named-family'>" + " <font weight='400' style='normal'>b3em.ttf</font>" + " </family>" + "</fonts-modification>"; readFontCustomization(oemXml); } @Test(expected = IllegalArgumentException.class) public void testBuildSystemFallback__Customization_new_named_family_dup_name_exception() { final String oemXml = "<?xml version='1.0' encoding='UTF-8'?>" + "<fonts-modification version='1'>" + " <family customizationType='new-named-family' name='google-sans'>" + " <font weight='400' style='normal'>b3em.ttf</font>" + " </family>" + " <family customizationType='new-named-family' name='google-sans'>" + " <font weight='400' style='normal'>b3em.ttf</font>" + " </family>" + "</fonts-modification>"; readFontCustomization(oemXml); } }
core/tests/coretests/src/android/text/FontFallbackSetup.java +4 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.content.Context; import android.content.res.AssetManager; import android.graphics.Typeface; import android.graphics.fonts.Font; import android.graphics.fonts.FontCustomizationParser; import android.graphics.fonts.FontFamily; import android.graphics.fonts.SystemFonts; import android.support.test.InstrumentationRegistry; Loading Loading @@ -77,8 +78,10 @@ public class FontFallbackSetup implements AutoCloseable { final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>(); final ArrayList<Font> availableFonts = new ArrayList<>(); final FontCustomizationParser.Result oemCustomization = new FontCustomizationParser.Result(); final FontConfig.Alias[] aliases = SystemFonts.buildSystemFallback(testFontsXml, mTestFontsDir, fallbackMap, availableFonts); mTestFontsDir, oemCustomization, fallbackMap, availableFonts); Typeface.initSystemDefaultTypefaces(mFontMap, fallbackMap, aliases); } Loading
data/fonts/Android.mk +1 −17 Original line number Diff line number Diff line Loading @@ -89,23 +89,7 @@ include $(CLEAR_VARS) LOCAL_MODULE := fonts.xml LOCAL_MODULE_CLASS := ETC AOSP_FONTS_FILE := frameworks/base/data/fonts/fonts.xml ifdef ADDITIONAL_FONTS_FILE ADDITIONAL_FONTS_SCRIPT := frameworks/base/tools/fonts/add_additional_fonts.py ADD_ADDITIONAL_FONTS := $(local-generated-sources-dir)/fonts.xml $(ADD_ADDITIONAL_FONTS): PRIVATE_SCRIPT := $(ADDITIONAL_FONTS_SCRIPT) $(ADD_ADDITIONAL_FONTS): PRIVATE_ADDITIONAL_FONTS_FILE := $(ADDITIONAL_FONTS_FILE) $(ADD_ADDITIONAL_FONTS): $(ADDITIONAL_FONTS_SCRIPT) $(AOSP_FONTS_FILE) $(ADDITIONAL_FONTS_FILE) rm -f $@ python $(PRIVATE_SCRIPT) $@ $(PRIVATE_ADDITIONAL_FONTS_FILE) else ADD_ADDITIONAL_FONTS := $(AOSP_FONTS_FILE) endif LOCAL_PREBUILT_MODULE_FILE := $(ADD_ADDITIONAL_FONTS) LOCAL_PREBUILT_MODULE_FILE := frameworks/base/data/fonts/fonts.xml include $(BUILD_PREBUILT) Loading
graphics/java/android/graphics/FontListParser.java +26 −9 Original line number Diff line number Diff line Loading @@ -40,17 +40,25 @@ public class FontListParser { /* Parse fallback list (no names) */ @UnsupportedAppUsage public static FontConfig parse(InputStream in) throws XmlPullParserException, IOException { return parse(in, "/system/fonts"); } /** * Parse the fonts.xml */ public static FontConfig parse(InputStream in, String fontDir) throws XmlPullParserException, IOException { try { XmlPullParser parser = Xml.newPullParser(); parser.setInput(in, null); parser.nextTag(); return readFamilies(parser); return readFamilies(parser, fontDir); } finally { in.close(); } } private static FontConfig readFamilies(XmlPullParser parser) private static FontConfig readFamilies(XmlPullParser parser, String fontDir) throws XmlPullParserException, IOException { List<FontConfig.Family> families = new ArrayList<>(); List<FontConfig.Alias> aliases = new ArrayList<>(); Loading @@ -60,7 +68,7 @@ public class FontListParser { if (parser.getEventType() != XmlPullParser.START_TAG) continue; String tag = parser.getName(); if (tag.equals("family")) { families.add(readFamily(parser)); families.add(readFamily(parser, fontDir)); } else if (tag.equals("alias")) { aliases.add(readAlias(parser)); } else { Loading @@ -71,7 +79,10 @@ public class FontListParser { aliases.toArray(new FontConfig.Alias[aliases.size()])); } private static FontConfig.Family readFamily(XmlPullParser parser) /** * Reads a family element */ public static FontConfig.Family readFamily(XmlPullParser parser, String fontDir) throws XmlPullParserException, IOException { final String name = parser.getAttributeValue(null, "name"); final String lang = parser.getAttributeValue("", "lang"); Loading @@ -81,7 +92,7 @@ public class FontListParser { if (parser.getEventType() != XmlPullParser.START_TAG) continue; final String tag = parser.getName(); if (tag.equals("font")) { fonts.add(readFont(parser)); fonts.add(readFont(parser, fontDir)); } else { skip(parser); } Loading @@ -102,7 +113,7 @@ public class FontListParser { private static final Pattern FILENAME_WHITESPACE_PATTERN = Pattern.compile("^[ \\n\\r\\t]+|[ \\n\\r\\t]+$"); private static FontConfig.Font readFont(XmlPullParser parser) private static FontConfig.Font readFont(XmlPullParser parser, String fontDir) throws XmlPullParserException, IOException { String indexStr = parser.getAttributeValue(null, "index"); int index = indexStr == null ? 0 : Integer.parseInt(indexStr); Loading @@ -125,7 +136,7 @@ public class FontListParser { } } String sanitizedName = FILENAME_WHITESPACE_PATTERN.matcher(filename).replaceAll(""); return new FontConfig.Font(sanitizedName, index, axes.toArray( return new FontConfig.Font(fontDir + sanitizedName, index, axes.toArray( new FontVariationAxis[axes.size()]), weight, isItalic, fallbackFor); } Loading @@ -137,7 +148,10 @@ public class FontListParser { return new FontVariationAxis(tagStr, Float.parseFloat(styleValueStr)); } private static FontConfig.Alias readAlias(XmlPullParser parser) /** * Reads alias elements */ public static FontConfig.Alias readAlias(XmlPullParser parser) throws XmlPullParserException, IOException { String name = parser.getAttributeValue(null, "name"); String toName = parser.getAttributeValue(null, "to"); Loading @@ -152,7 +166,10 @@ public class FontListParser { return new FontConfig.Alias(name, toName, weight); } private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException { /** * Skip until next element */ public static void skip(XmlPullParser parser) throws XmlPullParserException, IOException { int depth = 1; while (depth > 0) { switch (parser.next()) { Loading
graphics/java/android/graphics/Typeface.java +3 −0 Original line number Diff line number Diff line Loading @@ -1103,6 +1103,9 @@ public class Typeface { } for (FontConfig.Alias alias : aliases) { if (systemFontMap.containsKey(alias.getName())) { continue; // If alias and named family are conflict, use named family. } final Typeface base = systemFontMap.get(alias.getToName()); final int weight = alias.getWeight(); final Typeface newFace = weight == 400 ? base : Loading