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

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: Rebase and add test. 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..e2d3815700a85ac6028d994dde155852391677c4 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 };
@@ -223,54 +226,78 @@ SkTypeface* SkFontStyleSet::matchStyleCSS3(const SkFontStyle& pattern) {
// This has the highest priority.
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;
+ currentScore <<= 8;
+
+ // CSS style (normal/italic/oblique)
+ // Style takes priority over all valid weights.
reed1 2016/04/26 20:36:09 s/Style/Slant ?
bungeman-skia 2016/04/27 15:37:20 Eck, yeah. So CSS uses the terms stretch, style, w
+ switch (pattern.slant()) {
+ case SkFontStyle::kUpright_Slant: {
reed1 2016/04/26 20:36:09 Sure seems like a table or other calc might be cle
bungeman-skia 2016/04/27 15:37:20 I originally wrote this as a small 3x3 score table
+ switch (current.slant()) {
+ case SkFontStyle::kUpright_Slant: currentScore += 3; break;
+ case SkFontStyle::kItalic_Slant : currentScore += 1; break;
+ case SkFontStyle::kOblique_Slant: currentScore += 2; break;
+ default: SkASSERT(false); break;
+ };
+ } break;
+ case SkFontStyle::kItalic_Slant: {
+ switch (current.slant()) {
+ case SkFontStyle::kUpright_Slant: currentScore += 1; break;
+ case SkFontStyle::kItalic_Slant : currentScore += 3; break;
+ case SkFontStyle::kOblique_Slant: currentScore += 2; break;
+ default: SkASSERT(false); break;
+ };
+ } break;
+ case SkFontStyle::kOblique_Slant: {
+ switch (current.slant()) {
+ case SkFontStyle::kUpright_Slant: currentScore += 1; break;
+ case SkFontStyle::kItalic_Slant : currentScore += 2; break;
+ case SkFontStyle::kOblique_Slant: currentScore += 3; break;
+ default: SkASSERT(false); break;
+ };
+ } break;
+ default: SkASSERT(false); break;
}
+ currentScore <<= 8;
// Synthetics (weight/style) [no stretch synthetic?]
// 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