From c2c136306d74b5299d85e69b8757997d469e3409 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Wed, 19 Mar 2014 15:19:53 +0100 Subject: Apply fontconfig settings to custom fonts Currently QtWebKits custom fonts does not follow the system settings on Linux. This is because they are only handled by the basic fontdatabase. This patch adds handling of custom fonts to QFontconfigDatabase. Change-Id: I676fc97840766b58cd937bb8e2c9f166f30c8a6e Reviewed-by: Pierre Rossi --- .../fontconfig/qfontconfigdatabase.cpp | 50 ++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp') diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp index 5299c6780e..1a31400ea5 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp @@ -650,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(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; -- cgit v1.2.3