⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qprintengine_ps.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                    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 + -