OSX FreeType: Add support for sub pixel font rendering.
authorSérgio Martins <sergio.martins@kdab.com>
Wed, 10 Dec 2014 13:42:45 +0000 (13:42 +0000)
committerSérgio Martins <sergio.martins@kdab.com>
Fri, 14 Aug 2015 23:34:26 +0000 (23:34 +0000)
Task-number: QTBUG-42839
Change-Id: Iea4552d766936a55fd177e4287591d2715202d9c
Reviewed-by: Morten Johan Sørvig <morten.sorvig@theqtcompany.com>
src/gui/text/qfontengine_ft_p.h
src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
src/plugins/platforms/cocoa/qcocoaintegration.h
src/plugins/platforms/cocoa/qcocoaintegration.mm

index 4b32f078e5f4e8cab39b730a62eb3f226b297ad2..b81e51bf2e87f939b6586054988c06f6351d11c9 100644 (file)
@@ -307,6 +307,7 @@ private:
     friend class QFontEngineFTRawFont;
     friend class QFontconfigDatabase;
     friend class QBasicFontDatabase;
+    friend class QCoreTextFontDatabase;
     friend class QFontEngineMultiFontConfig;
 
     int loadFlags(QGlyphSet *set, GlyphFormat format, int flags, bool &hsubpixel, int &vfactor) const;
index 4c9c7b78db2e3285871c1213bacdcba24759e36a..1f000421cc02165d93e04bae72fbea8a5a1101f1 100644 (file)
@@ -986,10 +986,20 @@ QFontEngine *QCoreTextFontDatabase::freeTypeFontEngine(const QFontDef &fontDef,
     QFontEngine::FaceId faceId;
     faceId.filename = filename;
     const bool antialias = !(fontDef.styleStrategy & QFont::NoAntialias);
-    const QFontEngineFT::GlyphFormat format = antialias ? QFontEngineFT::Format_A8
-                                                        : QFontEngineFT::Format_Mono;
 
     QScopedPointer<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(faceId, antialias, format, fontData) || engine->invalid()) {
         qWarning() << "QCoreTextFontDatabase::freeTypefontEngine Failed to create engine";
         return Q_NULLPTR;
index 9e5dd3747ea025215bccc93a56d5f9cf9ff8f6a1..32a08dbb0d6078d22f26543ef2f27f18752164ab 100644 (file)
@@ -73,6 +73,7 @@ public:
     QPlatformCursor *cursor() const Q_DECL_OVERRIDE { return m_cursor; }
     QWindow *topLevelAt(const QPoint &point) const Q_DECL_OVERRIDE;
     QList<QPlatformScreen *> virtualSiblings() const Q_DECL_OVERRIDE { return m_siblings; }
+    QPlatformScreen::SubpixelAntialiasingType subpixelAntialiasingTypeHint() const Q_DECL_OVERRIDE;
 
     // ----------------------------------------------------
     // Additional methods
index 0b9a38b5603208974c73898daa0ae0f0fd6be4d4..2e6bfc95db7604b12c79825737f789f8ab28c71f 100644 (file)
@@ -142,6 +142,16 @@ qreal QCocoaScreen::devicePixelRatio() const
     return qreal(screen ? [screen backingScaleFactor] : 1.0);
 }
 
+QPlatformScreen::SubpixelAntialiasingType QCocoaScreen::subpixelAntialiasingTypeHint() const
+{
+    QPlatformScreen::SubpixelAntialiasingType type = QPlatformScreen::subpixelAntialiasingTypeHint();
+    if (type == QPlatformScreen::Subpixel_None) {
+        // Every OSX machine has RGB pixels unless a peculiar or rotated non-Apple screen is attached
+        type = QPlatformScreen::Subpixel_RGB;
+    }
+    return type;
+}
+
 QWindow *QCocoaScreen::topLevelAt(const QPoint &point) const
 {
     NSPoint screenPoint = qt_mac_flipPoint(point);