1 /*
2  * Copyright 2014 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 TestTypeface_DEFINED
9 #define TestTypeface_DEFINED
10 
11 #include "include/core/SkFontArguments.h"
12 #include "include/core/SkFontMetrics.h"
13 #include "include/core/SkFontStyle.h"
14 #include "include/core/SkPaint.h"
15 #include "include/core/SkRefCnt.h"
16 #include "include/core/SkScalar.h"
17 #include "include/core/SkStream.h"
18 #include "include/core/SkTypeface.h"
19 #include "include/core/SkTypes.h"
20 #include "include/private/SkFixed.h"
21 
22 #include <memory>
23 
24 class SkDescriptor;
25 class SkFontDescriptor;
26 class SkGlyph;
27 class SkPath;
28 class SkScalerContext;
29 class SkStreamAsset;
30 class SkString;
31 class SkTestFont;
32 struct SkAdvancedTypefaceMetrics;
33 struct SkScalerContextEffects;
34 struct SkScalerContextRec;
35 
36 struct SkTestFontData {
37     const SkScalar*      fPoints;
38     const unsigned char* fVerbs;
39     const SkUnichar*     fCharCodes;
40     const size_t         fCharCodesCount;
41     const SkFixed*       fWidths;
42     const SkFontMetrics& fMetrics;
43     const char*          fName;
44     SkFontStyle          fStyle;
45 };
46 
47 class SkTestFont : public SkRefCnt {
48 public:
49     SkTestFont(const SkTestFontData&);
50     ~SkTestFont() override;
51     SkGlyphID glyphForUnichar(SkUnichar charCode) const;
52     void      init(const SkScalar* pts, const unsigned char* verbs);
53 
54 private:
55     const SkUnichar*     fCharCodes;
56     const size_t         fCharCodesCount;
57     const SkFixed*       fWidths;
58     const SkFontMetrics& fMetrics;
59     const char*          fName;
60     SkPath*              fPaths;
61     friend class TestTypeface;
62     using INHERITED = SkRefCnt;
63 };
64 
65 class TestTypeface : public SkTypeface {
66 public:
67     TestTypeface(sk_sp<SkTestFont>, const SkFontStyle& style);
68     void getAdvance(SkGlyph* glyph);
69     void getFontMetrics(SkFontMetrics* metrics);
70     SkPath getPath(SkGlyphID glyph);
71 
72 protected:
73     std::unique_ptr<SkScalerContext> onCreateScalerContext(const SkScalerContextEffects&,
74                                                            const SkDescriptor* desc) const override;
75     void onFilterRec(SkScalerContextRec* rec) const override;
76     void getGlyphToUnicodeMap(SkUnichar* glyphToUnicode) const override;
77     std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics() const override;
78 
onOpenStream(int * ttcIndex)79     std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override { return nullptr; }
80 
onMakeClone(const SkFontArguments & args)81     sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override {
82         return sk_ref_sp(this);
83     }
84 
85     void onGetFontDescriptor(SkFontDescriptor* desc, bool* isLocal) const override;
86 
87     void onCharsToGlyphs(const SkUnichar* chars, int count, SkGlyphID glyphs[]) const override;
88 
onCountGlyphs()89     int onCountGlyphs() const override { return (int)fTestFont->fCharCodesCount; }
90 
getPostScriptGlyphNames(SkString *)91     void getPostScriptGlyphNames(SkString*) const override {}
92 
onGetUPEM()93     int onGetUPEM() const override { return 2048; }
94 
95     void onGetFamilyName(SkString* familyName) const override;
96     bool onGetPostScriptName(SkString*) const override;
97     SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override;
98 
onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[],int coordinateCount)99     int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[],
100                                      int coordinateCount) const override {
101         return 0;
102     }
103 
onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[],int parameterCount)104     int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[],
105                                        int parameterCount) const override {
106         return 0;
107     }
108 
onGetTableTags(SkFontTableTag tags[])109     int onGetTableTags(SkFontTableTag tags[]) const override { return 0; }
110 
onGetTableData(SkFontTableTag tag,size_t offset,size_t length,void * data)111     size_t onGetTableData(SkFontTableTag tag,
112                           size_t         offset,
113                           size_t         length,
114                           void*          data) const override {
115         return 0;
116     }
117 
118 private:
119     sk_sp<SkTestFont> fTestFont;
120     friend class SkTestScalerContext;
121 };
122 
123 #endif
124