aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar bungeman <bungeman@google.com>2015-04-17 13:25:03 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-04-17 13:25:03 -0700
commit673e902c9b9982a167f54f1cc175d8d9cab8bcaf (patch)
tree6baf8e8891b36812a77c687e701d472a9b0c6190
parent54b666b144e1281c0edf499e5ec1c59edaef6572 (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
-rw-r--r--site/dev/contrib/style.md17
-rw-r--r--src/ports/SkFontConfigParser_android.cpp7
-rw-r--r--src/ports/SkFontConfigParser_android.h3
-rw-r--r--src/ports/SkFontMgr_android.cpp10
4 files changed, 30 insertions, 7 deletions
diff --git a/site/dev/contrib/style.md b/site/dev/contrib/style.md
index e952ed1b68..177a58b8d4 100644
--- a/site/dev/contrib/style.md
+++ b/site/dev/contrib/style.md
@@ -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?-->
~~~~
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;