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