summaryrefslogtreecommitdiffstats
path: root/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp')
-rw-r--r--src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp189
1 files changed, 124 insertions, 65 deletions
diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
index a9a85f1316..1a31400ea5 100644
--- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
+++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
@@ -509,6 +509,74 @@ QFontEngineMulti *QFontconfigDatabase::fontEngineMulti(QFontEngine *fontEngine,
return new QFontEngineMultiFontConfig(fontEngine, script);
}
+namespace {
+QFontEngineFT::HintStyle defaultHintStyleFromMatch(QFont::HintingPreference hintingPreference, FcPattern *match)
+{
+ switch (hintingPreference) {
+ case QFont::PreferNoHinting:
+ return QFontEngineFT::HintNone;
+ case QFont::PreferVerticalHinting:
+ return QFontEngineFT::HintLight;
+ case QFont::PreferFullHinting:
+ return QFontEngineFT::HintFull;
+ case QFont::PreferDefaultHinting:
+ break;
+ }
+
+ const QPlatformServices *services = QGuiApplicationPrivate::platformIntegration()->services();
+ if (services && (services->desktopEnvironment() == "GNOME" || services->desktopEnvironment() == "UNITY")) {
+ void *hintStyleResource =
+ QGuiApplication::platformNativeInterface()->nativeResourceForScreen("hintstyle",
+ QGuiApplication::primaryScreen());
+ int hintStyle = int(reinterpret_cast<qintptr>(hintStyleResource));
+ if (hintStyle > 0)
+ return QFontEngine::HintStyle(hintStyle - 1);
+ }
+
+ int hint_style = 0;
+ if (FcPatternGetInteger (match, FC_HINT_STYLE, 0, &hint_style) == FcResultNoMatch)
+ hint_style = FC_HINT_FULL;
+ switch (hint_style) {
+ case FC_HINT_NONE:
+ return QFontEngineFT::HintNone;
+ case FC_HINT_SLIGHT:
+ return QFontEngineFT::HintLight;
+ case FC_HINT_MEDIUM:
+ return QFontEngineFT::HintMedium;
+ case FC_HINT_FULL:
+ return QFontEngineFT::HintFull;
+ default:
+ Q_UNREACHABLE();
+ break;
+ }
+ return QFontEngineFT::HintFull;
+}
+
+QFontEngineFT::SubpixelAntialiasingType subpixelTypeFromMatch(FcPattern *match)
+{
+ int subpixel = FC_RGBA_UNKNOWN;
+ FcPatternGetInteger(match, FC_RGBA, 0, &subpixel);
+
+ switch (subpixel) {
+ case FC_RGBA_UNKNOWN:
+ case FC_RGBA_NONE:
+ return QFontEngineFT::Subpixel_None;
+ case FC_RGBA_RGB:
+ return QFontEngineFT::Subpixel_RGB;
+ case FC_RGBA_BGR:
+ return QFontEngineFT::Subpixel_BGR;
+ case FC_RGBA_VRGB:
+ return QFontEngineFT::Subpixel_VRGB;
+ case FC_RGBA_VBGR:
+ return QFontEngineFT::Subpixel_VBGR;
+ default:
+ Q_UNREACHABLE();
+ break;
+ }
+ return QFontEngineFT::Subpixel_None;
+}
+} // namespace
+
QFontEngine *QFontconfigDatabase::fontEngine(const QFontDef &f, void *usrPtr)
{
if (!usrPtr)
@@ -548,39 +616,7 @@ QFontEngine *QFontconfigDatabase::fontEngine(const QFontDef &f, void *usrPtr)
FcPattern *match = FcFontMatch(0, pattern, &result);
if (match) {
- QFontEngineFT::HintStyle default_hint_style;
- if (f.hintingPreference != QFont::PreferDefaultHinting) {
- switch (f.hintingPreference) {
- case QFont::PreferNoHinting:
- default_hint_style = QFontEngineFT::HintNone;
- break;
- case QFont::PreferVerticalHinting:
- default_hint_style = QFontEngineFT::HintLight;
- break;
- case QFont::PreferFullHinting:
- default:
- default_hint_style = QFontEngineFT::HintFull;
- break;
- }
- } else {
- int hint_style = 0;
- if (FcPatternGetInteger (match, FC_HINT_STYLE, 0, &hint_style) == FcResultNoMatch)
- hint_style = QFontEngineFT::HintFull;
- switch (hint_style) {
- case FC_HINT_NONE:
- default_hint_style = QFontEngineFT::HintNone;
- break;
- case FC_HINT_SLIGHT:
- default_hint_style = QFontEngineFT::HintLight;
- break;
- case FC_HINT_MEDIUM:
- default_hint_style = QFontEngineFT::HintMedium;
- break;
- default:
- default_hint_style = QFontEngineFT::HintFull;
- break;
- }
- }
+ engine->setDefaultHintStyle(defaultHintStyleFromMatch((QFont::HintingPreference)f.hintingPreference, match));
if (antialias) {
// If antialiasing is not fully disabled, fontconfig may still disable it on a font match basis.
@@ -590,40 +626,13 @@ QFontEngine *QFontconfigDatabase::fontEngine(const QFontDef &f, void *usrPtr)
antialias = fc_antialias;
}
- if (f.hintingPreference == QFont::PreferDefaultHinting) {
- const QPlatformServices *services = QGuiApplicationPrivate::platformIntegration()->services();
- if (services && (services->desktopEnvironment() == "GNOME" || services->desktopEnvironment() == "UNITY")) {
- void *hintStyleResource =
- QGuiApplication::platformNativeInterface()->nativeResourceForScreen("hintstyle",
- QGuiApplication::primaryScreen());
- int hintStyle = int(reinterpret_cast<qintptr>(hintStyleResource));
- if (hintStyle > 0)
- default_hint_style = QFontEngine::HintStyle(hintStyle - 1);
- }
- }
-
- engine->setDefaultHintStyle(default_hint_style);
-
if (antialias) {
- QFontEngineFT::SubpixelAntialiasingType subpixelType = QFontEngineFT::Subpixel_None;
- int subpixel = FC_RGBA_NONE;
-
- FcPatternGetInteger(match, FC_RGBA, 0, &subpixel);
- if (subpixel == FC_RGBA_UNKNOWN)
- subpixel = FC_RGBA_NONE;
-
- switch (subpixel) {
- case FC_RGBA_NONE: subpixelType = QFontEngineFT::Subpixel_None; break;
- case FC_RGBA_RGB: subpixelType = QFontEngineFT::Subpixel_RGB; break;
- case FC_RGBA_BGR: subpixelType = QFontEngineFT::Subpixel_BGR; break;
- case FC_RGBA_VRGB: subpixelType = QFontEngineFT::Subpixel_VRGB; break;
- case FC_RGBA_VBGR: subpixelType = QFontEngineFT::Subpixel_VBGR; break;
- default: break;
- }
-
- format = subpixelType == QFontEngineFT::Subpixel_None
- ? QFontEngineFT::Format_A8 : QFontEngineFT::Format_A32;
+ QFontEngineFT::SubpixelAntialiasingType subpixelType = subpixelTypeFromMatch(match);
engine->subpixelType = subpixelType;
+
+ format = (subpixelType == QFontEngineFT::Subpixel_None)
+ ? QFontEngineFT::Format_A8
+ : QFontEngineFT::Format_A32;
} else
format = QFontEngineFT::Format_Mono;
@@ -641,6 +650,56 @@ QFontEngine *QFontconfigDatabase::fontEngine(const QFontDef &f, void *usrPtr)
return engine;
}
+QFontEngine *QFontconfigDatabase::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference)
+{
+ QFontEngineFT *engine = static_cast<QFontEngineFT*>(QBasicFontDatabase::fontEngine(fontData, pixelSize, hintingPreference));
+ QFontDef fontDef = engine->fontDef;
+
+ QFontEngineFT::GlyphFormat format;
+ // try and get the pattern
+ FcPattern *pattern = FcPatternCreate();
+
+ FcValue value;
+ value.type = FcTypeString;
+ QByteArray cs = fontDef.family.toUtf8();
+ value.u.s = (const FcChar8 *)cs.data();
+ FcPatternAdd(pattern,FC_FAMILY,value,true);
+
+ FcResult result;
+
+ FcConfigSubstitute(0, pattern, FcMatchPattern);
+ FcDefaultSubstitute(pattern);
+
+ FcPattern *match = FcFontMatch(0, pattern, &result);
+ if (match) {
+ engine->setDefaultHintStyle(defaultHintStyleFromMatch(hintingPreference, match));
+
+ FcBool fc_antialias;
+ if (FcPatternGetBool(match, FC_ANTIALIAS,0, &fc_antialias) != FcResultMatch)
+ fc_antialias = true;
+ engine->antialias = fc_antialias;
+
+ if (engine->antialias) {
+ QFontEngineFT::SubpixelAntialiasingType subpixelType = subpixelTypeFromMatch(match);
+ engine->subpixelType = subpixelType;
+
+ format = subpixelType == QFontEngineFT::Subpixel_None
+ ? QFontEngineFT::Format_A8
+ : QFontEngineFT::Format_A32;
+ } else
+ format = QFontEngineFT::Format_Mono;
+ FcPatternDestroy(match);
+ } else
+ format = QFontEngineFT::Format_A8;
+
+ FcPatternDestroy(pattern);
+
+ engine->defaultFormat = format;
+ engine->glyphFormat = format;
+
+ return engine;
+}
+
QStringList QFontconfigDatabase::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const
{
QStringList fallbackFamilies;