13 : QSGGlyphNode(QSGTextNode::NativeRendering)
15 , m_glyphNodeType(RootGlyphNode)
16 , m_dirtyGeometry(
false)
18 , m_preferredAntialiasingMode(DefaultAntialiasing)
19 , m_style(QQuickText::Normal)
20 , m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 0)
22 setFlag(UsePreprocess);
23 setFlag(OwnsMaterial);
24 m_geometry.setDrawingMode(QSGGeometry::DrawTriangles);
25 setGeometry(&m_geometry);
99void QSGDefaultGlyphNode::update()
106 const auto *fontEngine = QRawFontPrivate::get(font)->fontEngine;
107 const bool isColorFont = fontEngine->glyphFormat == QFontEngine::Format_ARGB;
110 if (m_style == QQuickText::Normal || isColorFont) {
111 QFontEngine::GlyphFormat glyphFormat;
115 glyphFormat = QFontEngine::Format_None;
117 switch (m_preferredAntialiasingMode) {
118 case GrayAntialiasing:
119 glyphFormat = QFontEngine::Format_A8;
121 case HighQualitySubPixelAntialiasing:
122 case LowQualitySubPixelAntialiasing:
123 glyphFormat = QFontEngine::Format_A32;
126 glyphFormat = QFontEngine::Format_None;
131 const auto rgbColor = m_color.toRgb();
132 material =
new QSGTextMaskMaterial(m_context, QVector4D(rgbColor.redF(), rgbColor.greenF(), rgbColor.blueF(), rgbColor.alphaF()), font, glyphFormat);
133 }
else if (m_style == QQuickText::Outline) {
140 if (m_style == QQuickText::Sunken) {
141 m->setStyleShift(QVector2D(0, -1));
143 }
else if (m_style == QQuickText::Raised) {
144 m->setStyleShift(QVector2D(0, 1));
154 material->populate(m_position, m_glyphs.glyphIndexes(), m_glyphs.positions(), geometry(),
155 &boundingRect, &m_baseLine, margins);
156 setBoundingRect(boundingRect);
158 setMaterial(material);
159 markDirty(DirtyGeometry);
171void QSGDefaultGlyphNode::updateGeometry()
175 QSGNode *subnode = firstChild();
179 m_nodesToDelete.append(subnode);
180 subnode = subnode->nextSibling();
182 removeAllChildNodes();
186 const QList<quint32> indexes = m_glyphs.glyphIndexes();
187 const QList<QPointF> positions = m_glyphs.positions();
189 const int maxGlyphs = (USHRT_MAX + 1) / 4;
190 const int maxVertices = maxGlyphs * 4;
191 const int maxIndexes = maxGlyphs * 6;
193 for (
int i = 0; i < indexes.size(); ++i) {
194 const int glyphIndex = indexes.at(i);
195 const QPointF position = positions.at(i);
202 if (i >= maxGlyphs) {
203 glyphInfo.indexes.append(glyphIndex);
204 glyphInfo.positions.append(position);
209 if (!glyphInfo.indexes.isEmpty()) {
210 QGlyphRun subNodeGlyphRun(m_glyphs);
211 subNodeGlyphRun.setGlyphIndexes(glyphInfo.indexes);
212 subNodeGlyphRun.setPositions(glyphInfo.positions);
214 QSGDefaultGlyphNode *subNode =
new QSGDefaultGlyphNode(m_context);
215 subNode->setGlyphNodeType(SubGlyphNode);
216 subNode->setColor(m_color);
217 subNode->setStyle(m_style);
218 subNode->setStyleColor(m_styleColor);
219 subNode->setGlyphs(m_position, subNodeGlyphRun);
221 subNode->updateGeometry();
222 appendChildNode(subNode);
224 QSGGeometry *g = geometry();
226 QSGGeometry::TexturedPoint2D *vertexData = g->vertexDataAsTexturedPoint2D();
227 quint16 *indexData = g->indexDataAsUShort();
229 QList<QSGGeometry::TexturedPoint2D> tempVertexData(maxVertices);
230 QList<quint16> tempIndexData(maxIndexes);
232 for (
int i = 0; i < maxGlyphs; i++) {
233 tempVertexData[i * 4 + 0] = vertexData[i * 4 + 0];
234 tempVertexData[i * 4 + 1] = vertexData[i * 4 + 1];
235 tempVertexData[i * 4 + 2] = vertexData[i * 4 + 2];
236 tempVertexData[i * 4 + 3] = vertexData[i * 4 + 3];
238 tempIndexData[i * 6 + 0] = indexData[i * 6 + 0];
239 tempIndexData[i * 6 + 1] = indexData[i * 6 + 1];
240 tempIndexData[i * 6 + 2] = indexData[i * 6 + 2];
241 tempIndexData[i * 6 + 3] = indexData[i * 6 + 3];
242 tempIndexData[i * 6 + 4] = indexData[i * 6 + 4];
243 tempIndexData[i * 6 + 5] = indexData[i * 6 + 5];
246 g->allocate(maxVertices, maxIndexes);
247 vertexData = g->vertexDataAsTexturedPoint2D();
248 indexData = g->indexDataAsUShort();
250 for (
int i = 0; i < maxGlyphs; i++) {
251 vertexData[i * 4 + 0] = tempVertexData[i * 4 + 0];
252 vertexData[i * 4 + 1] = tempVertexData[i * 4 + 1];
253 vertexData[i * 4 + 2] = tempVertexData[i * 4 + 2];
254 vertexData[i * 4 + 3] = tempVertexData[i * 4 + 3];
256 indexData[i * 6 + 0] = tempIndexData[i * 6 + 0];
257 indexData[i * 6 + 1] = tempIndexData[i * 6 + 1];
258 indexData[i * 6 + 2] = tempIndexData[i * 6 + 2];
259 indexData[i * 6 + 3] = tempIndexData[i * 6 + 3];
260 indexData[i * 6 + 4] = tempIndexData[i * 6 + 4];
261 indexData[i * 6 + 5] = tempIndexData[i * 6 + 5];
265 m_dirtyGeometry =
false;