1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2017 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "src/core/SkFontDescriptor.h" 9cb93a386Sopenharmony_ci#include "tools/ToolUtils.h" 10cb93a386Sopenharmony_ci#include "tools/fonts/TestFontMgr.h" 11cb93a386Sopenharmony_ci#include "tools/fonts/TestTypeface.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci#ifdef SK_XML 14cb93a386Sopenharmony_ci#include "tools/fonts/TestSVGTypeface.h" 15cb93a386Sopenharmony_ci#endif 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ci#include <vector> 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_cinamespace { 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ci#include "test_font_monospace.inc" 22cb93a386Sopenharmony_ci#include "test_font_sans_serif.inc" 23cb93a386Sopenharmony_ci#include "test_font_serif.inc" 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci#include "test_font_index.inc" 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ciclass FontStyleSet final : public SkFontStyleSet { 28cb93a386Sopenharmony_cipublic: 29cb93a386Sopenharmony_ci FontStyleSet(const char* familyName) : fFamilyName(familyName) {} 30cb93a386Sopenharmony_ci struct TypefaceEntry { 31cb93a386Sopenharmony_ci TypefaceEntry(sk_sp<SkTypeface> typeface, SkFontStyle style, const char* styleName) 32cb93a386Sopenharmony_ci : fTypeface(std::move(typeface)), fStyle(style), fStyleName(styleName) {} 33cb93a386Sopenharmony_ci sk_sp<SkTypeface> fTypeface; 34cb93a386Sopenharmony_ci SkFontStyle fStyle; 35cb93a386Sopenharmony_ci const char* fStyleName; 36cb93a386Sopenharmony_ci }; 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ci int count() override { return fTypefaces.size(); } 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci void getStyle(int index, SkFontStyle* style, SkString* name) override { 41cb93a386Sopenharmony_ci if (style) { 42cb93a386Sopenharmony_ci *style = fTypefaces[index].fStyle; 43cb93a386Sopenharmony_ci } 44cb93a386Sopenharmony_ci if (name) { 45cb93a386Sopenharmony_ci *name = fTypefaces[index].fStyleName; 46cb93a386Sopenharmony_ci } 47cb93a386Sopenharmony_ci } 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci SkTypeface* createTypeface(int index) override { 50cb93a386Sopenharmony_ci return SkRef(fTypefaces[index].fTypeface.get()); 51cb93a386Sopenharmony_ci } 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci SkTypeface* matchStyle(const SkFontStyle& pattern) override { 54cb93a386Sopenharmony_ci return this->matchStyleCSS3(pattern); 55cb93a386Sopenharmony_ci } 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ci SkString getFamilyName() { return fFamilyName; } 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci std::vector<TypefaceEntry> fTypefaces; 60cb93a386Sopenharmony_ci SkString fFamilyName; 61cb93a386Sopenharmony_ci}; 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ciclass FontMgr final : public SkFontMgr { 64cb93a386Sopenharmony_cipublic: 65cb93a386Sopenharmony_ci FontMgr() { 66cb93a386Sopenharmony_ci for (const auto& sub : gSubFonts) { 67cb93a386Sopenharmony_ci sk_sp<TestTypeface> typeface = 68cb93a386Sopenharmony_ci sk_make_sp<TestTypeface>(sk_make_sp<SkTestFont>(sub.fFont), sub.fStyle); 69cb93a386Sopenharmony_ci bool defaultFamily = false; 70cb93a386Sopenharmony_ci if (&sub - gSubFonts == gDefaultFontIndex) { 71cb93a386Sopenharmony_ci defaultFamily = true; 72cb93a386Sopenharmony_ci fDefaultTypeface = typeface; 73cb93a386Sopenharmony_ci } 74cb93a386Sopenharmony_ci bool found = false; 75cb93a386Sopenharmony_ci for (const auto& family : fFamilies) { 76cb93a386Sopenharmony_ci if (family->getFamilyName().equals(sub.fFamilyName)) { 77cb93a386Sopenharmony_ci family->fTypefaces.emplace_back( 78cb93a386Sopenharmony_ci std::move(typeface), sub.fStyle, sub.fStyleName); 79cb93a386Sopenharmony_ci found = true; 80cb93a386Sopenharmony_ci if (defaultFamily) { 81cb93a386Sopenharmony_ci fDefaultFamily = family; 82cb93a386Sopenharmony_ci } 83cb93a386Sopenharmony_ci break; 84cb93a386Sopenharmony_ci } 85cb93a386Sopenharmony_ci } 86cb93a386Sopenharmony_ci if (!found) { 87cb93a386Sopenharmony_ci fFamilies.emplace_back(sk_make_sp<FontStyleSet>(sub.fFamilyName)); 88cb93a386Sopenharmony_ci fFamilies.back()->fTypefaces.emplace_back( 89cb93a386Sopenharmony_ci // NOLINTNEXTLINE(bugprone-use-after-move) 90cb93a386Sopenharmony_ci std::move(typeface), 91cb93a386Sopenharmony_ci sub.fStyle, 92cb93a386Sopenharmony_ci sub.fStyleName); 93cb93a386Sopenharmony_ci if (defaultFamily) { 94cb93a386Sopenharmony_ci fDefaultFamily = fFamilies.back(); 95cb93a386Sopenharmony_ci } 96cb93a386Sopenharmony_ci } 97cb93a386Sopenharmony_ci } 98cb93a386Sopenharmony_ci#if defined(SK_ENABLE_SVG) 99cb93a386Sopenharmony_ci fFamilies.emplace_back(sk_make_sp<FontStyleSet>("Emoji")); 100cb93a386Sopenharmony_ci fFamilies.back()->fTypefaces.emplace_back( 101cb93a386Sopenharmony_ci TestSVGTypeface::Default(), SkFontStyle::Normal(), "Normal"); 102cb93a386Sopenharmony_ci 103cb93a386Sopenharmony_ci fFamilies.emplace_back(sk_make_sp<FontStyleSet>("Planet")); 104cb93a386Sopenharmony_ci fFamilies.back()->fTypefaces.emplace_back( 105cb93a386Sopenharmony_ci TestSVGTypeface::Planets(), SkFontStyle::Normal(), "Normal"); 106cb93a386Sopenharmony_ci#endif 107cb93a386Sopenharmony_ci } 108cb93a386Sopenharmony_ci 109cb93a386Sopenharmony_ci int onCountFamilies() const override { return fFamilies.size(); } 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ci void onGetFamilyName(int index, SkString* familyName) const override { 112cb93a386Sopenharmony_ci *familyName = fFamilies[index]->getFamilyName(); 113cb93a386Sopenharmony_ci } 114cb93a386Sopenharmony_ci 115cb93a386Sopenharmony_ci SkFontStyleSet* onCreateStyleSet(int index) const override { 116cb93a386Sopenharmony_ci sk_sp<SkFontStyleSet> ref = fFamilies[index]; 117cb93a386Sopenharmony_ci return ref.release(); 118cb93a386Sopenharmony_ci } 119cb93a386Sopenharmony_ci 120cb93a386Sopenharmony_ci SkFontStyleSet* onMatchFamily(const char familyName[]) const override { 121cb93a386Sopenharmony_ci if (familyName) { 122cb93a386Sopenharmony_ci if (strstr(familyName, "ono")) { 123cb93a386Sopenharmony_ci return this->createStyleSet(0); 124cb93a386Sopenharmony_ci } 125cb93a386Sopenharmony_ci if (strstr(familyName, "ans")) { 126cb93a386Sopenharmony_ci return this->createStyleSet(1); 127cb93a386Sopenharmony_ci } 128cb93a386Sopenharmony_ci if (strstr(familyName, "erif")) { 129cb93a386Sopenharmony_ci return this->createStyleSet(2); 130cb93a386Sopenharmony_ci } 131cb93a386Sopenharmony_ci#ifdef SK_XML 132cb93a386Sopenharmony_ci if (strstr(familyName, "oji")) { 133cb93a386Sopenharmony_ci return this->createStyleSet(6); 134cb93a386Sopenharmony_ci } 135cb93a386Sopenharmony_ci if (strstr(familyName, "Planet")) { 136cb93a386Sopenharmony_ci return this->createStyleSet(7); 137cb93a386Sopenharmony_ci } 138cb93a386Sopenharmony_ci#endif 139cb93a386Sopenharmony_ci } 140cb93a386Sopenharmony_ci return nullptr; 141cb93a386Sopenharmony_ci } 142cb93a386Sopenharmony_ci 143cb93a386Sopenharmony_ci SkTypeface* onMatchFamilyStyle(const char familyName[], 144cb93a386Sopenharmony_ci const SkFontStyle& style) const override { 145cb93a386Sopenharmony_ci sk_sp<SkFontStyleSet> styleSet(this->matchFamily(familyName)); 146cb93a386Sopenharmony_ci return styleSet->matchStyle(style); 147cb93a386Sopenharmony_ci } 148cb93a386Sopenharmony_ci 149cb93a386Sopenharmony_ci SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], 150cb93a386Sopenharmony_ci const SkFontStyle& style, 151cb93a386Sopenharmony_ci const char* bcp47[], 152cb93a386Sopenharmony_ci int bcp47Count, 153cb93a386Sopenharmony_ci SkUnichar character) const override { 154cb93a386Sopenharmony_ci (void)bcp47; 155cb93a386Sopenharmony_ci (void)bcp47Count; 156cb93a386Sopenharmony_ci (void)character; 157cb93a386Sopenharmony_ci return this->matchFamilyStyle(familyName, style); 158cb93a386Sopenharmony_ci } 159cb93a386Sopenharmony_ci 160cb93a386Sopenharmony_ci sk_sp<SkTypeface> onMakeFromData(sk_sp<SkData>, int ttcIndex) const override { return nullptr; } 161cb93a386Sopenharmony_ci sk_sp<SkTypeface> onMakeFromStreamIndex(std::unique_ptr<SkStreamAsset>, 162cb93a386Sopenharmony_ci int ttcIndex) const override { 163cb93a386Sopenharmony_ci return nullptr; 164cb93a386Sopenharmony_ci } 165cb93a386Sopenharmony_ci sk_sp<SkTypeface> onMakeFromStreamArgs(std::unique_ptr<SkStreamAsset>, 166cb93a386Sopenharmony_ci const SkFontArguments&) const override { 167cb93a386Sopenharmony_ci return nullptr; 168cb93a386Sopenharmony_ci } 169cb93a386Sopenharmony_ci sk_sp<SkTypeface> onMakeFromFile(const char path[], int ttcIndex) const override { 170cb93a386Sopenharmony_ci return nullptr; 171cb93a386Sopenharmony_ci } 172cb93a386Sopenharmony_ci 173cb93a386Sopenharmony_ci sk_sp<SkTypeface> onLegacyMakeTypeface(const char familyName[], 174cb93a386Sopenharmony_ci SkFontStyle style) const override { 175cb93a386Sopenharmony_ci if (familyName == nullptr) { 176cb93a386Sopenharmony_ci return sk_sp<SkTypeface>(fDefaultFamily->matchStyle(style)); 177cb93a386Sopenharmony_ci } 178cb93a386Sopenharmony_ci sk_sp<SkTypeface> typeface = sk_sp<SkTypeface>(this->matchFamilyStyle(familyName, style)); 179cb93a386Sopenharmony_ci if (!typeface) { 180cb93a386Sopenharmony_ci typeface = fDefaultTypeface; 181cb93a386Sopenharmony_ci } 182cb93a386Sopenharmony_ci return typeface; 183cb93a386Sopenharmony_ci } 184cb93a386Sopenharmony_ci 185cb93a386Sopenharmony_ciprivate: 186cb93a386Sopenharmony_ci std::vector<sk_sp<FontStyleSet>> fFamilies; 187cb93a386Sopenharmony_ci sk_sp<FontStyleSet> fDefaultFamily; 188cb93a386Sopenharmony_ci sk_sp<SkTypeface> fDefaultTypeface; 189cb93a386Sopenharmony_ci}; 190cb93a386Sopenharmony_ci} // namespace 191cb93a386Sopenharmony_ci 192cb93a386Sopenharmony_cinamespace ToolUtils { 193cb93a386Sopenharmony_cisk_sp<SkFontMgr> MakePortableFontMgr() { return sk_make_sp<FontMgr>(); } 194cb93a386Sopenharmony_ci} // namespace ToolUtils 195