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 "include/core/SkTypeface.h"
13 #include "include/core/SkTypes.h"
14 #include "include/private/SkMutex.h"
15 #include "src/core/SkGlyph.h"
16 #include "src/core/SkScalerContext.h"
17 #include "src/utils/SkCharToGlyphCache.h"
18 
19 #include "include/core/SkFontMgr.h"
20 
21 // These are forward declared to avoid pimpl but also hide the FreeType implementation.
22 typedef struct FT_LibraryRec_* FT_Library;
23 typedef struct FT_FaceRec_* FT_Face;
24 typedef struct FT_StreamRec_* FT_Stream;
25 typedef signed long FT_Pos;
26 
27 
28 #ifdef SK_DEBUG
29 const char* SkTraceFtrGetError(int);
30 #define SK_TRACEFTR(ERR, MSG, ...) \
31     SkDebugf("%s:%lu:1: error: 0x%x '%s' " MSG "\n", __FILE__, __LINE__, ERR, \
32             SkTraceFtrGetError((int)(ERR)), __VA_ARGS__)
33 #else
34 #define SK_TRACEFTR(ERR, ...) do { sk_ignore_unused_variable(ERR); } while (false)
35 #endif
36 
37 
38 class SkScalerContext_FreeType_Base : public SkScalerContext {
39 protected:
40     // See http://freetype.sourceforge.net/freetype2/docs/reference/ft2-bitmap_handling.html#FT_Bitmap_Embolden
41     // This value was chosen by eyeballing the result in Firefox and trying to match it.
42     static const FT_Pos kBitmapEmboldenStrength = 1 << 6;
43 
SkScalerContext_FreeType_Base(sk_sp<SkTypeface> typeface,const SkScalerContextEffects & effects,const SkDescriptor * desc)44     SkScalerContext_FreeType_Base(sk_sp<SkTypeface> typeface, const SkScalerContextEffects& effects,
45                                   const SkDescriptor *desc)
46         : INHERITED(std::move(typeface), effects, desc)
47     {}
48 
49     void generateGlyphImage(FT_Face face, const SkGlyph& glyph, const SkMatrix& bitmapTransform);
50     bool generateGlyphPath(FT_Face face, SkPath* path);
51     bool generateFacePath(FT_Face face, SkGlyphID glyphID, SkPath* path);
52 private:
53     typedef SkScalerContext INHERITED;
54 };
55 
56 class SkTypeface_FreeType : public SkTypeface {
57 public:
58     /** For SkFontMgrs to make use of our ability to extract
59      *  name and style from a stream, using FreeType's API.
60      */
61     class Scanner : ::SkNoncopyable {
62     public:
63         Scanner();
64         ~Scanner();
65         struct AxisDefinition {
66             SkFourByteTag fTag;
67             SkFixed fMinimum;
68             SkFixed fDefault;
69             SkFixed fMaximum;
70         };
71         using AxisDefinitions = SkSTArray<4, AxisDefinition, true>;
72         bool recognizedFont(SkStreamAsset* stream, int* numFonts) const;
73         bool scanFont(SkStreamAsset* stream, int ttcIndex,
74                       SkString* name, SkFontStyle* style, bool* isFixedPitch,
75                       AxisDefinitions* axes) const;
76         static void computeAxisValues(
77             AxisDefinitions axisDefinitions,
78             const SkFontArguments::VariationPosition position,
79             SkFixed* axisValues,
80             const SkString& name);
81         static bool GetAxes(FT_Face face, AxisDefinitions* axes);
82 
83     private:
84         FT_Face openFace(SkStreamAsset* stream, int ttcIndex, FT_Stream ftStream) const;
85         FT_Library fLibrary;
86         mutable SkMutex fLibraryMutex;
87     };
88 
89     /** Fetch units/EM from "head" table if needed (ie for bitmap fonts) */
90     static int GetUnitsPerEm(FT_Face face);
91 protected:
SkTypeface_FreeType(const SkFontStyle & style,bool isFixedPitch)92     SkTypeface_FreeType(const SkFontStyle& style, bool isFixedPitch)
93         : INHERITED(style, isFixedPitch)
94     {}
95 
96     std::unique_ptr<SkFontData> cloneFontData(const SkFontArguments&) const;
97     virtual SkScalerContext* onCreateScalerContext(const SkScalerContextEffects&,
98                                                    const SkDescriptor*) const override;
99     void onFilterRec(SkScalerContextRec*) const override;
100     void getGlyphToUnicodeMap(SkUnichar*) const override;
101     std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics() const override;
102     void getPostScriptGlyphNames(SkString* dstArray) const override;
103     int onGetUPEM() const override;
104     bool onGetKerningPairAdjustments(const uint16_t glyphs[], int count,
105                                      int32_t adjustments[]) const override;
106     void onCharsToGlyphs(const SkUnichar uni[], int count, SkGlyphID glyphs[]) const override;
107     int onCountGlyphs() const override;
108 
109     LocalizedStrings* onCreateFamilyNameIterator() const override;
110 
111     int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[],
112                                      int coordinateCount) const override;
113     int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[],
114                                        int parameterCount) const override;
115     int onGetTableTags(SkFontTableTag tags[]) const override;
116     size_t onGetTableData(SkFontTableTag, size_t offset,
117                           size_t length, void* data) const override;
118     sk_sp<SkData> onCopyTableData(SkFontTableTag) const override;
119 
120 private:
121     mutable SkMutex fC2GCacheMutex;
122     mutable SkCharToGlyphCache fC2GCache;
123 
124     typedef SkTypeface INHERITED;
125 };
126 
127 #endif // SKFONTHOST_FREETYPE_COMMON_H_
128