OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 "SkTypes.h" | 8 #include "SkTypes.h" |
9 | 9 |
10 #include "SkData.h" | 10 #include "SkData.h" |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 } | 210 } |
211 | 211 |
212 int count() override { | 212 int count() override { |
213 return fStyles.count(); | 213 return fStyles.count(); |
214 } | 214 } |
215 void getStyle(int index, SkFontStyle* style, SkString* name) override { | 215 void getStyle(int index, SkFontStyle* style, SkString* name) override { |
216 if (index < 0 || fStyles.count() <= index) { | 216 if (index < 0 || fStyles.count() <= index) { |
217 return; | 217 return; |
218 } | 218 } |
219 if (style) { | 219 if (style) { |
220 *style = this->style(index); | 220 *style = fStyles[index]->fontStyle(); |
221 } | 221 } |
222 if (name) { | 222 if (name) { |
223 name->reset(); | 223 name->reset(); |
224 } | 224 } |
225 } | 225 } |
226 SkTypeface_AndroidSystem* createTypeface(int index) override { | 226 SkTypeface_AndroidSystem* createTypeface(int index) override { |
227 if (index < 0 || fStyles.count() <= index) { | 227 if (index < 0 || fStyles.count() <= index) { |
228 return nullptr; | 228 return nullptr; |
229 } | 229 } |
230 return SkRef(fStyles[index].get()); | 230 return SkRef(fStyles[index].get()); |
231 } | 231 } |
232 | 232 |
233 /** Find the typeface in this style set that most closely matches the given
pattern. | |
234 * TODO: consider replacing with SkStyleSet_Indirect::matchStyle(); | |
235 * this simpler version using match_score() passes all our tests. | |
236 */ | |
237 SkTypeface_AndroidSystem* matchStyle(const SkFontStyle& pattern) override { | 233 SkTypeface_AndroidSystem* matchStyle(const SkFontStyle& pattern) override { |
238 if (0 == fStyles.count()) { | 234 return static_cast<SkTypeface_AndroidSystem*>(this->matchStyleCSS3(patte
rn)); |
239 return nullptr; | |
240 } | |
241 SkTypeface_AndroidSystem* closest = fStyles[0]; | |
242 int minScore = std::numeric_limits<int>::max(); | |
243 for (int i = 0; i < fStyles.count(); ++i) { | |
244 SkFontStyle style = this->style(i); | |
245 int score = match_score(pattern, style); | |
246 if (score < minScore) { | |
247 closest = fStyles[i]; | |
248 minScore = score; | |
249 } | |
250 } | |
251 return SkRef(closest); | |
252 } | 235 } |
253 | 236 |
254 private: | 237 private: |
255 SkFontStyle style(int index) { | |
256 return fStyles[index]->fontStyle(); | |
257 } | |
258 static int match_score(const SkFontStyle& pattern, const SkFontStyle& candid
ate) { | |
259 int score = 0; | |
260 score += SkTAbs((pattern.width() - candidate.width()) * 100); | |
261 score += SkTAbs((pattern.slant() == candidate.slant()) ? 0 : 1000); | |
262 score += SkTAbs(pattern.weight() - candidate.weight()); | |
263 return score; | |
264 } | |
265 | |
266 SkTArray<SkAutoTUnref<SkTypeface_AndroidSystem>, true> fStyles; | 238 SkTArray<SkAutoTUnref<SkTypeface_AndroidSystem>, true> fStyles; |
267 | 239 |
268 friend struct NameToFamily; | 240 friend struct NameToFamily; |
269 friend class SkFontMgr_Android; | 241 friend class SkFontMgr_Android; |
270 | 242 |
271 typedef SkFontStyleSet INHERITED; | 243 typedef SkFontStyleSet INHERITED; |
272 }; | 244 }; |
273 | 245 |
274 /** On Android a single family can have many names, but our API assumes unique n
ames. | 246 /** On Android a single family can have many names, but our API assumes unique n
ames. |
275 * Map names to the back end so that all names for a given family refer to the
same | 247 * Map names to the back end so that all names for a given family refer to the
same |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 SkASSERT(custom->fSystemFontUse < SK_ARRAY_COUNT(gSystemFontUseStrings))
; | 551 SkASSERT(custom->fSystemFontUse < SK_ARRAY_COUNT(gSystemFontUseStrings))
; |
580 SkDEBUGF(("SystemFontUse: %s BasePath: %s Fonts: %s FallbackFonts: %s\n"
, | 552 SkDEBUGF(("SystemFontUse: %s BasePath: %s Fonts: %s FallbackFonts: %s\n"
, |
581 gSystemFontUseStrings[custom->fSystemFontUse], | 553 gSystemFontUseStrings[custom->fSystemFontUse], |
582 custom->fBasePath, | 554 custom->fBasePath, |
583 custom->fFontsXml, | 555 custom->fFontsXml, |
584 custom->fFallbackFontsXml)); | 556 custom->fFallbackFontsXml)); |
585 } | 557 } |
586 | 558 |
587 return new SkFontMgr_Android(custom); | 559 return new SkFontMgr_Android(custom); |
588 } | 560 } |
OLD | NEW |