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
This commit is contained in:
bungeman 2015-04-17 13:25:03 -07:00 committed by Commit bot
parent 54b666b144
commit 673e902c9b
4 changed files with 30 additions and 7 deletions

View File

@ -78,10 +78,19 @@ int herdCats(const Array& cats) {
}
~~~~
Enum values are prefixed with k and have post fix that consists of an underscore
and singular name of the enum name. The enum itself should be singular for
exclusive values or plural for a bitfield. If a count is needed it is
k<singular enum name>Count and not be a member of the enum (see example):
Enum values are prefixed with k. Unscoped enum values are post fixed with
an underscore and singular name of the enum name. The enum itself should be
singular for exclusive values or plural for a bitfield. If a count is needed it
is k&lt;singular enum name&gt;Count and not be a member of the enum (see example):
<!--?prettify?-->
~~~~
enum class SkPancakeType {
kBlueberry,
kPlain,
kChocolateChip,
};
~~~~
<!--?prettify?-->
~~~~

View File

@ -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);

View File

@ -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;
};
/**

View File

@ -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;