📄 qpicture.cpp
字号:
{ Q_D(QPicture);#if defined(QT_DEBUG) int strm_pos;#endif quint8 c; // command id quint8 tiny_len; // 8-bit length descriptor qint32 len; // 32-bit length descriptor qint16 i_16, i1_16, i2_16; // parameters... qint8 i_8; quint32 ul; double dbl; bool bl; QByteArray str1; QString str; QPointF p, p1, p2; QPoint ip, ip1, ip2; QRect ir; QRectF r; QPolygonF a; QPolygon ia; QColor color; QFont font; QPen pen; QBrush brush; QRegion rgn; QMatrix wmatrix; QTransform matrix; QTransform worldMatrix = painter->transform(); worldMatrix.scale(qreal(painter->device()->logicalDpiX()) / qreal(qt_defaultDpiX()), qreal(painter->device()->logicalDpiY()) / qreal(qt_defaultDpiY())); painter->setTransform(worldMatrix); while (nrecords-- && !s.atEnd()) { s >> c; // read cmd s >> tiny_len; // read param length if (tiny_len == 255) // longer than 254 bytes s >> len; else len = tiny_len;#if defined(QT_DEBUG) strm_pos = s.device()->pos();#endif switch (c) { // exec cmd case QPicturePrivate::PdcNOP: break; case QPicturePrivate::PdcDrawPoint: if (d->formatMajor <= 5) { s >> ip; painter->drawPoint(ip); } else { s >> p; painter->drawPoint(p); } break; case QPicturePrivate::PdcDrawPoints:// ## implement me in the picture paint engine// s >> a >> i1_32 >> i2_32;// painter->drawPoints(a.mid(i1_32, i2_32)); break; case QPicturePrivate::PdcDrawPath: { QPainterPath path; s >> path; painter->drawPath(path); break; } case QPicturePrivate::PdcDrawLine: if (d->formatMajor <= 5) { s >> ip1 >> ip2; painter->drawLine(ip1, ip2); } else { s >> p1 >> p2; painter->drawLine(p1, p2); } break; case QPicturePrivate::PdcDrawRect: if (d->formatMajor <= 5) { s >> ir; painter->drawRect(ir); } else { s >> r; painter->drawRect(r); } break; case QPicturePrivate::PdcDrawRoundRect: if (d->formatMajor <= 5) { s >> ir >> i1_16 >> i2_16; painter->drawRoundRect(ir, i1_16, i2_16); } else { s >> r >> i1_16 >> i2_16; painter->drawRoundRect(r, i1_16, i2_16); } break; case QPicturePrivate::PdcDrawEllipse: if (d->formatMajor <= 5) { s >> ir; painter->drawEllipse(ir); } else { s >> r; painter->drawEllipse(r); } break; case QPicturePrivate::PdcDrawArc: if (d->formatMajor <= 5) { s >> ir; r = ir; } else { s >> r; } s >> i1_16 >> i2_16; painter->drawArc(r, i1_16, i2_16); break; case QPicturePrivate::PdcDrawPie: if (d->formatMajor <= 5) { s >> ir; r = ir; } else { s >> r; } s >> i1_16 >> i2_16; painter->drawPie(r, i1_16, i2_16); break; case QPicturePrivate::PdcDrawChord: if (d->formatMajor <= 5) { s >> ir; r = ir; } else { s >> r; } s >> i1_16 >> i2_16; painter->drawChord(r, i1_16, i2_16); break; case QPicturePrivate::PdcDrawLineSegments: s >> ia; painter->drawLines(ia); ia.clear(); break; case QPicturePrivate::PdcDrawPolyline: if (d->formatMajor <= 5) { s >> ia; painter->drawPolyline(ia); ia.clear(); } else { s >> a; painter->drawPolyline(a); a.clear(); } break; case QPicturePrivate::PdcDrawPolygon: if (d->formatMajor <= 5) { s >> ia >> i_8; painter->drawPolygon(ia, i_8 ? Qt::WindingFill : Qt::OddEvenFill); a.clear(); } else { s >> a >> i_8; painter->drawPolygon(a, i_8 ? Qt::WindingFill : Qt::OddEvenFill); a.clear(); } break; case QPicturePrivate::PdcDrawCubicBezier: { s >> ia; QPainterPath path; Q_ASSERT(ia.size() == 4); path.moveTo(ia.at(0)); path.cubicTo(ia.at(1), ia.at(2), ia.at(3)); painter->strokePath(path, painter->pen()); a.clear(); } break; case QPicturePrivate::PdcDrawText: s >> ip >> str1; painter->drawText(ip, QString::fromLatin1(str1)); break; case QPicturePrivate::PdcDrawTextFormatted: s >> ir >> i_16 >> str1; painter->drawText(ir, i_16, QString::fromLatin1(str1)); break; case QPicturePrivate::PdcDrawText2: if (d->formatMajor <= 5) { s >> ip >> str; painter->drawText(ip, str); } else { s >> p >> str; painter->drawText(p, str); } break; case QPicturePrivate::PdcDrawText2Formatted: s >> ir; s >> i_16; s >> str; painter->drawText(ir, i_16, str); break; case QPicturePrivate::PdcDrawTextItem: { s >> p >> str >> font >> ul; // the text layout direction is not used here because it's already // aligned when QPicturePaintEngine::drawTextItem() serializes the // drawText() call, therefore ul is unsed in this context if (d->formatMajor >= 9) { s >> dbl; QFont fnt(font); if (dbl != 1.0) { FakeDevice fake; fake.setDpiX(qRound(dbl*qt_defaultDpiX())); fake.setDpiY(qRound(dbl*qt_defaultDpiY())); fnt = QFont(font, &fake); } qreal justificationWidth; s >> justificationWidth; int flags = Qt::TextSingleLine | Qt::TextDontClip; QTextOption opt; opt.setTextDirection(painter->layoutDirection()); QSizeF size(1, 1); if (justificationWidth > 0) { size.setWidth(justificationWidth); flags |= Qt::TextJustificationForced; opt.setAlignment(Qt::AlignJustify); } QFontMetrics fm(fnt); QPointF pt(p.x(), p.y() - fm.ascent()); qt_format_text(fnt, QRectF(pt, size), flags, &opt, str, /*brect=*/0, /*tabstops=*/0, /*...*/0, /*tabarraylen=*/0, painter); } else { qt_format_text(font, QRectF(p, QSizeF(1, 1)), Qt::TextSingleLine | Qt::TextDontClip, /*opt*/0, str, /*brect=*/0, /*tabstops=*/0, /*...*/0, /*tabarraylen=*/0, painter); } break; } case QPicturePrivate::PdcDrawPixmap: { QPixmap pixmap; if (d->formatMajor < 4) { s >> ip >> pixmap; painter->drawPixmap(ip, pixmap); } else if (d->formatMajor <= 5) { s >> ir >> pixmap; painter->drawPixmap(ir, pixmap); } else { QRectF sr; if (d->dont_stream_pixmaps) { int index; s >> r >> index >> sr; Q_ASSERT(index < d->pixmap_list.size()); pixmap = d->pixmap_list.at(index); } else { s >> r >> pixmap >> sr; } painter->drawPixmap(r, pixmap, sr); } } break; case QPicturePrivate::PdcDrawTiledPixmap: { QPixmap pixmap; if (d->dont_stream_pixmaps) { int index; s >> r >> index >> p; Q_ASSERT(index < d->pixmap_list.size()); pixmap = d->pixmap_list.at(index); } else { s >> r >> pixmap >> p; } painter->drawTiledPixmap(r, pixmap, p); } break; case QPicturePrivate::PdcDrawImage: { QImage image; if (d->formatMajor < 4) { s >> p >> image; painter->drawPixmap(p, QPixmap::fromImage(image)); } else if (d->formatMajor <= 5){ s >> ir >> image; painter->drawPixmap(ir, QPixmap::fromImage(image), QRect(0, 0, ir.width(), ir.height())); } else { s >> r >> image; painter->drawPixmap(r, QPixmap::fromImage(image), QRectF(0, 0, r.width(), r.height())); } } break; case QPicturePrivate::PdcBegin: s >> ul; // number of records if (!exec(painter, s, ul)) return false; break; case QPicturePrivate::PdcEnd: if (nrecords == 0) return true; break; case QPicturePrivate::PdcSave: painter->save(); break; case QPicturePrivate::PdcRestore: painter->restore(); break; case QPicturePrivate::PdcSetBkColor: s >> color; painter->setBackground(color); break; case QPicturePrivate::PdcSetBkMode: s >> i_8; painter->setBackgroundMode((Qt::BGMode)i_8); break; case QPicturePrivate::PdcSetROP: // NOP s >> i_8; break; case QPicturePrivate::PdcSetBrushOrigin: if (d->formatMajor <= 5) { s >> ip; painter->setBrushOrigin(ip); } else { s >> p; painter->setBrushOrigin(p); } break; case QPicturePrivate::PdcSetFont: s >> font; painter->setFont(font); break; case QPicturePrivate::PdcSetPen: s >> pen; painter->setPen(pen); break; case QPicturePrivate::PdcSetBrush: s >> brush; painter->setBrush(brush); break;// #ifdef Q_Q3PAINTER// case QPicturePrivate::PdcSetTabStops:// s >> i_16;// painter->setTabStops(i_16);// break;// case QPicturePrivate::PdcSetTabArray:// s >> i_16;// if (i_16 == 0) {// painter->setTabArray(0);// } else {// int *ta = new int[i_16];// for (int i=0; i<i_16; i++) {// s >> i1_16;// ta[i] = i1_16;// }// painter->setTabArray(ta);// delete [] ta;// }// break;// #endif case QPicturePrivate::PdcSetVXform: s >> i_8; painter->setViewTransformEnabled(i_8); break; case QPicturePrivate::PdcSetWindow: s >> r; painter->setWindow(r.toRect()); break; case QPicturePrivate::PdcSetViewport: s >> r; painter->setViewport(r.toRect()); break; case QPicturePrivate::PdcSetWXform: s >> i_8; painter->setMatrixEnabled(i_8); break; case QPicturePrivate::PdcSetWMatrix: if (d->formatMajor >= 8) { s >> matrix >> i_8; } else { s >> wmatrix >> i_8; matrix = QTransform(wmatrix); } // i_8 is always false due to updateXForm() in qpaintengine_pic.cpp painter->setTransform(matrix * worldMatrix, i_8); break;// #ifdef Q_Q3PAINTER// case QPicturePrivate::PdcSaveWMatrix:// painter->saveWorldMatrix();// break;// case QPicturePrivate::PdcRestoreWMatrix:// painter->restoreWorldMatrix();// break;// #endif case QPicturePrivate::PdcSetClip: s >> i_8; painter->setClipping(i_8); break; case QPicturePrivate::PdcSetClipRegion: s >> rgn >> i_8; if (d->formatMajor >= 9) { painter->setClipRegion(rgn, Qt::ClipOperation(i_8)); } else { painter->setClipRegion(rgn); } break; case QPicturePrivate::PdcSetClipPath: { QPainterPath path; s >> path >> i_8; painter->setClipPath(path, Qt::ClipOperation(i_8)); break; } case QPicturePrivate::PdcSetRenderHint: s >> ul; painter->setRenderHint(QPainter::Antialiasing, bool(ul & QPainter::Antialiasing)); painter->setRenderHint(QPainter::SmoothPixmapTransform, bool(ul & QPainter::SmoothPixmapTransform)); break; case QPicturePrivate::PdcSetCompositionMode: s >> ul; painter->setCompositionMode((QPainter::CompositionMode)ul); break; case QPicturePrivate::PdcSetClipEnabled: s >> bl; painter->setClipping(bl); break; case QPicturePrivate::PdcSetOpacity: s >> dbl; painter->setOpacity(qreal(dbl)); break; default: qWarning("QPicture::play: Invalid command %d", c); if (len) // skip unknown command s.device()->seek(s.device()->pos()+len); }#if defined(QT_DEBUG) //qDebug("device->at(): %i, strm_pos: %i len: %i", (int)s.device()->pos(), strm_pos, len); Q_ASSERT(qint32(s.device()->pos() - strm_pos) == len);#endif } return false;}/*! Internal implementation of the virtual QPaintDevice::metric() function. A picture has the following hard-coded values: numcolors=16777216 and depth=24. \a m is the metric to get.*/int QPicture::metric(PaintDeviceMetric m) const{ int val; QRect brect = boundingRect(); switch (m) { case PdmWidth: val = brect.width(); break; case PdmHeight: val = brect.height(); break; case PdmWidthMM: val = int(25.4/qt_defaultDpiX()*brect.width()); break; case PdmHeightMM: val = int(25.4/qt_defaultDpiY()*brect.height()); break; case PdmDpiX: case PdmPhysicalDpiX: val = qt_defaultDpiX(); break; case PdmDpiY: case PdmPhysicalDpiY: val = qt_defaultDpiY(); break; case PdmNumColors: val = 16777216; break; case PdmDepth: val = 24; break; default: val = 0; qWarning("QPicture::metric: Invalid metric command"); } return val;}/*! \fn void QPicture::detach() \internal
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -