From 8cf168b8710296bf3e6a983f9bec0a27fe68d6b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98ystein=20Heskestad?= Date: Tue, 31 May 2022 18:26:48 +0200 Subject: Move file-static const arrays out of qprint_p.h file Move static arrays into new qprint.cpp file to avoid them being duplicated in many translation units. Fixes: QTBUG-102302 Change-Id: I47b7a6244e45672788792ec1a28d4fed20d233a3 Reviewed-by: Marc Mutz --- src/printsupport/CMakeLists.txt | 2 +- src/printsupport/kernel/qprint.cpp | 159 +++++++++++++++++++++ src/printsupport/kernel/qprint_p.h | 149 +++---------------- .../platform/windows/qwindowsprintdevice.cpp | 24 +--- 4 files changed, 183 insertions(+), 151 deletions(-) create mode 100644 src/printsupport/kernel/qprint.cpp (limited to 'src/printsupport') diff --git a/src/printsupport/CMakeLists.txt b/src/printsupport/CMakeLists.txt index 941b790d0c..d688c7bb7d 100644 --- a/src/printsupport/CMakeLists.txt +++ b/src/printsupport/CMakeLists.txt @@ -11,7 +11,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 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..6c30e388f6 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 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only @@ -124,142 +125,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/platform/windows/qwindowsprintdevice.cpp b/src/printsupport/platform/windows/qwindowsprintdevice.cpp index f382ac375e..65784e62ca 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(reinterpret_cast(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)); } } @@ -352,7 +333,8 @@ QPrint::InputSlot QWindowsPrintDevice::defaultInputSlot() const 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) { -- cgit v1.2.3