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 SkTestScalerContext_DEFINED 9 #define SkTestScalerContext_DEFINED 10 11 #include "SkPaint.h" 12 #include "SkPath.h" 13 #include "SkRefCnt.h" 14 #include "SkTDArray.h" 15 #include "SkTypeface.h" 16 17 class SkTestFont; 18 19 struct SkTestFontData { 20 const SkScalar* fPoints; 21 const unsigned char* fVerbs; 22 const unsigned* fCharCodes; 23 const size_t fCharCodesCount; 24 const SkFixed* fWidths; 25 const SkPaint::FontMetrics& fMetrics; 26 const char* fName; 27 SkTypeface::Style fStyle; 28 SkTestFont* fFontCache; 29 }; 30 31 class SkTestFont : public SkRefCnt { 32 public: 33 34 35 SkTestFont(const SkTestFontData& ); 36 virtual ~SkTestFont(); 37 int codeToIndex(SkUnichar charCode) const; 38 void init(const SkScalar* pts, const unsigned char* verbs); 39 #ifdef SK_DEBUG // detect missing test font data 40 mutable unsigned char fDebugBits[16]; 41 mutable SkUnichar fDebugOverage[8]; 42 const char* fDebugName; 43 SkTypeface::Style fDebugStyle; debugFontName()44 const char* debugFontName() const { return fName; } 45 #endif 46 private: 47 const unsigned* fCharCodes; 48 const size_t fCharCodesCount; 49 const SkFixed* fWidths; 50 const SkPaint::FontMetrics& fMetrics; 51 const char* fName; 52 SkPath** fPaths; 53 friend class SkTestTypeface; 54 typedef SkRefCnt INHERITED; 55 }; 56 57 58 class SkTestTypeface : public SkTypeface { 59 public: 60 SkTestTypeface(SkTestFont*, const SkFontStyle& style); ~SkTestTypeface()61 virtual ~SkTestTypeface() { 62 SkSafeUnref(fTestFont); 63 } 64 void getAdvance(SkGlyph* glyph); 65 void getFontMetrics(SkPaint::FontMetrics* metrics); 66 void getMetrics(SkGlyph* glyph); 67 void getPath(const SkGlyph& glyph, SkPath* path); 68 protected: 69 SkScalerContext* onCreateScalerContext(const SkDescriptor* desc) const override; 70 void onFilterRec(SkScalerContextRec* rec) const override; 71 SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( 72 PerGlyphInfo, 73 const uint32_t* glyphIDs, 74 uint32_t glyphIDsCount) const override; 75 onOpenStream(int * ttcIndex)76 SkStreamAsset* onOpenStream(int* ttcIndex) const override { 77 return nullptr; 78 } 79 80 void onGetFontDescriptor(SkFontDescriptor* desc, bool* isLocal) const override; 81 82 int onCharsToGlyphs(const void* chars, Encoding encoding, 83 uint16_t glyphs[], int glyphCount) const override; 84 onCountGlyphs()85 int onCountGlyphs() const override { 86 return (int) fTestFont->fCharCodesCount; 87 } 88 onGetUPEM()89 int onGetUPEM() const override { 90 SkASSERT(0); // don't expect to get here 91 return 1; 92 } 93 94 void onGetFamilyName(SkString* familyName) const override; 95 SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override; 96 onGetTableTags(SkFontTableTag tags[])97 int onGetTableTags(SkFontTableTag tags[]) const override { 98 return 0; 99 } 100 onGetTableData(SkFontTableTag tag,size_t offset,size_t length,void * data)101 size_t onGetTableData(SkFontTableTag tag, size_t offset, 102 size_t length, void* data) const override { 103 return 0; 104 } 105 private: 106 SkTestFont* fTestFont; 107 friend class SkTestScalerContext; 108 }; 109 110 SkTypeface* CreateTestTypeface(const char* name, SkTypeface::Style style); 111 112 #endif 113