diff options
-rw-r--r-- | src/gui/kernel/qplatformscreen.cpp | 27 | ||||
-rw-r--r-- | src/gui/kernel/qplatformscreen.h | 9 | ||||
-rw-r--r-- | src/gui/text/qfontengine_ft_p.h | 1 | ||||
-rw-r--r-- | src/gui/text/qplatformfontdatabase.cpp | 12 | ||||
-rw-r--r-- | src/gui/text/qplatformfontdatabase.h | 2 | ||||
-rw-r--r-- | src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp | 14 | ||||
-rw-r--r-- | src/plugins/platforms/windows/qwindowsscreen.cpp | 32 | ||||
-rw-r--r-- | src/plugins/platforms/windows/qwindowsscreen.h | 1 |
8 files changed, 96 insertions, 2 deletions
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<QPlatformScreen::SubpixelAntialiasingType>(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 <QtGui/private/qfontengine_p.h> #include <QtGui/private/qfontengine_qpf2_p.h> +#include <QtGui/QGuiApplication> +#include <QtGui/QScreen> +#include <qpa/qplatformscreen.h> #include <QtCore/QLibraryInfo> #include <QtCore/QDir> @@ -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<QFontEngine::SubpixelAntialiasingType>(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 <QtCore/QList> #include <QtCore/QHash> #include <QtGui/QFontDatabase> +#include <QtGui/private/qfontengine_p.h> #include <QtGui/private/qfont_p.h> QT_BEGIN_NAMESPACE @@ -107,6 +108,7 @@ public: virtual QString resolveFontFamilyAlias(const QString &family) const; virtual bool fontsAlwaysScalable() const; virtual QList<int> 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 <QtCore/QSettings> #include <QtGui/QPixmap> #include <QtGui/QGuiApplication> #include <qpa/qwindowsysteminterface.h> @@ -359,6 +360,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); |