diff options
Diffstat (limited to 'src/printsupport')
35 files changed, 461 insertions, 327 deletions
diff --git a/src/printsupport/CMakeLists.txt b/src/printsupport/CMakeLists.txt index 941b790d0c..25aad04caf 100644 --- a/src/printsupport/CMakeLists.txt +++ b/src/printsupport/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from printsupport.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## PrintSupport Module: @@ -11,7 +12,7 @@ qt_internal_add_module(PrintSupport kernel/qplatformprintdevice.cpp kernel/qplatformprintdevice.h kernel/qplatformprintersupport.cpp kernel/qplatformprintersupport.h kernel/qplatformprintplugin.cpp kernel/qplatformprintplugin.h - kernel/qprint_p.h + kernel/qprint.cpp kernel/qprint_p.h kernel/qprintdevice.cpp kernel/qprintdevice_p.h kernel/qprintengine.h kernel/qprintengine_pdf.cpp kernel/qprintengine_pdf_p.h @@ -19,8 +20,10 @@ qt_internal_add_module(PrintSupport kernel/qprinterinfo.cpp kernel/qprinterinfo.h kernel/qprinterinfo_p.h kernel/qtprintsupportglobal.h kernel/qtprintsupportglobal_p.h DEFINES + QT_NO_CONTEXTLESS_CONNECT QT_NO_FOREACH QT_NO_USING_NAMESPACE + QT_USE_NODISCARD_FILE_OPEN INCLUDE_DIRECTORIES dialogs widgets @@ -37,10 +40,13 @@ qt_internal_add_module(PrintSupport Qt::GuiPrivate Qt::WidgetsPrivate GENERATE_CPP_EXPORTS + QPA_HEADER_FILTERS + "(^|/)qplatform.+\\.h$" ) -#### Keys ignored in scope 1:.:.:printsupport.pro:<TRUE>: -# QMAKE_LIBS = "$$QMAKE_LIBS_PRINTSUPPORT" +if(WIN32) # Static plugin link errors + set_target_properties(PrintSupport PROPERTIES UNITY_BUILD OFF) +endif() ## Scopes: ##################################################################### @@ -55,7 +61,7 @@ qt_internal_extend_target(PrintSupport CONDITION MACOS ${FWApplicationServices} Cups::Cups NO_PCH_SOURCES - "platform/macos/qcocoaprintersupport.mm" + platform/macos/qcocoaprintersupport.mm ) qt_internal_extend_target(PrintSupport CONDITION WIN32 @@ -70,7 +76,7 @@ qt_internal_extend_target(PrintSupport CONDITION WIN32 comdlg32 winspool NO_PCH_SOURCES - "platform/windows/qwindowsprintersupport.cpp" + platform/windows/qwindowsprintersupport.cpp ) qt_internal_extend_target(PrintSupport CONDITION QT_FEATURE_printpreviewwidget @@ -180,6 +186,8 @@ qt_internal_extend_target(PrintSupport CONDITION QT_FEATURE_printdialog AND UNIX dialogs/qprintpropertieswidget.ui dialogs/qprintsettingsoutput.ui dialogs/qprintwidget.ui + NO_UNITY_BUILD_SOURCES + dialogs/qprintdialog_unix.cpp # Clashes with CUPS headers INCLUDE_DIRECTORIES ${QtBase_SOURCE_DIR}/src/plugins/printsupport/cups ENABLE_AUTOGEN_TOOLS diff --git a/src/printsupport/configure.cmake b/src/printsupport/configure.cmake index 4e2bb9e7de..2287789ac1 100644 --- a/src/printsupport/configure.cmake +++ b/src/printsupport/configure.cmake @@ -1,3 +1,6 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + #### Inputs @@ -28,6 +31,11 @@ qt_feature("cupsjobwidget" PUBLIC PRIVATE CONDITION ( QT_FEATURE_buttongroup ) AND ( QT_FEATURE_calendarwidget ) AND ( QT_FEATURE_checkbox ) AND ( QT_FEATURE_combobox ) AND ( QT_FEATURE_cups ) AND ( QT_FEATURE_datetimeedit ) AND ( QT_FEATURE_groupbox ) AND ( QT_FEATURE_tablewidget ) ) qt_feature_definition("cupsjobwidget" "QT_NO_CUPSJOBWIDGET" NEGATE VALUE "1") +qt_feature("cupspassworddialog" PRIVATE + SECTION "Widgets" + LABEL "CUPS password dialog" + CONDITION ( QT_FEATURE_dialogbuttonbox ) AND ( QT_FEATURE_formlayout ) AND ( QT_FEATURE_lineedit ) +) qt_feature("printer" PUBLIC SECTION "Painting" LABEL "QPrinter" @@ -46,7 +54,7 @@ qt_feature("printdialog" PUBLIC SECTION "Dialogs" LABEL "QPrintDialog" PURPOSE "Provides a dialog widget for specifying printer configuration." - CONDITION ( QT_FEATURE_buttongroup ) AND ( QT_FEATURE_checkbox ) AND ( QT_FEATURE_combobox ) AND ( QT_FEATURE_dialog ) AND ( QT_FEATURE_datetimeedit ) AND ( QT_FEATURE_dialogbuttonbox ) AND ( QT_FEATURE_printer ) AND ( QT_FEATURE_radiobutton ) AND ( QT_FEATURE_spinbox ) AND ( QT_FEATURE_tabwidget ) AND ( QT_FEATURE_treeview ) + CONDITION ( QT_FEATURE_buttongroup ) AND ( QT_FEATURE_checkbox ) AND ( QT_FEATURE_combobox ) AND ( QT_FEATURE_dialog ) AND ( QT_FEATURE_datetimeedit ) AND ( QT_FEATURE_dialogbuttonbox ) AND ( QT_FEATURE_formlayout ) AND ( QT_FEATURE_printer ) AND ( QT_FEATURE_radiobutton ) AND ( QT_FEATURE_spinbox ) AND ( QT_FEATURE_tabwidget ) AND ( QT_FEATURE_treeview ) ) qt_feature_definition("printdialog" "QT_NO_PRINTDIALOG" NEGATE VALUE "1") qt_feature("printpreviewdialog" PUBLIC diff --git a/src/printsupport/dialogs/qabstractprintdialog_p.h b/src/printsupport/dialogs/qabstractprintdialog_p.h index baf6027c10..40f25d454a 100644 --- a/src/printsupport/dialogs/qabstractprintdialog_p.h +++ b/src/printsupport/dialogs/qabstractprintdialog_p.h @@ -20,6 +20,8 @@ #include "private/qdialog_p.h" #include "QtPrintSupport/qabstractprintdialog.h" +#include <QtCore/qpointer.h> + QT_REQUIRE_CONFIG(printdialog); QT_BEGIN_NAMESPACE diff --git a/src/printsupport/dialogs/qpagesetupdialog_mac.mm b/src/printsupport/dialogs/qpagesetupdialog_mac.mm index c75609c43c..046a1021af 100644 --- a/src/printsupport/dialogs/qpagesetupdialog_mac.mm +++ b/src/printsupport/dialogs/qpagesetupdialog_mac.mm @@ -13,6 +13,8 @@ #include <QtPrintSupport/private/qprintengine_mac_p.h> +#include <QtCore/private/qcore_mac_p.h> + QT_USE_NAMESPACE @class QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate); diff --git a/src/printsupport/dialogs/qpagesetupdialog_unix.cpp b/src/printsupport/dialogs/qpagesetupdialog_unix.cpp index 176037d6ce..6c65eafc21 100644 --- a/src/printsupport/dialogs/qpagesetupdialog_unix.cpp +++ b/src/printsupport/dialogs/qpagesetupdialog_unix.cpp @@ -264,7 +264,7 @@ void QPageSetupWidget::initUnits() m_ui.unitCombo->addItem(tr("Didot (DD)"), QVariant::fromValue(QPageLayout::Didot)); m_ui.unitCombo->addItem(tr("Cicero (CC)"), QVariant::fromValue(QPageLayout::Cicero)); - // Initailly default to locale measurement system, mm if metric, in otherwise + // Initially default to locale measurement system, mm if metric, in otherwise m_ui.unitCombo->setCurrentIndex(QLocale().measurementSystem() != QLocale::MetricSystem); } diff --git a/src/printsupport/dialogs/qpagesetupdialog_win.cpp b/src/printsupport/dialogs/qpagesetupdialog_win.cpp index d7004ec3f1..1d2fdc98b7 100644 --- a/src/printsupport/dialogs/qpagesetupdialog_win.cpp +++ b/src/printsupport/dialogs/qpagesetupdialog_win.cpp @@ -20,7 +20,7 @@ QPageSetupDialog::QPageSetupDialog(QPrinter *printer, QWidget *parent) } QPageSetupDialog::QPageSetupDialog(QWidget *parent) - : QDialog(*(new QPageSetupDialogPrivate(0)), parent) + : QDialog(*(new QPageSetupDialogPrivate(nullptr)), parent) { setWindowTitle(QCoreApplication::translate("QPrintPreviewDialog", "Page Setup")); setAttribute(Qt::WA_DontShowOnScreen); @@ -41,7 +41,7 @@ int QPageSetupDialog::exec() psd.lStructSize = sizeof(PAGESETUPDLG); // we need a temp DEVMODE struct if we don't have a global DEVMODE - HGLOBAL hDevMode = 0; + HGLOBAL hDevMode = nullptr; int devModeSize = 0; if (!engine->globalDevMode()) { devModeSize = sizeof(DEVMODE) + ep->devMode->dmDriverExtra; @@ -63,9 +63,10 @@ int QPageSetupDialog::exec() parent = parent ? parent->window() : QApplication::activeWindow(); Q_ASSERT(!parent ||parent->testAttribute(Qt::WA_WState_Created)); - QWindow *parentWindow = parent ? parent->windowHandle() : 0; - psd.hwndOwner = parentWindow ? (HWND)QGuiApplication::platformNativeInterface()->nativeResourceForWindow("handle", parentWindow) : 0; - + QWindow *parentWindow = parent ? parent->windowHandle() : nullptr; + psd.hwndOwner = parentWindow + ? HWND(QGuiApplication::platformNativeInterface()->nativeResourceForWindow("handle", parentWindow)) + : nullptr; psd.Flags = PSD_MARGINS; QPageLayout layout = d->printer->pageLayout(); switch (layout.units()) { @@ -122,10 +123,10 @@ int QPageSetupDialog::exec() pageSize = QPageSize(unitSize, layout.units() == QPageLayout::Inch ? QPageSize::Inch : QPageSize::Millimeter); } - layout.setPageSize(pageSize); + layout.setPageSize(pageSize, layout.minimumMargins()); const QMarginsF margins(psd.rtMargin.left, psd.rtMargin.top, psd.rtMargin.right, psd.rtMargin.bottom); - layout.setMargins(margins / multiplier); + layout.setMargins(margins / multiplier, QPageLayout::OutOfBoundsPolicy::Clamp); d->printer->setPageLayout(layout); // copy from our temp DEVMODE struct @@ -133,7 +134,8 @@ int QPageSetupDialog::exec() // Make sure memory is allocated if (ep->ownsDevMode && ep->devMode) free(ep->devMode); - ep->devMode = (DEVMODE *) malloc(devModeSize); + ep->devMode = reinterpret_cast<DEVMODE *>(malloc(devModeSize)); + QWin32PrintEnginePrivate::initializeDevMode(ep->devMode); ep->ownsDevMode = true; // Copy diff --git a/src/printsupport/dialogs/qprintdialog_mac.mm b/src/printsupport/dialogs/qprintdialog_mac.mm index fc2432240d..fa4fac1884 100644 --- a/src/printsupport/dialogs/qprintdialog_mac.mm +++ b/src/printsupport/dialogs/qprintdialog_mac.mm @@ -118,7 +118,7 @@ QT_USE_NAMESPACE // happen synchronously after the dialog is accepted, so we can defer // the opening of the file to the next runloop pass. dispatch_async(dispatch_get_main_queue(), ^{ - [NSWorkspace.sharedWorkspace openFile:fileName.toNSString()]; + [NSWorkspace.sharedWorkspace openURL:[NSURL fileURLWithPath:fileName.toNSString()]]; }); } else if (dest == kPMDestinationProcessPDF) { qWarning("Printing workflows are not supported"); @@ -187,7 +187,13 @@ void QPrintDialogPrivate::openCocoaPrintPanel(Qt::WindowModality modality) printInfo = static_cast<QMacPrintEngine *>(printer->printEngine())->printInfo(); [printInfo retain]; } else { - printInfo = [NSPrintInfo.sharedPrintInfo retain]; + const QPageLayout pageLayout = printer->pageLayout(); + // initialize the printInfo using the dictionary from the application-wide print info + const auto dictionary = [NSPrintInfo.sharedPrintInfo dictionary]; + printInfo = [[NSPrintInfo alloc] initWithDictionary:dictionary]; + printInfo.orientation = pageLayout.orientation() == QPageLayout::Landscape + ? NSPaperOrientationLandscape : NSPaperOrientationPortrait; + printInfo.paperSize = pageLayout.pageSize().size(QPageSize::Point).toCGSize(); } // It seems the only way that PM lets you use all is if the minimum @@ -232,8 +238,8 @@ void QPrintDialogPrivate::openCocoaPrintPanel(Qt::WindowModality modality) int rval = [printPanel runModalWithPrintInfo:printInfo]; [delegate printPanelDidEnd:printPanel returnCode:rval contextInfo:q]; } else { - Q_ASSERT(q->parentWidget()); - QWindow *parentWindow = q->parentWidget()->windowHandle(); + Q_ASSERT(q->window()); + QWindow *parentWindow = q->window()->windowHandle(); NSWindow *window = static_cast<NSWindow *>(qApp->platformNativeInterface()->nativeResourceForWindow("nswindow", parentWindow)); [printPanel beginSheetWithPrintInfo:printInfo modalForWindow:window @@ -265,6 +271,7 @@ QPrintDialog::QPrintDialog(QWidget *parent) QPrintDialog::~QPrintDialog() { + hide(); } int QPrintDialog::exec() diff --git a/src/printsupport/dialogs/qprintdialog_unix.cpp b/src/printsupport/dialogs/qprintdialog_unix.cpp index 96ba73d5fa..aab5e2c7f0 100644 --- a/src/printsupport/dialogs/qprintdialog_unix.cpp +++ b/src/printsupport/dialogs/qprintdialog_unix.cpp @@ -83,7 +83,7 @@ Print dialog class declarations Layout in qprintpropertieswidget.ui */ -static void initResources() +static void _q_pdu_initResources() { Q_INIT_RESOURCE(qprintdialog); } @@ -322,7 +322,7 @@ void QPrintPropertiesDialog::reject() void QPrintPropertiesDialog::accept() { -#if QT_CONFIG(cups) +#if QT_CONFIG(cups) && QT_CONFIG(messagebox) if (widget.pageSetup->hasPpdConflict()) { widget.tabs->setCurrentWidget(widget.tabPage); const QMessageBox::StandardButton answer = QMessageBox::warning(this, tr("Page Setup Conflicts"), @@ -584,7 +584,7 @@ QPrintDialogPrivate::QPrintDialogPrivate() : top(nullptr), bottom(nullptr), buttons(nullptr), collapseButton(nullptr), explicitDuplexMode(QPrint::DuplexAuto) { - initResources(); + _q_pdu_initResources(); } QPrintDialogPrivate::~QPrintDialogPrivate() @@ -675,7 +675,7 @@ void QPrintDialogPrivate::selectPrinter(const QPrinter::OutputFormat outputForma options.grayscale->setChecked(true); // duplex priorities to be as follows: - // 1) a user-selected duplex value in the dialog has highest prority + // 1) a user-selected duplex value in the dialog has highest priority // 2) duplex value set in the QPrinter QPrint::DuplexMode duplex; if (explicitDuplexMode != QPrint::DuplexAuto && supportedDuplexMode.contains(explicitDuplexMode)) @@ -990,7 +990,7 @@ int QPrintDialog::exec() void QPrintDialog::accept() { Q_D(QPrintDialog); -#if QT_CONFIG(cups) +#if QT_CONFIG(cups) && QT_CONFIG(messagebox) if (d->options.pagesRadioButton->isChecked() && printer()->pageRanges().isEmpty()) { QMessageBox::critical(this, tr("Invalid Pages Definition"), tr("%1 does not follow the correct syntax. Please use ',' to separate " @@ -1328,9 +1328,9 @@ QUnixPrintWidget::QUnixPrintWidget(QPrinter *printer, QWidget *parent) cur = home; else if (!cur.endsWith(u'/')) cur += u'/'; - if (QGuiApplication::platformName() == QStringLiteral("xcb")) { + if (QGuiApplication::platformName() == "xcb"_L1) { if (printer->docName().isEmpty()) { - cur += QStringLiteral("print.pdf"); + cur += "print.pdf"_L1; } else { #if QT_CONFIG(regularexpression) const QRegularExpression re(QStringLiteral("(.*)\\.\\S+")); @@ -1340,7 +1340,7 @@ QUnixPrintWidget::QUnixPrintWidget(QPrinter *printer, QWidget *parent) else #endif cur += printer->docName(); - cur += QStringLiteral(".pdf"); + cur += ".pdf"_L1; } } // xcb diff --git a/src/printsupport/dialogs/qprintdialog_win.cpp b/src/printsupport/dialogs/qprintdialog_win.cpp index 9d662d2e8e..6d8c2d0f4d 100644 --- a/src/printsupport/dialogs/qprintdialog_win.cpp +++ b/src/printsupport/dialogs/qprintdialog_win.cpp @@ -42,7 +42,7 @@ public: QWin32PrintEnginePrivate *ep; }; -static void qt_win_setup_PRINTDLGEX(PRINTDLGEX *pd, QWidget *parent, +static void qt_win_setup_PRINTDLGEX(PRINTDLGEX *pd, QWindow *parentWindow, QPrintDialog *pdlg, QPrintDialogPrivate *d, HGLOBAL *tempDevNames) { @@ -101,9 +101,12 @@ static void qt_win_setup_PRINTDLGEX(PRINTDLGEX *pd, QWidget *parent, if (d->ep->printToFile) pd->Flags |= PD_PRINTTOFILE; - Q_ASSERT(parent); - QWindow *parentWindow = parent->windowHandle(); - pd->hwndOwner = parentWindow ? (HWND)QGuiApplication::platformNativeInterface()->nativeResourceForWindow("handle", parentWindow) : 0; + + WId wId = parentWindow ? parentWindow->winId() : 0; + //QTBUG-118899 PrintDlg needs valid window handle in hwndOwner + //So in case there is no valid handle in the application, + //use the desktop as valid handle. + pd->hwndOwner = wId != 0 ? HWND(wId) : GetDesktopWindow(); pd->lpPageRanges[0].nFromPage = qMax(pdlg->fromPage(), pdlg->minPage()); pd->lpPageRanges[0].nToPage = (pdlg->toPage() > 0) ? qMin(pdlg->toPage(), pdlg->maxPage()) : 1; pd->nCopies = d->printer->copyCount(); @@ -182,15 +185,20 @@ int QPrintDialog::exec() int QPrintDialogPrivate::openWindowsPrintDialogModally() { Q_Q(QPrintDialog); - QWidget *parent = q->parentWidget(); - if (parent) - parent = parent->window(); - else - parent = QApplication::activeWindow(); - - // If there is no window, fall back to the print dialog itself - if (parent == 0) - parent = q; + QWindow *parentWindow = q->windowHandle() ? q->windowHandle()->transientParent() : nullptr; + if (!parentWindow) { + QWidget *parent = q->parentWidget(); + if (parent) + parent = parent->window(); + else + parent = QApplication::activeWindow(); + + // If there is no window, fall back to the print dialog itself + if (!parent) + parent = q; + + parentWindow = parent->windowHandle(); + } q->QDialog::setVisible(true); @@ -205,7 +213,7 @@ int QPrintDialogPrivate::openWindowsPrintDialogModally() memset(&pd, 0, sizeof(PRINTDLGEX)); pd.lStructSize = sizeof(PRINTDLGEX); pd.lpPageRanges = &pageRange; - qt_win_setup_PRINTDLGEX(&pd, parent, q, this, tempDevNames); + qt_win_setup_PRINTDLGEX(&pd, parentWindow, q, this, tempDevNames); do { done = true; diff --git a/src/printsupport/dialogs/qprintpreviewdialog.cpp b/src/printsupport/dialogs/qprintpreviewdialog.cpp index b1d5d8c38f..2028287b55 100644 --- a/src/printsupport/dialogs/qprintpreviewdialog.cpp +++ b/src/printsupport/dialogs/qprintpreviewdialog.cpp @@ -28,7 +28,9 @@ #include <QtWidgets/qformlayout.h> #include <QtWidgets/qlabel.h> -static void initResources() +#include <QtCore/qpointer.h> + +static void _q_ppd_initResources() { static bool resourcesInitialized = false; if (!resourcesInitialized) { @@ -61,7 +63,7 @@ public: { bool replacePercent = false; if (input.endsWith(u'%')) { - input = input.left(input.length() - 1); + input = input.left(input.size() - 1); replacePercent = true; } State state = QDoubleValidator::validate(input, pos); @@ -192,7 +194,7 @@ void QPrintPreviewDialogPrivate::init(QPrinter *_printer) { Q_Q(QPrintPreviewDialog); - initResources(); + _q_ppd_initResources(); if (_printer) { preview = new QPrintPreviewWidget(_printer, q); @@ -450,7 +452,7 @@ void QPrintPreviewDialogPrivate::updatePageNumLabel() Q_Q(QPrintPreviewDialog); int numPages = preview->pageCount(); - int maxChars = QString::number(numPages).length(); + int maxChars = QString::number(numPages).size(); pageNumLabel->setText(QString::fromLatin1("/ %1").arg(numPages)); int cyphersWidth = q->fontMetrics().horizontalAdvance(QString().fill(u'8', maxChars)); int maxWidth = pageNumEdit->minimumSizeHint().width() + cyphersWidth; diff --git a/src/printsupport/doc/qtprintsupport.qdocconf b/src/printsupport/doc/qtprintsupport.qdocconf index 1e72873e4d..f1b541bafb 100644 --- a/src/printsupport/doc/qtprintsupport.qdocconf +++ b/src/printsupport/doc/qtprintsupport.qdocconf @@ -41,5 +41,5 @@ imagedirs += images \ navigation.landingpage = "Qt Print Support" navigation.cppclassespage = "Qt Print Support C++ Classes" -# Fail the documentation build if there are more warnings than the limit +# Enforce zero documentation warnings warninglimit = 0 diff --git a/src/printsupport/doc/snippets/CMakeLists.txt b/src/printsupport/doc/snippets/CMakeLists.txt index 355b244644..bedcdbb662 100644 --- a/src/printsupport/doc/snippets/CMakeLists.txt +++ b/src/printsupport/doc/snippets/CMakeLists.txt @@ -1,3 +1,6 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + #! [cmake_use] find_package(Qt6 REQUIRED COMPONENTS PrintSupport) target_link_libraries(mytarget PRIVATE Qt6::PrintSupport) diff --git a/src/printsupport/doc/snippets/widgetprinting.cpp b/src/printsupport/doc/snippets/widgetprinting.cpp index 9f50db2782..cdcc66ea63 100644 --- a/src/printsupport/doc/snippets/widgetprinting.cpp +++ b/src/printsupport/doc/snippets/widgetprinting.cpp @@ -39,13 +39,16 @@ private slots: //! [0] QPainter painter; painter.begin(&printer); - double xscale = printer.pageRect().width() / double(myWidget->width()); - double yscale = printer.pageRect().height() / double(myWidget->height()); + const auto pageLayout = printer.pageLayout(); + const auto pageRect = pageLayout.paintRectPixels(printer.resolution()); + const auto paperRect = pageLayout.fullRectPixels(printer.resolution()); + double xscale = pageRect.width() / double(myWidget->width()); + double yscale = pageRect.height() / double(myWidget->height()); double scale = qMin(xscale, yscale); - painter.translate(printer.paperRect().x() + printer.pageRect().width()/2, - printer.paperRect().y() + printer.pageRect().height()/2); + painter.translate(pageRect.x() + paperRect.width() / 2., + pageRect.y() + paperRect.height() / 2.); painter.scale(scale, scale); - painter.translate(-width()/2, -height()/2); + painter.translate(-myWidget->width() / 2., -myWidget->height() / 2.); myWidget->render(&painter); //! [0] @@ -62,9 +65,8 @@ private slots: dialog.setWindowTitle(tr("Print Document")); if (editor->textCursor().hasSelection()) dialog.addEnabledOption(QAbstractPrintDialog::PrintSelection); - if (dialog.exec() != QDialog::Accepted) { + if (dialog.exec() != QDialog::Accepted) return; - } //! [1] editor->print(&printer); #endif diff --git a/src/printsupport/doc/src/qt6-changes.qdoc b/src/printsupport/doc/src/qt6-changes.qdoc index 5706aa4c7c..958301c9c7 100644 --- a/src/printsupport/doc/src/qt6-changes.qdoc +++ b/src/printsupport/doc/src/qt6-changes.qdoc @@ -5,7 +5,7 @@ \page printsupport-changes-qt6.html \title Changes to Qt Print Support \ingroup changes-qt-5-to-6 - \brief Migrate Qt Print Support to Qt 6. + \brief General API consolidation. Qt 6 is a result of the conscious effort to make the framework more efficient and easy to use. diff --git a/src/printsupport/kernel/qcups.cpp b/src/printsupport/kernel/qcups.cpp index 5d1d4e5c98..231b816499 100644 --- a/src/printsupport/kernel/qcups.cpp +++ b/src/printsupport/kernel/qcups.cpp @@ -89,8 +89,7 @@ static inline QString jobHoldToString(const QCUPSSupport::JobHoldUntil jobHold, case QCUPSSupport::NoHold: return QString(); } - Q_UNREACHABLE(); - return QString(); + Q_UNREACHABLE_RETURN(QString()); } QCUPSSupport::JobHoldUntilWithTime QCUPSSupport::parseJobHoldUntil(const QString &jobHoldUntil) @@ -110,9 +109,9 @@ QCUPSSupport::JobHoldUntilWithTime QCUPSSupport::parseJobHoldUntil(const QString } - QTime parsedTime = QTime::fromString(jobHoldUntil, QStringLiteral("h:m:s")); + QTime parsedTime = QTime::fromString(jobHoldUntil, u"h:m:s"); if (!parsedTime.isValid()) - parsedTime = QTime::fromString(jobHoldUntil, QStringLiteral("h:m")); + parsedTime = QTime::fromString(jobHoldUntil, u"h:m"); if (parsedTime.isValid()) { // CUPS time is in UTC, user expects local time, so get the equivalent QDateTime dateTimeUtc = QDateTime::currentDateTimeUtc(); @@ -176,8 +175,7 @@ static inline QString bannerPageToString(const QCUPSSupport::BannerPage bannerPa case QCUPSSupport::Secret: return QStringLiteral("secret"); case QCUPSSupport::TopSecret: return QStringLiteral("topsecret"); } - Q_UNREACHABLE(); - return QString(); + Q_UNREACHABLE_RETURN(QString()); } static inline QCUPSSupport::BannerPage stringToBannerPage(const QString &bannerPage) @@ -198,7 +196,7 @@ QCUPSSupport::JobSheets QCUPSSupport::parseJobSheets(const QString &jobSheets) JobSheets result; const QStringList parts = jobSheets.split(u','); - if (parts.count() == 2) { + if (parts.size() == 2) { result.startBannerPage = stringToBannerPage(parts[0]); result.endBannerPage = stringToBannerPage(parts[1]); } diff --git a/src/printsupport/kernel/qpaintengine_alpha.cpp b/src/printsupport/kernel/qpaintengine_alpha.cpp index 0334f7a27c..4c34457570 100644 --- a/src/printsupport/kernel/qpaintengine_alpha.cpp +++ b/src/printsupport/kernel/qpaintengine_alpha.cpp @@ -401,9 +401,9 @@ void QAlphaPaintEnginePrivate::addAlphaRect(const QRectF &rect) bool QAlphaPaintEnginePrivate::canSeeTroughBackground(bool somethingInRectHasAlpha, const QRectF &rect) const { if (somethingInRectHasAlpha) { - if (m_dirtyRects.count() != m_numberOfCachedRects) { - m_cachedDirtyRgn.setRects(m_dirtyRects.constData(), m_dirtyRects.count()); - m_numberOfCachedRects = m_dirtyRects.count(); + if (m_dirtyRects.size() != m_numberOfCachedRects) { + m_cachedDirtyRgn.setRects(m_dirtyRects.constData(), m_dirtyRects.size()); + m_numberOfCachedRects = m_dirtyRects.size(); } return m_cachedDirtyRgn.intersects(rect.toAlignedRect()); } diff --git a/src/printsupport/kernel/qplatformprintdevice.cpp b/src/printsupport/kernel/qplatformprintdevice.cpp index ac8628685d..a2ee51f887 100644 --- a/src/printsupport/kernel/qplatformprintdevice.cpp +++ b/src/printsupport/kernel/qplatformprintdevice.cpp @@ -75,6 +75,10 @@ bool QPlatformPrintDevice::isValidPageLayout(const QPageLayout &layout, int reso if (!supportedPageSize(layout.pageSize()).isValid()) return false; + // In fullpage mode, margins outside the printable area are valid + if (layout.mode() == QPageLayout::FullPageMode) + return true; + // Check the margins are valid QMarginsF pointMargins = layout.margins(QPageLayout::Point); QMarginsF printMargins = printableMargins(layout.pageSize(), layout.orientation(), resolution); @@ -127,7 +131,7 @@ QPageSize QPlatformPrintDevice::supportedPageSize(const QPageSize &pageSize) con // e.g. Windows defines DMPAPER_11X17 and DMPAPER_TABLOID with names "11x17" and "Tabloid", but both // map to QPageSize::Tabloid / PPD Key "Tabloid" / ANSI B Tabloid if (pageSize.id() != QPageSize::Custom) { - for (const QPageSize &ps : qAsConst(m_pageSizes)) { + for (const QPageSize &ps : std::as_const(m_pageSizes)) { if (ps.id() == pageSize.id() && ps.name() == pageSize.name()) return ps; } @@ -135,7 +139,7 @@ QPageSize QPlatformPrintDevice::supportedPageSize(const QPageSize &pageSize) con // Next try match on id only if not custom if (pageSize.id() != QPageSize::Custom) { - for (const QPageSize &ps : qAsConst(m_pageSizes)) { + for (const QPageSize &ps : std::as_const(m_pageSizes)) { if (ps.id() == pageSize.id()) return ps; } @@ -150,7 +154,7 @@ QPageSize QPlatformPrintDevice::supportedPageSize(QPageSize::PageSizeId pageSize if (!m_havePageSizes) loadPageSizes(); - for (const QPageSize &ps : qAsConst(m_pageSizes)) { + for (const QPageSize &ps : std::as_const(m_pageSizes)) { if (ps.id() == pageSizeId) return ps; } @@ -164,7 +168,7 @@ QPageSize QPlatformPrintDevice::supportedPageSize(const QString &pageName) const if (!m_havePageSizes) loadPageSizes(); - for (const QPageSize &ps : qAsConst(m_pageSizes)) { + for (const QPageSize &ps : std::as_const(m_pageSizes)) { if (ps.name() == pageName) return ps; } @@ -197,7 +201,7 @@ QPageSize QPlatformPrintDevice::supportedPageSizeMatch(const QPageSize &pageSize return pageSize; // Try to find a supported page size based on point size - for (const QPageSize &ps : qAsConst(m_pageSizes)) { + for (const QPageSize &ps : std::as_const(m_pageSizes)) { if (ps.sizePoints() == pageSize.sizePoints()) return ps; } diff --git a/src/printsupport/kernel/qplatformprintplugin.cpp b/src/printsupport/kernel/qplatformprintplugin.cpp index 79aaa5bb3c..c48e5f65bf 100644 --- a/src/printsupport/kernel/qplatformprintplugin.cpp +++ b/src/printsupport/kernel/qplatformprintplugin.cpp @@ -10,16 +10,16 @@ #ifndef QT_NO_PRINTER -QT_BEGIN_NAMESPACE - -using namespace Qt::StringLiterals; - #if defined(Q_OS_MACOS) Q_IMPORT_PLUGIN(QCocoaPrinterSupportPlugin) #elif defined(Q_OS_WIN) Q_IMPORT_PLUGIN(QWindowsPrinterSupportPlugin) #endif +QT_BEGIN_NAMESPACE + +using namespace Qt::StringLiterals; + Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader, (QPlatformPrinterSupportFactoryInterface_iid, "/printsupport"_L1, Qt::CaseInsensitive)) diff --git a/src/printsupport/kernel/qprint.cpp b/src/printsupport/kernel/qprint.cpp new file mode 100644 index 0000000000..755da40a08 --- /dev/null +++ b/src/printsupport/kernel/qprint.cpp @@ -0,0 +1,159 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qprint_p.h" + +QT_BEGIN_NAMESPACE + +#ifndef QT_NO_PRINTER + +// Note: PPD standard does not define a standard set of InputSlot keywords, +// it is a free form text field left to the PPD writer to decide, +// but it does suggest some names for consistency with the Windows enum. +static const InputSlotMap inputSlotMap[] = { + { QPrint::Upper, DMBIN_UPPER, "Upper" }, + { QPrint::Lower, DMBIN_LOWER, "Lower" }, + { QPrint::Middle, DMBIN_MIDDLE, "Middle" }, + { QPrint::Manual, DMBIN_MANUAL, "Manual" }, + { QPrint::Envelope, DMBIN_ENVELOPE, "Envelope" }, + { QPrint::EnvelopeManual, DMBIN_ENVMANUAL, "EnvelopeManual" }, + { QPrint::Auto, DMBIN_AUTO, "Auto" }, + { QPrint::Tractor, DMBIN_TRACTOR, "Tractor" }, + { QPrint::SmallFormat, DMBIN_SMALLFMT, "AnySmallFormat" }, + { QPrint::LargeFormat, DMBIN_LARGEFMT, "AnyLargeFormat" }, + { QPrint::LargeCapacity, DMBIN_LARGECAPACITY, "LargeCapacity" }, + { QPrint::Cassette, DMBIN_CASSETTE, "Cassette" }, + { QPrint::FormSource, DMBIN_FORMSOURCE, "FormSource" }, + { QPrint::Manual, DMBIN_MANUAL, "ManualFeed" }, + { QPrint::OnlyOne, DMBIN_ONLYONE, "OnlyOne" }, // = QPrint::Upper + { QPrint::CustomInputSlot, DMBIN_USER, "" } // Must always be last row +}; + +static const OutputBinMap outputBinMap[] = { + { QPrint::AutoOutputBin, "" }, // Not a PPD defined value, internal use only + { QPrint::UpperBin, "Upper" }, + { QPrint::LowerBin, "Lower" }, + { QPrint::RearBin, "Rear" }, + { QPrint::CustomOutputBin, "" } // Must always be last row +}; + +namespace QPrintUtils { + +QPrint::InputSlotId inputSlotKeyToInputSlotId(const QByteArray &key) +{ + for (int i = 0; inputSlotMap[i].id != QPrint::CustomInputSlot; ++i) { + if (inputSlotMap[i].key == key) + return inputSlotMap[i].id; + } + return QPrint::CustomInputSlot; +} + +QByteArray inputSlotIdToInputSlotKey(QPrint::InputSlotId id) +{ + for (int i = 0; inputSlotMap[i].id != QPrint::CustomInputSlot; ++i) { + if (inputSlotMap[i].id == id) + return QByteArray(inputSlotMap[i].key); + } + return QByteArray(); +} + +int inputSlotIdToWindowsId(QPrint::InputSlotId id) +{ + for (int i = 0; inputSlotMap[i].id != QPrint::CustomInputSlot; ++i) { + if (inputSlotMap[i].id == id) + return inputSlotMap[i].windowsId; + } + return 0; +} + +QPrint::OutputBinId outputBinKeyToOutputBinId(const QByteArray &key) +{ + for (int i = 0; outputBinMap[i].id != QPrint::CustomOutputBin; ++i) { + if (outputBinMap[i].key == key) + return outputBinMap[i].id; + } + return QPrint::CustomOutputBin; +} + +QByteArray outputBinIdToOutputBinKey(QPrint::OutputBinId id) +{ + for (int i = 0; outputBinMap[i].id != QPrint::CustomOutputBin; ++i) { + if (outputBinMap[i].id == id) + return QByteArray(outputBinMap[i].key); + } + return QByteArray(); +} + +QPrint::InputSlot paperBinToInputSlot(int windowsId, const QString &name) +{ + QPrint::InputSlot slot; + slot.name = name; + int i; + for (i = 0; inputSlotMap[i].id != QPrint::CustomInputSlot; ++i) { + if (inputSlotMap[i].windowsId == windowsId) { + slot.key = inputSlotMap[i].key; + slot.id = inputSlotMap[i].id; + slot.windowsId = inputSlotMap[i].windowsId; + return slot; + } + } + slot.key = inputSlotMap[i].key; + slot.id = inputSlotMap[i].id; + slot.windowsId = windowsId; + return slot; +} + +#if (defined Q_OS_MACOS) || (defined Q_OS_UNIX && QT_CONFIG(cups)) + +// PPD utilities shared by CUPS and Mac plugins requiring CUPS headers +// May turn into a proper internal QPpd class if enough shared between Mac and CUPS, +// but where would it live? Not in base module as don't want to link to CUPS. +// May have to have two copies in plugins to keep in sync. + +QPrint::InputSlot ppdChoiceToInputSlot(const ppd_choice_t &choice) +{ + QPrint::InputSlot input; + input.key = choice.choice; + input.name = QString::fromUtf8(choice.text); + input.id = inputSlotKeyToInputSlotId(input.key); + input.windowsId = inputSlotMap[input.id].windowsId; + return input; +} + +QPrint::OutputBin ppdChoiceToOutputBin(const ppd_choice_t &choice) +{ + QPrint::OutputBin output; + output.key = choice.choice; + output.name = QString::fromUtf8(choice.text); + output.id = outputBinKeyToOutputBinId(output.key); + return output; +} + +int parsePpdResolution(const QByteArray &value) +{ + if (value.isEmpty()) + return -1; + // value can be in form 600dpi or 600x600dpi + QByteArray result = value.split('x').at(0); + if (result.endsWith("dpi")) + result.chop(3); + return result.toInt(); +} + +QPrint::DuplexMode ppdChoiceToDuplexMode(const QByteArray &choice) +{ + if (choice == "DuplexTumble") + return QPrint::DuplexShortSide; + else if (choice == "DuplexNoTumble") + return QPrint::DuplexLongSide; + else // None or SimplexTumble or SimplexNoTumble + return QPrint::DuplexNone; +} + +#endif // Mac and CUPS PPD Utilities + +} + +#endif // QT_NO_PRINTER + +QT_END_NAMESPACE diff --git a/src/printsupport/kernel/qprint_p.h b/src/printsupport/kernel/qprint_p.h index 6e07c27c64..0a94aa8db3 100644 --- a/src/printsupport/kernel/qprint_p.h +++ b/src/printsupport/kernel/qprint_p.h @@ -1,3 +1,4 @@ +// Copyright (C) 2022 The Qt Company Ltd. // Copyright (C) 2014 John Layt <jlayt@kde.org> // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only @@ -67,6 +68,7 @@ namespace QPrint { DuplexShortSide }; + // Note: Keep in sync with QPrinter::ColorMode enum ColorMode { GrayScale, Color @@ -124,142 +126,32 @@ struct InputSlotMap { const char *key; }; -// Note: PPD standard does not define a standard set of InputSlot keywords, -// it is a free form text field left to the PPD writer to decide, -// but it does suggest some names for consistency with the Windows enum. -static const InputSlotMap inputSlotMap[] = { - { QPrint::Upper, DMBIN_UPPER, "Upper" }, - { QPrint::Lower, DMBIN_LOWER, "Lower" }, - { QPrint::Middle, DMBIN_MIDDLE, "Middle" }, - { QPrint::Manual, DMBIN_MANUAL, "Manual" }, - { QPrint::Envelope, DMBIN_ENVELOPE, "Envelope" }, - { QPrint::EnvelopeManual, DMBIN_ENVMANUAL, "EnvelopeManual" }, - { QPrint::Auto, DMBIN_AUTO, "Auto" }, - { QPrint::Tractor, DMBIN_TRACTOR, "Tractor" }, - { QPrint::SmallFormat, DMBIN_SMALLFMT, "AnySmallFormat" }, - { QPrint::LargeFormat, DMBIN_LARGEFMT, "AnyLargeFormat" }, - { QPrint::LargeCapacity, DMBIN_LARGECAPACITY, "LargeCapacity" }, - { QPrint::Cassette, DMBIN_CASSETTE, "Cassette" }, - { QPrint::FormSource, DMBIN_FORMSOURCE, "FormSource" }, - { QPrint::Manual, DMBIN_MANUAL, "ManualFeed" }, - { QPrint::OnlyOne, DMBIN_ONLYONE, "OnlyOne" }, // = QPrint::Upper - { QPrint::CustomInputSlot, DMBIN_USER, "" } // Must always be last row -}; - struct OutputBinMap { QPrint::OutputBinId id; const char *key; }; -static const OutputBinMap outputBinMap[] = { - { QPrint::AutoOutputBin, "" }, // Not a PPD defined value, internal use only - { QPrint::UpperBin, "Upper" }, - { QPrint::LowerBin, "Lower" }, - { QPrint::RearBin, "Rear" }, - { QPrint::CustomOutputBin, "" } // Must always be last row -}; - // Print utilities shared by print plugins -class QPrintUtils -{ - -public: - - static QPrint::InputSlotId inputSlotKeyToInputSlotId(const QByteArray &key) - { - for (int i = 0; inputSlotMap[i].id != QPrint::CustomInputSlot; ++i) { - if (inputSlotMap[i].key == key) - return inputSlotMap[i].id; - } - return QPrint::CustomInputSlot; - } - - static QByteArray inputSlotIdToInputSlotKey(QPrint::InputSlotId id) - { - for (int i = 0; inputSlotMap[i].id != QPrint::CustomInputSlot; ++i) { - if (inputSlotMap[i].id == id) - return QByteArray(inputSlotMap[i].key); - } - return QByteArray(); - } - - static int inputSlotIdToWindowsId(QPrint::InputSlotId id) - { - for (int i = 0; inputSlotMap[i].id != QPrint::CustomInputSlot; ++i) { - if (inputSlotMap[i].id == id) - return inputSlotMap[i].windowsId; - } - return 0; - } - - static QPrint::OutputBinId outputBinKeyToOutputBinId(const QByteArray &key) - { - for (int i = 0; outputBinMap[i].id != QPrint::CustomOutputBin; ++i) { - if (outputBinMap[i].key == key) - return outputBinMap[i].id; - } - return QPrint::CustomOutputBin; - } - - static QByteArray outputBinIdToOutputBinKey(QPrint::OutputBinId id) - { - for (int i = 0; outputBinMap[i].id != QPrint::CustomOutputBin; ++i) { - if (outputBinMap[i].id == id) - return QByteArray(outputBinMap[i].key); - } - return QByteArray(); - } - -#if (defined Q_OS_MACOS) || (defined Q_OS_UNIX && QT_CONFIG(cups)) - - // PPD utilities shared by CUPS and Mac plugins requiring CUPS headers - // May turn into a proper internal QPpd class if enough shared between Mac and CUPS, - // but where would it live? Not in base module as don't want to link to CUPS. - // May have to have two copies in plugins to keep in sync. - - static QPrint::InputSlot ppdChoiceToInputSlot(const ppd_choice_t &choice) - { - QPrint::InputSlot input; - input.key = choice.choice; - input.name = QString::fromUtf8(choice.text); - input.id = inputSlotKeyToInputSlotId(input.key); - input.windowsId = inputSlotMap[input.id].windowsId; - return input; - } - - static QPrint::OutputBin ppdChoiceToOutputBin(const ppd_choice_t &choice) - { - QPrint::OutputBin output; - output.key = choice.choice; - output.name = QString::fromUtf8(choice.text); - output.id = outputBinKeyToOutputBinId(output.key); - return output; - } - - static int parsePpdResolution(const QByteArray &value) - { - if (value.isEmpty()) - return -1; - // value can be in form 600dpi or 600x600dpi - QByteArray result = value.split('x').at(0); - if (result.endsWith("dpi")) - result.chop(3); - return result.toInt(); - } - - static QPrint::DuplexMode ppdChoiceToDuplexMode(const QByteArray &choice) - { - if (choice == "DuplexTumble") - return QPrint::DuplexShortSide; - else if (choice == "DuplexNoTumble") - return QPrint::DuplexLongSide; - else // None or SimplexTumble or SimplexNoTumble - return QPrint::DuplexNone; - } - -#endif // Mac and CUPS PPD Utilities - +namespace QPrintUtils { + +Q_PRINTSUPPORT_EXPORT QPrint::InputSlotId inputSlotKeyToInputSlotId(const QByteArray &key); +Q_PRINTSUPPORT_EXPORT QByteArray inputSlotIdToInputSlotKey(QPrint::InputSlotId id); +Q_PRINTSUPPORT_EXPORT int inputSlotIdToWindowsId(QPrint::InputSlotId id); +Q_PRINTSUPPORT_EXPORT QPrint::OutputBinId outputBinKeyToOutputBinId(const QByteArray &key); +Q_PRINTSUPPORT_EXPORT QByteArray outputBinIdToOutputBinKey(QPrint::OutputBinId id); +Q_PRINTSUPPORT_EXPORT QPrint::InputSlot paperBinToInputSlot(int windowsId, const QString &name); + +# if (defined Q_OS_MACOS) || (defined Q_OS_UNIX && QT_CONFIG(cups)) +// PPD utilities shared by CUPS and Mac plugins requiring CUPS headers +// May turn into a proper internal QPpd class if enough shared between Mac and CUPS, +// but where would it live? Not in base module as don't want to link to CUPS. +// May have to have two copies in plugins to keep in sync. +Q_PRINTSUPPORT_EXPORT QPrint::InputSlot ppdChoiceToInputSlot(const ppd_choice_t &choice); +Q_PRINTSUPPORT_EXPORT QPrint::OutputBin ppdChoiceToOutputBin(const ppd_choice_t &choice); +Q_PRINTSUPPORT_EXPORT int parsePpdResolution(const QByteArray &value); +Q_PRINTSUPPORT_EXPORT QPrint::DuplexMode ppdChoiceToDuplexMode(const QByteArray &choice); +# endif // Mac and CUPS PPD Utilities }; #endif // QT_NO_PRINTER diff --git a/src/printsupport/kernel/qprintengine_pdf.cpp b/src/printsupport/kernel/qprintengine_pdf.cpp index daf5010feb..3e50247186 100644 --- a/src/printsupport/kernel/qprintengine_pdf.cpp +++ b/src/printsupport/kernel/qprintengine_pdf.cpp @@ -104,7 +104,14 @@ void QPdfPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va d->collate = value.toBool(); break; case PPK_ColorMode: - d->grayscale = (QPrinter::ColorMode(value.toInt()) == QPrinter::GrayScale); + switch (QPrinter::ColorMode(value.toInt())) { + case QPrinter::GrayScale: + d->colorModel = QPdfEngine::ColorModel::Grayscale; + break; + case QPrinter::Color: + d->colorModel = QPdfEngine::ColorModel::Auto; + break; + } break; case PPK_Creator: d->creator = value.toString(); @@ -177,7 +184,8 @@ void QPdfPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va Q_ASSERT(margins.size() == 4); d->m_pageLayout.setUnits(QPageLayout::Point); d->m_pageLayout.setMargins(QMarginsF(margins.at(0).toReal(), margins.at(1).toReal(), - margins.at(2).toReal(), margins.at(3).toReal())); + margins.at(2).toReal(), margins.at(3).toReal()), + QPageLayout::OutOfBoundsPolicy::Clamp); break; } case PPK_QPageSize: { @@ -189,7 +197,7 @@ void QPdfPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va case PPK_QPageMargins: { QPair<QMarginsF, QPageLayout::Unit> pair = qvariant_cast<QPair<QMarginsF, QPageLayout::Unit> >(value); d->m_pageLayout.setUnits(pair.second); - d->m_pageLayout.setMargins(pair.first); + d->m_pageLayout.setMargins(pair.first, QPageLayout::OutOfBoundsPolicy::Clamp); break; } case PPK_QPageLayout: { @@ -221,7 +229,7 @@ QVariant QPdfPrintEngine::property(PrintEnginePropertyKey key) const ret = d->collate; break; case PPK_ColorMode: - ret = d->grayscale ? QPrinter::GrayScale : QPrinter::Color; + ret = d->printerColorMode(); break; case PPK_Creator: ret = d->creator; @@ -367,6 +375,22 @@ QPdfPrintEnginePrivate::~QPdfPrintEnginePrivate() { } +QPrinter::ColorMode QPdfPrintEnginePrivate::printerColorMode() const +{ + switch (colorModel) { + case QPdfEngine::ColorModel::RGB: + case QPdfEngine::ColorModel::CMYK: + case QPdfEngine::ColorModel::Auto: + return QPrinter::Color; + case QPdfEngine::ColorModel::Grayscale: + return QPrinter::GrayScale; + } + + Q_UNREACHABLE(); + return QPrinter::Color; +} + + QT_END_NAMESPACE #endif // QT_NO_PRINTER diff --git a/src/printsupport/kernel/qprintengine_pdf_p.h b/src/printsupport/kernel/qprintengine_pdf_p.h index ccef8215e1..dbf50080a4 100644 --- a/src/printsupport/kernel/qprintengine_pdf_p.h +++ b/src/printsupport/kernel/qprintengine_pdf_p.h @@ -79,6 +79,8 @@ public: QPdfPrintEnginePrivate(QPrinter::PrinterMode m); ~QPdfPrintEnginePrivate(); + QPrinter::ColorMode printerColorMode() const; + virtual bool openPrintDevice(); virtual void closePrintDevice(); diff --git a/src/printsupport/kernel/qprinter.cpp b/src/printsupport/kernel/qprinter.cpp index dba2d77b8d..10c4c681ba 100644 --- a/src/printsupport/kernel/qprinter.cpp +++ b/src/printsupport/kernel/qprinter.cpp @@ -129,6 +129,11 @@ QList<const QPicture *> QPrinterPrivate::previewPages() const return QList<const QPicture *>(); } +bool QPrinterPrivate::previewMode() const +{ + return (previewEngine != nullptr) && (previewEngine == printEngine); +} + void QPrinterPrivate::setPreviewMode(bool enable) { Q_Q(QPrinter); @@ -431,7 +436,7 @@ public: Note the difference between Point and DevicePixel. The Point unit is defined to be 1/72th of an inch, while the DevicePixel unit is - resolution dependant and is based on the actual pixels, or dots, on + resolution dependent and is based on the actual pixels, or dots, on the printer. */ @@ -1272,7 +1277,7 @@ QPrinter::PrinterState QPrinter::printerState() const return d->printEngine->printerState(); } -#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC) +#if defined(Q_OS_WIN) || defined(Q_QDOC) /*! Returns the supported paper sizes for this printer. @@ -1410,7 +1415,8 @@ int QPrinter::toPage() const void QPrinter::setFromTo(int from, int to) { d->pageRanges.clear(); - d->pageRanges.addRange(from, to); + if (from && to) + d->pageRanges.addRange(from, to); } /*! diff --git a/src/printsupport/kernel/qprinter.h b/src/printsupport/kernel/qprinter.h index 8a3f7a4539..c60f0eea1f 100644 --- a/src/printsupport/kernel/qprinter.h +++ b/src/printsupport/kernel/qprinter.h @@ -138,7 +138,7 @@ public: QList<int> supportedResolutions() const; -#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC) +#if defined(Q_OS_WIN) || defined(Q_QDOC) QList<PaperSource> supportedPaperSources() const; #endif diff --git a/src/printsupport/kernel/qprinter_p.h b/src/printsupport/kernel/qprinter_p.h index 3c6cf711b0..77dd5fb4bc 100644 --- a/src/printsupport/kernel/qprinter_p.h +++ b/src/printsupport/kernel/qprinter_p.h @@ -70,6 +70,7 @@ public: #if QT_CONFIG(printpreviewwidget) QList<const QPicture *> previewPages() const; void setPreviewMode(bool); + bool previewMode() const; #endif void setProperty(QPrintEngine::PrintEnginePropertyKey key, const QVariant &value); diff --git a/src/printsupport/kernel/qprinterinfo.cpp b/src/printsupport/kernel/qprinterinfo.cpp index 176c6d6428..59078b4df4 100644 --- a/src/printsupport/kernel/qprinterinfo.cpp +++ b/src/printsupport/kernel/qprinterinfo.cpp @@ -21,7 +21,7 @@ class QPrinterInfoPrivateDeleter public: static inline void cleanup(QPrinterInfoPrivate *d) { - if (d != shared_null) + if (d != &*shared_null) delete d; } }; @@ -70,7 +70,7 @@ QPrinterInfo::QPrinterInfo() Constructs a copy of \a other. */ QPrinterInfo::QPrinterInfo(const QPrinterInfo &other) - : d_ptr((other.d_ptr.data() == shared_null) ? shared_null : new QPrinterInfoPrivate(*other.d_ptr)) + : d_ptr((other.d_ptr.data() == shared_null) ? &*shared_null : new QPrinterInfoPrivate(*other.d_ptr)) { } diff --git a/src/printsupport/kernel/qprinterinfo.h b/src/printsupport/kernel/qprinterinfo.h index 98b9f2940e..f1b16e7ccb 100644 --- a/src/printsupport/kernel/qprinterinfo.h +++ b/src/printsupport/kernel/qprinterinfo.h @@ -8,7 +8,6 @@ #include <QtPrintSupport/qprinter.h> #include <QtCore/QList> -#include <QtCore/QPair> #include <QtGui/qpagesize.h> QT_BEGIN_NAMESPACE diff --git a/src/printsupport/platform/macos/qcocoaprintersupport.mm b/src/printsupport/platform/macos/qcocoaprintersupport.mm index 3570255529..ed03e87f29 100644 --- a/src/printsupport/platform/macos/qcocoaprintersupport.mm +++ b/src/printsupport/platform/macos/qcocoaprintersupport.mm @@ -94,8 +94,8 @@ QPlatformPrinterSupport *QCocoaPrinterSupportPlugin::create(const QString &key) return new QCocoaPrinterSupport(); } -#include "qcocoaprintersupport.moc" - QT_END_NAMESPACE +#include "qcocoaprintersupport.moc" + #endif //QT_NO_PRINTER diff --git a/src/printsupport/platform/macos/qpaintengine_mac.mm b/src/printsupport/platform/macos/qpaintengine_mac.mm index c38d8cdd66..27274f116e 100644 --- a/src/printsupport/platform/macos/qpaintengine_mac.mm +++ b/src/printsupport/platform/macos/qpaintengine_mac.mm @@ -48,7 +48,7 @@ CGImageRef qt_mac_create_imagemask(const QPixmap &pixmap, const QRectF &sr) { QImage image = pixmap.toImage(); if (image.format() != QImage::Format_ARGB32_Premultiplied) - image = image.convertToFormat(QImage::Format_ARGB32_Premultiplied); + image = std::move(image).convertToFormat(QImage::Format_ARGB32_Premultiplied); const int sx = qRound(sr.x()), sy = qRound(sr.y()), sw = qRound(sr.width()), sh = qRound(sr.height()); const qsizetype sbpr = image.bytesPerLine(); diff --git a/src/printsupport/platform/macos/qprintengine_mac.mm b/src/printsupport/platform/macos/qprintengine_mac.mm index 031f5b3146..d6eb71f66d 100644 --- a/src/printsupport/platform/macos/qprintengine_mac.mm +++ b/src/printsupport/platform/macos/qprintengine_mac.mm @@ -219,9 +219,9 @@ void QMacPrintEnginePrivate::initialize() if (!resolutions.isEmpty() && mode != QPrinter::ScreenResolution) { std::sort(resolutions.begin(), resolutions.end()); if (resolutions.count() > 1 && mode == QPrinter::HighResolution) - resolution.hRes = resolution.vRes = resolutions.last(); + resolution.hRes = resolution.vRes = resolutions.constLast(); else - resolution.hRes = resolution.vRes = resolutions.first(); + resolution.hRes = resolution.vRes = resolutions.constFirst(); if (resolution.hRes == 0) resolution.hRes = resolution.vRes = 600; } else { @@ -576,7 +576,8 @@ void QMacPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va QList<QVariant> margins(value.toList()); Q_ASSERT(margins.size() == 4); d->m_pageLayout.setMargins(QMarginsF(margins.at(0).toReal(), margins.at(1).toReal(), - margins.at(2).toReal(), margins.at(3).toReal())); + margins.at(2).toReal(), margins.at(3).toReal()), + QPageLayout::OutOfBoundsPolicy::Clamp); break; } case PPK_QPageSize: @@ -585,7 +586,7 @@ void QMacPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va case PPK_QPageMargins: { QPair<QMarginsF, QPageLayout::Unit> pair = value.value<QPair<QMarginsF, QPageLayout::Unit> >(); d->m_pageLayout.setUnits(pair.second); - d->m_pageLayout.setMargins(pair.first); + d->m_pageLayout.setMargins(pair.first, QPageLayout::OutOfBoundsPolicy::Clamp); break; } case PPK_QPageLayout: { @@ -595,7 +596,7 @@ void QMacPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va setProperty(PPK_FullPage, pageLayout.mode() == QPageLayout::FullPageMode); setProperty(PPK_Orientation, QVariant::fromValue(pageLayout.orientation())); d->m_pageLayout.setUnits(pageLayout.units()); - d->m_pageLayout.setMargins(pageLayout.margins()); + d->m_pageLayout.setMargins(pageLayout.margins(), QPageLayout::OutOfBoundsPolicy::Clamp); } break; } diff --git a/src/printsupport/platform/windows/qprintengine_win.cpp b/src/printsupport/platform/windows/qprintengine_win.cpp index d6dd5eae5c..fa8d03a615 100644 --- a/src/printsupport/platform/windows/qprintengine_win.cpp +++ b/src/printsupport/platform/windows/qprintengine_win.cpp @@ -30,10 +30,10 @@ #include <QtCore/QMetaType> #include <QtCore/qt_windows.h> #include <QtGui/qpagelayout.h> +#include <QtGui/private/qpixmap_win_p.h> QT_BEGIN_NAMESPACE -Q_GUI_EXPORT HBITMAP qt_pixmapToWinHBITMAP(const QPixmap &p, int hbitmapFormat = 0); extern QPainterPath qt_regionToPath(const QRegion ®ion); extern QMarginsF qt_convertMargins(const QMarginsF &margins, QPageLayout::Unit fromUnits, QPageLayout::Unit toUnits); @@ -259,7 +259,7 @@ void QWin32PrintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem if (!fallBack) { bool deleteFont = false; - HFONT hfont = NULL; + HFONT hfont = nullptr; if (ti.fontEngine->type() == QFontEngine::Win) { hfont = static_cast<HFONT>(ti.fontEngine->handle()); } @@ -433,7 +433,7 @@ void QWin32PrintEngine::updateClipPath(const QPainterPath &clipPath, Qt::ClipOpe bool doclip = true; if (op == Qt::NoClip) { - SelectClipRgn(d->hdc, 0); + SelectClipRgn(d->hdc, nullptr); doclip = false; } @@ -561,6 +561,7 @@ void QWin32PrintEngine::drawPixmap(const QRectF &targetRect, QImage img(QSize(imgw, imgh), QImage::Format_RGB32); + img.setDevicePixelRatio(pixmap.devicePixelRatio()); img.fill(Qt::white); QPainter painter(&img); painter.drawPixmap(0,0, pixmap, tileSize * x, tileSize * y, imgw, imgh); @@ -721,7 +722,7 @@ void QWin32PrintEnginePrivate::strokePath_dev(const QPainterPath &path, const QC joinStyle = PS_JOIN_ROUND; HPEN pen = ExtCreatePen(PS_GEOMETRIC | PS_SOLID | capStyle | joinStyle, - (penWidth == 0) ? 1 : penWidth, &brush, 0, 0); + (penWidth == 0) ? 1 : penWidth, &brush, 0, nullptr); HGDIOBJ old_pen = SelectObject(hdc, pen); StrokePath(hdc); @@ -841,7 +842,8 @@ void QWin32PrintEnginePrivate::initialize() txop = QTransform::TxNone; QString printerName = m_printDevice.id(); - bool ok = OpenPrinter((LPWSTR)printerName.utf16(), (LPHANDLE)&hPrinter, 0); + bool ok = OpenPrinter(reinterpret_cast<LPWSTR>(const_cast<ushort *>(printerName.utf16())), + reinterpret_cast<LPHANDLE>(&hPrinter), nullptr); if (!ok) { qErrnoWarning("QWin32PrintEngine::initialize: OpenPrinter failed"); return; @@ -850,10 +852,10 @@ void QWin32PrintEnginePrivate::initialize() // Fetch the PRINTER_INFO_2 with DEVMODE data containing the // printer settings. DWORD infoSize, numBytes; - GetPrinter(hPrinter, 2, NULL, 0, &infoSize); + GetPrinter(hPrinter, 2, nullptr, 0, &infoSize); hMem = GlobalAlloc(GHND, infoSize); - pInfo = (PRINTER_INFO_2*) GlobalLock(hMem); - ok = GetPrinter(hPrinter, 2, (LPBYTE)pInfo, infoSize, &numBytes); + pInfo = reinterpret_cast<PRINTER_INFO_2*>(GlobalLock(hMem)); + ok = GetPrinter(hPrinter, 2, reinterpret_cast<LPBYTE>(pInfo), infoSize, &numBytes); if (!ok) { qErrnoWarning("QWin32PrintEngine::initialize: GetPrinter failed"); @@ -871,23 +873,26 @@ void QWin32PrintEnginePrivate::initialize() // Attempt to get the DEVMODE a different way. // Allocate the required buffer - LONG result = DocumentProperties(NULL, hPrinter, (LPWSTR)printerName.utf16(), - NULL, NULL, 0); - devMode = (DEVMODE *) malloc(result); + auto *lpwPrinterName = reinterpret_cast<LPWSTR>(const_cast<ushort *>(printerName.utf16())); + LONG result = DocumentProperties(nullptr, hPrinter, lpwPrinterName, + nullptr, nullptr, 0); + devMode = reinterpret_cast<DEVMODE *>(malloc(result)); + initializeDevMode(devMode); ownsDevMode = true; // Get the default DevMode - result = DocumentProperties(NULL, hPrinter, (LPWSTR)printerName.utf16(), - devMode, NULL, DM_OUT_BUFFER); + result = DocumentProperties(nullptr, hPrinter, lpwPrinterName, + devMode, nullptr, DM_OUT_BUFFER); if (result != IDOK) { qErrnoWarning("QWin32PrintEngine::initialize: Failed to obtain devMode"); free(devMode); - devMode = NULL; + devMode = nullptr; ownsDevMode = false; } } - hdc = CreateDC(NULL, (LPCWSTR)printerName.utf16(), 0, devMode); + hdc = CreateDC(nullptr, reinterpret_cast<LPCWSTR>(printerName.utf16()), + nullptr, devMode); if (!hdc) { qErrnoWarning("QWin32PrintEngine::initialize: CreateDC failed"); @@ -912,15 +917,22 @@ void QWin32PrintEnginePrivate::initialize() #endif // QT_DEBUG_DRAW || QT_DEBUG_METRICS } +void QWin32PrintEnginePrivate::initializeDevMode(DEVMODE *devMode) +{ + memset(devMode, 0, sizeof(DEVMODE)); + devMode->dmSize = sizeof(DEVMODE); + devMode->dmSpecVersion = DM_SPECVERSION; +} + void QWin32PrintEnginePrivate::initHDC() { Q_ASSERT(hdc); - HDC display_dc = GetDC(0); + HDC display_dc = GetDC(nullptr); dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); dpi_y = GetDeviceCaps(hdc, LOGPIXELSY); dpi_display = GetDeviceCaps(display_dc, LOGPIXELSY); - ReleaseDC(0, display_dc); + ReleaseDC(nullptr, display_dc); if (dpi_display == 0) { qWarning("QWin32PrintEngine::metric: GetDeviceCaps() failed, " "might be a driver problem"); @@ -963,11 +975,11 @@ void QWin32PrintEnginePrivate::release() if (ownsDevMode) free(devMode); - hdc = 0; - hPrinter = 0; - pInfo = 0; - hMem = 0; - devMode = 0; + hdc = nullptr; + hPrinter = nullptr; + pInfo = nullptr; + hMem = nullptr; + devMode = nullptr; ownsDevMode = false; } @@ -1051,6 +1063,7 @@ void QWin32PrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant & if (!d->devMode) break; d->devMode->dmCollate = value.toBool() ? DMCOLLATE_TRUE : DMCOLLATE_FALSE; + d->devMode->dmFields |= DM_COLLATE; d->doReinit(); } break; @@ -1060,6 +1073,7 @@ void QWin32PrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant & if (!d->devMode) break; d->devMode->dmColor = (value.toInt() == QPrinter::Color) ? DMCOLOR_COLOR : DMCOLOR_MONOCHROME; + d->devMode->dmFields |= DM_COLOR; d->doReinit(); } break; @@ -1085,15 +1099,19 @@ void QWin32PrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant & switch (mode) { case QPrint::DuplexNone: d->devMode->dmDuplex = DMDUP_SIMPLEX; + d->devMode->dmFields |= DM_DUPLEX; break; case QPrint::DuplexAuto: d->devMode->dmDuplex = d->m_pageLayout.orientation() == QPageLayout::Landscape ? DMDUP_HORIZONTAL : DMDUP_VERTICAL; + d->devMode->dmFields |= DM_DUPLEX; break; case QPrint::DuplexLongSide: d->devMode->dmDuplex = DMDUP_VERTICAL; + d->devMode->dmFields |= DM_DUPLEX; break; case QPrint::DuplexShortSide: d->devMode->dmDuplex = DMDUP_HORIZONTAL; + d->devMode->dmFields |= DM_DUPLEX; break; default: // Don't change @@ -1121,6 +1139,7 @@ void QWin32PrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant & break; d->num_copies = value.toInt(); d->devMode->dmCopies = d->num_copies; + d->devMode->dmFields |= DM_COPIES; d->doReinit(); break; @@ -1129,9 +1148,10 @@ void QWin32PrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant & break; QPageLayout::Orientation orientation = QPageLayout::Orientation(value.toInt()); d->devMode->dmOrientation = orientation == QPageLayout::Landscape ? DMORIENT_LANDSCAPE : DMORIENT_PORTRAIT; + d->devMode->dmFields |= DM_ORIENTATION; d->m_pageLayout.setOrientation(orientation); - d->updateMetrics(); d->doReinit(); + d->updateMetrics(); #ifdef QT_DEBUG_METRICS qDebug() << "QWin32PrintEngine::setProperty(PPK_Orientation," << orientation << ')'; d->debugMetrics(); @@ -1265,7 +1285,8 @@ void QWin32PrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant & Q_ASSERT(margins.size() == 4); d->m_pageLayout.setUnits(QPageLayout::Point); d->m_pageLayout.setMargins(QMarginsF(margins.at(0).toReal(), margins.at(1).toReal(), - margins.at(2).toReal(), margins.at(3).toReal())); + margins.at(2).toReal(), margins.at(3).toReal()), + QPageLayout::OutOfBoundsPolicy::Clamp); d->updateMetrics(); #ifdef QT_DEBUG_METRICS qDebug() << "QWin32PrintEngine::setProperty(PPK_PageMargins," << margins << ')'; @@ -1293,7 +1314,7 @@ void QWin32PrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant & case PPK_QPageMargins: { QPair<QMarginsF, QPageLayout::Unit> pair = value.value<QPair<QMarginsF, QPageLayout::Unit> >(); d->m_pageLayout.setUnits(pair.second); - d->m_pageLayout.setMargins(pair.first); + d->m_pageLayout.setMargins(pair.first, QPageLayout::OutOfBoundsPolicy::Clamp); d->updateMetrics(); #ifdef QT_DEBUG_METRICS qDebug() << "QWin32PrintEngine::setProperty(PPK_QPageMargins," << pair.first << pair.second << ')'; @@ -1309,7 +1330,7 @@ void QWin32PrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant & setProperty(PPK_FullPage, pageLayout.mode() == QPageLayout::FullPageMode); setProperty(PPK_Orientation, QVariant::fromValue(pageLayout.orientation())); d->m_pageLayout.setUnits(pageLayout.units()); - d->m_pageLayout.setMargins(pageLayout.margins()); + d->m_pageLayout.setMargins(pageLayout.margins(), QPageLayout::OutOfBoundsPolicy::Clamp); d->updateMetrics(); #ifdef QT_DEBUG_METRICS qDebug() << "QWin32PrintEngine::setProperty(PPK_QPageLayout," << pageLayout << ')'; @@ -1571,7 +1592,7 @@ void QWin32PrintEngine::setGlobalDevMode(HGLOBAL globalDevNames, HGLOBAL globalD d->ownsDevMode = false; } d->devMode = dm; - d->hdc = CreateDC(NULL, reinterpret_cast<const wchar_t *>(d->m_printDevice.id().utf16()), 0, dm); + d->hdc = CreateDC(nullptr, reinterpret_cast<LPCWSTR>(d->m_printDevice.id().utf16()), nullptr, dm); d->num_copies = d->devMode->dmCopies; d->updatePageLayout(); @@ -1585,7 +1606,7 @@ void QWin32PrintEngine::setGlobalDevMode(HGLOBAL globalDevNames, HGLOBAL globalD #if defined QT_DEBUG_DRAW || defined QT_DEBUG_METRICS qDebug("QWin32PrintEngine::setGlobalDevMode()"); - debugMetrics(); + d->debugMetrics(); #endif // QT_DEBUG_DRAW || QT_DEBUG_METRICS } @@ -1674,13 +1695,23 @@ void QWin32PrintEnginePrivate::updatePageLayout() void QWin32PrintEnginePrivate::updateMetrics() { m_paintRectPixels = m_pageLayout.paintRectPixels(resolution); + // Some print devices allow scaling, so that "virtual" page size != current paper size + const int devWidth = GetDeviceCaps(hdc, PHYSICALWIDTH); + const int devHeight = GetDeviceCaps(hdc, PHYSICALHEIGHT); + const int pageWidth = m_pageLayout.fullRectPixels(dpi_x).width(); + const int pageHeight = m_pageLayout.fullRectPixels(dpi_y).height(); + const qreal pageScaleX = (devWidth && pageWidth) ? qreal(devWidth) / pageWidth : 1; + const qreal pageScaleY = (devHeight && pageHeight) ? qreal(devHeight) / pageHeight : 1; + m_paintRectPixels = QTransform::fromScale(pageScaleX, pageScaleY).mapRect(m_paintRectPixels); + QSizeF sizeMM = m_pageLayout.paintRect(QPageLayout::Millimeter).size(); m_paintSizeMM = QSize(qRound(sizeMM.width()), qRound(sizeMM.height())); // Calculate the origin using the physical device pixels, not our paint pixels // Origin is defined as User Margins - Device Margins - QMarginsF margins = m_pageLayout.margins(QPageLayout::Millimeter) / 25.4; - origin_x = qRound(margins.left() * dpi_x) - GetDeviceCaps(hdc, PHYSICALOFFSETX); - origin_y = qRound(margins.top() * dpi_y) - GetDeviceCaps(hdc, PHYSICALOFFSETY); + const bool isFullPage = (m_pageLayout.mode() == QPageLayout::FullPageMode); + const QMarginsF margins = isFullPage ? QMarginsF() : (m_pageLayout.margins(QPageLayout::Millimeter) / 25.4); + origin_x = qRound(pageScaleX * margins.left() * dpi_x) - GetDeviceCaps(hdc, PHYSICALOFFSETX); + origin_y = qRound(pageScaleY * margins.top() * dpi_y) - GetDeviceCaps(hdc, PHYSICALOFFSETY); } void QWin32PrintEnginePrivate::debugMetrics() const @@ -1705,7 +1736,7 @@ 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; + HFONT hfont = nullptr; bool deleteFont = false; if (ti.fontEngine->type() == QFontEngine::Win) { diff --git a/src/printsupport/platform/windows/qprintengine_win_p.h b/src/printsupport/platform/windows/qprintengine_win_p.h index 54e3cf2814..995c31ff1e 100644 --- a/src/printsupport/platform/windows/qprintengine_win_p.h +++ b/src/printsupport/platform/windows/qprintengine_win_p.h @@ -83,25 +83,9 @@ class QWin32PrintEnginePrivate : public QAlphaPaintEnginePrivate Q_DECLARE_PUBLIC(QWin32PrintEngine) public: QWin32PrintEnginePrivate() : - hPrinter(0), - globalDevMode(0), - devMode(0), - pInfo(0), - hMem(0), - hdc(0), - ownsDevMode(false), - mode(QPrinter::ScreenResolution), - state(QPrinter::Idle), - resolution(0), - m_pageLayout(QPageLayout(QPageSize(QPageSize::A4), QPageLayout::Portrait, QMarginsF(0, 0, 0, 0))), - stretch_x(1), stretch_y(1), origin_x(0), origin_y(0), - dpi_x(96), dpi_y(96), dpi_display(96), - num_copies(1), - printToFile(false), - reinit(false), + printToFile(false), reinit(false), complex_xform(false), has_pen(false), has_brush(false), has_custom_paper_size(false), - embed_fonts(true), - txop(0 /* QTransform::TxNone */) + embed_fonts(true) { } @@ -127,6 +111,8 @@ public: is handled in the next begin or newpage. */ void doReinit(); + static void initializeDevMode(DEVMODE *); + bool resetDC(); void strokePath(const QPainterPath &path, const QColor &color); @@ -142,19 +128,19 @@ public: void debugMetrics() const; // Windows GDI printer references. - HANDLE hPrinter; + HANDLE hPrinter = nullptr; - HGLOBAL globalDevMode; - DEVMODE *devMode; - PRINTER_INFO_2 *pInfo; - HGLOBAL hMem; + HGLOBAL globalDevMode = nullptr; + DEVMODE *devMode = nullptr; + PRINTER_INFO_2 *pInfo = nullptr; + HGLOBAL hMem = nullptr; - HDC hdc; + HDC hdc = nullptr; // True if devMode was allocated separately from pInfo. - bool ownsDevMode; + bool ownsDevMode = false; - QPrinter::PrinterMode mode; + QPrinter::PrinterMode mode = QPrinter::ScreenResolution; // Print Device QPrintDevice m_printDevice; @@ -164,26 +150,26 @@ public: QString m_creator; QString fileName; - QPrinter::PrinterState state; - int resolution; + QPrinter::PrinterState state = QPrinter::Idle; + int resolution = 0; // Page Layout - QPageLayout m_pageLayout; - + QPageLayout m_pageLayout{QPageSize(QPageSize::A4), + QPageLayout::Portrait, QMarginsF{0, 0, 0, 0}}; // Page metrics cache QRect m_paintRectPixels; QSize m_paintSizeMM; // Windows painting - qreal stretch_x; - qreal stretch_y; - int origin_x; - int origin_y; + qreal stretch_x = 1; + qreal stretch_y = 1; + int origin_x = 0; + int origin_y = 0; - int dpi_x; - int dpi_y; - int dpi_display; - int num_copies; + int dpi_x = 96; + int dpi_y = 96; + int dpi_display = 96; + int num_copies = 1; uint printToFile : 1; uint reinit : 1; @@ -194,7 +180,7 @@ public: uint has_custom_paper_size : 1; uint embed_fonts : 1; - uint txop; + uint txop = 0; // QTransform::TxNone QColor brush_color; QPen pen; diff --git a/src/printsupport/platform/windows/qwindowsprintdevice.cpp b/src/printsupport/platform/windows/qwindowsprintdevice.cpp index f382ac375e..9445871ed7 100644 --- a/src/printsupport/platform/windows/qwindowsprintdevice.cpp +++ b/src/printsupport/platform/windows/qwindowsprintdevice.cpp @@ -27,25 +27,6 @@ static inline uint qwcsnlen(const wchar_t *str, uint maxlen) return length; } -static QPrint::InputSlot paperBinToInputSlot(int windowsId, const QString &name) -{ - QPrint::InputSlot slot; - slot.name = name; - int i; - for (i = 0; inputSlotMap[i].id != QPrint::CustomInputSlot; ++i) { - if (inputSlotMap[i].windowsId == windowsId) { - slot.key = inputSlotMap[i].key; - slot.id = inputSlotMap[i].id; - slot.windowsId = inputSlotMap[i].windowsId; - return slot; - } - } - slot.key = inputSlotMap[i].key; - slot.id = inputSlotMap[i].id; - slot.windowsId = windowsId; - return slot; -} - static LPDEVMODE getDevmode(HANDLE hPrinter, const QString &printerId) { LPWSTR printerIdUtf16 = const_cast<LPWSTR>(reinterpret_cast<LPCWSTR>(printerId.utf16())); @@ -333,7 +314,7 @@ void QWindowsPrintDevice::loadInputSlots() const for (int i = 0; i < int(binCount); ++i) { wchar_t *binName = binNames.data() + (i * 24); QString name = QString::fromWCharArray(binName, qwcsnlen(binName, 24)); - m_inputSlots.append(paperBinToInputSlot(bins[i], name)); + m_inputSlots.append(QPrintUtils::paperBinToInputSlot(bins[i], name)); } } @@ -347,12 +328,13 @@ void QWindowsPrintDevice::loadInputSlots() const QPrint::InputSlot QWindowsPrintDevice::defaultInputSlot() const { - QPrint::InputSlot inputSlot = QPlatformPrintDevice::defaultInputSlot();; + QPrint::InputSlot inputSlot = QPlatformPrintDevice::defaultInputSlot(); if (LPDEVMODE pDevMode = getDevmode(m_hPrinter, m_id)) { // Get the default input slot if (pDevMode->dmFields & DM_DEFAULTSOURCE) { - QPrint::InputSlot tempSlot = paperBinToInputSlot(pDevMode->dmDefaultSource, QString()); + QPrint::InputSlot tempSlot = + QPrintUtils::paperBinToInputSlot(pDevMode->dmDefaultSource, QString()); const auto inputSlots = supportedInputSlots(); for (const QPrint::InputSlot &slot : inputSlots) { if (slot.key == tempSlot.key) { diff --git a/src/printsupport/platform/windows/qwindowsprintersupport.cpp b/src/printsupport/platform/windows/qwindowsprintersupport.cpp index db55573a0b..7cbd4dc491 100644 --- a/src/printsupport/platform/windows/qwindowsprintersupport.cpp +++ b/src/printsupport/platform/windows/qwindowsprintersupport.cpp @@ -69,8 +69,8 @@ QPlatformPrinterSupport *QWindowsPrinterSupportPlugin::create(const QString &key return nullptr; } -#include "qwindowsprintersupport.moc" - QT_END_NAMESPACE +#include "qwindowsprintersupport.moc" + #endif // QT_NO_PRINTER diff --git a/src/printsupport/widgets/qprintpreviewwidget.cpp b/src/printsupport/widgets/qprintpreviewwidget.cpp index 1b82ad307e..637eb42505 100644 --- a/src/printsupport/widgets/qprintpreviewwidget.cpp +++ b/src/printsupport/widgets/qprintpreviewwidget.cpp @@ -14,7 +14,7 @@ QT_BEGIN_NAMESPACE -namespace { +namespace QtPrivate { class PageItem : public QGraphicsItem { public: @@ -25,7 +25,6 @@ public: qreal border = qMax(paperSize.height(), paperSize.width()) / 25; brect = QRectF(QPointF(-border, -border), QSizeF(paperSize)+QSizeF(2*border, 2*border)); - setCacheMode(DeviceCoordinateCache); } QRectF boundingRect() const override @@ -136,7 +135,10 @@ protected: } }; -} // anonymous namespace +} // namespace QtPrivate + +using GraphicsView = QtPrivate::GraphicsView; +using PageItem = QtPrivate::PageItem; class QPrintPreviewWidgetPrivate : public QWidgetPrivate { @@ -182,7 +184,7 @@ void QPrintPreviewWidgetPrivate::_q_fit(bool doFitting) { Q_Q(QPrintPreviewWidget); - if (curPage < 1 || curPage > pages.count()) + if (curPage < 1 || curPage > pages.size()) return; if (!doFitting && !fitting) @@ -296,7 +298,7 @@ void QPrintPreviewWidgetPrivate::init() void QPrintPreviewWidgetPrivate::populateScene() { // remove old pages - for (auto *page : qAsConst(pages)) + for (auto *page : std::as_const(pages)) scene->removeItem(page); qDeleteAll(pages); pages.clear(); @@ -305,7 +307,7 @@ void QPrintPreviewWidgetPrivate::populateScene() QRect pageRect = printer->pageLayout().paintRectPixels(printer->resolution()); int page = 1; - for (auto *picture : qAsConst(pictures)) { + for (auto *picture : std::as_const(pictures)) { PageItem* item = new PageItem(page++, picture, paperSize, pageRect); scene->addItem(item); pages.append(item); @@ -314,7 +316,7 @@ void QPrintPreviewWidgetPrivate::populateScene() void QPrintPreviewWidgetPrivate::layoutPages() { - int numPages = pages.count(); + int numPages = pages.size(); if (numPages < 1) return; @@ -359,13 +361,16 @@ void QPrintPreviewWidgetPrivate::generatePreview() //### emit paintRequested() until the user changes some parameter Q_Q(QPrintPreviewWidget); + // Avoid previewing a preview + if (printer->d_func()->previewMode()) + return; printer->d_func()->setPreviewMode(true); emit q->paintRequested(printer); printer->d_func()->setPreviewMode(false); pictures = printer->d_func()->previewPages(); populateScene(); // i.e. setPreviewPrintedPictures() e.l. layoutPages(); - curPage = pages.count() > 0 ? qBound(1, curPage, pages.count()) : 1; + curPage = pages.size() > 0 ? qBound(1, curPage, pages.size()) : 1; if (fitting) _q_fit(); emit q->previewChanged(); @@ -373,13 +378,13 @@ void QPrintPreviewWidgetPrivate::generatePreview() void QPrintPreviewWidgetPrivate::setCurrentPage(int pageNumber) { - if (pageNumber < 1 || pageNumber > pages.count()) + if (pageNumber < 1 || pageNumber > pages.size()) return; int lastPage = curPage; curPage = pageNumber; - if (lastPage != curPage && lastPage > 0 && lastPage <= pages.count()) { + if (lastPage != curPage && lastPage > 0 && lastPage <= pages.size()) { if (zoomMode != QPrintPreviewWidget::FitInView) { QScrollBar *hsc = graphicsView->horizontalScrollBar(); QScrollBar *vsc = graphicsView->verticalScrollBar(); |