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 <marc.mutz@qt.io>bb10
parent
9fea0c613e
commit
8cf168b871
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
{
|
||||
namespace 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
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue