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/base/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 struct List { 68 struct Family { 69 struct Face { 70 sk_sp<SkTypeface> typeface; 71 const char* name; 72 bool isDefault; 73 }; 74 std::vector<Face> faces; 75 const char* name; 76 }; 77 std::vector<Family> families; 78 }; 79 static const List& Typefaces(); 80 81 SkVector getAdvance(SkGlyphID) const; 82 void getFontMetrics(SkFontMetrics* metrics); 83 SkPath getPath(SkGlyphID glyph); 84 85 struct Register { Register(); }; 86 protected: 87 std::unique_ptr<SkScalerContext> onCreateScalerContext(const SkScalerContextEffects&, 88 const SkDescriptor* desc) const override; 89 void onFilterRec(SkScalerContextRec* rec) const override; 90 void getGlyphToUnicodeMap(SkUnichar* glyphToUnicode) const override; 91 std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics() const override; 92 93 std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override; 94 onMakeClone(const SkFontArguments & args)95 sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override { 96 return sk_ref_sp(this); 97 } 98 99 void onGetFontDescriptor(SkFontDescriptor* desc, bool* serialize) const override; 100 101 void onCharsToGlyphs(const SkUnichar* chars, int count, SkGlyphID glyphs[]) const override; 102 onCountGlyphs()103 int onCountGlyphs() const override { return (int)fTestFont->fCharCodesCount; } 104 getPostScriptGlyphNames(SkString *)105 void getPostScriptGlyphNames(SkString*) const override {} 106 onGetUPEM()107 int onGetUPEM() const override { return 2048; } 108 109 void onGetFamilyName(SkString* familyName) const override; 110 bool onGetPostScriptName(SkString*) const override; 111 SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override; 112 onGlyphMaskNeedsCurrentColor()113 bool onGlyphMaskNeedsCurrentColor() const override { return false; } 114 onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[],int coordinateCount)115 int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], 116 int coordinateCount) const override { 117 return 0; 118 } 119 onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[],int parameterCount)120 int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[], 121 int parameterCount) const override { 122 return 0; 123 } 124 onGetTableTags(SkFontTableTag tags[])125 int onGetTableTags(SkFontTableTag tags[]) const override { return 0; } 126 onGetTableData(SkFontTableTag tag,size_t offset,size_t length,void * data)127 size_t onGetTableData(SkFontTableTag tag, 128 size_t offset, 129 size_t length, 130 void* data) const override { 131 return 0; 132 } 133 134 private: 135 static constexpr SkTypeface::FactoryId FactoryId = SkSetFourByteTag('t','e','s','t'); 136 static sk_sp<SkTypeface> MakeFromStream(std::unique_ptr<SkStreamAsset>, const SkFontArguments&); 137 TestTypeface(sk_sp<SkTestFont>, const SkFontStyle& style); 138 sk_sp<SkTestFont> fTestFont; 139 friend class SkTestScalerContext; 140 }; 141 142 #endif 143