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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « include/core/SkFontStyle.h ('k') | src/core/SkFontStyle.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkFontDescriptor.h" 8 #include "SkFontDescriptor.h"
9 #include "SkFontMgr.h" 9 #include "SkFontMgr.h"
10 #include "SkOncePtr.h" 10 #include "SkOncePtr.h"
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 */ 204 */
205 SkTypeface* SkFontStyleSet::matchStyleCSS3(const SkFontStyle& pattern) { 205 SkTypeface* SkFontStyleSet::matchStyleCSS3(const SkFontStyle& pattern) {
206 int count = this->count(); 206 int count = this->count();
207 if (0 == count) { 207 if (0 == count) {
208 return nullptr; 208 return nullptr;
209 } 209 }
210 210
211 struct Score { 211 struct Score {
212 int score; 212 int score;
213 int index; 213 int index;
214 Score& operator +=(int rhs) { this->score += rhs; return *this; }
215 Score& operator <<=(int rhs) { this->score <<= rhs; return *this; }
216 bool operator <(const Score& that) { return this->score < that.score; }
214 }; 217 };
215 218
216 Score maxScore = { 0, 0 }; 219 Score maxScore = { 0, 0 };
217 for (int i = 0; i < count; ++i) { 220 for (int i = 0; i < count; ++i) {
218 SkFontStyle current; 221 SkFontStyle current;
219 this->getStyle(i, &current, nullptr); 222 this->getStyle(i, &current, nullptr);
220 Score currentScore = { 0, i }; 223 Score currentScore = { 0, i };
221 224
222 // CSS stretch. (This is the width.) 225 // CSS stretch. (This is the width.)
223 // This has the highest priority. 226 // This has the highest priority.
224 if (pattern.width() <= SkFontStyle::kNormal_Width) { 227 if (pattern.width() <= SkFontStyle::kNormal_Width) {
225 if (current.width() <= pattern.width()) { 228 if (current.width() <= pattern.width()) {
226 currentScore.score += 10 - pattern.width() + current.width(); 229 currentScore += 10 - pattern.width() + current.width();
227 } else { 230 } else {
228 currentScore.score += 10 - current.width(); 231 currentScore += 10 - current.width();
229 } 232 }
230 } else { 233 } else {
231 if (current.width() > pattern.width()) { 234 if (current.width() > pattern.width()) {
232 currentScore.score += 10 + pattern.width() - current.width(); 235 currentScore += 10 + pattern.width() - current.width();
233 } else { 236 } else {
234 currentScore.score += current.width(); 237 currentScore += current.width();
235 } 238 }
236 } 239 }
237 currentScore.score *= 1002; 240 currentScore <<= 8;
238 241
239 // CSS style (italic/oblique) 242 // CSS style (normal/italic/oblique)
240 // Being italic trumps all valid weights which are not italic. 243 // 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
241 // Note that newer specs differentiate between italic and oblique. 244 switch (pattern.slant()) {
242 if (pattern.isItalic() == current.isItalic()) { 245 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
243 currentScore.score += 1001; 246 switch (current.slant()) {
247 case SkFontStyle::kUpright_Slant: currentScore += 3; break;
248 case SkFontStyle::kItalic_Slant : currentScore += 1; break;
249 case SkFontStyle::kOblique_Slant: currentScore += 2; break;
250 default: SkASSERT(false); break;
251 };
252 } break;
253 case SkFontStyle::kItalic_Slant: {
254 switch (current.slant()) {
255 case SkFontStyle::kUpright_Slant: currentScore += 1; break;
256 case SkFontStyle::kItalic_Slant : currentScore += 3; break;
257 case SkFontStyle::kOblique_Slant: currentScore += 2; break;
258 default: SkASSERT(false); break;
259 };
260 } break;
261 case SkFontStyle::kOblique_Slant: {
262 switch (current.slant()) {
263 case SkFontStyle::kUpright_Slant: currentScore += 1; break;
264 case SkFontStyle::kItalic_Slant : currentScore += 2; break;
265 case SkFontStyle::kOblique_Slant: currentScore += 3; break;
266 default: SkASSERT(false); break;
267 };
268 } break;
269 default: SkASSERT(false); break;
244 } 270 }
271 currentScore <<= 8;
245 272
246 // Synthetics (weight/style) [no stretch synthetic?] 273 // Synthetics (weight/style) [no stretch synthetic?]
247 274
248 // The 'closer' to the target weight, the higher the score. 275 // The 'closer' to the target weight, the higher the score.
249 // 1000 is the 'heaviest' recognized weight 276 // 1000 is the 'heaviest' recognized weight
250 if (pattern.weight() == current.weight()) { 277 if (pattern.weight() == current.weight()) {
251 currentScore.score += 1000; 278 currentScore += 1000;
252 } else if (pattern.weight() <= 500) { 279 } else if (pattern.weight() <= 500) {
253 if (400 <= pattern.weight() && pattern.weight() < 450) { 280 if (400 <= pattern.weight() && pattern.weight() < 450) {
254 if (450 <= current.weight() && current.weight() <= 500) { 281 if (450 <= current.weight() && current.weight() <= 500) {
255 // Artificially boost the 500 weight. 282 // Artificially boost the 500 weight.
256 // TODO: determine correct number to use. 283 // TODO: determine correct number to use.
257 currentScore.score += 500; 284 currentScore += 500;
258 } 285 }
259 } 286 }
260 if (current.weight() <= pattern.weight()) { 287 if (current.weight() <= pattern.weight()) {
261 currentScore.score += 1000 - pattern.weight() + current.weight() ; 288 currentScore += 1000 - pattern.weight() + current.weight();
262 } else { 289 } else {
263 currentScore.score += 1000 - current.weight(); 290 currentScore += 1000 - current.weight();
264 } 291 }
265 } else if (pattern.weight() > 500) { 292 } else if (pattern.weight() > 500) {
266 if (current.weight() > pattern.weight()) { 293 if (current.weight() > pattern.weight()) {
267 currentScore.score += 1000 + pattern.weight() - current.weight() ; 294 currentScore += 1000 + pattern.weight() - current.weight();
268 } else { 295 } else {
269 currentScore.score += current.weight(); 296 currentScore += current.weight();
270 } 297 }
271 } 298 }
272 299
273 if (currentScore.score > maxScore.score) { 300 if (maxScore < currentScore) {
274 maxScore = currentScore; 301 maxScore = currentScore;
275 } 302 }
276 } 303 }
277 304
278 return this->createTypeface(maxScore.index); 305 return this->createTypeface(maxScore.index);
279 } 306 }
OLDNEW
« 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