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 TestSVGTypeface_DEFINED 9 #define TestSVGTypeface_DEFINED 10 11 #include "include/core/SkFontArguments.h" 12 #include "include/core/SkFontMetrics.h" 13 #include "include/core/SkPaint.h" 14 #include "include/core/SkPoint.h" 15 #include "include/core/SkRect.h" 16 #include "include/core/SkRefCnt.h" 17 #include "include/core/SkScalar.h" 18 #include "include/core/SkSpan.h" 19 #include "include/core/SkStream.h" 20 #include "include/core/SkString.h" 21 #include "include/core/SkTypeface.h" 22 #include "include/core/SkTypes.h" 23 #include "include/pathops/SkPathOps.h" 24 #include "include/private/base/SkMutex.h" 25 #include "include/private/base/SkTArray.h" 26 #include "src/core/SkTHash.h" 27 28 #include <memory> 29 30 class SkCanvas; 31 class SkDescriptor; 32 class SkFontDescriptor; 33 class SkFontStyle; 34 class SkGlyph; 35 class SkPath; 36 class SkScalerContext; 37 class SkSVGDOM; 38 class SkWStream; 39 struct SkAdvancedTypefaceMetrics; 40 struct SkScalerContextEffects; 41 struct SkScalerContextRec; 42 43 #ifdef SK_ENABLE_SVG 44 45 struct SkSVGTestTypefaceGlyphData { 46 const char* fSvgResourcePath; 47 SkPoint fOrigin; // y-down 48 SkScalar fAdvance; 49 SkUnichar fUnicode; // TODO: this limits to 1:1 50 }; 51 52 class TestSVGTypeface : public SkTypeface { 53 public: 54 ~TestSVGTypeface() override; 55 SkVector getAdvance(SkGlyphID) const; 56 void getFontMetrics(SkFontMetrics* metrics) const; 57 58 static sk_sp<TestSVGTypeface> Default(); 59 static sk_sp<TestSVGTypeface> Planets(); 60 void exportTtxCbdt(SkWStream*, SkSpan<unsigned> strikeSizes) const; 61 void exportTtxSbix(SkWStream*, SkSpan<unsigned> strikeSizes) const; 62 void exportTtxColr(SkWStream*) const; 63 virtual bool getPathOp(SkColor, SkPathOp*) const = 0; 64 65 struct GlyfLayerInfo { GlyfLayerInfoGlyfLayerInfo66 GlyfLayerInfo(int layerColorIndex, SkIRect bounds) 67 : fLayerColorIndex(layerColorIndex), fBounds(bounds) {} 68 int fLayerColorIndex; 69 SkIRect fBounds; 70 }; 71 struct GlyfInfo { GlyfInfoGlyfInfo72 GlyfInfo() : fBounds(SkIRect::MakeEmpty()) {} 73 SkIRect fBounds; 74 skia_private::TArray<GlyfLayerInfo> fLayers; 75 }; 76 77 protected: 78 void exportTtxCommon( 79 SkWStream*, const char* type, const skia_private::TArray<GlyfInfo>* = nullptr) const; 80 81 std::unique_ptr<SkScalerContext> onCreateScalerContext(const SkScalerContextEffects&, 82 const SkDescriptor* desc) const override; 83 void onFilterRec(SkScalerContextRec* rec) const override; 84 void getGlyphToUnicodeMap(SkUnichar*) const override; 85 std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics() const override; 86 onMakeClone(const SkFontArguments & args)87 sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override { 88 return sk_ref_sp(this); 89 } 90 91 void onGetFontDescriptor(SkFontDescriptor* desc, bool* isLocal) const override = 0; 92 93 void onCharsToGlyphs(const SkUnichar* chars, int count, SkGlyphID glyphs[]) const override; 94 getPostScriptGlyphNames(SkString *)95 void getPostScriptGlyphNames(SkString*) const override {} 96 onCountGlyphs()97 int onCountGlyphs() const override { return fGlyphCount; } 98 onGetUPEM()99 int onGetUPEM() const override { return fUpem; } 100 101 void onGetFamilyName(SkString* familyName) const override; 102 bool onGetPostScriptName(SkString*) const override; 103 SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override; 104 onGlyphMaskNeedsCurrentColor()105 bool onGlyphMaskNeedsCurrentColor() const override { return false; } 106 onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[],int coordinateCount)107 int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], 108 int coordinateCount) const override { 109 return 0; 110 } 111 onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[],int parameterCount)112 int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[], 113 int parameterCount) const override { 114 return 0; 115 } 116 onGetTableTags(SkFontTableTag tags[])117 int onGetTableTags(SkFontTableTag tags[]) const override { return 0; } 118 onGetTableData(SkFontTableTag tag,size_t offset,size_t length,void * data)119 size_t onGetTableData(SkFontTableTag tag, 120 size_t offset, 121 size_t length, 122 void* data) const override { 123 return 0; 124 } 125 126 private: 127 TestSVGTypeface(const char* name, const SkFontStyle& style, 128 int upem, const SkFontMetrics& metrics, 129 SkSpan<const SkSVGTestTypefaceGlyphData> data); 130 struct Glyph { 131 Glyph(); 132 ~Glyph(); 133 SkPoint fOrigin; 134 SkScalar fAdvance; 135 const char* fResourcePath; 136 137 SkSize size() const; 138 void render(SkCanvas*) const; 139 140 private: 141 // Lazily parses the SVG from fResourcePath, and manages mutex locking. 142 template <typename Fn> void withSVG(Fn&&) const; 143 144 // The mutex guards lazy parsing of the SVG, but also predates that. 145 // Must be SkSVGDOM::render() is not thread safe? 146 // If not, an SkOnce is enough here. 147 mutable SkMutex fSvgMutex; 148 mutable bool fParsedSvg = false; 149 mutable sk_sp<SkSVGDOM> fSvg; 150 }; 151 152 const SkString fName; 153 const int fUpem; 154 const SkFontMetrics fFontMetrics; 155 const std::unique_ptr<Glyph[]> fGlyphs; 156 const int fGlyphCount; 157 skia_private::THashMap<SkUnichar, SkGlyphID> fCMap; 158 friend class SkTestSVGScalerContext; 159 }; 160 161 #endif // SK_ENABLE_SVG 162 163 #endif // TestSVGTypeface_DEFINED 164