summaryrefslogtreecommitdiffstats
path: root/src/platformsupport
diff options
context:
space:
mode:
Diffstat (limited to 'src/platformsupport')
-rw-r--r--src/platformsupport/fontdatabases/basicunix/qbasicunixfontdatabase.cpp4
-rw-r--r--src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp83
-rw-r--r--src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h1
3 files changed, 83 insertions, 5 deletions
diff --git a/src/platformsupport/fontdatabases/basicunix/qbasicunixfontdatabase.cpp b/src/platformsupport/fontdatabases/basicunix/qbasicunixfontdatabase.cpp
index 1086a98d85..bca40591f6 100644
--- a/src/platformsupport/fontdatabases/basicunix/qbasicunixfontdatabase.cpp
+++ b/src/platformsupport/fontdatabases/basicunix/qbasicunixfontdatabase.cpp
@@ -354,6 +354,8 @@ QStringList QBasicUnixFontDatabase::addTTFile(const QByteArray &fontData, const
if (face->style_flags & FT_STYLE_FLAG_BOLD)
weight = QFont::Bold;
+ bool fixedPitch = (face->face_flags & FT_FACE_FLAG_FIXED_WIDTH);
+
QSupportedWritingSystems writingSystems;
// detect symbol fonts
for (int i = 0; i < face->num_charmaps; ++i) {
@@ -415,7 +417,7 @@ QStringList QBasicUnixFontDatabase::addTTFile(const QByteArray &fontData, const
QFont::Stretch stretch = QFont::Unstretched;
- registerFont(family,QString(),weight,style,stretch,true,true,0,writingSystems,fontFile);
+ registerFont(family,QString(),weight,style,stretch,true,true,0,fixedPitch,writingSystems,fontFile);
families.append(family);
diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
index d5e1fd1de7..e566cee4f4 100644
--- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
+++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
@@ -57,6 +57,11 @@
#include FT_TRUETYPE_TABLES_H
#include <fontconfig/fontconfig.h>
+#include FT_FREETYPE_H
+
+#if FC_VERSION >= 20402
+#include <fontconfig/fcfreetype.h>
+#endif
#define SimplifiedChineseCsbBit 18
#define TraditionalChineseCsbBit 20
@@ -444,8 +449,9 @@ void QFontconfigDatabase::populateFontDatabase()
FcPatternGetDouble (fonts->fonts[i], FC_PIXEL_SIZE, 0, &pixel_size);
}
+ bool fixedPitch = spacing_value >= FC_MONO;
QFont::Stretch stretch = QFont::Unstretched;
- QPlatformFontDatabase::registerFont(familyName,QLatin1String((const char *)foundry_value),weight,style,stretch,antialias,scalable,pixel_size,writingSystems,fontFile);
+ QPlatformFontDatabase::registerFont(familyName,QLatin1String((const char *)foundry_value),weight,style,stretch,antialias,scalable,pixel_size,fixedPitch,writingSystems,fontFile);
// qDebug() << familyName << (const char *)foundry_value << weight << style << &writingSystems << scalable << true << pixel_size;
}
@@ -470,9 +476,9 @@ void QFontconfigDatabase::populateFontDatabase()
QString familyQtName = QString::fromLatin1(f->qtname);
while (f->qtname) {
- registerFont(familyQtName,QString(),QFont::Normal,QFont::StyleNormal,QFont::Unstretched,true,true,0,ws,0);
- registerFont(familyQtName,QString(),QFont::Normal,QFont::StyleItalic,QFont::Unstretched,true,true,0,ws,0);
- registerFont(familyQtName,QString(),QFont::Normal,QFont::StyleOblique,QFont::Unstretched,true,true,0,ws,0);
+ registerFont(familyQtName,QString(),QFont::Normal,QFont::StyleNormal,QFont::Unstretched,true,true,0,f->fixed,ws,0);
+ registerFont(familyQtName,QString(),QFont::Normal,QFont::StyleItalic,QFont::Unstretched,true,true,0,f->fixed,ws,0);
+ registerFont(familyQtName,QString(),QFont::Normal,QFont::StyleOblique,QFont::Unstretched,true,true,0,f->fixed,ws,0);
++f;
}
@@ -583,3 +589,72 @@ QStringList QFontconfigDatabase::fallbacksForFamily(const QString family, const
return fallbackFamilies;
}
+
+static FcPattern *queryFont(const FcChar8 *file, const QByteArray &data, int id, FcBlanks *blanks, int *count)
+{
+#if FC_VERSION < 20402
+ Q_UNUSED(data)
+ return FcFreeTypeQuery(file, id, blanks, count);
+#else
+ if (data.isEmpty())
+ return FcFreeTypeQuery(file, id, blanks, count);
+
+ extern FT_Library qt_getFreetype();
+ FT_Library lib = qt_getFreetype();
+
+ FcPattern *pattern = 0;
+
+ FT_Face face;
+ if (!FT_New_Memory_Face(lib, (const FT_Byte *)data.constData(), data.size(), id, &face)) {
+ *count = face->num_faces;
+
+ pattern = FcFreeTypeQueryFace(face, file, id, blanks);
+
+ FT_Done_Face(face);
+ }
+
+ return pattern;
+#endif
+}
+
+QStringList QFontconfigDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName)
+{
+ QStringList families;
+ FcFontSet *set = FcConfigGetFonts(0, FcSetApplication);
+ if (!set) {
+ FcConfigAppFontAddFile(0, (const FcChar8 *)":/non-existent");
+ set = FcConfigGetFonts(0, FcSetApplication); // try again
+ if (!set)
+ return families;
+ }
+
+ int id = 0;
+ FcBlanks *blanks = FcConfigGetBlanks(0);
+ int count = 0;
+
+ FcPattern *pattern = 0;
+ do {
+ pattern = queryFont((const FcChar8 *)QFile::encodeName(fileName).constData(),
+ fontData, id, blanks, &count);
+ if (!pattern)
+ return families;
+
+ FcPatternDel(pattern, FC_FILE);
+ QByteArray cs = fileName.toUtf8();
+ FcPatternAddString(pattern, FC_FILE, (const FcChar8 *) cs.constData());
+
+ FcChar8 *fam = 0;
+ if (FcPatternGetString(pattern, FC_FAMILY, 0, &fam) == FcResultMatch) {
+ QString family = QString::fromUtf8(reinterpret_cast<const char *>(fam));
+ families << family;
+ }
+
+ if (!FcFontSetAdd(set, pattern))
+ return families;
+
+ ++id;
+ } while (pattern && id < count);
+
+ return families;
+}
+
diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h
index 5a5e4b670f..eec510722a 100644
--- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h
+++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h
@@ -51,6 +51,7 @@ public:
void populateFontDatabase();
QFontEngine *fontEngine(const QFontDef &fontDef, QUnicodeTables::Script script, void *handle);
QStringList fallbacksForFamily(const QString family, const QFont::Style &style, const QFont::StyleHint &styleHint, const QUnicodeTables::Script &script) const;
+ QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName);
};
#endif // QFONTCONFIGDATABASE_H