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

📄 qpdf.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the QtGui module of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.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 GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include <qdebug.h>#include "qpdf_p.h"#ifndef QT_NO_PRINTER/* also adds a space at the end of the number */const char *qt_real_to_string(qreal val, char *buf) {    const char *ret = buf;    if (val < 0) {        *(buf++) = '-';        val = -val;    }    int ival = (int) val;    qreal frac = val - (qreal)ival;    int ifrac = (int)(frac * 1000000);    if (ifrac == 1000000) {        ++ival;        ifrac = 0;    }    char output[256];    int i = 0;    while (ival) {        output[i] = '0' + (ival % 10);        ++i;        ival /= 10;    }    int fact = 100000;    if (i == 0) {        *(buf++) = '0';    } else {        while (i) {            *(buf++) = output[--i];            fact /= 10;            ifrac /= 10;        }    }    if (ifrac) {        *(buf++) =  '.';        while (fact) {            *(buf++) = '0' + ((ifrac/fact) % 10);            fact /= 10;        }    }    *(buf++) = ' ';    *buf = 0;    return ret;}const char *qt_int_to_string(int val, char *buf) {    const char *ret = buf;    if (val < 0) {        *(buf++) = '-';        val = -val;    }    char output[256];    int i = 0;    while (val) {        output[i] = '0' + (val % 10);        ++i;        val /= 10;    }    if (i == 0) {        *(buf++) = '0';    } else {        while (i)            *(buf++) = output[--i];    }    *(buf++) = ' ';    *buf = 0;    return ret;}#define QT_PATH_ELEMENT(elm)QByteArray QPdf::generatePath(const QPainterPath &path, const QMatrix &matrix, PathFlags flags){    QByteArray result;    if (!path.elementCount())        return result;    ByteStream s(&result);    int start = -1;    for (int i = 0; i < path.elementCount(); ++i) {        const QPainterPath::Element &elm = path.elementAt(i);        switch (elm.type) {        case QPainterPath::MoveToElement:            if (start >= 0                && path.elementAt(start).x == path.elementAt(i-1).x                && path.elementAt(start).y == path.elementAt(i-1).y)                s << "h\n";            s << matrix.map(QPointF(elm.x, elm.y)) << "m\n";            start = i;                break;        case QPainterPath::LineToElement:            s << matrix.map(QPointF(elm.x, elm.y)) << "l\n";            break;        case QPainterPath::CurveToElement:            Q_ASSERT(path.elementAt(i+1).type == QPainterPath::CurveToDataElement);            Q_ASSERT(path.elementAt(i+2).type == QPainterPath::CurveToDataElement);            s << matrix.map(QPointF(elm.x, elm.y))              << matrix.map(QPointF(path.elementAt(i+1).x, path.elementAt(i+1).y))              << matrix.map(QPointF(path.elementAt(i+2).x, path.elementAt(i+2).y))              << "c\n";            i += 2;            break;        default:            qFatal("QPdf::generatePath(), unhandled type: %d", elm.type);        }    }    if (start >= 0        && path.elementAt(start).x == path.elementAt(path.elementCount()-1).x        && path.elementAt(start).y == path.elementAt(path.elementCount()-1).y)        s << "h\n";    Qt::FillRule fillRule = path.fillRule();    const char *op = 0;    switch (flags) {    case ClipPath:        op = (fillRule == Qt::WindingFill) ? "W n\n" : "W* n\n";        break;    case FillPath:        op = (fillRule == Qt::WindingFill) ? "f\n" : "f*\n";        break;    case StrokePath:        op = "S\n";        break;    case FillAndStrokePath:        op = (fillRule == Qt::WindingFill) ? "B\n" : "B*\n";        break;    }    s << op;    return result;}QByteArray QPdf::generateMatrix(const QMatrix &matrix){    QByteArray result;    ByteStream s(&result);    s << matrix.m11()      << matrix.m12()      << matrix.m21()      << matrix.m22()      << matrix.dx()      << matrix.dy()      << "cm\n";    return result;}QByteArray QPdf::generateDashes(const QPen &pen){    QByteArray result;    ByteStream s(&result);    s << "[";    QVector<qreal> dasharray = pen.dashPattern();    qreal w = pen.widthF();    if (w < 0.001)        w = 1;    for (int i = 0; i < dasharray.size(); ++i) {        qreal dw = dasharray.at(i)*w;        if (dw < 0.0001) dw = 0.0001;        s << dw;    }    s << "]";    //qDebug() << "dasharray: pen has" << dasharray;    //qDebug() << "  => " << result;    return result;}static const char* pattern_for_brush[] = {    0, // NoBrush    0, // SolidPattern    "0 J\n"    "6 w\n"    "[] 0 d\n"    "4 0 m\n"    "4 8 l\n"    "0 4 m\n"    "8 4 l\n"    "S\n", // Dense1Pattern    "0 J\n"    "2 w\n"    "[6 2] 1 d\n"    "0 0 m\n"    "0 8 l\n"    "8 0 m\n"    "8 8 l\n"    "S\n"    "[] 0 d\n"    "2 0 m\n"    "2 8 l\n"    "6 0 m\n"    "6 8 l\n"    "S\n"    "[6 2] -3 d\n"    "4 0 m\n"    "4 8 l\n"    "S\n", // Dense2Pattern    "0 J\n"    "2 w\n"    "[6 2] 1 d\n"    "0 0 m\n"    "0 8 l\n"    "8 0 m\n"    "8 8 l\n"    "S\n"    "[2 2] -1 d\n"    "2 0 m\n"    "2 8 l\n"    "6 0 m\n"    "6 8 l\n"    "S\n"    "[6 2] -3 d\n"    "4 0 m\n"    "4 8 l\n"    "S\n", // Dense3Pattern    "0 J\n"    "2 w\n"    "[2 2] 1 d\n"    "0 0 m\n"    "0 8 l\n"    "8 0 m\n"    "8 8 l\n"    "S\n"    "[2 2] -1 d\n"    "2 0 m\n"    "2 8 l\n"    "6 0 m\n"    "6 8 l\n"    "S\n"    "[2 2] 1 d\n"    "4 0 m\n"    "4 8 l\n"    "S\n", // Dense4Pattern    "0 J\n"    "2 w\n"    "[2 6] -1 d\n"    "0 0 m\n"    "0 8 l\n"    "8 0 m\n"    "8 8 l\n"    "S\n"    "[2 2] 1 d\n"    "2 0 m\n"    "2 8 l\n"    "6 0 m\n"    "6 8 l\n"    "S\n"    "[2 6] 3 d\n"    "4 0 m\n"    "4 8 l\n"    "S\n", // Dense5Pattern    "0 J\n"    "2 w\n"    "[2 6] -1 d\n"    "0 0 m\n"    "0 8 l\n"    "8 0 m\n"    "8 8 l\n"    "S\n"    "[2 6] 3 d\n"    "4 0 m\n"    "4 8 l\n"    "S\n", // Dense6Pattern    "0 J\n"    "2 w\n"    "[2 6] -1 d\n"    "0 0 m\n"    "0 8 l\n"    "8 0 m\n"    "8 8 l\n"    "S\n", // Dense7Pattern    "1 w\n"    "0 4 m\n"    "8 4 l\n"    "S\n", // HorPattern    "1 w\n"    "4 0 m\n"    "4 8 l\n"    "S\n", // VerPattern    "1 w\n"    "4 0 m\n"    "4 8 l\n"    "0 4 m\n"    "8 4 l\n"    "S\n", // CrossPattern    "1 w\n"    "-1 5 m\n"    "5 -1 l\n"    "3 9 m\n"    "9 3 l\n"    "S\n", // BDiagPattern    "1 w\n"    "-1 3 m\n"    "5 9 l\n"    "3 -1 m\n"    "9 5 l\n"    "S\n", // FDiagPattern    "1 w\n"    "-1 3 m\n"    "5 9 l\n"    "3 -1 m\n"    "9 5 l\n"    "-1 5 m\n"    "5 -1 l\n"    "3 9 m\n"    "9 3 l\n"    "S\n", // DiagCrossPattern};QByteArray QPdf::patternForBrush(const QBrush &b){    int style = b.style();    if (style > Qt::DiagCrossPattern)        return QByteArray();    return pattern_for_brush[style];}#ifdef USE_NATIVE_GRADIENTSstatic void writeTriangleLine(uchar *&data, int xpos, int ypos, int xoff, int yoff, uint rgb, uchar flag, bool alpha){    data[0] =  flag;    data[1] = (uchar)(xpos >> 16);    data[2] = (uchar)(xpos >> 8);    data[3] = (uchar)(xpos >> 0);    data[4] = (uchar)(ypos >> 16);    data[5] = (uchar)(ypos >> 8);    data[6] = (uchar)(ypos >> 0);    data += 7;    if (alpha) {        *data++ = (uchar)qAlpha(rgb);    } else {        *data++ = (uchar)qRed(rgb);        *data++ = (uchar)qGreen(rgb);        *data++ = (uchar)qBlue(rgb);    }    xpos += xoff;    ypos += yoff;    data[0] =  flag;    data[1] = (uchar)(xpos >> 16);    data[2] = (uchar)(xpos >> 8);    data[3] = (uchar)(xpos >> 0);    data[4] = (uchar)(ypos >> 16);    data[5] = (uchar)(ypos >> 8);    data[6] = (uchar)(ypos >> 0);    data += 7;    if (alpha) {        *data++ = (uchar)qAlpha(rgb);    } else {        *data++ = (uchar)qRed(rgb);        *data++ = (uchar)qGreen(rgb);        *data++ = (uchar)qBlue(rgb);    }}QByteArray QPdf::generateLinearGradientShader(const QLinearGradient *gradient, const QPointF *page_rect, bool alpha){    // generate list of triangles with colors    QPointF start = gradient->start();    QPointF stop = gradient->finalStop();    QGradientStops stops = gradient->stops();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -