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
17class SkTestFont;
18
19struct 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
31class SkTestFont : public SkRefCnt {
32public:
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
46private:
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
58class SkTestTypeface : public SkTypeface {
59public:
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);
68protected:
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    }
106private:
107    SkTestFont* fTestFont;
108    friend class SkTestScalerContext;
109};
110
111SkTypeface* CreateTestTypeface(const char* name, SkTypeface::Style style);
112
113#endif
114