Fixed QSGDistanceFieldGlyphNode initialization order.
authorYoann Lopes <yoann.lopes@nokia.com>
Mon, 18 Jul 2011 11:17:46 +0000 (13:17 +0200)
committerQt by Nokia <qt-info@nokia.com>
Wed, 20 Jul 2011 04:57:44 +0000 (06:57 +0200)
Change-Id: Id2e8ccf6441ce7e7a2bcdd6f0d50745e7d9ba653
Reviewed-on: http://codereview.qt.nokia.com/1750
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Yoann Lopes <yoann.lopes@nokia.com>
src/declarative/items/qsgtextnode.cpp
src/declarative/scenegraph/qsgadaptationlayer_p.h
src/declarative/scenegraph/qsgdefaultglyphnode_p.h
src/declarative/scenegraph/qsgdistancefieldglyphnode.cpp
src/declarative/scenegraph/qsgdistancefieldglyphnode_p.h

index 2eb705f..d36db1b 100644 (file)
@@ -162,9 +162,13 @@ QSGGlyphNode *QSGTextNode::addGlyphs(const QPointF &position, const QGlyphRun &g
             dfNode->setStyleColor(styleColor);
         }
         node->setColor(color);
-        appendChildNode(node);
     }
 
+    node->update();
+
+    if (node != prevNode)
+        appendChildNode(node);
+
     return node;
 }
 
index 33f664f..81b17a9 100644 (file)
@@ -112,6 +112,8 @@ public:
 
     virtual void setPreferredAntialiasingMode(AntialiasingMode) = 0;
 
+    virtual void update() = 0;
+
 protected:
     QRectF m_bounding_rect;
 };
index 8d79d11..16e267b 100644 (file)
@@ -65,6 +65,8 @@ public:
 
     virtual void setPreferredAntialiasingMode(AntialiasingMode) { }
 
+    virtual void update() { }
+
 private:
     QGlyphRun m_glyphs;
     QPointF m_position;
index 343487b..26326d0 100644 (file)
@@ -52,6 +52,9 @@ QSGDistanceFieldGlyphNode::QSGDistanceFieldGlyphNode()
     , m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 0)
     , m_style(QSGText::Normal)
     , m_antialiasingMode(GrayAntialiasing)
+    , m_dirtyFont(false)
+    , m_dirtyGeometry(false)
+    , m_dirtyMaterial(false)
 {
     m_geometry.setDrawingMode(GL_TRIANGLES);
     setGeometry(&m_geometry);
@@ -84,7 +87,7 @@ void QSGDistanceFieldGlyphNode::setPreferredAntialiasingMode(AntialiasingMode mo
     if (mode == m_antialiasingMode)
         return;
     m_antialiasingMode = mode;
-    updateMaterial();
+    m_dirtyMaterial = true;
 }
 
 void QSGDistanceFieldGlyphNode::setGlyphs(const QPointF &position, const QGlyphRun &glyphs)
@@ -93,23 +96,35 @@ void QSGDistanceFieldGlyphNode::setGlyphs(const QPointF &position, const QGlyphR
     m_position = QPointF(position.x(), position.y() - font.ascent());
     m_glyphs = glyphs;
 
-    updateFont();
-    updateGeometry();
-    updateMaterial();
-
-#ifdef QML_RUNTIME_TESTING
-    description = QLatin1String("glyphs");
-#endif
+    m_dirtyFont = true;
+    m_dirtyGeometry = true;
+    m_dirtyMaterial = true;
 }
 
 void QSGDistanceFieldGlyphNode::setStyle(QSGText::TextStyle style)
 {
+    if (m_style == style)
+        return;
     m_style = style;
+    m_dirtyMaterial = true;
 }
 
 void QSGDistanceFieldGlyphNode::setStyleColor(const QColor &color)
 {
+    if (m_styleColor == color)
+        return;
     m_styleColor = color;
+    m_dirtyMaterial = true;
+}
+
+void QSGDistanceFieldGlyphNode::update()
+{
+    if (m_dirtyFont)
+        updateFont();
+    if (m_dirtyGeometry)
+        updateGeometry();
+    if (m_dirtyMaterial)
+        updateMaterial();
 }
 
 void QSGDistanceFieldGlyphNode::updateGeometry()
@@ -225,11 +240,13 @@ void QSGDistanceFieldGlyphNode::updateGeometry()
 
     setBoundingRect(boundingRect);
     markDirty(DirtyGeometry);
+    m_dirtyGeometry = false;
 }
 
 void QSGDistanceFieldGlyphNode::updateFont()
 {
     m_glyph_cache = QSGDistanceFieldGlyphCache::get(QGLContext::currentContext(), m_glyphs.rawFont());
+    m_dirtyFont = false;
 }
 
 void QSGDistanceFieldGlyphNode::updateMaterial()
@@ -260,6 +277,7 @@ void QSGDistanceFieldGlyphNode::updateMaterial()
     m_material->setGlyphCache(m_glyph_cache);
     m_material->setColor(m_color);
     setMaterial(m_material);
+    m_dirtyMaterial = false;
 }
 
 QT_END_NAMESPACE
index 5d6ddd0..926a843 100644 (file)
@@ -69,6 +69,8 @@ public:
     void setStyle(QSGText::TextStyle style);
     void setStyleColor(const QColor &color);
 
+    virtual void update();
+
 private:
     void updateGeometry();
     void updateFont();
@@ -84,6 +86,10 @@ private:
     QSGText::TextStyle m_style;
     QColor m_styleColor;
     AntialiasingMode m_antialiasingMode;
+
+    uint m_dirtyFont: 1;
+    uint m_dirtyGeometry: 1;
+    uint m_dirtyMaterial: 1;
 };
 
 QT_END_HEADER