From f0cee4568ec3bd58cbc33108a6e606c3294e0fb3 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Thu, 9 Apr 2015 08:58:32 +0200 Subject: Add a null pointer check for parent before derefencing it Change-Id: I5b411f50acc6719b36cdde9ae2dd766b29e9731c Reviewed-by: Friedemann Kleint --- src/printsupport/dialogs/qpagesetupdialog_win.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/printsupport') diff --git a/src/printsupport/dialogs/qpagesetupdialog_win.cpp b/src/printsupport/dialogs/qpagesetupdialog_win.cpp index baa8f93454..84cdf8f976 100644 --- a/src/printsupport/dialogs/qpagesetupdialog_win.cpp +++ b/src/printsupport/dialogs/qpagesetupdialog_win.cpp @@ -94,7 +94,7 @@ int QPageSetupDialog::exec() parent = parent ? parent->window() : QApplication::activeWindow(); Q_ASSERT(!parent ||parent->testAttribute(Qt::WA_WState_Created)); - QWindow *parentWindow = parent->windowHandle(); + QWindow *parentWindow = parent ? parent->windowHandle() : 0; psd.hwndOwner = parentWindow ? (HWND)QGuiApplication::platformNativeInterface()->nativeResourceForWindow("handle", parentWindow) : 0; psd.Flags = PSD_MARGINS; -- cgit v1.2.3 From 7e721d24d7828097ad5cdabcf8371edb3b0ca969 Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Thu, 2 Apr 2015 01:15:34 +0400 Subject: [QWin32PrintEngine] Do not do any language-specific processing ...and simply use the glyph indices provided by the QTextItemInt (since we always provide the glyph indices, even for non-TTFs). Task-number: QTBUG-40683 Change-Id: I276e9c6831a770e888f9ba0640353d20711a3d02 Reviewed-by: Lars Knoll --- src/printsupport/kernel/qprintengine_win.cpp | 36 +++++++--------------------- 1 file changed, 8 insertions(+), 28 deletions(-) (limited to 'src/printsupport') diff --git a/src/printsupport/kernel/qprintengine_win.cpp b/src/printsupport/kernel/qprintengine_win.cpp index 910c6c1514..731e923b2b 100644 --- a/src/printsupport/kernel/qprintengine_win.cpp +++ b/src/printsupport/kernel/qprintengine_win.cpp @@ -69,7 +69,7 @@ extern QMarginsF qt_convertMargins(const QMarginsF &margins, QPageLayout::Unit f // #define QT_DEBUG_METRICS static void draw_text_item_win(const QPointF &_pos, const QTextItemInt &ti, HDC hdc, - bool convertToText, const QTransform &xform, const QPointF &topLeft); + const QTransform &xform, const QPointF &topLeft); QWin32PrintEngine::QWin32PrintEngine(QPrinter::PrinterMode mode) : QAlphaPaintEngine(*(new QWin32PrintEnginePrivate), @@ -309,27 +309,12 @@ void QWin32PrintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem return ; } - // We only want to convert the glyphs to text if the entire string is compatible with ASCII - // and if we actually have access to the chars. - bool convertToText = ti.chars != 0; - for (int i=0; i < ti.num_chars; ++i) { - if (ti.chars[i].unicode() >= 0x80) { - convertToText = false; - break; - } - - if (ti.logClusters[i] != i) { - convertToText = false; - break; - } - } - COLORREF cf = RGB(qRed(brushColor), qGreen(brushColor), qBlue(brushColor)); SelectObject(d->hdc, CreateSolidBrush(cf)); SelectObject(d->hdc, CreatePen(PS_SOLID, 1, cf)); SetTextColor(d->hdc, cf); - draw_text_item_win(p, ti, d->hdc, convertToText, d->matrix, QPointF(0.0, 0.0)); + draw_text_item_win(p, ti, d->hdc, d->matrix, QPointF(0.0, 0.0)); DeleteObject(SelectObject(d->hdc,GetStockObject(HOLLOW_BRUSH))); DeleteObject(SelectObject(d->hdc,GetStockObject(BLACK_PEN))); } @@ -1682,7 +1667,7 @@ void QWin32PrintEnginePrivate::debugMetrics() const } static void draw_text_item_win(const QPointF &pos, const QTextItemInt &ti, HDC hdc, - bool convertToText, const QTransform &xform, const QPointF &topLeft) + const QTransform &xform, const QPointF &topLeft) { QPointF baseline_pos = xform.inverted().map(xform.map(pos) - topLeft); @@ -1692,24 +1677,20 @@ static void draw_text_item_win(const QPointF &pos, const QTextItemInt &ti, HDC h const bool has_kerning = ti.f && ti.f->kerning(); HFONT hfont = 0; - bool ttf = false; if (ti.fontEngine->type() == QFontEngine::Win) { const QVariantMap userData = ti.fontEngine->userData().toMap(); const QVariant hfontV = userData.value(QStringLiteral("hFont")); const QVariant ttfV = userData.value(QStringLiteral("trueType")); - if (ttfV.type() == QVariant::Bool && hfontV.canConvert()) { + if (ttfV.toBool() && 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; - wchar_t *convertedGlyphs = (wchar_t *)ti.chars; + unsigned int options = ETO_GLYPH_INDEX; QGlyphLayout glyphs = ti.glyphs; bool fast = !has_kerning && !(ti.flags & QTextItem::RightToLeft); @@ -1743,7 +1724,7 @@ static void draw_text_item_win(const QPointF &pos, const QTextItemInt &ti, HDC h ExtTextOut(hdc, qRound(baseline_pos.x() + glyphs.offsets[0].x.toReal()), qRound(baseline_pos.y() + glyphs.offsets[0].y.toReal()), - options, 0, convertToText ? convertedGlyphs : g.data(), glyphs.numGlyphs, 0); + options, 0, g.constData(), glyphs.numGlyphs, 0); } else { QVarLengthArray positions; QVarLengthArray _glyphs; @@ -1756,7 +1737,6 @@ static void draw_text_item_win(const QPointF &pos, const QTextItemInt &ti, HDC h return; } - convertToText = convertToText && glyphs.numGlyphs == _glyphs.size(); bool outputEntireItem = _glyphs.size() > 0; if (outputEntireItem) { @@ -1772,7 +1752,7 @@ static void draw_text_item_win(const QPointF &pos, const QTextItemInt &ti, HDC h glyphDistances[(_glyphs.size() - 1) * 2 + 1] = 0; g[_glyphs.size() - 1] = _glyphs[_glyphs.size() - 1]; ExtTextOut(hdc, qRound(positions[0].x), qRound(positions[0].y), options, 0, - convertToText ? convertedGlyphs : g.data(), _glyphs.size(), + g.constData(), _glyphs.size(), glyphDistances.data()); } else { int i = 0; @@ -1781,7 +1761,7 @@ static void draw_text_item_win(const QPointF &pos, const QTextItemInt &ti, HDC h ExtTextOut(hdc, qRound(positions[i].x), qRound(positions[i].y), options, 0, - convertToText ? convertedGlyphs + i : &g, 1, 0); + &g, 1, 0); ++i; } } -- cgit v1.2.3 From 336648aa1b2f5249749068989959238039f44033 Mon Sep 17 00:00:00 2001 From: Marko Kangas Date: Tue, 14 Apr 2015 09:42:56 +0300 Subject: Fix windows printing "invalid metric command" warning. Added missing PdmDevicePixelRatio return value to printEngine::metric. Change-Id: I40198208ff7c95aa30b0492c410b450a1ae16a30 Reviewed-by: Andy Shaw --- src/printsupport/kernel/qprintengine_win.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/printsupport') diff --git a/src/printsupport/kernel/qprintengine_win.cpp b/src/printsupport/kernel/qprintengine_win.cpp index 731e923b2b..b377401ed9 100644 --- a/src/printsupport/kernel/qprintengine_win.cpp +++ b/src/printsupport/kernel/qprintengine_win.cpp @@ -384,6 +384,9 @@ int QWin32PrintEngine::metric(QPaintDevice::PaintDeviceMetric m) const case QPaintDevice::PdmDepth: val = GetDeviceCaps(d->hdc, PLANES); break; + case QPaintDevice::PdmDevicePixelRatio: + val = 1; + break; default: qWarning("QPrinter::metric: Invalid metric command"); return 0; -- cgit v1.2.3 From 92ea91836eedcf34e09df6b2bd3c34f0468acc49 Mon Sep 17 00:00:00 2001 From: John Layt Date: Wed, 4 Jun 2014 16:40:05 +0100 Subject: QPrintDialog - Let OSX handle PDF printing If the user selects to Save as PDF in the native print dialog, then let OSX generate the PDF. Primarily this is to fix QTBUG-38820 where by setting the output mode to PdfFormat we prevent the native print dialog from being called again. This was a regression in 5.1. It also allows for smaller, better quality PDFs with the ability to select text until QTBUG-13826 / QTBUG-10094 fixes the font rendering. Once QTBUG-36112 is also fixed we can consider changing back to Qt's internal PDF support. See also QTBUG-36687 and QTBUG-26054 which are related. Task-number: QTBUG-38820 Change-Id: I74bd885902860ac70068ab25e95765c7f0ee911c Reviewed-by: Andy Shaw Reviewed-by: Shawn Rutledge --- src/printsupport/dialogs/qprintdialog_mac.mm | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'src/printsupport') diff --git a/src/printsupport/dialogs/qprintdialog_mac.mm b/src/printsupport/dialogs/qprintdialog_mac.mm index bc28350f6b..aec1e3babb 100644 --- a/src/printsupport/dialogs/qprintdialog_mac.mm +++ b/src/printsupport/dialogs/qprintdialog_mac.mm @@ -121,19 +121,22 @@ QT_USE_NAMESPACE if (dialog->maxPage() < dialog->toPage()) dialog->setFromTo(dialog->fromPage(), dialog->maxPage()); } - // Keep us in sync with file output - PMDestinationType dest; - // If the user selected print to file, the session has been - // changed behind our back and our d->ep->session object is a - // dangling pointer. Update it based on the "current" session + // Keep us in sync with chosen destination + PMDestinationType dest; PMSessionGetDestinationType(session, settings, &dest); if (dest == kPMDestinationFile) { + // QTBUG-38820 + // If user selected Print to File, leave OSX to generate the PDF, + // otherwise setting PdfFormat would prevent us showing dialog again. + // TODO Restore this when QTBUG-36112 is fixed. + /* QCFType file; PMSessionCopyDestinationLocation(session, settings, &file); UInt8 localFile[2048]; // Assuming there's a POSIX file system here. CFURLGetFileSystemRepresentation(file, true, localFile, sizeof(localFile)); printer->setOutputFileName(QString::fromUtf8(reinterpret_cast(localFile))); + */ } else { PMPrinter macPrinter; PMSessionGetCurrentPrinter(session, &macPrinter); -- cgit v1.2.3