Home | History | Annotate | Download | only in fonts
      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 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 
     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 
     86     int onCountGlyphs() const override {
     87         return (int) fTestFont->fCharCodesCount;
     88     }
     89 
     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 
     98     int onGetTableTags(SkFontTableTag tags[]) const override {
     99         return 0;
    100     }
    101 
    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