From 64f94fa373900aca357f5f94c5ef16f481dc11b7 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 16 Aug 2011 13:53:57 +0200 Subject: move printing related files into their own directory This is done to prepare the next step where we move printing into it's own module. Change-Id: I95919c28079983e7c5e4ff23d223f8c062b8ac8c Reviewed-on: http://codereview.qt.nokia.com/3205 Reviewed-by: Qt Sanity Bot Reviewed-by: Gunnar Sletta --- src/gui/gui.pro | 1 + src/gui/painting/painting.pri | 84 +- src/gui/painting/qcups.cpp | 446 ---- src/gui/painting/qcups_p.h | 133 -- src/gui/painting/qpaintengine_alpha.cpp | 516 ----- src/gui/painting/qpaintengine_alpha_p.h | 135 -- src/gui/painting/qpaintengine_preview.cpp | 223 -- src/gui/painting/qpaintengine_preview_p.h | 106 - src/gui/painting/qplatformprintersupport_qpa.cpp | 133 -- src/gui/painting/qplatformprintersupport_qpa.h | 84 - src/gui/painting/qprintengine.h | 119 - src/gui/painting/qprintengine_pdf.cpp | 648 ------ src/gui/painting/qprintengine_pdf_p.h | 163 -- src/gui/painting/qprinter.cpp | 2280 -------------------- src/gui/painting/qprinter.h | 283 --- src/gui/painting/qprinter_p.h | 136 -- src/gui/painting/qprinterinfo.cpp | 199 -- src/gui/painting/qprinterinfo.h | 91 - src/gui/painting/qprinterinfo_p.h | 108 - src/gui/painting/qprinterinfo_unix.cpp | 857 -------- src/gui/painting/qprinterinfo_unix_p.h | 130 -- src/gui/printsupport/printsupport.pri | 36 + src/gui/printsupport/qcups.cpp | 446 ++++ src/gui/printsupport/qcups_p.h | 133 ++ src/gui/printsupport/qpaintengine_alpha.cpp | 516 +++++ src/gui/printsupport/qpaintengine_alpha_p.h | 135 ++ src/gui/printsupport/qpaintengine_preview.cpp | 223 ++ src/gui/printsupport/qpaintengine_preview_p.h | 106 + .../printsupport/qplatformprintersupport_qpa.cpp | 133 ++ src/gui/printsupport/qplatformprintersupport_qpa.h | 84 + src/gui/printsupport/qprintengine.h | 119 + src/gui/printsupport/qprintengine_pdf.cpp | 648 ++++++ src/gui/printsupport/qprintengine_pdf_p.h | 163 ++ src/gui/printsupport/qprinter.cpp | 2280 ++++++++++++++++++++ src/gui/printsupport/qprinter.h | 283 +++ src/gui/printsupport/qprinter_p.h | 136 ++ src/gui/printsupport/qprinterinfo.cpp | 199 ++ src/gui/printsupport/qprinterinfo.h | 91 + src/gui/printsupport/qprinterinfo_p.h | 108 + src/gui/printsupport/qprinterinfo_unix.cpp | 857 ++++++++ src/gui/printsupport/qprinterinfo_unix_p.h | 130 ++ 41 files changed, 6829 insertions(+), 6872 deletions(-) delete mode 100644 src/gui/painting/qcups.cpp delete mode 100644 src/gui/painting/qcups_p.h delete mode 100644 src/gui/painting/qpaintengine_alpha.cpp delete mode 100644 src/gui/painting/qpaintengine_alpha_p.h delete mode 100644 src/gui/painting/qpaintengine_preview.cpp delete mode 100644 src/gui/painting/qpaintengine_preview_p.h delete mode 100644 src/gui/painting/qplatformprintersupport_qpa.cpp delete mode 100644 src/gui/painting/qplatformprintersupport_qpa.h delete mode 100644 src/gui/painting/qprintengine.h delete mode 100644 src/gui/painting/qprintengine_pdf.cpp delete mode 100644 src/gui/painting/qprintengine_pdf_p.h delete mode 100644 src/gui/painting/qprinter.cpp delete mode 100644 src/gui/painting/qprinter.h delete mode 100644 src/gui/painting/qprinter_p.h delete mode 100644 src/gui/painting/qprinterinfo.cpp delete mode 100644 src/gui/painting/qprinterinfo.h delete mode 100644 src/gui/painting/qprinterinfo_p.h delete mode 100644 src/gui/painting/qprinterinfo_unix.cpp delete mode 100644 src/gui/painting/qprinterinfo_unix_p.h create mode 100644 src/gui/printsupport/printsupport.pri create mode 100644 src/gui/printsupport/qcups.cpp create mode 100644 src/gui/printsupport/qcups_p.h create mode 100644 src/gui/printsupport/qpaintengine_alpha.cpp create mode 100644 src/gui/printsupport/qpaintengine_alpha_p.h create mode 100644 src/gui/printsupport/qpaintengine_preview.cpp create mode 100644 src/gui/printsupport/qpaintengine_preview_p.h create mode 100644 src/gui/printsupport/qplatformprintersupport_qpa.cpp create mode 100644 src/gui/printsupport/qplatformprintersupport_qpa.h create mode 100644 src/gui/printsupport/qprintengine.h create mode 100644 src/gui/printsupport/qprintengine_pdf.cpp create mode 100644 src/gui/printsupport/qprintengine_pdf_p.h create mode 100644 src/gui/printsupport/qprinter.cpp create mode 100644 src/gui/printsupport/qprinter.h create mode 100644 src/gui/printsupport/qprinter_p.h create mode 100644 src/gui/printsupport/qprinterinfo.cpp create mode 100644 src/gui/printsupport/qprinterinfo.h create mode 100644 src/gui/printsupport/qprinterinfo_p.h create mode 100644 src/gui/printsupport/qprinterinfo_unix.cpp create mode 100644 src/gui/printsupport/qprinterinfo_unix_p.h (limited to 'src/gui') diff --git a/src/gui/gui.pro b/src/gui/gui.pro index f1d5bbaea5..7466b13d03 100644 --- a/src/gui/gui.pro +++ b/src/gui/gui.pro @@ -21,6 +21,7 @@ include(text/text.pri) include(painting/painting.pri) include(util/util.pri) include(math3d/math3d.pri) +include(printsupport/printsupport.pri) include(egl/egl.pri) diff --git a/src/gui/painting/painting.pri b/src/gui/painting/painting.pri index 2925d6acce..b12b2216a7 100644 --- a/src/gui/painting/painting.pri +++ b/src/gui/painting/painting.pri @@ -14,8 +14,6 @@ HEADERS += \ painting/qpaintdevice.h \ painting/qpaintengine.h \ painting/qpaintengine_p.h \ - painting/qpaintengine_alpha_p.h \ - painting/qpaintengine_preview_p.h \ painting/qpaintengineex_p.h \ painting/qpainter.h \ painting/qpainter_p.h \ @@ -28,11 +26,6 @@ HEADERS += \ painting/qpen.h \ painting/qpolygon.h \ painting/qpolygonclipper_p.h \ - painting/qprintengine.h \ - painting/qprinter.h \ - painting/qprinter_p.h \ - painting/qprinterinfo.h \ - painting/qprinterinfo_p.h \ painting/qrasterizer_p.h \ painting/qregion.h \ painting/qstroker_p.h \ @@ -45,6 +38,7 @@ HEADERS += \ SOURCES += \ painting/qbackingstore.cpp \ + painting/qcolormap_qpa.cpp \ painting/qbezier.cpp \ painting/qblendfunctions.cpp \ painting/qbrush.cpp \ @@ -57,9 +51,8 @@ SOURCES += \ painting/qmemrotate.cpp \ painting/qoutlinemapper.cpp \ painting/qpaintdevice.cpp \ + painting/qpaintdevice_qpa.cpp \ painting/qpaintengine.cpp \ - painting/qpaintengine_alpha.cpp \ - painting/qpaintengine_preview.cpp \ painting/qpaintengineex.cpp \ painting/qpainter.cpp \ painting/qpainterpath.cpp \ @@ -68,9 +61,6 @@ SOURCES += \ painting/qpdfwriter.cpp \ painting/qpen.cpp \ painting/qpolygon.cpp \ - painting/qprintengine_pdf.cpp \ - painting/qprinter.cpp \ - painting/qprinterinfo.cpp \ painting/qrasterizer.cpp \ painting/qregion.cpp \ painting/qstroker.cpp \ @@ -97,77 +87,7 @@ SOURCES += \ painting/qpaintengine_blitter_p.h \ painting/qblittable_p.h \ -win32:!qpa { - HEADERS += painting/qprintengine_win_p.h - SOURCES += \ - painting/qcolormap_win.cpp \ - painting/qpaintdevice_win.cpp \ - painting/qprintengine_win.cpp - - !win32-borland:!wince*:LIBS += -lmsimg32 -} - - -unix:x11 { - HEADERS += \ - painting/qpaintengine_x11_p.h - - SOURCES += \ - painting/qcolormap_x11.cpp \ - painting/qpaintdevice_x11.cpp \ - painting/qpaintengine_x11.cpp -} - -!qpa:!x11:mac { - HEADERS += \ - painting/qpaintengine_mac_p.h \ - painting/qprintengine_mac_p.h - - SOURCES += \ - painting/qcolormap_mac.cpp \ - painting/qpaintdevice_mac.cpp \ - painting/qpaintengine_mac.cpp \ - painting/qprinterinfo_mac.cpp - OBJECTIVE_SOURCES += \ - painting/qprintengine_mac.mm \ -} - -unix:!symbian { - HEADERS += \ - painting/qprinterinfo_unix_p.h - SOURCES += \ - painting/qprinterinfo_unix.cpp -} - -qpa { - HEADERS += painting/qplatformprintersupport_qpa.h - SOURCES += \ - painting/qcolormap_qpa.cpp \ - painting/qpaintdevice_qpa.cpp \ - painting/qplatformprintersupport_qpa.cpp -} - -symbian { - SOURCES += \ - painting/qpaintengine_s60.cpp \ - painting/qregion_s60.cpp \ - painting/qcolormap_s60.cpp - - HEADERS += \ - painting/qpaintengine_s60_p.h -} - -x11|qpa:!win32 { - contains(QT_CONFIG,qtopia) { - DEFINES += QT_NO_CUPS QT_NO_LPR - } else { - SOURCES += painting/qcups.cpp - HEADERS += painting/qcups_p.h - } -} else { - DEFINES += QT_NO_CUPS QT_NO_LPR -} if(mmx|3dnow|sse|sse2|iwmmxt) { HEADERS += painting/qdrawhelper_x86_p.h \ diff --git a/src/gui/painting/qcups.cpp b/src/gui/painting/qcups.cpp deleted file mode 100644 index 76050d9d71..0000000000 --- a/src/gui/painting/qcups.cpp +++ /dev/null @@ -1,446 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include -#include "qcups_p.h" -#include "qprinterinfo_unix_p.h" - -#ifndef QT_NO_CUPS - -#ifndef QT_LINUXBASE // LSB merges everything into cups.h -# include -#endif -#include - -QT_BEGIN_NAMESPACE - -typedef int (*CupsGetDests)(cups_dest_t **dests); -typedef void (*CupsFreeDests)(int num_dests, cups_dest_t *dests); -typedef const char* (*CupsGetPPD)(const char *printer); -typedef int (*CupsMarkOptions)(ppd_file_t *ppd, int num_options, cups_option_t *options); -typedef ppd_file_t* (*PPDOpenFile)(const char *filename); -typedef void (*PPDMarkDefaults)(ppd_file_t *ppd); -typedef int (*PPDMarkOption)(ppd_file_t *ppd, const char *keyword, const char *option); -typedef void (*PPDClose)(ppd_file_t *ppd); -typedef int (*PPDMarkOption)(ppd_file_t *ppd, const char *keyword, const char *option); -typedef void (*CupsFreeOptions)(int num_options, cups_option_t *options); -typedef void (*CupsSetDests)(int num_dests, cups_dest_t *dests); -typedef cups_lang_t* (*CupsLangGet)(const char *language); -typedef const char* (*CupsLangEncoding)(cups_lang_t *language); -typedef int (*CupsAddOption)(const char *name, const char *value, int num_options, cups_option_t **options); -typedef int (*CupsTempFd)(char *name, int len); -typedef int (*CupsPrintFile)(const char * name, const char * filename, const char * title, int num_options, cups_option_t * options); - -static bool cupsLoaded = false; -static int qt_cups_num_printers = 0; -static CupsGetDests _cupsGetDests = 0; -static CupsFreeDests _cupsFreeDests = 0; -static CupsGetPPD _cupsGetPPD = 0; -static PPDOpenFile _ppdOpenFile = 0; -static PPDMarkDefaults _ppdMarkDefaults = 0; -static PPDClose _ppdClose = 0; -static CupsMarkOptions _cupsMarkOptions = 0; -static PPDMarkOption _ppdMarkOption = 0; -static CupsFreeOptions _cupsFreeOptions = 0; -static CupsSetDests _cupsSetDests = 0; -static CupsLangGet _cupsLangGet = 0; -static CupsLangEncoding _cupsLangEncoding = 0; -static CupsAddOption _cupsAddOption = 0; -static CupsTempFd _cupsTempFd = 0; -static CupsPrintFile _cupsPrintFile = 0; - -static void resolveCups() -{ - QLibrary cupsLib(QLatin1String("cups"), 2); - if(cupsLib.load()) { - _cupsGetDests = (CupsGetDests) cupsLib.resolve("cupsGetDests"); - _cupsFreeDests = (CupsFreeDests) cupsLib.resolve("cupsFreeDests"); - _cupsGetPPD = (CupsGetPPD) cupsLib.resolve("cupsGetPPD"); - _cupsLangGet = (CupsLangGet) cupsLib.resolve("cupsLangGet"); - _cupsLangEncoding = (CupsLangEncoding) cupsLib.resolve("cupsLangEncoding"); - _ppdOpenFile = (PPDOpenFile) cupsLib.resolve("ppdOpenFile"); - _ppdMarkDefaults = (PPDMarkDefaults) cupsLib.resolve("ppdMarkDefaults"); - _ppdClose = (PPDClose) cupsLib.resolve("ppdClose"); - _cupsMarkOptions = (CupsMarkOptions) cupsLib.resolve("cupsMarkOptions"); - _ppdMarkOption = (PPDMarkOption) cupsLib.resolve("ppdMarkOption"); - _cupsFreeOptions = (CupsFreeOptions) cupsLib.resolve("cupsFreeOptions"); - _cupsSetDests = (CupsSetDests) cupsLib.resolve("cupsSetDests"); - _cupsAddOption = (CupsAddOption) cupsLib.resolve("cupsAddOption"); - _cupsTempFd = (CupsTempFd) cupsLib.resolve("cupsTempFd"); - _cupsPrintFile = (CupsPrintFile) cupsLib.resolve("cupsPrintFile"); - - if (_cupsGetDests && _cupsFreeDests) { - cups_dest_t *printers; - int num_printers = _cupsGetDests(&printers); - if (num_printers) - _cupsFreeDests(num_printers, printers); - qt_cups_num_printers = num_printers; - } - } - cupsLoaded = true; -} - -// ================ CUPS Support class ======================== - -QCUPSSupport::QCUPSSupport() - : - prnCount(0), - printers(0), - page_sizes(0), - currPrinterIndex(0), - currPPD(0) -{ - if (!cupsLoaded) - resolveCups(); - - // getting all available printers - if (!isAvailable()) - return; - - prnCount = _cupsGetDests(&printers); - - for (int i = 0; i < prnCount; ++i) { - if (printers[i].is_default) { - currPrinterIndex = i; - setCurrentPrinter(i); - break; - } - } - -#ifndef QT_NO_TEXTCODEC - cups_lang_t *cupsLang = _cupsLangGet(0); - codec = QTextCodec::codecForName(_cupsLangEncoding(cupsLang)); - if (!codec) - codec = QTextCodec::codecForLocale(); -#endif -} - -QCUPSSupport::~QCUPSSupport() -{ - if (currPPD) - _ppdClose(currPPD); - if (prnCount) - _cupsFreeDests(prnCount, printers); -} - -int QCUPSSupport::availablePrintersCount() const -{ - return prnCount; -} - -const cups_dest_t* QCUPSSupport::availablePrinters() const -{ - return printers; -} - -const ppd_file_t* QCUPSSupport::currentPPD() const -{ - return currPPD; -} - -const ppd_file_t* QCUPSSupport::setCurrentPrinter(int index) -{ - Q_ASSERT(index >= 0 && index <= prnCount); - if (index == prnCount) - return 0; - - currPrinterIndex = index; - - if (currPPD) - _ppdClose(currPPD); - currPPD = 0; - page_sizes = 0; - - const char *ppdFile = _cupsGetPPD(printers[index].name); - - if (!ppdFile) - return 0; - - currPPD = _ppdOpenFile(ppdFile); - unlink(ppdFile); - - // marking default options - _ppdMarkDefaults(currPPD); - - // marking options explicitly set - _cupsMarkOptions(currPPD, printers[currPrinterIndex].num_options, printers[currPrinterIndex].options); - - // getting pointer to page sizes - page_sizes = ppdOption("PageSize"); - - return currPPD; -} - -int QCUPSSupport::currentPrinterIndex() const -{ - return currPrinterIndex; -} - -bool QCUPSSupport::isAvailable() -{ - if(!cupsLoaded) - resolveCups(); - - return _cupsGetDests && - _cupsFreeDests && - _cupsGetPPD && - _ppdOpenFile && - _ppdMarkDefaults && - _ppdClose && - _cupsMarkOptions && - _ppdMarkOption && - _cupsFreeOptions && - _cupsSetDests && - _cupsLangGet && - _cupsLangEncoding && - _cupsAddOption && - (qt_cups_num_printers > 0); -} - -const ppd_option_t* QCUPSSupport::ppdOption(const char *key) const -{ - if (currPPD) { - for (int gr = 0; gr < currPPD->num_groups; ++gr) { - for (int opt = 0; opt < currPPD->groups[gr].num_options; ++opt) { - if (qstrcmp(currPPD->groups[gr].options[opt].keyword, key) == 0) - return &currPPD->groups[gr].options[opt]; - } - } - } - return 0; -} - -const cups_option_t* QCUPSSupport::printerOption(const QString &key) const -{ - for (int i = 0; i < printers[currPrinterIndex].num_options; ++i) { - if (QLatin1String(printers[currPrinterIndex].options[i].name) == key) - return &printers[currPrinterIndex].options[i]; - } - return 0; -} - -const ppd_option_t* QCUPSSupport::pageSizes() const -{ - return page_sizes; -} - -int QCUPSSupport::markOption(const char* name, const char* value) -{ - return _ppdMarkOption(currPPD, name, value); -} - -void QCUPSSupport::saveOptions(QList options, QList markedOptions) -{ - int oldOptionCount = printers[currPrinterIndex].num_options; - cups_option_t* oldOptions = printers[currPrinterIndex].options; - - int newOptionCount = 0; - cups_option_t* newOptions = 0; - - // copying old options that are not on the new list - for (int i = 0; i < oldOptionCount; ++i) { - bool contains = false; - for (int j = 0; j < options.count(); ++j) { - if (qstrcmp(options.at(j)->keyword, oldOptions[i].name) == 0) { - contains = true; - break; - } - } - - if (!contains) { - newOptionCount = _cupsAddOption(oldOptions[i].name, oldOptions[i].value, newOptionCount, &newOptions); - } - } - - // we can release old option list - _cupsFreeOptions(oldOptionCount, oldOptions); - - // adding marked options - for (int i = 0; i < markedOptions.count(); ++i) { - const char* name = markedOptions.at(i); - ++i; - newOptionCount = _cupsAddOption(name, markedOptions.at(i), newOptionCount, &newOptions); - } - - // placing the new option list - printers[currPrinterIndex].num_options = newOptionCount; - printers[currPrinterIndex].options = newOptions; - - // saving new default values - _cupsSetDests(prnCount, printers); -} - -QRect QCUPSSupport::paperRect(const char *choice) const -{ - if (!currPPD) - return QRect(); - for (int i = 0; i < currPPD->num_sizes; ++i) { - if (qstrcmp(currPPD->sizes[i].name, choice) == 0) - return QRect(0, 0, qRound(currPPD->sizes[i].width), qRound(currPPD->sizes[i].length)); - } - return QRect(); -} - -QRect QCUPSSupport::pageRect(const char *choice) const -{ - if (!currPPD) - return QRect(); - for (int i = 0; i < currPPD->num_sizes; ++i) { - if (qstrcmp(currPPD->sizes[i].name, choice) == 0) - return QRect(qRound(currPPD->sizes[i].left), - qRound(currPPD->sizes[i].length - currPPD->sizes[i].top), - qRound(currPPD->sizes[i].right - currPPD->sizes[i].left), - qRound(currPPD->sizes[i].top - currPPD->sizes[i].bottom)); - } - return QRect(); -} - -QStringList QCUPSSupport::options() const -{ - QStringList list; - collectMarkedOptions(list); - return list; -} - -bool QCUPSSupport::printerHasPPD(const char *printerName) -{ - if (!isAvailable()) - return false; - const char *ppdFile = _cupsGetPPD(printerName); - if (ppdFile) - unlink(ppdFile); - return (ppdFile != 0); -} - -QString QCUPSSupport::unicodeString(const char *s) -{ -#ifndef QT_NO_TEXTCODEC - return codec->toUnicode(s); -#else - return QLatin1String(s); -#endif -} - -void QCUPSSupport::collectMarkedOptions(QStringList& list, const ppd_group_t* group) const -{ - if (group == 0) { - if (!currPPD) - return; - for (int i = 0; i < currPPD->num_groups; ++i) { - collectMarkedOptions(list, &currPPD->groups[i]); - collectMarkedOptionsHelper(list, &currPPD->groups[i]); - } - } else { - for (int i = 0; i < group->num_subgroups; ++i) - collectMarkedOptionsHelper(list, &group->subgroups[i]); - } -} - -void QCUPSSupport::collectMarkedOptionsHelper(QStringList& list, const ppd_group_t* group) const -{ - for (int i = 0; i < group->num_options; ++i) { - for (int j = 0; j < group->options[i].num_choices; ++j) { - if (group->options[i].choices[j].marked == 1 && qstrcmp(group->options[i].choices[j].choice, group->options[i].defchoice) != 0) - list << QString::fromLocal8Bit(group->options[i].keyword) << QString::fromLocal8Bit(group->options[i].choices[j].choice); - } - } -} - -QPair QCUPSSupport::tempFd() -{ - char filename[512]; - int fd = _cupsTempFd(filename, 512); - return QPair(fd, QString::fromLocal8Bit(filename)); -} - -// Prints the given file and returns a job id. -int QCUPSSupport::printFile(const char * printerName, const char * filename, const char * title, - int num_options, cups_option_t * options) -{ - return _cupsPrintFile(printerName, filename, title, num_options, options); -} - -QCUPSSupport::Printer::Printer(const QString &n) : name(n), isDefault(false), cupsPrinterIndex(-1) -{ -} - -QList QCUPSSupport::availableUnixPrinters() -{ - QList printers; - -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - if (QCUPSSupport::isAvailable()) { - QCUPSSupport cups; - int cupsPrinterCount = cups.availablePrintersCount(); - const cups_dest_t* cupsPrinters = cups.availablePrinters(); - for (int i = 0; i < cupsPrinterCount; ++i) { - QString printerName(QString::fromLocal8Bit(cupsPrinters[i].name)); - if (cupsPrinters[i].instance) - printerName += QLatin1Char('/') + QString::fromLocal8Bit(cupsPrinters[i].instance); - - Printer p(printerName); - if (cupsPrinters[i].is_default) - p.isDefault = true; - p.cupsPrinterIndex = i; - printers.append(p); - } - } else -#endif - { - QList lprPrinters; - int defprn = qt_getLprPrinters(lprPrinters); - // populating printer combo - foreach (const QPrinterDescription &description, lprPrinters) - printers.append(Printer(description.name)); - if (defprn >= 0 && defprn < printers.size()) - printers[defprn].isDefault = true; - } - - return printers; -} - -QList QCUPSSupport::getCupsPrinterPaperSizes(int cupsPrinterIndex) -{ - return qt_getCupsPrinterPaperSizes(cupsPrinterIndex); -} - -QT_END_NAMESPACE - -#endif // QT_NO_CUPS diff --git a/src/gui/painting/qcups_p.h b/src/gui/painting/qcups_p.h deleted file mode 100644 index 6b6a55a440..0000000000 --- a/src/gui/painting/qcups_p.h +++ /dev/null @@ -1,133 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QCUPS_P_H -#define QCUPS_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// -#include "QtCore/qstring.h" -#include "QtCore/qstringlist.h" -#include "QtCore/qpair.h" -#include "QtGui/qprinter.h" - -#ifndef QT_NO_CUPS -#include -#include -#include - -QT_BEGIN_NAMESPACE - -Q_DECLARE_TYPEINFO(cups_option_t, Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE); - -class Q_GUI_EXPORT QCUPSSupport -{ -public: - struct Printer - { - Printer(const QString &name = QString()); - - QString name; - bool isDefault; - int cupsPrinterIndex; - }; - QCUPSSupport(); - ~QCUPSSupport(); - - static bool isAvailable(); - static int cupsVersion() { return isAvailable() ? CUPS_VERSION_MAJOR*10000+CUPS_VERSION_MINOR*100+CUPS_VERSION_PATCH : 0; } - int availablePrintersCount() const; - const cups_dest_t* availablePrinters() const; - int currentPrinterIndex() const; - const ppd_file_t* setCurrentPrinter(int index); - - const ppd_file_t* currentPPD() const; - const ppd_option_t* ppdOption(const char *key) const; - - const cups_option_t* printerOption(const QString &key) const; - const ppd_option_t* pageSizes() const; - - int markOption(const char* name, const char* value); - void saveOptions(QList options, QList markedOptions); - - QRect paperRect(const char *choice) const; - QRect pageRect(const char *choice) const; - - QStringList options() const; - - static bool printerHasPPD(const char *printerName); - - QString unicodeString(const char *s); - - QPair tempFd(); - int printFile(const char * printerName, const char * filename, const char * title, - int num_options, cups_option_t * options); - - static QList availableUnixPrinters(); - static QList getCupsPrinterPaperSizes(int cupsPrinterIndex); - -private: - void collectMarkedOptions(QStringList& list, const ppd_group_t* group = 0) const; - void collectMarkedOptionsHelper(QStringList& list, const ppd_group_t* group) const; - - int prnCount; - cups_dest_t *printers; - const ppd_option_t* page_sizes; - int currPrinterIndex; - ppd_file_t *currPPD; -#ifndef QT_NO_TEXTCODEC - QTextCodec *codec; -#endif -}; - -QT_END_NAMESPACE - -#endif // QT_NO_CUPS - -#endif diff --git a/src/gui/painting/qpaintengine_alpha.cpp b/src/gui/painting/qpaintengine_alpha.cpp deleted file mode 100644 index beda2c7144..0000000000 --- a/src/gui/painting/qpaintengine_alpha.cpp +++ /dev/null @@ -1,516 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -#ifndef QT_NO_PRINTER -#include -#include "private/qpaintengine_alpha_p.h" - -#include "private/qpicture_p.h" -#include "private/qfont_p.h" -#include "QtGui/qpicture.h" - -QT_BEGIN_NAMESPACE - -QAlphaPaintEngine::QAlphaPaintEngine(QAlphaPaintEnginePrivate &data, PaintEngineFeatures devcaps) - : QPaintEngine(data, devcaps) -{ - -} - -QAlphaPaintEngine::~QAlphaPaintEngine() -{ - -} - -bool QAlphaPaintEngine::begin(QPaintDevice *pdev) -{ - Q_D(QAlphaPaintEngine); - - d->m_continueCall = true; - if (d->m_pass != 0) { - return true; - } - - d->m_savedcaps = gccaps; - d->m_pdev = pdev; - - d->m_alphaPen = false; - d->m_alphaBrush = false; - d->m_alphaOpacity = false; - d->m_hasalpha = false; - d->m_advancedPen = false; - d->m_advancedBrush = false; - d->m_complexTransform = false; - d->m_emulateProjectiveTransforms = false; - - // clear alpha region - d->m_alphargn = QRegion(); - d->m_cliprgn = QRegion(); - d->m_pen = QPen(); - d->m_transform = QTransform(); - - flushAndInit(); - - return true; -} - -bool QAlphaPaintEngine::end() -{ - Q_D(QAlphaPaintEngine); - - d->m_continueCall = true; - if (d->m_pass != 0) { - return true; - } - - flushAndInit(false); - return true; -} - -void QAlphaPaintEngine::updateState(const QPaintEngineState &state) -{ - Q_D(QAlphaPaintEngine); - - DirtyFlags flags = state.state(); - if (flags & QPaintEngine::DirtyTransform) { - d->m_transform = state.transform(); - d->m_complexTransform = (d->m_transform.type() > QTransform::TxScale); - d->m_emulateProjectiveTransforms = !(d->m_savedcaps & QPaintEngine::PerspectiveTransform) - && !(d->m_savedcaps & QPaintEngine::AlphaBlend) - && (d->m_transform.type() >= QTransform::TxProject); - } - if (flags & QPaintEngine::DirtyPen) { - d->m_pen = state.pen(); - if (d->m_pen.style() == Qt::NoPen) { - d->m_advancedPen = false; - d->m_alphaPen = false; - } else { - d->m_advancedPen = (d->m_pen.brush().style() != Qt::SolidPattern); - d->m_alphaPen = !d->m_pen.brush().isOpaque(); - } - } - - if (d->m_pass != 0) { - d->m_continueCall = true; - return; - } - d->m_continueCall = false; - - if (flags & QPaintEngine::DirtyOpacity) { - d->m_alphaOpacity = (state.opacity() != 1.0f); - } - - if (flags & QPaintEngine::DirtyBrush) { - if (state.brush().style() == Qt::NoBrush) { - d->m_advancedBrush = false; - d->m_alphaBrush = false; - } else { - d->m_advancedBrush = (state.brush().style() != Qt::SolidPattern); - d->m_alphaBrush = !state.brush().isOpaque(); - } - } - - - d->m_hasalpha = d->m_alphaOpacity || d->m_alphaBrush || d->m_alphaPen; - - if (d->m_picengine) - d->m_picengine->updateState(state); -} - -void QAlphaPaintEngine::drawPath(const QPainterPath &path) -{ - Q_D(QAlphaPaintEngine); - - QRectF tr = d->addPenWidth(path); - - if (d->m_pass == 0) { - d->m_continueCall = false; - if (d->m_hasalpha || d->m_advancedPen || d->m_advancedBrush - || d->m_emulateProjectiveTransforms) - { - d->addAlphaRect(tr); - } - if (d->m_picengine) - d->m_picengine->drawPath(path); - } else { - d->m_continueCall = !d->fullyContained(tr); - } -} - -void QAlphaPaintEngine::drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) -{ - Q_D(QAlphaPaintEngine); - - QPolygonF poly; - for (int i=0; iaddPenWidth(path); - - if (d->m_pass == 0) { - d->m_continueCall = false; - if (d->m_hasalpha || d->m_advancedPen || d->m_advancedBrush - || d->m_emulateProjectiveTransforms) - { - d->addAlphaRect(tr); - } - - if (d->m_picengine) - d->m_picengine->drawPolygon(points, pointCount, mode); - } else { - d->m_continueCall = !d->fullyContained(tr); - } -} - -void QAlphaPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) -{ - Q_D(QAlphaPaintEngine); - - QRectF tr = d->m_transform.mapRect(r); - if (d->m_pass == 0) { - d->m_continueCall = false; - if (pm.hasAlpha() || d->m_alphaOpacity || d->m_complexTransform || pm.isQBitmap()) { - d->addAlphaRect(tr); - } - - if (d->m_picengine) - d->m_picengine->drawPixmap(r, pm, sr); - - } else { - d->m_continueCall = !d->fullyContained(tr); - } -} - -void QAlphaPaintEngine::drawImage(const QRectF &r, const QImage &image, const QRectF &sr) -{ - Q_D(QAlphaPaintEngine); - - QRectF tr = d->m_transform.mapRect(r); - if (d->m_pass == 0) { - d->m_continueCall = false; - if (image.hasAlphaChannel() || d->m_alphaOpacity || d->m_complexTransform) { - d->addAlphaRect(tr); - } - - if (d->m_picengine) - d->m_picengine->drawImage(r, image, sr); - - } else { - d->m_continueCall = !d->fullyContained(tr); - } -} - -void QAlphaPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem) -{ - Q_D(QAlphaPaintEngine); - - QRectF tr(p.x(), p.y() - textItem.ascent(), textItem.width() + 5, textItem.ascent() + textItem.descent() + 5); - tr = d->m_transform.mapRect(tr); - - if (d->m_pass == 0) { - d->m_continueCall = false; - if (d->m_alphaPen || d->m_alphaOpacity || d->m_advancedPen) { - d->addAlphaRect(tr); - } - if (d->m_picengine) { - d->m_picengine->drawTextItem(p, textItem); - } - } else { - d->m_continueCall = !d->fullyContained(tr); - } -} - -void QAlphaPaintEngine::drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s) -{ - Q_D(QAlphaPaintEngine); - - QRectF brect = d->m_transform.mapRect(r); - - if (d->m_pass == 0) { - d->m_continueCall = false; - if (pixmap.hasAlpha() || d->m_alphaOpacity || d->m_complexTransform || pixmap.isQBitmap()) { - d->addAlphaRect(brect); - } - if (d->m_picengine) - d->m_picengine->drawTiledPixmap(r, pixmap, s); - } else { - d->m_continueCall = !d->fullyContained(brect); - } -} - -QRegion QAlphaPaintEngine::alphaClipping() const -{ - Q_D(const QAlphaPaintEngine); - return d->m_cliprgn; -} - -bool QAlphaPaintEngine::continueCall() const -{ - Q_D(const QAlphaPaintEngine); - return d->m_continueCall; -} - -void QAlphaPaintEngine::flushAndInit(bool init) -{ - Q_D(QAlphaPaintEngine); - Q_ASSERT(d->m_pass == 0); - - if (d->m_pic) { - d->m_picpainter->end(); - - // set clip region - d->m_alphargn = d->m_alphargn.intersected(QRect(0, 0, d->m_pdev->width(), d->m_pdev->height())); - - // just use the bounding rect if it's a complex region.. - QVector rects = d->m_alphargn.rects(); - if (rects.size() > 10) { - QRect br = d->m_alphargn.boundingRect(); - d->m_alphargn = QRegion(br); - rects.clear(); - rects.append(br); - } - - d->m_cliprgn = d->m_alphargn; - - // now replay the QPicture - ++d->m_pass; // we are now doing pass #2 - - // reset states - gccaps = d->m_savedcaps; - - painter()->save(); - d->resetState(painter()); - - // make sure the output from QPicture is unscaled - QTransform mtx; - mtx.scale(1.0f / (qreal(d->m_pdev->logicalDpiX()) / qreal(qt_defaultDpiX())), - 1.0f / (qreal(d->m_pdev->logicalDpiY()) / qreal(qt_defaultDpiY()))); - painter()->setTransform(mtx); - painter()->drawPicture(0, 0, *d->m_pic); - - d->m_cliprgn = QRegion(); - d->resetState(painter()); - - // fill in the alpha images - for (int i=0; idrawAlphaImage(rects.at(i)); - - d->m_alphargn = QRegion(); - - painter()->restore(); - - --d->m_pass; // pass #2 finished - - cleanUp(); - } - - if (init) { - gccaps = PaintEngineFeatures(AllFeatures & ~QPaintEngine::ObjectBoundingModeGradients); - - d->m_pic = new QPicture(); - d->m_pic->d_ptr->in_memory_only = true; - d->m_picpainter = new QPainter(d->m_pic); - d->m_picengine = d->m_picpainter->paintEngine(); - - // When newPage() is called and the m_picpainter is recreated - // we have to copy the current state of the original printer - // painter back to the m_picpainter - d->m_picpainter->setPen(painter()->pen()); - d->m_picpainter->setBrush(painter()->brush()); - d->m_picpainter->setBrushOrigin(painter()->brushOrigin()); - d->m_picpainter->setFont(painter()->font()); - d->m_picpainter->setOpacity(painter()->opacity()); - d->m_picpainter->setTransform(painter()->combinedTransform()); - d->m_picengine->syncState(); - } -} - -void QAlphaPaintEngine::cleanUp() -{ - Q_D(QAlphaPaintEngine); - - delete d->m_picpainter; - delete d->m_pic; - - d->m_picpainter = 0; - d->m_pic = 0; - d->m_picengine = 0; -} - -QAlphaPaintEnginePrivate::QAlphaPaintEnginePrivate() - : m_pass(0), - m_pic(0), - m_picengine(0), - m_picpainter(0), - m_hasalpha(false), - m_alphaPen(false), - m_alphaBrush(false), - m_alphaOpacity(false), - m_advancedPen(false), - m_advancedBrush(false), - m_complexTransform(false) -{ - -} - -QAlphaPaintEnginePrivate::~QAlphaPaintEnginePrivate() -{ - delete m_picpainter; - delete m_pic; -} - -QRectF QAlphaPaintEnginePrivate::addPenWidth(const QPainterPath &path) -{ - QPainterPath tmp = path; - - if (m_pen.style() == Qt::NoPen) - return (path.controlPointRect() * m_transform).boundingRect(); - if (m_pen.isCosmetic()) - tmp = path * m_transform; - - QPainterPathStroker stroker; - if (m_pen.widthF() == 0.0f) - stroker.setWidth(1.0); - else - stroker.setWidth(m_pen.widthF()); - stroker.setJoinStyle(m_pen.joinStyle()); - stroker.setCapStyle(m_pen.capStyle()); - tmp = stroker.createStroke(tmp); - if (m_pen.isCosmetic()) - return tmp.controlPointRect(); - - return (tmp.controlPointRect() * m_transform).boundingRect(); -} - -QRect QAlphaPaintEnginePrivate::toRect(const QRectF &rect) const -{ - QRect r; - r.setLeft(int(rect.left())); - r.setTop(int(rect.top())); - r.setRight(int(rect.right() + 1)); - r.setBottom(int(rect.bottom() + 1)); - return r; -} - -void QAlphaPaintEnginePrivate::addAlphaRect(const QRectF &rect) -{ - m_alphargn |= toRect(rect); -} - -void QAlphaPaintEnginePrivate::drawAlphaImage(const QRectF &rect) -{ - Q_Q(QAlphaPaintEngine); - - qreal dpiX = qMax(m_pdev->logicalDpiX(), 300); - qreal dpiY = qMax(m_pdev->logicalDpiY(), 300); - qreal xscale = (dpiX / m_pdev->logicalDpiX()); - qreal yscale = (dpiY / m_pdev->logicalDpiY()); - - QTransform picscale; - picscale.scale(xscale, yscale); - - const int tileSize = 2048; - QSize size((int(rect.width() * xscale)), int(rect.height() * yscale)); - int divw = (size.width() / tileSize); - int divh = (size.height() / tileSize); - divw += 1; - divh += 1; - - int incx = int(rect.width() / divw); - int incy = int(rect.height() / divh); - - for (int y=0; ypainter()->setTransform(QTransform()); - QRect r(xpos, ypos, width, height); - q->painter()->drawImage(r, img); - } - } -} - -bool QAlphaPaintEnginePrivate::fullyContained(const QRectF &rect) const -{ - QRegion r(toRect(rect)); - return (m_cliprgn.intersected(r) == r); -} - -void QAlphaPaintEnginePrivate::resetState(QPainter *p) -{ - p->setPen(QPen()); - p->setBrush(QBrush()); - p->setBrushOrigin(0,0); - p->setBackground(QBrush()); - p->setFont(QFont()); - p->setTransform(QTransform()); - // The view transform is already recorded and included in the - // picture we're about to replay. If we don't turn if off, - // the view matrix will be applied twice. - p->setViewTransformEnabled(false); - p->setClipRegion(QRegion(), Qt::NoClip); - p->setClipPath(QPainterPath(), Qt::NoClip); - p->setClipping(false); - p->setOpacity(1.0f); -} - - -QT_END_NAMESPACE - -#endif // QT_NO_PRINTER diff --git a/src/gui/painting/qpaintengine_alpha_p.h b/src/gui/painting/qpaintengine_alpha_p.h deleted file mode 100644 index 5694e2a5bc..0000000000 --- a/src/gui/painting/qpaintengine_alpha_p.h +++ /dev/null @@ -1,135 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QPAINTENGINE_ALPHA_P_H -#define QPAINTENGINE_ALPHA_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists for the convenience -// of other Qt classes. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#ifndef QT_NO_PRINTER -#include "private/qpaintengine_p.h" - -QT_BEGIN_NAMESPACE - -class QAlphaPaintEnginePrivate; - -class QAlphaPaintEngine : public QPaintEngine -{ - Q_DECLARE_PRIVATE(QAlphaPaintEngine) -public: - ~QAlphaPaintEngine(); - - virtual bool begin(QPaintDevice *pdev); - virtual bool end(); - - virtual void updateState(const QPaintEngineState &state); - - virtual void drawPath(const QPainterPath &path); - - virtual void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode); - - virtual void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr); - virtual void drawImage(const QRectF &r, const QImage &image, const QRectF &sr); - virtual void drawTextItem(const QPointF &p, const QTextItem &textItem); - virtual void drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s); - -protected: - QAlphaPaintEngine(QAlphaPaintEnginePrivate &data, PaintEngineFeatures devcaps = 0); - QRegion alphaClipping() const; - bool continueCall() const; - void flushAndInit(bool init = true); - void cleanUp(); -}; - -class QAlphaPaintEnginePrivate : public QPaintEnginePrivate -{ - Q_DECLARE_PUBLIC(QAlphaPaintEngine) -public: - QAlphaPaintEnginePrivate(); - ~QAlphaPaintEnginePrivate(); - - int m_pass; - QPicture *m_pic; - QPaintEngine *m_picengine; - QPainter *m_picpainter; - - QPaintEngine::PaintEngineFeatures m_savedcaps; - QPaintDevice *m_pdev; - - QRegion m_alphargn; - QRegion m_cliprgn; - - bool m_hasalpha; - bool m_alphaPen; - bool m_alphaBrush; - bool m_alphaOpacity; - bool m_advancedPen; - bool m_advancedBrush; - bool m_complexTransform; - bool m_emulateProjectiveTransforms; - bool m_continueCall; - - QTransform m_transform; - QPen m_pen; - - void addAlphaRect(const QRectF &rect); - QRectF addPenWidth(const QPainterPath &path); - void drawAlphaImage(const QRectF &rect); - QRect toRect(const QRectF &rect) const; - bool fullyContained(const QRectF &rect) const; - - void resetState(QPainter *p); -}; - -QT_END_NAMESPACE - -#endif // QT_NO_PRINTER - -#endif // QPAINTENGINE_ALPHA_P_H diff --git a/src/gui/painting/qpaintengine_preview.cpp b/src/gui/painting/qpaintengine_preview.cpp deleted file mode 100644 index d3b7756516..0000000000 --- a/src/gui/painting/qpaintengine_preview.cpp +++ /dev/null @@ -1,223 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include -#include -#include - -#include -#include -#include - -#ifndef QT_NO_PRINTPREVIEWWIDGET -QT_BEGIN_NAMESPACE - -class QPreviewPaintEnginePrivate : public QPaintEnginePrivate -{ - Q_DECLARE_PUBLIC(QPreviewPaintEngine) -public: - QPreviewPaintEnginePrivate() : state(QPrinter::Idle) {} - ~QPreviewPaintEnginePrivate() {} - - QList pages; - QPaintEngine *engine; - QPainter *painter; - QPrinter::PrinterState state; - - QPaintEngine *proxy_paint_engine; - QPrintEngine *proxy_print_engine; -}; - - -QPreviewPaintEngine::QPreviewPaintEngine() - : QPaintEngine(*(new QPreviewPaintEnginePrivate), PaintEngineFeatures(AllFeatures & ~ObjectBoundingModeGradients)) -{ - Q_D(QPreviewPaintEngine); - d->proxy_print_engine = 0; - d->proxy_paint_engine = 0; -} - -QPreviewPaintEngine::~QPreviewPaintEngine() -{ - Q_D(QPreviewPaintEngine); - - qDeleteAll(d->pages); -} - -bool QPreviewPaintEngine::begin(QPaintDevice *) -{ - Q_D(QPreviewPaintEngine); - - qDeleteAll(d->pages); - d->pages.clear(); - - QPicture *page = new QPicture; - page->d_func()->in_memory_only = true; - d->painter = new QPainter(page); - d->engine = d->painter->paintEngine(); - d->pages.append(page); - d->state = QPrinter::Active; - return true; -} - -bool QPreviewPaintEngine::end() -{ - Q_D(QPreviewPaintEngine); - - delete d->painter; - d->painter = 0; - d->engine = 0; - d->state = QPrinter::Idle; - return true; -} - -void QPreviewPaintEngine::updateState(const QPaintEngineState &state) -{ - Q_D(QPreviewPaintEngine); - d->engine->updateState(state); -} - -void QPreviewPaintEngine::drawPath(const QPainterPath &path) -{ - Q_D(QPreviewPaintEngine); - d->engine->drawPath(path); -} - -void QPreviewPaintEngine::drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) -{ - Q_D(QPreviewPaintEngine); - d->engine->drawPolygon(points, pointCount, mode); -} - -void QPreviewPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem) -{ - Q_D(QPreviewPaintEngine); - d->engine->drawTextItem(p, textItem); -} - -void QPreviewPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) -{ - Q_D(QPreviewPaintEngine); - d->engine->drawPixmap(r, pm, sr); -} - -void QPreviewPaintEngine::drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &p) -{ - Q_D(QPreviewPaintEngine); - d->engine->drawTiledPixmap(r, pm, p); -} - -bool QPreviewPaintEngine::newPage() -{ - Q_D(QPreviewPaintEngine); - - QPicture *page = new QPicture; - page->d_func()->in_memory_only = true; - QPainter *tmp_painter = new QPainter(page); - QPaintEngine *tmp_engine = tmp_painter->paintEngine(); - - // copy the painter state from the original painter - Q_ASSERT(painter()->d_func()->state && tmp_painter->d_func()->state); - *tmp_painter->d_func()->state = *painter()->d_func()->state; - - // composition modes aren't supported on a QPrinter and yields a - // warning, so ignore it for now - tmp_engine->setDirty(DirtyFlags(AllDirty & ~DirtyCompositionMode)); - tmp_engine->syncState(); - - delete d->painter; - d->painter = tmp_painter; - d->pages.append(page); - d->engine = tmp_engine; - return true; -} - -bool QPreviewPaintEngine::abort() -{ - Q_D(QPreviewPaintEngine); - end(); - qDeleteAll(d->pages); - d->state = QPrinter::Aborted; - - return true; -} - -QList QPreviewPaintEngine::pages() -{ - Q_D(QPreviewPaintEngine); - return d->pages; -} - -void QPreviewPaintEngine::setProxyEngines(QPrintEngine *printEngine, QPaintEngine *paintEngine) -{ - Q_D(QPreviewPaintEngine); - d->proxy_print_engine = printEngine; - d->proxy_paint_engine = paintEngine; -} - -void QPreviewPaintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &value) -{ - Q_D(QPreviewPaintEngine); - d->proxy_print_engine->setProperty(key, value); -} - -QVariant QPreviewPaintEngine::property(PrintEnginePropertyKey key) const -{ - Q_D(const QPreviewPaintEngine); - return d->proxy_print_engine->property(key); -} - -int QPreviewPaintEngine::metric(QPaintDevice::PaintDeviceMetric id) const -{ - Q_D(const QPreviewPaintEngine); - return d->proxy_print_engine->metric(id); -} - -QPrinter::PrinterState QPreviewPaintEngine::printerState() const -{ - Q_D(const QPreviewPaintEngine); - return d->state; -} - -QT_END_NAMESPACE - -#endif diff --git a/src/gui/painting/qpaintengine_preview_p.h b/src/gui/painting/qpaintengine_preview_p.h deleted file mode 100644 index 902a03bd8f..0000000000 --- a/src/gui/painting/qpaintengine_preview_p.h +++ /dev/null @@ -1,106 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QPREVIEWPAINTENGINE_P_H -#define QPREVIEWPAINTENGINE_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists for the convenience -// of QPreviewPrinter and friends. This header file may change from -// version to version without notice, or even be removed. -// -// We mean it. -// -// - -#include -#include - -#ifndef QT_NO_PRINTPREVIEWWIDGET - -QT_BEGIN_NAMESPACE - -class QPreviewPaintEnginePrivate; - -class QPreviewPaintEngine : public QPaintEngine, public QPrintEngine -{ - Q_DECLARE_PRIVATE(QPreviewPaintEngine) -public: - QPreviewPaintEngine(); - ~QPreviewPaintEngine(); - - bool begin(QPaintDevice *dev); - bool end(); - - void updateState(const QPaintEngineState &state); - - void drawPath(const QPainterPath &path); - void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode); - void drawTextItem(const QPointF &p, const QTextItem &textItem); - - void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr); - void drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &p); - - QList pages(); - - QPaintEngine::Type type() const { return Picture; } - - void setProxyEngines(QPrintEngine *printEngine, QPaintEngine *paintEngine); - - void setProperty(PrintEnginePropertyKey key, const QVariant &value); - QVariant property(PrintEnginePropertyKey key) const; - - bool newPage(); - bool abort(); - - int metric(QPaintDevice::PaintDeviceMetric) const; - - QPrinter::PrinterState printerState() const; -}; - -QT_END_NAMESPACE - -#endif // QT_NO_PRINTPREVIEWWIDGET - -#endif diff --git a/src/gui/painting/qplatformprintersupport_qpa.cpp b/src/gui/painting/qplatformprintersupport_qpa.cpp deleted file mode 100644 index 9fb25c953f..0000000000 --- a/src/gui/painting/qplatformprintersupport_qpa.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qplatformprintersupport_qpa.h" - -#include - -#include - -#ifndef QT_NO_PRINTER - -QT_BEGIN_NAMESPACE - -QPlatformPrinterSupport::QPlatformPrinterSupport() -{ -} - -QPlatformPrinterSupport::~QPlatformPrinterSupport() -{ -} - -QPrintEngine *QPlatformPrinterSupport::createNativePrintEngine(QPrinter::PrinterMode) -{ - return 0; -} - -QPaintEngine *QPlatformPrinterSupport::createPaintEngine(QPrintEngine *, QPrinter::PrinterMode) -{ - return 0; -} - -QList QPlatformPrinterSupport::supportedPaperSizes(const QPrinterInfo &) const -{ - return QList(); -} - -QList QPlatformPrinterSupport::availablePrinters() -{ - return QList(); -} - -QPrinterInfo QPlatformPrinterSupport::defaultPrinter() -{ - const QList printers = availablePrinters(); - foreach (const QPrinterInfo &printerInfo, printers) { - if (printerInfo.isDefault()) - return printerInfo; - } - return printers.isEmpty() ? QPrinterInfo() : printers.front(); -} - -QPrinterInfo QPlatformPrinterSupport::printerInfo(const QString &printerName, bool isDefault) -{ - QPrinterInfo pi = QPrinterInfo(printerName); - pi.d_func()->isDefault = isDefault; - return pi; -} - -void QPlatformPrinterSupport::setPrinterInfoDefault(QPrinterInfo *p, bool isDefault) -{ - p->d_func()->isDefault = isDefault; -} - -bool QPlatformPrinterSupport::printerInfoIsDefault(const QPrinterInfo &p) -{ - return p.d_func()->isDefault; -} - -int QPlatformPrinterSupport::printerInfoCupsPrinterIndex(const QPrinterInfo &p) -{ - int i = -1; -#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_SYMBIAN)) || defined(Q_WS_QPA) -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - if (!p.isNull()) - return i = p.d_func()->cupsPrinterIndex; -#endif -#endif - Q_UNUSED(p) - return i; -} - -void QPlatformPrinterSupport::setPrinterInfoCupsPrinterIndex(QPrinterInfo *p, int index) -{ -#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_SYMBIAN)) || defined(Q_WS_QPA) -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - p->d_func()->cupsPrinterIndex = index; -#endif -#endif - Q_UNUSED(p) - Q_UNUSED(index) -} - -QT_END_NAMESPACE - -#endif // QT_NO_PRINTER diff --git a/src/gui/painting/qplatformprintersupport_qpa.h b/src/gui/painting/qplatformprintersupport_qpa.h deleted file mode 100644 index 90dd260925..0000000000 --- a/src/gui/painting/qplatformprintersupport_qpa.h +++ /dev/null @@ -1,84 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QPLATFORMPRINTINGSUPPORT_H -#define QPLATFORMPRINTINGSUPPORT_H - -#include - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Gui) - -#ifndef QT_NO_PRINTER - -class QPrintEngine; - -class Q_GUI_EXPORT QPlatformPrinterSupport -{ -public: - QPlatformPrinterSupport(); - virtual ~QPlatformPrinterSupport(); - - virtual QPrintEngine *createNativePrintEngine(QPrinter::PrinterMode printerMode); - virtual QPaintEngine *createPaintEngine(QPrintEngine *, QPrinter::PrinterMode printerMode); - virtual QList supportedPaperSizes(const QPrinterInfo &) const; - - virtual QList availablePrinters(); - virtual QPrinterInfo defaultPrinter(); - -protected: - static QPrinterInfo printerInfo(const QString &printerName, bool isDefault = false); - static void setPrinterInfoDefault(QPrinterInfo *p, bool isDefault); - static bool printerInfoIsDefault(const QPrinterInfo &p); - static int printerInfoCupsPrinterIndex(const QPrinterInfo &p); - static void setPrinterInfoCupsPrinterIndex(QPrinterInfo *p, int index); -}; - -#endif // QT_NO_PRINTER - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // QPLATFORMPRINTINGSUPPORT_H diff --git a/src/gui/painting/qprintengine.h b/src/gui/painting/qprintengine.h deleted file mode 100644 index da4fe2ac68..0000000000 --- a/src/gui/painting/qprintengine.h +++ /dev/null @@ -1,119 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QPRINTENGINE_H -#define QPRINTENGINE_H - -#include -#include - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Gui) - -#ifndef QT_NO_PRINTER - -class Q_GUI_EXPORT QPrintEngine -{ -public: - virtual ~QPrintEngine() {} - enum PrintEnginePropertyKey { - PPK_CollateCopies, - PPK_ColorMode, - PPK_Creator, - PPK_DocumentName, - PPK_FullPage, - PPK_NumberOfCopies, - PPK_Orientation, - PPK_OutputFileName, - PPK_PageOrder, - PPK_PageRect, - PPK_PageSize, - PPK_PaperRect, - PPK_PaperSource, - PPK_PrinterName, - PPK_PrinterProgram, - PPK_Resolution, - PPK_SelectionOption, - PPK_SupportedResolutions, - - PPK_WindowsPageSize, - PPK_FontEmbedding, - PPK_SuppressSystemPrintStatus, - - PPK_Duplex, - - PPK_PaperSources, - PPK_CustomPaperSize, - PPK_PageMargins, - PPK_CopyCount, - PPK_SupportsMultipleCopies, - PPK_PaperSize = PPK_PageSize, - - PPK_CustomBase = 0xff00 - }; - - virtual void setProperty(PrintEnginePropertyKey key, const QVariant &value) = 0; - virtual QVariant property(PrintEnginePropertyKey key) const = 0; - - virtual bool newPage() = 0; - virtual bool abort() = 0; - - virtual int metric(QPaintDevice::PaintDeviceMetric) const = 0; - - virtual QPrinter::PrinterState printerState() const = 0; - -#ifdef Q_WS_WIN - virtual HDC getPrinterDC() const { return 0; } - virtual void releasePrinterDC(HDC) const { } -#endif - -}; - -#endif // QT_NO_PRINTER - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // QPRINTENGINE_H diff --git a/src/gui/painting/qprintengine_pdf.cpp b/src/gui/painting/qprintengine_pdf.cpp deleted file mode 100644 index df9a939e4b..0000000000 --- a/src/gui/painting/qprintengine_pdf.cpp +++ /dev/null @@ -1,648 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -#include -#include -#include -#include -#include "private/qcups_p.h" -#include "qprinterinfo.h" - -#ifndef QT_NO_PRINTER -#include -#include - -#include "qprintengine_pdf_p.h" - -#ifdef Q_OS_UNIX -#include "private/qcore_unix_p.h" // overrides QT_OPEN -#endif - -QT_BEGIN_NAMESPACE - -//#define FONT_DUMP - -extern QSizeF qt_paperSizeToQSizeF(QPrinter::PaperSize size); - -#define Q_MM(n) int((n * 720 + 127) / 254) -#define Q_IN(n) int(n * 72) - -static const char * const psToStr[QPrinter::NPaperSize+1] = -{ - "A4", "B5", "Letter", "Legal", "Executive", - "A0", "A1", "A2", "A3", "A5", "A6", "A7", "A8", "A9", "B0", "B1", - "B10", "B2", "B3", "B4", "B6", "B7", "B8", "B9", "C5E", "Comm10E", - "DLE", "Folio", "Ledger", "Tabloid", 0 -}; - -QPdf::PaperSize QPdf::paperSize(QPrinter::PaperSize paperSize) -{ - QSizeF s = qt_paperSizeToQSizeF(paperSize); - PaperSize p = { Q_MM(s.width()), Q_MM(s.height()) }; - return p; -} - -const char *QPdf::paperSizeToString(QPrinter::PaperSize paperSize) -{ - return psToStr[paperSize]; -} - - -QPdfPrintEngine::QPdfPrintEngine(QPrinter::PrinterMode m) - : QPdfEngine(*new QPdfPrintEnginePrivate(m)) -{ - Q_D(QPdfPrintEngine); -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - if (QCUPSSupport::isAvailable()) { - QCUPSSupport cups; - const cups_dest_t* printers = cups.availablePrinters(); - int prnCount = cups.availablePrintersCount(); - - for (int i = 0; i < prnCount; ++i) { - if (printers[i].is_default) { - d->printerName = QString::fromLocal8Bit(printers[i].name); - break; - } - } - - } else -#endif - { - d->printerName = QString::fromLocal8Bit(qgetenv("PRINTER")); - if (d->printerName.isEmpty()) - d->printerName = QString::fromLocal8Bit(qgetenv("LPDEST")); - if (d->printerName.isEmpty()) - d->printerName = QString::fromLocal8Bit(qgetenv("NPRINTER")); - if (d->printerName.isEmpty()) - d->printerName = QString::fromLocal8Bit(qgetenv("NGPRINTER")); - } - - state = QPrinter::Idle; -} - -QPdfPrintEngine::~QPdfPrintEngine() -{ -} - -bool QPdfPrintEngine::begin(QPaintDevice *pdev) -{ - Q_D(QPdfPrintEngine); - - if (!d->openPrintDevice()) { - state = QPrinter::Error; - return false; - } - state = QPrinter::Active; - - return QPdfEngine::begin(pdev); -} - -bool QPdfPrintEngine::end() -{ - Q_D(QPdfPrintEngine); - - QPdfEngine::end(); - - d->closePrintDevice(); - state = QPrinter::Idle; - - return true; -} - -bool QPdfPrintEngine::newPage() -{ - return QPdfEngine::newPage(); -} - -int QPdfPrintEngine::metric(QPaintDevice::PaintDeviceMetric m) const -{ - return QPdfEngine::metric(m); -} - -void QPdfPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &value) -{ - Q_D(QPdfPrintEngine); - - switch (int(key)) { - case PPK_CollateCopies: - d->collate = value.toBool(); - break; - case PPK_ColorMode: - d->grayscale = (QPrinter::ColorMode(value.toInt()) == QPrinter::GrayScale); - break; - case PPK_Creator: - d->creator = value.toString(); - break; - case PPK_DocumentName: - d->title = value.toString(); - break; - case PPK_FullPage: - d->fullPage = value.toBool(); - break; - case PPK_CopyCount: // fallthrough - case PPK_NumberOfCopies: - d->copies = value.toInt(); - break; - case PPK_Orientation: - d->landscape = (QPrinter::Orientation(value.toInt()) == QPrinter::Landscape); - break; - case PPK_OutputFileName: - d->outputFileName = value.toString(); - break; - case PPK_PageOrder: - d->pageOrder = QPrinter::PageOrder(value.toInt()); - break; - case PPK_PaperSize: - d->printerPaperSize = QPrinter::PaperSize(value.toInt()); - d->updatePaperSize(); - break; - case PPK_PaperSource: - d->paperSource = QPrinter::PaperSource(value.toInt()); - break; - case PPK_PrinterName: - d->printerName = value.toString(); - break; - case PPK_PrinterProgram: - d->printProgram = value.toString(); - break; - case PPK_Resolution: - d->resolution = value.toInt(); - break; - case PPK_SelectionOption: - d->selectionOption = value.toString(); - break; - case PPK_FontEmbedding: - d->embedFonts = value.toBool(); - break; - case PPK_Duplex: - d->duplex = static_cast (value.toInt()); - break; - case PPK_CupsPageRect: - d->cupsPageRect = value.toRect(); - break; - case PPK_CupsPaperRect: - d->cupsPaperRect = value.toRect(); - break; - case PPK_CupsOptions: - d->cupsOptions = value.toStringList(); - break; - case PPK_CupsStringPageSize: - d->cupsStringPageSize = value.toString(); - break; - case PPK_CustomPaperSize: - d->printerPaperSize = QPrinter::Custom; - d->customPaperSize = value.toSizeF(); - d->updatePaperSize(); - break; - case PPK_PageMargins: - { - QList margins(value.toList()); - Q_ASSERT(margins.size() == 4); - d->leftMargin = margins.at(0).toReal(); - d->topMargin = margins.at(1).toReal(); - d->rightMargin = margins.at(2).toReal(); - d->bottomMargin = margins.at(3).toReal(); - break; - } - default: - break; - } -} - -QVariant QPdfPrintEngine::property(PrintEnginePropertyKey key) const -{ - Q_D(const QPdfPrintEngine); - - QVariant ret; - switch (int(key)) { - case PPK_CollateCopies: - ret = d->collate; - break; - case PPK_ColorMode: - ret = d->grayscale ? QPrinter::GrayScale : QPrinter::Color; - break; - case PPK_Creator: - ret = d->creator; - break; - case PPK_DocumentName: - ret = d->title; - break; - case PPK_FullPage: - ret = d->fullPage; - break; - case PPK_CopyCount: - ret = d->copies; - break; - case PPK_SupportsMultipleCopies: -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - if (QCUPSSupport::isAvailable()) - ret = true; - else -#endif - ret = false; - break; - case PPK_NumberOfCopies: -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - if (QCUPSSupport::isAvailable()) - ret = 1; - else -#endif - ret = d->copies; - break; - case PPK_Orientation: - ret = d->landscape ? QPrinter::Landscape : QPrinter::Portrait; - break; - case PPK_OutputFileName: - ret = d->outputFileName; - break; - case PPK_PageOrder: - ret = d->pageOrder; - break; - case PPK_PaperSize: - ret = d->paperSize; - break; - case PPK_PaperSource: - ret = d->paperSource; - break; - case PPK_PrinterName: - ret = d->printerName; - break; - case PPK_PrinterProgram: - ret = d->printProgram; - break; - case PPK_Resolution: - ret = d->resolution; - break; - case PPK_SupportedResolutions: - ret = QList() << 72; - break; - case PPK_PaperRect: - ret = d->paperRect(); - break; - case PPK_PageRect: - ret = d->pageRect(); - break; - case PPK_SelectionOption: - ret = d->selectionOption; - break; - case PPK_FontEmbedding: - ret = d->embedFonts; - break; - case PPK_Duplex: - ret = d->duplex; - break; - case PPK_CupsPageRect: - ret = d->cupsPageRect; - break; - case PPK_CupsPaperRect: - ret = d->cupsPaperRect; - break; - case PPK_CupsOptions: - ret = d->cupsOptions; - break; - case PPK_CupsStringPageSize: - ret = d->cupsStringPageSize; - break; - case PPK_CustomPaperSize: - ret = d->customPaperSize; - break; - case PPK_PageMargins: - { - QList margins; - margins << d->leftMargin << d->topMargin - << d->rightMargin << d->bottomMargin; - ret = margins; - break; - } - default: - break; - } - return ret; -} - - -#ifndef QT_NO_LPR -static void closeAllOpenFds() -{ - // hack time... getting the maximum number of open - // files, if possible. if not we assume it's the - // larger of 256 and the fd we got - int i; -#if defined(_SC_OPEN_MAX) - i = (int)sysconf(_SC_OPEN_MAX); -#elif defined(_POSIX_OPEN_MAX) - i = (int)_POSIX_OPEN_MAX; -#elif defined(OPEN_MAX) - i = (int)OPEN_MAX; -#else - i = 256; -#endif - // leave stdin/out/err untouched - while(--i > 2) - QT_CLOSE(i); -} -#endif - -bool QPdfPrintEnginePrivate::openPrintDevice() -{ - if (outDevice) - return false; - - if (!outputFileName.isEmpty()) { - QFile *file = new QFile(outputFileName); - if (! file->open(QFile::WriteOnly|QFile::Truncate)) { - delete file; - return false; - } - outDevice = file; -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - } else if (QCUPSSupport::isAvailable()) { - QCUPSSupport cups; - QPair ret = cups.tempFd(); - if (ret.first < 0) { - qWarning("QPdfPrinter: Could not open temporary file to print"); - return false; - } - cupsTempFile = ret.second; - outDevice = new QFile(); - static_cast(outDevice)->open(ret.first, QIODevice::WriteOnly); -#endif -#ifndef QT_NO_LPR - } else { - QString pr; - if (!printerName.isEmpty()) - pr = printerName; - int fds[2]; - if (qt_safe_pipe(fds) != 0) { - qWarning("QPdfPrinter: Could not open pipe to print"); - return false; - } - - pid_t pid = fork(); - if (pid == 0) { // child process - // if possible, exit quickly, so the actual lp/lpr - // becomes a child of init, and ::waitpid() is - // guaranteed not to wait. - if (fork() > 0) { - closeAllOpenFds(); - - // try to replace this process with "true" - this prevents - // global destructors from being called (that could possibly - // do wrong things to the parent process) - (void)execlp("true", "true", (char *)0); - (void)execl("/bin/true", "true", (char *)0); - (void)execl("/usr/bin/true", "true", (char *)0); - ::_exit(0); - } - qt_safe_dup2(fds[0], 0, 0); - - closeAllOpenFds(); - - if (!printProgram.isEmpty()) { - if (!selectionOption.isEmpty()) - pr.prepend(selectionOption); - else - pr.prepend(QLatin1String("-P")); - (void)execlp(printProgram.toLocal8Bit().data(), printProgram.toLocal8Bit().data(), - pr.toLocal8Bit().data(), (char *)0); - } else { - // if no print program has been specified, be smart - // about the option string too. - QList lprhack; - QList lphack; - QByteArray media; - if (!pr.isEmpty() || !selectionOption.isEmpty()) { - if (!selectionOption.isEmpty()) { - QStringList list = selectionOption.split(QLatin1Char(' ')); - for (int i = 0; i < list.size(); ++i) - lprhack.append(list.at(i).toLocal8Bit()); - lphack = lprhack; - } else { - lprhack.append("-P"); - lphack.append("-d"); - } - lprhack.append(pr.toLocal8Bit()); - lphack.append(pr.toLocal8Bit()); - } - lphack.append("-s"); - - char ** lpargs = new char *[lphack.size()+6]; - char lp[] = "lp"; - lpargs[0] = lp; - int i; - for (i = 0; i < lphack.size(); ++i) - lpargs[i+1] = (char *)lphack.at(i).constData(); -#ifndef Q_OS_OSF - if (QPdf::paperSizeToString(printerPaperSize)) { - char dash_o[] = "-o"; - lpargs[++i] = dash_o; - lpargs[++i] = const_cast(QPdf::paperSizeToString(printerPaperSize)); - lpargs[++i] = dash_o; - media = "media="; - media += QPdf::paperSizeToString(printerPaperSize); - lpargs[++i] = media.data(); - } -#endif - lpargs[++i] = 0; - char **lprargs = new char *[lprhack.size()+2]; - char lpr[] = "lpr"; - lprargs[0] = lpr; - for (int i = 0; i < lprhack.size(); ++i) - lprargs[i+1] = (char *)lprhack[i].constData(); - lprargs[lprhack.size() + 1] = 0; - (void)execvp("lp", lpargs); - (void)execvp("lpr", lprargs); - (void)execv("/bin/lp", lpargs); - (void)execv("/bin/lpr", lprargs); - (void)execv("/usr/bin/lp", lpargs); - (void)execv("/usr/bin/lpr", lprargs); - - delete []lpargs; - delete []lprargs; - } - // if we couldn't exec anything, close the fd, - // wait for a second so the parent process (the - // child of the GUI process) has exited. then - // exit. - QT_CLOSE(0); - (void)::sleep(1); - ::_exit(0); - } - // parent process - QT_CLOSE(fds[0]); - fd = fds[1]; - (void)qt_safe_waitpid(pid, 0, 0); - - if (fd < 0) - return false; - - outDevice = new QFile(); - static_cast(outDevice)->open(fd, QIODevice::WriteOnly); -#endif - } - - return true; -} - -void QPdfPrintEnginePrivate::closePrintDevice() -{ -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - if (!cupsTempFile.isEmpty()) { - QString tempFile = cupsTempFile; - cupsTempFile.clear(); - QCUPSSupport cups; - - // Set up print options. - QByteArray prnName; - QList > options; - QVector cupsOptStruct; - - if (!printerName.isEmpty()) { - prnName = printerName.toLocal8Bit(); - } else { - QPrinterInfo def = QPrinterInfo::defaultPrinter(); - if (def.isNull()) { - qWarning("Could not determine printer to print to"); - QFile::remove(tempFile); - return; - } - prnName = def.printerName().toLocal8Bit(); - } - - if (!cupsStringPageSize.isEmpty()) { - options.append(QPair("media", cupsStringPageSize.toLocal8Bit())); - } - - if (copies > 1) { - options.append(QPair("copies", QString::number(copies).toLocal8Bit())); - } - - if (collate) { - options.append(QPair("Collate", "True")); - } - - if (duplex != QPrinter::DuplexNone) { - switch(duplex) { - case QPrinter::DuplexNone: break; - case QPrinter::DuplexAuto: - if (!landscape) - options.append(QPair("sides", "two-sided-long-edge")); - else - options.append(QPair("sides", "two-sided-short-edge")); - break; - case QPrinter::DuplexLongSide: - options.append(QPair("sides", "two-sided-long-edge")); - break; - case QPrinter::DuplexShortSide: - options.append(QPair("sides", "two-sided-short-edge")); - break; - } - } - - if (QCUPSSupport::cupsVersion() >= 10300 && landscape) { - options.append(QPair("landscape", "")); - } - - QStringList::const_iterator it = cupsOptions.constBegin(); - while (it != cupsOptions.constEnd()) { - options.append(QPair((*it).toLocal8Bit(), (*(it+1)).toLocal8Bit())); - it += 2; - } - - for (int c = 0; c < options.size(); ++c) { - cups_option_t opt; - opt.name = options[c].first.data(); - opt.value = options[c].second.data(); - cupsOptStruct.append(opt); - } - - // Print the file. - cups_option_t* optPtr = cupsOptStruct.size() ? &cupsOptStruct.first() : 0; - cups.printFile(prnName.constData(), tempFile.toLocal8Bit().constData(), - title.toLocal8Bit().constData(), cupsOptStruct.size(), optPtr); - - QFile::remove(tempFile); - } -#endif -} - - - -QPdfPrintEnginePrivate::QPdfPrintEnginePrivate(QPrinter::PrinterMode m) - : QPdfEnginePrivate(), - duplex(QPrinter::DuplexNone), - collate(false), - copies(1), - pageOrder(QPrinter::FirstPageFirst), - paperSource(QPrinter::Auto), - printerPaperSize(QPrinter::A4) -{ - resolution = 72; - if (m == QPrinter::HighResolution) - resolution = 1200; - else if (m == QPrinter::ScreenResolution) - resolution = qt_defaultDpi(); -} - -QPdfPrintEnginePrivate::~QPdfPrintEnginePrivate() -{ -} - - -void QPdfPrintEnginePrivate::updatePaperSize() -{ - if (printerPaperSize == QPrinter::Custom) { - paperSize = customPaperSize; - } else if (!cupsPaperRect.isNull()) { - QRect r = cupsPaperRect; - paperSize = r.size(); - } else{ - QPdf::PaperSize s = QPdf::paperSize(printerPaperSize); - paperSize = QSize(s.width, s.height); - } -} - - -QT_END_NAMESPACE - -#endif // QT_NO_PRINTER diff --git a/src/gui/painting/qprintengine_pdf_p.h b/src/gui/painting/qprintengine_pdf_p.h deleted file mode 100644 index 367e3aebab..0000000000 --- a/src/gui/painting/qprintengine_pdf_p.h +++ /dev/null @@ -1,163 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QPRINTENGINE_PDF_P_H -#define QPRINTENGINE_PDF_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "QtGui/qprintengine.h" - -#ifndef QT_NO_PRINTER -#include "QtCore/qmap.h" -#include "QtGui/qmatrix.h" -#include "QtCore/qstring.h" -#include "QtCore/qvector.h" -#include "QtGui/qpaintengine.h" -#include "QtGui/qpainterpath.h" -#include "QtCore/qdatastream.h" - -#include "private/qfontengine_p.h" -#include "private/qpdf_p.h" -#include "private/qpaintengine_p.h" -#include "qprintengine.h" - -QT_BEGIN_NAMESPACE - -class QImage; -class QDataStream; -class QPen; -class QPointF; -class QRegion; -class QFile; -class QPdfPrintEngine; - -#define PPK_CupsOptions QPrintEngine::PrintEnginePropertyKey(0xfe00) -#define PPK_CupsPageRect QPrintEngine::PrintEnginePropertyKey(0xfe01) -#define PPK_CupsPaperRect QPrintEngine::PrintEnginePropertyKey(0xfe02) -#define PPK_CupsStringPageSize QPrintEngine::PrintEnginePropertyKey(0xfe03) - -namespace QPdf { - - struct PaperSize { - int width, height; // in postscript points - }; - Q_GUI_EXPORT PaperSize paperSize(QPrinter::PaperSize paperSize); - Q_GUI_EXPORT const char *paperSizeToString(QPrinter::PaperSize paperSize); -} - -class QPdfPrintEnginePrivate; - -class QPdfPrintEngine : public QPdfEngine, public QPrintEngine -{ - Q_DECLARE_PRIVATE(QPdfPrintEngine) -public: - QPdfPrintEngine(QPrinter::PrinterMode m); - virtual ~QPdfPrintEngine(); - - // reimplementations QPaintEngine - bool begin(QPaintDevice *pdev); - bool end(); - // end reimplementations QPaintEngine - - // reimplementations QPrintEngine - bool abort() {return false;} - QPrinter::PrinterState printerState() const {return state;} - - bool newPage(); - int metric(QPaintDevice::PaintDeviceMetric) const; - void setProperty(PrintEnginePropertyKey key, const QVariant &value); - QVariant property(PrintEnginePropertyKey key) const; - // end reimplementations QPrintEngine - - QPrinter::PrinterState state; - -private: - Q_DISABLE_COPY(QPdfPrintEngine) -}; - -class QPdfPrintEnginePrivate : public QPdfEnginePrivate -{ - Q_DECLARE_PUBLIC(QPdfPrintEngine) -public: - QPdfPrintEnginePrivate(QPrinter::PrinterMode m); - ~QPdfPrintEnginePrivate(); - - bool openPrintDevice(); - void closePrintDevice(); - - void updatePaperSize(); - -private: - Q_DISABLE_COPY(QPdfPrintEnginePrivate) - - QString printerName; - QString printProgram; - QString selectionOption; - QStringList cupsOptions; - QString cupsStringPageSize; - - QPrinter::DuplexMode duplex; - bool collate; - int copies; - QPrinter::PageOrder pageOrder; - QPrinter::PaperSource paperSource; - - QPrinter::PaperSize printerPaperSize; - QRect cupsPaperRect; - QRect cupsPageRect; - QSizeF customPaperSize; // in postscript points -}; - -QT_END_NAMESPACE - -#endif // QT_NO_PRINTER - -#endif // QPRINTENGINE_PDF_P_H diff --git a/src/gui/painting/qprinter.cpp b/src/gui/painting/qprinter.cpp deleted file mode 100644 index bdbddf20c4..0000000000 --- a/src/gui/painting/qprinter.cpp +++ /dev/null @@ -1,2280 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qprinter_p.h" -#include "qprinter.h" -#include "qprintengine.h" -#include "qprinterinfo.h" -#include "qlist.h" -#include -#include -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) -#include "private/qcups_p.h" -#endif - -#ifndef QT_NO_PRINTER - -#include -#include - -#if defined (Q_WS_WIN) -#include -#elif defined (Q_WS_MAC) -#include -#elif defined (QTOPIA_PRINTENGINE) -#include -#endif - -#if defined(Q_WS_X11) -#include -#endif - -#ifndef QT_NO_PDF -#include "qprintengine_pdf_p.h" -#endif - -#include -#include - -QT_BEGIN_NAMESPACE - -#define ABORT_IF_ACTIVE(location) \ - if (d->printEngine->printerState() == QPrinter::Active) { \ - qWarning("%s: Cannot be changed while printer is active", location); \ - return; \ - } - -// NB! This table needs to be in sync with QPrinter::PaperSize -static const float qt_paperSizes[][2] = { - {210, 297}, // A4 - {176, 250}, // B5 - {215.9f, 279.4f}, // Letter - {215.9f, 355.6f}, // Legal - {190.5f, 254}, // Executive - {841, 1189}, // A0 - {594, 841}, // A1 - {420, 594}, // A2 - {297, 420}, // A3 - {148, 210}, // A5 - {105, 148}, // A6 - {74, 105}, // A7 - {52, 74}, // A8 - {37, 52}, // A8 - {1000, 1414}, // B0 - {707, 1000}, // B1 - {31, 44}, // B10 - {500, 707}, // B2 - {353, 500}, // B3 - {250, 353}, // B4 - {125, 176}, // B6 - {88, 125}, // B7 - {62, 88}, // B8 - {33, 62}, // B9 - {163, 229}, // C5E - {105, 241}, // US Common - {110, 220}, // DLE - {210, 330}, // Folio - {431.8f, 279.4f}, // Ledger - {279.4f, 431.8f} // Tabloid -}; - -/// return the multiplier of converting from the unit value to postscript-points. -Q_GUI_EXPORT double qt_multiplierForUnit(QPrinter::Unit unit, int resolution) -{ - switch(unit) { - case QPrinter::Millimeter: - return 2.83464566929; - case QPrinter::Point: - return 1.0; - case QPrinter::Inch: - return 72.0; - case QPrinter::Pica: - return 12; - case QPrinter::Didot: - return 1.065826771; - case QPrinter::Cicero: - return 12.789921252; - case QPrinter::DevicePixel: - return 72.0/resolution; - } - return 1.0; -} - -// not static: it's needed in qpagesetupdialog_unix.cpp -Q_GUI_EXPORT QSizeF qt_printerPaperSize(QPrinter::Orientation orientation, - QPrinter::PaperSize paperSize, - QPrinter::Unit unit, - int resolution) -{ - int width_index = 0; - int height_index = 1; - if (orientation == QPrinter::Landscape) { - width_index = 1; - height_index = 0; - } - const qreal multiplier = qt_multiplierForUnit(unit, resolution); - return QSizeF((qt_paperSizes[paperSize][width_index] * 72 / 25.4) / multiplier, - (qt_paperSizes[paperSize][height_index] * 72 / 25.4) / multiplier); -} - -void QPrinterPrivate::createDefaultEngines() -{ - QPrinter::OutputFormat realOutputFormat = outputFormat; -#if !defined (QTOPIA_PRINTENGINE) -#if defined (Q_OS_UNIX) && ! defined (Q_WS_MAC) - if(outputFormat == QPrinter::NativeFormat) { - realOutputFormat = QPrinter::PdfFormat; - } -#endif -#endif - - switch (realOutputFormat) { - case QPrinter::NativeFormat: { -#if defined (Q_WS_QPA) - printEngine = QGuiApplicationPrivate::platformIntegration()->printerSupport()->createNativePrintEngine(printerMode); - paintEngine = QGuiApplicationPrivate::platformIntegration()->printerSupport()->createPaintEngine(printEngine, printerMode); -#elif defined (Q_WS_WIN) - QWin32PrintEngine *winEngine = new QWin32PrintEngine(printerMode); - paintEngine = winEngine; - printEngine = winEngine; -#elif defined (Q_WS_MAC) - QMacPrintEngine *macEngine = new QMacPrintEngine(printerMode); - paintEngine = macEngine; - printEngine = macEngine; -#elif defined (QTOPIA_PRINTENGINE) - QtopiaPrintEngine *qwsEngine = new QtopiaPrintEngine(printerMode); - paintEngine = qwsEngine; - printEngine = qwsEngine; -#elif defined (Q_OS_UNIX) - Q_ASSERT(false); -#endif - } - break; - case QPrinter::PdfFormat: { - QPdfPrintEngine *pdfEngine = new QPdfPrintEngine(printerMode); - paintEngine = pdfEngine; - printEngine = pdfEngine; - } - break; - } - use_default_engine = true; - had_default_engines = true; -} - -#ifndef QT_NO_PRINTPREVIEWWIDGET -QList QPrinterPrivate::previewPages() const -{ - if (previewEngine) - return previewEngine->pages(); - return QList(); -} - -void QPrinterPrivate::setPreviewMode(bool enable) -{ - Q_Q(QPrinter); - if (enable) { - if (!previewEngine) - previewEngine = new QPreviewPaintEngine; - had_default_engines = use_default_engine; - use_default_engine = false; - realPrintEngine = printEngine; - realPaintEngine = paintEngine; - q->setEngines(previewEngine, previewEngine); - previewEngine->setProxyEngines(realPrintEngine, realPaintEngine); - } else { - q->setEngines(realPrintEngine, realPaintEngine); - use_default_engine = had_default_engines; - } -} -#endif // QT_NO_PRINTPREVIEWWIDGET - -void QPrinterPrivate::addToManualSetList(QPrintEngine::PrintEnginePropertyKey key) -{ - for (int c = 0; c < manualSetList.size(); ++c) { - if (manualSetList[c] == key) return; - } - manualSetList.append(key); -} - - -/*! - \class QPrinter - \reentrant - - \brief The QPrinter class is a paint device that paints on a printer. - - \ingroup printing - - - This device represents a series of pages of printed output, and is - used in almost exactly the same way as other paint devices such as - QWidget and QPixmap. - A set of additional functions are provided to manage device-specific - features, such as orientation and resolution, and to step through - the pages in a document as it is generated. - - When printing directly to a printer on Windows or Mac OS X, QPrinter uses - the built-in printer drivers. On X11, QPrinter uses the - \l{Common Unix Printing System (CUPS)} or the standard Unix \l lpr utility - to send PDF output to the printer. As an alternative, - the printProgram() function can be used to specify the command or utility - to use instead of the system default. - - Note that setting parameters like paper size and resolution on an - invalid printer is undefined. You can use QPrinter::isValid() to - verify this before changing any parameters. - - QPrinter supports a number of parameters, most of which can be - changed by the end user through a \l{QPrintDialog}{print dialog}. In - general, QPrinter passes these functions onto the underlying QPrintEngine. - - The most important parameters are: - \list - \i setOrientation() tells QPrinter which page orientation to use. - \i setPaperSize() tells QPrinter what paper size to expect from the - printer. - \i setResolution() tells QPrinter what resolution you wish the - printer to provide, in dots per inch (DPI). - \i setFullPage() tells QPrinter whether you want to deal with the - full page or just with the part the printer can draw on. - \i setCopyCount() tells QPrinter how many copies of the document - it should print. - \endlist - - Many of these functions can only be called before the actual printing - begins (i.e., before QPainter::begin() is called). This usually makes - sense because, for example, it's not possible to change the number of - copies when you are halfway through printing. There are also some - settings that the user sets (through the printer dialog) and that - applications are expected to obey. See QAbstractPrintDialog's - documentation for more details. - - When QPainter::begin() is called, the QPrinter it operates on is prepared for - a new page, enabling the QPainter to be used immediately to paint the first - page in a document. Once the first page has been painted, newPage() can be - called to request a new blank page to paint on, or QPainter::end() can be - called to finish printing. The second page and all following pages are - prepared using a call to newPage() before they are painted. - - The first page in a document does not need to be preceded by a call to - newPage(). You only need to calling newPage() after QPainter::begin() if you - need to insert a blank page at the beginning of a printed document. - Similarly, calling newPage() after the last page in a document is painted will - result in a trailing blank page appended to the end of the printed document. - - If you want to abort the print job, abort() will try its best to - stop printing. It may cancel the entire job or just part of it. - - Since QPrinter can print to any QPrintEngine subclass, it is possible to - extend printing support to cover new types of printing subsystem by - subclassing QPrintEngine and reimplementing its interface. - - \sa QPrintDialog, {Printing with Qt} -*/ - -/*! - \enum QPrinter::PrinterState - - \value Idle - \value Active - \value Aborted - \value Error -*/ - -/*! - \enum QPrinter::PrinterMode - - This enum describes the mode the printer should work in. It - basically presets a certain resolution and working mode. - - \value ScreenResolution Sets the resolution of the print device to - the screen resolution. This has the big advantage that the results - obtained when painting on the printer will match more or less - exactly the visible output on the screen. It is the easiest to - use, as font metrics on the screen and on the printer are the - same. This is the default value. ScreenResolution will produce a - lower quality output than HighResolution and should only be used - for drafts. - - \value PrinterResolution This value is deprecated. Is is - equivalent to ScreenResolution on Unix and HighResolution on - Windows and Mac. Due do the difference between ScreenResolution - and HighResolution, use of this value may lead to non-portable - printer code. - - \value HighResolution On Windows, sets the printer resolution to that - defined for the printer in use. For PDF printing, sets the - resolution of the PDF driver to 1200 dpi. - - \note When rendering text on a QPrinter device, it is important - to realize that the size of text, when specified in points, is - independent of the resolution specified for the device itself. - Therefore, it may be useful to specify the font size in pixels - when combining text with graphics to ensure that their relative - sizes are what you expect. -*/ - -/*! - \enum QPrinter::Orientation - - This enum type (not to be confused with \c Orientation) is used - to specify each page's orientation. - - \value Portrait the page's height is greater than its width. - - \value Landscape the page's width is greater than its height. - - This type interacts with \l QPrinter::PaperSize and - QPrinter::setFullPage() to determine the final size of the page - available to the application. -*/ - - -/*! - \enum QPrinter::PrintRange - - Used to specify the print range selection option. - - \value AllPages All pages should be printed. - \value Selection Only the selection should be printed. - \value PageRange The specified page range should be printed. - \value CurrentPage Only the current page should be printed. - - \sa QAbstractPrintDialog::PrintRange -*/ - -/*! - \enum QPrinter::PrinterOption - \compat - - Use QAbstractPrintDialog::PrintDialogOption instead. - - \value PrintToFile - \value PrintSelection - \value PrintPageRange -*/ - -/*! - \enum QPrinter::PageSize - - \obsolete - Use QPrinter::PaperSize instead. - - \value A0 841 x 1189 mm - \value A1 594 x 841 mm - \value A2 420 x 594 mm - \value A3 297 x 420 mm - \value A4 210 x 297 mm, 8.26 x 11.69 inches - \value A5 148 x 210 mm - \value A6 105 x 148 mm - \value A7 74 x 105 mm - \value A8 52 x 74 mm - \value A9 37 x 52 mm - \value B0 1030 x 1456 mm - \value B1 728 x 1030 mm - \value B10 32 x 45 mm - \value B2 515 x 728 mm - \value B3 364 x 515 mm - \value B4 257 x 364 mm - \value B5 182 x 257 mm, 7.17 x 10.13 inches - \value B6 128 x 182 mm - \value B7 91 x 128 mm - \value B8 64 x 91 mm - \value B9 45 x 64 mm - \value C5E 163 x 229 mm - \value Comm10E 105 x 241 mm, U.S. Common 10 Envelope - \value DLE 110 x 220 mm - \value Executive 7.5 x 10 inches, 191 x 254 mm - \value Folio 210 x 330 mm - \value Ledger 432 x 279 mm - \value Legal 8.5 x 14 inches, 216 x 356 mm - \value Letter 8.5 x 11 inches, 216 x 279 mm - \value Tabloid 279 x 432 mm - \value Custom Unknown, or a user defined size. - - \omitvalue NPageSize - */ - -/*! - \enum QPrinter::PaperSize - \since 4.4 - - This enum type specifies what paper size QPrinter should use. - QPrinter does not check that the paper size is available; it just - uses this information, together with QPrinter::Orientation and - QPrinter::setFullPage(), to determine the printable area. - - The defined sizes (with setFullPage(true)) are: - - \value A0 841 x 1189 mm - \value A1 594 x 841 mm - \value A2 420 x 594 mm - \value A3 297 x 420 mm - \value A4 210 x 297 mm, 8.26 x 11.69 inches - \value A5 148 x 210 mm - \value A6 105 x 148 mm - \value A7 74 x 105 mm - \value A8 52 x 74 mm - \value A9 37 x 52 mm - \value B0 1000 x 1414 mm - \value B1 707 x 1000 mm - \value B2 500 x 707 mm - \value B3 353 x 500 mm - \value B4 250 x 353 mm - \value B5 176 x 250 mm, 6.93 x 9.84 inches - \value B6 125 x 176 mm - \value B7 88 x 125 mm - \value B8 62 x 88 mm - \value B9 33 x 62 mm - \value B10 31 x 44 mm - \value C5E 163 x 229 mm - \value Comm10E 105 x 241 mm, U.S. Common 10 Envelope - \value DLE 110 x 220 mm - \value Executive 7.5 x 10 inches, 190.5 x 254 mm - \value Folio 210 x 330 mm - \value Ledger 431.8 x 279.4 mm - \value Legal 8.5 x 14 inches, 215.9 x 355.6 mm - \value Letter 8.5 x 11 inches, 215.9 x 279.4 mm - \value Tabloid 279.4 x 431.8 mm - \value Custom Unknown, or a user defined size. - - With setFullPage(false) (the default), the metrics will be a bit - smaller; how much depends on the printer in use. - - \omitvalue NPageSize - \omitvalue NPaperSize -*/ - - -/*! - \enum QPrinter::PageOrder - - This enum type is used by QPrinter to tell the application program - how to print. - - \value FirstPageFirst the lowest-numbered page should be printed - first. - - \value LastPageFirst the highest-numbered page should be printed - first. -*/ - -/*! - \enum QPrinter::ColorMode - - This enum type is used to indicate whether QPrinter should print - in color or not. - - \value Color print in color if available, otherwise in grayscale. - - \value GrayScale print in grayscale, even on color printers. -*/ - -/*! - \enum QPrinter::PaperSource - - This enum type specifies what paper source QPrinter is to use. - QPrinter does not check that the paper source is available; it - just uses this information to try and set the paper source. - Whether it will set the paper source depends on whether the - printer has that particular source. - - \warning This is currently only implemented for Windows. - - \value Auto - \value Cassette - \value Envelope - \value EnvelopeManual - \value FormSource - \value LargeCapacity - \value LargeFormat - \value Lower - \value MaxPageSource - \value Middle - \value Manual - \value OnlyOne - \value Tractor - \value SmallFormat -*/ - -/*! - \enum QPrinter::Unit - \since 4.4 - - This enum type is used to specify the measurement unit for page and - paper sizes. - - \value Millimeter - \value Point - \value Inch - \value Pica - \value Didot - \value Cicero - \value DevicePixel - - 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 - the printer. -*/ - - -/* - \enum QPrinter::PrintRange - - This enum is used to specify which print range the application - should use to print. - - \value AllPages All the pages should be printed. - \value Selection Only the selection should be printed. - \value PageRange Print according to the from page and to page options. - \value CurrentPage Only the current page should be printed. - - \sa setPrintRange(), printRange() -*/ - -/* - \enum QPrinter::PrinterOption - - This enum describes various printer options that appear in the - printer setup dialog. It is used to enable and disable these - options in the setup dialog. - - \value PrintToFile Describes if print to file should be enabled. - \value PrintSelection Describes if printing selections should be enabled. - \value PrintPageRange Describes if printing page ranges (from, to) should - be enabled - \value PrintCurrentPage if Print Current Page option should be enabled - - \sa setOptionEnabled(), isOptionEnabled() -*/ - -/*! - Creates a new printer object with the given \a mode. -*/ -QPrinter::QPrinter(PrinterMode mode) - : QPaintDevice(), - d_ptr(new QPrinterPrivate(this)) -{ - init(mode); - QPrinterInfo defPrn(QPrinterInfo::defaultPrinter()); - if (!defPrn.isNull()) { - setPrinterName(defPrn.printerName()); - } else if (QPrinterInfo::availablePrinters().isEmpty() - && d_ptr->paintEngine->type() != QPaintEngine::Windows - && d_ptr->paintEngine->type() != QPaintEngine::MacPrinter) { - setOutputFormat(QPrinter::PdfFormat); - } -} - -/*! - \since 4.4 - - Creates a new printer object with the given \a printer and \a mode. -*/ -QPrinter::QPrinter(const QPrinterInfo& printer, PrinterMode mode) - : QPaintDevice(), - d_ptr(new QPrinterPrivate(this)) -{ - init(mode); - setPrinterName(printer.printerName()); -} - -void QPrinter::init(PrinterMode mode) -{ -#if !defined(Q_WS_X11) - if (!QCoreApplication::instance()) { -#else - if (!QCoreApplication::instance() || !X11) { -#endif - qFatal("QPrinter: Must construct a QApplication before a QPaintDevice"); - return; - } - Q_D(QPrinter); - - d->printerMode = mode; - d->outputFormat = QPrinter::NativeFormat; - d->createDefaultEngines(); - -#ifndef QT_NO_PRINTPREVIEWWIDGET - d->previewEngine = 0; -#endif - d->realPrintEngine = 0; - d->realPaintEngine = 0; - -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - if (QCUPSSupport::cupsVersion() >= 10200 && QCUPSSupport().currentPPD()) { - setOutputFormat(QPrinter::PdfFormat); - d->outputFormat = QPrinter::NativeFormat; - } -#endif -} - -/*! - This function is used by subclasses of QPrinter to specify custom - print and paint engines (\a printEngine and \a paintEngine, - respectively). - - QPrinter does not take ownership of the engines, so you need to - manage these engine instances yourself. - - Note that changing the engines will reset the printer state and - all its properties. - - \sa printEngine() paintEngine() setOutputFormat() - - \since 4.1 -*/ -void QPrinter::setEngines(QPrintEngine *printEngine, QPaintEngine *paintEngine) -{ - Q_D(QPrinter); - - if (d->use_default_engine) - delete d->printEngine; - - d->printEngine = printEngine; - d->paintEngine = paintEngine; - d->use_default_engine = false; -} - -/*! - Destroys the printer object and frees any allocated resources. If - the printer is destroyed while a print job is in progress this may - or may not affect the print job. -*/ -QPrinter::~QPrinter() -{ - Q_D(QPrinter); - if (d->use_default_engine) - delete d->printEngine; -#ifndef QT_NO_PRINTPREVIEWWIDGET - delete d->previewEngine; -#endif -} - -/*! - \enum QPrinter::OutputFormat - - The OutputFormat enum is used to describe the format QPrinter should - use for printing. - - \value NativeFormat QPrinter will print output using a method defined - by the platform it is running on. This mode is the default when printing - directly to a printer. - - \value PdfFormat QPrinter will generate its output as a searchable PDF file. - This mode is the default when printing to a file. - - \sa outputFormat(), setOutputFormat(), setOutputFileName() -*/ - -/*! - \since 4.1 - - Sets the output format for this printer to \a format. -*/ -void QPrinter::setOutputFormat(OutputFormat format) -{ - -#ifndef QT_NO_PDF - Q_D(QPrinter); - if (d->validPrinter && d->outputFormat == format) - return; - d->outputFormat = format; - - QPrintEngine *oldPrintEngine = d->printEngine; - const bool def_engine = d->use_default_engine; - d->printEngine = 0; - - d->createDefaultEngines(); - - if (oldPrintEngine) { - for (int i = 0; i < d->manualSetList.size(); ++i) { - QPrintEngine::PrintEnginePropertyKey key = d->manualSetList[i]; - QVariant prop; - // PPK_NumberOfCopies need special treatmeant since it in most cases - // will return 1, disregarding the actual value that was set - if (key == QPrintEngine::PPK_NumberOfCopies) - prop = QVariant(copyCount()); - else - prop = oldPrintEngine->property(key); - if (prop.isValid()) - d->printEngine->setProperty(key, prop); - } - } - - if (def_engine) - delete oldPrintEngine; - - if (d->outputFormat == QPrinter::PdfFormat) - d->validPrinter = true; -#else - Q_UNUSED(format); -#endif -} - -/*! - \since 4.1 - - Returns the output format for this printer. -*/ -QPrinter::OutputFormat QPrinter::outputFormat() const -{ - Q_D(const QPrinter); - return d->outputFormat; -} - - - -/*! \internal -*/ -int QPrinter::devType() const -{ - return QInternal::Printer; -} - -/*! - Returns the printer name. This value is initially set to the name - of the default printer. - - \sa setPrinterName() -*/ -QString QPrinter::printerName() const -{ - Q_D(const QPrinter); - return d->printEngine->property(QPrintEngine::PPK_PrinterName).toString(); -} - -/*! - Sets the printer name to \a name. - - \sa printerName(), isValid() -*/ -void QPrinter::setPrinterName(const QString &name) -{ - Q_D(QPrinter); - ABORT_IF_ACTIVE("QPrinter::setPrinterName"); - -#if defined(Q_OS_UNIX) && !defined(QT_NO_CUPS) - if(d->use_default_engine && d->outputFormat == QPrinter::NativeFormat) { - setOutputFormat(QPrinter::PdfFormat); - d->outputFormat = QPrinter::NativeFormat; - } -#endif - - QList prnList = QPrinterInfo::availablePrinters(); - if (name.isEmpty()) { - d->validPrinter = d->outputFormat == QPrinter::PdfFormat; - } else { - d->validPrinter = false; - for (int i = 0; i < prnList.size(); ++i) { - if (prnList[i].printerName() == name) { - d->validPrinter = true; - break; - } - } - } - - d->printEngine->setProperty(QPrintEngine::PPK_PrinterName, name); - d->addToManualSetList(QPrintEngine::PPK_PrinterName); -} - - -/*! - \since 4.4 - - Returns true if the printer currently selected is a valid printer - in the system, or a pure PDF printer; otherwise returns false. - - To detect other failures check the output of QPainter::begin() or QPrinter::newPage(). - - \snippet doc/src/snippets/printing-qprinter/errors.cpp 0 - - \sa setPrinterName() -*/ -bool QPrinter::isValid() const -{ - Q_D(const QPrinter); -#if defined(Q_WS_X11) - if (!qApp || !X11) { - return false; - } -#endif - return d->validPrinter; -} - - -/*! - \fn bool QPrinter::outputToFile() const - - Returns true if the output should be written to a file, or false - if the output should be sent directly to the printer. The default - setting is false. - - \sa setOutputToFile(), setOutputFileName() -*/ - - -/*! - \fn void QPrinter::setOutputToFile(bool enable) - - Specifies whether the output should be written to a file or sent - directly to the printer. - - Will output to a file if \a enable is true, or will output - directly to the printer if \a enable is false. - - \sa outputToFile(), setOutputFileName() -*/ - - -/*! - \fn QString QPrinter::outputFileName() const - - Returns the name of the output file. By default, this is an empty string - (indicating that the printer shouldn't print to file). - - \sa QPrintEngine::PrintEnginePropertyKey - -*/ - -QString QPrinter::outputFileName() const -{ - Q_D(const QPrinter); - return d->printEngine->property(QPrintEngine::PPK_OutputFileName).toString(); -} - -/*! - Sets the name of the output file to \a fileName. - - Setting a null or empty name (0 or "") disables printing to a file. - Setting a non-empty name enables printing to a file. - - This can change the value of outputFormat(). - If the file name has the ".pdf" suffix PDF is generated. If the file name - has a suffix other than ".pdf", the output format used is the - one set with setOutputFormat(). - - QPrinter uses Qt's cross-platform PDF print engines - respectively. If you can produce this format natively, for example - Mac OS X can generate PDF's from its print engine, set the output format - back to NativeFormat. - - \sa outputFileName() setOutputToFile() setOutputFormat() -*/ - -void QPrinter::setOutputFileName(const QString &fileName) -{ - Q_D(QPrinter); - ABORT_IF_ACTIVE("QPrinter::setOutputFileName"); - - QFileInfo fi(fileName); - if (!fi.suffix().compare(QLatin1String("pdf"), Qt::CaseInsensitive)) - setOutputFormat(QPrinter::PdfFormat); - else if (fileName.isEmpty()) - setOutputFormat(QPrinter::NativeFormat); - - d->printEngine->setProperty(QPrintEngine::PPK_OutputFileName, fileName); - d->addToManualSetList(QPrintEngine::PPK_OutputFileName); -} - - -/*! - Returns the name of the program that sends the print output to the - printer. - - The default is to return an empty string; meaning that QPrinter will try to - be smart in a system-dependent way. On X11 only, you can set it to something - different to use a specific print program. On the other platforms, this - returns an empty string. - - \sa setPrintProgram(), setPrinterSelectionOption() -*/ -QString QPrinter::printProgram() const -{ - Q_D(const QPrinter); - return d->printEngine->property(QPrintEngine::PPK_PrinterProgram).toString(); -} - - -/*! - Sets the name of the program that should do the print job to \a - printProg. - - On X11, this function sets the program to call with the PDF - output. On other platforms, it has no effect. - - \sa printProgram() -*/ -void QPrinter::setPrintProgram(const QString &printProg) -{ - Q_D(QPrinter); - ABORT_IF_ACTIVE("QPrinter::setPrintProgram"); - d->printEngine->setProperty(QPrintEngine::PPK_PrinterProgram, printProg); - d->addToManualSetList(QPrintEngine::PPK_PrinterProgram); -} - - -/*! - Returns the document name. - - \sa setDocName(), QPrintEngine::PrintEnginePropertyKey -*/ -QString QPrinter::docName() const -{ - Q_D(const QPrinter); - return d->printEngine->property(QPrintEngine::PPK_DocumentName).toString(); -} - - -/*! - Sets the document name to \a name. - - On X11, the document name is for example used as the default - output filename in QPrintDialog. Note that the document name does - not affect the file name if the printer is printing to a file. - Use the setOutputFile() function for this. - - \sa docName(), QPrintEngine::PrintEnginePropertyKey -*/ -void QPrinter::setDocName(const QString &name) -{ - Q_D(QPrinter); - ABORT_IF_ACTIVE("QPrinter::setDocName"); - d->printEngine->setProperty(QPrintEngine::PPK_DocumentName, name); - d->addToManualSetList(QPrintEngine::PPK_DocumentName); -} - - -/*! - Returns the name of the application that created the document. - - \sa setCreator() -*/ -QString QPrinter::creator() const -{ - Q_D(const QPrinter); - return d->printEngine->property(QPrintEngine::PPK_Creator).toString(); -} - - -/*! - Sets the name of the application that created the document to \a - creator. - - This function is only applicable to the X11 version of Qt. If no - creator name is specified, the creator will be set to "Qt" - followed by some version number. - - \sa creator() -*/ -void QPrinter::setCreator(const QString &creator) -{ - Q_D(QPrinter); - ABORT_IF_ACTIVE("QPrinter::setCreator"); - d->printEngine->setProperty(QPrintEngine::PPK_Creator, creator); - d->addToManualSetList(QPrintEngine::PPK_Creator); -} - - -/*! - Returns the orientation setting. This is driver-dependent, but is usually - QPrinter::Portrait. - - \sa setOrientation() -*/ -QPrinter::Orientation QPrinter::orientation() const -{ - Q_D(const QPrinter); - return QPrinter::Orientation(d->printEngine->property(QPrintEngine::PPK_Orientation).toInt()); -} - - -/*! - Sets the print orientation to \a orientation. - - The orientation can be either QPrinter::Portrait or - QPrinter::Landscape. - - The printer driver reads this setting and prints using the - specified orientation. - - On Windows, this option can be changed while printing and will - take effect from the next call to newPage(). - - On Mac OS X, changing the orientation during a print job has no effect. - - \sa orientation() -*/ - -void QPrinter::setOrientation(Orientation orientation) -{ - Q_D(QPrinter); - d->printEngine->setProperty(QPrintEngine::PPK_Orientation, orientation); - d->addToManualSetList(QPrintEngine::PPK_Orientation); -} - - -/*! - \since 4.4 - Returns the printer paper size. The default value is driver-dependent. - - \sa setPaperSize() pageRect() paperRect() -*/ - -QPrinter::PaperSize QPrinter::paperSize() const -{ - Q_D(const QPrinter); - return QPrinter::PaperSize(d->printEngine->property(QPrintEngine::PPK_PaperSize).toInt()); -} - -/*! - \since 4.4 - - Sets the printer paper size to \a newPaperSize if that size is - supported. The result is undefined if \a newPaperSize is not - supported. - - The default paper size is driver-dependent. - - This function is useful mostly for setting a default value that - the user can override in the print dialog. - - \sa paperSize() PaperSize setFullPage() setResolution() pageRect() paperRect() -*/ -void QPrinter::setPaperSize(PaperSize newPaperSize) -{ - Q_D(QPrinter); - if (d->paintEngine->type() != QPaintEngine::Pdf) - ABORT_IF_ACTIVE("QPrinter::setPaperSize"); - if (newPaperSize < 0 || newPaperSize >= NPaperSize) { - qWarning("QPrinter::setPaperSize: Illegal paper size %d", newPaperSize); - return; - } - d->printEngine->setProperty(QPrintEngine::PPK_PaperSize, newPaperSize); - d->addToManualSetList(QPrintEngine::PPK_PaperSize); - d->hasUserSetPageSize = true; -} - -/*! - \obsolete - - Returns the printer page size. The default value is driver-dependent. - - Use paperSize() instead. -*/ -QPrinter::PageSize QPrinter::pageSize() const -{ - return paperSize(); -} - - -/*! - \obsolete - - Sets the printer page size based on \a newPageSize. - - Use setPaperSize() instead. -*/ - -void QPrinter::setPageSize(PageSize newPageSize) -{ - setPaperSize(newPageSize); -} - -/*! - \since 4.4 - - Sets the paper size based on \a paperSize in \a unit. - - \sa paperSize() -*/ - -void QPrinter::setPaperSize(const QSizeF &paperSize, QPrinter::Unit unit) -{ - Q_D(QPrinter); - if (d->paintEngine->type() != QPaintEngine::Pdf) - ABORT_IF_ACTIVE("QPrinter::setPaperSize"); - const qreal multiplier = qt_multiplierForUnit(unit, resolution()); - QSizeF size(paperSize.width() * multiplier, paperSize.height() * multiplier); - d->printEngine->setProperty(QPrintEngine::PPK_CustomPaperSize, size); - d->addToManualSetList(QPrintEngine::PPK_CustomPaperSize); - d->hasUserSetPageSize = true; -} - -/*! - \since 4.4 - - Returns the paper size in \a unit. - - \sa setPaperSize() -*/ - -QSizeF QPrinter::paperSize(Unit unit) const -{ - Q_D(const QPrinter); - int res = resolution(); - const qreal multiplier = qt_multiplierForUnit(unit, res); - PaperSize paperType = paperSize(); - if (paperType == Custom) { - QSizeF size = d->printEngine->property(QPrintEngine::PPK_CustomPaperSize).toSizeF(); - return QSizeF(size.width() / multiplier, size.height() / multiplier); - } - else { - return qt_printerPaperSize(orientation(), paperType, unit, res); - } -} - -/*! - Sets the page order to \a pageOrder. - - The page order can be QPrinter::FirstPageFirst or - QPrinter::LastPageFirst. The application is responsible for - reading the page order and printing accordingly. - - This function is mostly useful for setting a default value that - the user can override in the print dialog. - - This function is only supported under X11. -*/ - -void QPrinter::setPageOrder(PageOrder pageOrder) -{ - Q_D(QPrinter); - ABORT_IF_ACTIVE("QPrinter::setPageOrder"); - d->printEngine->setProperty(QPrintEngine::PPK_PageOrder, pageOrder); - d->addToManualSetList(QPrintEngine::PPK_PageOrder); -} - - -/*! - Returns the current page order. - - The default page order is \c FirstPageFirst. -*/ - -QPrinter::PageOrder QPrinter::pageOrder() const -{ - Q_D(const QPrinter); - return QPrinter::PageOrder(d->printEngine->property(QPrintEngine::PPK_PageOrder).toInt()); -} - - -/*! - Sets the printer's color mode to \a newColorMode, which can be - either \c Color or \c GrayScale. - - \sa colorMode() -*/ - -void QPrinter::setColorMode(ColorMode newColorMode) -{ - Q_D(QPrinter); - ABORT_IF_ACTIVE("QPrinter::setColorMode"); - d->printEngine->setProperty(QPrintEngine::PPK_ColorMode, newColorMode); - d->addToManualSetList(QPrintEngine::PPK_ColorMode); -} - - -/*! - Returns the current color mode. - - \sa setColorMode() -*/ -QPrinter::ColorMode QPrinter::colorMode() const -{ - Q_D(const QPrinter); - return QPrinter::ColorMode(d->printEngine->property(QPrintEngine::PPK_ColorMode).toInt()); -} - - -/*! - \obsolete - Returns the number of copies to be printed. The default value is 1. - - On Windows, Mac OS X and X11 systems that support CUPS, this will always - return 1 as these operating systems can internally handle the number - of copies. - - On X11, this value will return the number of times the application is - required to print in order to match the number specified in the printer setup - dialog. This has been done since some printer drivers are not capable of - buffering up the copies and in those cases the application must make an - explicit call to the print code for each copy. - - Use copyCount() in conjunction with supportsMultipleCopies() instead. - - \sa setNumCopies(), actualNumCopies() -*/ - -int QPrinter::numCopies() const -{ - Q_D(const QPrinter); - return d->printEngine->property(QPrintEngine::PPK_NumberOfCopies).toInt(); -} - - -/*! - \obsolete - \since 4.6 - - Returns the number of copies that will be printed. The default - value is 1. - - This function always returns the actual value specified in the print - dialog or using setNumCopies(). - - Use copyCount() instead. - - \sa setNumCopies(), numCopies() -*/ -int QPrinter::actualNumCopies() const -{ - return copyCount(); -} - - - -/*! - \obsolete - Sets the number of copies to be printed to \a numCopies. - - The printer driver reads this setting and prints the specified - number of copies. - - Use setCopyCount() instead. - - \sa numCopies() -*/ - -void QPrinter::setNumCopies(int numCopies) -{ - Q_D(QPrinter); - ABORT_IF_ACTIVE("QPrinter::setNumCopies"); - d->printEngine->setProperty(QPrintEngine::PPK_NumberOfCopies, numCopies); - d->addToManualSetList(QPrintEngine::PPK_NumberOfCopies); -} - -/*! - \since 4.7 - - Sets the number of copies to be printed to \a count. - - The printer driver reads this setting and prints the specified number of - copies. - - \sa copyCount(), supportsMultipleCopies() -*/ - -void QPrinter::setCopyCount(int count) -{ - Q_D(QPrinter); - ABORT_IF_ACTIVE("QPrinter::setCopyCount;"); - d->printEngine->setProperty(QPrintEngine::PPK_CopyCount, count); - d->addToManualSetList(QPrintEngine::PPK_CopyCount); -} - -/*! - \since 4.7 - - Returns the number of copies that will be printed. The default value is 1. - - \sa setCopyCount(), supportsMultipleCopies() -*/ - -int QPrinter::copyCount() const -{ - Q_D(const QPrinter); - return d->printEngine->property(QPrintEngine::PPK_CopyCount).toInt(); -} - -/*! - \since 4.7 - - Returns true if the printer supports printing multiple copies of the same - document in one job; otherwise false is returned. - - On most systems this function will return true. However, on X11 systems - that do not support CUPS, this function will return false. That means the - application has to handle the number of copies by printing the same - document the required number of times. - - \sa setCopyCount(), copyCount() -*/ - -bool QPrinter::supportsMultipleCopies() const -{ - Q_D(const QPrinter); - return d->printEngine->property(QPrintEngine::PPK_SupportsMultipleCopies).toBool(); -} - -/*! - \since 4.1 - - Returns true if collation is turned on when multiple copies is selected. - Returns false if it is turned off when multiple copies is selected. - When collating is turned off the printing of each individual page will be repeated - the numCopies() amount before the next page is started. With collating turned on - all pages are printed before the next copy of those pages is started. - - \sa setCollateCopies() -*/ -bool QPrinter::collateCopies() const -{ - Q_D(const QPrinter); - return d->printEngine->property(QPrintEngine::PPK_CollateCopies).toBool(); -} - - -/*! - \since 4.1 - - Sets the default value for collation checkbox when the print - dialog appears. If \a collate is true, it will enable - setCollateCopiesEnabled(). The default value is false. This value - will be changed by what the user presses in the print dialog. - - \sa collateCopies() -*/ -void QPrinter::setCollateCopies(bool collate) -{ - Q_D(QPrinter); - ABORT_IF_ACTIVE("QPrinter::setCollateCopies"); - d->printEngine->setProperty(QPrintEngine::PPK_CollateCopies, collate); - d->addToManualSetList(QPrintEngine::PPK_CollateCopies); -} - - - -/*! - If \a fp is true, enables support for painting over the entire page; - otherwise restricts painting to the printable area reported by the - device. - - By default, full page printing is disabled. In this case, the origin - of the QPrinter's coordinate system coincides with the top-left - corner of the printable area. - - If full page printing is enabled, the origin of the QPrinter's - coordinate system coincides with the top-left corner of the paper - itself. In this case, the - \l{QPaintDevice::PaintDeviceMetric}{device metrics} will report - the exact same dimensions as indicated by \l{PaperSize}. It may not - be possible to print on the entire physical page because of the - printer's margins, so the application must account for the margins - itself. - - \sa fullPage(), setPaperSize(), width(), height(), {Printing with Qt} -*/ - -void QPrinter::setFullPage(bool fp) -{ - Q_D(QPrinter); - d->printEngine->setProperty(QPrintEngine::PPK_FullPage, fp); - d->addToManualSetList(QPrintEngine::PPK_FullPage); -} - - -/*! - Returns true if the origin of the printer's coordinate system is - at the corner of the page and false if it is at the edge of the - printable area. - - See setFullPage() for details and caveats. - - \sa setFullPage() PaperSize -*/ - -bool QPrinter::fullPage() const -{ - Q_D(const QPrinter); - return d->printEngine->property(QPrintEngine::PPK_FullPage).toBool(); -} - - -/*! - Requests that the printer prints at \a dpi or as near to \a dpi as - possible. - - This setting affects the coordinate system as returned by, for - example QPainter::viewport(). - - This function must be called before QPainter::begin() to have an effect on - all platforms. - - \sa resolution() setPaperSize() -*/ - -void QPrinter::setResolution(int dpi) -{ - Q_D(QPrinter); - ABORT_IF_ACTIVE("QPrinter::setResolution"); - d->printEngine->setProperty(QPrintEngine::PPK_Resolution, dpi); - d->addToManualSetList(QPrintEngine::PPK_Resolution); -} - - -/*! - Returns the current assumed resolution of the printer, as set by - setResolution() or by the printer driver. - - \sa setResolution() -*/ - -int QPrinter::resolution() const -{ - Q_D(const QPrinter); - return d->printEngine->property(QPrintEngine::PPK_Resolution).toInt(); -} - -/*! - Sets the paper source setting to \a source. - - Windows only: This option can be changed while printing and will - take effect from the next call to newPage() - - \sa paperSource() -*/ - -void QPrinter::setPaperSource(PaperSource source) -{ - Q_D(QPrinter); - d->printEngine->setProperty(QPrintEngine::PPK_PaperSource, source); - d->addToManualSetList(QPrintEngine::PPK_PaperSource); -} - -/*! - Returns the printer's paper source. This is \c Manual or a printer - tray or paper cassette. -*/ -QPrinter::PaperSource QPrinter::paperSource() const -{ - Q_D(const QPrinter); - return QPrinter::PaperSource(d->printEngine->property(QPrintEngine::PPK_PaperSource).toInt()); -} - - -/*! - \since 4.1 - - Enabled or disables font embedding depending on \a enable. - - Currently this option is only supported on X11. - - \sa fontEmbeddingEnabled() -*/ -void QPrinter::setFontEmbeddingEnabled(bool enable) -{ - Q_D(QPrinter); - d->printEngine->setProperty(QPrintEngine::PPK_FontEmbedding, enable); - d->addToManualSetList(QPrintEngine::PPK_FontEmbedding); -} - -/*! - \since 4.1 - - Returns true if font embedding is enabled. - - Currently this option is only supported on X11. - - \sa setFontEmbeddingEnabled() -*/ -bool QPrinter::fontEmbeddingEnabled() const -{ - Q_D(const QPrinter); - return d->printEngine->property(QPrintEngine::PPK_FontEmbedding).toBool(); -} - -/*! - \enum QPrinter::DuplexMode - \since 4.4 - - This enum is used to indicate whether printing will occur on one or both sides - of each sheet of paper (simplex or duplex printing). - - \value DuplexNone Single sided (simplex) printing only. - \value DuplexAuto The printer's default setting is used to determine whether - duplex printing is used. - \value DuplexLongSide Both sides of each sheet of paper are used for printing. - The paper is turned over its longest edge before the second - side is printed - \value DuplexShortSide Both sides of each sheet of paper are used for printing. - The paper is turned over its shortest edge before the second - side is printed -*/ - -/*! - \since 4.2 - - Enables double sided printing if \a doubleSided is true; otherwise disables it. - - Currently this option is only supported on X11. -*/ -void QPrinter::setDoubleSidedPrinting(bool doubleSided) -{ - setDuplex(doubleSided ? DuplexAuto : DuplexNone); -} - - -/*! - \since 4.2 - - Returns true if double side printing is enabled. - - Currently this option is only supported on X11. -*/ -bool QPrinter::doubleSidedPrinting() const -{ - return duplex() != DuplexNone; -} - -/*! - \since 4.4 - - Enables double sided printing based on the \a duplex mode. - - Currently this option is only supported on X11. -*/ -void QPrinter::setDuplex(DuplexMode duplex) -{ - Q_D(QPrinter); - d->printEngine->setProperty(QPrintEngine::PPK_Duplex, duplex); - d->addToManualSetList(QPrintEngine::PPK_Duplex); -} - -/*! - \since 4.4 - - Returns the current duplex mode. - - Currently this option is only supported on X11. -*/ -QPrinter::DuplexMode QPrinter::duplex() const -{ - Q_D(const QPrinter); - return static_cast (d->printEngine->property(QPrintEngine::PPK_Duplex).toInt()); -} - -/*! - \since 4.4 - - Returns the page's rectangle in \a unit; this is usually smaller - than the paperRect() since the page normally has margins between - its borders and the paper. - - \sa paperSize() -*/ -QRectF QPrinter::pageRect(Unit unit) const -{ - Q_D(const QPrinter); - int res = resolution(); - const qreal multiplier = qt_multiplierForUnit(unit, res); - // the page rect is in device pixels - QRect devRect(d->printEngine->property(QPrintEngine::PPK_PageRect).toRect()); - if (unit == DevicePixel) - return devRect; - QRectF diRect(devRect.x()*72.0/res, - devRect.y()*72.0/res, - devRect.width()*72.0/res, - devRect.height()*72.0/res); - return QRectF(diRect.x()/multiplier, diRect.y()/multiplier, - diRect.width()/multiplier, diRect.height()/multiplier); -} - - -/*! - \since 4.4 - - Returns the paper's rectangle in \a unit; this is usually larger - than the pageRect(). - - \sa pageRect() -*/ -QRectF QPrinter::paperRect(Unit unit) const -{ - Q_D(const QPrinter); - int res = resolution(); - const qreal multiplier = qt_multiplierForUnit(unit, resolution()); - // the page rect is in device pixels - QRect devRect(d->printEngine->property(QPrintEngine::PPK_PaperRect).toRect()); - if (unit == DevicePixel) - return devRect; - QRectF diRect(devRect.x()*72.0/res, - devRect.y()*72.0/res, - devRect.width()*72.0/res, - devRect.height()*72.0/res); - return QRectF(diRect.x()/multiplier, diRect.y()/multiplier, - diRect.width()/multiplier, diRect.height()/multiplier); -} - -/*! - Returns the page's rectangle; this is usually smaller than the - paperRect() since the page normally has margins between its - borders and the paper. - - The unit of the returned rectangle is DevicePixel. - - \sa paperSize() -*/ -QRect QPrinter::pageRect() const -{ - Q_D(const QPrinter); - return d->printEngine->property(QPrintEngine::PPK_PageRect).toRect(); -} - -/*! - Returns the paper's rectangle; this is usually larger than the - pageRect(). - - The unit of the returned rectangle is DevicePixel. - - \sa pageRect() -*/ -QRect QPrinter::paperRect() const -{ - Q_D(const QPrinter); - return d->printEngine->property(QPrintEngine::PPK_PaperRect).toRect(); -} - - -/*! - \since 4.4 - - This function sets the \a left, \a top, \a right and \a bottom - page margins for this printer. The unit of the margins are - specified with the \a unit parameter. -*/ -void QPrinter::setPageMargins(qreal left, qreal top, qreal right, qreal bottom, QPrinter::Unit unit) -{ - Q_D(QPrinter); - const qreal multiplier = qt_multiplierForUnit(unit, resolution()); - QList margins; - margins << (left * multiplier) << (top * multiplier) - << (right * multiplier) << (bottom * multiplier); - d->printEngine->setProperty(QPrintEngine::PPK_PageMargins, margins); - d->addToManualSetList(QPrintEngine::PPK_PageMargins); - d->hasCustomPageMargins = true; -} - -/*! - \since 4.4 - - Returns the page margins for this printer in \a left, \a top, \a - right, \a bottom. The unit of the returned margins are specified - with the \a unit parameter. -*/ -void QPrinter::getPageMargins(qreal *left, qreal *top, qreal *right, qreal *bottom, QPrinter::Unit unit) const -{ - Q_D(const QPrinter); - Q_ASSERT(left && top && right && bottom); - const qreal multiplier = qt_multiplierForUnit(unit, resolution()); - QList margins(d->printEngine->property(QPrintEngine::PPK_PageMargins).toList()); - *left = margins.at(0).toReal() / multiplier; - *top = margins.at(1).toReal() / multiplier; - *right = margins.at(2).toReal() / multiplier; - *bottom = margins.at(3).toReal() / multiplier; -} - -/*! - \internal - - Returns the metric for the given \a id. -*/ -int QPrinter::metric(PaintDeviceMetric id) const -{ - Q_D(const QPrinter); - return d->printEngine->metric(id); -} - -/*! - Returns the paint engine used by the printer. -*/ -QPaintEngine *QPrinter::paintEngine() const -{ - Q_D(const QPrinter); - return d->paintEngine; -} - -/*! - \since 4.1 - - Returns the print engine used by the printer. -*/ -QPrintEngine *QPrinter::printEngine() const -{ - Q_D(const QPrinter); - return d->printEngine; -} - -#if defined (Q_WS_WIN) -/*! - Sets the page size to be used by the printer under Windows to \a - pageSize. - - \warning This function is not portable so you may prefer to use - setPaperSize() instead. - - \sa winPageSize() -*/ -void QPrinter::setWinPageSize(int pageSize) -{ - Q_D(QPrinter); - ABORT_IF_ACTIVE("QPrinter::setWinPageSize"); - d->printEngine->setProperty(QPrintEngine::PPK_WindowsPageSize, pageSize); - d->addToManualSetList(QPrintEngine::PPK_WindowsPageSize); -} - -/*! - Returns the page size used by the printer under Windows. - - \warning This function is not portable so you may prefer to use - paperSize() instead. - - \sa setWinPageSize() -*/ -int QPrinter::winPageSize() const -{ - Q_D(const QPrinter); - return d->printEngine->property(QPrintEngine::PPK_WindowsPageSize).toInt(); -} -#endif // Q_WS_WIN - -/*! - Returns a list of the resolutions (a list of dots-per-inch - integers) that the printer says it supports. - - For X11 where all printing is directly to PDF, this - function will always return a one item list containing only the - PDF resolution, i.e., 72 (72 dpi -- but see PrinterMode). -*/ -QList QPrinter::supportedResolutions() const -{ - Q_D(const QPrinter); - QList varlist - = d->printEngine->property(QPrintEngine::PPK_SupportedResolutions).toList(); - QList intlist; - for (int i=0; iprintEngine->printerState() != QPrinter::Active) - return false; - return d->printEngine->newPage(); -} - -/*! - Aborts the current print run. Returns true if the print run was - successfully aborted and printerState() will return QPrinter::Aborted; otherwise - returns false. - - It is not always possible to abort a print job. For example, - all the data has gone to the printer but the printer cannot or - will not cancel the job when asked to. -*/ -bool QPrinter::abort() -{ - Q_D(QPrinter); - return d->printEngine->abort(); -} - -/*! - Returns the current state of the printer. This may not always be - accurate (for example if the printer doesn't have the capability - of reporting its state to the operating system). -*/ -QPrinter::PrinterState QPrinter::printerState() const -{ - Q_D(const QPrinter); - return d->printEngine->printerState(); -} - - -/*! \fn void QPrinter::margins(uint *top, uint *left, uint *bottom, uint *right) const - - Sets *\a top, *\a left, *\a bottom, *\a right to be the top, - left, bottom, and right margins. - - This function has been superseded by paperRect() and pageRect(). - Use paperRect().top() - pageRect().top() for the top margin, - paperRect().left() - pageRect().left() for the left margin, - paperRect().bottom() - pageRect().bottom() for the bottom margin, - and papaerRect().right() - pageRect().right() for the right - margin. - - \oldcode - uint rightMargin; - uint bottomMargin; - printer->margins(0, 0, &bottomMargin, &rightMargin); - \newcode - int rightMargin = printer->paperRect().right() - printer->pageRect().right(); - int bottomMargin = printer->paperRect().bottom() - printer->pageRect().bottom(); - \endcode -*/ - -/*! \fn QSize QPrinter::margins() const - - \overload - - Returns a QSize containing the left margin and the top margin. - - This function has been superseded by paperRect() and pageRect(). - Use paperRect().left() - pageRect().left() for the left margin, - and paperRect().top() - pageRect().top() for the top margin. - - \oldcode - QSize margins = printer->margins(); - int leftMargin = margins.width(); - int topMargin = margins.height(); - \newcode - int leftMargin = printer->paperRect().left() - printer->pageRect().left(); - int topMargin = printer->paperRect().top() - printer->pageRect().top(); - \endcode -*/ - -/*! \fn bool QPrinter::aborted() - - Use printerState() == QPrinter::Aborted instead. -*/ - -#ifdef Q_WS_WIN -/*! - \internal -*/ -HDC QPrinter::getDC() const -{ - Q_D(const QPrinter); - return d->printEngine->getPrinterDC(); -} - -/*! - \internal -*/ -void QPrinter::releaseDC(HDC hdc) const -{ - Q_D(const QPrinter); - d->printEngine->releasePrinterDC(hdc); -} - -/*! - Returns the supported paper sizes for this printer. - - The values will be either a value that matches an entry in the - QPrinter::PaperSource enum or a driver spesific value. The driver - spesific values are greater than the constant DMBIN_USER declared - in wingdi.h. - - \warning This function is only available in windows. -*/ - -QList QPrinter::supportedPaperSources() const -{ - Q_D(const QPrinter); - QVariant v = d->printEngine->property(QPrintEngine::PPK_PaperSources); - - QList variant_list = v.toList(); - QList int_list; - for (int i=0; iprintEngine->property(QPrintEngine::PPK_SelectionOption).toString(); -} - -void QPrinter::setPrinterSelectionOption(const QString &option) -{ - Q_D(QPrinter); - d->printEngine->setProperty(QPrintEngine::PPK_SelectionOption, option); - d->addToManualSetList(QPrintEngine::PPK_SelectionOption); -} -#endif - -/*! - \since 4.1 - \fn int QPrinter::fromPage() const - - Returns the number of the first page in a range of pages to be printed - (the "from page" setting). Pages in a document are numbered according to - the convention that the first page is page 1. - - By default, this function returns a special value of 0, meaning that - the "from page" setting is unset. - - \note If fromPage() and toPage() both return 0, this indicates that - \e{the whole document will be printed}. - - \sa setFromTo(), toPage() -*/ - -int QPrinter::fromPage() const -{ - Q_D(const QPrinter); - return d->fromPage; -} - -/*! - \since 4.1 - - Returns the number of the last page in a range of pages to be printed - (the "to page" setting). Pages in a document are numbered according to - the convention that the first page is page 1. - - By default, this function returns a special value of 0, meaning that - the "to page" setting is unset. - - \note If fromPage() and toPage() both return 0, this indicates that - \e{the whole document will be printed}. - - The programmer is responsible for reading this setting and - printing accordingly. - - \sa setFromTo(), fromPage() -*/ - -int QPrinter::toPage() const -{ - Q_D(const QPrinter); - return d->toPage; -} - -/*! - \since 4.1 - - Sets the range of pages to be printed to cover the pages with numbers - specified by \a from and \a to, where \a from corresponds to the first - page in the range and \a to corresponds to the last. - - \note Pages in a document are numbered according to the convention that - the first page is page 1. However, if \a from and \a to are both set to 0, - the \e{whole document will be printed}. - - This function is mostly used to set a default value that the user can - override in the print dialog when you call setup(). - - \sa fromPage(), toPage() -*/ - -void QPrinter::setFromTo(int from, int to) -{ - Q_D(QPrinter); - if (from > to) { - qWarning() << "QPrinter::setFromTo: 'from' must be less than or equal to 'to'"; - from = to; - } - d->fromPage = from; - d->toPage = to; - - if (d->minPage == 0 && d->maxPage == 0) { - d->minPage = 1; - d->maxPage = to; - } -} - -/*! - \since 4.1 - - Sets the print range option in to be \a range. -*/ -void QPrinter::setPrintRange( PrintRange range ) -{ - Q_D(QPrinter); - d->printRange = range; -} - -/*! - \since 4.1 - - Returns the page range of the QPrinter. After the print setup - dialog has been opened, this function returns the value selected - by the user. - - \sa setPrintRange() -*/ -QPrinter::PrintRange QPrinter::printRange() const -{ - Q_D(const QPrinter); - return d->printRange; -} - - -/*! - \class QPrintEngine - \reentrant - - \ingroup printing - - \brief The QPrintEngine class defines an interface for how QPrinter - interacts with a given printing subsystem. - - The common case when creating your own print engine is to derive from both - QPaintEngine and QPrintEngine. Various properties of a print engine are - given with property() and set with setProperty(). - - \sa QPaintEngine -*/ - -/*! - \enum QPrintEngine::PrintEnginePropertyKey - - This enum is used to communicate properties between the print - engine and QPrinter. A property may or may not be supported by a - given print engine. - - \value PPK_CollateCopies A boolean value indicating whether the - printout should be collated or not. - - \value PPK_ColorMode Refers to QPrinter::ColorMode, either color or - monochrome. - - \value PPK_Creator A string describing the document's creator. - - \value PPK_Duplex A boolean value indicating whether both sides of - the printer paper should be used for the printout. - - \value PPK_DocumentName A string describing the document name in - the spooler. - - \value PPK_FontEmbedding A boolean value indicating whether data for - the document's fonts should be embedded in the data sent to the - printer. - - \value PPK_FullPage A boolean describing if the printer should be - full page or not. - - \value PPK_NumberOfCopies Obsolete. An integer specifying the number of - copies. Use PPK_CopyCount instead. - - \value PPK_Orientation Specifies a QPrinter::Orientation value. - - \value PPK_OutputFileName The output file name as a string. An - empty file name indicates that the printer should not print to a file. - - \value PPK_PageOrder Specifies a QPrinter::PageOrder value. - - \value PPK_PageRect A QRect specifying the page rectangle - - \value PPK_PageSize Obsolete. Use PPK_PaperSize instead. - - \value PPK_PaperRect A QRect specifying the paper rectangle. - - \value PPK_PaperSource Specifies a QPrinter::PaperSource value. - - \value PPK_PaperSources Specifies more than one QPrinter::PaperSource value. - - \value PPK_PaperSize Specifies a QPrinter::PaperSize value. - - \value PPK_PrinterName A string specifying the name of the printer. - - \value PPK_PrinterProgram A string specifying the name of the - printer program used for printing, - - \value PPK_Resolution An integer describing the dots per inch for - this printer. - - \value PPK_SelectionOption - - \value PPK_SupportedResolutions A list of integer QVariants - describing the set of supported resolutions that the printer has. - - \value PPK_SuppressSystemPrintStatus Suppress the built-in dialog for showing - printing progress. As of 4.1 this only has effect on Mac OS X where, by default, - a status dialog is shown. - - \value PPK_WindowsPageSize An integer specifying a DM_PAPER entry - on Windows. - - \value PPK_CustomPaperSize A QSizeF specifying a custom paper size - in the QPrinter::Point unit. - - \value PPK_PageMargins A QList containing the left, top, - right and bottom margin values. - - \value PPK_CopyCount An integer specifying the number of copies to print. - - \value PPK_SupportsMultipleCopies A boolean value indicating whether or not - the printer supports printing multiple copies in one job. - - \value PPK_CustomBase Basis for extension. -*/ - -/*! - \fn QPrintEngine::~QPrintEngine() - - Destroys the print engine. -*/ - -/*! - \fn void QPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &value) - - Sets the print engine's property specified by \a key to the given \a value. - - \sa property() -*/ - -/*! - \fn void QPrintEngine::property(PrintEnginePropertyKey key) const - - Returns the print engine's property specified by \a key. - - \sa setProperty() -*/ - -/*! - \fn bool QPrintEngine::newPage() - - Instructs the print engine to start a new page. Returns true if - the printer was able to create the new page; otherwise returns false. -*/ - -/*! - \fn bool QPrintEngine::abort() - - Instructs the print engine to abort the printing process. Returns - true if successful; otherwise returns false. -*/ - -/*! - \fn int QPrintEngine::metric(QPaintDevice::PaintDeviceMetric id) const - - Returns the metric for the given \a id. -*/ - -/*! - \fn QPrinter::PrinterState QPrintEngine::printerState() const - - Returns the current state of the printer being used by the print engine. -*/ - -/*! - \fn HDC QPrintEngine::getPrinterDC() const - \internal -*/ - -/*! - \fn void QPrintEngine::releasePrinterDC(HDC) const - \internal -*/ - -/* - Returns the dimensions for the given paper size, \a size, in millimeters. -*/ -QSizeF qt_paperSizeToQSizeF(QPrinter::PaperSize size) -{ - if (size == QPrinter::Custom) return QSizeF(0, 0); - return QSizeF(qt_paperSizes[size][0], qt_paperSizes[size][1]); -} - -/* - Returns the PaperSize type that matches \a size, where \a size - is in millimeters. - - Because dimensions may not always be completely accurate (for - example when converting between units), a particular PaperSize - will be returned if it matches within -1/+1 millimeters. -*/ -QPrinter::PaperSize qSizeFTopaperSize(const QSizeF& size) -{ - for (int i = 0; i < static_cast(QPrinter::NPaperSize); ++i) { - if (qt_paperSizes[i][0] >= size.width() - 1 && - qt_paperSizes[i][0] <= size.width() + 1 && - qt_paperSizes[i][1] >= size.height() - 1 && - qt_paperSizes[i][1] <= size.height() + 1) { - return QPrinter::PaperSize(i); - } - } - - return QPrinter::Custom; -} - -QT_END_NAMESPACE - -#endif // QT_NO_PRINTER diff --git a/src/gui/painting/qprinter.h b/src/gui/painting/qprinter.h deleted file mode 100644 index d551489bb8..0000000000 --- a/src/gui/painting/qprinter.h +++ /dev/null @@ -1,283 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QPRINTER_H -#define QPRINTER_H - -#include -#include -#include - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Gui) - -#ifndef QT_NO_PRINTER - -#if defined(B0) -#undef B0 // Terminal hang-up. We assume that you do not want that. -#endif - -class QPrinterPrivate; -class QPaintEngine; -class QPrintEngine; -class QPrinterInfo; - -class Q_GUI_EXPORT QPrinter : public QPaintDevice -{ - Q_DECLARE_PRIVATE(QPrinter) -public: - enum PrinterMode { ScreenResolution, PrinterResolution, HighResolution }; - - explicit QPrinter(PrinterMode mode = ScreenResolution); - explicit QPrinter(const QPrinterInfo& printer, PrinterMode mode = ScreenResolution); - ~QPrinter(); - - int devType() const; - - enum Orientation { Portrait, Landscape }; - -#ifndef Q_QDOC - enum PageSize { A4, B5, Letter, Legal, Executive, - A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1, - B10, B2, B3, B4, B6, B7, B8, B9, C5E, Comm10E, - DLE, Folio, Ledger, Tabloid, Custom, NPageSize = Custom, NPaperSize = Custom }; - typedef PageSize PaperSize; -#else - enum PageSize { A4, B5, Letter, Legal, Executive, - A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1, - B10, B2, B3, B4, B6, B7, B8, B9, C5E, Comm10E, - DLE, Folio, Ledger, Tabloid, Custom, NPageSize = Custom }; - enum PaperSize { A4, B5, Letter, Legal, Executive, - A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1, - B10, B2, B3, B4, B6, B7, B8, B9, C5E, Comm10E, - DLE, Folio, Ledger, Tabloid, Custom, NPageSize = Custom, NPaperSize = Custom }; -#endif - - enum PageOrder { FirstPageFirst, - LastPageFirst }; - - enum ColorMode { GrayScale, - Color }; - - enum PaperSource { OnlyOne, - Lower, - Middle, - Manual, - Envelope, - EnvelopeManual, - Auto, - Tractor, - SmallFormat, - LargeFormat, - LargeCapacity, - Cassette, - FormSource, - MaxPageSource - }; - - enum PrinterState { Idle, - Active, - Aborted, - Error }; - - enum OutputFormat { NativeFormat, PdfFormat }; - - // Keep in sync with QAbstractPrintDialog::PrintRange - enum PrintRange { AllPages, Selection, PageRange, CurrentPage }; - - enum Unit { - Millimeter, - Point, - Inch, - Pica, - Didot, - Cicero, - DevicePixel - }; - - enum DuplexMode { - DuplexNone = 0, - DuplexAuto, - DuplexLongSide, - DuplexShortSide - }; - - void setOutputFormat(OutputFormat format); - OutputFormat outputFormat() const; - - void setPrinterName(const QString &); - QString printerName() const; - - bool isValid() const; - - void setOutputFileName(const QString &); - QString outputFileName()const; - - void setPrintProgram(const QString &); - QString printProgram() const; - - void setDocName(const QString &); - QString docName() const; - - void setCreator(const QString &); - QString creator() const; - - void setOrientation(Orientation); - Orientation orientation() const; - - void setPageSize(PageSize); - PageSize pageSize() const; - - void setPaperSize(PaperSize); - PaperSize paperSize() const; - - void setPaperSize(const QSizeF &paperSize, Unit unit); - QSizeF paperSize(Unit unit) const; - - void setPageOrder(PageOrder); - PageOrder pageOrder() const; - - void setResolution(int); - int resolution() const; - - void setColorMode(ColorMode); - ColorMode colorMode() const; - - void setCollateCopies(bool collate); - bool collateCopies() const; - - void setFullPage(bool); - bool fullPage() const; - - void setNumCopies(int); - int numCopies() const; - - int actualNumCopies() const; - - void setCopyCount(int); - int copyCount() const; - bool supportsMultipleCopies() const; - - void setPaperSource(PaperSource); - PaperSource paperSource() const; - - void setDuplex(DuplexMode duplex); - DuplexMode duplex() const; - - QList supportedResolutions() const; - -#ifdef Q_WS_WIN - QList supportedPaperSources() const; -#endif - - void setFontEmbeddingEnabled(bool enable); - bool fontEmbeddingEnabled() const; - - void setDoubleSidedPrinting(bool enable); - bool doubleSidedPrinting() const; - -#ifdef Q_WS_WIN - void setWinPageSize(int winPageSize); - int winPageSize() const; -#endif - - QRect paperRect() const; - QRect pageRect() const; - QRectF paperRect(Unit) const; - QRectF pageRect(Unit) const; - -#if !defined(Q_WS_WIN) || defined(qdoc) - QString printerSelectionOption() const; - void setPrinterSelectionOption(const QString &); -#endif - - bool newPage(); - bool abort(); - - PrinterState printerState() const; - - QPaintEngine *paintEngine() const; - QPrintEngine *printEngine() const; - -#ifdef Q_WS_WIN - HDC getDC() const; - void releaseDC(HDC hdc) const; -#endif - - void setFromTo(int fromPage, int toPage); - int fromPage() const; - int toPage() const; - - void setPrintRange(PrintRange range); - PrintRange printRange() const; - - void setPageMargins(qreal left, qreal top, qreal right, qreal bottom, Unit unit); - void getPageMargins(qreal *left, qreal *top, qreal *right, qreal *bottom, Unit unit) const; - -protected: - int metric(PaintDeviceMetric) const; - void setEngines(QPrintEngine *printEngine, QPaintEngine *paintEngine); - -private: - void init(PrinterMode mode); - - Q_DISABLE_COPY(QPrinter) - - QScopedPointer d_ptr; - - friend class QPrintDialogPrivate; - friend class QAbstractPrintDialog; - friend class QAbstractPrintDialogPrivate; - friend class QPrintPreviewWidgetPrivate; - friend class QTextDocument; - friend class QPageSetupWidget; -}; - -#endif // QT_NO_PRINTER - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // QPRINTER_H diff --git a/src/gui/painting/qprinter_p.h b/src/gui/painting/qprinter_p.h deleted file mode 100644 index 2ba0f0dbb8..0000000000 --- a/src/gui/painting/qprinter_p.h +++ /dev/null @@ -1,136 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QPRINTER_P_H -#define QPRINTER_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - - -#include "QtCore/qglobal.h" - -#ifndef QT_NO_PRINTER - -#include "QtGui/qprinter.h" -#include "QtGui/qprintengine.h" -#include "QtCore/qpointer.h" - -#include - -QT_BEGIN_NAMESPACE - -class QPrintEngine; -class QPreviewPaintEngine; -class QPicture; - -class Q_GUI_EXPORT QPrinterPrivate -{ - Q_DECLARE_PUBLIC(QPrinter) -public: - QPrinterPrivate(QPrinter *printer) - : printEngine(0) - , paintEngine(0) - , q_ptr(printer) - , printRange(QPrinter::AllPages) - , minPage(1) - , maxPage(INT_MAX) - , fromPage(0) - , toPage(0) - , use_default_engine(true) - , validPrinter(false) - , hasCustomPageMargins(false) - , hasUserSetPageSize(false) - { - } - - ~QPrinterPrivate() { - - } - - void createDefaultEngines(); -#ifndef QT_NO_PRINTPREVIEWWIDGET - QList previewPages() const; - void setPreviewMode(bool); -#endif - - void addToManualSetList(QPrintEngine::PrintEnginePropertyKey key); - - QPrinter::PrinterMode printerMode; - QPrinter::OutputFormat outputFormat; - QPrintEngine *printEngine; - QPaintEngine *paintEngine; - - QPrintEngine *realPrintEngine; - QPaintEngine *realPaintEngine; -#ifndef QT_NO_PRINTPREVIEWWIDGET - QPreviewPaintEngine *previewEngine; -#endif - - QPrinter *q_ptr; - - QPrinter::PrintRange printRange; - int minPage, maxPage, fromPage, toPage; - - uint use_default_engine : 1; - uint had_default_engines : 1; - - uint validPrinter : 1; - uint hasCustomPageMargins : 1; - uint hasUserSetPageSize : 1; - - // Used to remember which properties have been manually set by the user. - QList manualSetList; -}; - -QT_END_NAMESPACE - -#endif // QT_NO_PRINTER - -#endif // QPRINTER_P_H diff --git a/src/gui/painting/qprinterinfo.cpp b/src/gui/painting/qprinterinfo.cpp deleted file mode 100644 index 0049bd248a..0000000000 --- a/src/gui/painting/qprinterinfo.cpp +++ /dev/null @@ -1,199 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the documentation of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:FDL$ -** GNU Free Documentation License -** Alternatively, this file may be used under the terms of the GNU Free -** Documentation License version 1.3 as published by the Free Software -** Foundation and appearing in the file included in the packaging of -** this file. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms -** and conditions contained in a signed written agreement between you -** and Nokia. -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qprinterinfo.h" -#include "qprinterinfo_p.h" - -#ifndef QT_NO_PRINTER - -#include -#include - -QT_BEGIN_NAMESPACE - -QPrinterInfoPrivate QPrinterInfoPrivate::shared_null; - - -/*! - \class QPrinterInfo - - \brief The QPrinterInfo class gives access to information about - existing printers. - - \ingroup printing - - Use the static functions to generate a list of QPrinterInfo - objects. Each QPrinterInfo object in the list represents a single - printer and can be queried for name, supported paper sizes, and - whether or not it is the default printer. - - \since 4.4 -*/ - -/*! - \fn QList QPrinterInfo::availablePrinters() - - Returns a list of available printers on the system. -*/ - -/*! - \fn QPrinterInfo QPrinterInfo::defaultPrinter() - - Returns the default printer on the system. - - The return value should be checked using isNull() before being - used, in case there is no default printer. - - \sa isNull() -*/ - -/*! - Constructs an empty QPrinterInfo object. - - \sa isNull() -*/ -QPrinterInfo::QPrinterInfo() - : d_ptr(&QPrinterInfoPrivate::shared_null) -{ -} - -/*! - Constructs a copy of \a other. -*/ -QPrinterInfo::QPrinterInfo(const QPrinterInfo &other) - : d_ptr(new QPrinterInfoPrivate(*other.d_ptr)) -{ -} - -/*! - Constructs a QPrinterInfo object from \a printer. -*/ -QPrinterInfo::QPrinterInfo(const QPrinter &printer) - : d_ptr(&QPrinterInfoPrivate::shared_null) -{ - foreach (const QPrinterInfo &printerInfo, availablePrinters()) { - if (printerInfo.printerName() == printer.printerName()) { - d_ptr.reset(new QPrinterInfoPrivate(*printerInfo.d_ptr)); - break; - } - } -} - -/*! - \internal -*/ -QPrinterInfo::QPrinterInfo(const QString &name) - : d_ptr(new QPrinterInfoPrivate(name)) -{ -} - -/*! - Destroys the QPrinterInfo object. References to the values in the - object become invalid. -*/ -QPrinterInfo::~QPrinterInfo() -{ -} - -/*! - Sets the QPrinterInfo object to be equal to \a other. -*/ -QPrinterInfo &QPrinterInfo::operator=(const QPrinterInfo &other) -{ - Q_ASSERT(d_ptr); - d_ptr.reset(new QPrinterInfoPrivate(*other.d_ptr)); - return *this; -} - -/*! - Returns the name of the printer. - - \sa QPrinter::setPrinterName() -*/ -QString QPrinterInfo::printerName() const -{ - const Q_D(QPrinterInfo); - return d->name; -} - -/*! - Returns whether this QPrinterInfo object holds a printer definition. - - An empty QPrinterInfo object could result for example from calling - defaultPrinter() when there are no printers on the system. -*/ -bool QPrinterInfo::isNull() const -{ - const Q_D(QPrinterInfo); - return d == &QPrinterInfoPrivate::shared_null; -} - -/*! - Returns whether this printer is the default printer. -*/ -bool QPrinterInfo::isDefault() const -{ - const Q_D(QPrinterInfo); - return d->isDefault; -} - -/*! - \fn QList< QPrinter::PaperSize> QPrinterInfo::supportedPaperSizes() const - \since 4.4 - - Returns a list of supported paper sizes by the printer. - - Not all printer drivers support this query, so the list may be empty. - On Mac OS X 10.3, this function always returns an empty list. -*/ - -#ifdef Q_WS_QPA -QList QPrinterInfo::supportedPaperSizes() const -{ - const Q_D(QPrinterInfo); - if (!isNull() && !d->hasPaperSizes) { - d->paperSizes = QGuiApplicationPrivate::platformIntegration()->printerSupport()->supportedPaperSizes(*this); - d->hasPaperSizes = true; - } - return d->paperSizes; -} - -QList QPrinterInfo::availablePrinters() -{ - return QGuiApplicationPrivate::platformIntegration()->printerSupport()->availablePrinters(); -} - -QPrinterInfo QPrinterInfo::defaultPrinter() -{ - return QGuiApplicationPrivate::platformIntegration()->printerSupport()->defaultPrinter(); -} - -#endif //Q_WS_QPA - -QT_END_NAMESPACE - -#endif // QT_NO_PRINTER diff --git a/src/gui/painting/qprinterinfo.h b/src/gui/painting/qprinterinfo.h deleted file mode 100644 index 72082cf299..0000000000 --- a/src/gui/painting/qprinterinfo.h +++ /dev/null @@ -1,91 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QPRINTERINFO_H -#define QPRINTERINFO_H - -#include - -#include - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Gui) - -#ifndef QT_NO_PRINTER -class QPrinterInfoPrivate; -class QPrinterInfoPrivateDeleter; -class Q_GUI_EXPORT QPrinterInfo -{ -public: - QPrinterInfo(); - QPrinterInfo(const QPrinterInfo &other); - QPrinterInfo(const QPrinter &printer); - ~QPrinterInfo(); - - QPrinterInfo &operator=(const QPrinterInfo &other); - - QString printerName() const; - bool isNull() const; - bool isDefault() const; - QList supportedPaperSizes() const; - - static QList availablePrinters(); - static QPrinterInfo defaultPrinter(); - -private: - QPrinterInfo(const QString &name); - -private: - friend class QPlatformPrinterSupport; - Q_DECLARE_PRIVATE(QPrinterInfo) - QScopedPointer d_ptr; -}; - -#endif // QT_NO_PRINTER - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // QPRINTERINFO_H diff --git a/src/gui/painting/qprinterinfo_p.h b/src/gui/painting/qprinterinfo_p.h deleted file mode 100644 index a3c654e7b7..0000000000 --- a/src/gui/painting/qprinterinfo_p.h +++ /dev/null @@ -1,108 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QPRINTERINFO_P_H -#define QPRINTERINFO_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "QtCore/qglobal.h" - -#ifndef QT_NO_PRINTER - -#include "QtCore/qlist.h" - -QT_BEGIN_NAMESPACE - -class QPrinterInfoPrivate -{ -public: - QPrinterInfoPrivate(const QString& name = QString()) : - name(name), isDefault(false) -#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_SYMBIAN)) || defined(Q_WS_QPA) -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - , cupsPrinterIndex(0) -#endif -#endif - , hasPaperSizes(false) - {} - ~QPrinterInfoPrivate() - {} - - static QPrinterInfoPrivate shared_null; - - QString name; - bool isDefault; - -#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_SYMBIAN)) || defined(Q_WS_QPA) -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - int cupsPrinterIndex; -#endif -#endif - mutable bool hasPaperSizes; - mutable QList paperSizes; -}; - - -class QPrinterInfoPrivateDeleter -{ -public: - static inline void cleanup(QPrinterInfoPrivate *d) - { - if (d != &QPrinterInfoPrivate::shared_null) - delete d; - } -}; - -QT_END_NAMESPACE - -#endif // QT_NO_PRINTER - -#endif // QPRINTERINFO_P_H diff --git a/src/gui/painting/qprinterinfo_unix.cpp b/src/gui/painting/qprinterinfo_unix.cpp deleted file mode 100644 index 3c66481b4d..0000000000 --- a/src/gui/painting/qprinterinfo_unix.cpp +++ /dev/null @@ -1,857 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qprinterinfo.h" -#include "qprinterinfo_p.h" - -#include -#include -#include -#include -#include -#include - -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) -# include -# include -# include -#endif - -#include - -QT_BEGIN_NAMESPACE - -#ifndef QT_NO_PRINTER - -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) -// preserver names in ascending order for the binary search -static const struct NamedPaperSize { - const char *const name; - QPrinter::PaperSize size; -} named_sizes_map[QPrinter::NPageSize] = { - { "A0", QPrinter::A0 }, - { "A1", QPrinter::A1 }, - { "A2", QPrinter::A2 }, - { "A3", QPrinter::A3 }, - { "A4", QPrinter::A4 }, - { "A5", QPrinter::A5 }, - { "A6", QPrinter::A6 }, - { "A7", QPrinter::A7 }, - { "A8", QPrinter::A8 }, - { "A9", QPrinter::A9 }, - { "B0", QPrinter::B0 }, - { "B1", QPrinter::B1 }, - { "B10", QPrinter::B10 }, - { "B2", QPrinter::B2 }, - { "B4", QPrinter::B4 }, - { "B5", QPrinter::B5 }, - { "B6", QPrinter::B6 }, - { "B7", QPrinter::B7 }, - { "B8", QPrinter::B8 }, - { "B9", QPrinter::B9 }, - { "C5E", QPrinter::C5E }, - { "Comm10E", QPrinter::Comm10E }, - { "Custom", QPrinter::Custom }, - { "DLE", QPrinter::DLE }, - { "Executive", QPrinter::Executive }, - { "Folio", QPrinter::Folio }, - { "Ledger", QPrinter::Ledger }, - { "Legal", QPrinter::Legal }, - { "Letter", QPrinter::Letter }, - { "Tabloid", QPrinter::Tabloid } -}; - -inline bool operator<(const char *name, const NamedPaperSize &data) -{ return qstrcmp(name, data.name) < 0; } -inline bool operator<(const NamedPaperSize &data, const char *name) -{ return qstrcmp(data.name, name) < 0; } - -static inline QPrinter::PaperSize string2PaperSize(const char *name) -{ - const NamedPaperSize *r = qBinaryFind(named_sizes_map, named_sizes_map + QPrinter::NPageSize, name); - if (r - named_sizes_map != QPrinter::NPageSize) - return r->size; - return QPrinter::Custom; -} - -static inline const char *paperSize2String(QPrinter::PaperSize size) -{ - for (int i = 0; i < QPrinter::NPageSize; ++i) { - if (size == named_sizes_map[i].size) - return named_sizes_map[i].name; - } - return 0; -} -#endif - -void qt_perhapsAddPrinter(QList *printers, const QString &name, - QString host, QString comment, - QStringList aliases) -{ - for (int i = 0; i < printers->size(); ++i) - if (printers->at(i).samePrinter(name)) - return; - - if (host.isEmpty()) - host = QCoreApplication::translate("QPrinter", "locally connected"); - printers->append(QPrinterDescription(name.simplified(), host.simplified(), comment.simplified(), aliases)); -} - -void qt_parsePrinterDesc(QString printerDesc, QList *printers) -{ - if (printerDesc.length() < 1) - return; - - printerDesc = printerDesc.simplified(); - int i = printerDesc.indexOf(QLatin1Char(':')); - QString printerName, printerComment, printerHost; - QStringList aliases; - - if (i >= 0) { - // have ':' want '|' - int j = printerDesc.indexOf(QLatin1Char('|')); - if (j > 0 && j < i) { - printerName = printerDesc.left(j); - aliases = printerDesc.mid(j + 1, i - j - 1).split(QLatin1Char('|')); - // try extracting a comment from the aliases - printerComment = QCoreApplication::translate("QPrinter", "Aliases: %1") - .arg(aliases.join(QLatin1String(", "))); - } else { - printerName = printerDesc.left(i); - } - // look for lprng pseudo all printers entry - i = printerDesc.indexOf(QRegExp(QLatin1String(": *all *="))); - if (i >= 0) - printerName = QString(); - // look for signs of this being a remote printer - i = printerDesc.indexOf(QRegExp(QLatin1String(": *rm *="))); - if (i >= 0) { - // point k at the end of remote host name - while (printerDesc[i] != QLatin1Char('=')) - i++; - while (printerDesc[i] == QLatin1Char('=') || printerDesc[i].isSpace()) - i++; - j = i; - while (j < (int)printerDesc.length() && printerDesc[j] != QLatin1Char(':')) - j++; - - // and stuff that into the string - printerHost = printerDesc.mid(i, j - i); - } - } - if (printerName.length()) - qt_perhapsAddPrinter(printers, printerName, printerHost, printerComment, - aliases); -} - -int qt_parsePrintcap(QList *printers, const QString& fileName) -{ - QFile printcap(fileName); - if (!printcap.open(QIODevice::ReadOnly)) - return NotFound; - - char *line_ascii = new char[1025]; - line_ascii[1024] = '\0'; - - QString printerDesc; - bool atEnd = false; - - while (!atEnd) { - if (printcap.atEnd() || printcap.readLine(line_ascii, 1024) <= 0) - atEnd = true; - QString line = QString::fromLocal8Bit(line_ascii); - line = line.trimmed(); - if (line.length() >= 1 && line[int(line.length()) - 1] == QLatin1Char('\\')) - line.chop(1); - if (line[0] == QLatin1Char('#')) { - if (!atEnd) - continue; - } else if (line[0] == QLatin1Char('|') || line[0] == QLatin1Char(':') - || line.isEmpty()) { - printerDesc += line; - if (!atEnd) - continue; - } - - qt_parsePrinterDesc(printerDesc, printers); - - // add the first line of the new printer definition - printerDesc = line; - } - delete[] line_ascii; - return Success; -} - -/*! - \internal - - Checks $HOME/.printers for a line matching '_default ' (where - does not contain any white space). The first such match - results in being returned. - If no lines match then an empty string is returned. -*/ -QString qt_getDefaultFromHomePrinters() -{ - QFile file(QDir::homePath() + QLatin1String("/.printers")); - if (!file.open(QIODevice::ReadOnly)) - return QString(); - QString all(QLatin1String(file.readAll())); - QStringList words = all.split(QRegExp(QLatin1String("\\W+")), QString::SkipEmptyParts); - const int i = words.indexOf(QLatin1String("_default")); - if (i != -1 && i < words.size() - 1) - return words.at(i + 1); - return QString(); -} - -// solaris, not 2.6 -void qt_parseEtcLpPrinters(QList *printers) -{ - QDir lp(QLatin1String("/etc/lp/printers")); - QFileInfoList dirs = lp.entryInfoList(); - if (dirs.isEmpty()) - return; - - QString tmp; - for (int i = 0; i < dirs.size(); ++i) { - QFileInfo printer = dirs.at(i); - if (printer.isDir()) { - tmp.sprintf("/etc/lp/printers/%s/configuration", - printer.fileName().toAscii().data()); - QFile configuration(tmp); - char *line = new char[1025]; - QString remote(QLatin1String("Remote:")); - QString contentType(QLatin1String("Content types:")); - QString printerHost; - bool canPrintPostscript = false; - if (configuration.open(QIODevice::ReadOnly)) { - while (!configuration.atEnd() && - configuration.readLine(line, 1024) > 0) { - if (QString::fromLatin1(line).startsWith(remote)) { - const char *p = line; - while (*p != ':') - p++; - p++; - while (isspace((uchar) *p)) - p++; - printerHost = QString::fromLocal8Bit(p); - printerHost = printerHost.simplified(); - } else if (QString::fromLatin1(line).startsWith(contentType)) { - char *p = line; - while (*p != ':') - p++; - p++; - char *e; - while (*p) { - while (isspace((uchar) *p)) - p++; - if (*p) { - char s; - e = p; - while (isalnum((uchar) *e)) - e++; - s = *e; - *e = '\0'; - if (!qstrcmp(p, "postscript") || - !qstrcmp(p, "any")) - canPrintPostscript = true; - *e = s; - if (s == ',') - e++; - p = e; - } - } - } - } - if (canPrintPostscript) - qt_perhapsAddPrinter(printers, printer.fileName(), - printerHost, QLatin1String("")); - } - delete[] line; - } - } -} - -// solaris 2.6 -char *qt_parsePrintersConf(QList *printers, bool *found) -{ - QFile pc(QLatin1String("/etc/printers.conf")); - if (!pc.open(QIODevice::ReadOnly)) { - if (found) - *found = false; - return 0; - } - if (found) - *found = true; - - char *line = new char[1025]; - line[1024] = '\0'; - - QString printerDesc; - int lineLength = 0; - - char *defaultPrinter = 0; - - while (!pc.atEnd() && - (lineLength=pc.readLine(line, 1024)) > 0) { - if (*line == '#') { - *line = '\0'; - lineLength = 0; - } - if (lineLength >= 2 && line[lineLength-2] == '\\') { - line[lineLength-2] = '\0'; - printerDesc += QString::fromLocal8Bit(line); - } else { - printerDesc += QString::fromLocal8Bit(line); - printerDesc = printerDesc.simplified(); - int i = printerDesc.indexOf(QLatin1Char(':')); - QString printerName, printerHost, printerComment; - QStringList aliases; - if (i >= 0) { - // have : want | - int j = printerDesc.indexOf(QLatin1Char('|')); - if (j >= i) - j = -1; - printerName = printerDesc.mid(0, j < 0 ? i : j); - if (printerName == QLatin1String("_default")) { - i = printerDesc.indexOf( - QRegExp(QLatin1String(": *use *="))); - while (printerDesc[i] != QLatin1Char('=')) - i++; - while (printerDesc[i] == QLatin1Char('=') || printerDesc[i].isSpace()) - i++; - j = i; - while (j < (int)printerDesc.length() && - printerDesc[j] != QLatin1Char(':') && printerDesc[j] != QLatin1Char(',')) - j++; - // that's our default printer - defaultPrinter = - qstrdup(printerDesc.mid(i, j-i).toAscii().data()); - printerName = QString(); - printerDesc = QString(); - } else if (printerName == QLatin1String("_all")) { - // skip it.. any other cases we want to skip? - printerName = QString(); - printerDesc = QString(); - } - - if (j > 0) { - // try extracting a comment from the aliases - aliases = printerDesc.mid(j + 1, i - j - 1).split(QLatin1Char('|')); - printerComment = QCoreApplication::translate("QPrinter", "Aliases: %1") - .arg(aliases.join(QLatin1String(", "))); - } - // look for signs of this being a remote printer - i = printerDesc.indexOf( - QRegExp(QLatin1String(": *bsdaddr *="))); - if (i >= 0) { - // point k at the end of remote host name - while (printerDesc[i] != QLatin1Char('=')) - i++; - while (printerDesc[i] == QLatin1Char('=') || printerDesc[i].isSpace()) - i++; - j = i; - while (j < (int)printerDesc.length() && - printerDesc[j] != QLatin1Char(':') && printerDesc[j] != QLatin1Char(',')) - j++; - // and stuff that into the string - printerHost = printerDesc.mid(i, j-i); - // maybe stick the remote printer name into the comment - if (printerDesc[j] == QLatin1Char(',')) { - i = ++j; - while (printerDesc[i].isSpace()) - i++; - j = i; - while (j < (int)printerDesc.length() && - printerDesc[j] != QLatin1Char(':') && printerDesc[j] != QLatin1Char(',')) - j++; - if (printerName != printerDesc.mid(i, j-i)) { - printerComment = - QLatin1String("Remote name: "); - printerComment += printerDesc.mid(i, j-i); - } - } - } - } - if (printerComment == QLatin1String(":")) - printerComment = QString(); // for cups - if (printerName.length()) - qt_perhapsAddPrinter(printers, printerName, printerHost, - printerComment, aliases); - // chop away the line, for processing the next one - printerDesc = QString(); - } - } - delete[] line; - return defaultPrinter; -} - -#ifndef QT_NO_NIS - -#if defined(Q_C_CALLBACKS) -extern "C" { -#endif - -int qt_pd_foreach(int /*status */, char * /*key */, int /*keyLen */, - char *val, int valLen, char *data) -{ - qt_parsePrinterDesc(QString::fromLatin1(val, valLen), (QList *)data); - return 0; -} - -#if defined(Q_C_CALLBACKS) -} -#endif - -int qt_retrieveNisPrinters(QList *printers) -{ -#ifndef QT_NO_LIBRARY - typedef int (*WildCast)(int, char *, int, char *, int, char *); - char printersConfByname[] = "printers.conf.byname"; - char *domain; - int err; - - QLibrary lib(QLatin1String("nsl")); - typedef int (*ypGetDefaultDomain)(char **); - ypGetDefaultDomain _ypGetDefaultDomain = (ypGetDefaultDomain)lib.resolve("yp_get_default_domain"); - typedef int (*ypAll)(const char *, const char *, const struct ypall_callback *); - ypAll _ypAll = (ypAll)lib.resolve("yp_all"); - - if (_ypGetDefaultDomain && _ypAll) { - err = _ypGetDefaultDomain(&domain); - if (err == 0) { - ypall_callback cb; - // wild cast to support K&R-style system headers - (WildCast &) cb.foreach = (WildCast) qt_pd_foreach; - cb.data = (char *) printers; - err = _ypAll(domain, printersConfByname, &cb); - } - if (!err) - return Success; - } -#endif //QT_NO_LIBRARY - return Unavail; -} - -#endif // QT_NO_NIS - -char *qt_parseNsswitchPrintersEntry(QList *printers, char *line) -{ -#define skipSpaces() \ - while (line[k] != '\0' && isspace((uchar) line[k])) \ - k++ - - char *defaultPrinter = 0; - bool stop = false; - int lastStatus = NotFound; - - int k = 8; - skipSpaces(); - if (line[k] != ':') - return 0; - k++; - - char *cp = strchr(line, '#'); - if (cp != 0) - *cp = '\0'; - - while (line[k] != '\0') { - if (isspace((uchar) line[k])) { - k++; - } else if (line[k] == '[') { - k++; - skipSpaces(); - while (line[k] != '\0') { - char status = tolower(line[k]); - char action = '?'; - - while (line[k] != '=' && line[k] != ']' && line[k] != '\0') - k++; - if (line[k] == '=') { - k++; - skipSpaces(); - action = tolower(line[k]); - while (line[k] != '\0' && !isspace((uchar) line[k]) && line[k] != ']') - k++; - } else if (line[k] == ']') { - k++; - break; - } - skipSpaces(); - - if (lastStatus == status) - stop = (action == (char) Return); - } - } else { - if (stop) - break; - - QByteArray source; - while (line[k] != '\0' && !isspace((uchar) line[k]) && line[k] != '[') { - source += line[k]; - k++; - } - - if (source == "user") { - lastStatus = qt_parsePrintcap(printers, - QDir::homePath() + QLatin1String("/.printers")); - } else if (source == "files") { - bool found; - defaultPrinter = qt_parsePrintersConf(printers, &found); - if (found) - lastStatus = Success; -#ifndef QT_NO_NIS - } else if (source == "nis") { - lastStatus = qt_retrieveNisPrinters(printers); -#endif - } else { - // nisplus, dns, etc., are not implemented yet - lastStatus = NotFound; - } - stop = (lastStatus == Success); - } - } - return defaultPrinter; -} - -char *qt_parseNsswitchConf(QList *printers) -{ - QFile nc(QLatin1String("/etc/nsswitch.conf")); - if (!nc.open(QIODevice::ReadOnly)) - return 0; - - char *defaultPrinter = 0; - - char *line = new char[1025]; - line[1024] = '\0'; - - while (!nc.atEnd() && - nc.readLine(line, 1024) > 0) { - if (qstrncmp(line, "printers", 8) == 0) { - defaultPrinter = qt_parseNsswitchPrintersEntry(printers, line); - delete[] line; - return defaultPrinter; - } - } - - strcpy(line, "printers: user files nis nisplus xfn"); - defaultPrinter = qt_parseNsswitchPrintersEntry(printers, line); - delete[] line; - return defaultPrinter; -} - -// HP-UX -void qt_parseEtcLpMember(QList *printers) -{ - QDir lp(QLatin1String("/etc/lp/member")); - if (!lp.exists()) - return; - QFileInfoList dirs = lp.entryInfoList(); - if (dirs.isEmpty()) - return; - - QString tmp; - for (int i = 0; i < dirs.size(); ++i) { - QFileInfo printer = dirs.at(i); - // I haven't found any real documentation, so I'm guessing that - // since lpstat uses /etc/lp/member rather than one of the - // other directories, it's the one to use. I did not find a - // decent way to locate aliases and remote printers. - if (printer.isFile()) - qt_perhapsAddPrinter(printers, printer.fileName(), - QCoreApplication::translate("QPrinter", "unknown"), - QLatin1String("")); - } -} - -// IRIX 6.x -void qt_parseSpoolInterface(QList *printers) -{ - QDir lp(QLatin1String("/usr/spool/lp/interface")); - if (!lp.exists()) - return; - QFileInfoList files = lp.entryInfoList(); - if(files.isEmpty()) - return; - - for (int i = 0; i < files.size(); ++i) { - QFileInfo printer = files.at(i); - - if (!printer.isFile()) - continue; - - // parse out some information - QFile configFile(printer.filePath()); - if (!configFile.open(QIODevice::ReadOnly)) - continue; - - QByteArray line; - line.resize(1025); - QString namePrinter; - QString hostName; - QString hostPrinter; - QString printerType; - - QString nameKey(QLatin1String("NAME=")); - QString typeKey(QLatin1String("TYPE=")); - QString hostKey(QLatin1String("HOSTNAME=")); - QString hostPrinterKey(QLatin1String("HOSTPRINTER=")); - - while (!configFile.atEnd() && - (configFile.readLine(line.data(), 1024)) > 0) { - QString uline = QString::fromLocal8Bit(line); - if (uline.startsWith(typeKey) ) { - printerType = uline.mid(nameKey.length()); - printerType = printerType.simplified(); - } else if (uline.startsWith(hostKey)) { - hostName = uline.mid(hostKey.length()); - hostName = hostName.simplified(); - } else if (uline.startsWith(hostPrinterKey)) { - hostPrinter = uline.mid(hostPrinterKey.length()); - hostPrinter = hostPrinter.simplified(); - } else if (uline.startsWith(nameKey)) { - namePrinter = uline.mid(nameKey.length()); - namePrinter = namePrinter.simplified(); - } - } - configFile.close(); - - printerType = printerType.trimmed(); - if (printerType.indexOf(QLatin1String("postscript"), 0, Qt::CaseInsensitive) < 0) - continue; - - int ii = 0; - while ((ii = namePrinter.indexOf(QLatin1Char('"'), ii)) >= 0) - namePrinter.remove(ii, 1); - - if (hostName.isEmpty() || hostPrinter.isEmpty()) { - qt_perhapsAddPrinter(printers, printer.fileName(), - QLatin1String(""), namePrinter); - } else { - QString comment; - comment = namePrinter; - comment += QLatin1String(" ("); - comment += hostPrinter; - comment += QLatin1Char(')'); - qt_perhapsAddPrinter(printers, printer.fileName(), - hostName, comment); - } - } -} - - -// Every unix must have its own. It's a standard. Here is AIX. -void qt_parseQconfig(QList *printers) -{ - QFile qconfig(QLatin1String("/etc/qconfig")); - if (!qconfig.open(QIODevice::ReadOnly)) - return; - - QTextStream ts(&qconfig); - QString line; - - QString stanzaName; // either a queue or a device name - bool up = true; // queue up? default true, can be false - QString remoteHost; // null if local - QString deviceName; // null if remote - - QRegExp newStanza(QLatin1String("^[0-z\\-]*:$")); - - // our basic strategy here is to process each line, detecting new - // stanzas. each time we see a new stanza, we check if the - // previous stanza was a valid queue for a) a remote printer or b) - // a local printer. if it wasn't, we assume that what we see is - // the start of the first stanza, or that the previous stanza was - // a device stanza, or that there is some syntax error (we don't - // report those). - - do { - line = ts.readLine(); - bool indented = line[0].isSpace(); - line = line.simplified(); - - int i = line.indexOf(QLatin1Char('=')); - if (indented && i != -1) { // line in stanza - QString variable = line.left(i).simplified(); - QString value=line.mid(i+1, line.length()).simplified(); - if (variable == QLatin1String("device")) - deviceName = value; - else if (variable == QLatin1String("host")) - remoteHost = value; - else if (variable == QLatin1String("up")) - up = !(value.toLower() == QLatin1String("false")); - } else if (line[0] == QLatin1Char('*')) { // comment - // nothing to do - } else if (ts.atEnd() || // end of file, or beginning of new stanza - (!indented && line.contains(newStanza))) { - if (up && stanzaName.length() > 0 && stanzaName.length() < 21) { - if (remoteHost.length()) // remote printer - qt_perhapsAddPrinter(printers, stanzaName, remoteHost, - QString()); - else if (deviceName.length()) // local printer - qt_perhapsAddPrinter(printers, stanzaName, QString(), - QString()); - } - line.chop(1); - if (line.length() >= 1 && line.length() <= 20) - stanzaName = line; - up = true; - remoteHost.clear(); - deviceName.clear(); - } else { - // syntax error? ignore. - } - } while (!ts.atEnd()); -} - -Q_GUI_EXPORT int qt_getLprPrinters(QList& printers) -{ - QByteArray etcLpDefault; - qt_parsePrintcap(&printers, QLatin1String("/etc/printcap")); - qt_parseEtcLpMember(&printers); - qt_parseSpoolInterface(&printers); - qt_parseQconfig(&printers); - - QFileInfo f; - f.setFile(QLatin1String("/etc/lp/printers")); - if (f.isDir()) { - qt_parseEtcLpPrinters(&printers); - QFile def(QLatin1String("/etc/lp/default")); - if (def.open(QIODevice::ReadOnly)) { - etcLpDefault.resize(1025); - if (def.readLine(etcLpDefault.data(), 1024) > 0) { - QRegExp rx(QLatin1String("^(\\S+)")); - if (rx.indexIn(QString::fromLatin1(etcLpDefault)) != -1) - etcLpDefault = rx.cap(1).toAscii(); - } - } - } - - char *def = 0; - f.setFile(QLatin1String("/etc/nsswitch.conf")); - if (f.isFile()) { - def = qt_parseNsswitchConf(&printers); - } else { - f.setFile(QLatin1String("/etc/printers.conf")); - if (f.isFile()) - def = qt_parsePrintersConf(&printers); - } - - if (def) { - etcLpDefault = def; - delete [] def; - } - - QString homePrintersDefault = qt_getDefaultFromHomePrinters(); - - // all printers hopefully known. try to find a good default - QString dollarPrinter; - { - dollarPrinter = QString::fromLocal8Bit(qgetenv("PRINTER")); - if (dollarPrinter.isEmpty()) - dollarPrinter = QString::fromLocal8Bit(qgetenv("LPDEST")); - if (dollarPrinter.isEmpty()) - dollarPrinter = QString::fromLocal8Bit(qgetenv("NPRINTER")); - if (dollarPrinter.isEmpty()) - dollarPrinter = QString::fromLocal8Bit(qgetenv("NGPRINTER")); - if (!dollarPrinter.isEmpty()) - qt_perhapsAddPrinter(&printers, dollarPrinter, - QCoreApplication::translate("QPrinter", "unknown"), - QLatin1String("")); - } - - QRegExp ps(QLatin1String("[^a-z]ps(?:[^a-z]|$)")); - QRegExp lp(QLatin1String("[^a-z]lp(?:[^a-z]|$)")); - - int quality = 0; - int best = 0; - for (int i = 0; i < printers.size(); ++i) { - QString name = printers.at(i).name; - QString comment = printers.at(i).comment; - if (quality < 5 && name == dollarPrinter) { - best = i; - quality = 5; - } else if (quality < 4 && !homePrintersDefault.isEmpty() && - name == homePrintersDefault) { - best = i; - quality = 4; - } else if (quality < 3 && !etcLpDefault.isEmpty() && - name == QLatin1String(etcLpDefault)) { - best = i; - quality = 3; - } else if (quality < 2 && - (name == QLatin1String("ps") || - ps.indexIn(comment) != -1)) { - best = i; - quality = 2; - } else if (quality < 1 && - (name == QLatin1String("lp") || - lp.indexIn(comment) > -1)) { - best = i; - quality = 1; - } - } - - return best; -} - -///////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////// - -QList qt_getCupsPrinterPaperSizes(int cupsPrinterIndex) -{ - QList result; -#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) - if (!QCUPSSupport::isAvailable() || cupsPrinterIndex < 0) - return result; - // Find paper sizes from CUPS. - QCUPSSupport cups; - cups.setCurrentPrinter(cupsPrinterIndex); - if (const ppd_option_t* size = cups.pageSizes()) { - for (int j = 0; j < size->num_choices; ++j) - result.append(string2PaperSize(size->choices[j].choice)); - } - return result; -#endif -} - -#endif // QT_NO_PRINTER - -QT_END_NAMESPACE diff --git a/src/gui/painting/qprinterinfo_unix_p.h b/src/gui/painting/qprinterinfo_unix_p.h deleted file mode 100644 index f8721deaa9..0000000000 --- a/src/gui/painting/qprinterinfo_unix_p.h +++ /dev/null @@ -1,130 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QPRINTERINFO_UNIX_P_H -#define QPRINTERINFO_UNIX_P_H - -#include -#include - -#ifndef QT_NO_NIS -# ifndef BOOL_DEFINED -# define BOOL_DEFINED -# endif - -# include -# include -# include -# include -#endif // QT_NO_NIS - -#ifdef Success -# undef Success -#endif - -#include - -QT_BEGIN_NAMESPACE - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#ifndef QT_NO_PRINTER - -struct QPrinterDescription { - QPrinterDescription(const QString &n, const QString &h, const QString &c, const QStringList &a) - : name(n), host(h), comment(c), aliases(a) {} - QString name; - QString host; - QString comment; - QStringList aliases; - bool samePrinter(const QString& printer) const { - return name == printer || aliases.contains(printer); - } -}; - -enum { Success = 's', Unavail = 'u', NotFound = 'n', TryAgain = 't' }; -enum { Continue = 'c', Return = 'r' }; - -void qt_perhapsAddPrinter(QList *printers, const QString &name, - QString host, QString comment, - QStringList aliases = QStringList()); -void qt_parsePrinterDesc(QString printerDesc, QList *printers); - -int qt_parsePrintcap(QList *printers, const QString& fileName); -QString qt_getDefaultFromHomePrinters(); -void qt_parseEtcLpPrinters(QList *printers); -char *qt_parsePrintersConf(QList *printers, bool *found = 0); - -#ifndef QT_NO_NIS -#if defined(Q_C_CALLBACKS) -extern "C" { -#endif -int qt_pd_foreach(int /*status */, char * /*key */, int /*keyLen */, - char *val, int valLen, char *data); - -#if defined(Q_C_CALLBACKS) -} -#endif -int qt_retrieveNisPrinters(QList *printers); -#endif // QT_NO_NIS -char *qt_parseNsswitchPrintersEntry(QList *printers, char *line); -char *qt_parseNsswitchConf(QList *printers); -void qt_parseEtcLpMember(QList *printers); -void qt_parseSpoolInterface(QList *printers); -void qt_parseQconfig(QList *printers); -int qt_getLprPrinters(QList& printers); - -QList qt_getCupsPrinterPaperSizes(int cupsPrinterIndex); - -#endif // QT_NO_PRINTER - -QT_END_NAMESPACE - -#endif // QPRINTERINFO_UNIX_P_H diff --git a/src/gui/printsupport/printsupport.pri b/src/gui/printsupport/printsupport.pri new file mode 100644 index 0000000000..2faf36ff5b --- /dev/null +++ b/src/gui/printsupport/printsupport.pri @@ -0,0 +1,36 @@ +HEADERS += \ + $$PWD/qpaintengine_alpha_p.h \ + $$PWD/qpaintengine_preview_p.h \ + $$PWD/qprintengine.h \ + $$PWD/qprinter.h \ + $$PWD/qprinter_p.h \ + $$PWD/qprinterinfo.h \ + $$PWD/qprinterinfo_p.h + +SOURCES += \ + $$PWD/qpaintengine_alpha.cpp \ + $$PWD/qpaintengine_preview.cpp \ + $$PWD/qprintengine_pdf.cpp \ + $$PWD/qprinter.cpp \ + $$PWD/qprinterinfo.cpp \ + +unix:!symbian { + HEADERS += \ + $$PWD/qprinterinfo_unix_p.h + SOURCES += \ + $$PWD/qprinterinfo_unix.cpp +} + +qpa { + HEADERS += $$PWD/qplatformprintersupport_qpa.h + SOURCES += \ + $$PWD/qplatformprintersupport_qpa.cpp +} + + +x11|qpa:!win32 { + SOURCES += $$PWD/qcups.cpp + HEADERS += $$PWD/qcups_p.h +} else { + DEFINES += QT_NO_CUPS QT_NO_LPR +} diff --git a/src/gui/printsupport/qcups.cpp b/src/gui/printsupport/qcups.cpp new file mode 100644 index 0000000000..76050d9d71 --- /dev/null +++ b/src/gui/printsupport/qcups.cpp @@ -0,0 +1,446 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include "qcups_p.h" +#include "qprinterinfo_unix_p.h" + +#ifndef QT_NO_CUPS + +#ifndef QT_LINUXBASE // LSB merges everything into cups.h +# include +#endif +#include + +QT_BEGIN_NAMESPACE + +typedef int (*CupsGetDests)(cups_dest_t **dests); +typedef void (*CupsFreeDests)(int num_dests, cups_dest_t *dests); +typedef const char* (*CupsGetPPD)(const char *printer); +typedef int (*CupsMarkOptions)(ppd_file_t *ppd, int num_options, cups_option_t *options); +typedef ppd_file_t* (*PPDOpenFile)(const char *filename); +typedef void (*PPDMarkDefaults)(ppd_file_t *ppd); +typedef int (*PPDMarkOption)(ppd_file_t *ppd, const char *keyword, const char *option); +typedef void (*PPDClose)(ppd_file_t *ppd); +typedef int (*PPDMarkOption)(ppd_file_t *ppd, const char *keyword, const char *option); +typedef void (*CupsFreeOptions)(int num_options, cups_option_t *options); +typedef void (*CupsSetDests)(int num_dests, cups_dest_t *dests); +typedef cups_lang_t* (*CupsLangGet)(const char *language); +typedef const char* (*CupsLangEncoding)(cups_lang_t *language); +typedef int (*CupsAddOption)(const char *name, const char *value, int num_options, cups_option_t **options); +typedef int (*CupsTempFd)(char *name, int len); +typedef int (*CupsPrintFile)(const char * name, const char * filename, const char * title, int num_options, cups_option_t * options); + +static bool cupsLoaded = false; +static int qt_cups_num_printers = 0; +static CupsGetDests _cupsGetDests = 0; +static CupsFreeDests _cupsFreeDests = 0; +static CupsGetPPD _cupsGetPPD = 0; +static PPDOpenFile _ppdOpenFile = 0; +static PPDMarkDefaults _ppdMarkDefaults = 0; +static PPDClose _ppdClose = 0; +static CupsMarkOptions _cupsMarkOptions = 0; +static PPDMarkOption _ppdMarkOption = 0; +static CupsFreeOptions _cupsFreeOptions = 0; +static CupsSetDests _cupsSetDests = 0; +static CupsLangGet _cupsLangGet = 0; +static CupsLangEncoding _cupsLangEncoding = 0; +static CupsAddOption _cupsAddOption = 0; +static CupsTempFd _cupsTempFd = 0; +static CupsPrintFile _cupsPrintFile = 0; + +static void resolveCups() +{ + QLibrary cupsLib(QLatin1String("cups"), 2); + if(cupsLib.load()) { + _cupsGetDests = (CupsGetDests) cupsLib.resolve("cupsGetDests"); + _cupsFreeDests = (CupsFreeDests) cupsLib.resolve("cupsFreeDests"); + _cupsGetPPD = (CupsGetPPD) cupsLib.resolve("cupsGetPPD"); + _cupsLangGet = (CupsLangGet) cupsLib.resolve("cupsLangGet"); + _cupsLangEncoding = (CupsLangEncoding) cupsLib.resolve("cupsLangEncoding"); + _ppdOpenFile = (PPDOpenFile) cupsLib.resolve("ppdOpenFile"); + _ppdMarkDefaults = (PPDMarkDefaults) cupsLib.resolve("ppdMarkDefaults"); + _ppdClose = (PPDClose) cupsLib.resolve("ppdClose"); + _cupsMarkOptions = (CupsMarkOptions) cupsLib.resolve("cupsMarkOptions"); + _ppdMarkOption = (PPDMarkOption) cupsLib.resolve("ppdMarkOption"); + _cupsFreeOptions = (CupsFreeOptions) cupsLib.resolve("cupsFreeOptions"); + _cupsSetDests = (CupsSetDests) cupsLib.resolve("cupsSetDests"); + _cupsAddOption = (CupsAddOption) cupsLib.resolve("cupsAddOption"); + _cupsTempFd = (CupsTempFd) cupsLib.resolve("cupsTempFd"); + _cupsPrintFile = (CupsPrintFile) cupsLib.resolve("cupsPrintFile"); + + if (_cupsGetDests && _cupsFreeDests) { + cups_dest_t *printers; + int num_printers = _cupsGetDests(&printers); + if (num_printers) + _cupsFreeDests(num_printers, printers); + qt_cups_num_printers = num_printers; + } + } + cupsLoaded = true; +} + +// ================ CUPS Support class ======================== + +QCUPSSupport::QCUPSSupport() + : + prnCount(0), + printers(0), + page_sizes(0), + currPrinterIndex(0), + currPPD(0) +{ + if (!cupsLoaded) + resolveCups(); + + // getting all available printers + if (!isAvailable()) + return; + + prnCount = _cupsGetDests(&printers); + + for (int i = 0; i < prnCount; ++i) { + if (printers[i].is_default) { + currPrinterIndex = i; + setCurrentPrinter(i); + break; + } + } + +#ifndef QT_NO_TEXTCODEC + cups_lang_t *cupsLang = _cupsLangGet(0); + codec = QTextCodec::codecForName(_cupsLangEncoding(cupsLang)); + if (!codec) + codec = QTextCodec::codecForLocale(); +#endif +} + +QCUPSSupport::~QCUPSSupport() +{ + if (currPPD) + _ppdClose(currPPD); + if (prnCount) + _cupsFreeDests(prnCount, printers); +} + +int QCUPSSupport::availablePrintersCount() const +{ + return prnCount; +} + +const cups_dest_t* QCUPSSupport::availablePrinters() const +{ + return printers; +} + +const ppd_file_t* QCUPSSupport::currentPPD() const +{ + return currPPD; +} + +const ppd_file_t* QCUPSSupport::setCurrentPrinter(int index) +{ + Q_ASSERT(index >= 0 && index <= prnCount); + if (index == prnCount) + return 0; + + currPrinterIndex = index; + + if (currPPD) + _ppdClose(currPPD); + currPPD = 0; + page_sizes = 0; + + const char *ppdFile = _cupsGetPPD(printers[index].name); + + if (!ppdFile) + return 0; + + currPPD = _ppdOpenFile(ppdFile); + unlink(ppdFile); + + // marking default options + _ppdMarkDefaults(currPPD); + + // marking options explicitly set + _cupsMarkOptions(currPPD, printers[currPrinterIndex].num_options, printers[currPrinterIndex].options); + + // getting pointer to page sizes + page_sizes = ppdOption("PageSize"); + + return currPPD; +} + +int QCUPSSupport::currentPrinterIndex() const +{ + return currPrinterIndex; +} + +bool QCUPSSupport::isAvailable() +{ + if(!cupsLoaded) + resolveCups(); + + return _cupsGetDests && + _cupsFreeDests && + _cupsGetPPD && + _ppdOpenFile && + _ppdMarkDefaults && + _ppdClose && + _cupsMarkOptions && + _ppdMarkOption && + _cupsFreeOptions && + _cupsSetDests && + _cupsLangGet && + _cupsLangEncoding && + _cupsAddOption && + (qt_cups_num_printers > 0); +} + +const ppd_option_t* QCUPSSupport::ppdOption(const char *key) const +{ + if (currPPD) { + for (int gr = 0; gr < currPPD->num_groups; ++gr) { + for (int opt = 0; opt < currPPD->groups[gr].num_options; ++opt) { + if (qstrcmp(currPPD->groups[gr].options[opt].keyword, key) == 0) + return &currPPD->groups[gr].options[opt]; + } + } + } + return 0; +} + +const cups_option_t* QCUPSSupport::printerOption(const QString &key) const +{ + for (int i = 0; i < printers[currPrinterIndex].num_options; ++i) { + if (QLatin1String(printers[currPrinterIndex].options[i].name) == key) + return &printers[currPrinterIndex].options[i]; + } + return 0; +} + +const ppd_option_t* QCUPSSupport::pageSizes() const +{ + return page_sizes; +} + +int QCUPSSupport::markOption(const char* name, const char* value) +{ + return _ppdMarkOption(currPPD, name, value); +} + +void QCUPSSupport::saveOptions(QList options, QList markedOptions) +{ + int oldOptionCount = printers[currPrinterIndex].num_options; + cups_option_t* oldOptions = printers[currPrinterIndex].options; + + int newOptionCount = 0; + cups_option_t* newOptions = 0; + + // copying old options that are not on the new list + for (int i = 0; i < oldOptionCount; ++i) { + bool contains = false; + for (int j = 0; j < options.count(); ++j) { + if (qstrcmp(options.at(j)->keyword, oldOptions[i].name) == 0) { + contains = true; + break; + } + } + + if (!contains) { + newOptionCount = _cupsAddOption(oldOptions[i].name, oldOptions[i].value, newOptionCount, &newOptions); + } + } + + // we can release old option list + _cupsFreeOptions(oldOptionCount, oldOptions); + + // adding marked options + for (int i = 0; i < markedOptions.count(); ++i) { + const char* name = markedOptions.at(i); + ++i; + newOptionCount = _cupsAddOption(name, markedOptions.at(i), newOptionCount, &newOptions); + } + + // placing the new option list + printers[currPrinterIndex].num_options = newOptionCount; + printers[currPrinterIndex].options = newOptions; + + // saving new default values + _cupsSetDests(prnCount, printers); +} + +QRect QCUPSSupport::paperRect(const char *choice) const +{ + if (!currPPD) + return QRect(); + for (int i = 0; i < currPPD->num_sizes; ++i) { + if (qstrcmp(currPPD->sizes[i].name, choice) == 0) + return QRect(0, 0, qRound(currPPD->sizes[i].width), qRound(currPPD->sizes[i].length)); + } + return QRect(); +} + +QRect QCUPSSupport::pageRect(const char *choice) const +{ + if (!currPPD) + return QRect(); + for (int i = 0; i < currPPD->num_sizes; ++i) { + if (qstrcmp(currPPD->sizes[i].name, choice) == 0) + return QRect(qRound(currPPD->sizes[i].left), + qRound(currPPD->sizes[i].length - currPPD->sizes[i].top), + qRound(currPPD->sizes[i].right - currPPD->sizes[i].left), + qRound(currPPD->sizes[i].top - currPPD->sizes[i].bottom)); + } + return QRect(); +} + +QStringList QCUPSSupport::options() const +{ + QStringList list; + collectMarkedOptions(list); + return list; +} + +bool QCUPSSupport::printerHasPPD(const char *printerName) +{ + if (!isAvailable()) + return false; + const char *ppdFile = _cupsGetPPD(printerName); + if (ppdFile) + unlink(ppdFile); + return (ppdFile != 0); +} + +QString QCUPSSupport::unicodeString(const char *s) +{ +#ifndef QT_NO_TEXTCODEC + return codec->toUnicode(s); +#else + return QLatin1String(s); +#endif +} + +void QCUPSSupport::collectMarkedOptions(QStringList& list, const ppd_group_t* group) const +{ + if (group == 0) { + if (!currPPD) + return; + for (int i = 0; i < currPPD->num_groups; ++i) { + collectMarkedOptions(list, &currPPD->groups[i]); + collectMarkedOptionsHelper(list, &currPPD->groups[i]); + } + } else { + for (int i = 0; i < group->num_subgroups; ++i) + collectMarkedOptionsHelper(list, &group->subgroups[i]); + } +} + +void QCUPSSupport::collectMarkedOptionsHelper(QStringList& list, const ppd_group_t* group) const +{ + for (int i = 0; i < group->num_options; ++i) { + for (int j = 0; j < group->options[i].num_choices; ++j) { + if (group->options[i].choices[j].marked == 1 && qstrcmp(group->options[i].choices[j].choice, group->options[i].defchoice) != 0) + list << QString::fromLocal8Bit(group->options[i].keyword) << QString::fromLocal8Bit(group->options[i].choices[j].choice); + } + } +} + +QPair QCUPSSupport::tempFd() +{ + char filename[512]; + int fd = _cupsTempFd(filename, 512); + return QPair(fd, QString::fromLocal8Bit(filename)); +} + +// Prints the given file and returns a job id. +int QCUPSSupport::printFile(const char * printerName, const char * filename, const char * title, + int num_options, cups_option_t * options) +{ + return _cupsPrintFile(printerName, filename, title, num_options, options); +} + +QCUPSSupport::Printer::Printer(const QString &n) : name(n), isDefault(false), cupsPrinterIndex(-1) +{ +} + +QList QCUPSSupport::availableUnixPrinters() +{ + QList printers; + +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + if (QCUPSSupport::isAvailable()) { + QCUPSSupport cups; + int cupsPrinterCount = cups.availablePrintersCount(); + const cups_dest_t* cupsPrinters = cups.availablePrinters(); + for (int i = 0; i < cupsPrinterCount; ++i) { + QString printerName(QString::fromLocal8Bit(cupsPrinters[i].name)); + if (cupsPrinters[i].instance) + printerName += QLatin1Char('/') + QString::fromLocal8Bit(cupsPrinters[i].instance); + + Printer p(printerName); + if (cupsPrinters[i].is_default) + p.isDefault = true; + p.cupsPrinterIndex = i; + printers.append(p); + } + } else +#endif + { + QList lprPrinters; + int defprn = qt_getLprPrinters(lprPrinters); + // populating printer combo + foreach (const QPrinterDescription &description, lprPrinters) + printers.append(Printer(description.name)); + if (defprn >= 0 && defprn < printers.size()) + printers[defprn].isDefault = true; + } + + return printers; +} + +QList QCUPSSupport::getCupsPrinterPaperSizes(int cupsPrinterIndex) +{ + return qt_getCupsPrinterPaperSizes(cupsPrinterIndex); +} + +QT_END_NAMESPACE + +#endif // QT_NO_CUPS diff --git a/src/gui/printsupport/qcups_p.h b/src/gui/printsupport/qcups_p.h new file mode 100644 index 0000000000..6b6a55a440 --- /dev/null +++ b/src/gui/printsupport/qcups_p.h @@ -0,0 +1,133 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCUPS_P_H +#define QCUPS_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// +#include "QtCore/qstring.h" +#include "QtCore/qstringlist.h" +#include "QtCore/qpair.h" +#include "QtGui/qprinter.h" + +#ifndef QT_NO_CUPS +#include +#include +#include + +QT_BEGIN_NAMESPACE + +Q_DECLARE_TYPEINFO(cups_option_t, Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE); + +class Q_GUI_EXPORT QCUPSSupport +{ +public: + struct Printer + { + Printer(const QString &name = QString()); + + QString name; + bool isDefault; + int cupsPrinterIndex; + }; + QCUPSSupport(); + ~QCUPSSupport(); + + static bool isAvailable(); + static int cupsVersion() { return isAvailable() ? CUPS_VERSION_MAJOR*10000+CUPS_VERSION_MINOR*100+CUPS_VERSION_PATCH : 0; } + int availablePrintersCount() const; + const cups_dest_t* availablePrinters() const; + int currentPrinterIndex() const; + const ppd_file_t* setCurrentPrinter(int index); + + const ppd_file_t* currentPPD() const; + const ppd_option_t* ppdOption(const char *key) const; + + const cups_option_t* printerOption(const QString &key) const; + const ppd_option_t* pageSizes() const; + + int markOption(const char* name, const char* value); + void saveOptions(QList options, QList markedOptions); + + QRect paperRect(const char *choice) const; + QRect pageRect(const char *choice) const; + + QStringList options() const; + + static bool printerHasPPD(const char *printerName); + + QString unicodeString(const char *s); + + QPair tempFd(); + int printFile(const char * printerName, const char * filename, const char * title, + int num_options, cups_option_t * options); + + static QList availableUnixPrinters(); + static QList getCupsPrinterPaperSizes(int cupsPrinterIndex); + +private: + void collectMarkedOptions(QStringList& list, const ppd_group_t* group = 0) const; + void collectMarkedOptionsHelper(QStringList& list, const ppd_group_t* group) const; + + int prnCount; + cups_dest_t *printers; + const ppd_option_t* page_sizes; + int currPrinterIndex; + ppd_file_t *currPPD; +#ifndef QT_NO_TEXTCODEC + QTextCodec *codec; +#endif +}; + +QT_END_NAMESPACE + +#endif // QT_NO_CUPS + +#endif diff --git a/src/gui/printsupport/qpaintengine_alpha.cpp b/src/gui/printsupport/qpaintengine_alpha.cpp new file mode 100644 index 0000000000..beda2c7144 --- /dev/null +++ b/src/gui/printsupport/qpaintengine_alpha.cpp @@ -0,0 +1,516 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +#ifndef QT_NO_PRINTER +#include +#include "private/qpaintengine_alpha_p.h" + +#include "private/qpicture_p.h" +#include "private/qfont_p.h" +#include "QtGui/qpicture.h" + +QT_BEGIN_NAMESPACE + +QAlphaPaintEngine::QAlphaPaintEngine(QAlphaPaintEnginePrivate &data, PaintEngineFeatures devcaps) + : QPaintEngine(data, devcaps) +{ + +} + +QAlphaPaintEngine::~QAlphaPaintEngine() +{ + +} + +bool QAlphaPaintEngine::begin(QPaintDevice *pdev) +{ + Q_D(QAlphaPaintEngine); + + d->m_continueCall = true; + if (d->m_pass != 0) { + return true; + } + + d->m_savedcaps = gccaps; + d->m_pdev = pdev; + + d->m_alphaPen = false; + d->m_alphaBrush = false; + d->m_alphaOpacity = false; + d->m_hasalpha = false; + d->m_advancedPen = false; + d->m_advancedBrush = false; + d->m_complexTransform = false; + d->m_emulateProjectiveTransforms = false; + + // clear alpha region + d->m_alphargn = QRegion(); + d->m_cliprgn = QRegion(); + d->m_pen = QPen(); + d->m_transform = QTransform(); + + flushAndInit(); + + return true; +} + +bool QAlphaPaintEngine::end() +{ + Q_D(QAlphaPaintEngine); + + d->m_continueCall = true; + if (d->m_pass != 0) { + return true; + } + + flushAndInit(false); + return true; +} + +void QAlphaPaintEngine::updateState(const QPaintEngineState &state) +{ + Q_D(QAlphaPaintEngine); + + DirtyFlags flags = state.state(); + if (flags & QPaintEngine::DirtyTransform) { + d->m_transform = state.transform(); + d->m_complexTransform = (d->m_transform.type() > QTransform::TxScale); + d->m_emulateProjectiveTransforms = !(d->m_savedcaps & QPaintEngine::PerspectiveTransform) + && !(d->m_savedcaps & QPaintEngine::AlphaBlend) + && (d->m_transform.type() >= QTransform::TxProject); + } + if (flags & QPaintEngine::DirtyPen) { + d->m_pen = state.pen(); + if (d->m_pen.style() == Qt::NoPen) { + d->m_advancedPen = false; + d->m_alphaPen = false; + } else { + d->m_advancedPen = (d->m_pen.brush().style() != Qt::SolidPattern); + d->m_alphaPen = !d->m_pen.brush().isOpaque(); + } + } + + if (d->m_pass != 0) { + d->m_continueCall = true; + return; + } + d->m_continueCall = false; + + if (flags & QPaintEngine::DirtyOpacity) { + d->m_alphaOpacity = (state.opacity() != 1.0f); + } + + if (flags & QPaintEngine::DirtyBrush) { + if (state.brush().style() == Qt::NoBrush) { + d->m_advancedBrush = false; + d->m_alphaBrush = false; + } else { + d->m_advancedBrush = (state.brush().style() != Qt::SolidPattern); + d->m_alphaBrush = !state.brush().isOpaque(); + } + } + + + d->m_hasalpha = d->m_alphaOpacity || d->m_alphaBrush || d->m_alphaPen; + + if (d->m_picengine) + d->m_picengine->updateState(state); +} + +void QAlphaPaintEngine::drawPath(const QPainterPath &path) +{ + Q_D(QAlphaPaintEngine); + + QRectF tr = d->addPenWidth(path); + + if (d->m_pass == 0) { + d->m_continueCall = false; + if (d->m_hasalpha || d->m_advancedPen || d->m_advancedBrush + || d->m_emulateProjectiveTransforms) + { + d->addAlphaRect(tr); + } + if (d->m_picengine) + d->m_picengine->drawPath(path); + } else { + d->m_continueCall = !d->fullyContained(tr); + } +} + +void QAlphaPaintEngine::drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) +{ + Q_D(QAlphaPaintEngine); + + QPolygonF poly; + for (int i=0; iaddPenWidth(path); + + if (d->m_pass == 0) { + d->m_continueCall = false; + if (d->m_hasalpha || d->m_advancedPen || d->m_advancedBrush + || d->m_emulateProjectiveTransforms) + { + d->addAlphaRect(tr); + } + + if (d->m_picengine) + d->m_picengine->drawPolygon(points, pointCount, mode); + } else { + d->m_continueCall = !d->fullyContained(tr); + } +} + +void QAlphaPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) +{ + Q_D(QAlphaPaintEngine); + + QRectF tr = d->m_transform.mapRect(r); + if (d->m_pass == 0) { + d->m_continueCall = false; + if (pm.hasAlpha() || d->m_alphaOpacity || d->m_complexTransform || pm.isQBitmap()) { + d->addAlphaRect(tr); + } + + if (d->m_picengine) + d->m_picengine->drawPixmap(r, pm, sr); + + } else { + d->m_continueCall = !d->fullyContained(tr); + } +} + +void QAlphaPaintEngine::drawImage(const QRectF &r, const QImage &image, const QRectF &sr) +{ + Q_D(QAlphaPaintEngine); + + QRectF tr = d->m_transform.mapRect(r); + if (d->m_pass == 0) { + d->m_continueCall = false; + if (image.hasAlphaChannel() || d->m_alphaOpacity || d->m_complexTransform) { + d->addAlphaRect(tr); + } + + if (d->m_picengine) + d->m_picengine->drawImage(r, image, sr); + + } else { + d->m_continueCall = !d->fullyContained(tr); + } +} + +void QAlphaPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem) +{ + Q_D(QAlphaPaintEngine); + + QRectF tr(p.x(), p.y() - textItem.ascent(), textItem.width() + 5, textItem.ascent() + textItem.descent() + 5); + tr = d->m_transform.mapRect(tr); + + if (d->m_pass == 0) { + d->m_continueCall = false; + if (d->m_alphaPen || d->m_alphaOpacity || d->m_advancedPen) { + d->addAlphaRect(tr); + } + if (d->m_picengine) { + d->m_picengine->drawTextItem(p, textItem); + } + } else { + d->m_continueCall = !d->fullyContained(tr); + } +} + +void QAlphaPaintEngine::drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s) +{ + Q_D(QAlphaPaintEngine); + + QRectF brect = d->m_transform.mapRect(r); + + if (d->m_pass == 0) { + d->m_continueCall = false; + if (pixmap.hasAlpha() || d->m_alphaOpacity || d->m_complexTransform || pixmap.isQBitmap()) { + d->addAlphaRect(brect); + } + if (d->m_picengine) + d->m_picengine->drawTiledPixmap(r, pixmap, s); + } else { + d->m_continueCall = !d->fullyContained(brect); + } +} + +QRegion QAlphaPaintEngine::alphaClipping() const +{ + Q_D(const QAlphaPaintEngine); + return d->m_cliprgn; +} + +bool QAlphaPaintEngine::continueCall() const +{ + Q_D(const QAlphaPaintEngine); + return d->m_continueCall; +} + +void QAlphaPaintEngine::flushAndInit(bool init) +{ + Q_D(QAlphaPaintEngine); + Q_ASSERT(d->m_pass == 0); + + if (d->m_pic) { + d->m_picpainter->end(); + + // set clip region + d->m_alphargn = d->m_alphargn.intersected(QRect(0, 0, d->m_pdev->width(), d->m_pdev->height())); + + // just use the bounding rect if it's a complex region.. + QVector rects = d->m_alphargn.rects(); + if (rects.size() > 10) { + QRect br = d->m_alphargn.boundingRect(); + d->m_alphargn = QRegion(br); + rects.clear(); + rects.append(br); + } + + d->m_cliprgn = d->m_alphargn; + + // now replay the QPicture + ++d->m_pass; // we are now doing pass #2 + + // reset states + gccaps = d->m_savedcaps; + + painter()->save(); + d->resetState(painter()); + + // make sure the output from QPicture is unscaled + QTransform mtx; + mtx.scale(1.0f / (qreal(d->m_pdev->logicalDpiX()) / qreal(qt_defaultDpiX())), + 1.0f / (qreal(d->m_pdev->logicalDpiY()) / qreal(qt_defaultDpiY()))); + painter()->setTransform(mtx); + painter()->drawPicture(0, 0, *d->m_pic); + + d->m_cliprgn = QRegion(); + d->resetState(painter()); + + // fill in the alpha images + for (int i=0; idrawAlphaImage(rects.at(i)); + + d->m_alphargn = QRegion(); + + painter()->restore(); + + --d->m_pass; // pass #2 finished + + cleanUp(); + } + + if (init) { + gccaps = PaintEngineFeatures(AllFeatures & ~QPaintEngine::ObjectBoundingModeGradients); + + d->m_pic = new QPicture(); + d->m_pic->d_ptr->in_memory_only = true; + d->m_picpainter = new QPainter(d->m_pic); + d->m_picengine = d->m_picpainter->paintEngine(); + + // When newPage() is called and the m_picpainter is recreated + // we have to copy the current state of the original printer + // painter back to the m_picpainter + d->m_picpainter->setPen(painter()->pen()); + d->m_picpainter->setBrush(painter()->brush()); + d->m_picpainter->setBrushOrigin(painter()->brushOrigin()); + d->m_picpainter->setFont(painter()->font()); + d->m_picpainter->setOpacity(painter()->opacity()); + d->m_picpainter->setTransform(painter()->combinedTransform()); + d->m_picengine->syncState(); + } +} + +void QAlphaPaintEngine::cleanUp() +{ + Q_D(QAlphaPaintEngine); + + delete d->m_picpainter; + delete d->m_pic; + + d->m_picpainter = 0; + d->m_pic = 0; + d->m_picengine = 0; +} + +QAlphaPaintEnginePrivate::QAlphaPaintEnginePrivate() + : m_pass(0), + m_pic(0), + m_picengine(0), + m_picpainter(0), + m_hasalpha(false), + m_alphaPen(false), + m_alphaBrush(false), + m_alphaOpacity(false), + m_advancedPen(false), + m_advancedBrush(false), + m_complexTransform(false) +{ + +} + +QAlphaPaintEnginePrivate::~QAlphaPaintEnginePrivate() +{ + delete m_picpainter; + delete m_pic; +} + +QRectF QAlphaPaintEnginePrivate::addPenWidth(const QPainterPath &path) +{ + QPainterPath tmp = path; + + if (m_pen.style() == Qt::NoPen) + return (path.controlPointRect() * m_transform).boundingRect(); + if (m_pen.isCosmetic()) + tmp = path * m_transform; + + QPainterPathStroker stroker; + if (m_pen.widthF() == 0.0f) + stroker.setWidth(1.0); + else + stroker.setWidth(m_pen.widthF()); + stroker.setJoinStyle(m_pen.joinStyle()); + stroker.setCapStyle(m_pen.capStyle()); + tmp = stroker.createStroke(tmp); + if (m_pen.isCosmetic()) + return tmp.controlPointRect(); + + return (tmp.controlPointRect() * m_transform).boundingRect(); +} + +QRect QAlphaPaintEnginePrivate::toRect(const QRectF &rect) const +{ + QRect r; + r.setLeft(int(rect.left())); + r.setTop(int(rect.top())); + r.setRight(int(rect.right() + 1)); + r.setBottom(int(rect.bottom() + 1)); + return r; +} + +void QAlphaPaintEnginePrivate::addAlphaRect(const QRectF &rect) +{ + m_alphargn |= toRect(rect); +} + +void QAlphaPaintEnginePrivate::drawAlphaImage(const QRectF &rect) +{ + Q_Q(QAlphaPaintEngine); + + qreal dpiX = qMax(m_pdev->logicalDpiX(), 300); + qreal dpiY = qMax(m_pdev->logicalDpiY(), 300); + qreal xscale = (dpiX / m_pdev->logicalDpiX()); + qreal yscale = (dpiY / m_pdev->logicalDpiY()); + + QTransform picscale; + picscale.scale(xscale, yscale); + + const int tileSize = 2048; + QSize size((int(rect.width() * xscale)), int(rect.height() * yscale)); + int divw = (size.width() / tileSize); + int divh = (size.height() / tileSize); + divw += 1; + divh += 1; + + int incx = int(rect.width() / divw); + int incy = int(rect.height() / divh); + + for (int y=0; ypainter()->setTransform(QTransform()); + QRect r(xpos, ypos, width, height); + q->painter()->drawImage(r, img); + } + } +} + +bool QAlphaPaintEnginePrivate::fullyContained(const QRectF &rect) const +{ + QRegion r(toRect(rect)); + return (m_cliprgn.intersected(r) == r); +} + +void QAlphaPaintEnginePrivate::resetState(QPainter *p) +{ + p->setPen(QPen()); + p->setBrush(QBrush()); + p->setBrushOrigin(0,0); + p->setBackground(QBrush()); + p->setFont(QFont()); + p->setTransform(QTransform()); + // The view transform is already recorded and included in the + // picture we're about to replay. If we don't turn if off, + // the view matrix will be applied twice. + p->setViewTransformEnabled(false); + p->setClipRegion(QRegion(), Qt::NoClip); + p->setClipPath(QPainterPath(), Qt::NoClip); + p->setClipping(false); + p->setOpacity(1.0f); +} + + +QT_END_NAMESPACE + +#endif // QT_NO_PRINTER diff --git a/src/gui/printsupport/qpaintengine_alpha_p.h b/src/gui/printsupport/qpaintengine_alpha_p.h new file mode 100644 index 0000000000..5694e2a5bc --- /dev/null +++ b/src/gui/printsupport/qpaintengine_alpha_p.h @@ -0,0 +1,135 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPAINTENGINE_ALPHA_P_H +#define QPAINTENGINE_ALPHA_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of other Qt classes. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#ifndef QT_NO_PRINTER +#include "private/qpaintengine_p.h" + +QT_BEGIN_NAMESPACE + +class QAlphaPaintEnginePrivate; + +class QAlphaPaintEngine : public QPaintEngine +{ + Q_DECLARE_PRIVATE(QAlphaPaintEngine) +public: + ~QAlphaPaintEngine(); + + virtual bool begin(QPaintDevice *pdev); + virtual bool end(); + + virtual void updateState(const QPaintEngineState &state); + + virtual void drawPath(const QPainterPath &path); + + virtual void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode); + + virtual void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr); + virtual void drawImage(const QRectF &r, const QImage &image, const QRectF &sr); + virtual void drawTextItem(const QPointF &p, const QTextItem &textItem); + virtual void drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s); + +protected: + QAlphaPaintEngine(QAlphaPaintEnginePrivate &data, PaintEngineFeatures devcaps = 0); + QRegion alphaClipping() const; + bool continueCall() const; + void flushAndInit(bool init = true); + void cleanUp(); +}; + +class QAlphaPaintEnginePrivate : public QPaintEnginePrivate +{ + Q_DECLARE_PUBLIC(QAlphaPaintEngine) +public: + QAlphaPaintEnginePrivate(); + ~QAlphaPaintEnginePrivate(); + + int m_pass; + QPicture *m_pic; + QPaintEngine *m_picengine; + QPainter *m_picpainter; + + QPaintEngine::PaintEngineFeatures m_savedcaps; + QPaintDevice *m_pdev; + + QRegion m_alphargn; + QRegion m_cliprgn; + + bool m_hasalpha; + bool m_alphaPen; + bool m_alphaBrush; + bool m_alphaOpacity; + bool m_advancedPen; + bool m_advancedBrush; + bool m_complexTransform; + bool m_emulateProjectiveTransforms; + bool m_continueCall; + + QTransform m_transform; + QPen m_pen; + + void addAlphaRect(const QRectF &rect); + QRectF addPenWidth(const QPainterPath &path); + void drawAlphaImage(const QRectF &rect); + QRect toRect(const QRectF &rect) const; + bool fullyContained(const QRectF &rect) const; + + void resetState(QPainter *p); +}; + +QT_END_NAMESPACE + +#endif // QT_NO_PRINTER + +#endif // QPAINTENGINE_ALPHA_P_H diff --git a/src/gui/printsupport/qpaintengine_preview.cpp b/src/gui/printsupport/qpaintengine_preview.cpp new file mode 100644 index 0000000000..d3b7756516 --- /dev/null +++ b/src/gui/printsupport/qpaintengine_preview.cpp @@ -0,0 +1,223 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include + +#include +#include +#include + +#ifndef QT_NO_PRINTPREVIEWWIDGET +QT_BEGIN_NAMESPACE + +class QPreviewPaintEnginePrivate : public QPaintEnginePrivate +{ + Q_DECLARE_PUBLIC(QPreviewPaintEngine) +public: + QPreviewPaintEnginePrivate() : state(QPrinter::Idle) {} + ~QPreviewPaintEnginePrivate() {} + + QList pages; + QPaintEngine *engine; + QPainter *painter; + QPrinter::PrinterState state; + + QPaintEngine *proxy_paint_engine; + QPrintEngine *proxy_print_engine; +}; + + +QPreviewPaintEngine::QPreviewPaintEngine() + : QPaintEngine(*(new QPreviewPaintEnginePrivate), PaintEngineFeatures(AllFeatures & ~ObjectBoundingModeGradients)) +{ + Q_D(QPreviewPaintEngine); + d->proxy_print_engine = 0; + d->proxy_paint_engine = 0; +} + +QPreviewPaintEngine::~QPreviewPaintEngine() +{ + Q_D(QPreviewPaintEngine); + + qDeleteAll(d->pages); +} + +bool QPreviewPaintEngine::begin(QPaintDevice *) +{ + Q_D(QPreviewPaintEngine); + + qDeleteAll(d->pages); + d->pages.clear(); + + QPicture *page = new QPicture; + page->d_func()->in_memory_only = true; + d->painter = new QPainter(page); + d->engine = d->painter->paintEngine(); + d->pages.append(page); + d->state = QPrinter::Active; + return true; +} + +bool QPreviewPaintEngine::end() +{ + Q_D(QPreviewPaintEngine); + + delete d->painter; + d->painter = 0; + d->engine = 0; + d->state = QPrinter::Idle; + return true; +} + +void QPreviewPaintEngine::updateState(const QPaintEngineState &state) +{ + Q_D(QPreviewPaintEngine); + d->engine->updateState(state); +} + +void QPreviewPaintEngine::drawPath(const QPainterPath &path) +{ + Q_D(QPreviewPaintEngine); + d->engine->drawPath(path); +} + +void QPreviewPaintEngine::drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) +{ + Q_D(QPreviewPaintEngine); + d->engine->drawPolygon(points, pointCount, mode); +} + +void QPreviewPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem) +{ + Q_D(QPreviewPaintEngine); + d->engine->drawTextItem(p, textItem); +} + +void QPreviewPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) +{ + Q_D(QPreviewPaintEngine); + d->engine->drawPixmap(r, pm, sr); +} + +void QPreviewPaintEngine::drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &p) +{ + Q_D(QPreviewPaintEngine); + d->engine->drawTiledPixmap(r, pm, p); +} + +bool QPreviewPaintEngine::newPage() +{ + Q_D(QPreviewPaintEngine); + + QPicture *page = new QPicture; + page->d_func()->in_memory_only = true; + QPainter *tmp_painter = new QPainter(page); + QPaintEngine *tmp_engine = tmp_painter->paintEngine(); + + // copy the painter state from the original painter + Q_ASSERT(painter()->d_func()->state && tmp_painter->d_func()->state); + *tmp_painter->d_func()->state = *painter()->d_func()->state; + + // composition modes aren't supported on a QPrinter and yields a + // warning, so ignore it for now + tmp_engine->setDirty(DirtyFlags(AllDirty & ~DirtyCompositionMode)); + tmp_engine->syncState(); + + delete d->painter; + d->painter = tmp_painter; + d->pages.append(page); + d->engine = tmp_engine; + return true; +} + +bool QPreviewPaintEngine::abort() +{ + Q_D(QPreviewPaintEngine); + end(); + qDeleteAll(d->pages); + d->state = QPrinter::Aborted; + + return true; +} + +QList QPreviewPaintEngine::pages() +{ + Q_D(QPreviewPaintEngine); + return d->pages; +} + +void QPreviewPaintEngine::setProxyEngines(QPrintEngine *printEngine, QPaintEngine *paintEngine) +{ + Q_D(QPreviewPaintEngine); + d->proxy_print_engine = printEngine; + d->proxy_paint_engine = paintEngine; +} + +void QPreviewPaintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &value) +{ + Q_D(QPreviewPaintEngine); + d->proxy_print_engine->setProperty(key, value); +} + +QVariant QPreviewPaintEngine::property(PrintEnginePropertyKey key) const +{ + Q_D(const QPreviewPaintEngine); + return d->proxy_print_engine->property(key); +} + +int QPreviewPaintEngine::metric(QPaintDevice::PaintDeviceMetric id) const +{ + Q_D(const QPreviewPaintEngine); + return d->proxy_print_engine->metric(id); +} + +QPrinter::PrinterState QPreviewPaintEngine::printerState() const +{ + Q_D(const QPreviewPaintEngine); + return d->state; +} + +QT_END_NAMESPACE + +#endif diff --git a/src/gui/printsupport/qpaintengine_preview_p.h b/src/gui/printsupport/qpaintengine_preview_p.h new file mode 100644 index 0000000000..902a03bd8f --- /dev/null +++ b/src/gui/printsupport/qpaintengine_preview_p.h @@ -0,0 +1,106 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPREVIEWPAINTENGINE_P_H +#define QPREVIEWPAINTENGINE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of QPreviewPrinter and friends. This header file may change from +// version to version without notice, or even be removed. +// +// We mean it. +// +// + +#include +#include + +#ifndef QT_NO_PRINTPREVIEWWIDGET + +QT_BEGIN_NAMESPACE + +class QPreviewPaintEnginePrivate; + +class QPreviewPaintEngine : public QPaintEngine, public QPrintEngine +{ + Q_DECLARE_PRIVATE(QPreviewPaintEngine) +public: + QPreviewPaintEngine(); + ~QPreviewPaintEngine(); + + bool begin(QPaintDevice *dev); + bool end(); + + void updateState(const QPaintEngineState &state); + + void drawPath(const QPainterPath &path); + void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode); + void drawTextItem(const QPointF &p, const QTextItem &textItem); + + void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr); + void drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &p); + + QList pages(); + + QPaintEngine::Type type() const { return Picture; } + + void setProxyEngines(QPrintEngine *printEngine, QPaintEngine *paintEngine); + + void setProperty(PrintEnginePropertyKey key, const QVariant &value); + QVariant property(PrintEnginePropertyKey key) const; + + bool newPage(); + bool abort(); + + int metric(QPaintDevice::PaintDeviceMetric) const; + + QPrinter::PrinterState printerState() const; +}; + +QT_END_NAMESPACE + +#endif // QT_NO_PRINTPREVIEWWIDGET + +#endif diff --git a/src/gui/printsupport/qplatformprintersupport_qpa.cpp b/src/gui/printsupport/qplatformprintersupport_qpa.cpp new file mode 100644 index 0000000000..9fb25c953f --- /dev/null +++ b/src/gui/printsupport/qplatformprintersupport_qpa.cpp @@ -0,0 +1,133 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qplatformprintersupport_qpa.h" + +#include + +#include + +#ifndef QT_NO_PRINTER + +QT_BEGIN_NAMESPACE + +QPlatformPrinterSupport::QPlatformPrinterSupport() +{ +} + +QPlatformPrinterSupport::~QPlatformPrinterSupport() +{ +} + +QPrintEngine *QPlatformPrinterSupport::createNativePrintEngine(QPrinter::PrinterMode) +{ + return 0; +} + +QPaintEngine *QPlatformPrinterSupport::createPaintEngine(QPrintEngine *, QPrinter::PrinterMode) +{ + return 0; +} + +QList QPlatformPrinterSupport::supportedPaperSizes(const QPrinterInfo &) const +{ + return QList(); +} + +QList QPlatformPrinterSupport::availablePrinters() +{ + return QList(); +} + +QPrinterInfo QPlatformPrinterSupport::defaultPrinter() +{ + const QList printers = availablePrinters(); + foreach (const QPrinterInfo &printerInfo, printers) { + if (printerInfo.isDefault()) + return printerInfo; + } + return printers.isEmpty() ? QPrinterInfo() : printers.front(); +} + +QPrinterInfo QPlatformPrinterSupport::printerInfo(const QString &printerName, bool isDefault) +{ + QPrinterInfo pi = QPrinterInfo(printerName); + pi.d_func()->isDefault = isDefault; + return pi; +} + +void QPlatformPrinterSupport::setPrinterInfoDefault(QPrinterInfo *p, bool isDefault) +{ + p->d_func()->isDefault = isDefault; +} + +bool QPlatformPrinterSupport::printerInfoIsDefault(const QPrinterInfo &p) +{ + return p.d_func()->isDefault; +} + +int QPlatformPrinterSupport::printerInfoCupsPrinterIndex(const QPrinterInfo &p) +{ + int i = -1; +#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_SYMBIAN)) || defined(Q_WS_QPA) +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + if (!p.isNull()) + return i = p.d_func()->cupsPrinterIndex; +#endif +#endif + Q_UNUSED(p) + return i; +} + +void QPlatformPrinterSupport::setPrinterInfoCupsPrinterIndex(QPrinterInfo *p, int index) +{ +#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_SYMBIAN)) || defined(Q_WS_QPA) +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + p->d_func()->cupsPrinterIndex = index; +#endif +#endif + Q_UNUSED(p) + Q_UNUSED(index) +} + +QT_END_NAMESPACE + +#endif // QT_NO_PRINTER diff --git a/src/gui/printsupport/qplatformprintersupport_qpa.h b/src/gui/printsupport/qplatformprintersupport_qpa.h new file mode 100644 index 0000000000..90dd260925 --- /dev/null +++ b/src/gui/printsupport/qplatformprintersupport_qpa.h @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPLATFORMPRINTINGSUPPORT_H +#define QPLATFORMPRINTINGSUPPORT_H + +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Gui) + +#ifndef QT_NO_PRINTER + +class QPrintEngine; + +class Q_GUI_EXPORT QPlatformPrinterSupport +{ +public: + QPlatformPrinterSupport(); + virtual ~QPlatformPrinterSupport(); + + virtual QPrintEngine *createNativePrintEngine(QPrinter::PrinterMode printerMode); + virtual QPaintEngine *createPaintEngine(QPrintEngine *, QPrinter::PrinterMode printerMode); + virtual QList supportedPaperSizes(const QPrinterInfo &) const; + + virtual QList availablePrinters(); + virtual QPrinterInfo defaultPrinter(); + +protected: + static QPrinterInfo printerInfo(const QString &printerName, bool isDefault = false); + static void setPrinterInfoDefault(QPrinterInfo *p, bool isDefault); + static bool printerInfoIsDefault(const QPrinterInfo &p); + static int printerInfoCupsPrinterIndex(const QPrinterInfo &p); + static void setPrinterInfoCupsPrinterIndex(QPrinterInfo *p, int index); +}; + +#endif // QT_NO_PRINTER + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QPLATFORMPRINTINGSUPPORT_H diff --git a/src/gui/printsupport/qprintengine.h b/src/gui/printsupport/qprintengine.h new file mode 100644 index 0000000000..da4fe2ac68 --- /dev/null +++ b/src/gui/printsupport/qprintengine.h @@ -0,0 +1,119 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPRINTENGINE_H +#define QPRINTENGINE_H + +#include +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Gui) + +#ifndef QT_NO_PRINTER + +class Q_GUI_EXPORT QPrintEngine +{ +public: + virtual ~QPrintEngine() {} + enum PrintEnginePropertyKey { + PPK_CollateCopies, + PPK_ColorMode, + PPK_Creator, + PPK_DocumentName, + PPK_FullPage, + PPK_NumberOfCopies, + PPK_Orientation, + PPK_OutputFileName, + PPK_PageOrder, + PPK_PageRect, + PPK_PageSize, + PPK_PaperRect, + PPK_PaperSource, + PPK_PrinterName, + PPK_PrinterProgram, + PPK_Resolution, + PPK_SelectionOption, + PPK_SupportedResolutions, + + PPK_WindowsPageSize, + PPK_FontEmbedding, + PPK_SuppressSystemPrintStatus, + + PPK_Duplex, + + PPK_PaperSources, + PPK_CustomPaperSize, + PPK_PageMargins, + PPK_CopyCount, + PPK_SupportsMultipleCopies, + PPK_PaperSize = PPK_PageSize, + + PPK_CustomBase = 0xff00 + }; + + virtual void setProperty(PrintEnginePropertyKey key, const QVariant &value) = 0; + virtual QVariant property(PrintEnginePropertyKey key) const = 0; + + virtual bool newPage() = 0; + virtual bool abort() = 0; + + virtual int metric(QPaintDevice::PaintDeviceMetric) const = 0; + + virtual QPrinter::PrinterState printerState() const = 0; + +#ifdef Q_WS_WIN + virtual HDC getPrinterDC() const { return 0; } + virtual void releasePrinterDC(HDC) const { } +#endif + +}; + +#endif // QT_NO_PRINTER + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QPRINTENGINE_H diff --git a/src/gui/printsupport/qprintengine_pdf.cpp b/src/gui/printsupport/qprintengine_pdf.cpp new file mode 100644 index 0000000000..df9a939e4b --- /dev/null +++ b/src/gui/printsupport/qprintengine_pdf.cpp @@ -0,0 +1,648 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +#include +#include +#include +#include +#include "private/qcups_p.h" +#include "qprinterinfo.h" + +#ifndef QT_NO_PRINTER +#include +#include + +#include "qprintengine_pdf_p.h" + +#ifdef Q_OS_UNIX +#include "private/qcore_unix_p.h" // overrides QT_OPEN +#endif + +QT_BEGIN_NAMESPACE + +//#define FONT_DUMP + +extern QSizeF qt_paperSizeToQSizeF(QPrinter::PaperSize size); + +#define Q_MM(n) int((n * 720 + 127) / 254) +#define Q_IN(n) int(n * 72) + +static const char * const psToStr[QPrinter::NPaperSize+1] = +{ + "A4", "B5", "Letter", "Legal", "Executive", + "A0", "A1", "A2", "A3", "A5", "A6", "A7", "A8", "A9", "B0", "B1", + "B10", "B2", "B3", "B4", "B6", "B7", "B8", "B9", "C5E", "Comm10E", + "DLE", "Folio", "Ledger", "Tabloid", 0 +}; + +QPdf::PaperSize QPdf::paperSize(QPrinter::PaperSize paperSize) +{ + QSizeF s = qt_paperSizeToQSizeF(paperSize); + PaperSize p = { Q_MM(s.width()), Q_MM(s.height()) }; + return p; +} + +const char *QPdf::paperSizeToString(QPrinter::PaperSize paperSize) +{ + return psToStr[paperSize]; +} + + +QPdfPrintEngine::QPdfPrintEngine(QPrinter::PrinterMode m) + : QPdfEngine(*new QPdfPrintEnginePrivate(m)) +{ + Q_D(QPdfPrintEngine); +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + if (QCUPSSupport::isAvailable()) { + QCUPSSupport cups; + const cups_dest_t* printers = cups.availablePrinters(); + int prnCount = cups.availablePrintersCount(); + + for (int i = 0; i < prnCount; ++i) { + if (printers[i].is_default) { + d->printerName = QString::fromLocal8Bit(printers[i].name); + break; + } + } + + } else +#endif + { + d->printerName = QString::fromLocal8Bit(qgetenv("PRINTER")); + if (d->printerName.isEmpty()) + d->printerName = QString::fromLocal8Bit(qgetenv("LPDEST")); + if (d->printerName.isEmpty()) + d->printerName = QString::fromLocal8Bit(qgetenv("NPRINTER")); + if (d->printerName.isEmpty()) + d->printerName = QString::fromLocal8Bit(qgetenv("NGPRINTER")); + } + + state = QPrinter::Idle; +} + +QPdfPrintEngine::~QPdfPrintEngine() +{ +} + +bool QPdfPrintEngine::begin(QPaintDevice *pdev) +{ + Q_D(QPdfPrintEngine); + + if (!d->openPrintDevice()) { + state = QPrinter::Error; + return false; + } + state = QPrinter::Active; + + return QPdfEngine::begin(pdev); +} + +bool QPdfPrintEngine::end() +{ + Q_D(QPdfPrintEngine); + + QPdfEngine::end(); + + d->closePrintDevice(); + state = QPrinter::Idle; + + return true; +} + +bool QPdfPrintEngine::newPage() +{ + return QPdfEngine::newPage(); +} + +int QPdfPrintEngine::metric(QPaintDevice::PaintDeviceMetric m) const +{ + return QPdfEngine::metric(m); +} + +void QPdfPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &value) +{ + Q_D(QPdfPrintEngine); + + switch (int(key)) { + case PPK_CollateCopies: + d->collate = value.toBool(); + break; + case PPK_ColorMode: + d->grayscale = (QPrinter::ColorMode(value.toInt()) == QPrinter::GrayScale); + break; + case PPK_Creator: + d->creator = value.toString(); + break; + case PPK_DocumentName: + d->title = value.toString(); + break; + case PPK_FullPage: + d->fullPage = value.toBool(); + break; + case PPK_CopyCount: // fallthrough + case PPK_NumberOfCopies: + d->copies = value.toInt(); + break; + case PPK_Orientation: + d->landscape = (QPrinter::Orientation(value.toInt()) == QPrinter::Landscape); + break; + case PPK_OutputFileName: + d->outputFileName = value.toString(); + break; + case PPK_PageOrder: + d->pageOrder = QPrinter::PageOrder(value.toInt()); + break; + case PPK_PaperSize: + d->printerPaperSize = QPrinter::PaperSize(value.toInt()); + d->updatePaperSize(); + break; + case PPK_PaperSource: + d->paperSource = QPrinter::PaperSource(value.toInt()); + break; + case PPK_PrinterName: + d->printerName = value.toString(); + break; + case PPK_PrinterProgram: + d->printProgram = value.toString(); + break; + case PPK_Resolution: + d->resolution = value.toInt(); + break; + case PPK_SelectionOption: + d->selectionOption = value.toString(); + break; + case PPK_FontEmbedding: + d->embedFonts = value.toBool(); + break; + case PPK_Duplex: + d->duplex = static_cast (value.toInt()); + break; + case PPK_CupsPageRect: + d->cupsPageRect = value.toRect(); + break; + case PPK_CupsPaperRect: + d->cupsPaperRect = value.toRect(); + break; + case PPK_CupsOptions: + d->cupsOptions = value.toStringList(); + break; + case PPK_CupsStringPageSize: + d->cupsStringPageSize = value.toString(); + break; + case PPK_CustomPaperSize: + d->printerPaperSize = QPrinter::Custom; + d->customPaperSize = value.toSizeF(); + d->updatePaperSize(); + break; + case PPK_PageMargins: + { + QList margins(value.toList()); + Q_ASSERT(margins.size() == 4); + d->leftMargin = margins.at(0).toReal(); + d->topMargin = margins.at(1).toReal(); + d->rightMargin = margins.at(2).toReal(); + d->bottomMargin = margins.at(3).toReal(); + break; + } + default: + break; + } +} + +QVariant QPdfPrintEngine::property(PrintEnginePropertyKey key) const +{ + Q_D(const QPdfPrintEngine); + + QVariant ret; + switch (int(key)) { + case PPK_CollateCopies: + ret = d->collate; + break; + case PPK_ColorMode: + ret = d->grayscale ? QPrinter::GrayScale : QPrinter::Color; + break; + case PPK_Creator: + ret = d->creator; + break; + case PPK_DocumentName: + ret = d->title; + break; + case PPK_FullPage: + ret = d->fullPage; + break; + case PPK_CopyCount: + ret = d->copies; + break; + case PPK_SupportsMultipleCopies: +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + if (QCUPSSupport::isAvailable()) + ret = true; + else +#endif + ret = false; + break; + case PPK_NumberOfCopies: +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + if (QCUPSSupport::isAvailable()) + ret = 1; + else +#endif + ret = d->copies; + break; + case PPK_Orientation: + ret = d->landscape ? QPrinter::Landscape : QPrinter::Portrait; + break; + case PPK_OutputFileName: + ret = d->outputFileName; + break; + case PPK_PageOrder: + ret = d->pageOrder; + break; + case PPK_PaperSize: + ret = d->paperSize; + break; + case PPK_PaperSource: + ret = d->paperSource; + break; + case PPK_PrinterName: + ret = d->printerName; + break; + case PPK_PrinterProgram: + ret = d->printProgram; + break; + case PPK_Resolution: + ret = d->resolution; + break; + case PPK_SupportedResolutions: + ret = QList() << 72; + break; + case PPK_PaperRect: + ret = d->paperRect(); + break; + case PPK_PageRect: + ret = d->pageRect(); + break; + case PPK_SelectionOption: + ret = d->selectionOption; + break; + case PPK_FontEmbedding: + ret = d->embedFonts; + break; + case PPK_Duplex: + ret = d->duplex; + break; + case PPK_CupsPageRect: + ret = d->cupsPageRect; + break; + case PPK_CupsPaperRect: + ret = d->cupsPaperRect; + break; + case PPK_CupsOptions: + ret = d->cupsOptions; + break; + case PPK_CupsStringPageSize: + ret = d->cupsStringPageSize; + break; + case PPK_CustomPaperSize: + ret = d->customPaperSize; + break; + case PPK_PageMargins: + { + QList margins; + margins << d->leftMargin << d->topMargin + << d->rightMargin << d->bottomMargin; + ret = margins; + break; + } + default: + break; + } + return ret; +} + + +#ifndef QT_NO_LPR +static void closeAllOpenFds() +{ + // hack time... getting the maximum number of open + // files, if possible. if not we assume it's the + // larger of 256 and the fd we got + int i; +#if defined(_SC_OPEN_MAX) + i = (int)sysconf(_SC_OPEN_MAX); +#elif defined(_POSIX_OPEN_MAX) + i = (int)_POSIX_OPEN_MAX; +#elif defined(OPEN_MAX) + i = (int)OPEN_MAX; +#else + i = 256; +#endif + // leave stdin/out/err untouched + while(--i > 2) + QT_CLOSE(i); +} +#endif + +bool QPdfPrintEnginePrivate::openPrintDevice() +{ + if (outDevice) + return false; + + if (!outputFileName.isEmpty()) { + QFile *file = new QFile(outputFileName); + if (! file->open(QFile::WriteOnly|QFile::Truncate)) { + delete file; + return false; + } + outDevice = file; +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + } else if (QCUPSSupport::isAvailable()) { + QCUPSSupport cups; + QPair ret = cups.tempFd(); + if (ret.first < 0) { + qWarning("QPdfPrinter: Could not open temporary file to print"); + return false; + } + cupsTempFile = ret.second; + outDevice = new QFile(); + static_cast(outDevice)->open(ret.first, QIODevice::WriteOnly); +#endif +#ifndef QT_NO_LPR + } else { + QString pr; + if (!printerName.isEmpty()) + pr = printerName; + int fds[2]; + if (qt_safe_pipe(fds) != 0) { + qWarning("QPdfPrinter: Could not open pipe to print"); + return false; + } + + pid_t pid = fork(); + if (pid == 0) { // child process + // if possible, exit quickly, so the actual lp/lpr + // becomes a child of init, and ::waitpid() is + // guaranteed not to wait. + if (fork() > 0) { + closeAllOpenFds(); + + // try to replace this process with "true" - this prevents + // global destructors from being called (that could possibly + // do wrong things to the parent process) + (void)execlp("true", "true", (char *)0); + (void)execl("/bin/true", "true", (char *)0); + (void)execl("/usr/bin/true", "true", (char *)0); + ::_exit(0); + } + qt_safe_dup2(fds[0], 0, 0); + + closeAllOpenFds(); + + if (!printProgram.isEmpty()) { + if (!selectionOption.isEmpty()) + pr.prepend(selectionOption); + else + pr.prepend(QLatin1String("-P")); + (void)execlp(printProgram.toLocal8Bit().data(), printProgram.toLocal8Bit().data(), + pr.toLocal8Bit().data(), (char *)0); + } else { + // if no print program has been specified, be smart + // about the option string too. + QList lprhack; + QList lphack; + QByteArray media; + if (!pr.isEmpty() || !selectionOption.isEmpty()) { + if (!selectionOption.isEmpty()) { + QStringList list = selectionOption.split(QLatin1Char(' ')); + for (int i = 0; i < list.size(); ++i) + lprhack.append(list.at(i).toLocal8Bit()); + lphack = lprhack; + } else { + lprhack.append("-P"); + lphack.append("-d"); + } + lprhack.append(pr.toLocal8Bit()); + lphack.append(pr.toLocal8Bit()); + } + lphack.append("-s"); + + char ** lpargs = new char *[lphack.size()+6]; + char lp[] = "lp"; + lpargs[0] = lp; + int i; + for (i = 0; i < lphack.size(); ++i) + lpargs[i+1] = (char *)lphack.at(i).constData(); +#ifndef Q_OS_OSF + if (QPdf::paperSizeToString(printerPaperSize)) { + char dash_o[] = "-o"; + lpargs[++i] = dash_o; + lpargs[++i] = const_cast(QPdf::paperSizeToString(printerPaperSize)); + lpargs[++i] = dash_o; + media = "media="; + media += QPdf::paperSizeToString(printerPaperSize); + lpargs[++i] = media.data(); + } +#endif + lpargs[++i] = 0; + char **lprargs = new char *[lprhack.size()+2]; + char lpr[] = "lpr"; + lprargs[0] = lpr; + for (int i = 0; i < lprhack.size(); ++i) + lprargs[i+1] = (char *)lprhack[i].constData(); + lprargs[lprhack.size() + 1] = 0; + (void)execvp("lp", lpargs); + (void)execvp("lpr", lprargs); + (void)execv("/bin/lp", lpargs); + (void)execv("/bin/lpr", lprargs); + (void)execv("/usr/bin/lp", lpargs); + (void)execv("/usr/bin/lpr", lprargs); + + delete []lpargs; + delete []lprargs; + } + // if we couldn't exec anything, close the fd, + // wait for a second so the parent process (the + // child of the GUI process) has exited. then + // exit. + QT_CLOSE(0); + (void)::sleep(1); + ::_exit(0); + } + // parent process + QT_CLOSE(fds[0]); + fd = fds[1]; + (void)qt_safe_waitpid(pid, 0, 0); + + if (fd < 0) + return false; + + outDevice = new QFile(); + static_cast(outDevice)->open(fd, QIODevice::WriteOnly); +#endif + } + + return true; +} + +void QPdfPrintEnginePrivate::closePrintDevice() +{ +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + if (!cupsTempFile.isEmpty()) { + QString tempFile = cupsTempFile; + cupsTempFile.clear(); + QCUPSSupport cups; + + // Set up print options. + QByteArray prnName; + QList > options; + QVector cupsOptStruct; + + if (!printerName.isEmpty()) { + prnName = printerName.toLocal8Bit(); + } else { + QPrinterInfo def = QPrinterInfo::defaultPrinter(); + if (def.isNull()) { + qWarning("Could not determine printer to print to"); + QFile::remove(tempFile); + return; + } + prnName = def.printerName().toLocal8Bit(); + } + + if (!cupsStringPageSize.isEmpty()) { + options.append(QPair("media", cupsStringPageSize.toLocal8Bit())); + } + + if (copies > 1) { + options.append(QPair("copies", QString::number(copies).toLocal8Bit())); + } + + if (collate) { + options.append(QPair("Collate", "True")); + } + + if (duplex != QPrinter::DuplexNone) { + switch(duplex) { + case QPrinter::DuplexNone: break; + case QPrinter::DuplexAuto: + if (!landscape) + options.append(QPair("sides", "two-sided-long-edge")); + else + options.append(QPair("sides", "two-sided-short-edge")); + break; + case QPrinter::DuplexLongSide: + options.append(QPair("sides", "two-sided-long-edge")); + break; + case QPrinter::DuplexShortSide: + options.append(QPair("sides", "two-sided-short-edge")); + break; + } + } + + if (QCUPSSupport::cupsVersion() >= 10300 && landscape) { + options.append(QPair("landscape", "")); + } + + QStringList::const_iterator it = cupsOptions.constBegin(); + while (it != cupsOptions.constEnd()) { + options.append(QPair((*it).toLocal8Bit(), (*(it+1)).toLocal8Bit())); + it += 2; + } + + for (int c = 0; c < options.size(); ++c) { + cups_option_t opt; + opt.name = options[c].first.data(); + opt.value = options[c].second.data(); + cupsOptStruct.append(opt); + } + + // Print the file. + cups_option_t* optPtr = cupsOptStruct.size() ? &cupsOptStruct.first() : 0; + cups.printFile(prnName.constData(), tempFile.toLocal8Bit().constData(), + title.toLocal8Bit().constData(), cupsOptStruct.size(), optPtr); + + QFile::remove(tempFile); + } +#endif +} + + + +QPdfPrintEnginePrivate::QPdfPrintEnginePrivate(QPrinter::PrinterMode m) + : QPdfEnginePrivate(), + duplex(QPrinter::DuplexNone), + collate(false), + copies(1), + pageOrder(QPrinter::FirstPageFirst), + paperSource(QPrinter::Auto), + printerPaperSize(QPrinter::A4) +{ + resolution = 72; + if (m == QPrinter::HighResolution) + resolution = 1200; + else if (m == QPrinter::ScreenResolution) + resolution = qt_defaultDpi(); +} + +QPdfPrintEnginePrivate::~QPdfPrintEnginePrivate() +{ +} + + +void QPdfPrintEnginePrivate::updatePaperSize() +{ + if (printerPaperSize == QPrinter::Custom) { + paperSize = customPaperSize; + } else if (!cupsPaperRect.isNull()) { + QRect r = cupsPaperRect; + paperSize = r.size(); + } else{ + QPdf::PaperSize s = QPdf::paperSize(printerPaperSize); + paperSize = QSize(s.width, s.height); + } +} + + +QT_END_NAMESPACE + +#endif // QT_NO_PRINTER diff --git a/src/gui/printsupport/qprintengine_pdf_p.h b/src/gui/printsupport/qprintengine_pdf_p.h new file mode 100644 index 0000000000..367e3aebab --- /dev/null +++ b/src/gui/printsupport/qprintengine_pdf_p.h @@ -0,0 +1,163 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPRINTENGINE_PDF_P_H +#define QPRINTENGINE_PDF_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "QtGui/qprintengine.h" + +#ifndef QT_NO_PRINTER +#include "QtCore/qmap.h" +#include "QtGui/qmatrix.h" +#include "QtCore/qstring.h" +#include "QtCore/qvector.h" +#include "QtGui/qpaintengine.h" +#include "QtGui/qpainterpath.h" +#include "QtCore/qdatastream.h" + +#include "private/qfontengine_p.h" +#include "private/qpdf_p.h" +#include "private/qpaintengine_p.h" +#include "qprintengine.h" + +QT_BEGIN_NAMESPACE + +class QImage; +class QDataStream; +class QPen; +class QPointF; +class QRegion; +class QFile; +class QPdfPrintEngine; + +#define PPK_CupsOptions QPrintEngine::PrintEnginePropertyKey(0xfe00) +#define PPK_CupsPageRect QPrintEngine::PrintEnginePropertyKey(0xfe01) +#define PPK_CupsPaperRect QPrintEngine::PrintEnginePropertyKey(0xfe02) +#define PPK_CupsStringPageSize QPrintEngine::PrintEnginePropertyKey(0xfe03) + +namespace QPdf { + + struct PaperSize { + int width, height; // in postscript points + }; + Q_GUI_EXPORT PaperSize paperSize(QPrinter::PaperSize paperSize); + Q_GUI_EXPORT const char *paperSizeToString(QPrinter::PaperSize paperSize); +} + +class QPdfPrintEnginePrivate; + +class QPdfPrintEngine : public QPdfEngine, public QPrintEngine +{ + Q_DECLARE_PRIVATE(QPdfPrintEngine) +public: + QPdfPrintEngine(QPrinter::PrinterMode m); + virtual ~QPdfPrintEngine(); + + // reimplementations QPaintEngine + bool begin(QPaintDevice *pdev); + bool end(); + // end reimplementations QPaintEngine + + // reimplementations QPrintEngine + bool abort() {return false;} + QPrinter::PrinterState printerState() const {return state;} + + bool newPage(); + int metric(QPaintDevice::PaintDeviceMetric) const; + void setProperty(PrintEnginePropertyKey key, const QVariant &value); + QVariant property(PrintEnginePropertyKey key) const; + // end reimplementations QPrintEngine + + QPrinter::PrinterState state; + +private: + Q_DISABLE_COPY(QPdfPrintEngine) +}; + +class QPdfPrintEnginePrivate : public QPdfEnginePrivate +{ + Q_DECLARE_PUBLIC(QPdfPrintEngine) +public: + QPdfPrintEnginePrivate(QPrinter::PrinterMode m); + ~QPdfPrintEnginePrivate(); + + bool openPrintDevice(); + void closePrintDevice(); + + void updatePaperSize(); + +private: + Q_DISABLE_COPY(QPdfPrintEnginePrivate) + + QString printerName; + QString printProgram; + QString selectionOption; + QStringList cupsOptions; + QString cupsStringPageSize; + + QPrinter::DuplexMode duplex; + bool collate; + int copies; + QPrinter::PageOrder pageOrder; + QPrinter::PaperSource paperSource; + + QPrinter::PaperSize printerPaperSize; + QRect cupsPaperRect; + QRect cupsPageRect; + QSizeF customPaperSize; // in postscript points +}; + +QT_END_NAMESPACE + +#endif // QT_NO_PRINTER + +#endif // QPRINTENGINE_PDF_P_H diff --git a/src/gui/printsupport/qprinter.cpp b/src/gui/printsupport/qprinter.cpp new file mode 100644 index 0000000000..bdbddf20c4 --- /dev/null +++ b/src/gui/printsupport/qprinter.cpp @@ -0,0 +1,2280 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qprinter_p.h" +#include "qprinter.h" +#include "qprintengine.h" +#include "qprinterinfo.h" +#include "qlist.h" +#include +#include +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) +#include "private/qcups_p.h" +#endif + +#ifndef QT_NO_PRINTER + +#include +#include + +#if defined (Q_WS_WIN) +#include +#elif defined (Q_WS_MAC) +#include +#elif defined (QTOPIA_PRINTENGINE) +#include +#endif + +#if defined(Q_WS_X11) +#include +#endif + +#ifndef QT_NO_PDF +#include "qprintengine_pdf_p.h" +#endif + +#include +#include + +QT_BEGIN_NAMESPACE + +#define ABORT_IF_ACTIVE(location) \ + if (d->printEngine->printerState() == QPrinter::Active) { \ + qWarning("%s: Cannot be changed while printer is active", location); \ + return; \ + } + +// NB! This table needs to be in sync with QPrinter::PaperSize +static const float qt_paperSizes[][2] = { + {210, 297}, // A4 + {176, 250}, // B5 + {215.9f, 279.4f}, // Letter + {215.9f, 355.6f}, // Legal + {190.5f, 254}, // Executive + {841, 1189}, // A0 + {594, 841}, // A1 + {420, 594}, // A2 + {297, 420}, // A3 + {148, 210}, // A5 + {105, 148}, // A6 + {74, 105}, // A7 + {52, 74}, // A8 + {37, 52}, // A8 + {1000, 1414}, // B0 + {707, 1000}, // B1 + {31, 44}, // B10 + {500, 707}, // B2 + {353, 500}, // B3 + {250, 353}, // B4 + {125, 176}, // B6 + {88, 125}, // B7 + {62, 88}, // B8 + {33, 62}, // B9 + {163, 229}, // C5E + {105, 241}, // US Common + {110, 220}, // DLE + {210, 330}, // Folio + {431.8f, 279.4f}, // Ledger + {279.4f, 431.8f} // Tabloid +}; + +/// return the multiplier of converting from the unit value to postscript-points. +Q_GUI_EXPORT double qt_multiplierForUnit(QPrinter::Unit unit, int resolution) +{ + switch(unit) { + case QPrinter::Millimeter: + return 2.83464566929; + case QPrinter::Point: + return 1.0; + case QPrinter::Inch: + return 72.0; + case QPrinter::Pica: + return 12; + case QPrinter::Didot: + return 1.065826771; + case QPrinter::Cicero: + return 12.789921252; + case QPrinter::DevicePixel: + return 72.0/resolution; + } + return 1.0; +} + +// not static: it's needed in qpagesetupdialog_unix.cpp +Q_GUI_EXPORT QSizeF qt_printerPaperSize(QPrinter::Orientation orientation, + QPrinter::PaperSize paperSize, + QPrinter::Unit unit, + int resolution) +{ + int width_index = 0; + int height_index = 1; + if (orientation == QPrinter::Landscape) { + width_index = 1; + height_index = 0; + } + const qreal multiplier = qt_multiplierForUnit(unit, resolution); + return QSizeF((qt_paperSizes[paperSize][width_index] * 72 / 25.4) / multiplier, + (qt_paperSizes[paperSize][height_index] * 72 / 25.4) / multiplier); +} + +void QPrinterPrivate::createDefaultEngines() +{ + QPrinter::OutputFormat realOutputFormat = outputFormat; +#if !defined (QTOPIA_PRINTENGINE) +#if defined (Q_OS_UNIX) && ! defined (Q_WS_MAC) + if(outputFormat == QPrinter::NativeFormat) { + realOutputFormat = QPrinter::PdfFormat; + } +#endif +#endif + + switch (realOutputFormat) { + case QPrinter::NativeFormat: { +#if defined (Q_WS_QPA) + printEngine = QGuiApplicationPrivate::platformIntegration()->printerSupport()->createNativePrintEngine(printerMode); + paintEngine = QGuiApplicationPrivate::platformIntegration()->printerSupport()->createPaintEngine(printEngine, printerMode); +#elif defined (Q_WS_WIN) + QWin32PrintEngine *winEngine = new QWin32PrintEngine(printerMode); + paintEngine = winEngine; + printEngine = winEngine; +#elif defined (Q_WS_MAC) + QMacPrintEngine *macEngine = new QMacPrintEngine(printerMode); + paintEngine = macEngine; + printEngine = macEngine; +#elif defined (QTOPIA_PRINTENGINE) + QtopiaPrintEngine *qwsEngine = new QtopiaPrintEngine(printerMode); + paintEngine = qwsEngine; + printEngine = qwsEngine; +#elif defined (Q_OS_UNIX) + Q_ASSERT(false); +#endif + } + break; + case QPrinter::PdfFormat: { + QPdfPrintEngine *pdfEngine = new QPdfPrintEngine(printerMode); + paintEngine = pdfEngine; + printEngine = pdfEngine; + } + break; + } + use_default_engine = true; + had_default_engines = true; +} + +#ifndef QT_NO_PRINTPREVIEWWIDGET +QList QPrinterPrivate::previewPages() const +{ + if (previewEngine) + return previewEngine->pages(); + return QList(); +} + +void QPrinterPrivate::setPreviewMode(bool enable) +{ + Q_Q(QPrinter); + if (enable) { + if (!previewEngine) + previewEngine = new QPreviewPaintEngine; + had_default_engines = use_default_engine; + use_default_engine = false; + realPrintEngine = printEngine; + realPaintEngine = paintEngine; + q->setEngines(previewEngine, previewEngine); + previewEngine->setProxyEngines(realPrintEngine, realPaintEngine); + } else { + q->setEngines(realPrintEngine, realPaintEngine); + use_default_engine = had_default_engines; + } +} +#endif // QT_NO_PRINTPREVIEWWIDGET + +void QPrinterPrivate::addToManualSetList(QPrintEngine::PrintEnginePropertyKey key) +{ + for (int c = 0; c < manualSetList.size(); ++c) { + if (manualSetList[c] == key) return; + } + manualSetList.append(key); +} + + +/*! + \class QPrinter + \reentrant + + \brief The QPrinter class is a paint device that paints on a printer. + + \ingroup printing + + + This device represents a series of pages of printed output, and is + used in almost exactly the same way as other paint devices such as + QWidget and QPixmap. + A set of additional functions are provided to manage device-specific + features, such as orientation and resolution, and to step through + the pages in a document as it is generated. + + When printing directly to a printer on Windows or Mac OS X, QPrinter uses + the built-in printer drivers. On X11, QPrinter uses the + \l{Common Unix Printing System (CUPS)} or the standard Unix \l lpr utility + to send PDF output to the printer. As an alternative, + the printProgram() function can be used to specify the command or utility + to use instead of the system default. + + Note that setting parameters like paper size and resolution on an + invalid printer is undefined. You can use QPrinter::isValid() to + verify this before changing any parameters. + + QPrinter supports a number of parameters, most of which can be + changed by the end user through a \l{QPrintDialog}{print dialog}. In + general, QPrinter passes these functions onto the underlying QPrintEngine. + + The most important parameters are: + \list + \i setOrientation() tells QPrinter which page orientation to use. + \i setPaperSize() tells QPrinter what paper size to expect from the + printer. + \i setResolution() tells QPrinter what resolution you wish the + printer to provide, in dots per inch (DPI). + \i setFullPage() tells QPrinter whether you want to deal with the + full page or just with the part the printer can draw on. + \i setCopyCount() tells QPrinter how many copies of the document + it should print. + \endlist + + Many of these functions can only be called before the actual printing + begins (i.e., before QPainter::begin() is called). This usually makes + sense because, for example, it's not possible to change the number of + copies when you are halfway through printing. There are also some + settings that the user sets (through the printer dialog) and that + applications are expected to obey. See QAbstractPrintDialog's + documentation for more details. + + When QPainter::begin() is called, the QPrinter it operates on is prepared for + a new page, enabling the QPainter to be used immediately to paint the first + page in a document. Once the first page has been painted, newPage() can be + called to request a new blank page to paint on, or QPainter::end() can be + called to finish printing. The second page and all following pages are + prepared using a call to newPage() before they are painted. + + The first page in a document does not need to be preceded by a call to + newPage(). You only need to calling newPage() after QPainter::begin() if you + need to insert a blank page at the beginning of a printed document. + Similarly, calling newPage() after the last page in a document is painted will + result in a trailing blank page appended to the end of the printed document. + + If you want to abort the print job, abort() will try its best to + stop printing. It may cancel the entire job or just part of it. + + Since QPrinter can print to any QPrintEngine subclass, it is possible to + extend printing support to cover new types of printing subsystem by + subclassing QPrintEngine and reimplementing its interface. + + \sa QPrintDialog, {Printing with Qt} +*/ + +/*! + \enum QPrinter::PrinterState + + \value Idle + \value Active + \value Aborted + \value Error +*/ + +/*! + \enum QPrinter::PrinterMode + + This enum describes the mode the printer should work in. It + basically presets a certain resolution and working mode. + + \value ScreenResolution Sets the resolution of the print device to + the screen resolution. This has the big advantage that the results + obtained when painting on the printer will match more or less + exactly the visible output on the screen. It is the easiest to + use, as font metrics on the screen and on the printer are the + same. This is the default value. ScreenResolution will produce a + lower quality output than HighResolution and should only be used + for drafts. + + \value PrinterResolution This value is deprecated. Is is + equivalent to ScreenResolution on Unix and HighResolution on + Windows and Mac. Due do the difference between ScreenResolution + and HighResolution, use of this value may lead to non-portable + printer code. + + \value HighResolution On Windows, sets the printer resolution to that + defined for the printer in use. For PDF printing, sets the + resolution of the PDF driver to 1200 dpi. + + \note When rendering text on a QPrinter device, it is important + to realize that the size of text, when specified in points, is + independent of the resolution specified for the device itself. + Therefore, it may be useful to specify the font size in pixels + when combining text with graphics to ensure that their relative + sizes are what you expect. +*/ + +/*! + \enum QPrinter::Orientation + + This enum type (not to be confused with \c Orientation) is used + to specify each page's orientation. + + \value Portrait the page's height is greater than its width. + + \value Landscape the page's width is greater than its height. + + This type interacts with \l QPrinter::PaperSize and + QPrinter::setFullPage() to determine the final size of the page + available to the application. +*/ + + +/*! + \enum QPrinter::PrintRange + + Used to specify the print range selection option. + + \value AllPages All pages should be printed. + \value Selection Only the selection should be printed. + \value PageRange The specified page range should be printed. + \value CurrentPage Only the current page should be printed. + + \sa QAbstractPrintDialog::PrintRange +*/ + +/*! + \enum QPrinter::PrinterOption + \compat + + Use QAbstractPrintDialog::PrintDialogOption instead. + + \value PrintToFile + \value PrintSelection + \value PrintPageRange +*/ + +/*! + \enum QPrinter::PageSize + + \obsolete + Use QPrinter::PaperSize instead. + + \value A0 841 x 1189 mm + \value A1 594 x 841 mm + \value A2 420 x 594 mm + \value A3 297 x 420 mm + \value A4 210 x 297 mm, 8.26 x 11.69 inches + \value A5 148 x 210 mm + \value A6 105 x 148 mm + \value A7 74 x 105 mm + \value A8 52 x 74 mm + \value A9 37 x 52 mm + \value B0 1030 x 1456 mm + \value B1 728 x 1030 mm + \value B10 32 x 45 mm + \value B2 515 x 728 mm + \value B3 364 x 515 mm + \value B4 257 x 364 mm + \value B5 182 x 257 mm, 7.17 x 10.13 inches + \value B6 128 x 182 mm + \value B7 91 x 128 mm + \value B8 64 x 91 mm + \value B9 45 x 64 mm + \value C5E 163 x 229 mm + \value Comm10E 105 x 241 mm, U.S. Common 10 Envelope + \value DLE 110 x 220 mm + \value Executive 7.5 x 10 inches, 191 x 254 mm + \value Folio 210 x 330 mm + \value Ledger 432 x 279 mm + \value Legal 8.5 x 14 inches, 216 x 356 mm + \value Letter 8.5 x 11 inches, 216 x 279 mm + \value Tabloid 279 x 432 mm + \value Custom Unknown, or a user defined size. + + \omitvalue NPageSize + */ + +/*! + \enum QPrinter::PaperSize + \since 4.4 + + This enum type specifies what paper size QPrinter should use. + QPrinter does not check that the paper size is available; it just + uses this information, together with QPrinter::Orientation and + QPrinter::setFullPage(), to determine the printable area. + + The defined sizes (with setFullPage(true)) are: + + \value A0 841 x 1189 mm + \value A1 594 x 841 mm + \value A2 420 x 594 mm + \value A3 297 x 420 mm + \value A4 210 x 297 mm, 8.26 x 11.69 inches + \value A5 148 x 210 mm + \value A6 105 x 148 mm + \value A7 74 x 105 mm + \value A8 52 x 74 mm + \value A9 37 x 52 mm + \value B0 1000 x 1414 mm + \value B1 707 x 1000 mm + \value B2 500 x 707 mm + \value B3 353 x 500 mm + \value B4 250 x 353 mm + \value B5 176 x 250 mm, 6.93 x 9.84 inches + \value B6 125 x 176 mm + \value B7 88 x 125 mm + \value B8 62 x 88 mm + \value B9 33 x 62 mm + \value B10 31 x 44 mm + \value C5E 163 x 229 mm + \value Comm10E 105 x 241 mm, U.S. Common 10 Envelope + \value DLE 110 x 220 mm + \value Executive 7.5 x 10 inches, 190.5 x 254 mm + \value Folio 210 x 330 mm + \value Ledger 431.8 x 279.4 mm + \value Legal 8.5 x 14 inches, 215.9 x 355.6 mm + \value Letter 8.5 x 11 inches, 215.9 x 279.4 mm + \value Tabloid 279.4 x 431.8 mm + \value Custom Unknown, or a user defined size. + + With setFullPage(false) (the default), the metrics will be a bit + smaller; how much depends on the printer in use. + + \omitvalue NPageSize + \omitvalue NPaperSize +*/ + + +/*! + \enum QPrinter::PageOrder + + This enum type is used by QPrinter to tell the application program + how to print. + + \value FirstPageFirst the lowest-numbered page should be printed + first. + + \value LastPageFirst the highest-numbered page should be printed + first. +*/ + +/*! + \enum QPrinter::ColorMode + + This enum type is used to indicate whether QPrinter should print + in color or not. + + \value Color print in color if available, otherwise in grayscale. + + \value GrayScale print in grayscale, even on color printers. +*/ + +/*! + \enum QPrinter::PaperSource + + This enum type specifies what paper source QPrinter is to use. + QPrinter does not check that the paper source is available; it + just uses this information to try and set the paper source. + Whether it will set the paper source depends on whether the + printer has that particular source. + + \warning This is currently only implemented for Windows. + + \value Auto + \value Cassette + \value Envelope + \value EnvelopeManual + \value FormSource + \value LargeCapacity + \value LargeFormat + \value Lower + \value MaxPageSource + \value Middle + \value Manual + \value OnlyOne + \value Tractor + \value SmallFormat +*/ + +/*! + \enum QPrinter::Unit + \since 4.4 + + This enum type is used to specify the measurement unit for page and + paper sizes. + + \value Millimeter + \value Point + \value Inch + \value Pica + \value Didot + \value Cicero + \value DevicePixel + + 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 + the printer. +*/ + + +/* + \enum QPrinter::PrintRange + + This enum is used to specify which print range the application + should use to print. + + \value AllPages All the pages should be printed. + \value Selection Only the selection should be printed. + \value PageRange Print according to the from page and to page options. + \value CurrentPage Only the current page should be printed. + + \sa setPrintRange(), printRange() +*/ + +/* + \enum QPrinter::PrinterOption + + This enum describes various printer options that appear in the + printer setup dialog. It is used to enable and disable these + options in the setup dialog. + + \value PrintToFile Describes if print to file should be enabled. + \value PrintSelection Describes if printing selections should be enabled. + \value PrintPageRange Describes if printing page ranges (from, to) should + be enabled + \value PrintCurrentPage if Print Current Page option should be enabled + + \sa setOptionEnabled(), isOptionEnabled() +*/ + +/*! + Creates a new printer object with the given \a mode. +*/ +QPrinter::QPrinter(PrinterMode mode) + : QPaintDevice(), + d_ptr(new QPrinterPrivate(this)) +{ + init(mode); + QPrinterInfo defPrn(QPrinterInfo::defaultPrinter()); + if (!defPrn.isNull()) { + setPrinterName(defPrn.printerName()); + } else if (QPrinterInfo::availablePrinters().isEmpty() + && d_ptr->paintEngine->type() != QPaintEngine::Windows + && d_ptr->paintEngine->type() != QPaintEngine::MacPrinter) { + setOutputFormat(QPrinter::PdfFormat); + } +} + +/*! + \since 4.4 + + Creates a new printer object with the given \a printer and \a mode. +*/ +QPrinter::QPrinter(const QPrinterInfo& printer, PrinterMode mode) + : QPaintDevice(), + d_ptr(new QPrinterPrivate(this)) +{ + init(mode); + setPrinterName(printer.printerName()); +} + +void QPrinter::init(PrinterMode mode) +{ +#if !defined(Q_WS_X11) + if (!QCoreApplication::instance()) { +#else + if (!QCoreApplication::instance() || !X11) { +#endif + qFatal("QPrinter: Must construct a QApplication before a QPaintDevice"); + return; + } + Q_D(QPrinter); + + d->printerMode = mode; + d->outputFormat = QPrinter::NativeFormat; + d->createDefaultEngines(); + +#ifndef QT_NO_PRINTPREVIEWWIDGET + d->previewEngine = 0; +#endif + d->realPrintEngine = 0; + d->realPaintEngine = 0; + +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + if (QCUPSSupport::cupsVersion() >= 10200 && QCUPSSupport().currentPPD()) { + setOutputFormat(QPrinter::PdfFormat); + d->outputFormat = QPrinter::NativeFormat; + } +#endif +} + +/*! + This function is used by subclasses of QPrinter to specify custom + print and paint engines (\a printEngine and \a paintEngine, + respectively). + + QPrinter does not take ownership of the engines, so you need to + manage these engine instances yourself. + + Note that changing the engines will reset the printer state and + all its properties. + + \sa printEngine() paintEngine() setOutputFormat() + + \since 4.1 +*/ +void QPrinter::setEngines(QPrintEngine *printEngine, QPaintEngine *paintEngine) +{ + Q_D(QPrinter); + + if (d->use_default_engine) + delete d->printEngine; + + d->printEngine = printEngine; + d->paintEngine = paintEngine; + d->use_default_engine = false; +} + +/*! + Destroys the printer object and frees any allocated resources. If + the printer is destroyed while a print job is in progress this may + or may not affect the print job. +*/ +QPrinter::~QPrinter() +{ + Q_D(QPrinter); + if (d->use_default_engine) + delete d->printEngine; +#ifndef QT_NO_PRINTPREVIEWWIDGET + delete d->previewEngine; +#endif +} + +/*! + \enum QPrinter::OutputFormat + + The OutputFormat enum is used to describe the format QPrinter should + use for printing. + + \value NativeFormat QPrinter will print output using a method defined + by the platform it is running on. This mode is the default when printing + directly to a printer. + + \value PdfFormat QPrinter will generate its output as a searchable PDF file. + This mode is the default when printing to a file. + + \sa outputFormat(), setOutputFormat(), setOutputFileName() +*/ + +/*! + \since 4.1 + + Sets the output format for this printer to \a format. +*/ +void QPrinter::setOutputFormat(OutputFormat format) +{ + +#ifndef QT_NO_PDF + Q_D(QPrinter); + if (d->validPrinter && d->outputFormat == format) + return; + d->outputFormat = format; + + QPrintEngine *oldPrintEngine = d->printEngine; + const bool def_engine = d->use_default_engine; + d->printEngine = 0; + + d->createDefaultEngines(); + + if (oldPrintEngine) { + for (int i = 0; i < d->manualSetList.size(); ++i) { + QPrintEngine::PrintEnginePropertyKey key = d->manualSetList[i]; + QVariant prop; + // PPK_NumberOfCopies need special treatmeant since it in most cases + // will return 1, disregarding the actual value that was set + if (key == QPrintEngine::PPK_NumberOfCopies) + prop = QVariant(copyCount()); + else + prop = oldPrintEngine->property(key); + if (prop.isValid()) + d->printEngine->setProperty(key, prop); + } + } + + if (def_engine) + delete oldPrintEngine; + + if (d->outputFormat == QPrinter::PdfFormat) + d->validPrinter = true; +#else + Q_UNUSED(format); +#endif +} + +/*! + \since 4.1 + + Returns the output format for this printer. +*/ +QPrinter::OutputFormat QPrinter::outputFormat() const +{ + Q_D(const QPrinter); + return d->outputFormat; +} + + + +/*! \internal +*/ +int QPrinter::devType() const +{ + return QInternal::Printer; +} + +/*! + Returns the printer name. This value is initially set to the name + of the default printer. + + \sa setPrinterName() +*/ +QString QPrinter::printerName() const +{ + Q_D(const QPrinter); + return d->printEngine->property(QPrintEngine::PPK_PrinterName).toString(); +} + +/*! + Sets the printer name to \a name. + + \sa printerName(), isValid() +*/ +void QPrinter::setPrinterName(const QString &name) +{ + Q_D(QPrinter); + ABORT_IF_ACTIVE("QPrinter::setPrinterName"); + +#if defined(Q_OS_UNIX) && !defined(QT_NO_CUPS) + if(d->use_default_engine && d->outputFormat == QPrinter::NativeFormat) { + setOutputFormat(QPrinter::PdfFormat); + d->outputFormat = QPrinter::NativeFormat; + } +#endif + + QList prnList = QPrinterInfo::availablePrinters(); + if (name.isEmpty()) { + d->validPrinter = d->outputFormat == QPrinter::PdfFormat; + } else { + d->validPrinter = false; + for (int i = 0; i < prnList.size(); ++i) { + if (prnList[i].printerName() == name) { + d->validPrinter = true; + break; + } + } + } + + d->printEngine->setProperty(QPrintEngine::PPK_PrinterName, name); + d->addToManualSetList(QPrintEngine::PPK_PrinterName); +} + + +/*! + \since 4.4 + + Returns true if the printer currently selected is a valid printer + in the system, or a pure PDF printer; otherwise returns false. + + To detect other failures check the output of QPainter::begin() or QPrinter::newPage(). + + \snippet doc/src/snippets/printing-qprinter/errors.cpp 0 + + \sa setPrinterName() +*/ +bool QPrinter::isValid() const +{ + Q_D(const QPrinter); +#if defined(Q_WS_X11) + if (!qApp || !X11) { + return false; + } +#endif + return d->validPrinter; +} + + +/*! + \fn bool QPrinter::outputToFile() const + + Returns true if the output should be written to a file, or false + if the output should be sent directly to the printer. The default + setting is false. + + \sa setOutputToFile(), setOutputFileName() +*/ + + +/*! + \fn void QPrinter::setOutputToFile(bool enable) + + Specifies whether the output should be written to a file or sent + directly to the printer. + + Will output to a file if \a enable is true, or will output + directly to the printer if \a enable is false. + + \sa outputToFile(), setOutputFileName() +*/ + + +/*! + \fn QString QPrinter::outputFileName() const + + Returns the name of the output file. By default, this is an empty string + (indicating that the printer shouldn't print to file). + + \sa QPrintEngine::PrintEnginePropertyKey + +*/ + +QString QPrinter::outputFileName() const +{ + Q_D(const QPrinter); + return d->printEngine->property(QPrintEngine::PPK_OutputFileName).toString(); +} + +/*! + Sets the name of the output file to \a fileName. + + Setting a null or empty name (0 or "") disables printing to a file. + Setting a non-empty name enables printing to a file. + + This can change the value of outputFormat(). + If the file name has the ".pdf" suffix PDF is generated. If the file name + has a suffix other than ".pdf", the output format used is the + one set with setOutputFormat(). + + QPrinter uses Qt's cross-platform PDF print engines + respectively. If you can produce this format natively, for example + Mac OS X can generate PDF's from its print engine, set the output format + back to NativeFormat. + + \sa outputFileName() setOutputToFile() setOutputFormat() +*/ + +void QPrinter::setOutputFileName(const QString &fileName) +{ + Q_D(QPrinter); + ABORT_IF_ACTIVE("QPrinter::setOutputFileName"); + + QFileInfo fi(fileName); + if (!fi.suffix().compare(QLatin1String("pdf"), Qt::CaseInsensitive)) + setOutputFormat(QPrinter::PdfFormat); + else if (fileName.isEmpty()) + setOutputFormat(QPrinter::NativeFormat); + + d->printEngine->setProperty(QPrintEngine::PPK_OutputFileName, fileName); + d->addToManualSetList(QPrintEngine::PPK_OutputFileName); +} + + +/*! + Returns the name of the program that sends the print output to the + printer. + + The default is to return an empty string; meaning that QPrinter will try to + be smart in a system-dependent way. On X11 only, you can set it to something + different to use a specific print program. On the other platforms, this + returns an empty string. + + \sa setPrintProgram(), setPrinterSelectionOption() +*/ +QString QPrinter::printProgram() const +{ + Q_D(const QPrinter); + return d->printEngine->property(QPrintEngine::PPK_PrinterProgram).toString(); +} + + +/*! + Sets the name of the program that should do the print job to \a + printProg. + + On X11, this function sets the program to call with the PDF + output. On other platforms, it has no effect. + + \sa printProgram() +*/ +void QPrinter::setPrintProgram(const QString &printProg) +{ + Q_D(QPrinter); + ABORT_IF_ACTIVE("QPrinter::setPrintProgram"); + d->printEngine->setProperty(QPrintEngine::PPK_PrinterProgram, printProg); + d->addToManualSetList(QPrintEngine::PPK_PrinterProgram); +} + + +/*! + Returns the document name. + + \sa setDocName(), QPrintEngine::PrintEnginePropertyKey +*/ +QString QPrinter::docName() const +{ + Q_D(const QPrinter); + return d->printEngine->property(QPrintEngine::PPK_DocumentName).toString(); +} + + +/*! + Sets the document name to \a name. + + On X11, the document name is for example used as the default + output filename in QPrintDialog. Note that the document name does + not affect the file name if the printer is printing to a file. + Use the setOutputFile() function for this. + + \sa docName(), QPrintEngine::PrintEnginePropertyKey +*/ +void QPrinter::setDocName(const QString &name) +{ + Q_D(QPrinter); + ABORT_IF_ACTIVE("QPrinter::setDocName"); + d->printEngine->setProperty(QPrintEngine::PPK_DocumentName, name); + d->addToManualSetList(QPrintEngine::PPK_DocumentName); +} + + +/*! + Returns the name of the application that created the document. + + \sa setCreator() +*/ +QString QPrinter::creator() const +{ + Q_D(const QPrinter); + return d->printEngine->property(QPrintEngine::PPK_Creator).toString(); +} + + +/*! + Sets the name of the application that created the document to \a + creator. + + This function is only applicable to the X11 version of Qt. If no + creator name is specified, the creator will be set to "Qt" + followed by some version number. + + \sa creator() +*/ +void QPrinter::setCreator(const QString &creator) +{ + Q_D(QPrinter); + ABORT_IF_ACTIVE("QPrinter::setCreator"); + d->printEngine->setProperty(QPrintEngine::PPK_Creator, creator); + d->addToManualSetList(QPrintEngine::PPK_Creator); +} + + +/*! + Returns the orientation setting. This is driver-dependent, but is usually + QPrinter::Portrait. + + \sa setOrientation() +*/ +QPrinter::Orientation QPrinter::orientation() const +{ + Q_D(const QPrinter); + return QPrinter::Orientation(d->printEngine->property(QPrintEngine::PPK_Orientation).toInt()); +} + + +/*! + Sets the print orientation to \a orientation. + + The orientation can be either QPrinter::Portrait or + QPrinter::Landscape. + + The printer driver reads this setting and prints using the + specified orientation. + + On Windows, this option can be changed while printing and will + take effect from the next call to newPage(). + + On Mac OS X, changing the orientation during a print job has no effect. + + \sa orientation() +*/ + +void QPrinter::setOrientation(Orientation orientation) +{ + Q_D(QPrinter); + d->printEngine->setProperty(QPrintEngine::PPK_Orientation, orientation); + d->addToManualSetList(QPrintEngine::PPK_Orientation); +} + + +/*! + \since 4.4 + Returns the printer paper size. The default value is driver-dependent. + + \sa setPaperSize() pageRect() paperRect() +*/ + +QPrinter::PaperSize QPrinter::paperSize() const +{ + Q_D(const QPrinter); + return QPrinter::PaperSize(d->printEngine->property(QPrintEngine::PPK_PaperSize).toInt()); +} + +/*! + \since 4.4 + + Sets the printer paper size to \a newPaperSize if that size is + supported. The result is undefined if \a newPaperSize is not + supported. + + The default paper size is driver-dependent. + + This function is useful mostly for setting a default value that + the user can override in the print dialog. + + \sa paperSize() PaperSize setFullPage() setResolution() pageRect() paperRect() +*/ +void QPrinter::setPaperSize(PaperSize newPaperSize) +{ + Q_D(QPrinter); + if (d->paintEngine->type() != QPaintEngine::Pdf) + ABORT_IF_ACTIVE("QPrinter::setPaperSize"); + if (newPaperSize < 0 || newPaperSize >= NPaperSize) { + qWarning("QPrinter::setPaperSize: Illegal paper size %d", newPaperSize); + return; + } + d->printEngine->setProperty(QPrintEngine::PPK_PaperSize, newPaperSize); + d->addToManualSetList(QPrintEngine::PPK_PaperSize); + d->hasUserSetPageSize = true; +} + +/*! + \obsolete + + Returns the printer page size. The default value is driver-dependent. + + Use paperSize() instead. +*/ +QPrinter::PageSize QPrinter::pageSize() const +{ + return paperSize(); +} + + +/*! + \obsolete + + Sets the printer page size based on \a newPageSize. + + Use setPaperSize() instead. +*/ + +void QPrinter::setPageSize(PageSize newPageSize) +{ + setPaperSize(newPageSize); +} + +/*! + \since 4.4 + + Sets the paper size based on \a paperSize in \a unit. + + \sa paperSize() +*/ + +void QPrinter::setPaperSize(const QSizeF &paperSize, QPrinter::Unit unit) +{ + Q_D(QPrinter); + if (d->paintEngine->type() != QPaintEngine::Pdf) + ABORT_IF_ACTIVE("QPrinter::setPaperSize"); + const qreal multiplier = qt_multiplierForUnit(unit, resolution()); + QSizeF size(paperSize.width() * multiplier, paperSize.height() * multiplier); + d->printEngine->setProperty(QPrintEngine::PPK_CustomPaperSize, size); + d->addToManualSetList(QPrintEngine::PPK_CustomPaperSize); + d->hasUserSetPageSize = true; +} + +/*! + \since 4.4 + + Returns the paper size in \a unit. + + \sa setPaperSize() +*/ + +QSizeF QPrinter::paperSize(Unit unit) const +{ + Q_D(const QPrinter); + int res = resolution(); + const qreal multiplier = qt_multiplierForUnit(unit, res); + PaperSize paperType = paperSize(); + if (paperType == Custom) { + QSizeF size = d->printEngine->property(QPrintEngine::PPK_CustomPaperSize).toSizeF(); + return QSizeF(size.width() / multiplier, size.height() / multiplier); + } + else { + return qt_printerPaperSize(orientation(), paperType, unit, res); + } +} + +/*! + Sets the page order to \a pageOrder. + + The page order can be QPrinter::FirstPageFirst or + QPrinter::LastPageFirst. The application is responsible for + reading the page order and printing accordingly. + + This function is mostly useful for setting a default value that + the user can override in the print dialog. + + This function is only supported under X11. +*/ + +void QPrinter::setPageOrder(PageOrder pageOrder) +{ + Q_D(QPrinter); + ABORT_IF_ACTIVE("QPrinter::setPageOrder"); + d->printEngine->setProperty(QPrintEngine::PPK_PageOrder, pageOrder); + d->addToManualSetList(QPrintEngine::PPK_PageOrder); +} + + +/*! + Returns the current page order. + + The default page order is \c FirstPageFirst. +*/ + +QPrinter::PageOrder QPrinter::pageOrder() const +{ + Q_D(const QPrinter); + return QPrinter::PageOrder(d->printEngine->property(QPrintEngine::PPK_PageOrder).toInt()); +} + + +/*! + Sets the printer's color mode to \a newColorMode, which can be + either \c Color or \c GrayScale. + + \sa colorMode() +*/ + +void QPrinter::setColorMode(ColorMode newColorMode) +{ + Q_D(QPrinter); + ABORT_IF_ACTIVE("QPrinter::setColorMode"); + d->printEngine->setProperty(QPrintEngine::PPK_ColorMode, newColorMode); + d->addToManualSetList(QPrintEngine::PPK_ColorMode); +} + + +/*! + Returns the current color mode. + + \sa setColorMode() +*/ +QPrinter::ColorMode QPrinter::colorMode() const +{ + Q_D(const QPrinter); + return QPrinter::ColorMode(d->printEngine->property(QPrintEngine::PPK_ColorMode).toInt()); +} + + +/*! + \obsolete + Returns the number of copies to be printed. The default value is 1. + + On Windows, Mac OS X and X11 systems that support CUPS, this will always + return 1 as these operating systems can internally handle the number + of copies. + + On X11, this value will return the number of times the application is + required to print in order to match the number specified in the printer setup + dialog. This has been done since some printer drivers are not capable of + buffering up the copies and in those cases the application must make an + explicit call to the print code for each copy. + + Use copyCount() in conjunction with supportsMultipleCopies() instead. + + \sa setNumCopies(), actualNumCopies() +*/ + +int QPrinter::numCopies() const +{ + Q_D(const QPrinter); + return d->printEngine->property(QPrintEngine::PPK_NumberOfCopies).toInt(); +} + + +/*! + \obsolete + \since 4.6 + + Returns the number of copies that will be printed. The default + value is 1. + + This function always returns the actual value specified in the print + dialog or using setNumCopies(). + + Use copyCount() instead. + + \sa setNumCopies(), numCopies() +*/ +int QPrinter::actualNumCopies() const +{ + return copyCount(); +} + + + +/*! + \obsolete + Sets the number of copies to be printed to \a numCopies. + + The printer driver reads this setting and prints the specified + number of copies. + + Use setCopyCount() instead. + + \sa numCopies() +*/ + +void QPrinter::setNumCopies(int numCopies) +{ + Q_D(QPrinter); + ABORT_IF_ACTIVE("QPrinter::setNumCopies"); + d->printEngine->setProperty(QPrintEngine::PPK_NumberOfCopies, numCopies); + d->addToManualSetList(QPrintEngine::PPK_NumberOfCopies); +} + +/*! + \since 4.7 + + Sets the number of copies to be printed to \a count. + + The printer driver reads this setting and prints the specified number of + copies. + + \sa copyCount(), supportsMultipleCopies() +*/ + +void QPrinter::setCopyCount(int count) +{ + Q_D(QPrinter); + ABORT_IF_ACTIVE("QPrinter::setCopyCount;"); + d->printEngine->setProperty(QPrintEngine::PPK_CopyCount, count); + d->addToManualSetList(QPrintEngine::PPK_CopyCount); +} + +/*! + \since 4.7 + + Returns the number of copies that will be printed. The default value is 1. + + \sa setCopyCount(), supportsMultipleCopies() +*/ + +int QPrinter::copyCount() const +{ + Q_D(const QPrinter); + return d->printEngine->property(QPrintEngine::PPK_CopyCount).toInt(); +} + +/*! + \since 4.7 + + Returns true if the printer supports printing multiple copies of the same + document in one job; otherwise false is returned. + + On most systems this function will return true. However, on X11 systems + that do not support CUPS, this function will return false. That means the + application has to handle the number of copies by printing the same + document the required number of times. + + \sa setCopyCount(), copyCount() +*/ + +bool QPrinter::supportsMultipleCopies() const +{ + Q_D(const QPrinter); + return d->printEngine->property(QPrintEngine::PPK_SupportsMultipleCopies).toBool(); +} + +/*! + \since 4.1 + + Returns true if collation is turned on when multiple copies is selected. + Returns false if it is turned off when multiple copies is selected. + When collating is turned off the printing of each individual page will be repeated + the numCopies() amount before the next page is started. With collating turned on + all pages are printed before the next copy of those pages is started. + + \sa setCollateCopies() +*/ +bool QPrinter::collateCopies() const +{ + Q_D(const QPrinter); + return d->printEngine->property(QPrintEngine::PPK_CollateCopies).toBool(); +} + + +/*! + \since 4.1 + + Sets the default value for collation checkbox when the print + dialog appears. If \a collate is true, it will enable + setCollateCopiesEnabled(). The default value is false. This value + will be changed by what the user presses in the print dialog. + + \sa collateCopies() +*/ +void QPrinter::setCollateCopies(bool collate) +{ + Q_D(QPrinter); + ABORT_IF_ACTIVE("QPrinter::setCollateCopies"); + d->printEngine->setProperty(QPrintEngine::PPK_CollateCopies, collate); + d->addToManualSetList(QPrintEngine::PPK_CollateCopies); +} + + + +/*! + If \a fp is true, enables support for painting over the entire page; + otherwise restricts painting to the printable area reported by the + device. + + By default, full page printing is disabled. In this case, the origin + of the QPrinter's coordinate system coincides with the top-left + corner of the printable area. + + If full page printing is enabled, the origin of the QPrinter's + coordinate system coincides with the top-left corner of the paper + itself. In this case, the + \l{QPaintDevice::PaintDeviceMetric}{device metrics} will report + the exact same dimensions as indicated by \l{PaperSize}. It may not + be possible to print on the entire physical page because of the + printer's margins, so the application must account for the margins + itself. + + \sa fullPage(), setPaperSize(), width(), height(), {Printing with Qt} +*/ + +void QPrinter::setFullPage(bool fp) +{ + Q_D(QPrinter); + d->printEngine->setProperty(QPrintEngine::PPK_FullPage, fp); + d->addToManualSetList(QPrintEngine::PPK_FullPage); +} + + +/*! + Returns true if the origin of the printer's coordinate system is + at the corner of the page and false if it is at the edge of the + printable area. + + See setFullPage() for details and caveats. + + \sa setFullPage() PaperSize +*/ + +bool QPrinter::fullPage() const +{ + Q_D(const QPrinter); + return d->printEngine->property(QPrintEngine::PPK_FullPage).toBool(); +} + + +/*! + Requests that the printer prints at \a dpi or as near to \a dpi as + possible. + + This setting affects the coordinate system as returned by, for + example QPainter::viewport(). + + This function must be called before QPainter::begin() to have an effect on + all platforms. + + \sa resolution() setPaperSize() +*/ + +void QPrinter::setResolution(int dpi) +{ + Q_D(QPrinter); + ABORT_IF_ACTIVE("QPrinter::setResolution"); + d->printEngine->setProperty(QPrintEngine::PPK_Resolution, dpi); + d->addToManualSetList(QPrintEngine::PPK_Resolution); +} + + +/*! + Returns the current assumed resolution of the printer, as set by + setResolution() or by the printer driver. + + \sa setResolution() +*/ + +int QPrinter::resolution() const +{ + Q_D(const QPrinter); + return d->printEngine->property(QPrintEngine::PPK_Resolution).toInt(); +} + +/*! + Sets the paper source setting to \a source. + + Windows only: This option can be changed while printing and will + take effect from the next call to newPage() + + \sa paperSource() +*/ + +void QPrinter::setPaperSource(PaperSource source) +{ + Q_D(QPrinter); + d->printEngine->setProperty(QPrintEngine::PPK_PaperSource, source); + d->addToManualSetList(QPrintEngine::PPK_PaperSource); +} + +/*! + Returns the printer's paper source. This is \c Manual or a printer + tray or paper cassette. +*/ +QPrinter::PaperSource QPrinter::paperSource() const +{ + Q_D(const QPrinter); + return QPrinter::PaperSource(d->printEngine->property(QPrintEngine::PPK_PaperSource).toInt()); +} + + +/*! + \since 4.1 + + Enabled or disables font embedding depending on \a enable. + + Currently this option is only supported on X11. + + \sa fontEmbeddingEnabled() +*/ +void QPrinter::setFontEmbeddingEnabled(bool enable) +{ + Q_D(QPrinter); + d->printEngine->setProperty(QPrintEngine::PPK_FontEmbedding, enable); + d->addToManualSetList(QPrintEngine::PPK_FontEmbedding); +} + +/*! + \since 4.1 + + Returns true if font embedding is enabled. + + Currently this option is only supported on X11. + + \sa setFontEmbeddingEnabled() +*/ +bool QPrinter::fontEmbeddingEnabled() const +{ + Q_D(const QPrinter); + return d->printEngine->property(QPrintEngine::PPK_FontEmbedding).toBool(); +} + +/*! + \enum QPrinter::DuplexMode + \since 4.4 + + This enum is used to indicate whether printing will occur on one or both sides + of each sheet of paper (simplex or duplex printing). + + \value DuplexNone Single sided (simplex) printing only. + \value DuplexAuto The printer's default setting is used to determine whether + duplex printing is used. + \value DuplexLongSide Both sides of each sheet of paper are used for printing. + The paper is turned over its longest edge before the second + side is printed + \value DuplexShortSide Both sides of each sheet of paper are used for printing. + The paper is turned over its shortest edge before the second + side is printed +*/ + +/*! + \since 4.2 + + Enables double sided printing if \a doubleSided is true; otherwise disables it. + + Currently this option is only supported on X11. +*/ +void QPrinter::setDoubleSidedPrinting(bool doubleSided) +{ + setDuplex(doubleSided ? DuplexAuto : DuplexNone); +} + + +/*! + \since 4.2 + + Returns true if double side printing is enabled. + + Currently this option is only supported on X11. +*/ +bool QPrinter::doubleSidedPrinting() const +{ + return duplex() != DuplexNone; +} + +/*! + \since 4.4 + + Enables double sided printing based on the \a duplex mode. + + Currently this option is only supported on X11. +*/ +void QPrinter::setDuplex(DuplexMode duplex) +{ + Q_D(QPrinter); + d->printEngine->setProperty(QPrintEngine::PPK_Duplex, duplex); + d->addToManualSetList(QPrintEngine::PPK_Duplex); +} + +/*! + \since 4.4 + + Returns the current duplex mode. + + Currently this option is only supported on X11. +*/ +QPrinter::DuplexMode QPrinter::duplex() const +{ + Q_D(const QPrinter); + return static_cast (d->printEngine->property(QPrintEngine::PPK_Duplex).toInt()); +} + +/*! + \since 4.4 + + Returns the page's rectangle in \a unit; this is usually smaller + than the paperRect() since the page normally has margins between + its borders and the paper. + + \sa paperSize() +*/ +QRectF QPrinter::pageRect(Unit unit) const +{ + Q_D(const QPrinter); + int res = resolution(); + const qreal multiplier = qt_multiplierForUnit(unit, res); + // the page rect is in device pixels + QRect devRect(d->printEngine->property(QPrintEngine::PPK_PageRect).toRect()); + if (unit == DevicePixel) + return devRect; + QRectF diRect(devRect.x()*72.0/res, + devRect.y()*72.0/res, + devRect.width()*72.0/res, + devRect.height()*72.0/res); + return QRectF(diRect.x()/multiplier, diRect.y()/multiplier, + diRect.width()/multiplier, diRect.height()/multiplier); +} + + +/*! + \since 4.4 + + Returns the paper's rectangle in \a unit; this is usually larger + than the pageRect(). + + \sa pageRect() +*/ +QRectF QPrinter::paperRect(Unit unit) const +{ + Q_D(const QPrinter); + int res = resolution(); + const qreal multiplier = qt_multiplierForUnit(unit, resolution()); + // the page rect is in device pixels + QRect devRect(d->printEngine->property(QPrintEngine::PPK_PaperRect).toRect()); + if (unit == DevicePixel) + return devRect; + QRectF diRect(devRect.x()*72.0/res, + devRect.y()*72.0/res, + devRect.width()*72.0/res, + devRect.height()*72.0/res); + return QRectF(diRect.x()/multiplier, diRect.y()/multiplier, + diRect.width()/multiplier, diRect.height()/multiplier); +} + +/*! + Returns the page's rectangle; this is usually smaller than the + paperRect() since the page normally has margins between its + borders and the paper. + + The unit of the returned rectangle is DevicePixel. + + \sa paperSize() +*/ +QRect QPrinter::pageRect() const +{ + Q_D(const QPrinter); + return d->printEngine->property(QPrintEngine::PPK_PageRect).toRect(); +} + +/*! + Returns the paper's rectangle; this is usually larger than the + pageRect(). + + The unit of the returned rectangle is DevicePixel. + + \sa pageRect() +*/ +QRect QPrinter::paperRect() const +{ + Q_D(const QPrinter); + return d->printEngine->property(QPrintEngine::PPK_PaperRect).toRect(); +} + + +/*! + \since 4.4 + + This function sets the \a left, \a top, \a right and \a bottom + page margins for this printer. The unit of the margins are + specified with the \a unit parameter. +*/ +void QPrinter::setPageMargins(qreal left, qreal top, qreal right, qreal bottom, QPrinter::Unit unit) +{ + Q_D(QPrinter); + const qreal multiplier = qt_multiplierForUnit(unit, resolution()); + QList margins; + margins << (left * multiplier) << (top * multiplier) + << (right * multiplier) << (bottom * multiplier); + d->printEngine->setProperty(QPrintEngine::PPK_PageMargins, margins); + d->addToManualSetList(QPrintEngine::PPK_PageMargins); + d->hasCustomPageMargins = true; +} + +/*! + \since 4.4 + + Returns the page margins for this printer in \a left, \a top, \a + right, \a bottom. The unit of the returned margins are specified + with the \a unit parameter. +*/ +void QPrinter::getPageMargins(qreal *left, qreal *top, qreal *right, qreal *bottom, QPrinter::Unit unit) const +{ + Q_D(const QPrinter); + Q_ASSERT(left && top && right && bottom); + const qreal multiplier = qt_multiplierForUnit(unit, resolution()); + QList margins(d->printEngine->property(QPrintEngine::PPK_PageMargins).toList()); + *left = margins.at(0).toReal() / multiplier; + *top = margins.at(1).toReal() / multiplier; + *right = margins.at(2).toReal() / multiplier; + *bottom = margins.at(3).toReal() / multiplier; +} + +/*! + \internal + + Returns the metric for the given \a id. +*/ +int QPrinter::metric(PaintDeviceMetric id) const +{ + Q_D(const QPrinter); + return d->printEngine->metric(id); +} + +/*! + Returns the paint engine used by the printer. +*/ +QPaintEngine *QPrinter::paintEngine() const +{ + Q_D(const QPrinter); + return d->paintEngine; +} + +/*! + \since 4.1 + + Returns the print engine used by the printer. +*/ +QPrintEngine *QPrinter::printEngine() const +{ + Q_D(const QPrinter); + return d->printEngine; +} + +#if defined (Q_WS_WIN) +/*! + Sets the page size to be used by the printer under Windows to \a + pageSize. + + \warning This function is not portable so you may prefer to use + setPaperSize() instead. + + \sa winPageSize() +*/ +void QPrinter::setWinPageSize(int pageSize) +{ + Q_D(QPrinter); + ABORT_IF_ACTIVE("QPrinter::setWinPageSize"); + d->printEngine->setProperty(QPrintEngine::PPK_WindowsPageSize, pageSize); + d->addToManualSetList(QPrintEngine::PPK_WindowsPageSize); +} + +/*! + Returns the page size used by the printer under Windows. + + \warning This function is not portable so you may prefer to use + paperSize() instead. + + \sa setWinPageSize() +*/ +int QPrinter::winPageSize() const +{ + Q_D(const QPrinter); + return d->printEngine->property(QPrintEngine::PPK_WindowsPageSize).toInt(); +} +#endif // Q_WS_WIN + +/*! + Returns a list of the resolutions (a list of dots-per-inch + integers) that the printer says it supports. + + For X11 where all printing is directly to PDF, this + function will always return a one item list containing only the + PDF resolution, i.e., 72 (72 dpi -- but see PrinterMode). +*/ +QList QPrinter::supportedResolutions() const +{ + Q_D(const QPrinter); + QList varlist + = d->printEngine->property(QPrintEngine::PPK_SupportedResolutions).toList(); + QList intlist; + for (int i=0; iprintEngine->printerState() != QPrinter::Active) + return false; + return d->printEngine->newPage(); +} + +/*! + Aborts the current print run. Returns true if the print run was + successfully aborted and printerState() will return QPrinter::Aborted; otherwise + returns false. + + It is not always possible to abort a print job. For example, + all the data has gone to the printer but the printer cannot or + will not cancel the job when asked to. +*/ +bool QPrinter::abort() +{ + Q_D(QPrinter); + return d->printEngine->abort(); +} + +/*! + Returns the current state of the printer. This may not always be + accurate (for example if the printer doesn't have the capability + of reporting its state to the operating system). +*/ +QPrinter::PrinterState QPrinter::printerState() const +{ + Q_D(const QPrinter); + return d->printEngine->printerState(); +} + + +/*! \fn void QPrinter::margins(uint *top, uint *left, uint *bottom, uint *right) const + + Sets *\a top, *\a left, *\a bottom, *\a right to be the top, + left, bottom, and right margins. + + This function has been superseded by paperRect() and pageRect(). + Use paperRect().top() - pageRect().top() for the top margin, + paperRect().left() - pageRect().left() for the left margin, + paperRect().bottom() - pageRect().bottom() for the bottom margin, + and papaerRect().right() - pageRect().right() for the right + margin. + + \oldcode + uint rightMargin; + uint bottomMargin; + printer->margins(0, 0, &bottomMargin, &rightMargin); + \newcode + int rightMargin = printer->paperRect().right() - printer->pageRect().right(); + int bottomMargin = printer->paperRect().bottom() - printer->pageRect().bottom(); + \endcode +*/ + +/*! \fn QSize QPrinter::margins() const + + \overload + + Returns a QSize containing the left margin and the top margin. + + This function has been superseded by paperRect() and pageRect(). + Use paperRect().left() - pageRect().left() for the left margin, + and paperRect().top() - pageRect().top() for the top margin. + + \oldcode + QSize margins = printer->margins(); + int leftMargin = margins.width(); + int topMargin = margins.height(); + \newcode + int leftMargin = printer->paperRect().left() - printer->pageRect().left(); + int topMargin = printer->paperRect().top() - printer->pageRect().top(); + \endcode +*/ + +/*! \fn bool QPrinter::aborted() + + Use printerState() == QPrinter::Aborted instead. +*/ + +#ifdef Q_WS_WIN +/*! + \internal +*/ +HDC QPrinter::getDC() const +{ + Q_D(const QPrinter); + return d->printEngine->getPrinterDC(); +} + +/*! + \internal +*/ +void QPrinter::releaseDC(HDC hdc) const +{ + Q_D(const QPrinter); + d->printEngine->releasePrinterDC(hdc); +} + +/*! + Returns the supported paper sizes for this printer. + + The values will be either a value that matches an entry in the + QPrinter::PaperSource enum or a driver spesific value. The driver + spesific values are greater than the constant DMBIN_USER declared + in wingdi.h. + + \warning This function is only available in windows. +*/ + +QList QPrinter::supportedPaperSources() const +{ + Q_D(const QPrinter); + QVariant v = d->printEngine->property(QPrintEngine::PPK_PaperSources); + + QList variant_list = v.toList(); + QList int_list; + for (int i=0; iprintEngine->property(QPrintEngine::PPK_SelectionOption).toString(); +} + +void QPrinter::setPrinterSelectionOption(const QString &option) +{ + Q_D(QPrinter); + d->printEngine->setProperty(QPrintEngine::PPK_SelectionOption, option); + d->addToManualSetList(QPrintEngine::PPK_SelectionOption); +} +#endif + +/*! + \since 4.1 + \fn int QPrinter::fromPage() const + + Returns the number of the first page in a range of pages to be printed + (the "from page" setting). Pages in a document are numbered according to + the convention that the first page is page 1. + + By default, this function returns a special value of 0, meaning that + the "from page" setting is unset. + + \note If fromPage() and toPage() both return 0, this indicates that + \e{the whole document will be printed}. + + \sa setFromTo(), toPage() +*/ + +int QPrinter::fromPage() const +{ + Q_D(const QPrinter); + return d->fromPage; +} + +/*! + \since 4.1 + + Returns the number of the last page in a range of pages to be printed + (the "to page" setting). Pages in a document are numbered according to + the convention that the first page is page 1. + + By default, this function returns a special value of 0, meaning that + the "to page" setting is unset. + + \note If fromPage() and toPage() both return 0, this indicates that + \e{the whole document will be printed}. + + The programmer is responsible for reading this setting and + printing accordingly. + + \sa setFromTo(), fromPage() +*/ + +int QPrinter::toPage() const +{ + Q_D(const QPrinter); + return d->toPage; +} + +/*! + \since 4.1 + + Sets the range of pages to be printed to cover the pages with numbers + specified by \a from and \a to, where \a from corresponds to the first + page in the range and \a to corresponds to the last. + + \note Pages in a document are numbered according to the convention that + the first page is page 1. However, if \a from and \a to are both set to 0, + the \e{whole document will be printed}. + + This function is mostly used to set a default value that the user can + override in the print dialog when you call setup(). + + \sa fromPage(), toPage() +*/ + +void QPrinter::setFromTo(int from, int to) +{ + Q_D(QPrinter); + if (from > to) { + qWarning() << "QPrinter::setFromTo: 'from' must be less than or equal to 'to'"; + from = to; + } + d->fromPage = from; + d->toPage = to; + + if (d->minPage == 0 && d->maxPage == 0) { + d->minPage = 1; + d->maxPage = to; + } +} + +/*! + \since 4.1 + + Sets the print range option in to be \a range. +*/ +void QPrinter::setPrintRange( PrintRange range ) +{ + Q_D(QPrinter); + d->printRange = range; +} + +/*! + \since 4.1 + + Returns the page range of the QPrinter. After the print setup + dialog has been opened, this function returns the value selected + by the user. + + \sa setPrintRange() +*/ +QPrinter::PrintRange QPrinter::printRange() const +{ + Q_D(const QPrinter); + return d->printRange; +} + + +/*! + \class QPrintEngine + \reentrant + + \ingroup printing + + \brief The QPrintEngine class defines an interface for how QPrinter + interacts with a given printing subsystem. + + The common case when creating your own print engine is to derive from both + QPaintEngine and QPrintEngine. Various properties of a print engine are + given with property() and set with setProperty(). + + \sa QPaintEngine +*/ + +/*! + \enum QPrintEngine::PrintEnginePropertyKey + + This enum is used to communicate properties between the print + engine and QPrinter. A property may or may not be supported by a + given print engine. + + \value PPK_CollateCopies A boolean value indicating whether the + printout should be collated or not. + + \value PPK_ColorMode Refers to QPrinter::ColorMode, either color or + monochrome. + + \value PPK_Creator A string describing the document's creator. + + \value PPK_Duplex A boolean value indicating whether both sides of + the printer paper should be used for the printout. + + \value PPK_DocumentName A string describing the document name in + the spooler. + + \value PPK_FontEmbedding A boolean value indicating whether data for + the document's fonts should be embedded in the data sent to the + printer. + + \value PPK_FullPage A boolean describing if the printer should be + full page or not. + + \value PPK_NumberOfCopies Obsolete. An integer specifying the number of + copies. Use PPK_CopyCount instead. + + \value PPK_Orientation Specifies a QPrinter::Orientation value. + + \value PPK_OutputFileName The output file name as a string. An + empty file name indicates that the printer should not print to a file. + + \value PPK_PageOrder Specifies a QPrinter::PageOrder value. + + \value PPK_PageRect A QRect specifying the page rectangle + + \value PPK_PageSize Obsolete. Use PPK_PaperSize instead. + + \value PPK_PaperRect A QRect specifying the paper rectangle. + + \value PPK_PaperSource Specifies a QPrinter::PaperSource value. + + \value PPK_PaperSources Specifies more than one QPrinter::PaperSource value. + + \value PPK_PaperSize Specifies a QPrinter::PaperSize value. + + \value PPK_PrinterName A string specifying the name of the printer. + + \value PPK_PrinterProgram A string specifying the name of the + printer program used for printing, + + \value PPK_Resolution An integer describing the dots per inch for + this printer. + + \value PPK_SelectionOption + + \value PPK_SupportedResolutions A list of integer QVariants + describing the set of supported resolutions that the printer has. + + \value PPK_SuppressSystemPrintStatus Suppress the built-in dialog for showing + printing progress. As of 4.1 this only has effect on Mac OS X where, by default, + a status dialog is shown. + + \value PPK_WindowsPageSize An integer specifying a DM_PAPER entry + on Windows. + + \value PPK_CustomPaperSize A QSizeF specifying a custom paper size + in the QPrinter::Point unit. + + \value PPK_PageMargins A QList containing the left, top, + right and bottom margin values. + + \value PPK_CopyCount An integer specifying the number of copies to print. + + \value PPK_SupportsMultipleCopies A boolean value indicating whether or not + the printer supports printing multiple copies in one job. + + \value PPK_CustomBase Basis for extension. +*/ + +/*! + \fn QPrintEngine::~QPrintEngine() + + Destroys the print engine. +*/ + +/*! + \fn void QPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &value) + + Sets the print engine's property specified by \a key to the given \a value. + + \sa property() +*/ + +/*! + \fn void QPrintEngine::property(PrintEnginePropertyKey key) const + + Returns the print engine's property specified by \a key. + + \sa setProperty() +*/ + +/*! + \fn bool QPrintEngine::newPage() + + Instructs the print engine to start a new page. Returns true if + the printer was able to create the new page; otherwise returns false. +*/ + +/*! + \fn bool QPrintEngine::abort() + + Instructs the print engine to abort the printing process. Returns + true if successful; otherwise returns false. +*/ + +/*! + \fn int QPrintEngine::metric(QPaintDevice::PaintDeviceMetric id) const + + Returns the metric for the given \a id. +*/ + +/*! + \fn QPrinter::PrinterState QPrintEngine::printerState() const + + Returns the current state of the printer being used by the print engine. +*/ + +/*! + \fn HDC QPrintEngine::getPrinterDC() const + \internal +*/ + +/*! + \fn void QPrintEngine::releasePrinterDC(HDC) const + \internal +*/ + +/* + Returns the dimensions for the given paper size, \a size, in millimeters. +*/ +QSizeF qt_paperSizeToQSizeF(QPrinter::PaperSize size) +{ + if (size == QPrinter::Custom) return QSizeF(0, 0); + return QSizeF(qt_paperSizes[size][0], qt_paperSizes[size][1]); +} + +/* + Returns the PaperSize type that matches \a size, where \a size + is in millimeters. + + Because dimensions may not always be completely accurate (for + example when converting between units), a particular PaperSize + will be returned if it matches within -1/+1 millimeters. +*/ +QPrinter::PaperSize qSizeFTopaperSize(const QSizeF& size) +{ + for (int i = 0; i < static_cast(QPrinter::NPaperSize); ++i) { + if (qt_paperSizes[i][0] >= size.width() - 1 && + qt_paperSizes[i][0] <= size.width() + 1 && + qt_paperSizes[i][1] >= size.height() - 1 && + qt_paperSizes[i][1] <= size.height() + 1) { + return QPrinter::PaperSize(i); + } + } + + return QPrinter::Custom; +} + +QT_END_NAMESPACE + +#endif // QT_NO_PRINTER diff --git a/src/gui/printsupport/qprinter.h b/src/gui/printsupport/qprinter.h new file mode 100644 index 0000000000..d551489bb8 --- /dev/null +++ b/src/gui/printsupport/qprinter.h @@ -0,0 +1,283 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPRINTER_H +#define QPRINTER_H + +#include +#include +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Gui) + +#ifndef QT_NO_PRINTER + +#if defined(B0) +#undef B0 // Terminal hang-up. We assume that you do not want that. +#endif + +class QPrinterPrivate; +class QPaintEngine; +class QPrintEngine; +class QPrinterInfo; + +class Q_GUI_EXPORT QPrinter : public QPaintDevice +{ + Q_DECLARE_PRIVATE(QPrinter) +public: + enum PrinterMode { ScreenResolution, PrinterResolution, HighResolution }; + + explicit QPrinter(PrinterMode mode = ScreenResolution); + explicit QPrinter(const QPrinterInfo& printer, PrinterMode mode = ScreenResolution); + ~QPrinter(); + + int devType() const; + + enum Orientation { Portrait, Landscape }; + +#ifndef Q_QDOC + enum PageSize { A4, B5, Letter, Legal, Executive, + A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1, + B10, B2, B3, B4, B6, B7, B8, B9, C5E, Comm10E, + DLE, Folio, Ledger, Tabloid, Custom, NPageSize = Custom, NPaperSize = Custom }; + typedef PageSize PaperSize; +#else + enum PageSize { A4, B5, Letter, Legal, Executive, + A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1, + B10, B2, B3, B4, B6, B7, B8, B9, C5E, Comm10E, + DLE, Folio, Ledger, Tabloid, Custom, NPageSize = Custom }; + enum PaperSize { A4, B5, Letter, Legal, Executive, + A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1, + B10, B2, B3, B4, B6, B7, B8, B9, C5E, Comm10E, + DLE, Folio, Ledger, Tabloid, Custom, NPageSize = Custom, NPaperSize = Custom }; +#endif + + enum PageOrder { FirstPageFirst, + LastPageFirst }; + + enum ColorMode { GrayScale, + Color }; + + enum PaperSource { OnlyOne, + Lower, + Middle, + Manual, + Envelope, + EnvelopeManual, + Auto, + Tractor, + SmallFormat, + LargeFormat, + LargeCapacity, + Cassette, + FormSource, + MaxPageSource + }; + + enum PrinterState { Idle, + Active, + Aborted, + Error }; + + enum OutputFormat { NativeFormat, PdfFormat }; + + // Keep in sync with QAbstractPrintDialog::PrintRange + enum PrintRange { AllPages, Selection, PageRange, CurrentPage }; + + enum Unit { + Millimeter, + Point, + Inch, + Pica, + Didot, + Cicero, + DevicePixel + }; + + enum DuplexMode { + DuplexNone = 0, + DuplexAuto, + DuplexLongSide, + DuplexShortSide + }; + + void setOutputFormat(OutputFormat format); + OutputFormat outputFormat() const; + + void setPrinterName(const QString &); + QString printerName() const; + + bool isValid() const; + + void setOutputFileName(const QString &); + QString outputFileName()const; + + void setPrintProgram(const QString &); + QString printProgram() const; + + void setDocName(const QString &); + QString docName() const; + + void setCreator(const QString &); + QString creator() const; + + void setOrientation(Orientation); + Orientation orientation() const; + + void setPageSize(PageSize); + PageSize pageSize() const; + + void setPaperSize(PaperSize); + PaperSize paperSize() const; + + void setPaperSize(const QSizeF &paperSize, Unit unit); + QSizeF paperSize(Unit unit) const; + + void setPageOrder(PageOrder); + PageOrder pageOrder() const; + + void setResolution(int); + int resolution() const; + + void setColorMode(ColorMode); + ColorMode colorMode() const; + + void setCollateCopies(bool collate); + bool collateCopies() const; + + void setFullPage(bool); + bool fullPage() const; + + void setNumCopies(int); + int numCopies() const; + + int actualNumCopies() const; + + void setCopyCount(int); + int copyCount() const; + bool supportsMultipleCopies() const; + + void setPaperSource(PaperSource); + PaperSource paperSource() const; + + void setDuplex(DuplexMode duplex); + DuplexMode duplex() const; + + QList supportedResolutions() const; + +#ifdef Q_WS_WIN + QList supportedPaperSources() const; +#endif + + void setFontEmbeddingEnabled(bool enable); + bool fontEmbeddingEnabled() const; + + void setDoubleSidedPrinting(bool enable); + bool doubleSidedPrinting() const; + +#ifdef Q_WS_WIN + void setWinPageSize(int winPageSize); + int winPageSize() const; +#endif + + QRect paperRect() const; + QRect pageRect() const; + QRectF paperRect(Unit) const; + QRectF pageRect(Unit) const; + +#if !defined(Q_WS_WIN) || defined(qdoc) + QString printerSelectionOption() const; + void setPrinterSelectionOption(const QString &); +#endif + + bool newPage(); + bool abort(); + + PrinterState printerState() const; + + QPaintEngine *paintEngine() const; + QPrintEngine *printEngine() const; + +#ifdef Q_WS_WIN + HDC getDC() const; + void releaseDC(HDC hdc) const; +#endif + + void setFromTo(int fromPage, int toPage); + int fromPage() const; + int toPage() const; + + void setPrintRange(PrintRange range); + PrintRange printRange() const; + + void setPageMargins(qreal left, qreal top, qreal right, qreal bottom, Unit unit); + void getPageMargins(qreal *left, qreal *top, qreal *right, qreal *bottom, Unit unit) const; + +protected: + int metric(PaintDeviceMetric) const; + void setEngines(QPrintEngine *printEngine, QPaintEngine *paintEngine); + +private: + void init(PrinterMode mode); + + Q_DISABLE_COPY(QPrinter) + + QScopedPointer d_ptr; + + friend class QPrintDialogPrivate; + friend class QAbstractPrintDialog; + friend class QAbstractPrintDialogPrivate; + friend class QPrintPreviewWidgetPrivate; + friend class QTextDocument; + friend class QPageSetupWidget; +}; + +#endif // QT_NO_PRINTER + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QPRINTER_H diff --git a/src/gui/printsupport/qprinter_p.h b/src/gui/printsupport/qprinter_p.h new file mode 100644 index 0000000000..2ba0f0dbb8 --- /dev/null +++ b/src/gui/printsupport/qprinter_p.h @@ -0,0 +1,136 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPRINTER_P_H +#define QPRINTER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + + +#include "QtCore/qglobal.h" + +#ifndef QT_NO_PRINTER + +#include "QtGui/qprinter.h" +#include "QtGui/qprintengine.h" +#include "QtCore/qpointer.h" + +#include + +QT_BEGIN_NAMESPACE + +class QPrintEngine; +class QPreviewPaintEngine; +class QPicture; + +class Q_GUI_EXPORT QPrinterPrivate +{ + Q_DECLARE_PUBLIC(QPrinter) +public: + QPrinterPrivate(QPrinter *printer) + : printEngine(0) + , paintEngine(0) + , q_ptr(printer) + , printRange(QPrinter::AllPages) + , minPage(1) + , maxPage(INT_MAX) + , fromPage(0) + , toPage(0) + , use_default_engine(true) + , validPrinter(false) + , hasCustomPageMargins(false) + , hasUserSetPageSize(false) + { + } + + ~QPrinterPrivate() { + + } + + void createDefaultEngines(); +#ifndef QT_NO_PRINTPREVIEWWIDGET + QList previewPages() const; + void setPreviewMode(bool); +#endif + + void addToManualSetList(QPrintEngine::PrintEnginePropertyKey key); + + QPrinter::PrinterMode printerMode; + QPrinter::OutputFormat outputFormat; + QPrintEngine *printEngine; + QPaintEngine *paintEngine; + + QPrintEngine *realPrintEngine; + QPaintEngine *realPaintEngine; +#ifndef QT_NO_PRINTPREVIEWWIDGET + QPreviewPaintEngine *previewEngine; +#endif + + QPrinter *q_ptr; + + QPrinter::PrintRange printRange; + int minPage, maxPage, fromPage, toPage; + + uint use_default_engine : 1; + uint had_default_engines : 1; + + uint validPrinter : 1; + uint hasCustomPageMargins : 1; + uint hasUserSetPageSize : 1; + + // Used to remember which properties have been manually set by the user. + QList manualSetList; +}; + +QT_END_NAMESPACE + +#endif // QT_NO_PRINTER + +#endif // QPRINTER_P_H diff --git a/src/gui/printsupport/qprinterinfo.cpp b/src/gui/printsupport/qprinterinfo.cpp new file mode 100644 index 0000000000..0049bd248a --- /dev/null +++ b/src/gui/printsupport/qprinterinfo.cpp @@ -0,0 +1,199 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** GNU Free Documentation License +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms +** and conditions contained in a signed written agreement between you +** and Nokia. +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qprinterinfo.h" +#include "qprinterinfo_p.h" + +#ifndef QT_NO_PRINTER + +#include +#include + +QT_BEGIN_NAMESPACE + +QPrinterInfoPrivate QPrinterInfoPrivate::shared_null; + + +/*! + \class QPrinterInfo + + \brief The QPrinterInfo class gives access to information about + existing printers. + + \ingroup printing + + Use the static functions to generate a list of QPrinterInfo + objects. Each QPrinterInfo object in the list represents a single + printer and can be queried for name, supported paper sizes, and + whether or not it is the default printer. + + \since 4.4 +*/ + +/*! + \fn QList QPrinterInfo::availablePrinters() + + Returns a list of available printers on the system. +*/ + +/*! + \fn QPrinterInfo QPrinterInfo::defaultPrinter() + + Returns the default printer on the system. + + The return value should be checked using isNull() before being + used, in case there is no default printer. + + \sa isNull() +*/ + +/*! + Constructs an empty QPrinterInfo object. + + \sa isNull() +*/ +QPrinterInfo::QPrinterInfo() + : d_ptr(&QPrinterInfoPrivate::shared_null) +{ +} + +/*! + Constructs a copy of \a other. +*/ +QPrinterInfo::QPrinterInfo(const QPrinterInfo &other) + : d_ptr(new QPrinterInfoPrivate(*other.d_ptr)) +{ +} + +/*! + Constructs a QPrinterInfo object from \a printer. +*/ +QPrinterInfo::QPrinterInfo(const QPrinter &printer) + : d_ptr(&QPrinterInfoPrivate::shared_null) +{ + foreach (const QPrinterInfo &printerInfo, availablePrinters()) { + if (printerInfo.printerName() == printer.printerName()) { + d_ptr.reset(new QPrinterInfoPrivate(*printerInfo.d_ptr)); + break; + } + } +} + +/*! + \internal +*/ +QPrinterInfo::QPrinterInfo(const QString &name) + : d_ptr(new QPrinterInfoPrivate(name)) +{ +} + +/*! + Destroys the QPrinterInfo object. References to the values in the + object become invalid. +*/ +QPrinterInfo::~QPrinterInfo() +{ +} + +/*! + Sets the QPrinterInfo object to be equal to \a other. +*/ +QPrinterInfo &QPrinterInfo::operator=(const QPrinterInfo &other) +{ + Q_ASSERT(d_ptr); + d_ptr.reset(new QPrinterInfoPrivate(*other.d_ptr)); + return *this; +} + +/*! + Returns the name of the printer. + + \sa QPrinter::setPrinterName() +*/ +QString QPrinterInfo::printerName() const +{ + const Q_D(QPrinterInfo); + return d->name; +} + +/*! + Returns whether this QPrinterInfo object holds a printer definition. + + An empty QPrinterInfo object could result for example from calling + defaultPrinter() when there are no printers on the system. +*/ +bool QPrinterInfo::isNull() const +{ + const Q_D(QPrinterInfo); + return d == &QPrinterInfoPrivate::shared_null; +} + +/*! + Returns whether this printer is the default printer. +*/ +bool QPrinterInfo::isDefault() const +{ + const Q_D(QPrinterInfo); + return d->isDefault; +} + +/*! + \fn QList< QPrinter::PaperSize> QPrinterInfo::supportedPaperSizes() const + \since 4.4 + + Returns a list of supported paper sizes by the printer. + + Not all printer drivers support this query, so the list may be empty. + On Mac OS X 10.3, this function always returns an empty list. +*/ + +#ifdef Q_WS_QPA +QList QPrinterInfo::supportedPaperSizes() const +{ + const Q_D(QPrinterInfo); + if (!isNull() && !d->hasPaperSizes) { + d->paperSizes = QGuiApplicationPrivate::platformIntegration()->printerSupport()->supportedPaperSizes(*this); + d->hasPaperSizes = true; + } + return d->paperSizes; +} + +QList QPrinterInfo::availablePrinters() +{ + return QGuiApplicationPrivate::platformIntegration()->printerSupport()->availablePrinters(); +} + +QPrinterInfo QPrinterInfo::defaultPrinter() +{ + return QGuiApplicationPrivate::platformIntegration()->printerSupport()->defaultPrinter(); +} + +#endif //Q_WS_QPA + +QT_END_NAMESPACE + +#endif // QT_NO_PRINTER diff --git a/src/gui/printsupport/qprinterinfo.h b/src/gui/printsupport/qprinterinfo.h new file mode 100644 index 0000000000..72082cf299 --- /dev/null +++ b/src/gui/printsupport/qprinterinfo.h @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPRINTERINFO_H +#define QPRINTERINFO_H + +#include + +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Gui) + +#ifndef QT_NO_PRINTER +class QPrinterInfoPrivate; +class QPrinterInfoPrivateDeleter; +class Q_GUI_EXPORT QPrinterInfo +{ +public: + QPrinterInfo(); + QPrinterInfo(const QPrinterInfo &other); + QPrinterInfo(const QPrinter &printer); + ~QPrinterInfo(); + + QPrinterInfo &operator=(const QPrinterInfo &other); + + QString printerName() const; + bool isNull() const; + bool isDefault() const; + QList supportedPaperSizes() const; + + static QList availablePrinters(); + static QPrinterInfo defaultPrinter(); + +private: + QPrinterInfo(const QString &name); + +private: + friend class QPlatformPrinterSupport; + Q_DECLARE_PRIVATE(QPrinterInfo) + QScopedPointer d_ptr; +}; + +#endif // QT_NO_PRINTER + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QPRINTERINFO_H diff --git a/src/gui/printsupport/qprinterinfo_p.h b/src/gui/printsupport/qprinterinfo_p.h new file mode 100644 index 0000000000..a3c654e7b7 --- /dev/null +++ b/src/gui/printsupport/qprinterinfo_p.h @@ -0,0 +1,108 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPRINTERINFO_P_H +#define QPRINTERINFO_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "QtCore/qglobal.h" + +#ifndef QT_NO_PRINTER + +#include "QtCore/qlist.h" + +QT_BEGIN_NAMESPACE + +class QPrinterInfoPrivate +{ +public: + QPrinterInfoPrivate(const QString& name = QString()) : + name(name), isDefault(false) +#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_SYMBIAN)) || defined(Q_WS_QPA) +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + , cupsPrinterIndex(0) +#endif +#endif + , hasPaperSizes(false) + {} + ~QPrinterInfoPrivate() + {} + + static QPrinterInfoPrivate shared_null; + + QString name; + bool isDefault; + +#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_SYMBIAN)) || defined(Q_WS_QPA) +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + int cupsPrinterIndex; +#endif +#endif + mutable bool hasPaperSizes; + mutable QList paperSizes; +}; + + +class QPrinterInfoPrivateDeleter +{ +public: + static inline void cleanup(QPrinterInfoPrivate *d) + { + if (d != &QPrinterInfoPrivate::shared_null) + delete d; + } +}; + +QT_END_NAMESPACE + +#endif // QT_NO_PRINTER + +#endif // QPRINTERINFO_P_H diff --git a/src/gui/printsupport/qprinterinfo_unix.cpp b/src/gui/printsupport/qprinterinfo_unix.cpp new file mode 100644 index 0000000000..3c66481b4d --- /dev/null +++ b/src/gui/printsupport/qprinterinfo_unix.cpp @@ -0,0 +1,857 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qprinterinfo.h" +#include "qprinterinfo_p.h" + +#include +#include +#include +#include +#include +#include + +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) +# include +# include +# include +#endif + +#include + +QT_BEGIN_NAMESPACE + +#ifndef QT_NO_PRINTER + +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) +// preserver names in ascending order for the binary search +static const struct NamedPaperSize { + const char *const name; + QPrinter::PaperSize size; +} named_sizes_map[QPrinter::NPageSize] = { + { "A0", QPrinter::A0 }, + { "A1", QPrinter::A1 }, + { "A2", QPrinter::A2 }, + { "A3", QPrinter::A3 }, + { "A4", QPrinter::A4 }, + { "A5", QPrinter::A5 }, + { "A6", QPrinter::A6 }, + { "A7", QPrinter::A7 }, + { "A8", QPrinter::A8 }, + { "A9", QPrinter::A9 }, + { "B0", QPrinter::B0 }, + { "B1", QPrinter::B1 }, + { "B10", QPrinter::B10 }, + { "B2", QPrinter::B2 }, + { "B4", QPrinter::B4 }, + { "B5", QPrinter::B5 }, + { "B6", QPrinter::B6 }, + { "B7", QPrinter::B7 }, + { "B8", QPrinter::B8 }, + { "B9", QPrinter::B9 }, + { "C5E", QPrinter::C5E }, + { "Comm10E", QPrinter::Comm10E }, + { "Custom", QPrinter::Custom }, + { "DLE", QPrinter::DLE }, + { "Executive", QPrinter::Executive }, + { "Folio", QPrinter::Folio }, + { "Ledger", QPrinter::Ledger }, + { "Legal", QPrinter::Legal }, + { "Letter", QPrinter::Letter }, + { "Tabloid", QPrinter::Tabloid } +}; + +inline bool operator<(const char *name, const NamedPaperSize &data) +{ return qstrcmp(name, data.name) < 0; } +inline bool operator<(const NamedPaperSize &data, const char *name) +{ return qstrcmp(data.name, name) < 0; } + +static inline QPrinter::PaperSize string2PaperSize(const char *name) +{ + const NamedPaperSize *r = qBinaryFind(named_sizes_map, named_sizes_map + QPrinter::NPageSize, name); + if (r - named_sizes_map != QPrinter::NPageSize) + return r->size; + return QPrinter::Custom; +} + +static inline const char *paperSize2String(QPrinter::PaperSize size) +{ + for (int i = 0; i < QPrinter::NPageSize; ++i) { + if (size == named_sizes_map[i].size) + return named_sizes_map[i].name; + } + return 0; +} +#endif + +void qt_perhapsAddPrinter(QList *printers, const QString &name, + QString host, QString comment, + QStringList aliases) +{ + for (int i = 0; i < printers->size(); ++i) + if (printers->at(i).samePrinter(name)) + return; + + if (host.isEmpty()) + host = QCoreApplication::translate("QPrinter", "locally connected"); + printers->append(QPrinterDescription(name.simplified(), host.simplified(), comment.simplified(), aliases)); +} + +void qt_parsePrinterDesc(QString printerDesc, QList *printers) +{ + if (printerDesc.length() < 1) + return; + + printerDesc = printerDesc.simplified(); + int i = printerDesc.indexOf(QLatin1Char(':')); + QString printerName, printerComment, printerHost; + QStringList aliases; + + if (i >= 0) { + // have ':' want '|' + int j = printerDesc.indexOf(QLatin1Char('|')); + if (j > 0 && j < i) { + printerName = printerDesc.left(j); + aliases = printerDesc.mid(j + 1, i - j - 1).split(QLatin1Char('|')); + // try extracting a comment from the aliases + printerComment = QCoreApplication::translate("QPrinter", "Aliases: %1") + .arg(aliases.join(QLatin1String(", "))); + } else { + printerName = printerDesc.left(i); + } + // look for lprng pseudo all printers entry + i = printerDesc.indexOf(QRegExp(QLatin1String(": *all *="))); + if (i >= 0) + printerName = QString(); + // look for signs of this being a remote printer + i = printerDesc.indexOf(QRegExp(QLatin1String(": *rm *="))); + if (i >= 0) { + // point k at the end of remote host name + while (printerDesc[i] != QLatin1Char('=')) + i++; + while (printerDesc[i] == QLatin1Char('=') || printerDesc[i].isSpace()) + i++; + j = i; + while (j < (int)printerDesc.length() && printerDesc[j] != QLatin1Char(':')) + j++; + + // and stuff that into the string + printerHost = printerDesc.mid(i, j - i); + } + } + if (printerName.length()) + qt_perhapsAddPrinter(printers, printerName, printerHost, printerComment, + aliases); +} + +int qt_parsePrintcap(QList *printers, const QString& fileName) +{ + QFile printcap(fileName); + if (!printcap.open(QIODevice::ReadOnly)) + return NotFound; + + char *line_ascii = new char[1025]; + line_ascii[1024] = '\0'; + + QString printerDesc; + bool atEnd = false; + + while (!atEnd) { + if (printcap.atEnd() || printcap.readLine(line_ascii, 1024) <= 0) + atEnd = true; + QString line = QString::fromLocal8Bit(line_ascii); + line = line.trimmed(); + if (line.length() >= 1 && line[int(line.length()) - 1] == QLatin1Char('\\')) + line.chop(1); + if (line[0] == QLatin1Char('#')) { + if (!atEnd) + continue; + } else if (line[0] == QLatin1Char('|') || line[0] == QLatin1Char(':') + || line.isEmpty()) { + printerDesc += line; + if (!atEnd) + continue; + } + + qt_parsePrinterDesc(printerDesc, printers); + + // add the first line of the new printer definition + printerDesc = line; + } + delete[] line_ascii; + return Success; +} + +/*! + \internal + + Checks $HOME/.printers for a line matching '_default ' (where + does not contain any white space). The first such match + results in being returned. + If no lines match then an empty string is returned. +*/ +QString qt_getDefaultFromHomePrinters() +{ + QFile file(QDir::homePath() + QLatin1String("/.printers")); + if (!file.open(QIODevice::ReadOnly)) + return QString(); + QString all(QLatin1String(file.readAll())); + QStringList words = all.split(QRegExp(QLatin1String("\\W+")), QString::SkipEmptyParts); + const int i = words.indexOf(QLatin1String("_default")); + if (i != -1 && i < words.size() - 1) + return words.at(i + 1); + return QString(); +} + +// solaris, not 2.6 +void qt_parseEtcLpPrinters(QList *printers) +{ + QDir lp(QLatin1String("/etc/lp/printers")); + QFileInfoList dirs = lp.entryInfoList(); + if (dirs.isEmpty()) + return; + + QString tmp; + for (int i = 0; i < dirs.size(); ++i) { + QFileInfo printer = dirs.at(i); + if (printer.isDir()) { + tmp.sprintf("/etc/lp/printers/%s/configuration", + printer.fileName().toAscii().data()); + QFile configuration(tmp); + char *line = new char[1025]; + QString remote(QLatin1String("Remote:")); + QString contentType(QLatin1String("Content types:")); + QString printerHost; + bool canPrintPostscript = false; + if (configuration.open(QIODevice::ReadOnly)) { + while (!configuration.atEnd() && + configuration.readLine(line, 1024) > 0) { + if (QString::fromLatin1(line).startsWith(remote)) { + const char *p = line; + while (*p != ':') + p++; + p++; + while (isspace((uchar) *p)) + p++; + printerHost = QString::fromLocal8Bit(p); + printerHost = printerHost.simplified(); + } else if (QString::fromLatin1(line).startsWith(contentType)) { + char *p = line; + while (*p != ':') + p++; + p++; + char *e; + while (*p) { + while (isspace((uchar) *p)) + p++; + if (*p) { + char s; + e = p; + while (isalnum((uchar) *e)) + e++; + s = *e; + *e = '\0'; + if (!qstrcmp(p, "postscript") || + !qstrcmp(p, "any")) + canPrintPostscript = true; + *e = s; + if (s == ',') + e++; + p = e; + } + } + } + } + if (canPrintPostscript) + qt_perhapsAddPrinter(printers, printer.fileName(), + printerHost, QLatin1String("")); + } + delete[] line; + } + } +} + +// solaris 2.6 +char *qt_parsePrintersConf(QList *printers, bool *found) +{ + QFile pc(QLatin1String("/etc/printers.conf")); + if (!pc.open(QIODevice::ReadOnly)) { + if (found) + *found = false; + return 0; + } + if (found) + *found = true; + + char *line = new char[1025]; + line[1024] = '\0'; + + QString printerDesc; + int lineLength = 0; + + char *defaultPrinter = 0; + + while (!pc.atEnd() && + (lineLength=pc.readLine(line, 1024)) > 0) { + if (*line == '#') { + *line = '\0'; + lineLength = 0; + } + if (lineLength >= 2 && line[lineLength-2] == '\\') { + line[lineLength-2] = '\0'; + printerDesc += QString::fromLocal8Bit(line); + } else { + printerDesc += QString::fromLocal8Bit(line); + printerDesc = printerDesc.simplified(); + int i = printerDesc.indexOf(QLatin1Char(':')); + QString printerName, printerHost, printerComment; + QStringList aliases; + if (i >= 0) { + // have : want | + int j = printerDesc.indexOf(QLatin1Char('|')); + if (j >= i) + j = -1; + printerName = printerDesc.mid(0, j < 0 ? i : j); + if (printerName == QLatin1String("_default")) { + i = printerDesc.indexOf( + QRegExp(QLatin1String(": *use *="))); + while (printerDesc[i] != QLatin1Char('=')) + i++; + while (printerDesc[i] == QLatin1Char('=') || printerDesc[i].isSpace()) + i++; + j = i; + while (j < (int)printerDesc.length() && + printerDesc[j] != QLatin1Char(':') && printerDesc[j] != QLatin1Char(',')) + j++; + // that's our default printer + defaultPrinter = + qstrdup(printerDesc.mid(i, j-i).toAscii().data()); + printerName = QString(); + printerDesc = QString(); + } else if (printerName == QLatin1String("_all")) { + // skip it.. any other cases we want to skip? + printerName = QString(); + printerDesc = QString(); + } + + if (j > 0) { + // try extracting a comment from the aliases + aliases = printerDesc.mid(j + 1, i - j - 1).split(QLatin1Char('|')); + printerComment = QCoreApplication::translate("QPrinter", "Aliases: %1") + .arg(aliases.join(QLatin1String(", "))); + } + // look for signs of this being a remote printer + i = printerDesc.indexOf( + QRegExp(QLatin1String(": *bsdaddr *="))); + if (i >= 0) { + // point k at the end of remote host name + while (printerDesc[i] != QLatin1Char('=')) + i++; + while (printerDesc[i] == QLatin1Char('=') || printerDesc[i].isSpace()) + i++; + j = i; + while (j < (int)printerDesc.length() && + printerDesc[j] != QLatin1Char(':') && printerDesc[j] != QLatin1Char(',')) + j++; + // and stuff that into the string + printerHost = printerDesc.mid(i, j-i); + // maybe stick the remote printer name into the comment + if (printerDesc[j] == QLatin1Char(',')) { + i = ++j; + while (printerDesc[i].isSpace()) + i++; + j = i; + while (j < (int)printerDesc.length() && + printerDesc[j] != QLatin1Char(':') && printerDesc[j] != QLatin1Char(',')) + j++; + if (printerName != printerDesc.mid(i, j-i)) { + printerComment = + QLatin1String("Remote name: "); + printerComment += printerDesc.mid(i, j-i); + } + } + } + } + if (printerComment == QLatin1String(":")) + printerComment = QString(); // for cups + if (printerName.length()) + qt_perhapsAddPrinter(printers, printerName, printerHost, + printerComment, aliases); + // chop away the line, for processing the next one + printerDesc = QString(); + } + } + delete[] line; + return defaultPrinter; +} + +#ifndef QT_NO_NIS + +#if defined(Q_C_CALLBACKS) +extern "C" { +#endif + +int qt_pd_foreach(int /*status */, char * /*key */, int /*keyLen */, + char *val, int valLen, char *data) +{ + qt_parsePrinterDesc(QString::fromLatin1(val, valLen), (QList *)data); + return 0; +} + +#if defined(Q_C_CALLBACKS) +} +#endif + +int qt_retrieveNisPrinters(QList *printers) +{ +#ifndef QT_NO_LIBRARY + typedef int (*WildCast)(int, char *, int, char *, int, char *); + char printersConfByname[] = "printers.conf.byname"; + char *domain; + int err; + + QLibrary lib(QLatin1String("nsl")); + typedef int (*ypGetDefaultDomain)(char **); + ypGetDefaultDomain _ypGetDefaultDomain = (ypGetDefaultDomain)lib.resolve("yp_get_default_domain"); + typedef int (*ypAll)(const char *, const char *, const struct ypall_callback *); + ypAll _ypAll = (ypAll)lib.resolve("yp_all"); + + if (_ypGetDefaultDomain && _ypAll) { + err = _ypGetDefaultDomain(&domain); + if (err == 0) { + ypall_callback cb; + // wild cast to support K&R-style system headers + (WildCast &) cb.foreach = (WildCast) qt_pd_foreach; + cb.data = (char *) printers; + err = _ypAll(domain, printersConfByname, &cb); + } + if (!err) + return Success; + } +#endif //QT_NO_LIBRARY + return Unavail; +} + +#endif // QT_NO_NIS + +char *qt_parseNsswitchPrintersEntry(QList *printers, char *line) +{ +#define skipSpaces() \ + while (line[k] != '\0' && isspace((uchar) line[k])) \ + k++ + + char *defaultPrinter = 0; + bool stop = false; + int lastStatus = NotFound; + + int k = 8; + skipSpaces(); + if (line[k] != ':') + return 0; + k++; + + char *cp = strchr(line, '#'); + if (cp != 0) + *cp = '\0'; + + while (line[k] != '\0') { + if (isspace((uchar) line[k])) { + k++; + } else if (line[k] == '[') { + k++; + skipSpaces(); + while (line[k] != '\0') { + char status = tolower(line[k]); + char action = '?'; + + while (line[k] != '=' && line[k] != ']' && line[k] != '\0') + k++; + if (line[k] == '=') { + k++; + skipSpaces(); + action = tolower(line[k]); + while (line[k] != '\0' && !isspace((uchar) line[k]) && line[k] != ']') + k++; + } else if (line[k] == ']') { + k++; + break; + } + skipSpaces(); + + if (lastStatus == status) + stop = (action == (char) Return); + } + } else { + if (stop) + break; + + QByteArray source; + while (line[k] != '\0' && !isspace((uchar) line[k]) && line[k] != '[') { + source += line[k]; + k++; + } + + if (source == "user") { + lastStatus = qt_parsePrintcap(printers, + QDir::homePath() + QLatin1String("/.printers")); + } else if (source == "files") { + bool found; + defaultPrinter = qt_parsePrintersConf(printers, &found); + if (found) + lastStatus = Success; +#ifndef QT_NO_NIS + } else if (source == "nis") { + lastStatus = qt_retrieveNisPrinters(printers); +#endif + } else { + // nisplus, dns, etc., are not implemented yet + lastStatus = NotFound; + } + stop = (lastStatus == Success); + } + } + return defaultPrinter; +} + +char *qt_parseNsswitchConf(QList *printers) +{ + QFile nc(QLatin1String("/etc/nsswitch.conf")); + if (!nc.open(QIODevice::ReadOnly)) + return 0; + + char *defaultPrinter = 0; + + char *line = new char[1025]; + line[1024] = '\0'; + + while (!nc.atEnd() && + nc.readLine(line, 1024) > 0) { + if (qstrncmp(line, "printers", 8) == 0) { + defaultPrinter = qt_parseNsswitchPrintersEntry(printers, line); + delete[] line; + return defaultPrinter; + } + } + + strcpy(line, "printers: user files nis nisplus xfn"); + defaultPrinter = qt_parseNsswitchPrintersEntry(printers, line); + delete[] line; + return defaultPrinter; +} + +// HP-UX +void qt_parseEtcLpMember(QList *printers) +{ + QDir lp(QLatin1String("/etc/lp/member")); + if (!lp.exists()) + return; + QFileInfoList dirs = lp.entryInfoList(); + if (dirs.isEmpty()) + return; + + QString tmp; + for (int i = 0; i < dirs.size(); ++i) { + QFileInfo printer = dirs.at(i); + // I haven't found any real documentation, so I'm guessing that + // since lpstat uses /etc/lp/member rather than one of the + // other directories, it's the one to use. I did not find a + // decent way to locate aliases and remote printers. + if (printer.isFile()) + qt_perhapsAddPrinter(printers, printer.fileName(), + QCoreApplication::translate("QPrinter", "unknown"), + QLatin1String("")); + } +} + +// IRIX 6.x +void qt_parseSpoolInterface(QList *printers) +{ + QDir lp(QLatin1String("/usr/spool/lp/interface")); + if (!lp.exists()) + return; + QFileInfoList files = lp.entryInfoList(); + if(files.isEmpty()) + return; + + for (int i = 0; i < files.size(); ++i) { + QFileInfo printer = files.at(i); + + if (!printer.isFile()) + continue; + + // parse out some information + QFile configFile(printer.filePath()); + if (!configFile.open(QIODevice::ReadOnly)) + continue; + + QByteArray line; + line.resize(1025); + QString namePrinter; + QString hostName; + QString hostPrinter; + QString printerType; + + QString nameKey(QLatin1String("NAME=")); + QString typeKey(QLatin1String("TYPE=")); + QString hostKey(QLatin1String("HOSTNAME=")); + QString hostPrinterKey(QLatin1String("HOSTPRINTER=")); + + while (!configFile.atEnd() && + (configFile.readLine(line.data(), 1024)) > 0) { + QString uline = QString::fromLocal8Bit(line); + if (uline.startsWith(typeKey) ) { + printerType = uline.mid(nameKey.length()); + printerType = printerType.simplified(); + } else if (uline.startsWith(hostKey)) { + hostName = uline.mid(hostKey.length()); + hostName = hostName.simplified(); + } else if (uline.startsWith(hostPrinterKey)) { + hostPrinter = uline.mid(hostPrinterKey.length()); + hostPrinter = hostPrinter.simplified(); + } else if (uline.startsWith(nameKey)) { + namePrinter = uline.mid(nameKey.length()); + namePrinter = namePrinter.simplified(); + } + } + configFile.close(); + + printerType = printerType.trimmed(); + if (printerType.indexOf(QLatin1String("postscript"), 0, Qt::CaseInsensitive) < 0) + continue; + + int ii = 0; + while ((ii = namePrinter.indexOf(QLatin1Char('"'), ii)) >= 0) + namePrinter.remove(ii, 1); + + if (hostName.isEmpty() || hostPrinter.isEmpty()) { + qt_perhapsAddPrinter(printers, printer.fileName(), + QLatin1String(""), namePrinter); + } else { + QString comment; + comment = namePrinter; + comment += QLatin1String(" ("); + comment += hostPrinter; + comment += QLatin1Char(')'); + qt_perhapsAddPrinter(printers, printer.fileName(), + hostName, comment); + } + } +} + + +// Every unix must have its own. It's a standard. Here is AIX. +void qt_parseQconfig(QList *printers) +{ + QFile qconfig(QLatin1String("/etc/qconfig")); + if (!qconfig.open(QIODevice::ReadOnly)) + return; + + QTextStream ts(&qconfig); + QString line; + + QString stanzaName; // either a queue or a device name + bool up = true; // queue up? default true, can be false + QString remoteHost; // null if local + QString deviceName; // null if remote + + QRegExp newStanza(QLatin1String("^[0-z\\-]*:$")); + + // our basic strategy here is to process each line, detecting new + // stanzas. each time we see a new stanza, we check if the + // previous stanza was a valid queue for a) a remote printer or b) + // a local printer. if it wasn't, we assume that what we see is + // the start of the first stanza, or that the previous stanza was + // a device stanza, or that there is some syntax error (we don't + // report those). + + do { + line = ts.readLine(); + bool indented = line[0].isSpace(); + line = line.simplified(); + + int i = line.indexOf(QLatin1Char('=')); + if (indented && i != -1) { // line in stanza + QString variable = line.left(i).simplified(); + QString value=line.mid(i+1, line.length()).simplified(); + if (variable == QLatin1String("device")) + deviceName = value; + else if (variable == QLatin1String("host")) + remoteHost = value; + else if (variable == QLatin1String("up")) + up = !(value.toLower() == QLatin1String("false")); + } else if (line[0] == QLatin1Char('*')) { // comment + // nothing to do + } else if (ts.atEnd() || // end of file, or beginning of new stanza + (!indented && line.contains(newStanza))) { + if (up && stanzaName.length() > 0 && stanzaName.length() < 21) { + if (remoteHost.length()) // remote printer + qt_perhapsAddPrinter(printers, stanzaName, remoteHost, + QString()); + else if (deviceName.length()) // local printer + qt_perhapsAddPrinter(printers, stanzaName, QString(), + QString()); + } + line.chop(1); + if (line.length() >= 1 && line.length() <= 20) + stanzaName = line; + up = true; + remoteHost.clear(); + deviceName.clear(); + } else { + // syntax error? ignore. + } + } while (!ts.atEnd()); +} + +Q_GUI_EXPORT int qt_getLprPrinters(QList& printers) +{ + QByteArray etcLpDefault; + qt_parsePrintcap(&printers, QLatin1String("/etc/printcap")); + qt_parseEtcLpMember(&printers); + qt_parseSpoolInterface(&printers); + qt_parseQconfig(&printers); + + QFileInfo f; + f.setFile(QLatin1String("/etc/lp/printers")); + if (f.isDir()) { + qt_parseEtcLpPrinters(&printers); + QFile def(QLatin1String("/etc/lp/default")); + if (def.open(QIODevice::ReadOnly)) { + etcLpDefault.resize(1025); + if (def.readLine(etcLpDefault.data(), 1024) > 0) { + QRegExp rx(QLatin1String("^(\\S+)")); + if (rx.indexIn(QString::fromLatin1(etcLpDefault)) != -1) + etcLpDefault = rx.cap(1).toAscii(); + } + } + } + + char *def = 0; + f.setFile(QLatin1String("/etc/nsswitch.conf")); + if (f.isFile()) { + def = qt_parseNsswitchConf(&printers); + } else { + f.setFile(QLatin1String("/etc/printers.conf")); + if (f.isFile()) + def = qt_parsePrintersConf(&printers); + } + + if (def) { + etcLpDefault = def; + delete [] def; + } + + QString homePrintersDefault = qt_getDefaultFromHomePrinters(); + + // all printers hopefully known. try to find a good default + QString dollarPrinter; + { + dollarPrinter = QString::fromLocal8Bit(qgetenv("PRINTER")); + if (dollarPrinter.isEmpty()) + dollarPrinter = QString::fromLocal8Bit(qgetenv("LPDEST")); + if (dollarPrinter.isEmpty()) + dollarPrinter = QString::fromLocal8Bit(qgetenv("NPRINTER")); + if (dollarPrinter.isEmpty()) + dollarPrinter = QString::fromLocal8Bit(qgetenv("NGPRINTER")); + if (!dollarPrinter.isEmpty()) + qt_perhapsAddPrinter(&printers, dollarPrinter, + QCoreApplication::translate("QPrinter", "unknown"), + QLatin1String("")); + } + + QRegExp ps(QLatin1String("[^a-z]ps(?:[^a-z]|$)")); + QRegExp lp(QLatin1String("[^a-z]lp(?:[^a-z]|$)")); + + int quality = 0; + int best = 0; + for (int i = 0; i < printers.size(); ++i) { + QString name = printers.at(i).name; + QString comment = printers.at(i).comment; + if (quality < 5 && name == dollarPrinter) { + best = i; + quality = 5; + } else if (quality < 4 && !homePrintersDefault.isEmpty() && + name == homePrintersDefault) { + best = i; + quality = 4; + } else if (quality < 3 && !etcLpDefault.isEmpty() && + name == QLatin1String(etcLpDefault)) { + best = i; + quality = 3; + } else if (quality < 2 && + (name == QLatin1String("ps") || + ps.indexIn(comment) != -1)) { + best = i; + quality = 2; + } else if (quality < 1 && + (name == QLatin1String("lp") || + lp.indexIn(comment) > -1)) { + best = i; + quality = 1; + } + } + + return best; +} + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +QList qt_getCupsPrinterPaperSizes(int cupsPrinterIndex) +{ + QList result; +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + if (!QCUPSSupport::isAvailable() || cupsPrinterIndex < 0) + return result; + // Find paper sizes from CUPS. + QCUPSSupport cups; + cups.setCurrentPrinter(cupsPrinterIndex); + if (const ppd_option_t* size = cups.pageSizes()) { + for (int j = 0; j < size->num_choices; ++j) + result.append(string2PaperSize(size->choices[j].choice)); + } + return result; +#endif +} + +#endif // QT_NO_PRINTER + +QT_END_NAMESPACE diff --git a/src/gui/printsupport/qprinterinfo_unix_p.h b/src/gui/printsupport/qprinterinfo_unix_p.h new file mode 100644 index 0000000000..f8721deaa9 --- /dev/null +++ b/src/gui/printsupport/qprinterinfo_unix_p.h @@ -0,0 +1,130 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPRINTERINFO_UNIX_P_H +#define QPRINTERINFO_UNIX_P_H + +#include +#include + +#ifndef QT_NO_NIS +# ifndef BOOL_DEFINED +# define BOOL_DEFINED +# endif + +# include +# include +# include +# include +#endif // QT_NO_NIS + +#ifdef Success +# undef Success +#endif + +#include + +QT_BEGIN_NAMESPACE + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#ifndef QT_NO_PRINTER + +struct QPrinterDescription { + QPrinterDescription(const QString &n, const QString &h, const QString &c, const QStringList &a) + : name(n), host(h), comment(c), aliases(a) {} + QString name; + QString host; + QString comment; + QStringList aliases; + bool samePrinter(const QString& printer) const { + return name == printer || aliases.contains(printer); + } +}; + +enum { Success = 's', Unavail = 'u', NotFound = 'n', TryAgain = 't' }; +enum { Continue = 'c', Return = 'r' }; + +void qt_perhapsAddPrinter(QList *printers, const QString &name, + QString host, QString comment, + QStringList aliases = QStringList()); +void qt_parsePrinterDesc(QString printerDesc, QList *printers); + +int qt_parsePrintcap(QList *printers, const QString& fileName); +QString qt_getDefaultFromHomePrinters(); +void qt_parseEtcLpPrinters(QList *printers); +char *qt_parsePrintersConf(QList *printers, bool *found = 0); + +#ifndef QT_NO_NIS +#if defined(Q_C_CALLBACKS) +extern "C" { +#endif +int qt_pd_foreach(int /*status */, char * /*key */, int /*keyLen */, + char *val, int valLen, char *data); + +#if defined(Q_C_CALLBACKS) +} +#endif +int qt_retrieveNisPrinters(QList *printers); +#endif // QT_NO_NIS +char *qt_parseNsswitchPrintersEntry(QList *printers, char *line); +char *qt_parseNsswitchConf(QList *printers); +void qt_parseEtcLpMember(QList *printers); +void qt_parseSpoolInterface(QList *printers); +void qt_parseQconfig(QList *printers); +int qt_getLprPrinters(QList& printers); + +QList qt_getCupsPrinterPaperSizes(int cupsPrinterIndex); + +#endif // QT_NO_PRINTER + +QT_END_NAMESPACE + +#endif // QPRINTERINFO_UNIX_P_H -- cgit v1.2.3