aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/scenegraph/qsgdistancefieldglyphnode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick/scenegraph/qsgdistancefieldglyphnode.cpp')
-rw-r--r--src/quick/scenegraph/qsgdistancefieldglyphnode.cpp61
1 files changed, 31 insertions, 30 deletions
diff --git a/src/quick/scenegraph/qsgdistancefieldglyphnode.cpp b/src/quick/scenegraph/qsgdistancefieldglyphnode.cpp
index 16a8ce2d79..d6fe6f938c 100644
--- a/src/quick/scenegraph/qsgdistancefieldglyphnode.cpp
+++ b/src/quick/scenegraph/qsgdistancefieldglyphnode.cpp
@@ -47,7 +47,8 @@
QT_BEGIN_NAMESPACE
QSGDistanceFieldGlyphNode::QSGDistanceFieldGlyphNode(QSGContext *context)
- : m_context(context)
+ : m_glyphNodeType(RootGlyphNode)
+ , m_context(context)
, m_material(0)
, m_glyph_cache(0)
, m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 0)
@@ -69,15 +70,17 @@ QSGDistanceFieldGlyphNode::~QSGDistanceFieldGlyphNode()
{
delete m_material;
+ if (m_glyphNodeType == SubGlyphNode)
+ return;
+
if (m_glyph_cache) {
m_glyph_cache->release(m_glyphs.glyphIndexes());
m_glyph_cache->unregisterGlyphNode(this);
m_glyph_cache->unregisterOwnerElement(ownerElement());
}
- for (int i = 0; i < m_nodesToDelete.count(); ++i)
- delete m_nodesToDelete.at(i);
- m_nodesToDelete.clear();
+ while (m_nodesToDelete.count())
+ delete m_nodesToDelete.takeLast();
}
void QSGDistanceFieldGlyphNode::setColor(const QColor &color)
@@ -106,8 +109,15 @@ void QSGDistanceFieldGlyphNode::setGlyphs(const QPointF &position, const QGlyphR
m_position = QPointF(position.x(), position.y() - font.ascent());
m_glyphs = glyphs;
+ m_dirtyGeometry = true;
+ m_dirtyMaterial = true;
+
QSGDistanceFieldGlyphCache *oldCache = m_glyph_cache;
m_glyph_cache = m_context->distanceFieldGlyphCache(m_glyphs.rawFont());
+
+ if (m_glyphNodeType == SubGlyphNode)
+ return;
+
if (m_glyph_cache != oldCache) {
Q_ASSERT(ownerElement() != 0);
if (oldCache) {
@@ -122,9 +132,6 @@ void QSGDistanceFieldGlyphNode::setGlyphs(const QPointF &position, const QGlyphR
const QVector<quint32> glyphIndexes = m_glyphs.glyphIndexes();
for (int i = 0; i < glyphIndexes.count(); ++i)
m_allGlyphIndexesLookup.insert(glyphIndexes.at(i));
-
- m_dirtyGeometry = true;
- m_dirtyMaterial = true;
}
void QSGDistanceFieldGlyphNode::setStyle(QQuickText::TextStyle style)
@@ -153,9 +160,8 @@ void QSGDistanceFieldGlyphNode::preprocess()
{
Q_ASSERT(m_glyph_cache);
- for (int i = 0; i < m_nodesToDelete.count(); ++i)
- delete m_nodesToDelete.at(i);
- m_nodesToDelete.clear();
+ while (m_nodesToDelete.count())
+ delete m_nodesToDelete.takeLast();
m_glyph_cache->processPendingGlyphs();
m_glyph_cache->update();
@@ -182,14 +188,15 @@ void QSGDistanceFieldGlyphNode::updateGeometry()
Q_ASSERT(m_glyph_cache);
// Remove previously created sub glyph nodes
- QHash<const QSGDistanceFieldGlyphCache::Texture *, QSGDistanceFieldGlyphNode *>::iterator it = m_subNodes.begin();
- while (it != m_subNodes.end()) {
- removeChildNode(it.value());
+ // We assume all the children are sub glyph nodes
+ QSGNode *subnode = firstChild();
+ while (subnode) {
// We can't delete the node now as it might be in the preprocess list
// It will be deleted in the next preprocess
- m_nodesToDelete.append(it.value());
- it = m_subNodes.erase(it);
+ m_nodesToDelete.append(subnode);
+ subnode = subnode->nextSibling();
}
+ removeAllChildNodes();
QSGGeometry *g = geometry();
@@ -287,25 +294,19 @@ void QSGDistanceFieldGlyphNode::updateGeometry()
QHash<const QSGDistanceFieldGlyphCache::Texture *, GlyphInfo>::const_iterator ite = glyphsInOtherTextures.constBegin();
while (ite != glyphsInOtherTextures.constEnd()) {
- QHash<const QSGDistanceFieldGlyphCache::Texture *, QSGDistanceFieldGlyphNode *>::iterator subIt = m_subNodes.find(ite.key());
- if (subIt == m_subNodes.end()) {
- QSGDistanceFieldGlyphNode *subNode = new QSGDistanceFieldGlyphNode(m_context);
- subNode->setOwnerElement(m_ownerElement);
- subNode->setColor(m_color);
- subNode->setStyle(m_style);
- subNode->setStyleColor(m_styleColor);
- subNode->update();
- appendChildNode(subNode);
- subIt = m_subNodes.insert(ite.key(), subNode);
- }
-
QGlyphRun subNodeGlyphRun(m_glyphs);
subNodeGlyphRun.setGlyphIndexes(ite->indexes);
subNodeGlyphRun.setPositions(ite->positions);
- subIt.value()->setGlyphs(m_originalPosition, subNodeGlyphRun);
- subIt.value()->update();
- subIt.value()->updateGeometry(); // we have to explicity call this now as preprocess won't be called before it's rendered
+ QSGDistanceFieldGlyphNode *subNode = new QSGDistanceFieldGlyphNode(m_context);
+ subNode->setGlyphNodeType(SubGlyphNode);
+ subNode->setColor(m_color);
+ subNode->setStyle(m_style);
+ subNode->setStyleColor(m_styleColor);
+ subNode->setGlyphs(m_originalPosition, subNodeGlyphRun);
+ subNode->update();
+ subNode->updateGeometry(); // we have to explicity call this now as preprocess won't be called before it's rendered
+ appendChildNode(subNode);
++ite;
}