Home | History | Annotate | Download | only in ports
      1 /*
      2  * Copyright 2006 The Android Open Source Project
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef SkFontMgr_custom_DEFINED
      9 #define SkFontMgr_custom_DEFINED
     10 
     11 #include "SkFontHost_FreeType_common.h"
     12 #include "SkFontMgr.h"
     13 #include "SkFontStyle.h"
     14 #include "SkRefCnt.h"
     15 #include "SkString.h"
     16 #include "SkTArray.h"
     17 #include "SkTypes.h"
     18 
     19 class SkData;
     20 class SkFontDescriptor;
     21 class SkStreamAsset;
     22 class SkTypeface;
     23 
     24 /** The base SkTypeface implementation for the custom font manager. */
     25 class SkTypeface_Custom : public SkTypeface_FreeType {
     26 public:
     27     SkTypeface_Custom(const SkFontStyle& style, bool isFixedPitch,
     28                       bool sysFont, const SkString familyName, int index);
     29     bool isSysFont() const;
     30 
     31 protected:
     32     void onGetFamilyName(SkString* familyName) const override;
     33     void onGetFontDescriptor(SkFontDescriptor* desc, bool* isLocal) const override;
     34     int getIndex() const;
     35 
     36 private:
     37     const bool fIsSysFont;
     38     const SkString fFamilyName;
     39     const int fIndex;
     40 
     41     typedef SkTypeface_FreeType INHERITED;
     42 };
     43 
     44 /** The empty SkTypeface implementation for the custom font manager.
     45  *  Used as the last resort fallback typeface.
     46  */
     47 class SkTypeface_Empty : public SkTypeface_Custom {
     48 public:
     49     SkTypeface_Empty() ;
     50 
     51 protected:
     52     SkStreamAsset* onOpenStream(int*) const override;
     53 
     54 private:
     55     typedef SkTypeface_Custom INHERITED;
     56 };
     57 
     58 /** The stream SkTypeface implementation for the custom font manager. */
     59 class SkTypeface_Stream : public SkTypeface_Custom {
     60 public:
     61     SkTypeface_Stream(std::unique_ptr<SkFontData> fontData,
     62                       const SkFontStyle& style, bool isFixedPitch, bool sysFont,
     63                       const SkString familyName);
     64 
     65 protected:
     66     SkStreamAsset* onOpenStream(int* ttcIndex) const override;
     67     std::unique_ptr<SkFontData> onMakeFontData() const override;
     68 
     69 private:
     70     const std::unique_ptr<const SkFontData> fData;
     71 
     72     typedef SkTypeface_Custom INHERITED;
     73 };
     74 
     75 /** The file SkTypeface implementation for the custom font manager. */
     76 class SkTypeface_File : public SkTypeface_Custom {
     77 public:
     78     SkTypeface_File(const SkFontStyle& style, bool isFixedPitch, bool sysFont,
     79                     const SkString familyName, const char path[], int index);
     80 
     81 protected:
     82     SkStreamAsset* onOpenStream(int* ttcIndex) const override;
     83 
     84 private:
     85     SkString fPath;
     86 
     87     typedef SkTypeface_Custom INHERITED;
     88 };
     89 
     90 ///////////////////////////////////////////////////////////////////////////////
     91 
     92 /**
     93  *  SkFontStyleSet_Custom
     94  *
     95  *  This class is used by SkFontMgr_Custom to hold SkTypeface_Custom families.
     96  */
     97 class SkFontStyleSet_Custom : public SkFontStyleSet {
     98 public:
     99     explicit SkFontStyleSet_Custom(const SkString familyName);
    100 
    101     /** Should only be called during the inital build phase. */
    102     void appendTypeface(sk_sp<SkTypeface_Custom> typeface);
    103     int count() override;
    104     void getStyle(int index, SkFontStyle* style, SkString* name) override;
    105     SkTypeface* createTypeface(int index) override;
    106     SkTypeface* matchStyle(const SkFontStyle& pattern) override;
    107     SkString getFamilyName();
    108 
    109 private:
    110     SkTArray<sk_sp<SkTypeface_Custom>> fStyles;
    111     SkString fFamilyName;
    112 
    113     friend class SkFontMgr_Custom;
    114 };
    115 
    116 /**
    117  *  SkFontMgr_Custom
    118  *
    119  *  This class is essentially a collection of SkFontStyleSet_Custom,
    120  *  one SkFontStyleSet_Custom for each family. This class may be modified
    121  *  to load fonts from any source by changing the initialization.
    122  */
    123 class SkFontMgr_Custom : public SkFontMgr {
    124 public:
    125     typedef SkTArray<sk_sp<SkFontStyleSet_Custom>> Families;
    126     class SystemFontLoader {
    127     public:
    128         virtual ~SystemFontLoader() { }
    129         virtual void loadSystemFonts(const SkTypeface_FreeType::Scanner&, Families*) const = 0;
    130     };
    131     explicit SkFontMgr_Custom(const SystemFontLoader& loader);
    132 
    133 protected:
    134     int onCountFamilies() const override;
    135     void onGetFamilyName(int index, SkString* familyName) const override;
    136     SkFontStyleSet_Custom* onCreateStyleSet(int index) const override;
    137     SkFontStyleSet_Custom* onMatchFamily(const char familyName[]) const override;
    138     SkTypeface* onMatchFamilyStyle(const char familyName[],
    139                                    const SkFontStyle& fontStyle) const override;
    140     SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], const SkFontStyle&,
    141                                             const char* bcp47[], int bcp47Count,
    142                                             SkUnichar character) const override;
    143     SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember,
    144                                  const SkFontStyle& fontStyle) const override;
    145     SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const override;
    146     SkTypeface* onCreateFromStream(SkStreamAsset* bareStream, int ttcIndex) const override;
    147     SkTypeface* onCreateFromStream(SkStreamAsset* s, const SkFontArguments& args) const override;
    148     SkTypeface* onCreateFromFontData(std::unique_ptr<SkFontData> data) const override;
    149     SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override;
    150     SkTypeface* onLegacyCreateTypeface(const char familyName[], SkFontStyle style) const override;
    151 
    152 private:
    153     Families fFamilies;
    154     SkFontStyleSet_Custom* fDefaultFamily;
    155     SkTypeface_FreeType::Scanner fScanner;
    156 };
    157 
    158 #endif
    159