1 /* 2 * Copyright 2018 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 SkRemoteTypeface_DEFINED 9 #define SkRemoteTypeface_DEFINED 10 11 #include "SkAdvancedTypefaceMetrics.h" 12 #include "SkDescriptor.h" 13 #include "SkFontDescriptor.h" 14 #include "SkFontStyle.h" 15 #include "SkScalerContext.h" 16 #include "SkTypeface.h" 17 18 #include <thread> 19 20 class SkTypefaceProxy; 21 22 class SkRemoteScalerContext { 23 public: ~SkRemoteScalerContext()24 virtual ~SkRemoteScalerContext() {} 25 // TODO: do metrics need effects? 26 virtual void generateFontMetrics( 27 const SkTypefaceProxy& tf, 28 const SkScalerContextRec& rec, 29 SkPaint::FontMetrics*) = 0; 30 virtual void generateMetrics( 31 const SkTypefaceProxy& tf, 32 const SkScalerContextRec& rec, 33 SkGlyph* glyph) = 0; 34 virtual void generateImage( 35 const SkTypefaceProxy& tf, 36 const SkScalerContextRec& rec, 37 const SkGlyph& glyph) = 0; 38 virtual void generateMetricsAndImage( 39 const SkTypefaceProxy& tf, 40 const SkScalerContextRec& rec, 41 SkArenaAlloc* alloc, 42 SkGlyph* glyph) = 0; 43 virtual void generatePath( 44 const SkTypefaceProxy& tf, 45 const SkScalerContextRec& rec, 46 SkGlyphID glyph, SkPath* path) = 0; 47 }; 48 49 class SkScalerContextProxy : public SkScalerContext { 50 public: 51 SkScalerContextProxy( 52 sk_sp<SkTypeface> tf, 53 const SkScalerContextEffects& effects, 54 const SkDescriptor* desc, 55 SkRemoteScalerContext* rsc); 56 57 protected: generateGlyphCount(void)58 unsigned generateGlyphCount(void) override { SK_ABORT("Should never be called."); return 0;} generateCharToGlyph(SkUnichar uni)59 uint16_t generateCharToGlyph(SkUnichar uni) override { 60 SK_ABORT("Should never be called."); 61 return 0; 62 } generateAdvance(SkGlyph * glyph)63 void generateAdvance(SkGlyph* glyph) override { this->generateMetrics(glyph); } 64 void generateMetrics(SkGlyph* glyph) override; 65 void generateImage(const SkGlyph& glyph) override; 66 void generatePath(SkGlyphID glyphID, SkPath* path) override; 67 void generateFontMetrics(SkPaint::FontMetrics* metrics) override; 68 69 private: 70 // Copied from SkGlyphCache 71 // so we don't grow our arrays a lot 72 static constexpr size_t kMinGlyphCount = 8; 73 static constexpr size_t kMinGlyphImageSize = 16 /* height */ * 8 /* width */; 74 static constexpr size_t kMinAllocAmount = kMinGlyphImageSize * kMinGlyphCount; 75 SkArenaAlloc fAlloc{kMinAllocAmount}; 76 77 SkTypefaceProxy* typefaceProxy(); 78 SkRemoteScalerContext* const fRemote; 79 typedef SkScalerContext INHERITED; 80 }; 81 82 class SkTypefaceProxy : public SkTypeface { 83 public: SkTypefaceProxy(SkFontID fontId,const SkFontStyle & style,bool isFixed,SkRemoteScalerContext * rsc)84 SkTypefaceProxy( 85 SkFontID fontId, 86 const SkFontStyle& style, 87 bool isFixed, 88 SkRemoteScalerContext* rsc) 89 : INHERITED{style, false} 90 , fFontId{fontId} 91 , fRsc{rsc} { } fontID()92 SkFontID fontID() const {return fFontId;} 93 94 protected: onGetUPEM()95 int onGetUPEM() const override { SK_ABORT("Should never be called."); return 0; } onOpenStream(int * ttcIndex)96 SkStreamAsset* onOpenStream(int* ttcIndex) const override { 97 SK_ABORT("Should never be called."); 98 return nullptr; 99 } onMakeFontData()100 std::unique_ptr<SkFontData> onMakeFontData() const override { 101 SK_ABORT("Should never be called."); 102 return nullptr; 103 } onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[],int coordinateCount)104 int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], 105 int coordinateCount) const override { 106 SK_ABORT("Should never be called."); 107 return 0; 108 } onGetFamilyName(SkString * familyName)109 void onGetFamilyName(SkString* familyName) const override { 110 SK_ABORT("Should never be called."); 111 } onCreateFamilyNameIterator()112 SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override { 113 SK_ABORT("Should never be called."); 114 return nullptr; 115 } onGetTableTags(SkFontTableTag tags[])116 int onGetTableTags(SkFontTableTag tags[]) const override { 117 SK_ABORT("Should never be called."); 118 return 0; 119 } onGetTableData(SkFontTableTag,size_t offset,size_t length,void * data)120 size_t onGetTableData(SkFontTableTag, size_t offset, size_t length, void* data) const override { 121 SK_ABORT("Should never be called."); 122 return 0; 123 } onCreateScalerContext(const SkScalerContextEffects & effects,const SkDescriptor * desc)124 SkScalerContext* onCreateScalerContext(const SkScalerContextEffects& effects, 125 const SkDescriptor* desc) const override { 126 //std::cout << fFontId << fThreadId; 127 128 return new SkScalerContextProxy(sk_ref_sp(const_cast<SkTypefaceProxy*>(this)), effects, 129 desc, fRsc); 130 131 } onFilterRec(SkScalerContextRec * rec)132 void onFilterRec(SkScalerContextRec* rec) const override { 133 // Add all the device information here. 134 //rec->fPost2x2[0][0] = 0.5f; 135 136 // This would be the best place to run the host SkTypeface_* onFilterRec. 137 // Can we move onFilterRec to the FongMgr, that way we don't need to cross the boundary to 138 // filter. 139 } onGetFontDescriptor(SkFontDescriptor *,bool *)140 void onGetFontDescriptor(SkFontDescriptor*, bool*) const override { 141 SK_ABORT("Should never be called."); 142 } onGetAdvancedMetrics()143 std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics() const override { 144 SK_ABORT("Should never be called."); 145 return nullptr; 146 } onCharsToGlyphs(const void * chars,Encoding,uint16_t glyphs[],int glyphCount)147 int onCharsToGlyphs(const void* chars, Encoding, 148 uint16_t glyphs[], int glyphCount) const override { 149 SK_ABORT("Should never be called."); 150 return 0; 151 } onCountGlyphs()152 int onCountGlyphs() const override { 153 SK_ABORT("Should never be called."); 154 return 0; 155 } 156 onGetCTFontRef()157 void* onGetCTFontRef() const override { 158 SK_ABORT("Should never be called."); 159 return nullptr; 160 } 161 162 private: 163 const SkFontID fFontId; 164 // const std::thread::id fThreadId; // TODO: figure out a good solutions for this. 165 SkRemoteScalerContext* const fRsc; 166 167 typedef SkTypeface INHERITED; 168 }; 169 170 #endif // SkRemoteTypeface_DEFINED 171