From fbc3d75354dc6ca6a84c9642efdccf99ac8d5a8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Martins?= Date: Thu, 20 Nov 2014 21:15:16 +0000 Subject: FreeType: Support RGB rendering when not using FontConfig Windows+FreeType, Linux with -no-fontconfig and the forthcoming OSX FreeType engine can now use sub pixel rendering. The function to get the subpixel type is in QPlatformScreen because we're moving to per screen font settings in the future. This patch is safe, as no functionality is changed for existing users, if one wants sub pixel rendering they'll still have to pass -DFT_CONFIG_OPTION_SUBPIXEL_RENDERING to configure. Task-number: QTBUG-44269 Change-Id: Ib6c22d48a1b7c7b85ee316d5d9e3b6eae0c1ecc0 Reviewed-by: Allan Sandfeld Jensen Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/gui/kernel/qplatformscreen.cpp | 27 ++++++++++++++++++ src/gui/kernel/qplatformscreen.h | 9 ++++++ src/gui/text/qfontengine_ft_p.h | 1 + src/gui/text/qplatformfontdatabase.cpp | 12 ++++++++ src/gui/text/qplatformfontdatabase.h | 2 ++ .../fontdatabases/basic/qbasicfontdatabase.cpp | 14 ++++++++-- src/plugins/platforms/windows/qwindowsscreen.cpp | 32 ++++++++++++++++++++++ src/plugins/platforms/windows/qwindowsscreen.h | 1 + 8 files changed, 96 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/gui/kernel/qplatformscreen.cpp b/src/gui/kernel/qplatformscreen.cpp index 745b89018e..edf546799f 100644 --- a/src/gui/kernel/qplatformscreen.cpp +++ b/src/gui/kernel/qplatformscreen.cpp @@ -393,4 +393,31 @@ QRect QPlatformScreen::mapBetween(Qt::ScreenOrientation a, Qt::ScreenOrientation return rect; } +/*! + Returns a hint about this screen's subpixel layout structure. + + The default implementation queries the \b{QT_SUBPIXEL_AA_TYPE} env variable. + This is just a hint because most platforms don't have a way to retrieve the correct value from hardware + and instead rely on font configurations. +*/ +QPlatformScreen::SubpixelAntialiasingType QPlatformScreen::subpixelAntialiasingTypeHint() const +{ + static int type = -1; + if (type == -1) { + QByteArray env = qgetenv("QT_SUBPIXEL_AA_TYPE"); + if (env == "RGB") + type = QPlatformScreen::Subpixel_RGB; + else if (env == "BGR") + type = QPlatformScreen::Subpixel_BGR; + else if (env == "VRGB") + type = QPlatformScreen::Subpixel_VRGB; + else if (env == "VBGR") + type = QPlatformScreen::Subpixel_VBGR; + else + type = QPlatformScreen::Subpixel_None; + } + + return static_cast(type); +} + QT_END_NAMESPACE diff --git a/src/gui/kernel/qplatformscreen.h b/src/gui/kernel/qplatformscreen.h index fdae339815..551cb788c9 100644 --- a/src/gui/kernel/qplatformscreen.h +++ b/src/gui/kernel/qplatformscreen.h @@ -74,6 +74,14 @@ class Q_GUI_EXPORT QPlatformScreen Q_DECLARE_PRIVATE(QPlatformScreen) public: + enum SubpixelAntialiasingType { // copied from qfontengine_p.h since we can't include private headers + Subpixel_None, + Subpixel_RGB, + Subpixel_BGR, + Subpixel_VRGB, + Subpixel_VBGR + }; + QPlatformScreen(); virtual ~QPlatformScreen(); @@ -107,6 +115,7 @@ public: virtual QString name() const { return QString(); } virtual QPlatformCursor *cursor() const; + virtual SubpixelAntialiasingType subpixelAntialiasingTypeHint() const; static int angleBetween(Qt::ScreenOrientation a, Qt::ScreenOrientation b); static QTransform transformBetween(Qt::ScreenOrientation a, Qt::ScreenOrientation b, const QRect &target); diff --git a/src/gui/text/qfontengine_ft_p.h b/src/gui/text/qfontengine_ft_p.h index bcd2efaef8..8fd5ca23af 100644 --- a/src/gui/text/qfontengine_ft_p.h +++ b/src/gui/text/qfontengine_ft_p.h @@ -305,6 +305,7 @@ protected: private: friend class QFontEngineFTRawFont; friend class QFontconfigDatabase; + friend class QBasicFontDatabase; friend class QFontEngineMultiFontConfig; int loadFlags(QGlyphSet *set, GlyphFormat format, int flags, bool &hsubpixel, int &vfactor) const; diff --git a/src/gui/text/qplatformfontdatabase.cpp b/src/gui/text/qplatformfontdatabase.cpp index 080bfecefb..3c3000da4d 100644 --- a/src/gui/text/qplatformfontdatabase.cpp +++ b/src/gui/text/qplatformfontdatabase.cpp @@ -34,6 +34,9 @@ #include "qplatformfontdatabase.h" #include #include +#include +#include +#include #include #include @@ -457,6 +460,15 @@ bool QPlatformFontDatabase::fontsAlwaysScalable() const return ret; } +QFontEngine::SubpixelAntialiasingType QPlatformFontDatabase::subpixelAntialiasingTypeHint() const +{ + static int type = -1; + if (type == -1) { + if (QScreen *screen = QGuiApplication::primaryScreen()) + type = screen->handle()->subpixelAntialiasingTypeHint(); + } + return static_cast(type); +} // ### copied to tools/makeqpf/qpf2.cpp diff --git a/src/gui/text/qplatformfontdatabase.h b/src/gui/text/qplatformfontdatabase.h index 56934b066a..0615df65d6 100644 --- a/src/gui/text/qplatformfontdatabase.h +++ b/src/gui/text/qplatformfontdatabase.h @@ -49,6 +49,7 @@ #include #include #include +#include #include QT_BEGIN_NAMESPACE @@ -107,6 +108,7 @@ public: virtual QString resolveFontFamilyAlias(const QString &family) const; virtual bool fontsAlwaysScalable() const; virtual QList standardSizes() const; + QFontEngine::SubpixelAntialiasingType subpixelAntialiasingTypeHint() const; // helper static QSupportedWritingSystems writingSystemsFromTrueTypeBits(quint32 unicodeRange[4], quint32 codePageRange[2]); diff --git a/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp b/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp index d5288aadc3..65cdabdf5b 100644 --- a/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp +++ b/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp @@ -101,9 +101,19 @@ QFontEngine *QBasicFontDatabase::fontEngine(const QFontDef &fontDef, void *usrPt fid.index = fontfile->indexValue; bool antialias = !(fontDef.styleStrategy & QFont::NoAntialias); - QFontEngineFT::GlyphFormat format = antialias? QFontEngineFT::Format_A8 : QFontEngineFT::Format_Mono; - QFontEngineFT *engine = new QFontEngineFT(fontDef); + QFontEngineFT::GlyphFormat format = QFontEngineFT::Format_Mono; + if (antialias) { + QFontEngine::SubpixelAntialiasingType subpixelType = subpixelAntialiasingTypeHint(); + if (subpixelType == QFontEngine::Subpixel_None || (fontDef.styleStrategy & QFont::NoSubpixelAntialias)) { + format = QFontEngineFT::Format_A8; + engine->subpixelType = QFontEngine::Subpixel_None; + } else { + format = QFontEngineFT::Format_A32; + engine->subpixelType = subpixelType; + } + } + if (!engine->init(fid, antialias, format) || engine->invalid()) { delete engine; engine = 0; diff --git a/src/plugins/platforms/windows/qwindowsscreen.cpp b/src/plugins/platforms/windows/qwindowsscreen.cpp index 4915c4f3be..059ebf19f6 100644 --- a/src/plugins/platforms/windows/qwindowsscreen.cpp +++ b/src/plugins/platforms/windows/qwindowsscreen.cpp @@ -39,6 +39,7 @@ #include "qtwindows_additional.h" +#include #include #include #include @@ -358,6 +359,37 @@ void QWindowsScreen::handleChanges(const QWindowsScreenData &newData) } } +/*! + \brief Queries ClearType settings to check the pixel layout +*/ +QPlatformScreen::SubpixelAntialiasingType QWindowsScreen::subpixelAntialiasingTypeHint() const +{ +#if defined(Q_OS_WINCE) || !defined(FT_LCD_FILTER_H) || !defined(FT_CONFIG_OPTION_SUBPIXEL_RENDERING) + return QPlatformScreen::Subpixel_None; +#else + QPlatformScreen::SubpixelAntialiasingType type = QPlatformScreen::subpixelAntialiasingTypeHint(); + if (type == QPlatformScreen::Subpixel_None) { + QSettings settings(QLatin1String("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Avalon.Graphics\\DISPLAY1"), QSettings::NativeFormat); + int registryValue = settings.value(QLatin1String("PixelStructure"), -1).toInt(); + switch (registryValue) { + case 0: + type = QPlatformScreen::Subpixel_None; + break; + case 1: + type = QPlatformScreen::Subpixel_RGB; + break; + case 2: + type = QPlatformScreen::Subpixel_BGR; + break; + default: + type = QPlatformScreen::Subpixel_None; + break; + } + } + return type; +#endif +} + /*! \class QWindowsScreenManager \brief Manages a list of QWindowsScreen. diff --git a/src/plugins/platforms/windows/qwindowsscreen.h b/src/plugins/platforms/windows/qwindowsscreen.h index 07b0d51971..b561f73804 100644 --- a/src/plugins/platforms/windows/qwindowsscreen.h +++ b/src/plugins/platforms/windows/qwindowsscreen.h @@ -100,6 +100,7 @@ public: static QWindow *windowAt(const QPoint &point, unsigned flags); QPixmap grabWindow(WId window, int qX, int qY, int qWidth, int qHeight) const Q_DECL_OVERRIDE; + QPlatformScreen::SubpixelAntialiasingType subpixelAntialiasingTypeHint() const Q_DECL_OVERRIDE; inline void handleChanges(const QWindowsScreenData &newData); -- cgit v1.2.3