-
Notifications
You must be signed in to change notification settings - Fork 54
/
gfxFT2FontList.h
190 lines (140 loc) · 6.78 KB
/
gfxFT2FontList.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef GFX_FT2FONTLIST_H
#define GFX_FT2FONTLIST_H
#include "mozilla/MemoryReporting.h"
#include "gfxPlatformFontList.h"
#include "mozilla/gfx/UnscaledFontFreeType.h"
namespace mozilla {
namespace dom {
class FontListEntry;
};
}; // namespace mozilla
using mozilla::dom::FontListEntry;
class FontNameCache;
typedef struct FT_FaceRec_* FT_Face;
class nsZipArchive;
class WillShutdownObserver;
class FT2FontEntry : public gfxFontEntry {
public:
explicit FT2FontEntry(const nsACString& aFaceName)
: gfxFontEntry(aFaceName),
mFTFace(nullptr),
mFontFace(nullptr),
mFTFontIndex(0) {}
~FT2FontEntry();
gfxFontEntry* Clone() const override;
const nsCString& GetName() const { return Name(); }
// create a font entry for a downloaded font
static FT2FontEntry* CreateFontEntry(
const nsACString& aFontName, WeightRange aWeight, StretchRange aStretch,
SlantStyleRange aStyle, const uint8_t* aFontData, uint32_t aLength);
// create a font entry representing an installed font, identified by
// a FontListEntry; the freetype and cairo faces will not be instantiated
// until actually needed
static FT2FontEntry* CreateFontEntry(const FontListEntry& aFLE);
// Create a font entry for a given freetype face; if it is an installed font,
// also record the filename and index.
// aFontData (if non-nullptr) is NS_Malloc'ed data that aFace depends on,
// to be freed after the face is destroyed.
// aLength is the length of aFontData.
static FT2FontEntry* CreateFontEntry(FT_Face aFace, const char* aFilename,
uint8_t aIndex, const nsACString& aName,
const uint8_t* aFontData = nullptr,
uint32_t aLength = 0);
gfxFont* CreateFontInstance(const gfxFontStyle* aFontStyle) override;
// Create (if necessary) and return the cairo_font_face for this font.
// This may fail and return null, so caller must be prepared to handle this.
// If a style is passed, any variationSettings in the style will be applied
// to the resulting font face.
cairo_font_face_t* CairoFontFace(const gfxFontStyle* aStyle = nullptr);
// Create a cairo_scaled_font for this face, with the given style.
// This may fail and return null, so caller must be prepared to handle this.
cairo_scaled_font_t* CreateScaledFont(const gfxFontStyle* aStyle);
nsresult ReadCMAP(FontInfoData* aFontInfoData = nullptr) override;
virtual hb_blob_t* GetFontTable(uint32_t aTableTag) override;
virtual nsresult CopyFontTable(uint32_t aTableTag,
nsTArray<uint8_t>& aBuffer) override;
bool HasVariations() override;
void GetVariationAxes(
nsTArray<gfxFontVariationAxis>& aVariationAxes) override;
void GetVariationInstances(
nsTArray<gfxFontVariationInstance>& aInstances) override;
// Check for various kinds of brokenness, and set flags on the entry
// accordingly so that we avoid using bad font tables
void CheckForBrokenFont(gfxFontFamily* aFamily);
FT_MM_Var* GetMMVar() override;
virtual void AddSizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf,
FontListSizes* aSizes) const override;
virtual void AddSizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf,
FontListSizes* aSizes) const override;
FT_Face mFTFace;
cairo_font_face_t* mFontFace;
FT_MM_Var* mMMVar = nullptr;
nsCString mFilename;
uint8_t mFTFontIndex;
mozilla::ThreadSafeWeakPtr<mozilla::gfx::UnscaledFontFreeType> mUnscaledFont;
bool mHasVariations = false;
bool mHasVariationsInitialized = false;
bool mMMVarInitialized = false;
};
class FT2FontFamily : public gfxFontFamily {
public:
explicit FT2FontFamily(const nsACString& aName) : gfxFontFamily(aName) {}
// Append this family's faces to the IPC fontlist
void AddFacesToFontList(InfallibleTArray<FontListEntry>* aFontList);
};
class gfxFT2FontList : public gfxPlatformFontList {
public:
gfxFT2FontList();
virtual ~gfxFT2FontList();
virtual gfxFontEntry* LookupLocalFont(
const nsACString& aFontName, WeightRange aWeightForEntry,
StretchRange aStretchForEntry, SlantStyleRange aStyleForEntry) override;
virtual gfxFontEntry* MakePlatformFont(const nsACString& aFontName,
WeightRange aWeightForEntry,
StretchRange aStretchForEntry,
SlantStyleRange aStyleForEntry,
const uint8_t* aFontData,
uint32_t aLength) override;
void GetSystemFontList(InfallibleTArray<FontListEntry>* retValue);
static gfxFT2FontList* PlatformFontList() {
return static_cast<gfxFT2FontList*>(
gfxPlatformFontList::PlatformFontList());
}
virtual void GetFontFamilyList(
nsTArray<RefPtr<gfxFontFamily> >& aFamilyArray) override;
gfxFontFamily* CreateFontFamily(const nsACString& aName) const override;
void WillShutdown();
protected:
typedef enum { kUnknown, kStandard } StandardFile;
// initialize font lists
virtual nsresult InitFontListForPlatform() override;
void AppendFaceFromFontListEntry(const FontListEntry& aFLE,
StandardFile aStdFile);
void AppendFacesFromFontFile(const nsCString& aFileName,
FontNameCache* aCache, StandardFile aStdFile);
void AppendFacesFromOmnijarEntry(nsZipArchive* aReader,
const nsCString& aEntryName,
FontNameCache* aCache, bool aJarChanged);
// the defaults here are suitable for reading bundled fonts from omnijar
void AppendFacesFromCachedFaceList(const nsCString& aFileName,
const nsCString& aFaceList,
StandardFile aStdFile = kStandard);
void AddFaceToList(const nsCString& aEntryName, uint32_t aIndex,
StandardFile aStdFile, FT_Face aFace,
nsCString& aFaceList);
void FindFonts();
void FindFontsInOmnijar(FontNameCache* aCache);
void FindFontsInDir(const nsCString& aDir, FontNameCache* aFNC);
virtual gfxFontFamily* GetDefaultFontForPlatform(
const gfxFontStyle* aStyle) override;
nsTHashtable<nsCStringHashKey> mSkipSpaceLookupCheckFamilies;
private:
mozilla::UniquePtr<FontNameCache> mFontNameCache;
int64_t mJarModifiedTime;
RefPtr<WillShutdownObserver> mObserver;
};
#endif /* GFX_FT2FONTLIST_H */