Fix font printing on Windows using the native engine.
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>
Mon, 14 May 2012 14:57:15 +0000 (16:57 +0200)
committerQt by Nokia <qt-info@nokia.com>
Tue, 15 May 2012 12:34:04 +0000 (14:34 +0200)
- Add HFONT, LOGFONT, trueType as properties of the
  Windows font engine, make it a real Q_OBJECT.
- Query properties in the Windows print engine and use the HFONT,
  LOGFONT there.

Change-Id: I5c35275b32ef6580d7fa15ed83c6e79e33dc3334
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
src/plugins/platforms/windows/qwindowsfontdatabase.cpp
src/plugins/platforms/windows/qwindowsfontengine.cpp
src/plugins/platforms/windows/qwindowsfontengine.h
src/printsupport/kernel/qprintengine_win.cpp

index 7e8c70e..814a6a9 100644 (file)
@@ -1115,6 +1115,12 @@ void QWindowsFontDatabase::populate(const QString &family)
 QWindowsFontDatabase::QWindowsFontDatabase() :
     m_fontEngineData(new QWindowsFontEngineData)
 {
+    // Properties accessed by QWin32PrintEngine (QtPrintSupport)
+    static const int hfontMetaTypeId = qRegisterMetaType<HFONT>();
+    static const int logFontMetaTypeId = qRegisterMetaType<LOGFONT>();
+    Q_UNUSED(hfontMetaTypeId)
+    Q_UNUSED(logFontMetaTypeId)
+
     if (QWindowsContext::verboseFonts)
         qDebug() << __FUNCTION__ << "Clear type: "
                  << m_fontEngineData->clearTypeEnabled << "gamma: "
index 801dba2..d8a1865 100644 (file)
@@ -283,7 +283,7 @@ int QWindowsFontEngine::getGlyphIndexes(const QChar *str, int numChars, QGlyphLa
 
 QWindowsFontEngine::QWindowsFontEngine(const QString &name,
                                HFONT _hfont, bool stockFontIn, LOGFONT lf,
-                               QSharedPointer<QWindowsFontEngineData> fontEngineData) :
+                               const QSharedPointer<QWindowsFontEngineData> &fontEngineData) :
     m_fontEngineData(fontEngineData),
     _name(name),
     hfont(_hfont),
@@ -1318,7 +1318,7 @@ void QWindowsMultiFontEngine::loadEngine(int at)
 
     const QString fam = fallbacks.at(at-1);
     QWindowsFontEngine *fe = static_cast<QWindowsFontEngine*>(engines.at(0));
-    LOGFONT lf = fe->logfont();
+    LOGFONT lf = fe->logFont();
     memcpy(lf.lfFaceName, fam.utf16(), sizeof(wchar_t) * qMin(fam.length() + 1, 32));  // 32 = Windows hard-coded
     HFONT hfont = CreateFontIndirect(&lf);
 
index c869095..b4c4463 100644 (file)
@@ -57,6 +57,7 @@
 
 #include <QtGui/QImage>
 #include <QtCore/QSharedPointer>
+#include <QtCore/QMetaType>
 
 #include "qtwindows_additional.h"
 
@@ -67,10 +68,14 @@ class QWindowsFontEngineData;
 
 class QWindowsFontEngine : public QFontEngine
 {
-    Q_DISABLE_COPY(QWindowsFontEngine)
+    Q_OBJECT
+    Q_PROPERTY(HFONT hFont READ hFont STORED false)
+    Q_PROPERTY(LOGFONT logFont READ logFont STORED false)
+    Q_PROPERTY(bool trueType READ trueType STORED false)
+
 public:
     QWindowsFontEngine(const QString &name, HFONT, bool, LOGFONT,
-                   QSharedPointer<QWindowsFontEngineData> fontEngineData);
+                       const QSharedPointer<QWindowsFontEngineData> &fontEngineData);
 
     ~QWindowsFontEngine();
     void initFontInfo(const QFontDef &request,
@@ -128,8 +133,13 @@ public:
 
     bool getOutlineMetrics(glyph_t glyph, const QTransform &t, glyph_metrics_t *metrics) const;
 
-    QSharedPointer<QWindowsFontEngineData> fontEngineData() const { return m_fontEngineData; }
-    LOGFONT logfont() const { return m_logfont; }
+    const QSharedPointer<QWindowsFontEngineData> &fontEngineData() const { return m_fontEngineData; }
+
+    // Properties accessed by QWin32PrintEngine (QtPrintSupport)
+    LOGFONT logFont() const { return m_logfont; }
+    HFONT hFont() const     { return hfont; }
+    bool trueType() const   { return ttf; }
+
     void setUniqueFamilyName(const QString &newName) { uniqueFamilyName = newName; }
 
 private:
@@ -176,5 +186,8 @@ public:
 
 QT_END_NAMESPACE
 
+Q_DECLARE_METATYPE(HFONT)
+Q_DECLARE_METATYPE(LOGFONT)
+
 #endif // QWINDOWSFONTENGINE_H
 
index 3c079e2..e0eec58 100644 (file)
 #include <qpa/qplatformpixmap.h>
 #include <private/qpicture_p.h>
 #include <private/qpixmap_raster_p.h>
+#include <QtCore/QMetaType>
+#include <QtCore/qt_windows.h>
+
+Q_DECLARE_METATYPE(HFONT)
+Q_DECLARE_METATYPE(LOGFONT)
 
 QT_BEGIN_NAMESPACE
 
@@ -349,22 +354,22 @@ void QWin32PrintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem
                     || d->txop >= QTransform::TxProject
                     || ti.fontEngine->type() != QFontEngine::Win;
 
-
-#if 0
     if (!fallBack) {
-        QFontEngineWin *fe = static_cast<QFontEngineWin *>(ti.fontEngine);
-
-        // Try selecting the font to see if we get a substitution font
-        SelectObject(d->hdc, fe->hfont);
-
-        if (GetDeviceCaps(d->hdc, TECHNOLOGY) != DT_CHARSTREAM) {
-            wchar_t n[64];
-            GetTextFace(d->hdc, 64, n);
-            fallBack = QString::fromWCharArray(n)
-                    != QString::fromWCharArray(fe->logfont.lfFaceName);
+        const QVariant hFontV = ti.fontEngine->property("hFont");
+        const QVariant logFontV = ti.fontEngine->property("logFont");
+        if (hFontV.canConvert<HFONT>() && logFontV.canConvert<LOGFONT>()) {
+            const HFONT hfont = hFontV.value<HFONT>();
+            const LOGFONT logFont = logFontV.value<LOGFONT>();
+            // Try selecting the font to see if we get a substitution font
+            SelectObject(d->hdc, hfont);
+            if (GetDeviceCaps(d->hdc, TECHNOLOGY) != DT_CHARSTREAM) {
+                wchar_t n[64];
+                GetTextFace(d->hdc, 64, n);
+                fallBack = QString::fromWCharArray(n)
+                    != QString::fromWCharArray(logFont.lfFaceName);
+            }
         }
     }
-#endif
 
 
     if (fallBack) {
@@ -1680,19 +1685,22 @@ static void draw_text_item_win(const QPointF &pos, const QTextItemInt &ti, HDC h
     SetTextAlign(hdc, TA_BASELINE);
     SetBkMode(hdc, TRANSPARENT);
 
-    bool has_kerning = ti.f && ti.f->kerning();
-//  ### TODO
-//    QFontEngineWin *winfe = (fe->type() == QFontEngine::Win) ? static_cast<QFontEngineWin *>(fe) : 0;
+    const bool has_kerning = ti.f && ti.f->kerning();
 
-    HFONT hfont;
+    HFONT hfont = 0;
     bool ttf = false;
 
-//    if (winfe) {
-//        hfont = winfe->hfont;
-//        ttf = winfe->ttf;
-//    } else {
+    if (ti.fontEngine->type() == QFontEngine::Win) {
+        const QVariant hfontV = ti.fontEngine->property("hFont");
+        const QVariant ttfV = ti.fontEngine->property("trueType");
+        if (ttfV.type() == QVariant::Bool && hfontV.canConvert<HFONT>()) {
+            hfont = hfontV.value<HFONT>();
+            ttf = ttfV.toBool();
+        }
+    }
+
+    if (!hfont)
         hfont = (HFONT)GetStockObject(ANSI_VAR_FONT);
-//    }
 
     HGDIOBJ old_font = SelectObject(hdc, hfont);
     unsigned int options = (ttf && !convertToText) ? ETO_GLYPH_INDEX : 0;