Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qfontdatabase_p.h
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QFONTDATABASE_P_H
5#define QFONTDATABASE_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists for the convenience
12// of internal files. This header file may change from version to version
13// without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtCore/qcache.h>
19#include <QtCore/qloggingcategory.h>
20
21#include <QtGui/qfontdatabase.h>
22#include <QtCore/private/qglobal_p.h>
23
25
26Q_DECLARE_LOGGING_CATEGORY(lcFontDb)
27Q_DECLARE_LOGGING_CATEGORY(lcFontMatch)
28
29struct QtFontDesc;
30
38
39inline bool operator==(const QtFontFallbacksCacheKey &lhs, const QtFontFallbacksCacheKey &rhs) noexcept
40{
41 return lhs.script == rhs.script &&
42 lhs.styleHint == rhs.styleHint &&
43 lhs.style == rhs.style &&
44 lhs.family == rhs.family;
45}
46
47inline bool operator!=(const QtFontFallbacksCacheKey &lhs, const QtFontFallbacksCacheKey &rhs) noexcept
48{
49 return !operator==(lhs, rhs);
50}
51
52inline size_t qHash(const QtFontFallbacksCacheKey &key, size_t seed = 0) noexcept
53{
54 QtPrivate::QHashCombineWithSeed hash(seed);
55 seed = hash(seed, key.family);
56 seed = hash(seed, int(key.style));
57 seed = hash(seed, int(key.styleHint));
58 seed = hash(seed, int(key.script));
59 return seed;
60}
61
62struct Q_GUI_EXPORT QtFontSize
63{
64 void *handle;
65 unsigned short pixelSize : 16;
66};
67
68struct Q_GUI_EXPORT QtFontStyle
69{
70 struct Key
71 {
72 Key(const QString &styleString);
73
74 Key()
75 : style(QFont::StyleNormal)
76 , weight(QFont::Normal)
77 , stretch(0)
78 {}
79
80 Key(const Key &o)
81 : style(o.style)
82 , weight(o.weight)
83 , stretch(o.stretch)
84 {}
85
86 uint style : 2;
87 uint weight : 10;
88 signed int stretch : 12;
89
90 bool operator==(const Key &other) const noexcept
91 {
92 return (style == other.style && weight == other.weight &&
93 (stretch == 0 || other.stretch == 0 || stretch == other.stretch));
94 }
95
96 bool operator!=(const Key &other) const noexcept
97 {
98 return !operator==(other);
99 }
100 };
101
102 QtFontStyle(const Key &k)
103 : key(k)
104 , bitmapScalable(false)
105 , smoothScalable(false)
106 , count(0)
107 , pixelSizes(nullptr)
108 {
109 }
110
111 ~QtFontStyle();
112
113 QtFontSize *pixelSize(unsigned short size, bool = false);
114
115 Key key;
116 bool bitmapScalable : 1;
117 bool smoothScalable : 1;
118 signed int count : 30;
119 QtFontSize *pixelSizes;
120 QString styleName;
121 bool antialiased;
122};
123
124struct Q_GUI_EXPORT QtFontFoundry
125{
126 QtFontFoundry(const QString &n)
127 : name(n)
128 , count(0)
129 , styles(nullptr)
130 {}
131
132 ~QtFontFoundry()
133 {
134 while (count--)
135 delete styles[count];
136 free(styles);
137 }
138
139 QString name;
140 int count;
141 QtFontStyle **styles;
142
143 enum StyleRetrievalFlags : quint8 {
144 NoRetrievalFlags = 0,
145 AddWhenMissing = 1,
146 MatchAllProperties = 2,
147 AllRetrievalFlags = 3,
148 };
149
150 QtFontStyle *style(const QtFontStyle::Key &,
151 const QString & = QString(),
152 StyleRetrievalFlags flags = NoRetrievalFlags);
153};
154
155struct Q_GUI_EXPORT QtFontFamily
156{
157 enum WritingSystemStatus {
158 Unknown = 0,
159 Supported = 1,
160 UnsupportedFT = 2,
161 Unsupported = UnsupportedFT
162 };
163
164 QtFontFamily(const QString &n)
165 :
166 populated(false),
167 fixedPitch(false),
168 colorFont(false),
169 name(n), count(0), foundries(nullptr)
170 {
171 memset(writingSystems, 0, sizeof(writingSystems));
172 }
173 ~QtFontFamily() {
174 while (count--)
175 delete foundries[count];
176 free(foundries);
177 }
178
179 bool populated : 1;
180 bool fixedPitch : 1;
181 bool colorFont : 1;
182
183 QString name;
184 QStringList aliases;
185 int count;
186 QtFontFoundry **foundries;
187
188 unsigned char writingSystems[QFontDatabase::WritingSystemsCount];
189
190 bool matchesFamilyName(const QString &familyName) const;
191 QtFontFoundry *foundry(const QString &f, bool = false);
192
193 bool ensurePopulated();
194};
195
196class Q_GUI_EXPORT QFontDatabasePrivate
197{
198public:
199 QFontDatabasePrivate()
200 : count(0)
201 , families(nullptr)
202 , fallbacksCache(64)
203 { }
204
205 ~QFontDatabasePrivate() {
206 clearFamilies();
207 }
208
209 void clearFamilies();
210
211 enum FamilyRequestFlags {
212 RequestFamily = 0,
213 EnsureCreated,
214 EnsurePopulated
215 };
216
217 // Expands QChar::Script by adding a special "script" for emoji sequences
218 enum ExtendedScript {
219 Script_Common = QChar::Script_Common,
220 Script_Latin = QChar::Script_Latin,
221 Script_Emoji = QChar::ScriptCount,
222 ScriptCount
223 };
224
225 QtFontFamily *family(const QString &f, FamilyRequestFlags flags = EnsurePopulated);
226
227 int count;
228 QtFontFamily **families;
229 bool populated = false;
230
231 QHash<ExtendedScript, QStringList> applicationFallbackFontFamiliesHash;
232
233 QCache<QtFontFallbacksCacheKey, QStringList> fallbacksCache;
234 struct ApplicationFont {
235 QString fileName;
236
237 // Note: The data may be implicitly shared throughout the
238 // font database and platform font database, so be careful
239 // to never detach when accessing this member!
240 QByteArray data;
241
242 bool isNull() const { return fileName.isEmpty(); }
243 bool isPopulated() const { return !properties.isEmpty(); }
244
245 struct Properties {
246 QString familyName;
247 QString styleName;
248 int weight = 0;
249 QFont::Style style = QFont::StyleNormal;
250 int stretch = QFont::Unstretched;
251 };
252
253 QList<Properties> properties;
254 };
255 QList<ApplicationFont> applicationFonts;
256 int addAppFont(const QByteArray &fontData, const QString &fileName);
257 bool isApplicationFont(const QString &fileName);
258
259 void setApplicationFallbackFontFamilies(ExtendedScript script, const QStringList &familyNames);
260 QStringList applicationFallbackFontFamilies(ExtendedScript script);
261 bool removeApplicationFallbackFontFamily(ExtendedScript script, const QString &familyName);
262 void addApplicationFallbackFontFamily(ExtendedScript script, const QString &familyName);
263
264 static QFontDatabasePrivate *instance();
265
266 static void parseFontName(const QString &name, QString &foundry, QString &family);
267 static QString resolveFontFamilyAlias(const QString &family);
268 static QFontEngine *findFont(const QFontDef &request,
269 int script /* QFontDatabasePrivate::ExtendedScript */,
270 bool preferScriptOverFamily = false);
271 static void load(const QFontPrivate *d, int script /* QFontDatabasePrivate::ExtendedScript */);
272 static QFontDatabasePrivate *ensureFontDatabase();
273
274 void invalidate();
275
276private:
277 static int match(int script,
278 const QFontDef &request,
279 const QString &family_name,
280 const QString &foundry_name,
281 QtFontDesc *desc,
282 const QList<int> &blacklistedFamilies,
283 unsigned int *resultingScore = nullptr);
284
285 static unsigned int bestFoundry(int script, unsigned int score, int styleStrategy,
286 const QtFontFamily *family, const QString &foundry_name,
287 QtFontStyle::Key styleKey, int pixelSize, char pitch,
288 QtFontDesc *desc, const QString &styleName = QString());
289
290 static QFontEngine *loadSingleEngine(int script, const QFontDef &request,
291 QtFontFamily *family, QtFontFoundry *foundry,
292 QtFontStyle *style, QtFontSize *size);
293
294 static QFontEngine *loadEngine(int script, const QFontDef &request,
295 QtFontFamily *family, QtFontFoundry *foundry,
296 QtFontStyle *style, QtFontSize *size);
297
298};
299Q_DECLARE_TYPEINFO(QFontDatabasePrivate::ApplicationFont, Q_RELOCATABLE_TYPE);
300
301QT_END_NAMESPACE
302
303#endif // QFONTDATABASE_P_H
\inmodule QtCore
Definition qbytearray.h:58
\inmodule QtCore
Definition qmutex.h:346
\inmodule QtCore
Definition qmutex.h:342
QList< QString > QStringList
Constructs a string list that contains the given string, str.
#define qApp
Q_TRACE_POINT(qtcore, QFactoryLoader_update, const QString &fileName)
QRecursiveMutex * qt_fontdatabase_mutex()
static bool familySupportsWritingSystem(QtFontFamily *family, size_t writingSystem)
void qt_registerFont(const QString &familyName, const QString &stylename, const QString &foundryname, int weight, QFont::Style style, int stretch, bool antialiased, bool scalable, int pixelSize, bool fixedPitch, bool colorFont, const QSupportedWritingSystems &writingSystems, void *handle)
static bool equalsCaseInsensitive(const QString &a, const QString &b)
static void parseFontName(const QString &name, QString &foundry, QString &family)
static const int scriptForWritingSystem[]
bool qt_isFontFamilyPopulated(const QString &familyName)
#define SMOOTH_SCALABLE
static QString styleStringHelper(int weight, QFont::Style style)
static int getFontWeight(const QString &weightString)
static bool matchFamilyName(const QString &familyName, QtFontFamily *f)
Q_GUI_EXPORT int qt_script_for_writing_system(QFontDatabase::WritingSystem writingSystem)
Q_TRACE_POINT(qtgui, QFontDatabase_loadEngine, const QString &families, int pointSize)
static QStringList fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QFontDatabasePrivate::ExtendedScript script)
static void initFontDef(const QtFontDesc &desc, const QFontDef &request, QFontDef *fontDef, bool multi)
QStringList qt_fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QFontDatabasePrivate::ExtendedScript script)
void qt_registerFontFamily(const QString &familyName)
void qt_registerAliasToFontFamily(const QString &familyName, const QString &alias)
QString qt_resolveFontFamilyAlias(const QString &alias)
static QStringList familyList(const QFontDef &req)
void qt_cleanupFontDatabase()
static QtFontStyle * bestStyle(QtFontFoundry *foundry, const QtFontStyle::Key &styleKey, const QString &styleName=QString())
bool operator==(const QtFontFallbacksCacheKey &lhs, const QtFontFallbacksCacheKey &rhs) noexcept
size_t qHash(const QtFontFallbacksCacheKey &key, size_t seed=0) noexcept
bool operator!=(const QtFontFallbacksCacheKey &lhs, const QtFontFallbacksCacheKey &rhs) noexcept
#define qGuiApp
#define Q_LOGGING_CATEGORY(name,...)
#define qCInfo(category,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
QtFontFamily * family
QtFontSize * size
QtFontStyle * style
QtFontFoundry * foundry
QFont::StyleHint styleHint