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

📄 qpaintengine_raster.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
void QRasterPaintEngine::drawRects(const QRectF *rects, int rectCount){#ifdef QT_DEBUG_DRAW    qDebug(" - QRasterPaintEngine::drawRect(), rectCount=%d", rectCount);#endif    for (int i=0; i<rectCount; ++i) {        const QRectF &rf = rects[i];        QPointF pts[4] = { QPointF(rf.x(), rf.y()),                           QPointF(rf.x() + rf.width(), rf.y()),                           QPointF(rf.x() + rf.width(), rf.y() + rf.height()),                           QPointF(rf.x(), rf.y() + rf.height()) };        drawPolygon(pts, 4, ConvexMode);    }}void QRasterPaintEngine::drawPath(const QPainterPath &path){#ifdef QT_DEBUG_DRAW    QRectF bounds = path.boundingRect();    qDebug(" - QRasterPaintEngine::drawPath(), [%.2f, %.2f, %.2f, %.2f]",           bounds.x(), bounds.y(), bounds.width(), bounds.height());#endif    if (path.isEmpty())        return;    Q_D(QRasterPaintEngine);    if (d->brushData.blend) {        d->outlineMapper->setMatrix(d->matrix, d->txop);        fillPath(path, &d->brushData);    }    if (!d->penData.blend)        return;    {        Q_ASSERT(d->stroker);        qreal width = d->pen.widthF();        d->outlineMapper->beginOutline(Qt::WindingFill);        if (width == 0) {            d->outlineMapper->setMatrix(QMatrix(), QPainterPrivate::TxNone);            d->stroker->strokePath(path, d->outlineMapper, d->matrix);        } else {            d->outlineMapper->setMatrix(d->matrix, d->txop);            d->stroker->strokePath(path, d->outlineMapper, QMatrix());        }        d->outlineMapper->endOutline();        d->rasterize(d->outlineMapper->outline(), d->penData.blend, &d->penData, d->rasterBuffer);        d->outlineMapper->setMatrix(d->matrix, d->txop);    }}void QRasterPaintEngine::drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode){    Q_D(QRasterPaintEngine);#ifdef QT_DEBUG_DRAW    qDebug(" - QRasterPaintEngine::drawPolygon(), pointCount=%d", pointCount);    for (int i=0; i<pointCount; ++i)        qDebug() << "   - " << points[i];#endif    Q_ASSERT(pointCount >= 2);    // Do the fill    if (d->brushData.blend && mode != PolylineMode) {        // Compose polygon fill..,        d->outlineMapper->beginOutline(mode == WindingMode ? Qt::WindingFill : Qt::OddEvenFill);        d->outlineMapper->moveTo(*points);        const QPointF *p = points;        const QPointF *ep = points + pointCount - 1;        do {            d->outlineMapper->lineTo(*(++p));        } while (p < ep);        d->outlineMapper->endOutline();        // scanconvert.        d->rasterize(d->outlineMapper->outline(), d->brushData.blend, &d->brushData, d->rasterBuffer);    }    // Do the outline...    if (d->penData.blend) {        bool needs_closing = mode != PolylineMode && points[0] != points[pointCount-1];        if (d->fast_pen && d->pen.brush().isOpaque()) {            // Use fast path for 0 width /  trivial pens.            QRect devRect(0, 0, d->deviceRect.width(), d->deviceRect.height());            LineDrawMode mode_for_last = (d->pen.capStyle() != Qt::FlatCap                                          ? LineDrawIncludeLastPixel                                          : LineDrawNormal);            int dashOffset = 0;            // Draw the all the line segments.            for (int i=1; i<pointCount; ++i) {                QPointF lp1 = points[i-1] * d->matrix;                QPointF lp2 = points[i] * d->matrix;                if (d->pen.style() == Qt::SolidLine) {                    drawLine_midpoint_i(qFloor(lp1.x()), qFloor(lp1.y()),                                        qFloor(lp2.x()), qFloor(lp2.y()),                                        d->penData.blend, &d->penData,                                        i == pointCount - 1 ? mode_for_last : LineDrawIncludeLastPixel,                                        devRect);                } else {                    drawLine_midpoint_dashed_i(qFloor(lp1.x()), qFloor(lp1.y()),                                               qFloor(lp2.x()), qFloor(lp2.y()),                                               &d->pen,                                               d->penData.blend, &d->penData,                                               i == pointCount - 1 ? mode_for_last : LineDrawIncludeLastPixel,                                               devRect, &dashOffset);                }            }            // Polygons are implicitly closed.            if (needs_closing) {                QPointF lp1 = points[pointCount-1] * d->matrix;                QPointF lp2 = points[0] * d->matrix;                if (d->pen.style() == Qt::SolidLine) {                    drawLine_midpoint_i(qFloor(lp1.x()), qFloor(lp1.y()),                                        qFloor(lp2.x()), qFloor(lp2.y()),                                        d->penData.blend, &d->penData,                                        LineDrawIncludeLastPixel,                                        devRect);                } else {                    drawLine_midpoint_dashed_i(qFloor(lp1.x()), qFloor(lp1.y()),                                               qFloor(lp2.x()), qFloor(lp2.y()),                                               &d->pen,                                               d->penData.blend, &d->penData,                                               LineDrawIncludeLastPixel,                                               devRect, &dashOffset);                }            }        } else {            // fallback case for complex or transformed pens.            qreal width = d->pen.widthF();            d->outlineMapper->beginOutline(Qt::WindingFill);            if (width == 0) {                d->basicStroker.setStrokeWidth(1);                d->outlineMapper->setMatrix(QMatrix(), QPainterPrivate::TxNone);                d->stroker->strokePolygon(points, pointCount, needs_closing,                                          d->outlineMapper, d->matrix);            } else {                d->basicStroker.setStrokeWidth(width);                d->outlineMapper->setMatrix(d->matrix, d->txop);                d->stroker->strokePolygon(points, pointCount, needs_closing,                                          d->outlineMapper, QMatrix());            }            d->outlineMapper->endOutline();            d->rasterize(d->outlineMapper->outline(), d->penData.blend, &d->penData, d->rasterBuffer);            d->outlineMapper->setMatrix(d->matrix, d->txop);        }    }}void QRasterPaintEngine::drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode){    Q_D(QRasterPaintEngine);    if (!(d->int_xform && d->fast_pen)) {        // this calls the float version        QPaintEngine::drawPolygon(points, pointCount, mode);        return;    }#ifdef QT_DEBUG_DRAW    qDebug(" - QRasterPaintEngine::drawPolygon(), pointCount=%d", pointCount);    for (int i=0; i<pointCount; ++i)        qDebug() << "   - " << points[i];#endif    Q_ASSERT(pointCount >= 2);    // Do the fill    if (d->brushData.blend && mode != PolylineMode) {        // Compose polygon fill..,        d->outlineMapper->beginOutline(mode == WindingMode ? Qt::WindingFill : Qt::OddEvenFill);        d->outlineMapper->moveTo(*points);        const QPoint *p = points;        const QPoint *ep = points + pointCount - 1;        do {            d->outlineMapper->lineTo(*(++p));        } while (p < ep);        d->outlineMapper->endOutline();        // scanconvert.        d->rasterize(d->outlineMapper->outline(), d->brushData.blend, &d->brushData, d->rasterBuffer);    }    // Do the outline...    if (d->penData.blend) {        bool needs_closing = mode != PolylineMode && points[0] != points[pointCount-1];        QRect devRect(0, 0, d->deviceRect.width(), d->deviceRect.height());        LineDrawMode mode_for_last = (d->pen.capStyle() != Qt::FlatCap                                      ? LineDrawIncludeLastPixel                                      : LineDrawNormal);        int m11 = int(d->matrix.m11());        int m22 = int(d->matrix.m22());        int dx = int(d->matrix.dx());        int dy = int(d->matrix.dy());        int dashOffset = 0;        // Draw the all the line segments.        for (int i=1; i<pointCount; ++i) {            if (d->pen.style() == Qt::SolidLine)                drawLine_midpoint_i(points[i-1].x() * m11 + dx, points[i-1].y() * m22 + dy,                                    points[i].x() * m11 + dx, points[i].y() * m22 + dy,                                    d->penData.blend, &d->penData,                                    i == pointCount - 1 ? mode_for_last : LineDrawIncludeLastPixel,                                    devRect);            else                drawLine_midpoint_dashed_i(points[i-1].x() * m11 + dx, points[i-1].y() * m22 + dy,                                           points[i].x() * m11 + dx, points[i].y() * m22 + dy,                                           &d->pen,                                           d->penData.blend, &d->penData,                                           i == pointCount - 1 ? mode_for_last : LineDrawIncludeLastPixel,                                           devRect, &dashOffset);        }        // Polygons are implicitly closed.        if (needs_closing) {            if (d->pen.style() == Qt::SolidLine)                drawLine_midpoint_i(points[pointCount-1].x() * m11 + dx, points[pointCount-1].y() * m22 + dy,                                    points[0].x() * m11 + dx, points[0].y() * m22 + dy,                                    d->penData.blend, &d->penData, LineDrawIncludeLastPixel,                                    devRect);            else                drawLine_midpoint_dashed_i(points[pointCount-1].x() * m11 + dx, points[pointCount-1].y() * m22 + dy,                                    points[0].x() * m11 + dx, points[0].y() * m22 + dy,                                           &d->pen,                                           d->penData.blend, &d->penData, LineDrawIncludeLastPixel,                                           devRect, &dashOffset);        }    }}void QRasterPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pixmap, const QRectF &sr){#ifdef QT_DEBUG_DRAW    qDebug() << " - QRasterPaintEngine::drawPixmap(), r=" << r << " sr=" << sr << " pixmap=" << pixmap.size() << "depth=" << pixmap.depth();#endif    Q_D(QRasterPaintEngine);    QImage image;    if (pixmap.depth() == 1) {        if (d->txop <= QPainterPrivate::TxTranslate            && !d->rasterBuffer->opaqueBackground            && r.size() == sr.size()            && r.size() == pixmap.size()) {            d->drawBitmap(r.topLeft() + QPointF(d->matrix.dx(), d->matrix.dy()), pixmap, &d->penData);            return;        } else {            image = d->rasterBuffer->colorizeBitmap(pixmap.toImage(), d->pen.color());        }    } else {        image = pixmap.toImage();    }    drawImage(r, image, sr);}void QRasterPaintEngine::drawImage(const QRectF &r, const QImage &img, const QRectF &sr,                                   Qt::ImageConversionFlags){#ifdef QT_DEBUG_DRAW    qDebug() << " - QRasterPaintEngine::drawImage(), r=" << r << " sr=" << sr << " image=" << img.size() << "depth=" << img.depth();#endif    Q_D(QRasterPaintEngine);    QSpanData textureData;    textureData.init(d->rasterBuffer);    textureData.type = QSpanData::Texture;    textureData.initTexture(&img);    bool stretch_sr = r.width() != sr.width() || r.height() != sr.height();    if (d->txop > QPainterPrivate::TxTranslate || stretch_sr) {        QMatrix copy = d->matrix;        copy.translate(r.x(), r.y());        if (stretch_sr)            copy.scale(r.width() / sr.width(), r.height() / sr.height());        copy.translate(-sr.x(), -sr.y());        textureData.setupMatrix(copy, QPainterPrivate::TxRotShear, d->bilinear);	textureData.adjustSpanMethods();        bool wasAntialiased = d->antialiased;        if (!d->antialiased)            d->antialiased = d->bilinear;        QPainterPath path;        path.addRect(r);        fillPath(path, &textureData);        d->antialiased = wasAntialiased;    } else {        textureData.dx = -(r.x() + d->matrix.dx()) + sr.x();        textureData.dy = -(r.y() + d->matrix.dy()) + sr.y();        QRectF rr = r;        rr.translate(d->matrix.dx(), d->matrix.dy());        fillRect(rr.toRect(), &textureData);    }}void QRasterPaintEngine::drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &sr){#ifdef QT_DEBUG_DRAW    qDebug() << " - QRasterPaintEngine::drawTiledPixmap(), r=" << r << "pixmap=" << pixmap.size();#endif    Q_D(QRasterPaintEngine);    QImage image;    if (pixmap.depth() == 1)        image = d->rasterBuffer->colorizeBitmap(pixmap.toImage(), d->pen.color());    else        image = pixmap.toImage();    QSpanData textureData;    textureData.init(d->rasterBuffer);    textureData.type = QSpanData::Texture;    textureData.initTexture(&image, TextureData::Tiled);    if (d->txop > QPainterPrivate::TxTranslate) {        QMatrix copy = d->matrix;        copy.translate(r.x(), r.y());        copy.translate(-sr.x(), -sr.y());        textureData.setupMatrix(copy, QPainterPrivate::TxRotShear, d->bilinear);        bool wasAntialiased = d->antialiased;        if (!d->antialiased)            d->antialiased = d->bilinear;        QPainterPath path;        path.addRect(r);        fillPath(path, &textureData);        d->antialiased = wasAntialiased;    } else {        textureData.dx = -(r.x() + d->matrix.dx()) + sr.x();        textureData.dy = -(r.y() + d->matrix.dy()) + sr.y();        QRectF rr = r;        rr.translate(d->matrix.dx(), d->matrix.dy());        fillRect(rr.toRect(), &textureData);    }}#ifdef Q_WS_QWS//QWS hackstatic inline bool monoVal(const uchar* s, int x){    return  (s[x>>3] << (x&7)) & 0x80;}void QRasterPaintEngine::alphaPenBlt(const void* src, int bpl, bool mono, int rx,int ry,int w,int h){    Q_D(QRasterPaintEngine);    if (!d->penData.blend)        return;    int y0 = (ry < 0) ? -ry : 0;    int x0 = (rx < 0) ? -rx : 0;    QRasterBuffer *rb = d->rasterBuffer;    w = qMin(w, rb->width() - rx);    h = qMin(h, rb->height() - ry);    const int NSPANS = 256;    QSpan spans[NSPANS];    int current = 0;    const uchar * scanline = static_cast<const uchar *>(src) + y0*bpl;    if (mono) {        for (int y=y0; y < h; ++y) {            for (int x = x0; x < w; ) {                if (!monoVal(scanline, x)) {

⌨️ 快捷键说明

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