229 QPainterPath::MoveToElement, QPainterPath::LineToElement,
230 QPainterPath::MoveToElement, QPainterPath::LineToElement,
231 QPainterPath::MoveToElement, QPainterPath::LineToElement,
232 QPainterPath::MoveToElement, QPainterPath::LineToElement,
233 QPainterPath::MoveToElement, QPainterPath::LineToElement,
234 QPainterPath::MoveToElement, QPainterPath::LineToElement,
235 QPainterPath::MoveToElement, QPainterPath::LineToElement,
236 QPainterPath::MoveToElement, QPainterPath::LineToElement,
237 QPainterPath::MoveToElement, QPainterPath::LineToElement,
238 QPainterPath::MoveToElement, QPainterPath::LineToElement,
239 QPainterPath::MoveToElement, QPainterPath::LineToElement,
240 QPainterPath::MoveToElement, QPainterPath::LineToElement,
241 QPainterPath::MoveToElement, QPainterPath::LineToElement,
242 QPainterPath::MoveToElement, QPainterPath::LineToElement,
243 QPainterPath::MoveToElement, QPainterPath::LineToElement,
244 QPainterPath::MoveToElement, QPainterPath::LineToElement
248 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
249 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
250 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
251 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
252 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
253 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
254 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
255 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
256 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
257 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
258 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
259 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
260 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
261 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
262 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
263 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
264 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
265 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
266 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
267 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
268 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
269 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
270 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
271 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
272 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
273 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
274 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
275 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
276 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
277 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
278 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
279 QPainterPath::MoveToElement, QPainterPath::LineToElement, QPainterPath::LineToElement, QPainterPath::LineToElement,
284 QPainterPath::MoveToElement,
285 QPainterPath::LineToElement,
286 QPainterPath::CurveToElement,
287 QPainterPath::CurveToDataElement,
288 QPainterPath::CurveToDataElement,
289 QPainterPath::LineToElement,
290 QPainterPath::CurveToElement,
291 QPainterPath::CurveToDataElement,
292 QPainterPath::CurveToDataElement,
293 QPainterPath::LineToElement,
294 QPainterPath::CurveToElement,
295 QPainterPath::CurveToDataElement,
296 QPainterPath::CurveToDataElement,
297 QPainterPath::LineToElement,
298 QPainterPath::CurveToElement,
299 QPainterPath::CurveToDataElement,
300 QPainterPath::CurveToDataElement
352void QPaintEngineEx::stroke(
const QVectorPath &path,
const QPen &inPen)
355 qDebug() <<
"QPaintEngineEx::stroke()" << inPen;
363 if (!d->strokeHandler) {
364 d->strokeHandler =
new StrokeHandler(path.elementCount()+4);
365 d->stroker.setMoveToHook(qpaintengineex_moveTo);
366 d->stroker.setLineToHook(qpaintengineex_lineTo);
367 d->stroker.setCubicToHook(qpaintengineex_cubicTo);
372 if (pen.style() > Qt::SolidLine) {
373 QRectF cpRect = path.controlPointRect();
374 const QTransform &xf = state()->matrix;
375 if (pen.isCosmetic()) {
376 clipRect = d->exDeviceRect;
377 cpRect.translate(xf.dx(), xf.dy());
379 clipRect = xf.inverted().mapRect(QRectF(d->exDeviceRect));
382 qreal pw = pen.widthF() ? pen.widthF() : 1;
383 QRectF extentRect = cpRect.adjusted(-pw, -pw, pw, pw) & clipRect;
384 qreal extent = qMax(extentRect.width(), extentRect.height());
385 qreal patternLength = 0;
386 const QList<qreal> pattern = pen.dashPattern();
387 const int patternSize = qMin(pattern.size(), 32);
388 for (
int i = 0; i < patternSize; i++)
389 patternLength += qMax(pattern.at(i), qreal(0));
391 if (qFuzzyIsNull(patternLength)) {
392 pen.setStyle(Qt::NoPen);
393 }
else if (extent / patternLength > QDashStroker::repetitionLimit()) {
395 pen.setStyle(Qt::SolidLine);
396 QColor color(pen.color());
397 color.setAlpha(color.alpha() / 2);
402 if (!qpen_fast_equals(pen, d->strokerPen)) {
404 d->stroker.setJoinStyle(pen.joinStyle());
405 d->stroker.setCapStyle(pen.capStyle());
406 d->stroker.setMiterLimit(pen.miterLimit());
407 qreal penWidth = pen.widthF();
409 d->stroker.setStrokeWidth(1);
411 d->stroker.setStrokeWidth(penWidth);
413 Qt::PenStyle style = pen.style();
414 if (style == Qt::SolidLine) {
415 d->activeStroker = &d->stroker;
416 }
else if (style == Qt::NoPen) {
417 d->activeStroker =
nullptr;
419 d->dasher.setDashPattern(pen.dashPattern());
420 d->dasher.setDashOffset(pen.dashOffset());
421 d->activeStroker = &d->dasher;
425 if (!d->activeStroker) {
429 if (!clipRect.isNull())
430 d->activeStroker->setClipRect(clipRect);
432 if (d->activeStroker == &d->stroker)
433 d->stroker.setForceOpen(path.hasExplicitOpen());
435 const QPainterPath::ElementType *types = path.elements();
436 const qreal *points = path.points();
437 int pointCount = path.elementCount();
439 const qreal *lastPoint = points + (pointCount<<1);
441 d->strokeHandler->types.reset();
442 d->strokeHandler->pts.reset();
445 uint flags = QVectorPath::WindingFill;
447 if (path.elementCount() > 2)
448 flags |= QVectorPath::NonConvexShapeMask;
450 if (d->stroker.capStyle() == Qt::RoundCap || d->stroker.joinStyle() == Qt::RoundJoin)
451 flags |= QVectorPath::CurvedShapeMask;
454 if (!pen.isCosmetic()) {
459 d->activeStroker->setCurveThresholdFromTransform(state()->matrix);
460 d->activeStroker->begin(d->strokeHandler);
462 while (points < lastPoint) {
464 case QPainterPath::MoveToElement:
465 d->activeStroker->moveTo(points[0], points[1]);
469 case QPainterPath::LineToElement:
470 d->activeStroker->lineTo(points[0], points[1]);
474 case QPainterPath::CurveToElement:
475 d->activeStroker->cubicTo(points[0], points[1],
476 points[2], points[3],
477 points[4], points[5]);
480 flags |= QVectorPath::CurvedShapeMask;
486 if (path.hasImplicitClose())
487 d->activeStroker->lineTo(path.points()[0], path.points()[1]);
490 d->activeStroker->moveTo(points[0], points[1]);
492 while (points < lastPoint) {
493 d->activeStroker->lineTo(points[0], points[1]);
496 if (path.hasImplicitClose())
497 d->activeStroker->lineTo(path.points()[0], path.points()[1]);
499 d->activeStroker->end();
501 if (!d->strokeHandler->types.size())
504 QVectorPath strokePath(d->strokeHandler->pts.data(),
505 d->strokeHandler->types.size(),
506 d->strokeHandler->types.data(),
508 fill(strokePath, pen.brush());
511 if (state()->matrix.type() >= QTransform::TxProject) {
512 QPainterPath painterPath = state()->matrix.map(path.convertToPainterPath());
513 d->activeStroker->strokePath(painterPath, d->strokeHandler, QTransform());
515 d->activeStroker->setCurveThresholdFromTransform(QTransform());
516 d->activeStroker->begin(d->strokeHandler);
518 while (points < lastPoint) {
520 case QPainterPath::MoveToElement: {
521 QPointF pt = (*(
const QPointF *) points) * state()->matrix;
522 d->activeStroker->moveTo(pt.x(), pt.y());
527 case QPainterPath::LineToElement: {
528 QPointF pt = (*(
const QPointF *) points) * state()->matrix;
529 d->activeStroker->lineTo(pt.x(), pt.y());
534 case QPainterPath::CurveToElement: {
535 QPointF c1 = ((
const QPointF *) points)[0] * state()->matrix;
536 QPointF c2 = ((
const QPointF *) points)[1] * state()->matrix;
537 QPointF e = ((
const QPointF *) points)[2] * state()->matrix;
538 d->activeStroker->cubicTo(c1.x(), c1.y(), c2.x(), c2.y(), e.x(), e.y());
541 flags |= QVectorPath::CurvedShapeMask;
548 if (path.hasImplicitClose()) {
549 QPointF pt = * ((
const QPointF *) path.points()) * state()->matrix;
550 d->activeStroker->lineTo(pt.x(), pt.y());
554 QPointF p = ((
const QPointF *)points)[0] * state()->matrix;
555 d->activeStroker->moveTo(p.x(), p.y());
557 while (points < lastPoint) {
558 QPointF p = ((
const QPointF *)points)[0] * state()->matrix;
559 d->activeStroker->lineTo(p.x(), p.y());
562 if (path.hasImplicitClose())
563 d->activeStroker->lineTo(p.x(), p.y());
565 d->activeStroker->end();
568 QVectorPath strokePath(d->strokeHandler->pts.data(),
569 d->strokeHandler->types.size(),
570 d->strokeHandler->types.data(),
573 QTransform xform = state()->matrix;
574 state()->matrix = QTransform();
577 QBrush brush = pen.brush();
578 if (qbrush_style(brush) != Qt::SolidPattern)
579 brush.setTransform(brush.transform() * xform);
581 fill(strokePath, brush);
583 state()->matrix = xform;
734void QPaintEngineEx::drawRoundedRect(
const QRectF &rect, qreal xRadius, qreal yRadius,
737 qreal x1 = rect.left();
738 qreal x2 = rect.right();
739 qreal y1 = rect.top();
740 qreal y2 = rect.bottom();
742 if (mode == Qt::RelativeSize) {
743 xRadius = xRadius * rect.width() / 200.;
744 yRadius = yRadius * rect.height() / 200.;
747 xRadius = qMin(xRadius, rect.width() / 2);
748 yRadius = qMin(yRadius, rect.height() / 2);
753 x2 - (1 - KAPPA) * xRadius, y1,
754 x2, y1 + (1 - KAPPA) * yRadius,
757 x2, y2 - (1 - KAPPA) * yRadius,
758 x2 - (1 - KAPPA) * xRadius, y2,
761 x1 + (1 - KAPPA) * xRadius, y2,
762 x1, y2 - (1 - KAPPA) * yRadius,
765 x1, y1 + (1 - KAPPA) * yRadius,
766 x1 + (1 - KAPPA) * xRadius, y1,
770 QVectorPath path(pts, 17, qpaintengineex_roundedrect_types, QVectorPath::RoundedRectHint);
959void QPaintEngineEx::drawPixmapFragments(
const QPainter::PixmapFragment *fragments,
int fragmentCount,
960 const QPixmap &pixmap, QPainter::PixmapFragmentHints )
965 qreal oldOpacity = state()->opacity;
966 QTransform oldTransform = state()->matrix;
968 for (
int i = 0; i < fragmentCount; ++i) {
969 QTransform transform = oldTransform;
970 transform.translate(fragments[i].x, fragments[i].y);
971 transform.rotate(fragments[i].rotation);
972 state()->opacity = oldOpacity * fragments[i].opacity;
973 state()->matrix = transform;
977 qreal w = fragments[i].scaleX * fragments[i].width;
978 qreal h = fragments[i].scaleY * fragments[i].height;
979 QRectF sourceRect(fragments[i].sourceLeft, fragments[i].sourceTop,
980 fragments[i].width, fragments[i].height);
981 drawPixmap(QRectF(-0.5 * w, -0.5 * h, w, h), pixmap, sourceRect);
984 state()->opacity = oldOpacity;
985 state()->matrix = oldTransform;
1001Q_GUI_EXPORT
QPainterPath qt_painterPathFromVectorPath(
const QVectorPath &path)
1003 const qreal *points = path.points();
1004 const QPainterPath::ElementType *types = path.elements();
1009 for (
int i=0; i<path.elementCount(); ++i) {
1011 case QPainterPath::MoveToElement:
1012 p.moveTo(QPointF(points[id], points[id+1]));
1015 case QPainterPath::LineToElement:
1016 p.lineTo(QPointF(points[id], points[id+1]));
1019 case QPainterPath::CurveToElement: {
1020 QPointF p1(points[id], points[id+1]);
1021 QPointF p2(points[id+2], points[id+3]);
1022 QPointF p3(points[id+4], points[id+5]);
1023 p.cubicTo(p1, p2, p3);
1027 case QPainterPath::CurveToDataElement:
1033 p.moveTo(QPointF(points[0], points[1]));
1035 for (
int i=1; i<path.elementCount(); ++i) {
1036 p.lineTo(QPointF(points[id], points[id+1]));
1040 if (path.hints() & QVectorPath::WindingFill)
1041 p.setFillRule(Qt::WindingFill);