📄 qpaintengine_raster.cpp
字号:
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 + -