📄 qprintengine_ps.cpp
字号:
pr.prepend(QLatin1String("-P")); (void)execlp(d->printProgram.toLocal8Bit().data(), d->printProgram.toLocal8Bit().data(), pr.toLocal8Bit().data(), (char *)0); } else { // if no print program has been specified, be smart // about the option string too. QList<QByteArray> lprhack; QList<QByteArray> lphack; QByteArray media; if (!pr.isEmpty() || !d->selectionOption.isEmpty()) { if (!d->selectionOption.isEmpty()) { QStringList list = d->selectionOption.split(QChar(' ')); 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()); } char ** lpargs = new char *[lphack.size()+6]; 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(d->pageSize)) { lpargs[++i] = "-o"; lpargs[++i] = (char *)QPdf::paperSizeToString(d->pageSize); lpargs[++i] = "-o"; media = "media="; media += QPdf::paperSizeToString(d->pageSize); lpargs[++i] = (char *)media.constData(); }#endif lpargs[++i] = 0; char **lprargs = new char *[lprhack.size()+2]; 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); } // 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. ::close(0); (void)::sleep(1); ::exit(0); } // parent process ::close(fds[0]); d->fd = fds[1]; } if (d->fd < 0) return false; d->pageCount = 1; // initialize state d->pen = QPen(Qt::black); d->brush = Qt::NoBrush; d->hasPen = true; d->hasBrush = false; d->clipEnabled = false; d->allClipped = false; d->boundingBox = QRect(); d->fontsUsed = ""; setActive(true); d->printerState = QPrinter::Active; newPage(); return true;}bool QPSPrintEngine::end(){ Q_D(QPSPrintEngine); // we're writing to lp/lpr through a pipe, we don't want to crash with SIGPIPE // if lp/lpr dies ignoreSigPipe(true); d->flushPage(true); QByteArray trailer; QPdf::ByteStream s(&trailer); s << "%%Trailer\n"; s << "%%Pages: " << d->pageCount - 1 << "\n" << wrapDSC("%%DocumentFonts: " + d->fontsUsed); s << "%%EOF\n"; d->outDevice->write(trailer); ignoreSigPipe(false); if (d->outDevice) d->outDevice->close(); if (d->fd >= 0) ::close(d->fd); d->fd = -1; delete d->outDevice; d->outDevice = 0; qDeleteAll(d->fonts); d->fonts.clear(); d->firstPage = true; setActive(false); d->printerState = QPrinter::Idle; d->pdev = 0; if (d->pid) { (void)::waitpid(d->pid, 0, 0); d->pid = 0; } return true;}void QPSPrintEngine::setBrush(){ Q_D(QPSPrintEngine);#if 0 bool specifyColor; int gStateObject = 0; int patternObject = d->addBrushPattern(brush, d->stroker.matrix, brushOrigin, &specifyColor, &gStateObject); *d->currentPage << (patternObject ? "/PCSp cs " : "/CSp cs "); if (specifyColor) { QColor rgba = brush.color(); *d->currentPage << rgba.redF() << rgba.greenF() << rgba.blueF(); } if (patternObject) *d->currentPage << "/Pat" << patternObject; *d->currentPage << "scn\n";#endif QColor rgba = d->brush.color(); *d->currentPage << rgba.redF() << rgba.greenF() << rgba.blueF() << "scn\n"; *d->currentPage << "/BSt " << d->brush.style() << "def\n";}void QPSPrintEngine::drawImageInternal(const QRectF &r, QImage image, bool bitmap){ Q_D(QPSPrintEngine); if (d->clipEnabled && d->allClipped) return; if (bitmap && image.depth() != 1) bitmap = false; QImage mask; if (!bitmap) { if (image.format() == QImage::Format_Mono || image.format() == QImage::Format_MonoLSB) image = image.convertToFormat(QImage::Format_Indexed8); if (image.hasAlphaChannel()) { // get better alpha dithering int xscale = image.width(); xscale *= xscale <= 800 ? 4 : (xscale <= 1600 ? 2 : 1); int yscale = image.height(); yscale *= yscale <= 800 ? 4 : (yscale <= 1600 ? 2 : 1); image = image.scaled(xscale, yscale); mask = image.createAlphaMask(Qt::OrderedAlphaDither); } } *d->currentPage << "q\n" << QPdf::generateMatrix(d->stroker.matrix); QBrush b = d->brush; if (image.depth() == 1) { if (d->backgroundMode == Qt::OpaqueMode) { // draw background d->brush = d->backgroundBrush; setBrush(); *d->currentPage << r.x() << r.y() << r.width() << r.height() << "re f\n"; } // set current pen as brush d->brush = d->pen.brush(); setBrush(); } d->drawImage(r.x(), r.y(), r.width(), r.height(), image, mask); *d->currentPage << "Q\n"; d->brush = b;}void QPSPrintEngine::drawImage(const QRectF &r, const QImage &img, const QRectF &sr, Qt::ImageConversionFlags){ QImage image = img.copy(sr.toRect()); drawImageInternal(r, image, false);}void QPSPrintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr){ QImage img = pm.copy(sr.toRect()).toImage(); drawImageInternal(r, img, true);}void QPSPrintEngine::drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &p){ Q_D(QPSPrintEngine); if (d->clipEnabled && d->allClipped) return; // ### Optimise implementation! qreal yPos = r.y(); qreal yOff = p.y(); while(yPos < r.y() + r.height()) { qreal drawH = pixmap.height() - yOff; // Cropping first row if (yPos + drawH > r.y() + r.height()) // Cropping last row drawH = r.y() + r.height() - yPos; qreal xPos = r.x(); qreal xOff = p.x(); while(xPos < r.x() + r.width()) { qreal drawW = pixmap.width() - xOff; // Cropping first column if (xPos + drawW > r.x() + r.width()) // Cropping last column drawW = r.x() + r.width() - xPos; // ######## painter()->drawPixmap(QPointF(xPos, yPos).toPoint(), pixmap, QRectF(xOff, yOff, drawW, drawH).toRect()); xPos += drawW; xOff = 0; } yPos += drawH; yOff = 0; }}bool QPSPrintEngine::newPage(){ Q_D(QPSPrintEngine); // we're writing to lp/lpr through a pipe, we don't want to crash with SIGPIPE // if lp/lpr dies ignoreSigPipe(true); if (!d->firstPage) d->flushPage(); d->firstPage = false; ignoreSigPipe(false); delete d->currentPage; d->currentPage = new QPdfPage; d->stroker.stream = d->currentPage; return true;}bool QPSPrintEngine::abort(){ // ### abort!?! return false;}QRect QPSPrintEnginePrivate::paperRect() const{ QPdf::PaperSize s = QPdf::paperSize(pageSize); int w = qRound(s.width*resolution/72.); int h = qRound(s.height*resolution/72.); if (orientation == QPrinter::Portrait) return QRect(0, 0, w, h); else return QRect(0, 0, h, w);}QRect QPSPrintEnginePrivate::pageRect() const{ QRect r = paperRect(); if (fullPage) return r; // would be nice to get better margins than this. return QRect(resolution/3, resolution/3, r.width()-2*resolution/3, r.height()-2*resolution/3);}int QPSPrintEngine::metric(QPaintDevice::PaintDeviceMetric metricType) const{ Q_D(const QPSPrintEngine); int val; QRect r = d->fullPage ? d->paperRect() : d->pageRect(); switch (metricType) { case QPaintDevice::PdmWidth: val = r.width(); break; case QPaintDevice::PdmHeight: val = r.height(); break; case QPaintDevice::PdmDpiX: val = d->resolution; break; case QPaintDevice::PdmDpiY: val = d->resolution; break; case QPaintDevice::PdmPhysicalDpiX: case QPaintDevice::PdmPhysicalDpiY: val = 1200; break; case QPaintDevice::PdmWidthMM: val = qRound(r.width()*25.4/d->resolution); break; case QPaintDevice::PdmHeightMM: val = qRound(r.height()*25.4/d->resolution); break; case QPaintDevice::PdmNumColors: val = INT_MAX; break; case QPaintDevice::PdmDepth: val = 32; break; default: qWarning("QPrinter::metric: Invalid metric command"); return 0; } return val;}QPrinter::PrinterState QPSPrintEngine::printerState() const{ Q_D(const QPSPrintEngine); return d->printerState;}void QPSPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &value){ Q_D(QPSPrintEngine); switch (key) { case PPK_CollateCopies: d->collate = value.toBool(); break; case PPK_ColorMode: d->colorMode = QPrinter::ColorMode(value.toInt()); 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_NumberOfCopies: d->copies = value.toInt(); break; case PPK_Orientation: d->orientation = QPrinter::Orientation(value.toInt()); break; case PPK_OutputFileName: d->outputFileName = value.toString(); break; case PPK_PageOrder: d->pageOrder = QPrinter::PageOrder(value.toInt()); break; case PPK_PageSize: d->pageSize = QPrinter::PageSize(value.toInt()); 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; default: break; }}QVariant QPSPrintEngine::property(PrintEnginePropertyKey key) const{ Q_D(const QPSPrintEngine); QVariant ret; switch (key) { case PPK_CollateCopies: ret = d->collate; break; case PPK_ColorMode: ret = d->colorMode; break; case PPK_Creator: ret = d->creator; break; case PPK_DocumentName: ret = d->title; break; case PPK_FullPage: ret = d->fullPage; break; case PPK_NumberOfCopies: ret = d->copies; break; case PPK_Orientation: ret = d->orientation; break; case PPK_OutputFileName: ret = d->outputFileName; break; case PPK_PageOrder: ret = d->pageOrder; break; case PPK_PageSize: ret = d->pageSize; 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<QVariant>() << 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; default: break; } return ret;}#endif // QT_NO_PRINTER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -