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