/src/skia/src/ports/SkFontHost_FreeType_common.h
Line | Count | Source (jump to first uncovered line) |
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 "src/core/SkGlyph.h" |
15 | | #include "src/core/SkScalerContext.h" |
16 | | #include "src/core/SkSharedMutex.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 | | typedef struct FT_BBox_ FT_BBox; |
27 | | |
28 | | |
29 | | #ifdef SK_DEBUG |
30 | | const char* SkTraceFtrGetError(int); |
31 | | #define SK_TRACEFTR(ERR, MSG, ...) \ |
32 | 0 | SkDebugf("%s:%d:1: error: 0x%x '%s' " MSG "\n", __FILE__, __LINE__, ERR, \ |
33 | 0 | SkTraceFtrGetError((int)(ERR)), __VA_ARGS__) |
34 | | #else |
35 | 0 | #define SK_TRACEFTR(ERR, ...) do { sk_ignore_unused_variable(ERR); } while (false) |
36 | | #endif |
37 | | |
38 | | |
39 | | class SkScalerContext_FreeType_Base : public SkScalerContext { |
40 | | protected: |
41 | | // See http://freetype.sourceforge.net/freetype2/docs/reference/ft2-bitmap_handling.html#FT_Bitmap_Embolden |
42 | | // This value was chosen by eyeballing the result in Firefox and trying to match it. |
43 | | static const FT_Pos kBitmapEmboldenStrength = 1 << 6; |
44 | | |
45 | | SkScalerContext_FreeType_Base(sk_sp<SkTypeface> typeface, const SkScalerContextEffects& effects, |
46 | | const SkDescriptor *desc) |
47 | | : INHERITED(std::move(typeface), effects, desc) |
48 | 1.42k | {} |
49 | | |
50 | | void generateGlyphImage(FT_Face face, const SkGlyph& glyph, const SkMatrix& bitmapTransform); |
51 | | bool generateGlyphPath(FT_Face face, SkPath* path); |
52 | | bool generateFacePath(FT_Face face, SkGlyphID glyphID, SkPath* path); |
53 | | |
54 | | // Computes a bounding box for a COLRv1 glyph id in FT_BBox 26.6 format and FreeType's y-up |
55 | | // coordinate space. |
56 | | // Needed to call into COLRv1 from generateMetrics(). |
57 | | // |
58 | | // Note : This method may change the configured size and transforms on FT_Face. Make sure to |
59 | | // configure size, matrix and load glyphs as needed after using this function to restore the |
60 | | // state of FT_Face. |
61 | | bool computeColrV1GlyphBoundingBox(FT_Face face, SkGlyphID glyphID, FT_BBox* boundingBox); |
62 | | |
63 | | private: |
64 | | using INHERITED = SkScalerContext; |
65 | | }; |
66 | | |
67 | | class SkTypeface_FreeType : public SkTypeface { |
68 | | public: |
69 | | /** For SkFontMgrs to make use of our ability to extract |
70 | | * name and style from a stream, using FreeType's API. |
71 | | */ |
72 | | class Scanner : ::SkNoncopyable { |
73 | | public: |
74 | | Scanner(); |
75 | | ~Scanner(); |
76 | | struct AxisDefinition { |
77 | | SkFourByteTag fTag; |
78 | | SkFixed fMinimum; |
79 | | SkFixed fDefault; |
80 | | SkFixed fMaximum; |
81 | | }; |
82 | | using AxisDefinitions = SkSTArray<4, AxisDefinition, true>; |
83 | | bool recognizedFont(SkStreamAsset* stream, int* numFonts) const; |
84 | | bool scanFont(SkStreamAsset* stream, int ttcIndex, |
85 | | SkString* name, SkFontStyle* style, bool* isFixedPitch, |
86 | | AxisDefinitions* axes) const; |
87 | | static void computeAxisValues( |
88 | | AxisDefinitions axisDefinitions, |
89 | | const SkFontArguments::VariationPosition position, |
90 | | SkFixed* axisValues, |
91 | | const SkString& name, |
92 | | const SkFontArguments::VariationPosition::Coordinate* currentPosition = nullptr); |
93 | | static bool GetAxes(FT_Face face, AxisDefinitions* axes); |
94 | | |
95 | | private: |
96 | | FT_Face openFace(SkStreamAsset* stream, int ttcIndex, FT_Stream ftStream) const; |
97 | | FT_Library fLibrary; |
98 | | mutable SkMutex fLibraryMutex; |
99 | | }; |
100 | | |
101 | | /** Fetch units/EM from "head" table if needed (ie for bitmap fonts) */ |
102 | | static int GetUnitsPerEm(FT_Face face); |
103 | | |
104 | | /** |
105 | | * Return the font data, or nullptr on failure. |
106 | | */ |
107 | | std::unique_ptr<SkFontData> makeFontData() const; |
108 | | class FaceRec; |
109 | | FaceRec* getFaceRec() const; |
110 | | |
111 | | protected: |
112 | | SkTypeface_FreeType(const SkFontStyle& style, bool isFixedPitch); |
113 | | ~SkTypeface_FreeType() override; |
114 | | |
115 | | std::unique_ptr<SkFontData> cloneFontData(const SkFontArguments&) const; |
116 | | std::unique_ptr<SkScalerContext> onCreateScalerContext(const SkScalerContextEffects&, |
117 | | const SkDescriptor*) const override; |
118 | | void onFilterRec(SkScalerContextRec*) const override; |
119 | | void getGlyphToUnicodeMap(SkUnichar*) const override; |
120 | | std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics() const override; |
121 | | void getPostScriptGlyphNames(SkString* dstArray) const override; |
122 | | bool onGetPostScriptName(SkString*) const override; |
123 | | int onGetUPEM() const override; |
124 | | bool onGetKerningPairAdjustments(const uint16_t glyphs[], int count, |
125 | | int32_t adjustments[]) const override; |
126 | | void onCharsToGlyphs(const SkUnichar uni[], int count, SkGlyphID glyphs[]) const override; |
127 | | int onCountGlyphs() const override; |
128 | | |
129 | | LocalizedStrings* onCreateFamilyNameIterator() const override; |
130 | | |
131 | | int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], |
132 | | int coordinateCount) const override; |
133 | | int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[], |
134 | | int parameterCount) const override; |
135 | | int onGetTableTags(SkFontTableTag tags[]) const override; |
136 | | size_t onGetTableData(SkFontTableTag, size_t offset, |
137 | | size_t length, void* data) const override; |
138 | | sk_sp<SkData> onCopyTableData(SkFontTableTag) const override; |
139 | | |
140 | | virtual std::unique_ptr<SkFontData> onMakeFontData() const = 0; |
141 | | |
142 | | private: |
143 | | mutable SkOnce fFTFaceOnce; |
144 | | mutable std::unique_ptr<FaceRec> fFaceRec; |
145 | | |
146 | | mutable SkSharedMutex fC2GCacheMutex; |
147 | | mutable SkCharToGlyphCache fC2GCache; |
148 | | |
149 | | using INHERITED = SkTypeface; |
150 | | }; |
151 | | |
152 | | #endif // SKFONTHOST_FREETYPE_COMMON_H_ |