} catch (NumberFormatException e) {
continue; // ignoreing invalid number format
}
- int tag = makeTag(tagString.charAt(0), tagString.charAt(1), tagString.charAt(2),
- tagString.charAt(3));
+ int tag = makeTag(tagString);
axisList.add(new FontConfig.Axis(tag, styleValue));
}
return axisList;
}
- @VisibleForTesting
- public static int makeTag(char c1, char c2, char c3, char c4) {
+ public static int makeTag(String tagString) {
+ char c1 = tagString.charAt(0);
+ char c2 = tagString.charAt(1);
+ char c3 = tagString.charAt(2);
+ char c4 = tagString.charAt(3);
return (c1 << 24) | (c2 << 16) | (c3 << 8) | c4;
}
private static FontConfig readFamilies(XmlPullParser parser)
throws XmlPullParserException, IOException {
- FontConfig config = new FontConfig();
+ List<FontConfig.Family> families = new ArrayList<>();
+ List<FontConfig.Alias> aliases = new ArrayList<>();
+
parser.require(XmlPullParser.START_TAG, null, "familyset");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) continue;
String tag = parser.getName();
if (tag.equals("family")) {
- config.getFamilies().add(readFamily(parser));
+ families.add(readFamily(parser));
} else if (tag.equals("alias")) {
- config.getAliases().add(readAlias(parser));
+ aliases.add(readAlias(parser));
} else {
skip(parser);
}
}
- return config;
+ return new FontConfig(families.toArray(new FontConfig.Family[families.size()]),
+ aliases.toArray(new FontConfig.Alias[aliases.size()]));
}
private static FontConfig.Family readFamily(XmlPullParser parser)
skip(parser);
}
}
- return new FontConfig.Family(name, fonts, lang, variant);
+ int intVariant = FontConfig.Family.VARIANT_DEFAULT;
+ if (variant != null) {
+ if (variant.equals("compact")) {
+ intVariant = FontConfig.Family.VARIANT_COMPACT;
+ } else if (variant.equals("elegant")) {
+ intVariant = FontConfig.Family.VARIANT_ELEGANT;
+ }
+ }
+ return new FontConfig.Family(name, fonts.toArray(new FontConfig.Font[fonts.size()]), lang,
+ intVariant);
}
/** Matches leading and trailing XML whitespace. */
}
String fullFilename = "/system/fonts/" +
FILENAME_WHITESPACE_PATTERN.matcher(filename).replaceAll("");
- return new FontConfig.Font(fullFilename, index, axes, weight, isItalic);
+ return new FontConfig.Font(fullFilename, index,
+ axes.toArray(new FontConfig.Axis[axes.size()]), weight, isItalic);
}
/** The 'tag' attribute value is read as four character values between U+0020 and U+007E
*/
private static final Pattern TAG_PATTERN = Pattern.compile("[\\x20-\\x7E]{4}");
+ public static boolean isValidTag(String tagString) {
+ if (tagString == null || tagString.length() != 4) {
+ return false;
+ }
+ return TAG_PATTERN.matcher(tagString).matches();
+ }
+
/** The 'styleValue' attribute has an optional leading '-', followed by '<digits>',
* '<digits>.<digits>', or '.<digits>' where '<digits>' is one or more of [0-9].
*/
throws XmlPullParserException, IOException {
int tag = 0;
String tagStr = parser.getAttributeValue(null, "tag");
- if (tagStr != null && TAG_PATTERN.matcher(tagStr).matches()) {
- tag = makeTag(tagStr.charAt(0), tagStr.charAt(1), tagStr.charAt(2), tagStr.charAt(3));
+ if (isValidTag(tagStr)) {
+ tag = makeTag(tagStr);
} else {
throw new XmlPullParserException("Invalid tag attribute value.", parser, null);
}