Avoid non-deterministic ordering of glyph nodes.
authoraavit <qt_aavit@ovi.com>
Wed, 30 May 2012 09:13:55 +0000 (11:13 +0200)
committerQt by Nokia <qt-info@nokia.com>
Wed, 30 May 2012 13:10:56 +0000 (15:10 +0200)
The ordering of glyph nodes depended on the internal ordering
of a QHash, where the key contains the value of a heap pointer,
so it could change with each run (even if QT_HASH_SEED was set).
This made effective regression testing impossible.

Change-Id: I1e5cff7db6d0db9ebbfb1e5b2e3d6e56170752b7
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
src/quick/items/qquicktextnode.cpp

index 597ebc4..db3c627 100644 (file)
@@ -966,6 +966,7 @@ namespace {
         // font, selection state and clip node.
         typedef QPair<QFontEngine *, QPair<QSGClipNode *, QPair<QRgb, int> > > KeyType;
         QHash<KeyType, BinaryTreeNode *> map;
+        QList<BinaryTreeNode *> nodes;
         for (int i=0; i<m_processedNodes.size(); ++i) {
             BinaryTreeNode *node = m_processedNodes.data() + i;
 
@@ -999,6 +1000,7 @@ namespace {
 
                 } else {
                     map.insert(key, node);
+                    nodes.append(node);
                 }
             } else {
                 parentNode->addImage(node->boundingRect, node->image);
@@ -1011,10 +1013,7 @@ namespace {
         }
 
         // ...and add clip nodes and glyphs to tree.
-        QHash<KeyType, BinaryTreeNode *>::const_iterator it = map.constBegin();
-        while (it != map.constEnd()) {
-
-            BinaryTreeNode *node = it.value();
+        foreach (const BinaryTreeNode *node, nodes) {
 
             QSGClipNode *clipNode = node->clipNode;
             if (clipNode != 0 && clipNode->parent() == 0 )
@@ -1025,8 +1024,6 @@ namespace {
                     : node->color;
 
             parentNode->addGlyphs(node->position, node->glyphRun, color, style, styleColor, clipNode);
-
-            ++it;
         }
     }
 }