1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2015 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 * 2021.9.9 SkFontMgr on previewer of ohos. 7cb93a386Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. All rights reserved. 8cb93a386Sopenharmony_ci */ 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#ifndef SkFontMgr_preview_DEFINED 11cb93a386Sopenharmony_ci#define SkFontMgr_preview_DEFINED 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci#include "include/core/SkFontMgr.h" 14cb93a386Sopenharmony_ci#include "include/core/SkData.h" 15cb93a386Sopenharmony_ci#include "include/core/SkFontStyle.h" 16cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 17cb93a386Sopenharmony_ci#include "include/core/SkStream.h" 18cb93a386Sopenharmony_ci#include "include/core/SkString.h" 19cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h" 20cb93a386Sopenharmony_ci#include "include/private/SkTArray.h" 21cb93a386Sopenharmony_ci#include "include/private/SkTDArray.h" 22cb93a386Sopenharmony_ci#include "include/private/SkFixed.h" 23cb93a386Sopenharmony_ci#include "include/private/SkTemplates.h" 24cb93a386Sopenharmony_ci#include "src/core/SkFontDescriptor.h" 25cb93a386Sopenharmony_ci#include "src/core/SkOSFile.h" 26cb93a386Sopenharmony_ci#include "src/ports/SkFontHost_FreeType_common.h" 27cb93a386Sopenharmony_ci#include "src/ports/SkFontMgr_config_parser.h" 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ciclass SkData; 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ciclass SkTypeface_Preview : public SkTypeface_FreeType { 32cb93a386Sopenharmony_cipublic: 33cb93a386Sopenharmony_ci SkTypeface_Preview(const SkFontStyle& style, 34cb93a386Sopenharmony_ci bool isFixedPitch, 35cb93a386Sopenharmony_ci const SkString& familyName) 36cb93a386Sopenharmony_ci : INHERITED(style, isFixedPitch) 37cb93a386Sopenharmony_ci , fFamilyName(familyName) 38cb93a386Sopenharmony_ci { } 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci ~SkTypeface_Preview() override = default; 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ciprotected: 43cb93a386Sopenharmony_ci void onGetFamilyName(SkString* familyName) const override 44cb93a386Sopenharmony_ci { 45cb93a386Sopenharmony_ci *familyName = fFamilyName; 46cb93a386Sopenharmony_ci } 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ci SkString fFamilyName; 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ciprivate: 51cb93a386Sopenharmony_ci typedef SkTypeface_FreeType INHERITED; 52cb93a386Sopenharmony_ci}; 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ciclass SkTypeface_PreviewSystem : public SkTypeface_Preview { 55cb93a386Sopenharmony_cipublic: 56cb93a386Sopenharmony_ci SkTypeface_PreviewSystem(const SkString& pathName, 57cb93a386Sopenharmony_ci int index, 58cb93a386Sopenharmony_ci const SkFixed* axes, int axesCount, 59cb93a386Sopenharmony_ci const SkFontStyle& style, 60cb93a386Sopenharmony_ci bool isFixedPitch, 61cb93a386Sopenharmony_ci const SkString& familyName, 62cb93a386Sopenharmony_ci const SkTArray<SkLanguage, true>& lang, 63cb93a386Sopenharmony_ci FontVariant variantStyle) 64cb93a386Sopenharmony_ci : INHERITED(style, isFixedPitch, familyName) 65cb93a386Sopenharmony_ci , fPathName(pathName) 66cb93a386Sopenharmony_ci , fIndex(index) 67cb93a386Sopenharmony_ci , fAxes(axes, axesCount) 68cb93a386Sopenharmony_ci , fLang(lang) 69cb93a386Sopenharmony_ci , fVariantStyle(variantStyle) 70cb93a386Sopenharmony_ci , fFile(nullptr) 71cb93a386Sopenharmony_ci { } 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci ~SkTypeface_PreviewSystem() override = default; 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ci std::unique_ptr<SkStreamAsset> makeStream() const 76cb93a386Sopenharmony_ci { 77cb93a386Sopenharmony_ci if (fFile) { 78cb93a386Sopenharmony_ci sk_sp<SkData> data(SkData::MakeFromFILE(fFile)); 79cb93a386Sopenharmony_ci return data ? std::make_unique<SkMemoryStream>(std::move(data)) : nullptr; 80cb93a386Sopenharmony_ci } 81cb93a386Sopenharmony_ci return SkStream::MakeFromFile(fPathName.c_str()); 82cb93a386Sopenharmony_ci } 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci virtual void onGetFontDescriptor(SkFontDescriptor* desc, bool* serialize) const override 85cb93a386Sopenharmony_ci { 86cb93a386Sopenharmony_ci SkASSERT(desc); 87cb93a386Sopenharmony_ci SkASSERT(serialize); 88cb93a386Sopenharmony_ci desc->setFamilyName(fFamilyName.c_str()); 89cb93a386Sopenharmony_ci desc->setStyle(this->fontStyle()); 90cb93a386Sopenharmony_ci *serialize = false; 91cb93a386Sopenharmony_ci } 92cb93a386Sopenharmony_ci 93cb93a386Sopenharmony_ci std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override 94cb93a386Sopenharmony_ci { 95cb93a386Sopenharmony_ci *ttcIndex = fIndex; 96cb93a386Sopenharmony_ci return this->makeStream(); 97cb93a386Sopenharmony_ci } 98cb93a386Sopenharmony_ci 99cb93a386Sopenharmony_ci std::unique_ptr<SkFontData> onMakeFontData() const override 100cb93a386Sopenharmony_ci { 101cb93a386Sopenharmony_ci return std::make_unique<SkFontData>(this->makeStream(), fIndex, fAxes.begin(), fAxes.count()); 102cb93a386Sopenharmony_ci } 103cb93a386Sopenharmony_ci 104cb93a386Sopenharmony_ci sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override 105cb93a386Sopenharmony_ci { 106cb93a386Sopenharmony_ci std::unique_ptr<SkFontData> data = this->cloneFontData(args); 107cb93a386Sopenharmony_ci if (!data) { 108cb93a386Sopenharmony_ci return nullptr; 109cb93a386Sopenharmony_ci } 110cb93a386Sopenharmony_ci return sk_make_sp<SkTypeface_PreviewSystem>(fPathName, 111cb93a386Sopenharmony_ci fIndex, 112cb93a386Sopenharmony_ci data->getAxis(), 113cb93a386Sopenharmony_ci data->getAxisCount(), 114cb93a386Sopenharmony_ci this->fontStyle(), 115cb93a386Sopenharmony_ci this->isFixedPitch(), 116cb93a386Sopenharmony_ci fFamilyName, 117cb93a386Sopenharmony_ci fLang, 118cb93a386Sopenharmony_ci fVariantStyle); 119cb93a386Sopenharmony_ci } 120cb93a386Sopenharmony_ci 121cb93a386Sopenharmony_ci const SkString fPathName; 122cb93a386Sopenharmony_ci int fIndex; 123cb93a386Sopenharmony_ci const SkSTArray<4, SkFixed, true> fAxes; 124cb93a386Sopenharmony_ci const SkSTArray<4, SkLanguage, true> fLang; 125cb93a386Sopenharmony_ci const FontVariant fVariantStyle; 126cb93a386Sopenharmony_ci SkAutoTCallVProc<FILE, sk_fclose> fFile; 127cb93a386Sopenharmony_ci 128cb93a386Sopenharmony_ci typedef SkTypeface_Preview INHERITED; 129cb93a386Sopenharmony_ci}; 130cb93a386Sopenharmony_ci 131cb93a386Sopenharmony_ciclass SkTypeface_PreviewStream : public SkTypeface_Preview { 132cb93a386Sopenharmony_cipublic: 133cb93a386Sopenharmony_ci SkTypeface_PreviewStream(std::unique_ptr<SkFontData> data, 134cb93a386Sopenharmony_ci const SkFontStyle& style, 135cb93a386Sopenharmony_ci bool isFixedPitch, 136cb93a386Sopenharmony_ci const SkString& familyName) 137cb93a386Sopenharmony_ci : INHERITED(style, isFixedPitch, familyName) 138cb93a386Sopenharmony_ci , fData(std::move(data)) 139cb93a386Sopenharmony_ci { } 140cb93a386Sopenharmony_ci 141cb93a386Sopenharmony_ci ~SkTypeface_PreviewStream() override = default; 142cb93a386Sopenharmony_ci 143cb93a386Sopenharmony_ci virtual void onGetFontDescriptor(SkFontDescriptor* desc, bool* serialize) const override 144cb93a386Sopenharmony_ci { 145cb93a386Sopenharmony_ci SkASSERT(desc); 146cb93a386Sopenharmony_ci SkASSERT(serialize); 147cb93a386Sopenharmony_ci desc->setFamilyName(fFamilyName.c_str()); 148cb93a386Sopenharmony_ci *serialize = true; 149cb93a386Sopenharmony_ci } 150cb93a386Sopenharmony_ci 151cb93a386Sopenharmony_ci std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override 152cb93a386Sopenharmony_ci { 153cb93a386Sopenharmony_ci *ttcIndex = fData->getIndex(); 154cb93a386Sopenharmony_ci return fData->getStream()->duplicate(); 155cb93a386Sopenharmony_ci } 156cb93a386Sopenharmony_ci 157cb93a386Sopenharmony_ci std::unique_ptr<SkFontData> onMakeFontData() const override 158cb93a386Sopenharmony_ci { 159cb93a386Sopenharmony_ci return std::make_unique<SkFontData>(*fData); 160cb93a386Sopenharmony_ci } 161cb93a386Sopenharmony_ci 162cb93a386Sopenharmony_ci sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override 163cb93a386Sopenharmony_ci { 164cb93a386Sopenharmony_ci std::unique_ptr<SkFontData> data = this->cloneFontData(args); 165cb93a386Sopenharmony_ci if (!data) { 166cb93a386Sopenharmony_ci return nullptr; 167cb93a386Sopenharmony_ci } 168cb93a386Sopenharmony_ci return sk_make_sp<SkTypeface_PreviewStream>(std::move(data), this->fontStyle(), this->isFixedPitch(), fFamilyName); 169cb93a386Sopenharmony_ci } 170cb93a386Sopenharmony_ci 171cb93a386Sopenharmony_ciprivate: 172cb93a386Sopenharmony_ci const std::unique_ptr<const SkFontData> fData; 173cb93a386Sopenharmony_ci typedef SkTypeface_Preview INHERITED; 174cb93a386Sopenharmony_ci}; 175cb93a386Sopenharmony_ci 176cb93a386Sopenharmony_ciclass SkFontStyleSet_Preview : public SkFontStyleSet { 177cb93a386Sopenharmony_ci typedef SkTypeface_FreeType::Scanner Scanner; 178cb93a386Sopenharmony_ci 179cb93a386Sopenharmony_cipublic: 180cb93a386Sopenharmony_ci explicit SkFontStyleSet_Preview(const FontFamily& family, const Scanner& scanner) 181cb93a386Sopenharmony_ci { 182cb93a386Sopenharmony_ci const SkString* cannonicalFamilyName = nullptr; 183cb93a386Sopenharmony_ci if (family.fNames.count() > 0) { 184cb93a386Sopenharmony_ci cannonicalFamilyName = &family.fNames[0]; 185cb93a386Sopenharmony_ci } 186cb93a386Sopenharmony_ci fFallbackFor = family.fFallbackFor; 187cb93a386Sopenharmony_ci 188cb93a386Sopenharmony_ci // TODO? make this lazy 189cb93a386Sopenharmony_ci for (int i = 0; i < family.fFonts.count(); ++i) { 190cb93a386Sopenharmony_ci const FontFileInfo& fontFile = family.fFonts[i]; 191cb93a386Sopenharmony_ci 192cb93a386Sopenharmony_ci SkString pathName(family.fBasePath); 193cb93a386Sopenharmony_ci pathName.append(fontFile.fFileName); 194cb93a386Sopenharmony_ci 195cb93a386Sopenharmony_ci std::unique_ptr<SkStreamAsset> stream = SkStream::MakeFromFile(pathName.c_str()); 196cb93a386Sopenharmony_ci if (!stream) { 197cb93a386Sopenharmony_ci SkDEBUGF("Requested font file %s does not exist or cannot be opened.\n", pathName.c_str()); 198cb93a386Sopenharmony_ci continue; 199cb93a386Sopenharmony_ci } 200cb93a386Sopenharmony_ci 201cb93a386Sopenharmony_ci const int ttcIndex = fontFile.fIndex; 202cb93a386Sopenharmony_ci SkString familyName; 203cb93a386Sopenharmony_ci SkFontStyle style; 204cb93a386Sopenharmony_ci bool isFixedWidth = true; 205cb93a386Sopenharmony_ci Scanner::AxisDefinitions axisDefinitions; 206cb93a386Sopenharmony_ci 207cb93a386Sopenharmony_ci if (!scanner.scanFont(stream.get(), ttcIndex, 208cb93a386Sopenharmony_ci &familyName, &style, &isFixedWidth, &axisDefinitions)) { 209cb93a386Sopenharmony_ci SkDEBUGF("Requested font file %s exists, but is not a valid font.\n", 210cb93a386Sopenharmony_ci pathName.c_str()); 211cb93a386Sopenharmony_ci continue; 212cb93a386Sopenharmony_ci } 213cb93a386Sopenharmony_ci 214cb93a386Sopenharmony_ci int weight = fontFile.fWeight != 0 ? fontFile.fWeight : style.weight(); 215cb93a386Sopenharmony_ci SkFontStyle::Slant slant = style.slant(); 216cb93a386Sopenharmony_ci switch (fontFile.fStyle) { 217cb93a386Sopenharmony_ci case FontFileInfo::Style::kAuto: 218cb93a386Sopenharmony_ci slant = style.slant(); 219cb93a386Sopenharmony_ci break; 220cb93a386Sopenharmony_ci case FontFileInfo::Style::kNormal: 221cb93a386Sopenharmony_ci slant = SkFontStyle::kUpright_Slant; 222cb93a386Sopenharmony_ci break; 223cb93a386Sopenharmony_ci case FontFileInfo::Style::kItalic: 224cb93a386Sopenharmony_ci slant = SkFontStyle::kItalic_Slant; 225cb93a386Sopenharmony_ci break; 226cb93a386Sopenharmony_ci default: 227cb93a386Sopenharmony_ci SkASSERT(false); 228cb93a386Sopenharmony_ci break; 229cb93a386Sopenharmony_ci } 230cb93a386Sopenharmony_ci style = SkFontStyle(weight, style.width(), slant); 231cb93a386Sopenharmony_ci 232cb93a386Sopenharmony_ci uint32_t variant = family.fVariant; 233cb93a386Sopenharmony_ci if (kDefault_FontVariant == variant) { 234cb93a386Sopenharmony_ci variant = kCompact_FontVariant | kElegant_FontVariant; 235cb93a386Sopenharmony_ci } 236cb93a386Sopenharmony_ci 237cb93a386Sopenharmony_ci // The first specified family name overrides the family name found in the font. 238cb93a386Sopenharmony_ci // TODO: SkTypeface_PreviewSystem::onCreateFamilyNameIterator should return 239cb93a386Sopenharmony_ci // all of the specified family names in addition to the names found in the font. 240cb93a386Sopenharmony_ci if (cannonicalFamilyName != nullptr) { 241cb93a386Sopenharmony_ci familyName = *cannonicalFamilyName; 242cb93a386Sopenharmony_ci } 243cb93a386Sopenharmony_ci 244cb93a386Sopenharmony_ci SkAutoSTMalloc<4, SkFixed> axisValues(axisDefinitions.count()); 245cb93a386Sopenharmony_ci SkFontArguments::VariationPosition position = { 246cb93a386Sopenharmony_ci fontFile.fVariationDesignPosition.begin(), 247cb93a386Sopenharmony_ci fontFile.fVariationDesignPosition.count() 248cb93a386Sopenharmony_ci }; 249cb93a386Sopenharmony_ci Scanner::computeAxisValues(axisDefinitions, position, axisValues, familyName); 250cb93a386Sopenharmony_ci 251cb93a386Sopenharmony_ci fStyles.push_back().reset(new SkTypeface_PreviewSystem(pathName, ttcIndex, axisValues.get(), 252cb93a386Sopenharmony_ci axisDefinitions.count(), style, isFixedWidth, 253cb93a386Sopenharmony_ci familyName, family.fLanguages, variant)); 254cb93a386Sopenharmony_ci } 255cb93a386Sopenharmony_ci } 256cb93a386Sopenharmony_ci 257cb93a386Sopenharmony_ci ~SkFontStyleSet_Preview() override = default; 258cb93a386Sopenharmony_ci 259cb93a386Sopenharmony_ci int count() override 260cb93a386Sopenharmony_ci { 261cb93a386Sopenharmony_ci return fStyles.count(); 262cb93a386Sopenharmony_ci } 263cb93a386Sopenharmony_ci 264cb93a386Sopenharmony_ci void getStyle(int index, SkFontStyle* style, SkString* name) override 265cb93a386Sopenharmony_ci { 266cb93a386Sopenharmony_ci if (index < 0 || fStyles.count() <= index) { 267cb93a386Sopenharmony_ci return; 268cb93a386Sopenharmony_ci } 269cb93a386Sopenharmony_ci if (style) { 270cb93a386Sopenharmony_ci *style = fStyles[index]->fontStyle(); 271cb93a386Sopenharmony_ci } 272cb93a386Sopenharmony_ci if (name) { 273cb93a386Sopenharmony_ci name->reset(); 274cb93a386Sopenharmony_ci } 275cb93a386Sopenharmony_ci } 276cb93a386Sopenharmony_ci 277cb93a386Sopenharmony_ci SkTypeface_PreviewSystem* createTypeface(int index) override 278cb93a386Sopenharmony_ci { 279cb93a386Sopenharmony_ci if (index < 0 || fStyles.count() <= index) { 280cb93a386Sopenharmony_ci return nullptr; 281cb93a386Sopenharmony_ci } 282cb93a386Sopenharmony_ci return SkRef(fStyles[index].get()); 283cb93a386Sopenharmony_ci } 284cb93a386Sopenharmony_ci 285cb93a386Sopenharmony_ci SkTypeface_PreviewSystem* matchStyle(const SkFontStyle& pattern) override 286cb93a386Sopenharmony_ci { 287cb93a386Sopenharmony_ci return static_cast<SkTypeface_PreviewSystem*>(this->matchStyleCSS3(pattern)); 288cb93a386Sopenharmony_ci } 289cb93a386Sopenharmony_ci 290cb93a386Sopenharmony_ciprivate: 291cb93a386Sopenharmony_ci SkTArray<sk_sp<SkTypeface_PreviewSystem>> fStyles; 292cb93a386Sopenharmony_ci SkString fFallbackFor; 293cb93a386Sopenharmony_ci 294cb93a386Sopenharmony_ci friend struct NameToFamily; 295cb93a386Sopenharmony_ci friend class SkFontMgr_Preview; 296cb93a386Sopenharmony_ci 297cb93a386Sopenharmony_ci typedef SkFontStyleSet INHERITED; 298cb93a386Sopenharmony_ci}; 299cb93a386Sopenharmony_ci 300cb93a386Sopenharmony_ci/** A single family can have many names, but our API assumes unique names. 301cb93a386Sopenharmony_ci * Map names to the back end so that all names for a given family refer to the same 302cb93a386Sopenharmony_ci * (non-replicated) set of typefaces. 303cb93a386Sopenharmony_ci * SkTDict<> doesn't let us do index-based lookup, so we write our own mapping. 304cb93a386Sopenharmony_ci */ 305cb93a386Sopenharmony_cistruct NameToFamily { 306cb93a386Sopenharmony_ci SkString name; 307cb93a386Sopenharmony_ci SkFontStyleSet_Preview* styleSet; 308cb93a386Sopenharmony_ci}; 309cb93a386Sopenharmony_ci 310cb93a386Sopenharmony_ciSK_API sk_sp<SkFontMgr> SkFontMgr_New_Preview(); 311cb93a386Sopenharmony_ci 312cb93a386Sopenharmony_ciclass SkFontMgr_Preview : public SkFontMgr { 313cb93a386Sopenharmony_cipublic: 314cb93a386Sopenharmony_ci SkFontMgr_Preview(); 315cb93a386Sopenharmony_ci ~SkFontMgr_Preview() override = default; 316cb93a386Sopenharmony_ci 317cb93a386Sopenharmony_ciprotected: 318cb93a386Sopenharmony_ci int onCountFamilies() const override; 319cb93a386Sopenharmony_ci void onGetFamilyName(int index, SkString* familyName) const override; 320cb93a386Sopenharmony_ci SkFontStyleSet* onCreateStyleSet(int index) const override; 321cb93a386Sopenharmony_ci SkFontStyleSet* onMatchFamily(const char familyName[]) const override; 322cb93a386Sopenharmony_ci virtual SkTypeface* onMatchFamilyStyle(const char familyName[], 323cb93a386Sopenharmony_ci const SkFontStyle& style) const override; 324cb93a386Sopenharmony_ci virtual SkTypeface* onMatchFaceStyle(const SkTypeface* typeface, 325cb93a386Sopenharmony_ci const SkFontStyle& style) const override; 326cb93a386Sopenharmony_ci 327cb93a386Sopenharmony_ci static sk_sp<SkTypeface_PreviewSystem> find_family_style_character( 328cb93a386Sopenharmony_ci const SkString& familyName, 329cb93a386Sopenharmony_ci const SkTArray<NameToFamily, true>& fallbackNameToFamilyMap, 330cb93a386Sopenharmony_ci const SkFontStyle& style, bool elegant, 331cb93a386Sopenharmony_ci const SkString& langTag, SkUnichar character); 332cb93a386Sopenharmony_ci 333cb93a386Sopenharmony_ci virtual SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], 334cb93a386Sopenharmony_ci const SkFontStyle& style, 335cb93a386Sopenharmony_ci const char* bcp47[], 336cb93a386Sopenharmony_ci int bcp47Count, 337cb93a386Sopenharmony_ci SkUnichar character) const override; 338cb93a386Sopenharmony_ci sk_sp<SkTypeface> onMakeFromData(sk_sp<SkData> data, int ttcIndex) const override; 339cb93a386Sopenharmony_ci sk_sp<SkTypeface> onMakeFromFile(const char path[], int ttcIndex) const override; 340cb93a386Sopenharmony_ci sk_sp<SkTypeface> onMakeFromStreamIndex(std::unique_ptr<SkStreamAsset> stream, int ttcIndex) const override; 341cb93a386Sopenharmony_ci sk_sp<SkTypeface> onMakeFromStreamArgs(std::unique_ptr<SkStreamAsset> stream, 342cb93a386Sopenharmony_ci const SkFontArguments& args) const override; 343cb93a386Sopenharmony_ci sk_sp<SkTypeface> onLegacyMakeTypeface(const char familyName[], SkFontStyle style) const override; 344cb93a386Sopenharmony_ci 345cb93a386Sopenharmony_ciprivate: 346cb93a386Sopenharmony_ci void buildNameToFamilyMap(SkTDArray<FontFamily*> families); 347cb93a386Sopenharmony_ci void findDefaultStyleSet(); 348cb93a386Sopenharmony_ci void addFamily(FontFamily& family, int familyIndex); 349cb93a386Sopenharmony_ci 350cb93a386Sopenharmony_ci SkTypeface_FreeType::Scanner fScanner; 351cb93a386Sopenharmony_ci 352cb93a386Sopenharmony_ci SkTArray<sk_sp<SkFontStyleSet_Preview>> fStyleSets; 353cb93a386Sopenharmony_ci sk_sp<SkFontStyleSet> fDefaultStyleSet; 354cb93a386Sopenharmony_ci 355cb93a386Sopenharmony_ci SkTArray<NameToFamily, true> fNameToFamilyMap; 356cb93a386Sopenharmony_ci SkTArray<NameToFamily, true> fFallbackNameToFamilyMap; 357cb93a386Sopenharmony_ci 358cb93a386Sopenharmony_ci typedef SkFontMgr INHERITED; 359cb93a386Sopenharmony_ci}; 360cb93a386Sopenharmony_ci 361cb93a386Sopenharmony_ci#endif // SkFontMgr_preview_DEFINED