1 /*
2  * Copyright 2006-2012 The Android Open Source Project
3  * Copyright 2012 Mozilla Foundation
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 
9 #ifndef SKFONTHOST_FREETYPE_COMMON_H_
10 #define SKFONTHOST_FREETYPE_COMMON_H_
11 
12 #include "SkGlyph.h"
13 #include "SkScalerContext.h"
14 #include "SkTypeface.h"
15 #include "SkTypes.h"
16 
17 #include <ft2build.h>
18 #include FT_FREETYPE_H
19 
20 class SkScalerContext_FreeType_Base : public SkScalerContext {
21 protected:
22     // See http://freetype.sourceforge.net/freetype2/docs/reference/ft2-bitmap_handling.html#FT_Bitmap_Embolden
23     // This value was chosen by eyeballing the result in Firefox and trying to match it.
24     static const FT_Pos kBitmapEmboldenStrength = 1 << 6;
25 
SkScalerContext_FreeType_Base(SkTypeface * typeface,const SkDescriptor * desc)26     SkScalerContext_FreeType_Base(SkTypeface* typeface, const SkDescriptor *desc)
27     : INHERITED(typeface, desc)
28     {}
29 
30     void generateGlyphImage(FT_Face face, const SkGlyph& glyph);
31     void generateGlyphPath(FT_Face face, SkPath* path);
32 
33 private:
34     typedef SkScalerContext INHERITED;
35 };
36 
37 class SkTypeface_FreeType : public SkTypeface {
38 public:
39     /** For SkFontMgrs to make use of our ability to extract
40      *  name and style from a stream, using FreeType's API.
41      */
42     class Scanner : ::SkNoncopyable {
43     public:
44         Scanner();
45         ~Scanner();
46         bool recognizedFont(SkStream* stream, int* numFonts) const;
47         bool scanFont(SkStream* stream, int ttcIndex,
48                       SkString* name, SkFontStyle* style, bool* isFixedPitch) const;
49     private:
50         FT_Face openFace(SkStream* stream, int ttcIndex, FT_Stream ftStream) const;
51         FT_Library fLibrary;
52         mutable SkMutex fLibraryMutex;
53     };
54 
55 protected:
SkTypeface_FreeType(const SkFontStyle & style,SkFontID uniqueID,bool isFixedPitch)56     SkTypeface_FreeType(const SkFontStyle& style, SkFontID uniqueID, bool isFixedPitch)
57         : INHERITED(style, uniqueID, isFixedPitch)
58         , fGlyphCount(-1)
59     {}
60 
61     virtual SkScalerContext* onCreateScalerContext(
62                                         const SkDescriptor*) const override;
63     void onFilterRec(SkScalerContextRec*) const override;
64     SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics(
65                         PerGlyphInfo, const uint32_t*, uint32_t) const override;
66     int onGetUPEM() const override;
67     virtual bool onGetKerningPairAdjustments(const uint16_t glyphs[], int count,
68                                        int32_t adjustments[]) const override;
69     virtual int onCharsToGlyphs(const void* chars, Encoding, uint16_t glyphs[],
70                                 int glyphCount) const override;
71     int onCountGlyphs() const override;
72 
73     LocalizedStrings* onCreateFamilyNameIterator() const override;
74 
75     int onGetTableTags(SkFontTableTag tags[]) const override;
76     virtual size_t onGetTableData(SkFontTableTag, size_t offset,
77                                   size_t length, void* data) const override;
78 
79 private:
80     mutable int fGlyphCount;
81 
82     typedef SkTypeface INHERITED;
83 };
84 
85 #endif // SKFONTHOST_FREETYPE_COMMON_H_
86