48 Q_ASSERT(!pattern.isEmpty());
57 const qreal rawLen = pattern[idx % pattern.size()] * penWidth;
58 const qreal segLen = qMax(qreal(1), qreal(qRound(rawLen)));
59 const qreal segEnd = qMin(x + segLen, x1);
61 if (drawing && segEnd > x) {
62 path.moveTo(QVector2D(qRound(x), cy));
63 path.lineTo(QVector2D(qRound(segEnd), cy));
80 const qreal radius = qMax(qreal(1), penWidth);
81 const qreal halfPeriod = qMax(qreal(2), radius * goldenRatio);
84 path.moveTo(QVector2D(x0, cy));
90 const qreal nextX = qMin(x + halfPeriod, x1);
91 const qreal fraction = (nextX - x) / halfPeriod;
92 const qreal peakY = cy + dir * radius * fraction;
93 const qreal ctrlX = (x + nextX) / 2.0;
95 path.quadTo(QVector2D(ctrlX, peakY), QVector2D(nextX, cy));
108 QSGCurveStrokeNode *node =
new QSGCurveStrokeNode;
109 node->setColor(color);
110 node->setStrokeWidth(penWidth);
112 QSGCurveProcessor::processStroke(
113 path, 2, penWidth,
false, Qt::MiterJoin, Qt::FlatCap,
114 [&node](
const std::array<QVector2D, 3> &s,
const std::array<QVector2D, 3> &p,
115 const std::array<QVector2D, 3> &n,
const std::array<
float, 3> &ex,
116 QSGCurveStrokeNode::TriangleFlags ) {
117 node->appendTriangle(s, std::array<QVector2D, 2>{ p.at(0), p.at(2) }, n, ex);
119 node->cookGeometry();
120 parent->appendChildNode(node);
123void QSGRhiInternalTextNode::addDecorationNode(
const QRectF &rect,
const QColor &color,
124 QTextCharFormat::UnderlineStyle style)
126 if (rect.width() <= 0)
129 const qreal penWidth = rect.height();
130 const QPointF c = rect.center();
132 if (style == QTextCharFormat::WaveUnderline) {
133 QQuadPath path = buildWavyPath(rect.left(), rect.right(), c.y(), penWidth);
135 const qreal radius = qMax(qreal(1), penWidth);
136 const qreal maxPenWidth = 0.8 * radius;
137 strokePathToNode(
this, path, color, qMin(penWidth, maxPenWidth));
141 if (style != QTextCharFormat::SingleUnderline) {
143 QSpan<
const qreal> pattern = dashPatternForStyle(style);
144 if (!pattern.isEmpty()) {
145 QQuadPath path = buildDashedPath(rect.left(), rect.right(), c.y(), pattern, penWidth);
146 strokePathToNode(
this, path, color, penWidth);
153 path.moveTo(QVector2D(rect.left(), c.y()));
154 path.lineTo(QVector2D(rect.right(), c.y()));
155 strokePathToNode(
this, path, color, penWidth);
static constexpr qreal dashDotDotPattern[]
static QQuadPath buildDashedPath(qreal x0, qreal x1, qreal cy, QSpan< const qreal > pattern, qreal penWidth)
static constexpr qreal dashPattern[]
static constexpr qreal dotPattern[]
static constexpr qreal goldenRatio
static void strokePathToNode(QSGNode *parent, const QQuadPath &path, const QColor &color, qreal penWidth)
static QQuadPath buildWavyPath(qreal x0, qreal x1, qreal cy, qreal penWidth)
static QSpan< const qreal > dashPatternForStyle(QTextCharFormat::UnderlineStyle style)
static constexpr qreal dashDotPattern[]