4#ifndef QFONTDATABASE_P_H
5#define QFONTDATABASE_P_H
18#include <QtCore/qcache.h>
19#include <QtCore/qloggingcategory.h>
21#include <QtGui/qfontdatabase.h>
22#include <QtCore/private/qglobal_p.h>
26Q_DECLARE_LOGGING_CATEGORY(lcFontDb)
27Q_DECLARE_LOGGING_CATEGORY(lcFontMatch)
42 lhs.styleHint == rhs.styleHint &&
43 lhs.style == rhs.style &&
44 lhs.family == rhs.family;
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));
65 unsigned short pixelSize : 16;
72 Key(
const QString &styleString);
75 : style(QFont::StyleNormal)
76 , weight(QFont::Normal)
88 signed int stretch : 12;
90 bool operator==(
const Key &other)
const noexcept
92 return (style == other.style && weight == other.weight &&
93 (stretch == 0 || other.stretch == 0 || stretch == other.stretch));
96 bool operator!=(
const Key &other)
const noexcept
98 return !operator==(other);
102 QtFontStyle(
const Key &k)
104 , bitmapScalable(
false)
105 , smoothScalable(
false)
107 , pixelSizes(
nullptr)
113 QtFontSize *pixelSize(
unsigned short size,
bool =
false);
116 bool bitmapScalable : 1;
117 bool smoothScalable : 1;
118 signed int count : 30;
119 QtFontSize *pixelSizes;
126 QtFontFoundry(
const QString &n)
135 delete styles[count];
141 QtFontStyle **styles;
143 enum StyleRetrievalFlags : quint8 {
144 NoRetrievalFlags = 0,
146 MatchAllProperties = 2,
147 AllRetrievalFlags = 3,
150 QtFontStyle *style(
const QtFontStyle::Key &,
151 const QString & = QString(),
152 StyleRetrievalFlags flags = NoRetrievalFlags);
157 enum WritingSystemStatus {
161 Unsupported = UnsupportedFT
164 QtFontFamily(
const QString &n)
169 name(n), count(0), foundries(
nullptr)
171 memset(writingSystems, 0,
sizeof(writingSystems));
175 delete foundries[count];
186 QtFontFoundry **foundries;
188 unsigned char writingSystems[QFontDatabase::WritingSystemsCount];
190 bool matchesFamilyName(
const QString &familyName)
const;
191 QtFontFoundry *foundry(
const QString &f,
bool =
false);
193 bool ensurePopulated();
199 QFontDatabasePrivate()
205 ~QFontDatabasePrivate() {
209 void clearFamilies();
211 enum FamilyRequestFlags {
218 enum ExtendedScript {
219 Script_Common = QChar::Script_Common,
220 Script_Latin = QChar::Script_Latin,
221 Script_Emoji = QChar::ScriptCount,
225 QtFontFamily *family(
const QString &f, FamilyRequestFlags flags = EnsurePopulated);
228 QtFontFamily **families;
229 bool populated =
false;
231 QHash<ExtendedScript, QStringList> applicationFallbackFontFamiliesHash;
233 QCache<QtFontFallbacksCacheKey, QStringList> fallbacksCache;
234 struct ApplicationFont {
242 bool isNull()
const {
return fileName.isEmpty(); }
243 bool isPopulated()
const {
return !properties.isEmpty(); }
249 QFont::Style style = QFont::StyleNormal;
250 int stretch = QFont::Unstretched;
253 QList<Properties> properties;
255 QList<ApplicationFont> applicationFonts;
256 int addAppFont(
const QByteArray &fontData,
const QString &fileName);
257 bool isApplicationFont(
const QString &fileName);
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);
264 static QFontDatabasePrivate *instance();
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,
270 bool preferScriptOverFamily =
false);
271 static void load(
const QFontPrivate *d,
int script );
272 static QFontDatabasePrivate *ensureFontDatabase();
277 static int match(
int script,
278 const QFontDef &request,
279 const QString &family_name,
280 const QString &foundry_name,
282 const QList<
int> &blacklistedFamilies,
283 unsigned int *resultingScore =
nullptr);
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());
290 static QFontEngine *loadSingleEngine(
int script,
const QFontDef &request,
291 QtFontFamily *family, QtFontFoundry *foundry,
292 QtFontStyle *style, QtFontSize *size);
294 static QFontEngine *loadEngine(
int script,
const QFontDef &request,
295 QtFontFamily *family, QtFontFoundry *foundry,
296 QtFontStyle *style, QtFontSize *size);
299Q_DECLARE_TYPEINFO(QFontDatabasePrivate::ApplicationFont, Q_RELOCATABLE_TYPE);
QList< QString > QStringList
Constructs a string list that contains the given string, str.
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)
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 Q_LOGGING_CATEGORY(name,...)
#define qCInfo(category,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
QFont::StyleHint styleHint