49e9b779a5b44ed81bf60e350415f3c8b5029cf5
[platform/upstream/libSkiaSharp.git] / src / fonts / SkTestScalerContext.h
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*, const SkFontStyle& 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     SkScalerContext* onCreateScalerContext(const SkDescriptor* desc) const SK_OVERRIDE;
70     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     SkStreamAsset* onOpenStream(int* ttcIndex) const SK_OVERRIDE {
77         SkASSERT(0);  // don't expect to get here
78         return NULL;
79     }
80
81     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     int onCountGlyphs() const SK_OVERRIDE {
87         return (int) fTestFont->fCharCodesCount;
88     }
89
90     int onGetUPEM() const SK_OVERRIDE {
91         SkASSERT(0);  // don't expect to get here
92         return 1;
93     }
94
95     void onGetFamilyName(SkString* familyName) const SK_OVERRIDE;
96     SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const SK_OVERRIDE;
97
98     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