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 "SkFixed.h"
     12 #include "SkPaint.h"
     13 #include "SkPath.h"
     14 #include "SkRefCnt.h"
     15 #include "SkTDArray.h"
     16 #include "SkTypeface.h"
     17 
     18 class SkTestFont;
     19 
     20 struct SkTestFontData {
     21     const SkScalar* fPoints;
     22     const unsigned char* fVerbs;
     23     const unsigned* fCharCodes;
     24     const size_t fCharCodesCount;
     25     const SkFixed* fWidths;
     26     const SkPaint::FontMetrics& fMetrics;
     27     const char* fName;
     28     SkTypeface::Style fStyle;
     29     sk_sp<SkTestFont> fCachedFont;
     30 };
     31 
     32 class SkTestFont : public SkRefCnt {
     33 public:
     34     SkTestFont(const SkTestFontData& );
     35     virtual ~SkTestFont();
     36     int codeToIndex(SkUnichar charCode) const;
     37     void init(const SkScalar* pts, const unsigned char* verbs);
     38 #ifdef SK_DEBUG  // detect missing test font data
     39     mutable unsigned char fDebugBits[16];
     40     mutable SkUnichar fDebugOverage[8];
     41     const char* fDebugName;
     42     SkFontStyle fDebugStyle;
     43     const char* debugFontName() const { return fName; }
     44 #endif
     45 private:
     46     const unsigned* fCharCodes;
     47     const size_t fCharCodesCount;
     48     const SkFixed* fWidths;
     49     const SkPaint::FontMetrics& fMetrics;
     50     const char* fName;
     51     SkPath** fPaths;
     52     friend class SkTestTypeface;
     53     typedef SkRefCnt INHERITED;
     54 };
     55 
     56 
     57 class SkTestTypeface : public SkTypeface {
     58 public:
     59     SkTestTypeface(sk_sp<SkTestFont>, const SkFontStyle& style);
     60     void getAdvance(SkGlyph* glyph);
     61     void getFontMetrics(SkPaint::FontMetrics* metrics);
     62     void getMetrics(SkGlyph* glyph);
     63     void getPath(SkGlyphID glyph, SkPath* path);
     64 protected:
     65     SkScalerContext* onCreateScalerContext(const SkScalerContextEffects&,
     66                                            const SkDescriptor* desc) const override;
     67     void onFilterRec(SkScalerContextRec* rec) const override;
     68     std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics() const override;
     69 
     70     SkStreamAsset* onOpenStream(int* ttcIndex) const override {
     71         return nullptr;
     72     }
     73 
     74     void onGetFontDescriptor(SkFontDescriptor* desc, bool* isLocal) const override;
     75 
     76     int onCharsToGlyphs(const void* chars, Encoding encoding,
     77                         uint16_t glyphs[], int glyphCount) const override;
     78 
     79     int onCountGlyphs() const override {
     80         return (int) fTestFont->fCharCodesCount;
     81     }
     82 
     83     int onGetUPEM() const override {
     84         return 2048;
     85     }
     86 
     87     void onGetFamilyName(SkString* familyName) const override;
     88     SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override;
     89 
     90     int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[],
     91                                      int coordinateCount) const override
     92     {
     93         return 0;
     94     }
     95 
     96     int onGetTableTags(SkFontTableTag tags[]) const override {
     97         return 0;
     98     }
     99 
    100     size_t onGetTableData(SkFontTableTag tag, size_t offset,
    101                           size_t length, void* data) const override {
    102         return 0;
    103     }
    104 private:
    105     sk_sp<SkTestFont> fTestFont;
    106     friend class SkTestScalerContext;
    107 };
    108 
    109 SkTypeface* CreateTestTypeface(const char* name, SkTypeface::Style style);
    110 
    111 #endif
    112