1 /*
2  * Copyright 2013 Google Inc.
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 SkFontConfigTypeface_DEFINED
9 #define SkFontConfigTypeface_DEFINED
10 
11 #include "include/core/SkRefCnt.h"
12 #include "include/core/SkStream.h"
13 #include "include/ports/SkFontConfigInterface.h"
14 #include "src/core/SkFontDescriptor.h"
15 #include "src/ports/SkFontHost_FreeType_common.h"
16 
17 class SkFontDescriptor;
18 
19 class SkTypeface_FCI : public SkTypeface_FreeType {
20     sk_sp<SkFontConfigInterface> fFCI;
21     SkFontConfigInterface::FontIdentity fIdentity;
22     SkString fFamilyName;
23     std::unique_ptr<SkFontData> fFontData;
24 
25 public:
Create(sk_sp<SkFontConfigInterface> fci,const SkFontConfigInterface::FontIdentity & fi,SkString familyName,const SkFontStyle & style)26     static SkTypeface_FCI* Create(sk_sp<SkFontConfigInterface> fci,
27                                   const SkFontConfigInterface::FontIdentity& fi,
28                                   SkString familyName,
29                                   const SkFontStyle& style)
30     {
31         return new SkTypeface_FCI(std::move(fci), fi, std::move(familyName), style);
32     }
33 
Create(std::unique_ptr<SkFontData> data,SkString familyName,SkFontStyle style,bool isFixedPitch)34     static SkTypeface_FCI* Create(std::unique_ptr<SkFontData> data,
35                                   SkString familyName, SkFontStyle style, bool isFixedPitch)
36     {
37         return new SkTypeface_FCI(std::move(data), std::move(familyName), style, isFixedPitch);
38     }
39 
getIdentity()40     const SkFontConfigInterface::FontIdentity& getIdentity() const {
41         return fIdentity;
42     }
43 
onMakeClone(const SkFontArguments & args)44     sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override {
45         std::unique_ptr<SkFontData> data = this->cloneFontData(args);
46         if (!data) {
47             return nullptr;
48         }
49         return sk_sp<SkTypeface>(new SkTypeface_FCI(std::move(data),
50                                                     fFamilyName,
51                                                     this->fontStyle(),
52                                                     this->isFixedPitch()));
53     }
54 
55 protected:
SkTypeface_FCI(sk_sp<SkFontConfigInterface> fci,const SkFontConfigInterface::FontIdentity & fi,SkString familyName,const SkFontStyle & style)56     SkTypeface_FCI(sk_sp<SkFontConfigInterface> fci,
57                    const SkFontConfigInterface::FontIdentity& fi,
58                    SkString familyName,
59                    const SkFontStyle& style)
60             : INHERITED(style, false)
61             , fFCI(std::move(fci))
62             , fIdentity(fi)
63             , fFamilyName(std::move(familyName))
64             , fFontData(nullptr) {}
65 
SkTypeface_FCI(std::unique_ptr<SkFontData> data,SkString familyName,SkFontStyle style,bool isFixedPitch)66     SkTypeface_FCI(std::unique_ptr<SkFontData> data,
67                    SkString familyName, SkFontStyle style, bool isFixedPitch)
68             : INHERITED(style, isFixedPitch)
69             , fFamilyName(std::move(familyName))
70             , fFontData(std::move(data))
71     {
72         SkASSERT(fFontData);
73         fIdentity.fTTCIndex = fFontData->getIndex();
74     }
75 
onGetFamilyName(SkString * familyName)76     void onGetFamilyName(SkString* familyName) const override { *familyName = fFamilyName; }
77     void onGetFontDescriptor(SkFontDescriptor*, bool*) const override;
78     std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override;
79     std::unique_ptr<SkFontData> onMakeFontData() const override;
80 
81 private:
82     typedef SkTypeface_FreeType INHERITED;
83 };
84 
85 #endif  // SkFontConfigTypeface_DEFINED
86