63void QSGCurveGlyphNode::setGlyphs(
const QPointF &position,
const QGlyphRun &glyphs)
67 QRawFont font = glyphs.rawFont();
68 m_fontSize = font.pixelSize();
69 m_position = QPointF(position.x(), position.y() - font.ascent());
72 m_dirtyGeometry =
true;
74#ifdef QSG_RUNTIME_DESCRIPTION
75 qsgnode_set_description(
this, QString::number(glyphs.glyphIndexes().count())
76 + QStringLiteral(
" curve glyphs: ")
77 + m_glyphs.rawFont().familyName()
79 + QString::number(m_glyphs.rawFont().pixelSize()));
94void QSGCurveGlyphNode::updateGeometry()
97 m_glyphNode =
nullptr;
100 m_styleNode =
nullptr;
102 QSGCurveGlyphAtlas *curveGlyphAtlas = m_context->curveGlyphAtlas(m_glyphs.rawFont());
103 curveGlyphAtlas->populate(m_glyphs.glyphIndexes());
105 m_glyphNode =
new QSGCurveFillNode;
106 m_glyphNode->setColor(m_color);
110 float fontScale =
float(m_fontSize / curveGlyphAtlas->fontSize());
111 QSGCurveFillNode *raisedSunkenStyleNode =
nullptr;
112 QSGCurveStrokeNode *outlineNode =
nullptr;
113 if (m_style == QQuickText::Raised || m_style == QQuickText::Sunken) {
114 raisedSunkenStyleNode =
new QSGCurveFillNode;
115 raisedSunkenStyleNode ->setColor(m_styleColor);
117 offset = m_style == QQuickText::Raised ? QPointF(0.0f, 1.0f) : QPointF(0.0f, -1.0f);
118 m_styleNode = raisedSunkenStyleNode;
119 }
else if (m_style == QQuickText::Outline) {
120 outlineNode =
new QSGCurveStrokeNode;
121 outlineNode->setColor(m_styleColor);
122 outlineNode->setStrokeWidth(2 / fontScale);
123 outlineNode->setLocalScale(fontScale);
125 m_styleNode = outlineNode;
128 const QVector<quint32> indexes = m_glyphs.glyphIndexes();
129 const QVector<QPointF> positions = m_glyphs.positions();
130 for (qsizetype i = 0; i < indexes.size(); ++i) {
132 m_baseLine = positions.at(i);
133 curveGlyphAtlas->addGlyph(m_glyphNode,
135 m_position + positions.at(i),
137 if (raisedSunkenStyleNode !=
nullptr) {
138 curveGlyphAtlas->addGlyph(raisedSunkenStyleNode,
140 m_position + positions.at(i) + offset,
143 if (outlineNode !=
nullptr) {
147 curveGlyphAtlas->addStroke(outlineNode,
149 (m_position + positions.at(i)) / fontScale);
153 if (m_styleNode !=
nullptr) {
154 m_styleNode->cookGeometry();
155 appendChildNode(m_styleNode);
158 m_glyphNode->cookGeometry();
159 appendChildNode(m_glyphNode);
161 m_dirtyGeometry =
false;