123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- /*
- * Copyright 2006 The Android Open Source Project
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
- #ifndef SkFontMgr_custom_DEFINED
- #define SkFontMgr_custom_DEFINED
- #include "include/core/SkFontMgr.h"
- #include "include/core/SkFontStyle.h"
- #include "include/core/SkRefCnt.h"
- #include "include/core/SkString.h"
- #include "include/core/SkTypes.h"
- #include "include/private/SkTArray.h"
- #include "src/ports/SkFontHost_FreeType_common.h"
- class SkData;
- class SkFontDescriptor;
- class SkStreamAsset;
- class SkTypeface;
- /** The base SkTypeface implementation for the custom font manager. */
- class SkTypeface_Custom : public SkTypeface_FreeType {
- public:
- SkTypeface_Custom(const SkFontStyle& style, bool isFixedPitch,
- bool sysFont, const SkString familyName, int index);
- bool isSysFont() const;
- protected:
- void onGetFamilyName(SkString* familyName) const override;
- void onGetFontDescriptor(SkFontDescriptor* desc, bool* isLocal) const override;
- int getIndex() const;
- private:
- const bool fIsSysFont;
- const SkString fFamilyName;
- const int fIndex;
- typedef SkTypeface_FreeType INHERITED;
- };
- /** The empty SkTypeface implementation for the custom font manager.
- * Used as the last resort fallback typeface.
- */
- class SkTypeface_Empty : public SkTypeface_Custom {
- public:
- SkTypeface_Empty() ;
- protected:
- std::unique_ptr<SkStreamAsset> onOpenStream(int*) const override;
- sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override;
- private:
- typedef SkTypeface_Custom INHERITED;
- };
- /** The stream SkTypeface implementation for the custom font manager. */
- class SkTypeface_Stream : public SkTypeface_Custom {
- public:
- SkTypeface_Stream(std::unique_ptr<SkFontData> fontData,
- const SkFontStyle& style, bool isFixedPitch, bool sysFont,
- const SkString familyName);
- protected:
- std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override;
- std::unique_ptr<SkFontData> onMakeFontData() const override;
- sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override;
- private:
- const std::unique_ptr<const SkFontData> fData;
- typedef SkTypeface_Custom INHERITED;
- };
- /** The file SkTypeface implementation for the custom font manager. */
- class SkTypeface_File : public SkTypeface_Custom {
- public:
- SkTypeface_File(const SkFontStyle& style, bool isFixedPitch, bool sysFont,
- const SkString familyName, const char path[], int index);
- protected:
- std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override;
- sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override;
- private:
- SkString fPath;
- typedef SkTypeface_Custom INHERITED;
- };
- ///////////////////////////////////////////////////////////////////////////////
- /**
- * SkFontStyleSet_Custom
- *
- * This class is used by SkFontMgr_Custom to hold SkTypeface_Custom families.
- */
- class SkFontStyleSet_Custom : public SkFontStyleSet {
- public:
- explicit SkFontStyleSet_Custom(const SkString familyName);
- /** Should only be called during the inital build phase. */
- void appendTypeface(sk_sp<SkTypeface_Custom> typeface);
- int count() override;
- void getStyle(int index, SkFontStyle* style, SkString* name) override;
- SkTypeface* createTypeface(int index) override;
- SkTypeface* matchStyle(const SkFontStyle& pattern) override;
- SkString getFamilyName();
- private:
- SkTArray<sk_sp<SkTypeface_Custom>> fStyles;
- SkString fFamilyName;
- friend class SkFontMgr_Custom;
- };
- /**
- * SkFontMgr_Custom
- *
- * This class is essentially a collection of SkFontStyleSet_Custom,
- * one SkFontStyleSet_Custom for each family. This class may be modified
- * to load fonts from any source by changing the initialization.
- */
- class SkFontMgr_Custom : public SkFontMgr {
- public:
- typedef SkTArray<sk_sp<SkFontStyleSet_Custom>> Families;
- class SystemFontLoader {
- public:
- virtual ~SystemFontLoader() { }
- virtual void loadSystemFonts(const SkTypeface_FreeType::Scanner&, Families*) const = 0;
- };
- explicit SkFontMgr_Custom(const SystemFontLoader& loader);
- protected:
- int onCountFamilies() const override;
- void onGetFamilyName(int index, SkString* familyName) const override;
- SkFontStyleSet_Custom* onCreateStyleSet(int index) const override;
- SkFontStyleSet_Custom* onMatchFamily(const char familyName[]) const override;
- SkTypeface* onMatchFamilyStyle(const char familyName[],
- const SkFontStyle& fontStyle) const override;
- SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], const SkFontStyle&,
- const char* bcp47[], int bcp47Count,
- SkUnichar character) const override;
- SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember,
- const SkFontStyle& fontStyle) const override;
- sk_sp<SkTypeface> onMakeFromData(sk_sp<SkData> data, int ttcIndex) const override;
- sk_sp<SkTypeface> onMakeFromStreamIndex(std::unique_ptr<SkStreamAsset>, int ttcIndex) const override;
- sk_sp<SkTypeface> onMakeFromStreamArgs(std::unique_ptr<SkStreamAsset>, const SkFontArguments&) const override;
- sk_sp<SkTypeface> onMakeFromFontData(std::unique_ptr<SkFontData> data) const override;
- sk_sp<SkTypeface> onMakeFromFile(const char path[], int ttcIndex) const override;
- sk_sp<SkTypeface> onLegacyMakeTypeface(const char familyName[], SkFontStyle style) const override;
- private:
- Families fFamilies;
- SkFontStyleSet_Custom* fDefaultFamily;
- SkTypeface_FreeType::Scanner fScanner;
- };
- #endif
|