diff options
Diffstat (limited to 'src/printsupport')
-rw-r--r-- | src/printsupport/doc/qtprintsupport.qdocconf | 1 | ||||
-rw-r--r-- | src/printsupport/kernel/qcups.cpp | 152 | ||||
-rw-r--r-- | src/printsupport/kernel/qpaintengine_alpha.cpp | 40 | ||||
-rw-r--r-- | src/printsupport/kernel/qpaintengine_alpha_p.h | 4 | ||||
-rw-r--r-- | src/printsupport/kernel/qprintengine_win.cpp | 8 |
5 files changed, 89 insertions, 116 deletions
diff --git a/src/printsupport/doc/qtprintsupport.qdocconf b/src/printsupport/doc/qtprintsupport.qdocconf index 4d1f0c39f1..2ec33f6600 100644 --- a/src/printsupport/doc/qtprintsupport.qdocconf +++ b/src/printsupport/doc/qtprintsupport.qdocconf @@ -2,7 +2,6 @@ include($QT_INSTALL_DOCS/global/qt-module-defaults.qdocconf) project = QtPrintSupport description = Qt Print Support Reference Documentation -url = http://qt-project.org/doc/qt-$QT_VER version = $QT_VERSION examplesinstallpath = printsupport diff --git a/src/printsupport/kernel/qcups.cpp b/src/printsupport/kernel/qcups.cpp index c6e3ddb54d..3a92f9b6db 100644 --- a/src/printsupport/kernel/qcups.cpp +++ b/src/printsupport/kernel/qcups.cpp @@ -67,61 +67,49 @@ void QCUPSSupport::setCupsOption(QStringList &cupsOptions, const QString &option } } -void QCUPSSupport::setJobHold(QPrinter *printer, const JobHoldUntil jobHold, const QTime &holdUntilTime) +static inline QString jobHoldToString(const QCUPSSupport::JobHoldUntil jobHold, const QTime holdUntilTime) { - QStringList cupsOptions = cupsOptionsList(printer); - switch (jobHold) { - case NoHold: //default - break; - case Indefinite: - setCupsOption(cupsOptions, - QStringLiteral("job-hold-until"), - QStringLiteral("indefinite")); - break; - case DayTime: - setCupsOption(cupsOptions, - QStringLiteral("job-hold-until"), - QStringLiteral("day-time")); - break; - case Night: - setCupsOption(cupsOptions, - QStringLiteral("job-hold-until"), - QStringLiteral("night")); - break; - case SecondShift: - setCupsOption(cupsOptions, - QStringLiteral("job-hold-until"), - QStringLiteral("second-shift")); - break; - case ThirdShift: - setCupsOption(cupsOptions, - QStringLiteral("job-hold-until"), - QStringLiteral("third-shift")); - break; - case Weekend: - setCupsOption(cupsOptions, - QStringLiteral("job-hold-until"), - QStringLiteral("weekend")); - break; - case SpecificTime: - if (holdUntilTime.isNull()) { - setJobHold(printer, NoHold); - return; + case QCUPSSupport::Indefinite: + return QStringLiteral("indefinite"); + case QCUPSSupport::DayTime: + return QStringLiteral("day-time"); + case QCUPSSupport::Night: + return QStringLiteral("night"); + case QCUPSSupport::SecondShift: + return QStringLiteral("second-shift"); + case QCUPSSupport::ThirdShift: + return QStringLiteral("third-shift"); + case QCUPSSupport::Weekend: + return QStringLiteral("weekend"); + case QCUPSSupport::SpecificTime: + if (!holdUntilTime.isNull()) { + // CUPS expects the time in UTC, user has entered in local time, so get the UTS equivalent + QDateTime localDateTime = QDateTime::currentDateTime(); + // Check if time is for tomorrow in case of DST change overnight + if (holdUntilTime < localDateTime.time()) + localDateTime = localDateTime.addDays(1); + localDateTime.setTime(holdUntilTime); + return localDateTime.toUTC().time().toString(QStringLiteral("HH:mm")); } - // CUPS expects the time in UTC, user has entered in local time, so get the UTS equivalent - QDateTime localDateTime = QDateTime::currentDateTime(); - // Check if time is for tomorrow in case of DST change overnight - if (holdUntilTime < localDateTime.time()) - localDateTime = localDateTime.addDays(1); - localDateTime.setTime(holdUntilTime); + // else fall through: + case QCUPSSupport::NoHold: + return QString(); + } + Q_UNREACHABLE(); + return QString(); +} + +void QCUPSSupport::setJobHold(QPrinter *printer, const JobHoldUntil jobHold, const QTime &holdUntilTime) +{ + const QString jobHoldUntilArgument = jobHoldToString(jobHold, holdUntilTime); + if (!jobHoldUntilArgument.isEmpty()) { + QStringList cupsOptions = cupsOptionsList(printer); setCupsOption(cupsOptions, QStringLiteral("job-hold-until"), - localDateTime.toUTC().time().toString(QStringLiteral("HH:mm"))); - break; + jobHoldUntilArgument); + setCupsOptions(printer, cupsOptions); } - - setCupsOptions(printer, cupsOptions); } void QCUPSSupport::setJobBilling(QPrinter *printer, const QString &jobBilling) @@ -138,58 +126,26 @@ void QCUPSSupport::setJobPriority(QPrinter *printer, int priority) setCupsOptions(printer, cupsOptions); } -void QCUPSSupport::setBannerPages(QPrinter *printer, const BannerPage startBannerPage, const BannerPage endBannerPage) +static inline QString bannerPageToString(const QCUPSSupport::BannerPage bannerPage) { - QStringList cupsOptions = cupsOptionsList(printer); - QString startBanner, endBanner; - - switch (startBannerPage) { - case NoBanner: - startBanner = QStringLiteral("none"); - break; - case Standard: - startBanner = QStringLiteral("standard"); - break; - case Unclassified: - startBanner = QStringLiteral("unclassified"); - break; - case Confidential: - startBanner = QStringLiteral("confidential"); - break; - case Classified: - startBanner = QStringLiteral("classified"); - break; - case Secret: - startBanner = QStringLiteral("secret"); - break; - case TopSecret: - startBanner = QStringLiteral("topsecret"); - break; + switch (bannerPage) { + case QCUPSSupport::NoBanner: return QStringLiteral("none"); + case QCUPSSupport::Standard: return QStringLiteral("standard"); + case QCUPSSupport::Unclassified: return QStringLiteral("unclassified"); + case QCUPSSupport::Confidential: return QStringLiteral("confidential"); + case QCUPSSupport::Classified: return QStringLiteral("classified"); + case QCUPSSupport::Secret: return QStringLiteral("secret"); + case QCUPSSupport::TopSecret: return QStringLiteral("topsecret"); } + Q_UNREACHABLE(); + return QString(); +}; - switch (endBannerPage) { - case NoBanner: - endBanner = QStringLiteral("none"); - break; - case Standard: - endBanner = QStringLiteral("standard"); - break; - case Unclassified: - endBanner = QStringLiteral("unclassified"); - break; - case Confidential: - endBanner = QStringLiteral("confidential"); - break; - case Classified: - endBanner = QStringLiteral("classified"); - break; - case Secret: - endBanner = QStringLiteral("secret"); - break; - case TopSecret: - endBanner = QStringLiteral("topsecret"); - break; - } +void QCUPSSupport::setBannerPages(QPrinter *printer, const BannerPage startBannerPage, const BannerPage endBannerPage) +{ + QStringList cupsOptions = cupsOptionsList(printer); + const QString startBanner = bannerPageToString(startBannerPage); + const QString endBanner = bannerPageToString(endBannerPage); setCupsOption(cupsOptions, QStringLiteral("job-sheets"), startBanner + QLatin1Char(',') + endBanner); setCupsOptions(printer, cupsOptions); diff --git a/src/printsupport/kernel/qpaintengine_alpha.cpp b/src/printsupport/kernel/qpaintengine_alpha.cpp index 6d292a6a71..cdf5570979 100644 --- a/src/printsupport/kernel/qpaintengine_alpha.cpp +++ b/src/printsupport/kernel/qpaintengine_alpha.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtGui module of the Qt Toolkit. @@ -166,11 +166,14 @@ void QAlphaPaintEngine::drawPath(const QPainterPath &path) if (d->m_pass == 0) { d->m_continueCall = false; - if (d->m_hasalpha || d->m_advancedPen || d->m_advancedBrush + if (d->canSeeTroughBackground(d->m_hasalpha, tr) || d->m_advancedPen || d->m_advancedBrush || d->m_emulateProjectiveTransforms) { d->addAlphaRect(tr); } + + d->addDirtyRect(tr); + if (d->m_picengine) d->m_picengine->drawPath(path); } else { @@ -192,12 +195,14 @@ void QAlphaPaintEngine::drawPolygon(const QPointF *points, int pointCount, Polyg if (d->m_pass == 0) { d->m_continueCall = false; - if (d->m_hasalpha || d->m_advancedPen || d->m_advancedBrush + if (d->canSeeTroughBackground(d->m_hasalpha, tr) || d->m_advancedPen || d->m_advancedBrush || d->m_emulateProjectiveTransforms) { d->addAlphaRect(tr); } + d->addDirtyRect(tr); + if (d->m_picengine) d->m_picengine->drawPolygon(points, pointCount, mode); } else { @@ -212,10 +217,12 @@ void QAlphaPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QRe 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()) { + if (d->canSeeTroughBackground(pm.hasAlpha() || d->m_alphaOpacity, tr) || d->m_complexTransform || pm.isQBitmap()) { d->addAlphaRect(tr); } + d->addDirtyRect(tr); + if (d->m_picengine) d->m_picengine->drawPixmap(r, pm, sr); @@ -233,9 +240,12 @@ void QAlphaPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem if (d->m_pass == 0) { d->m_continueCall = false; - if (d->m_alphaPen || d->m_alphaOpacity || d->m_advancedPen) { + if (d->canSeeTroughBackground(d->m_alphaPen || d->m_alphaOpacity, tr) || d->m_advancedPen) { d->addAlphaRect(tr); } + + d->addDirtyRect(tr); + if (d->m_picengine) { d->m_picengine->drawTextItem(p, textItem); } @@ -252,9 +262,12 @@ void QAlphaPaintEngine::drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, if (d->m_pass == 0) { d->m_continueCall = false; - if (pixmap.hasAlpha() || d->m_alphaOpacity || d->m_complexTransform || pixmap.isQBitmap()) { + if (d->canSeeTroughBackground(pixmap.hasAlpha() || d->m_alphaOpacity, brect) || d->m_complexTransform || pixmap.isQBitmap()) { d->addAlphaRect(brect); } + + d->addDirtyRect(brect); + if (d->m_picengine) d->m_picengine->drawTiledPixmap(r, pixmap, s); } else { @@ -413,19 +426,14 @@ QRectF QAlphaPaintEnginePrivate::addPenWidth(const QPainterPath &path) return (tmp.controlPointRect() * m_transform).boundingRect(); } -QRect QAlphaPaintEnginePrivate::toRect(const QRectF &rect) const +void QAlphaPaintEnginePrivate::addAlphaRect(const QRectF &rect) { - 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; + m_alphargn |= rect.toAlignedRect(); } -void QAlphaPaintEnginePrivate::addAlphaRect(const QRectF &rect) +bool QAlphaPaintEnginePrivate::canSeeTroughBackground(bool somethingInRectHasAlpha, const QRectF &rect) const { - m_alphargn |= toRect(rect); + return somethingInRectHasAlpha && m_dirtyrgn.intersects(rect.toAlignedRect()); } void QAlphaPaintEnginePrivate::drawAlphaImage(const QRectF &rect) @@ -477,7 +485,7 @@ void QAlphaPaintEnginePrivate::drawAlphaImage(const QRectF &rect) bool QAlphaPaintEnginePrivate::fullyContained(const QRectF &rect) const { - QRegion r(toRect(rect)); + QRegion r(rect.toAlignedRect()); return (m_cliprgn.intersected(r) == r); } diff --git a/src/printsupport/kernel/qpaintengine_alpha_p.h b/src/printsupport/kernel/qpaintengine_alpha_p.h index 8a0781d0d3..d3b10b3d3c 100644 --- a/src/printsupport/kernel/qpaintengine_alpha_p.h +++ b/src/printsupport/kernel/qpaintengine_alpha_p.h @@ -107,6 +107,7 @@ public: QRegion m_alphargn; QRegion m_cliprgn; + QRegion m_dirtyrgn; bool m_hasalpha; bool m_alphaPen; @@ -122,6 +123,9 @@ public: QPen m_pen; void addAlphaRect(const QRectF &rect); + void addDirtyRect(const QRectF &rect) { m_dirtyrgn |= rect.toAlignedRect(); } + bool canSeeTroughBackground(bool somethingInRectHasAlpha, const QRectF &rect) const; + QRectF addPenWidth(const QPainterPath &path); void drawAlphaImage(const QRectF &rect); QRect toRect(const QRectF &rect) const; diff --git a/src/printsupport/kernel/qprintengine_win.cpp b/src/printsupport/kernel/qprintengine_win.cpp index b97dc6d2c2..bf39b9309d 100644 --- a/src/printsupport/kernel/qprintengine_win.cpp +++ b/src/printsupport/kernel/qprintengine_win.cpp @@ -573,7 +573,13 @@ void QWin32PrintEngine::drawPixmap(const QRectF &targetRect, width = (tw - (x * txinc)); } - QPixmap p = pixmap.copy(tileSize * x, tileSize * y, imgw, imgh); + + QImage img(QSize(imgw, imgh), QImage::Format_RGB32); + img.fill(Qt::white); + QPainter painter(&img); + painter.drawPixmap(0,0, pixmap, tileSize * x, tileSize * y, imgw, imgh); + QPixmap p = QPixmap::fromImage(img); + HBITMAP hbitmap = qt_pixmapToWinHBITMAP(p, HBitmapNoAlpha); HDC display_dc = GetDC(0); HDC hbitmap_hdc = CreateCompatibleDC(display_dc); |