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 SK_DECLARE_INST_COUNT(SkTestFont) 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 SkASSERT(0); // don't expect to get here 78 return NULL; 79 } 80 81 void onGetFontDescriptor(SkFontDescriptor* desc, bool* isLocal) const override; 82 83 int onCharsToGlyphs(const void* chars, Encoding encoding, 84 uint16_t glyphs[], int glyphCount) const override; 85 onCountGlyphs()86 int onCountGlyphs() const override { 87 return (int) fTestFont->fCharCodesCount; 88 } 89 onGetUPEM()90 int onGetUPEM() const override { 91 SkASSERT(0); // don't expect to get here 92 return 1; 93 } 94 95 void onGetFamilyName(SkString* familyName) const override; 96 SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override; 97 onGetTableTags(SkFontTableTag tags[])98 int onGetTableTags(SkFontTableTag tags[]) const override { 99 return 0; 100 } 101 onGetTableData(SkFontTableTag tag,size_t offset,size_t length,void * data)102 size_t onGetTableData(SkFontTableTag tag, size_t offset, 103 size_t length, void* data) const override { 104 return 0; 105 } 106 private: 107 SkTestFont* fTestFont; 108 friend class SkTestScalerContext; 109 }; 110 111 SkTypeface* CreateTestTypeface(const char* name, SkTypeface::Style style); 112 113 #endif 114