aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ports/SkFontMgr_android_parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ports/SkFontMgr_android_parser.cpp')
-rw-r--r--src/ports/SkFontMgr_android_parser.cpp28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/ports/SkFontMgr_android_parser.cpp b/src/ports/SkFontMgr_android_parser.cpp
index a68f791387..1269523062 100644
--- a/src/ports/SkFontMgr_android_parser.cpp
+++ b/src/ports/SkFontMgr_android_parser.cpp
@@ -249,7 +249,7 @@ static const TagHandler fontHandler = {
static const TagHandler familyHandler = {
/*start*/[](FamilyData* self, const char* tag, const char** attributes) {
// 'name' (string) [optional]
- // 'lang' (string) [default ""]
+ // 'lang' (space separated string) [default ""]
// 'variant' ("elegant", "compact") [default "default"]
// If there is no name, this is a fallback only font.
FontFamily* family = new FontFamily(self->fBasePath, true);
@@ -264,7 +264,16 @@ static const TagHandler familyHandler = {
family->fNames.push_back().set(tolc.lc());
family->fIsFallbackFont = false;
} else if (MEMEQ("lang", name, nameLen)) {
- family->fLanguage = SkLanguage(value, valueLen);
+ size_t i = 0;
+ while (true) {
+ for (; i < valueLen && is_whitespace(value[i]); ++i) { }
+ if (i == valueLen) { break; }
+ size_t j;
+ for (j = i + 1; j < valueLen && !is_whitespace(value[j]); ++j) { }
+ family->fLanguages.emplace_back(value + i, j - i);
+ i = j;
+ if (i == valueLen) { break; }
+ }
} else if (MEMEQ("variant", name, nameLen)) {
if (MEMEQ("elegant", value, valueLen)) {
family->fVariant = kElegant_FontVariant;
@@ -400,9 +409,16 @@ static const TagHandler fileHandler = {
}
} else if (MEMEQ("lang", name, nameLen)) {
- SkLanguage prevLang = currentFamily.fLanguage;
- currentFamily.fLanguage = SkLanguage(value, valueLen);
- if (currentFamily.fFonts.count() > 1 && currentFamily.fLanguage != prevLang) {
+ SkLanguage currentLanguage = SkLanguage(value, valueLen);
+ bool showWarning = false;
+ if (currentFamily.fLanguages.empty()) {
+ showWarning = (currentFamily.fFonts.count() > 1);
+ currentFamily.fLanguages.push_back(std::move(currentLanguage));
+ } else if (currentFamily.fLanguages[0] != currentLanguage) {
+ showWarning = true;
+ currentFamily.fLanguages[0] = std::move(currentLanguage);
+ }
+ if (showWarning) {
SK_FONTCONFIGPARSER_WARNING("'%s' unexpected language found\n"
"Note: Every font file within a family must have identical languages.",
value);
@@ -705,7 +721,7 @@ static void append_fallback_font_families_for_locale(SkTDArray<FontFamily*>& fal
for (int i = 0; i < langSpecificFonts.count(); ++i) {
FontFamily* family = langSpecificFonts[i];
- family->fLanguage = SkLanguage(locale);
+ family->fLanguages.emplace_back(locale);
*fallbackFonts.append() = family;
}
}