Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(849)

Unified Diff: src/core/SkFontMgr.cpp

Issue 1921903002: Add oblique as a slant. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: static_assert what can be. Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/core/SkFontStyle.h ('k') | src/core/SkFontStyle.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkFontMgr.cpp
diff --git a/src/core/SkFontMgr.cpp b/src/core/SkFontMgr.cpp
index eba2b28fd6375bd65fc79debf59511830c7703ad..ebb9a8966207814024d2d6b5b66095c64882bf2e 100644
--- a/src/core/SkFontMgr.cpp
+++ b/src/core/SkFontMgr.cpp
@@ -211,6 +211,9 @@ SkTypeface* SkFontStyleSet::matchStyleCSS3(const SkFontStyle& pattern) {
struct Score {
int score;
int index;
+ Score& operator +=(int rhs) { this->score += rhs; return *this; }
+ Score& operator <<=(int rhs) { this->score <<= rhs; return *this; }
+ bool operator <(const Score& that) { return this->score < that.score; }
};
Score maxScore = { 0, 0 };
@@ -219,58 +222,70 @@ SkTypeface* SkFontStyleSet::matchStyleCSS3(const SkFontStyle& pattern) {
this->getStyle(i, &current, nullptr);
Score currentScore = { 0, i };
- // CSS stretch. (This is the width.)
- // This has the highest priority.
+ // CSS stretch / SkFontStyle::Width
+ // Takes priority over everything else.
if (pattern.width() <= SkFontStyle::kNormal_Width) {
if (current.width() <= pattern.width()) {
- currentScore.score += 10 - pattern.width() + current.width();
+ currentScore += 10 - pattern.width() + current.width();
} else {
- currentScore.score += 10 - current.width();
+ currentScore += 10 - current.width();
}
} else {
if (current.width() > pattern.width()) {
- currentScore.score += 10 + pattern.width() - current.width();
+ currentScore += 10 + pattern.width() - current.width();
} else {
- currentScore.score += current.width();
+ currentScore += current.width();
}
}
- currentScore.score *= 1002;
-
- // CSS style (italic/oblique)
- // Being italic trumps all valid weights which are not italic.
- // Note that newer specs differentiate between italic and oblique.
- if (pattern.isItalic() == current.isItalic()) {
- currentScore.score += 1001;
- }
-
- // Synthetics (weight/style) [no stretch synthetic?]
-
+ currentScore <<= 8;
+
+ // CSS style (normal, italic, oblique) / SkFontStyle::Slant (upright, italic, oblique)
+ // Takes priority over all valid weights.
+ static_assert(SkFontStyle::kUpright_Slant == 0 &&
+ SkFontStyle::kItalic_Slant == 1 &&
+ SkFontStyle::kOblique_Slant == 2,
+ "SkFontStyle::Slant values not as required.");
+ SkASSERT(0 <= pattern.slant() && pattern.slant() <= 2 &&
+ 0 <= current.slant() && current.slant() <= 2);
+ static const int score[3][3] = {
+ /* Upright Italic Oblique [current]*/
+ /* Upright */ { 3 , 1 , 2 },
+ /* Italic */ { 1 , 3 , 2 },
+ /* Oblique */ { 1 , 2 , 3 },
+ /* [pattern] */
+ };
+ currentScore += score[pattern.slant()][current.slant()];
+ currentScore <<= 8;
+
+ // Synthetics (weight, style) [no stretch synthetic?]
+
+ // CSS weight / SkFontStyle::Weight
// The 'closer' to the target weight, the higher the score.
// 1000 is the 'heaviest' recognized weight
if (pattern.weight() == current.weight()) {
- currentScore.score += 1000;
+ currentScore += 1000;
} else if (pattern.weight() <= 500) {
if (400 <= pattern.weight() && pattern.weight() < 450) {
if (450 <= current.weight() && current.weight() <= 500) {
// Artificially boost the 500 weight.
// TODO: determine correct number to use.
- currentScore.score += 500;
+ currentScore += 500;
}
}
if (current.weight() <= pattern.weight()) {
- currentScore.score += 1000 - pattern.weight() + current.weight();
+ currentScore += 1000 - pattern.weight() + current.weight();
} else {
- currentScore.score += 1000 - current.weight();
+ currentScore += 1000 - current.weight();
}
} else if (pattern.weight() > 500) {
if (current.weight() > pattern.weight()) {
- currentScore.score += 1000 + pattern.weight() - current.weight();
+ currentScore += 1000 + pattern.weight() - current.weight();
} else {
- currentScore.score += current.weight();
+ currentScore += current.weight();
}
}
- if (currentScore.score > maxScore.score) {
+ if (maxScore < currentScore) {
maxScore = currentScore;
}
}
« no previous file with comments | « include/core/SkFontStyle.h ('k') | src/core/SkFontStyle.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698