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     virtual ~SkTestFont();
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     typedef SkRefCnt INHERITED;
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     void getPath(SkGlyphID glyph, SkPath* path);
71 
72 protected:
73     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     SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override;
97 
onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[],int coordinateCount)98     int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[],
99                                      int coordinateCount) const override {
100         return 0;
101     }
102 
onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[],int parameterCount)103     int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[],
104                                        int parameterCount) const override {
105         return 0;
106     }
107 
onGetTableTags(SkFontTableTag tags[])108     int onGetTableTags(SkFontTableTag tags[]) const override { return 0; }
109 
onGetTableData(SkFontTableTag tag,size_t offset,size_t length,void * data)110     size_t onGetTableData(SkFontTableTag tag,
111                           size_t         offset,
112                           size_t         length,
113                           void*          data) const override {
114         return 0;
115     }
116 
117 private:
118     sk_sp<SkTestFont> fTestFont;
119     friend class SkTestScalerContext;
120 };
121 
122 #endif
123