• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2019 Google LLC.
2 #include "modules/skparagraph/include/TypefaceFontProvider.h"
3 #include <algorithm>
4 #include "include/core/SkFontMgr.h"
5 #include "include/core/SkString.h"
6 #include "include/core/SkTypeface.h"
7 #include "src/core/SkFontDescriptor.h"
8 
9 namespace skia {
10 namespace textlayout {
11 
onCountFamilies() const12 int TypefaceFontProvider::onCountFamilies() const { return fRegisteredFamilies.count(); }
13 
onGetFamilyName(int index,SkString * familyName) const14 void TypefaceFontProvider::onGetFamilyName(int index, SkString* familyName) const {
15     SkASSERT(index < fRegisteredFamilies.count());
16     familyName->set(fFamilyNames[index]);
17 }
18 
onMatchFamily(const char familyName[]) const19 SkFontStyleSet* TypefaceFontProvider::onMatchFamily(const char familyName[]) const {
20     auto found = fRegisteredFamilies.find(SkString(familyName));
21     if (found) {
22       return SkRef((*found).get());
23     }
24     return nullptr;
25 }
26 
registerTypeface(sk_sp<SkTypeface> typeface)27 size_t TypefaceFontProvider::registerTypeface(sk_sp<SkTypeface> typeface) {
28     if (typeface == nullptr) {
29         return 0;
30     }
31 
32     SkString familyName;
33     typeface->getFamilyName(&familyName);
34 
35     return registerTypeface(std::move(typeface), std::move(familyName));
36 }
37 
registerTypeface(sk_sp<SkTypeface> typeface,const SkString & familyName)38 size_t TypefaceFontProvider::registerTypeface(sk_sp<SkTypeface> typeface, const SkString& familyName) {
39     if (familyName.size() == 0) {
40         return 0;
41     }
42 
43     auto found = fRegisteredFamilies.find(familyName);
44     if (typeface != nullptr) {
45         if (found == nullptr) {
46             found = fRegisteredFamilies.set(familyName, sk_make_sp<TypefaceFontStyleSet>(familyName));
47             fFamilyNames.emplace_back(familyName);
48         }
49 
50         (*found)->appendTypeface(std::move(typeface));
51     } else if (found != nullptr) {
52         (*found)->clearTypefaces();
53         fRegisteredFamilies.remove(familyName);
54         for (size_t i = 0; i < fFamilyNames.size(); i++) {
55             if (fFamilyNames[i] == familyName) {
56                 fFamilyNames.removeShuffle(i);
57                 break;
58             }
59         }
60     }
61 
62     return 1;
63 }
64 
TypefaceFontStyleSet(const SkString & familyName)65 TypefaceFontStyleSet::TypefaceFontStyleSet(const SkString& familyName)
66         : fFamilyName(familyName) {}
67 
count()68 int TypefaceFontStyleSet::count() { return fStyles.size(); }
69 
getStyle(int index,SkFontStyle * style,SkString * name)70 void TypefaceFontStyleSet::getStyle(int index, SkFontStyle* style, SkString* name) {
71     SkASSERT(index < fStyles.size());
72     if (style) {
73         *style = fStyles[index]->fontStyle();
74     }
75     if (name) {
76         *name = fFamilyName;
77     }
78 }
79 
createTypeface(int index)80 SkTypeface* TypefaceFontStyleSet::createTypeface(int index) {
81     SkASSERT(index < fStyles.size());
82     return SkRef(fStyles[index].get());
83 }
84 
matchStyle(const SkFontStyle & pattern)85 SkTypeface* TypefaceFontStyleSet::matchStyle(const SkFontStyle& pattern) {
86     return this->matchStyleCSS3(pattern);
87 }
88 
appendTypeface(sk_sp<SkTypeface> typeface)89 void TypefaceFontStyleSet::appendTypeface(sk_sp<SkTypeface> typeface) {
90     if (typeface.get() != nullptr) {
91         fStyles.emplace_back(std::move(typeface));
92     }
93 }
94 
clearTypefaces()95 void TypefaceFontStyleSet::clearTypefaces() {
96     fStyles.reset();
97 }
98 
99 }  // namespace textlayout
100 }  // namespace skia
101