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; 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* , SkTypeface::Style style); 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 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor* desc) const SK_OVERRIDE; 70 virtual void onFilterRec(SkScalerContextRec* rec) const SK_OVERRIDE; 71 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( 72 SkAdvancedTypefaceMetrics::PerGlyphInfo , 73 const uint32_t* glyphIDs, 74 uint32_t glyphIDsCount) const SK_OVERRIDE; 75 76 virtual SkStream* onOpenStream(int* ttcIndex) const SK_OVERRIDE { 77 SkASSERT(0); // don't expect to get here 78 return NULL; 79 } 80 81 virtual void onGetFontDescriptor(SkFontDescriptor* desc, bool* isLocal) const SK_OVERRIDE; 82 83 virtual int onCharsToGlyphs(const void* chars, Encoding encoding, 84 uint16_t glyphs[], int glyphCount) const SK_OVERRIDE; 85 86 virtual int onCountGlyphs() const SK_OVERRIDE { 87 return (int) fTestFont->fCharCodesCount; 88 } 89 90 virtual int onGetUPEM() const SK_OVERRIDE { 91 SkASSERT(0); // don't expect to get here 92 return 1; 93 } 94 95 virtual void onGetFamilyName(SkString* familyName) const SK_OVERRIDE; 96 virtual SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const SK_OVERRIDE; 97 98 virtual int onGetTableTags(SkFontTableTag tags[]) const SK_OVERRIDE { 99 return 0; 100 } 101 102 virtual size_t onGetTableData(SkFontTableTag tag, size_t offset, 103 size_t length, void* data) const SK_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