19QSGCurveGlyphNode::QSGCurveGlyphNode(QSGRenderContext *context)
20 : QSGGlyphNode(QSGTextNode::CurveRendering)
22 , m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 0)
23 , m_dirtyGeometry(
false)
25 setFlag(UsePreprocess);
26 setFlag(OwnsMaterial);
29 setGeometry(&m_geometry);
30 setMaterial(
new QSGTextureMaterial);
92void QSGCurveGlyphNode::setGlyphs(
const QPointF &position,
const QGlyphRun &glyphs)
96 QRawFont font = glyphs.rawFont();
97 m_fontSize = font.pixelSize();
98 m_position = QPointF(position.x(), position.y() - font.ascent());
101 m_dirtyGeometry =
true;
103#ifdef QSG_RUNTIME_DESCRIPTION
104 qsgnode_set_description(
this, QString::number(glyphs.glyphIndexes().count())
105 + QStringLiteral(
" curve glyphs: ")
106 + m_glyphs.rawFont().familyName()
107 + QStringLiteral(
" ")
108 + QString::number(m_glyphs.rawFont().pixelSize()));
123void QSGCurveGlyphNode::updateGeometry()
127 QSGCurveGlyphAtlas *curveGlyphAtlas = m_context->curveGlyphAtlas(m_glyphs.rawFont());
128 curveGlyphAtlas->populate(m_glyphs.glyphIndexes());
130 m_glyphNode =
new QSGCurveFillNode;
131 m_glyphNode->setColor(m_color);
135 float fontScale =
float(m_fontSize / curveGlyphAtlas->fontSize());
136 QSGCurveFillNode *raisedSunkenStyleNode =
nullptr;
137 QSGCurveStrokeNode *outlineNode =
nullptr;
138 if (m_style == QQuickText::Raised || m_style == QQuickText::Sunken) {
139 raisedSunkenStyleNode =
new QSGCurveFillNode;
140 raisedSunkenStyleNode ->setColor(m_styleColor);
142 offset = m_style == QQuickText::Raised ? QPointF(0.0f, 1.0f) : QPointF(0.0f, -1.0f);
143 m_styleNode = raisedSunkenStyleNode;
144 }
else if (m_style == QQuickText::Outline) {
145 outlineNode =
new QSGCurveStrokeNode;
146 outlineNode->setColor(m_styleColor);
147 outlineNode->setStrokeWidth(2 / fontScale);
148 outlineNode->setLocalScale(fontScale);
150 m_styleNode = outlineNode;
153 const QList<quint32> indexes = m_glyphs.glyphIndexes();
154 const QList<QPointF> positions = m_glyphs.positions();
155 for (qsizetype i = 0; i < indexes.size(); ++i) {
157 m_baseLine = positions.at(i);
158 curveGlyphAtlas->addGlyph(m_glyphNode,
160 m_position + positions.at(i),
162 if (raisedSunkenStyleNode !=
nullptr) {
163 curveGlyphAtlas->addGlyph(raisedSunkenStyleNode,
165 m_position + positions.at(i) + offset,
168 if (outlineNode !=
nullptr) {
172 curveGlyphAtlas->addStroke(outlineNode,
174 (m_position + positions.at(i)) / fontScale);
178 if (m_styleNode !=
nullptr) {
179 m_styleNode->cookGeometry();
180 appendChildNode(m_styleNode);
183 m_glyphNode->cookGeometry();
184 appendChildNode(m_glyphNode);
186 m_dirtyGeometry =
false;