diff options
author | 2015-04-17 13:25:03 -0700 | |
---|---|---|
committer | 2015-04-17 13:25:03 -0700 | |
commit | 673e902c9b9982a167f54f1cc175d8d9cab8bcaf (patch) | |
tree | 6baf8e8891b36812a77c687e701d472a9b0c6190 /src | |
parent | 54b666b144e1281c0edf499e5ec1c59edaef6572 (diff) |
Respect declared font style on Android.
Previously the normal/italic style bit was obtained from scanning the
font file. With the new format the style may be stated explicitly, and
this explicit value in the configuration file should override any
information obtained from the font data itself.
This change allows the font element's style attribute to override the
font's style, but retains the default 'auto' setting for backwards
compatibility. Repecting the style bit may become more important with
variation fonts, because it will be up to the configuration writer to
determine what values of the 'slnt' variation should be considered
'normal' or 'italic'.
DOCS_PREVIEW= https://skia.org/?cl=1092093002
Review URL: https://codereview.chromium.org/1092093002
Diffstat (limited to 'src')
-rw-r--r-- | src/ports/SkFontConfigParser_android.cpp | 7 | ||||
-rw-r--r-- | src/ports/SkFontConfigParser_android.h | 3 | ||||
-rw-r--r-- | src/ports/SkFontMgr_android.cpp | 10 |
3 files changed, 17 insertions, 3 deletions
diff --git a/src/ports/SkFontConfigParser_android.cpp b/src/ports/SkFontConfigParser_android.cpp index ffc60427f4..9bab84556b 100644 --- a/src/ports/SkFontConfigParser_android.cpp +++ b/src/ports/SkFontConfigParser_android.cpp @@ -159,6 +159,13 @@ static void font_element_handler(FamilyData* self, FontFileInfo* file, const cha if (!parse_non_negative_integer(value, &file->fWeight)) { SkDebugf("---- Font weight %s (INVALID)", value); } + } else if (MEMEQ("style", name, nameLen)) { + size_t valueLen = strlen(value); + if (MEMEQ("normal", value, valueLen)) { + file->fStyle = FontFileInfo::Style::kNormal; + } else if (MEMEQ("italic", value, valueLen)) { + file->fStyle = FontFileInfo::Style::kItalic; + } } else if (MEMEQ("index", name, nameLen)) { if (!parse_non_negative_integer(value, &file->fIndex)) { SkDebugf("---- Font index %s (INVALID)", value); diff --git a/src/ports/SkFontConfigParser_android.h b/src/ports/SkFontConfigParser_android.h index 6dbf383590..dd856bf733 100644 --- a/src/ports/SkFontConfigParser_android.h +++ b/src/ports/SkFontConfigParser_android.h @@ -62,11 +62,12 @@ typedef uint32_t FontVariant; // Must remain trivially movable (can be memmoved). struct FontFileInfo { - FontFileInfo() : fIndex(0), fWeight(0) { } + FontFileInfo() : fIndex(0), fWeight(0), fStyle(Style::kAuto) { } SkString fFileName; int fIndex; int fWeight; + enum class Style { kAuto, kNormal, kItalic } fStyle; }; /** diff --git a/src/ports/SkFontMgr_android.cpp b/src/ports/SkFontMgr_android.cpp index 61f990c738..d7db09bde2 100644 --- a/src/ports/SkFontMgr_android.cpp +++ b/src/ports/SkFontMgr_android.cpp @@ -143,9 +143,15 @@ public: continue; } - if (fontFile.fWeight != 0) { - style = SkFontStyle(fontFile.fWeight, style.width(), style.slant()); + int weight = fontFile.fWeight != 0 ? fontFile.fWeight : style.weight(); + SkFontStyle::Slant slant; + switch (fontFile.fStyle) { + case FontFileInfo::Style::kAuto: slant = style.slant(); break; + case FontFileInfo::Style::kNormal: slant = SkFontStyle::kUpright_Slant; break; + case FontFileInfo::Style::kItalic: slant = SkFontStyle::kItalic_Slant; break; + default: SkASSERT(false); break; } + style = SkFontStyle(weight, style.width(), slant); const SkLanguage& lang = family.fLanguage; uint32_t variant = family.fVariant; |