From 8b4bf5f81634aa113029ac72721ebd9143c9ed80 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 14 May 2012 16:57:15 +0200 Subject: Fix font printing on Windows using the native engine. - 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 Reviewed-by: Friedemann Kleint --- .../platforms/windows/qwindowsfontdatabase.cpp | 6 +++ .../platforms/windows/qwindowsfontengine.cpp | 4 +- src/plugins/platforms/windows/qwindowsfontengine.h | 21 +++++++-- src/printsupport/kernel/qprintengine_win.cpp | 52 +++++++++++++--------- 4 files changed, 55 insertions(+), 28 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp index 7e8c70ee44..814a6a930b 100644 --- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp +++ b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp @@ -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(); + static const int logFontMetaTypeId = qRegisterMetaType(); + Q_UNUSED(hfontMetaTypeId) + Q_UNUSED(logFontMetaTypeId) + if (QWindowsContext::verboseFonts) qDebug() << __FUNCTION__ << "Clear type: " << m_fontEngineData->clearTypeEnabled << "gamma: " diff --git a/src/plugins/platforms/windows/qwindowsfontengine.cpp b/src/plugins/platforms/windows/qwindowsfontengine.cpp index 801dba2e79..d8a18655bb 100644 --- a/src/plugins/platforms/windows/qwindowsfontengine.cpp +++ b/src/plugins/platforms/windows/qwindowsfontengine.cpp @@ -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 fontEngineData) : + const QSharedPointer &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(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); diff --git a/src/plugins/platforms/windows/qwindowsfontengine.h b/src/plugins/platforms/windows/qwindowsfontengine.h index c869095769..b4c4463e51 100644 --- a/src/plugins/platforms/windows/qwindowsfontengine.h +++ b/src/plugins/platforms/windows/qwindowsfontengine.h @@ -57,6 +57,7 @@ #include #include +#include #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 fontEngineData); + const QSharedPointer &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 fontEngineData() const { return m_fontEngineData; } - LOGFONT logfont() const { return m_logfont; } + const QSharedPointer &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 diff --git a/src/printsupport/kernel/qprintengine_win.cpp b/src/printsupport/kernel/qprintengine_win.cpp index 3c079e24f3..e0eec585fa 100644 --- a/src/printsupport/kernel/qprintengine_win.cpp +++ b/src/printsupport/kernel/qprintengine_win.cpp @@ -57,6 +57,11 @@ #include #include #include +#include +#include + +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(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() && logFontV.canConvert()) { + const HFONT hfont = hFontV.value(); + const LOGFONT logFont = logFontV.value(); + // 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(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 = hfontV.value(); + 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; -- cgit v1.2.3