From cb2a108d79b09ec6ea91106e7f33826dceac4a42 Mon Sep 17 00:00:00 2001
From: Charles Yin <charles.yin@nokia.com>
Date: Wed, 27 Oct 2010 12:05:52 +1000
Subject: Fix QTBUG-14132 oracle (xe) stored procedures with bind variables get
 errors

Strange Oracle bug: some Oracle servers crash the server process with non-zero error handle (mostly for 10g).
So pass null error handle pointer to OCIAttrSet when setting OCI_ATTR_CHARSET_FORM to bypass this bug.

Change-Id: Ifcf65994a22783e69a89bebe1adb882cdf36bdbb
Task-number:QTBUG-14132
Reviewed-by: Michael Goddard
---
 src/sql/drivers/oci/qsql_oci.cpp       | 106 +++++++++++++--------------------
 tests/auto/qsqlquery/tst_qsqlquery.cpp |  21 +++++++
 2 files changed, 63 insertions(+), 64 deletions(-)

diff --git a/src/sql/drivers/oci/qsql_oci.cpp b/src/sql/drivers/oci/qsql_oci.cpp
index e11cf75..3f30ea5 100644
--- a/src/sql/drivers/oci/qsql_oci.cpp
+++ b/src/sql/drivers/oci/qsql_oci.cpp
@@ -93,11 +93,13 @@ enum { QOCIEncoding = 2002 }; // AL16UTF16LE
 enum { QOCIEncoding = 2000 }; // AL16UTF16
 #endif
 
+#ifdef OCI_ATTR_CHARSET_FORM
 // Always set the OCI_ATTR_CHARSET_FORM to SQLCS_NCHAR is safe
 // because Oracle server will deal with the implicit Conversion
 // Between CHAR and NCHAR.
 // see: http://download.oracle.com/docs/cd/A91202_01/901_doc/appdev.901/a89857/oci05bnd.htm#422705 
 static const ub1 qOraCharsetForm = SQLCS_NCHAR;
+#endif
 
 #if defined (OCI_UTF16ID)
 static const ub2 qOraCharset = OCI_UTF16ID;
@@ -117,6 +119,8 @@ static // for some reason, Sun CC can't use qOraWarning when it's declared stati
 void qOraWarning(const char* msg, OCIError *err);
 static QSqlError qMakeError(const QString& errString, QSqlError::ErrorType type, OCIError *err);
 
+
+
 class QOCIRowId: public QSharedData
 {
 public:
@@ -164,7 +168,6 @@ struct QOCIResultPrivate
     int serverVersion;
     int prefetchRows, prefetchMem;
 
-    void setCharset(OCIBind* hbnd);
     void setStatementAttributes();
     int bindValue(OCIStmt *sql, OCIBind **hbnd, OCIError *err, int pos,
                   const QVariant &val, dvoid *indPtr, ub2 *tmpSize, QList<QByteArray> &tmpStorage);
@@ -176,6 +179,41 @@ struct QOCIResultPrivate
     { return q->bindValueType(i) & QSql::Out; }
     inline bool isBinaryValue(int i) const
     { return q->bindValueType(i) & QSql::Binary; }
+
+    void setCharset(dvoid* handle, ub4 type) const
+    {
+        int r = 0;
+        Q_ASSERT(handle);
+
+#ifdef OCI_ATTR_CHARSET_FORM
+        r = OCIAttrSet(handle,
+                       type,
+                       // this const cast is safe since OCI doesn't touch
+                       // the charset.
+                       const_cast<void *>(static_cast<const void *>(&qOraCharsetForm)),
+                       0,
+                       OCI_ATTR_CHARSET_FORM,
+                       //Strange Oracle bug: some Oracle servers crash the server process with non-zero error handle (mostly for 10g).
+                       //So ignore the error message here.
+                       0);
+        #ifdef QOCI_DEBUG
+        if (r != 0)
+            qWarning("QOCIResultPrivate::setCharset: Couldn't set OCI_ATTR_CHARSET_FORM.");
+        #endif
+#endif
+
+        r = OCIAttrSet(handle,
+                       type,
+                       // this const cast is safe since OCI doesn't touch
+                       // the charset.
+                       const_cast<void *>(static_cast<const void *>(&qOraCharset)),
+                       0,
+                       OCI_ATTR_CHARSET_ID,
+                       err);
+        if (r != 0)
+            qOraWarning("QOCIResultPrivate::setCharsetI Couldn't set OCI_ATTR_CHARSET_ID: ", err);
+
+    }
 };
 
 void QOCIResultPrivate::setStatementAttributes()
@@ -208,36 +246,6 @@ void QOCIResultPrivate::setStatementAttributes()
     }
 }
 
-void QOCIResultPrivate::setCharset(OCIBind* hbnd)
-{
-    int r = 0;
-
-    Q_ASSERT(hbnd);
-
-    r = OCIAttrSet(hbnd,
-                   OCI_HTYPE_BIND,
-                   // this const cast is safe since OCI doesn't touch
-                   // the charset.
-                   const_cast<void *>(static_cast<const void *>(&qOraCharsetForm)),
-                   0,
-                   OCI_ATTR_CHARSET_FORM,
-                   err);
-    if (r != 0)
-        qOraWarning("QOCIResultPrivate::setCharset: Couldn't set OCI_ATTR_CHARSET_FORM: ", err);
-
-    r = OCIAttrSet(hbnd,
-                   OCI_HTYPE_BIND,
-                   // this const cast is safe since OCI doesn't touch
-                   // the charset.
-                   const_cast<void *>(static_cast<const void *>(&qOraCharset)),
-                   0,
-                   OCI_ATTR_CHARSET_ID,
-                   err);
-    if (r != 0)
-        qOraWarning("QOCIResultPrivate::setCharset: Couldn't set OCI_ATTR_CHARSET_ID: ", err);
-
-}
-
 int QOCIResultPrivate::bindValue(OCIStmt *sql, OCIBind **hbnd, OCIError *err, int pos,
                    const QVariant &val, dvoid *indPtr, ub2 *tmpSize, QList<QByteArray> &tmpStorage)
 {
@@ -325,7 +333,7 @@ int QOCIResultPrivate::bindValue(OCIStmt *sql, OCIBind **hbnd, OCIError *err, in
                              (s.length() + 1) * sizeof(QChar),
                              SQLT_STR, indPtr, 0, 0, 0, 0, OCI_DEFAULT);
             if (r == OCI_SUCCESS)
-                setCharset(*hbnd);
+                setCharset(*hbnd, OCI_HTYPE_BIND);
             break;
         }
     } // fall through for OUT values
@@ -349,7 +357,7 @@ int QOCIResultPrivate::bindValue(OCIStmt *sql, OCIBind **hbnd, OCIError *err, in
                              SQLT_STR, indPtr, 0, 0, 0, 0, OCI_DEFAULT);
         }
         if (r == OCI_SUCCESS)
-            setCharset(*hbnd);
+            setCharset(*hbnd, OCI_HTYPE_BIND);
         tmpStorage.append(ba);
         break;
     } // default case
@@ -688,7 +696,6 @@ class QOCICols
 public:
     QOCICols(int size, QOCIResultPrivate* dp);
     ~QOCICols();
-    void setCharset(OCIDefine* dfn);
     int readPiecewise(QVector<QVariant> &values, int index = 0);
     int readLOBs(QVector<QVariant> &values, int index = 0);
     int fieldFromDefine(OCIDefine* d);
@@ -890,7 +897,7 @@ QOCICols::QOCICols(int size, QOCIResultPrivate* dp)
                         &(fieldInf[idx].ind),
                         0, 0, OCI_DEFAULT);
                 if (r == 0)
-                    setCharset(dfn);
+                    d->setCharset(dfn, OCI_HTYPE_DEFINE);
             }
            break;
         default:
@@ -950,35 +957,6 @@ OCILobLocator **QOCICols::createLobLocator(int position, OCIEnv* env)
     return &lob;
 }
 
-void QOCICols::setCharset(OCIDefine* dfn)
-{
-    int r = 0;
-
-    Q_ASSERT(dfn);
-
-    r = OCIAttrSet(dfn,
-                   OCI_HTYPE_DEFINE,
-                   // this const cast is safe since OCI doesn't touch
-                   // the charset.
-                   const_cast<void *>(static_cast<const void *>(&qOraCharsetForm)),
-                   0,
-                   OCI_ATTR_CHARSET_FORM,
-                   d->err);
-    if (r != 0)
-        qOraWarning("QOCIResultPrivate::setCharset: Couldn't set OCI_ATTR_CHARSET_FORM: ", d->err);
-
-    r = OCIAttrSet(dfn,
-                   OCI_HTYPE_DEFINE,
-                   // this const cast is safe since OCI doesn't touch
-                   // the charset.
-                   const_cast<void *>(static_cast<const void *>(&qOraCharset)),
-                   0,
-                   OCI_ATTR_CHARSET_ID,
-                   d->err);
-        if (r != 0)
-            qOraWarning("QOCICols::setCharset: Couldn't set OCI_ATTR_CHARSET_ID: ", d->err);
-}
-
 int QOCICols::readPiecewise(QVector<QVariant> &values, int index)
 {
     OCIDefine*     dfn;
diff --git a/tests/auto/qsqlquery/tst_qsqlquery.cpp b/tests/auto/qsqlquery/tst_qsqlquery.cpp
index c7a61a5..7c93c7a 100644
--- a/tests/auto/qsqlquery/tst_qsqlquery.cpp
+++ b/tests/auto/qsqlquery/tst_qsqlquery.cpp
@@ -209,6 +209,8 @@ private slots:
     void QTBUG_6852();
     void QTBUG_5765_data() { generic_data("QMYSQL"); }
     void QTBUG_5765();
+    void QTBUG_14132_data() { generic_data("QOCI"); }
+    void QTBUG_14132();
     void sqlite_constraint_data() { generic_data("QSQLITE"); }
     void sqlite_constraint();
 
@@ -2933,6 +2935,25 @@ void tst_QSqlQuery::QTBUG_551()
     QCOMPARE(res_outLst[2].toString(), QLatin1String("3. Value is 2"));
 }
 
+void tst_QSqlQuery::QTBUG_14132()
+{
+    QFETCH( QString, dbName );
+    QSqlDatabase db = QSqlDatabase::database( dbName );
+    CHECK_DATABASE( db );
+    QSqlQuery q(db);
+    const QString procedureName(qTableName("procedure", __FILE__));
+    QVERIFY_SQL(q, exec("CREATE OR REPLACE PROCEDURE "+ procedureName + " (outStr OUT varchar2)  \n\
+                        is \n\
+                        begin \n\
+                        outStr := 'OUTSTRING'; \n\
+                        end;"));
+    QString outValue = "XXXXXXXXX";
+    q.prepare("CALL "+procedureName+"(?)");
+    q.addBindValue(outValue, QSql::Out);
+    QVERIFY_SQL(q, exec());
+    QCOMPARE(outValue, QLatin1String("OUTSTRING"));
+}
+
 void tst_QSqlQuery::QTBUG_5251()
 {
     QFETCH( QString, dbName );
-- 
cgit v0.12


From c76f9f15d1c604cdf3d68d2147a4a06d227871fa Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
Date: Thu, 28 Oct 2010 09:27:24 +0200
Subject: Fix possible crash in QStaticText and QDeclarativeTextLayout

The QStaticTextItem held an uncounted reference to QFontEngine. The
pointer would dangle in some cases where there was no font object
referencing the engine and the cache was cleaned out (e.g. when a
new application font is added.) Properly count the reference, and also
add reference counting to userData to make it harder to shoot yourself
in the foot, since the QStaticTextItem class is now being used in
different places,

Task-number: QTBUG-14446
Reviewed-by: Martin Jones
---
 .../graphicsitems/qdeclarativetextlayout.cpp       |  4 +-
 src/gui/painting/qpaintengine_raster.cpp           |  2 +-
 src/gui/painting/qpainter.cpp                      |  4 +-
 src/gui/text/qstatictext.cpp                       | 22 ++++++++-
 src/gui/text/qstatictext_p.h                       | 54 ++++++++++++++++++----
 .../gl2paintengineex/qpaintengineex_opengl2.cpp    | 24 +++++-----
 src/opengl/qpaintengine_opengl.cpp                 |  8 ++--
 src/openvg/qpaintengine_vg.cpp                     |  2 +-
 8 files changed, 88 insertions(+), 32 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativetextlayout.cpp b/src/declarative/graphicsitems/qdeclarativetextlayout.cpp
index 89a2158..635ceab 100644
--- a/src/declarative/graphicsitems/qdeclarativetextlayout.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextlayout.cpp
@@ -94,7 +94,7 @@ class DrawTextItemRecorder: public QPaintEngine
             if (!m_inertText->items.isEmpty()) {
                 QStaticTextItem &last = m_inertText->items[m_inertText->items.count() - 1];
 
-                if (last.fontEngine == ti.fontEngine && last.font == ti.font() && 
+                if (last.fontEngine() == ti.fontEngine && last.font == ti.font() &&
                     (!m_dirtyPen || last.color == state->pen().color())) {
                     needFreshCurrentItem = false;
 
@@ -107,7 +107,7 @@ class DrawTextItemRecorder: public QPaintEngine
             if (needFreshCurrentItem) {
                 QStaticTextItem currentItem;
 
-                currentItem.fontEngine = ti.fontEngine;
+                currentItem.setFontEngine(ti.fontEngine);
                 currentItem.font = ti.font();
                 currentItem.charOffset = charOffset;
                 currentItem.numChars = ti.num_chars;
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 8f9d8ba..d4b044b 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -3300,7 +3300,7 @@ void QRasterPaintEngine::drawStaticTextItem(QStaticTextItem *textItem)
     ensureState();
 
     drawCachedGlyphs(textItem->numGlyphs, textItem->glyphs, textItem->glyphPositions,
-                     textItem->fontEngine);
+                     textItem->fontEngine());
 }
 
 /*!
diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp
index 7fed7e4..ab9707d 100644
--- a/src/gui/painting/qpainter.cpp
+++ b/src/gui/painting/qpainter.cpp
@@ -5746,7 +5746,7 @@ void QPainterPrivate::drawGlyphs(const quint32 *glyphArray, const QPointF *posit
         QStaticTextItem staticTextItem;
         staticTextItem.color = state->pen.color();
         staticTextItem.font = state->font;
-        staticTextItem.fontEngine = fontEngine;
+        staticTextItem.setFontEngine(fontEngine);
         staticTextItem.numGlyphs = glyphCount;
         staticTextItem.glyphs = reinterpret_cast<glyph_t *>(const_cast<glyph_t *>(glyphArray));
         staticTextItem.glyphPositions = positions.data();
@@ -5938,7 +5938,7 @@ void QPainter::drawStaticText(const QPointF &topLeftPosition, const QStaticText
         d->extended->drawStaticTextItem(item);
 
         drawDecorationForGlyphs(this, item->glyphs, item->glyphPositions,
-                                item->numGlyphs, item->fontEngine, staticText_d->font,
+                                item->numGlyphs, item->fontEngine(), staticText_d->font,
                                 QTextCharFormat());
     }
     if (currentColor != oldPen.color())
diff --git a/src/gui/text/qstatictext.cpp b/src/gui/text/qstatictext.cpp
index 9506006..edf248a 100644
--- a/src/gui/text/qstatictext.cpp
+++ b/src/gui/text/qstatictext.cpp
@@ -445,7 +445,7 @@ namespace {
             const QTextItemInt &ti = static_cast<const QTextItemInt &>(textItem);
 
             QStaticTextItem currentItem;
-            currentItem.fontEngine = ti.fontEngine;
+            currentItem.setFontEngine(ti.fontEngine);
             currentItem.font = ti.font();
             currentItem.charOffset = m_chars.size();
             currentItem.numChars = ti.num_chars;
@@ -713,4 +713,24 @@ void QStaticTextPrivate::init()
     needsRelayout = false;
 }
 
+QStaticTextItem::~QStaticTextItem()
+{
+    if (m_userData != 0 && !m_userData->ref.deref())
+        delete m_userData;
+    if (!m_fontEngine->ref.deref())
+        delete m_fontEngine;
+}
+
+void QStaticTextItem::setFontEngine(QFontEngine *fe)
+{
+    if (m_fontEngine != 0) {
+        if (!m_fontEngine->ref.deref())
+            delete m_fontEngine;
+    }
+
+    m_fontEngine = fe;
+    if (m_fontEngine != 0)
+        m_fontEngine->ref.ref();
+}
+
 QT_END_NAMESPACE
diff --git a/src/gui/text/qstatictext_p.h b/src/gui/text/qstatictext_p.h
index cb60626..87ef0d5 100644
--- a/src/gui/text/qstatictext_p.h
+++ b/src/gui/text/qstatictext_p.h
@@ -68,27 +68,60 @@ public:
         OpenGLUserData
     };
 
-    QStaticTextUserData(Type t) : type(t) {}
+    QStaticTextUserData(Type t) : type(t) { ref = 0; }
     virtual ~QStaticTextUserData() {}
 
+    QAtomicInt ref;
     Type type;
 };
 
 class Q_GUI_EXPORT QStaticTextItem
 {
 public:    
-    QStaticTextItem() : chars(0), numChars(0), fontEngine(0), userData(0),
-                        useBackendOptimizations(false), userDataNeedsUpdate(0) {}
-    ~QStaticTextItem() { delete userData; }
+    QStaticTextItem() : chars(0), numChars(0), useBackendOptimizations(false),
+                        userDataNeedsUpdate(0), m_fontEngine(0), m_userData(0) {}
+
+    QStaticTextItem(const QStaticTextItem &other)
+    {
+        operator=(other);
+    }
+
+    void operator=(const QStaticTextItem &other)
+    {
+        glyphPositions = other.glyphPositions;
+        glyphs = other.glyphs;
+        chars = other.chars;
+        numGlyphs = other.numGlyphs;
+        numChars = other.numChars;
+        font = other.font;
+        color = other.color;
+        useBackendOptimizations = other.useBackendOptimizations;
+        userDataNeedsUpdate = other.userDataNeedsUpdate;
+
+        m_fontEngine = 0;
+        m_userData = 0;
+        setUserData(other.userData());
+        setFontEngine(other.fontEngine());
+    }
+
+    ~QStaticTextItem();
 
     void setUserData(QStaticTextUserData *newUserData)
     {
-        if (userData == newUserData)
+        if (m_userData == newUserData)
             return;
 
-        delete userData;
-        userData = newUserData;
+        if (m_userData != 0 && !m_userData->ref.deref())
+            delete m_userData;
+
+        m_userData = newUserData;
+        if (m_userData != 0)
+            m_userData->ref.ref();
     }
+    QStaticTextUserData *userData() const { return m_userData; }
+
+    void setFontEngine(QFontEngine *fe);
+    QFontEngine *fontEngine() const { return m_fontEngine; }
 
     union {
         QFixedPoint *glyphPositions;             // 8 bytes per glyph
@@ -108,14 +141,17 @@ public:
                                                  // 12 bytes for pointers
     int numGlyphs;                               // 4 bytes per item
     int numChars;                                // 4 bytes per item
-    QFontEngine *fontEngine;                     // 4 bytes per item
     QFont font;                                  // 8 bytes per item
     QColor color;                                // 10 bytes per item
-    QStaticTextUserData *userData;               // 8 bytes per item
     char useBackendOptimizations : 1;            // 1 byte per item
     char userDataNeedsUpdate : 1;                //
                                                  // ================
                                                  // 51 bytes per item
+
+private: // Needs special handling in setters, so private to avoid abuse
+    QFontEngine *m_fontEngine;                     // 4 bytes per item
+    QStaticTextUserData *m_userData;               // 8 bytes per item
+
 };
 
 class QStaticText;
diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
index 84c7fed..1dcb773 100644
--- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
+++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
@@ -1350,8 +1350,8 @@ void QGL2PaintEngineEx::drawStaticTextItem(QStaticTextItem *textItem)
 
     ensureActive();
 
-    QFontEngineGlyphCache::Type glyphType = textItem->fontEngine->glyphFormat >= 0
-                                            ? QFontEngineGlyphCache::Type(textItem->fontEngine->glyphFormat)
+    QFontEngineGlyphCache::Type glyphType = textItem->fontEngine()->glyphFormat >= 0
+                                            ? QFontEngineGlyphCache::Type(textItem->fontEngine()->glyphFormat)
                                             : d->glyphCacheType;
     if (glyphType == QFontEngineGlyphCache::Raster_RGBMask) {
         if (d->device->alphaRequested() || state()->matrix.type() > QTransform::TxTranslate
@@ -1430,7 +1430,7 @@ void QGL2PaintEngineEx::drawTextItem(const QPointF &p, const QTextItem &textItem
         {
             QStaticTextItem staticTextItem;
             staticTextItem.chars = const_cast<QChar *>(ti.chars);
-            staticTextItem.fontEngine = ti.fontEngine;
+            staticTextItem.setFontEngine(ti.fontEngine);
             staticTextItem.glyphs = glyphs.data();
             staticTextItem.numChars = ti.num_chars;
             staticTextItem.numGlyphs = glyphs.size();
@@ -1475,18 +1475,18 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp
     QOpenGL2PaintEngineState *s = q->state();
 
     QGLTextureGlyphCache *cache =
-        (QGLTextureGlyphCache *) staticTextItem->fontEngine->glyphCache(ctx, glyphType, QTransform());
+        (QGLTextureGlyphCache *) staticTextItem->fontEngine()->glyphCache(ctx, glyphType, QTransform());
     if (!cache || cache->cacheType() != glyphType) {
         cache = new QGLTextureGlyphCache(ctx, glyphType, QTransform());
-        staticTextItem->fontEngine->setGlyphCache(ctx, cache);
+        staticTextItem->fontEngine()->setGlyphCache(ctx, cache);
     }
 
     bool recreateVertexArrays = false;
     if (staticTextItem->userDataNeedsUpdate)
         recreateVertexArrays = true;
-    else if (staticTextItem->userData == 0)
+    else if (staticTextItem->userData() == 0)
         recreateVertexArrays = true;
-    else if (staticTextItem->userData->type != QStaticTextUserData::OpenGLUserData)
+    else if (staticTextItem->userData()->type != QStaticTextUserData::OpenGLUserData)
         recreateVertexArrays = true;
 
     // We only need to update the cache with new glyphs if we are actually going to recreate the vertex arrays.
@@ -1494,8 +1494,8 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp
     // cache so this text is performed before we test if the cache size has changed.
     if (recreateVertexArrays) {
         cache->setPaintEnginePrivate(this);
-        cache->populate(staticTextItem->fontEngine, staticTextItem->numGlyphs, staticTextItem->glyphs,
-                        staticTextItem->glyphPositions);
+        cache->populate(staticTextItem->fontEngine(), staticTextItem->numGlyphs,
+                        staticTextItem->glyphs, staticTextItem->glyphPositions);
     }
 
     if (cache->width() == 0 || cache->height() == 0)
@@ -1515,14 +1515,14 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp
     if (staticTextItem->useBackendOptimizations) {
         QOpenGLStaticTextUserData *userData = 0;
 
-        if (staticTextItem->userData == 0
-            || staticTextItem->userData->type != QStaticTextUserData::OpenGLUserData) {
+        if (staticTextItem->userData() == 0
+            || staticTextItem->userData()->type != QStaticTextUserData::OpenGLUserData) {
 
             userData = new QOpenGLStaticTextUserData();
             staticTextItem->setUserData(userData);
 
         } else {
-            userData = static_cast<QOpenGLStaticTextUserData*>(staticTextItem->userData);
+            userData = static_cast<QOpenGLStaticTextUserData*>(staticTextItem->userData());
         }
 
         // Use cache if backend optimizations is turned on
diff --git a/src/opengl/qpaintengine_opengl.cpp b/src/opengl/qpaintengine_opengl.cpp
index 74b6b9a..a04d930 100644
--- a/src/opengl/qpaintengine_opengl.cpp
+++ b/src/opengl/qpaintengine_opengl.cpp
@@ -4918,7 +4918,7 @@ void QOpenGLPaintEngine::drawStaticTextItem(QStaticTextItem *textItem)
     d->flushDrawQueue();
 
     // make sure the glyphs we want to draw are in the cache
-    qt_glyph_cache()->cacheGlyphs(d->device->context(), textItem->fontEngine, textItem->glyphs,
+    qt_glyph_cache()->cacheGlyphs(d->device->context(), textItem->fontEngine(), textItem->glyphs,
                                   textItem->numGlyphs);
 
     d->setGradientOps(Qt::SolidPattern, QRectF()); // turns off gradient ops
@@ -4941,13 +4941,13 @@ void QOpenGLPaintEngine::drawStaticTextItem(QStaticTextItem *textItem)
 
     glEnableClientState(GL_VERTEX_ARRAY);
     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-    bool antialias = !(textItem->fontEngine->fontDef.styleStrategy & QFont::NoAntialias)
+    bool antialias = !(textItem->fontEngine()->fontDef.styleStrategy & QFont::NoAntialias)
 				   && (d->matrix.type() > QTransform::TxTranslate);
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, antialias ? GL_LINEAR : GL_NEAREST);
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, antialias ? GL_LINEAR : GL_NEAREST);
 
     for (int i=0; i< textItem->numGlyphs; ++i) {
-        QGLGlyphCoord *g = qt_glyph_cache()->lookup(textItem->fontEngine, textItem->glyphs[i]);
+        QGLGlyphCoord *g = qt_glyph_cache()->lookup(textItem->fontEngine(), textItem->glyphs[i]);
 
         // we don't cache glyphs with no width/height
         if (!g)
@@ -5003,7 +5003,7 @@ void QOpenGLPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textIte
     {
         QStaticTextItem staticTextItem;
         staticTextItem.chars = const_cast<QChar *>(ti.chars);
-        staticTextItem.fontEngine = ti.fontEngine;
+        staticTextItem.setFontEngine(ti.fontEngine);
         staticTextItem.glyphs = glyphs.data();
         staticTextItem.numChars = ti.num_chars;
         staticTextItem.numGlyphs = glyphs.size();
diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp
index ce9d11a..f8788b0 100644
--- a/src/openvg/qpaintengine_vg.cpp
+++ b/src/openvg/qpaintengine_vg.cpp
@@ -3407,7 +3407,7 @@ void QVGPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem)
 
 void QVGPaintEngine::drawStaticTextItem(QStaticTextItem *textItem)
 {
-    drawCachedGlyphs(textItem->numGlyphs, textItem->glyphs, textItem->font, textItem->fontEngine,
+    drawCachedGlyphs(textItem->numGlyphs, textItem->glyphs, textItem->font, textItem->fontEngine(),
                      QPointF(0, 0), textItem->glyphPositions);
 }
 
-- 
cgit v0.12


From c4d715260bd0ed5f3b6d38a63a2659715342c90a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Fri, 29 Oct 2010 13:37:43 +0200
Subject: Prevented threading related crash in OpenGL module.

If the last shallow copy of a QImage which is cached in the
QGLTextureCache is destroyed in a thread at the same time as the
QGLContext which the texture was initialized in is active in a different
thread, the QImage thread incorrectly tries to make the context active
in two threads at once. To prevent this from happening it's best to
always do the texture clean-up in the main thread.

Task-number: QT-4238
Reviewed-by: Eskil Abrahamsen Blomfeldt
---
 src/opengl/qgl.cpp         |   7 ++-
 src/opengl/qgl_p.h         |  68 +++++++++++++++++---------
 tests/auto/qgl/tst_qgl.cpp | 118 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 169 insertions(+), 24 deletions(-)

diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp
index dbd295f..84cfa97 100644
--- a/src/opengl/qgl.cpp
+++ b/src/opengl/qgl.cpp
@@ -127,7 +127,12 @@ Q_GLOBAL_STATIC(QGLDefaultOverlayFormat, defaultOverlayFormatInstance)
 Q_GLOBAL_STATIC(QGLSignalProxy, theSignalProxy)
 QGLSignalProxy *QGLSignalProxy::instance()
 {
-    return theSignalProxy();
+    QGLSignalProxy *proxy = theSignalProxy();
+    if (proxy && proxy->thread() != qApp->thread()) {
+        if (proxy->thread() == QThread::currentThread())
+            proxy->moveToThread(qApp->thread());
+    }
+    return proxy;
 }
 
 
diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h
index f86c77f..18b2765 100644
--- a/src/opengl/qgl_p.h
+++ b/src/opengl/qgl_p.h
@@ -434,20 +434,6 @@ public:
     static void setCurrentContext(QGLContext *context);
 };
 
-// ### make QGLContext a QObject in 5.0 and remove the proxy stuff
-class Q_OPENGL_EXPORT QGLSignalProxy : public QObject
-{
-    Q_OBJECT
-public:
-    QGLSignalProxy() : QObject() {}
-    void emitAboutToDestroyContext(const QGLContext *context) {
-        emit aboutToDestroyContext(context);
-    }
-    static QGLSignalProxy *instance();
-Q_SIGNALS:
-    void aboutToDestroyContext(const QGLContext *context);
-};
-
 Q_DECLARE_OPERATORS_FOR_FLAGS(QGLExtensions::Extensions)
 
 // Temporarily make a context current if not already current or
@@ -490,6 +476,48 @@ private:
     QGLContext *m_ctx;
 };
 
+// ### make QGLContext a QObject in 5.0 and remove the proxy stuff
+class Q_OPENGL_EXPORT QGLSignalProxy : public QObject
+{
+    Q_OBJECT
+public:
+    QGLSignalProxy() : QObject() {
+        qRegisterMetaType<GLuint>("GLuint");
+        connect(this, SIGNAL(freeTexture(QGLContext *, QPixmapData *, GLuint)),
+                this, SLOT(freeTexture_slot(QGLContext *, QPixmapData *, GLuint)));
+    }
+    void emitAboutToDestroyContext(const QGLContext *context) {
+        emit aboutToDestroyContext(context);
+    }
+    void emitFreeTexture(QGLContext *context, QPixmapData *boundPixmap, GLuint id) {
+        emit freeTexture(context, boundPixmap, id);
+    }
+    static QGLSignalProxy *instance();
+Q_SIGNALS:
+    void aboutToDestroyContext(const QGLContext *context);
+    void freeTexture(QGLContext *context, QPixmapData *boundPixmap, GLuint id);
+
+private slots:
+    void freeTexture_slot(QGLContext *context, QPixmapData *boundPixmap, GLuint id) {
+#if defined(Q_WS_X11)
+        if (boundPixmap) {
+            QGLContext *oldContext = const_cast<QGLContext *>(QGLContext::currentContext());
+            context->makeCurrent();
+            // Although glXReleaseTexImage is a glX call, it must be called while there
+            // is a current context - the context the pixmap was bound to a texture in.
+            // Otherwise the release doesn't do anything and you get BadDrawable errors
+            // when you come to delete the context.
+            QGLContextPrivate::unbindPixmapFromTexture(boundPixmap);
+            glDeleteTextures(1, &id);
+            oldContext->makeCurrent();
+            return;
+        }
+#endif
+        QGLShareContextScope scope(context);
+        glDeleteTextures(1, &id);
+    }
+};
+
 class QGLTexture {
 public:
     QGLTexture(QGLContext *ctx = 0, GLuint tx_id = 0, GLenum tx_target = GL_TEXTURE_2D,
@@ -506,16 +534,10 @@ public:
     ~QGLTexture() {
         if (options & QGLContext::MemoryManagedBindOption) {
             Q_ASSERT(context);
-            QGLShareContextScope scope(context);
-#if defined(Q_WS_X11)
-            // Although glXReleaseTexImage is a glX call, it must be called while there
-            // is a current context - the context the pixmap was bound to a texture in.
-            // Otherwise the release doesn't do anything and you get BadDrawable errors
-            // when you come to delete the context.
-            if (boundPixmap)
-                QGLContextPrivate::unbindPixmapFromTexture(boundPixmap);
+#if !defined(Q_WS_X11)
+            QPixmapData *boundPixmap = 0;
 #endif
-            glDeleteTextures(1, &id);
+            QGLSignalProxy::instance()->emitFreeTexture(context, boundPixmap, id);
         }
      }
 
diff --git a/tests/auto/qgl/tst_qgl.cpp b/tests/auto/qgl/tst_qgl.cpp
index e411508..4220b45 100644
--- a/tests/auto/qgl/tst_qgl.cpp
+++ b/tests/auto/qgl/tst_qgl.cpp
@@ -96,6 +96,7 @@ private slots:
     void shareRegister();
     void qglContextDefaultBindTexture();
     void textureCleanup();
+    void threadImages();
 };
 
 tst_QGL::tst_QGL()
@@ -2253,6 +2254,123 @@ void tst_QGL::textureCleanup()
 #endif
 }
 
+namespace ThreadImages {
+
+class Producer : public QObject
+{
+    Q_OBJECT
+public:
+    Producer()
+    {
+        startTimer(20);
+
+        QThread *thread = new QThread;
+        thread->start();
+
+        connect(this, SIGNAL(destroyed()), thread, SLOT(quit()));
+
+        moveToThread(thread);
+        connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
+    }
+
+signals:
+    void imageReady(const QImage &image);
+
+protected:
+    void timerEvent(QTimerEvent *)
+    {
+        QImage image(256, 256, QImage::Format_RGB32);
+        QLinearGradient g(0, 0, 0, 256);
+        g.setColorAt(0, QColor(255, 180, 180));
+        g.setColorAt(1, Qt::white);
+        g.setSpread(QGradient::ReflectSpread);
+
+        QBrush brush(g);
+        brush.setTransform(QTransform::fromTranslate(0, delta));
+        delta += 10;
+
+        QPainter p(&image);
+        p.fillRect(image.rect(), brush);
+
+        if (images.size() > 10)
+            images.removeFirst();
+
+        images.append(image);
+
+        emit imageReady(image);
+    }
+
+private:
+    QList<QImage> images;
+    int delta;
+};
+
+
+class DisplayWidget : public QGLWidget
+{
+    Q_OBJECT
+public:
+    DisplayWidget(QWidget *parent) : QGLWidget(parent) {}
+    void paintEvent(QPaintEvent *)
+    {
+        QPainter p(this);
+        p.drawImage(rect(), m_image);
+    }
+
+public slots:
+    void setImage(const QImage &image)
+    {
+        m_image = image;
+        update();
+    }
+
+private:
+    QImage m_image;
+};
+
+class Widget : public QWidget
+{
+    Q_OBJECT
+public:
+    Widget()
+        : iterations(0)
+        , display(0)
+    {
+        startTimer(400);
+    }
+
+    int iterations;
+
+protected:
+    void timerEvent(QTimerEvent *)
+    {
+        ++iterations;
+
+        delete display;
+        display = new DisplayWidget(this);
+        connect(&producer, SIGNAL(imageReady(const QImage &)), display, SLOT(setImage(const QImage &)));
+
+        display->setGeometry(rect());
+        display->show();
+    }
+
+private:
+    Producer producer;
+    DisplayWidget *display;
+};
+
+}
+
+void tst_QGL::threadImages()
+{
+    ThreadImages::Widget *widget = new ThreadImages::Widget;
+    widget->show();
+
+    while (widget->iterations <= 5) {
+        qApp->processEvents();
+    }
+}
+
 class tst_QGLDummy : public QObject
 {
 Q_OBJECT
-- 
cgit v0.12


From fb94cee1a10c7bfb8e73dd0a094ae71fe96bf3e7 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Fri, 29 Oct 2010 14:06:28 +0200
Subject: Fix gcc bug in qReallocAligned

the line
    faked.pptr[-1] = real.ptr;
was ignored by the GCC 4.5. (optimized out)

Workaround by using proper reinterpret_cast casting instead of union casting.

Fixes crash in tst_Collections::alignment

The crash would occurs for any use of qReallocAligned with alignement > sizeof(void*)
(fortunately this is not often called)

Reviewed-by: thiago
---
 src/corelib/global/qmalloc.cpp | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/corelib/global/qmalloc.cpp b/src/corelib/global/qmalloc.cpp
index 090998c..028a0a5 100644
--- a/src/corelib/global/qmalloc.cpp
+++ b/src/corelib/global/qmalloc.cpp
@@ -90,8 +90,6 @@ void *qReallocAligned(void *oldptr, size_t newsize, size_t oldsize, size_t align
         return newptr + 1;
     }
 
-    union { void *ptr; void **pptr; quintptr n; } real, faked;
-
     // qMalloc returns pointers aligned at least at sizeof(size_t) boundaries
     // but usually more (8- or 16-byte boundaries).
     // So we overallocate by alignment-sizeof(size_t) bytes, so we're guaranteed to find a
@@ -100,19 +98,21 @@ void *qReallocAligned(void *oldptr, size_t newsize, size_t oldsize, size_t align
     // However, we need to store the actual pointer, so we need to allocate actually size +
     // alignment anyway.
 
-    real.ptr = qRealloc(actualptr, newsize + alignment);
-    if (!real.ptr)
+    void *real = qRealloc(actualptr, newsize + alignment);
+    if (!real)
         return 0;
 
-    faked.n = real.n + alignment;
-    faked.n &= ~(alignment - 1);
+    quintptr faked = reinterpret_cast<quintptr>(real) + alignment;
+    faked &= ~(alignment - 1);
+
+    void **faked_ptr = reinterpret_cast<void **>(faked);
 
     // now save the value of the real pointer at faked-sizeof(void*)
     // by construction, alignment > sizeof(void*) and is a power of 2, so
     // faked-sizeof(void*) is properly aligned for a pointer
-    faked.pptr[-1] = real.ptr;
+    faked_ptr[-1] = real;
 
-    return faked.ptr;
+    return faked_ptr;
 }
 
 void qFreeAligned(void *ptr)
-- 
cgit v0.12


From 1fff0c3c764500c755c615f9eb8dc90433406a10 Mon Sep 17 00:00:00 2001
From: Michael Dominic K <mdk@codethink.co.uk>
Date: Fri, 29 Oct 2010 16:01:55 +0200
Subject: 32bit => 16bit conversion has 4byte-aligned output.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Merge-request: 2499
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
---
 src/plugins/graphicssystems/meego/dithering.cpp | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/plugins/graphicssystems/meego/dithering.cpp b/src/plugins/graphicssystems/meego/dithering.cpp
index b50826c..c0b4b53 100644
--- a/src/plugins/graphicssystems/meego/dithering.cpp
+++ b/src/plugins/graphicssystems/meego/dithering.cpp
@@ -76,8 +76,13 @@
 // Converts incoming RGB32 (QImage::Format_RGB32) to RGB565. Returns the newly allocated data.
 unsigned short* convertRGB32_to_RGB565(const unsigned char *in, int width, int height, int stride)
 {
+    // Output line stride. Alligned to 4 bytes.
+    int alignedWidth = width;
+    if (alignedWidth % 2 > 0)
+        alignedWidth++;
+
     // Will store output
-    unsigned short *out = (unsigned short *) malloc(width * height * 2);
+    unsigned short *out = (unsigned short *) malloc(alignedWidth * height * 2);
 
     // Lookup tables for the 8bit => 6bit and 8bit => 5bit conversion
     unsigned char lookup_8bit_to_5bit[256];
@@ -174,7 +179,7 @@ unsigned short* convertRGB32_to_RGB565(const unsigned char *in, int width, int h
             }
 
             // Write the newly produced pixel
-            PUT_565(out, x, y, width, component[2], component[1], component[0]);
+            PUT_565(out, x, y, alignedWidth, component[2], component[1], component[0]);
         }
     }
 
@@ -183,10 +188,16 @@ unsigned short* convertRGB32_to_RGB565(const unsigned char *in, int width, int h
 
 // Converts incoming RGBA32 (QImage::Format_ARGB32_Premultiplied) to RGB565. Returns the newly allocated data.
 // This function is similar (yet different) to the _565 variant but it makes sense to duplicate it here for simplicity.
+// The output has each scan line aligned to 4 bytes (as expected by GL by default).
 unsigned short* convertARGB32_to_RGBA4444(const unsigned char *in, int width, int height, int stride)
 {
+    // Output line stride. Alligned to 4 bytes.
+    int alignedWidth = width;
+    if (alignedWidth % 2 > 0)
+        alignedWidth++;
+
     // Will store output
-    unsigned short *out = (unsigned short *) malloc(width * height * 2);
+    unsigned short *out = (unsigned short *) malloc(alignedWidth * 2 * height);
 
     // Lookup tables for the 8bit => 4bit conversion
     unsigned char lookup_8bit_to_4bit[256];
@@ -269,7 +280,7 @@ unsigned short* convertARGB32_to_RGBA4444(const unsigned char *in, int width, in
             }
 
             // Write the newly produced pixel
-            PUT_4444(out, x, y, width, component[0], component[1], component[2], component[3]);
+            PUT_4444(out, x, y, alignedWidth, component[0], component[1], component[2], component[3]);
         }
     }
 
-- 
cgit v0.12


From 81fc8ec995a07909e59602b9281fbebfff4bd94c Mon Sep 17 00:00:00 2001
From: Charles Yin <charles.yin@nokia.com>
Date: Thu, 28 Oct 2010 10:13:34 +1000
Subject: Fix QTBUG-14640:oci performance problem with qlonglong

missing qlonglong switch case in bindValue(), so all qlonglong value
fall back into QString, which makes the query slow.

Change-Id: I7d8bf1c44ce3aaa15ee85be325a5c98dc3ed3ce1
Task-number:QTBUG-14640
Reviewed-by: Michael Goddard
---
 src/sql/drivers/oci/qsql_oci.cpp       |  8 ++++++++
 tests/auto/qsqlquery/tst_qsqlquery.cpp | 31 ++++++++++++++++++++++++++++++-
 2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/src/sql/drivers/oci/qsql_oci.cpp b/src/sql/drivers/oci/qsql_oci.cpp
index 3f30ea5..2392a17 100644
--- a/src/sql/drivers/oci/qsql_oci.cpp
+++ b/src/sql/drivers/oci/qsql_oci.cpp
@@ -291,6 +291,14 @@ int QOCIResultPrivate::bindValue(OCIStmt *sql, OCIBind **hbnd, OCIError *err, in
                          sizeof(uint),
                          SQLT_UIN, indPtr, 0, 0, 0, 0, OCI_DEFAULT);
         break;
+    case QVariant::LongLong:
+        r = OCIBindByPos(sql, hbnd, err,
+                           pos + 1,
+                           // if it's an out value, the data is already detached
+                           // so the const cast is safe.
+                           const_cast<void *>(data),
+                           sizeof(OCINumber),
+                           SQLT_VNU, indPtr, 0, 0, 0, 0, OCI_DEFAULT);
     case QVariant::Double:
         r = OCIBindByPos(sql, hbnd, err,
                          pos + 1,
diff --git a/tests/auto/qsqlquery/tst_qsqlquery.cpp b/tests/auto/qsqlquery/tst_qsqlquery.cpp
index 7c93c7a..5367bd6 100644
--- a/tests/auto/qsqlquery/tst_qsqlquery.cpp
+++ b/tests/auto/qsqlquery/tst_qsqlquery.cpp
@@ -211,6 +211,8 @@ private slots:
     void QTBUG_5765();
     void QTBUG_14132_data() { generic_data("QOCI"); }
     void QTBUG_14132();
+    void QTBUG_14640_data() { generic_data("QOCI"); }
+    void QTBUG_14640();
     void sqlite_constraint_data() { generic_data("QSQLITE"); }
     void sqlite_constraint();
 
@@ -329,7 +331,8 @@ void tst_QSqlQuery::dropTestTables( QSqlDatabase db )
                << qTableName( "Planet", __FILE__ )
                << qTableName( "task_250026", __FILE__ )
                << qTableName( "task_234422", __FILE__ )
-               << qTableName("test141895", __FILE__);
+               << qTableName("test141895", __FILE__)
+               << qTableName("qtest_QTBUG14640", __FILE__);
 
     if ( db.driverName().startsWith("QPSQL") )
         tablenames << qTableName("task_233829", __FILE__);
@@ -3101,6 +3104,32 @@ void tst_QSqlQuery::QTBUG_5765()
     QCOMPARE(q.value(0).toInt(), 123);
 }
 
+void tst_QSqlQuery::QTBUG_14640()
+{
+    QFETCH( QString, dbName );
+    QSqlDatabase db = QSqlDatabase::database( dbName );
+    CHECK_DATABASE( db );
+    const QString qtest_QTBUG14640(qTableName("qtest_QTBUG14640", __FILE__));
+
+    QSqlQuery q( db );
+    q.setForwardOnly( true );
+    QVERIFY_SQL( q, exec( "create table " + qtest_QTBUG14640 +
+                            " (col1 number, col2 number)" ) );
+    QVERIFY_SQL( q, exec( "insert into " + qtest_QTBUG14640 + " values (1, 1111)" ) );
+    QVERIFY_SQL( q, exec( "insert into " + qtest_QTBUG14640 + " values (2, 2222)" ) );
+    QVERIFY_SQL( q, exec( "insert into " + qtest_QTBUG14640 + " values (3, 3333)" ) );
+
+    QString sqlStr = "select * from " + qtest_QTBUG14640 +  " where col1 == :bindValue0 AND col2 == :bindValue1";
+    q.prepare(sqlStr);
+    q.bindValue(":bindValue0", qlonglong(1), QSql::In);
+    q.bindValue(":bindValue1", qlonglong(1111), QSql::In);
+    QVERIFY_SQL( q, exec() );
+
+    QVERIFY( q.next() );
+    QCOMPARE(q.boundValue( 0 ).toLongLong(),  qlonglong(1));
+    QCOMPARE(q.boundValue( 1 ).toLongLong(),  qlonglong(1111));
+}
+
 void tst_QSqlQuery::sqlite_constraint()
 {
     QFETCH( QString, dbName );
-- 
cgit v0.12


From d190802d33b763e7a21b85fb3dc2ed7c039ddbb6 Mon Sep 17 00:00:00 2001
From: Sergio Ahumada <sergio.ahumada@nokia.com>
Date: Mon, 1 Nov 2010 16:19:11 +0100
Subject: Doc: Fixing typo

---
 tools/macdeployqt/shared/shared.cpp       | 2 +-
 tools/porting/src/preprocessorcontrol.cpp | 2 +-
 tools/porting/src/textreplacement.h       | 4 ++--
 tools/qdoc3/ditaxmlgenerator.cpp          | 4 ++--
 tools/qdoc3/tokenizer.h                   | 2 +-
 5 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/tools/macdeployqt/shared/shared.cpp b/tools/macdeployqt/shared/shared.cpp
index 52cf04b..c7d23c0 100644
--- a/tools/macdeployqt/shared/shared.cpp
+++ b/tools/macdeployqt/shared/shared.cpp
@@ -388,7 +388,7 @@ DeploymentInfo deployQtFrameworks(QList<FrameworkInfo> frameworks,
         foreach (FrameworkInfo dependency, dependencies) {
             changeInstallName(dependency.installName, dependency.deployedInstallName, deployedBinaryPath);
 
-            // Deploy framework if neccesary.
+            // Deploy framework if necessary.
             if (copiedFrameworks.contains(dependency.frameworkName) == false && frameworks.contains(dependency) == false) {
                 frameworks.append(dependency);
             }
diff --git a/tools/porting/src/preprocessorcontrol.cpp b/tools/porting/src/preprocessorcontrol.cpp
index 673ed08..31adc32 100644
--- a/tools/porting/src/preprocessorcontrol.cpp
+++ b/tools/porting/src/preprocessorcontrol.cpp
@@ -154,7 +154,7 @@ QByteArray PreprocessorCache::readFile(const QString &filename) const
     // read the file for us.
     if (receivers(SIGNAL(readFile(QByteArray&,QString))) > 0) {
         QByteArray array;
-        // Workaround for "not beeing able to emit from const function"
+        // Workaround for "not being able to emit from const function"
         PreprocessorCache *cache = const_cast<PreprocessorCache *>(this);
         emit cache->readFile(array, filename);
         return array;
diff --git a/tools/porting/src/textreplacement.h b/tools/porting/src/textreplacement.h
index f90fb82..f351552 100644
--- a/tools/porting/src/textreplacement.h
+++ b/tools/porting/src/textreplacement.h
@@ -53,7 +53,7 @@ class TextReplacement
 public:
     QByteArray newText;
     int insertPosition;
-    int currentLenght;    //lenght of the text that is going to be replaced.
+    int currentLenght;    //length of the text that is going to be replaced.
     bool operator<(const TextReplacement &other) const
     {
         return  (insertPosition < other.insertPosition);
@@ -70,7 +70,7 @@ public:
 
         insert maintains the TextReplacement list in sorted order.
 
-        Returns true if the insert was successfull, false otherwise;
+        Returns true if the insert was successful, false otherwise;
     */
     bool insert(QByteArray newText, int insertPosition, int currentLenght);
     void clear();
diff --git a/tools/qdoc3/ditaxmlgenerator.cpp b/tools/qdoc3/ditaxmlgenerator.cpp
index a83a321..d43ad96 100644
--- a/tools/qdoc3/ditaxmlgenerator.cpp
+++ b/tools/qdoc3/ditaxmlgenerator.cpp
@@ -2015,7 +2015,7 @@ void DitaXmlGenerator::generateIncludes(const InnerNode *inner, CodeMarker *mark
 }
 
 /*!
-  Generates a table of contents begining at \a node.
+  Generates a table of contents beginning at \a node.
  */
 void DitaXmlGenerator::generateTableOfContents(const Node *node,
                                             CodeMarker *marker,
@@ -2101,7 +2101,7 @@ void DitaXmlGenerator::generateTableOfContents(const Node *node,
 
 /*!
   Revised for the new doc format.
-  Generates a table of contents begining at \a node.
+  Generates a table of contents beginning at \a node.
  */
 void DitaXmlGenerator::generateTableOfContents(const Node *node,
                                             CodeMarker *marker,
diff --git a/tools/qdoc3/tokenizer.h b/tools/qdoc3/tokenizer.h
index bd35965..af617f1 100644
--- a/tools/qdoc3/tokenizer.h
+++ b/tools/qdoc3/tokenizer.h
@@ -145,7 +145,7 @@ class Tokenizer
         int ch = getch();
         if (ch == EOF)
             return EOF;
-        // cast explicitely to make sure the value of ch 
+        // cast explicitily to make sure the value of ch 
         // is in range [0..255] to avoid assert messages 
         // when using debug CRT that checks its input.
         return int(uint(uchar(ch))); 
-- 
cgit v0.12


From 155065cd5c611e2d14357a8ff3180ac14a68e3a0 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Tue, 2 Nov 2010 10:41:25 +1000
Subject: Removing a binding while it is being applied caused a crash. Use a
 weak pointer to the binding in case applying the binding (while fast
 forwarding) causes it to be removed.

Task-number: QTBUG-14830
Reviewed-by: Michael Brasser
---
 src/declarative/util/qdeclarativestate.cpp         | 12 ++++-----
 src/declarative/util/qdeclarativestate_p.h         |  3 ++-
 src/declarative/util/qdeclarativestate_p_p.h       |  2 +-
 .../util/qdeclarativetransitionmanager.cpp         | 16 ++++++------
 .../qdeclarativestates/data/QTBUG-14830.qml        | 29 ++++++++++++++++++++++
 .../qdeclarativestates/tst_qdeclarativestates.cpp  | 13 ++++++++++
 6 files changed, 59 insertions(+), 16 deletions(-)
 create mode 100644 tests/auto/declarative/qdeclarativestates/data/QTBUG-14830.qml

diff --git a/src/declarative/util/qdeclarativestate.cpp b/src/declarative/util/qdeclarativestate.cpp
index 0f5413e..3915485 100644
--- a/src/declarative/util/qdeclarativestate.cpp
+++ b/src/declarative/util/qdeclarativestate.cpp
@@ -58,7 +58,7 @@ QT_BEGIN_NAMESPACE
 DEFINE_BOOL_CONFIG_OPTION(stateChangeDebug, STATECHANGE_DEBUG);
 
 QDeclarativeAction::QDeclarativeAction()
-: restore(true), actionDone(false), reverseEvent(false), deletableToBinding(false), fromBinding(0), toBinding(0), event(0),
+: restore(true), actionDone(false), reverseEvent(false), deletableToBinding(false), fromBinding(0), event(0),
   specifiedObject(0)
 {
 }
@@ -67,7 +67,7 @@ QDeclarativeAction::QDeclarativeAction(QObject *target, const QString &propertyN
                const QVariant &value)
 : restore(true), actionDone(false), reverseEvent(false), deletableToBinding(false), 
   property(target, propertyName), toValue(value), 
-  fromBinding(0), toBinding(0), event(0), 
+  fromBinding(0), event(0),
   specifiedObject(target), specifiedProperty(propertyName)
 {
     if (property.isValid())
@@ -78,7 +78,7 @@ QDeclarativeAction::QDeclarativeAction(QObject *target, const QString &propertyN
                QDeclarativeContext *context, const QVariant &value)
 : restore(true), actionDone(false), reverseEvent(false), deletableToBinding(false),
   property(target, propertyName, context), toValue(value),
-  fromBinding(0), toBinding(0), event(0),
+  fromBinding(0), event(0),
   specifiedObject(target), specifiedProperty(propertyName)
 {
     if (property.isValid())
@@ -503,11 +503,11 @@ void QDeclarativeState::addEntriesToRevertList(const QList<QDeclarativeAction> &
             const QDeclarativeAction &action = actionListIterator.next();
             QDeclarativeSimpleAction simpleAction(action);
             action.property.write(action.toValue);
-            if (action.toBinding) {
+            if (!action.toBinding.isNull()) {
                 QDeclarativeAbstractBinding *oldBinding = QDeclarativePropertyPrivate::binding(simpleAction.property());
                 if (oldBinding)
                     QDeclarativePropertyPrivate::setBinding(simpleAction.property(), 0);
-                QDeclarativePropertyPrivate::setBinding(simpleAction.property(), action.toBinding, QDeclarativePropertyPrivate::DontRemoveBinding);
+                QDeclarativePropertyPrivate::setBinding(simpleAction.property(), action.toBinding.data(), QDeclarativePropertyPrivate::DontRemoveBinding);
             }
 
             simpleActionList.append(simpleAction);
@@ -675,7 +675,7 @@ void QDeclarativeState::apply(QDeclarativeStateGroup *group, QDeclarativeTransit
             a.property = d->revertList.at(ii).property();
             a.fromValue = cur;
             a.toValue = d->revertList.at(ii).value();
-            a.toBinding = d->revertList.at(ii).binding();
+            a.toBinding = QDeclarativeAbstractBinding::getPointer(d->revertList.at(ii).binding());
             a.specifiedObject = d->revertList.at(ii).specifiedObject();
             a.specifiedProperty = d->revertList.at(ii).specifiedProperty();
             a.event = d->revertList.at(ii).event();
diff --git a/src/declarative/util/qdeclarativestate_p.h b/src/declarative/util/qdeclarativestate_p.h
index fc7c940..7b9c18a 100644
--- a/src/declarative/util/qdeclarativestate_p.h
+++ b/src/declarative/util/qdeclarativestate_p.h
@@ -45,6 +45,7 @@
 #include <qdeclarative.h>
 #include <qdeclarativeproperty.h>
 #include <QtCore/qobject.h>
+#include <private/qdeclarativebinding_p.h>
 #include <private/qdeclarativeglobal_p.h>
 
 QT_BEGIN_HEADER
@@ -75,7 +76,7 @@ public:
     QVariant toValue;
 
     QDeclarativeAbstractBinding *fromBinding;
-    QDeclarativeAbstractBinding *toBinding;
+    QDeclarativeAbstractBinding::Pointer toBinding;
     QDeclarativeActionEvent *event;
 
     //strictly for matching
diff --git a/src/declarative/util/qdeclarativestate_p_p.h b/src/declarative/util/qdeclarativestate_p_p.h
index 4fd8f21..98c3f7b 100644
--- a/src/declarative/util/qdeclarativestate_p_p.h
+++ b/src/declarative/util/qdeclarativestate_p_p.h
@@ -85,7 +85,7 @@ public:
             m_reverseEvent = true;
         } else {
             m_value = a.toValue;
-            m_binding = QDeclarativeAbstractBinding::getPointer(a.toBinding);
+            m_binding = a.toBinding;
             m_reverseEvent = false;
         }
     }
diff --git a/src/declarative/util/qdeclarativetransitionmanager.cpp b/src/declarative/util/qdeclarativetransitionmanager.cpp
index 89b0044..d19e6f2 100644
--- a/src/declarative/util/qdeclarativetransitionmanager.cpp
+++ b/src/declarative/util/qdeclarativetransitionmanager.cpp
@@ -99,8 +99,8 @@ void QDeclarativeTransitionManager::complete()
 void QDeclarativeTransitionManagerPrivate::applyBindings()
 {
     foreach(const QDeclarativeAction &action, bindingsList) {
-        if (action.toBinding) {
-            QDeclarativePropertyPrivate::setBinding(action.property, action.toBinding);
+        if (!action.toBinding.isNull()) {
+            QDeclarativePropertyPrivate::setBinding(action.property, action.toBinding.data());
         } else if (action.event) {
             if (action.reverseEvent)
                 action.event->reverse();
@@ -145,8 +145,8 @@ void QDeclarativeTransitionManager::transition(const QList<QDeclarativeAction> &
         // Apply all the property and binding changes
         for (int ii = 0; ii < applyList.size(); ++ii) {
             const QDeclarativeAction &action = applyList.at(ii);
-            if (action.toBinding) {
-                QDeclarativePropertyPrivate::setBinding(action.property, action.toBinding, QDeclarativePropertyPrivate::BypassInterceptor | QDeclarativePropertyPrivate::DontRemoveBinding);
+            if (!action.toBinding.isNull()) {
+                QDeclarativePropertyPrivate::setBinding(action.property, action.toBinding.data(), QDeclarativePropertyPrivate::BypassInterceptor | QDeclarativePropertyPrivate::DontRemoveBinding);
             } else if (!action.event) {
                 QDeclarativePropertyPrivate::write(action.property, action.toValue, QDeclarativePropertyPrivate::BypassInterceptor | QDeclarativePropertyPrivate::DontRemoveBinding);
             } else if (action.event->isReversable()) {
@@ -165,7 +165,7 @@ void QDeclarativeTransitionManager::transition(const QList<QDeclarativeAction> &
                 continue;
             }
             const QDeclarativeProperty &prop = action->property;
-            if (action->toBinding || !action->toValue.isValid()) {
+            if (!action->toBinding.isNull() || !action->toValue.isValid()) {
                 action->toValue = prop.read();
             }
         }
@@ -259,10 +259,10 @@ void QDeclarativeTransitionManager::cancel()
 
     for(int i = 0; i < d->bindingsList.count(); ++i) {
         QDeclarativeAction action = d->bindingsList[i];
-        if (action.toBinding && action.deletableToBinding) {
+        if (!action.toBinding.isNull() && action.deletableToBinding) {
             QDeclarativePropertyPrivate::setBinding(action.property, 0);
-            action.toBinding->destroy();
-            action.toBinding = 0;
+            action.toBinding.data()->destroy();
+            action.toBinding.clear();
             action.deletableToBinding = false;
         } else if (action.event) {
             //### what do we do here?
diff --git a/tests/auto/declarative/qdeclarativestates/data/QTBUG-14830.qml b/tests/auto/declarative/qdeclarativestates/data/QTBUG-14830.qml
new file mode 100644
index 0000000..5eccdda
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativestates/data/QTBUG-14830.qml
@@ -0,0 +1,29 @@
+import Qt 4.7
+
+Rectangle {
+    width: 1024
+    height: 768
+
+    Item {
+        id: area
+        objectName: "area"
+        property int numx: 6
+        property int cellwidth: 1024/numx
+
+        onWidthChanged: {
+            width = width>1024?1024:width;
+        }
+
+        state: 'minimal'
+        states: [
+            State {
+                name: 'minimal'
+                PropertyChanges {
+                    target: area
+                    width: cellwidth
+                }
+            }
+        ]
+
+    }
+}
diff --git a/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp b/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp
index 0d10c10..b8409a5 100644
--- a/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp
+++ b/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp
@@ -143,6 +143,7 @@ private slots:
     void returnToBase();
     void extendsBug();
     void editProperties();
+    void QTBUG_14830();
 };
 
 void tst_qdeclarativestates::initTestCase()
@@ -1375,6 +1376,18 @@ void tst_qdeclarativestates::editProperties()
     QCOMPARE(childRect->height(), qreal(40));
 }
 
+void tst_qdeclarativestates::QTBUG_14830()
+{
+    QDeclarativeEngine engine;
+
+    QDeclarativeComponent c(&engine, SRCDIR "/data/QTBUG-14830.qml");
+    QDeclarativeRectangle *rect = qobject_cast<QDeclarativeRectangle*>(c.create());
+    QVERIFY(rect != 0);
+    QDeclarativeItem *item = rect->findChild<QDeclarativeItem*>("area");
+
+    QCOMPARE(item->width(), qreal(171));
+}
+
 QTEST_MAIN(tst_qdeclarativestates)
 
 #include "tst_qdeclarativestates.moc"
-- 
cgit v0.12


From 11bb4f85ef38270758ec0930709c23c7fcb5840c Mon Sep 17 00:00:00 2001
From: Yann Bodson <yann.bodson@nokia.com>
Date: Tue, 2 Nov 2010 16:41:01 +1000
Subject: Regression: Text element breaks when using \n for separating lines

Task-number: QTBUG-14915
Reviewed-by: Michael Brasser
---
 src/declarative/graphicsitems/qdeclarativetext.cpp |  24 ++--
 .../qdeclarativetext/font/data-MAC/plaintext2.qml  | 131 +++++++++++++++++++++
 .../qmlvisual/qdeclarativetext/font/plaintext2.qml |  22 ++++
 3 files changed, 165 insertions(+), 12 deletions(-)
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.qml
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext2.qml

diff --git a/src/declarative/graphicsitems/qdeclarativetext.cpp b/src/declarative/graphicsitems/qdeclarativetext.cpp
index 03c9765..8cb47aa 100644
--- a/src/declarative/graphicsitems/qdeclarativetext.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetext.cpp
@@ -291,30 +291,30 @@ QSize QDeclarativeTextPrivate::setupTextLayout()
     qreal height = 0;
     qreal lineWidth = 0;
 
-    //set manual width
-    if (q->widthValid())
-        lineWidth = q->width();
-
     QTextOption textOption = layout.textOption();
-    textOption.setWrapMode(QTextOption::WrapMode(wrapMode));
+    textOption.setWrapMode(QTextOption::NoWrap);
     textOption.setAlignment(Qt::Alignment(hAlign));
-    layout.setTextOption(textOption);
 
+    // if the item has an explicit width, we set the line width and enable wrapping
+    if (q->widthValid()) {
+        lineWidth = q->width();
+        textOption.setWrapMode(QTextOption::WrapMode(wrapMode));
+    }
+
+    layout.setTextOption(textOption);
     layout.beginLayout();
     while (1) {
         QTextLine line = layout.createLine();
         if (!line.isValid())
             break;
 
-        if (q->widthValid()) {
-            line.setLineWidth(lineWidth);
-            line.setPosition(QPointF(0, height));
-            height += line.height();
-        }
+        line.setLineWidth(lineWidth);
+        line.setPosition(QPointF(0, height));
+        height += line.height();
     }
     layout.endLayout();
 
-    return QSize(qCeil(layout.boundingRect().width()), layout.boundingRect().height());
+    return layout.boundingRect().toAlignedRect().size();
 }
 
 /*!
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.qml
new file mode 100644
index 0000000..1a8af0e
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.qml
@@ -0,0 +1,131 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 32
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 48
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 64
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 80
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 96
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 112
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 128
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 144
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 160
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 176
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 192
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 208
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 224
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 240
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 256
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 272
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 288
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 304
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 320
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 336
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 352
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 368
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 384
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 400
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 416
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 432
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Key {
+        type: 6
+        key: 16777249
+        modifiers: 67108864
+        text: ""
+        autorep: false
+        count: 1
+    }
+    Frame {
+        msec: 448
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+    Frame {
+        msec: 464
+        hash: "c68e50ef84647962481121e2eb1ba4d4"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext2.qml
new file mode 100644
index 0000000..901025a
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext2.qml
@@ -0,0 +1,22 @@
+import QtQuick 1.0
+
+Rectangle {
+    width: 400; height: 200
+
+    Row {
+        spacing: 20
+        anchors.centerIn: parent
+        Text {
+            text: "First line\nSecond line"; wrapMode: Text.Wrap
+        }
+        Text {
+            text: "First line\nSecond line"; width: 70
+        }
+        Text {
+            text: "First Second\nThird Fourth"; wrapMode: Text.Wrap; width: 50
+        }
+        Text {
+            text: "First line<br>Second line"; textFormat: Text.StyledText
+        }
+    }
+}
-- 
cgit v0.12


From a1aee0f169614b31a7fde201a3d1c64010198218 Mon Sep 17 00:00:00 2001
From: Michael Dominic K <mdk@codethink.co.uk>
Date: Tue, 2 Nov 2010 11:35:42 +0100
Subject: One more fix for dithering.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Merge-request: 2499
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
---
 src/plugins/graphicssystems/meego/dithering.cpp | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/plugins/graphicssystems/meego/dithering.cpp b/src/plugins/graphicssystems/meego/dithering.cpp
index c0b4b53..76d15a3 100644
--- a/src/plugins/graphicssystems/meego/dithering.cpp
+++ b/src/plugins/graphicssystems/meego/dithering.cpp
@@ -68,7 +68,7 @@
 
 // Writes(ads) a new value to the diffusion accumulator. accumulator is a short.
 // x, y is a position in the accumulation buffer. y can be 0 or 1 -- we operate on two lines at time.
-#define ACCUMULATE(accumulator, x, y, width, v) if (x < width && x > 0) accumulator[(y * width) + x] += v
+#define ACCUMULATE(accumulator, x, y, width, v) if (x < width && x >= 0) accumulator[(y * width) + x] += v
 
 // Clamps a value to be in 0..255 range.
 #define CLAMP_256(v) if (v > 255) v = 255; if (v < 0) v = 0;
@@ -110,18 +110,18 @@ unsigned short* convertRGB32_to_RGB565(const unsigned char *in, int width, int h
     // Produce the conversion lookup tables.
     for (i = 0; i < 256; i++) {
         lookup_8bit_to_5bit[i] = round(i / 8.0);
-        if (lookup_8bit_to_5bit[i] > 31)
-            lookup_8bit_to_5bit[i] -= 1;
 
         // Before bitshifts: (i * 8) - (... * 8 * 8)
         lookup_8bit_to_5bit_diff[i] = (i << 3) - (lookup_8bit_to_5bit[i] << 6);
+        if (lookup_8bit_to_5bit[i] > 31)
+            lookup_8bit_to_5bit[i] -= 1;
 
         lookup_8bit_to_6bit[i] = round(i / 4.0);
-        if (lookup_8bit_to_6bit[i] > 63)
-            lookup_8bit_to_6bit[i] -= 1;
 
         // Before bitshifts: (i * 8) - (... * 4 * 8)
         lookup_8bit_to_6bit_diff[i] = (i << 3) - (lookup_8bit_to_6bit[i] << 5);
+        if (lookup_8bit_to_6bit[i] > 63)
+            lookup_8bit_to_6bit[i] -= 1;
     }
 
     // Clear the accumulators
@@ -221,11 +221,11 @@ unsigned short* convertARGB32_to_RGBA4444(const unsigned char *in, int width, in
     // Produce the conversion lookup tables.
     for (i = 0; i < 256; i++) {
         lookup_8bit_to_4bit[i] = round(i / 16.0);
-        if (lookup_8bit_to_4bit[i] > 15)
-            lookup_8bit_to_4bit[i] -= 1;
-
         // Before bitshifts: (i * 8) - (... * 16 * 8)
         lookup_8bit_to_4bit_diff[i] = (i << 3) - (lookup_8bit_to_4bit[i] << 7);
+
+        if (lookup_8bit_to_4bit[i] > 15)
+            lookup_8bit_to_4bit[i] = 15;
     }
 
     // Clear the accumulators
-- 
cgit v0.12


From 2f12d81a72fe6abb48cce4d327ecc27d308a8418 Mon Sep 17 00:00:00 2001
From: Michael Dominic K <mdk@codethink.co.uk>
Date: Tue, 2 Nov 2010 11:35:42 +0100
Subject: Use 32bit textures for alpha textures after all.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

4444 16bit are too bad quality-wise.

Merge-request: 2499
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
---
 src/plugins/graphicssystems/meego/dithering.cpp        | 18 ++++++++++++++++++
 src/plugins/graphicssystems/meego/qmeegopixmapdata.cpp |  5 +++--
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/plugins/graphicssystems/meego/dithering.cpp b/src/plugins/graphicssystems/meego/dithering.cpp
index 76d15a3..122c51e 100644
--- a/src/plugins/graphicssystems/meego/dithering.cpp
+++ b/src/plugins/graphicssystems/meego/dithering.cpp
@@ -286,3 +286,21 @@ unsigned short* convertARGB32_to_RGBA4444(const unsigned char *in, int width, in
 
     return out;
 }
+
+unsigned char* convertBGRA32_to_RGBA32(const unsigned char *in, int width, int height, int stride)
+{
+    unsigned char *out = (unsigned char *) malloc(stride * height);
+
+    // For each line...
+    for (int y = 0; y < height; y++) {
+        // For each column
+        for (int x = 0; x < width; x++) {
+            out[(stride * y) + (x * 4) + 0] = in[(stride * y) + (x * 4) + 2];
+            out[(stride * y) + (x * 4) + 1] = in[(stride * y) + (x * 4) + 1];
+            out[(stride * y) + (x * 4) + 2] = in[(stride * y) + (x * 4) + 0];
+            out[(stride * y) + (x * 4) + 3] = in[(stride * y) + (x * 4) + 3];
+        }
+    }
+
+    return out;
+}
\ No newline at end of file
diff --git a/src/plugins/graphicssystems/meego/qmeegopixmapdata.cpp b/src/plugins/graphicssystems/meego/qmeegopixmapdata.cpp
index 02a4273..eb63692 100644
--- a/src/plugins/graphicssystems/meego/qmeegopixmapdata.cpp
+++ b/src/plugins/graphicssystems/meego/qmeegopixmapdata.cpp
@@ -51,6 +51,7 @@
 // from dithering.cpp
 extern unsigned short* convertRGB32_to_RGB565(const unsigned char *in, int width, int height, int stride);
 extern unsigned short* convertARGB32_to_RGBA4444(const unsigned char *in, int width, int height, int stride);
+extern unsigned char* convertBGRA32_to_RGBA32(const unsigned char *in, int width, int height, int stride);
 
 static EGLint preserved_image_attribs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE };
 
@@ -146,8 +147,8 @@ Qt::HANDLE QMeeGoPixmapData::imageToEGLSharedImage(const QImage &image)
     glGenTextures(1, &textureId);
     glBindTexture(GL_TEXTURE_2D, textureId);
     if (image.hasAlphaChannel() && const_cast<QImage &>(image).data_ptr()->checkForAlphaPixels()) {
-        void *converted = convertARGB32_to_RGBA4444(image.bits(), image.width(), image.height(), image.bytesPerLine());
-        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, converted);
+        void *converted = convertBGRA32_to_RGBA32(image.bits(), image.width(), image.height(), image.bytesPerLine());
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, converted);
         free(converted);
     } else {
         void *converted = convertRGB32_to_RGB565(image.bits(), image.width(), image.height(), image.bytesPerLine());
-- 
cgit v0.12


From 7229aa57f96d35290914906601084a200132a7ea Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
Date: Tue, 2 Nov 2010 12:04:36 +0100
Subject: Update .def files for QtGui and QtOpenVG

Update the .def files with the latest changes.

Reviewed-by: Jason Barron
---
 src/s60installs/eabi/QtGuiu.def    | 3 +++
 src/s60installs/eabi/QtOpenVGu.def | 1 +
 2 files changed, 4 insertions(+)

diff --git a/src/s60installs/eabi/QtGuiu.def b/src/s60installs/eabi/QtGuiu.def
index f772bcc..75bb026 100644
--- a/src/s60installs/eabi/QtGuiu.def
+++ b/src/s60installs/eabi/QtGuiu.def
@@ -12101,4 +12101,7 @@ EXPORTS
 	_ZN19QApplicationPrivate25qmljsDebugArgumentsStringEv @ 12100 NONAME
 	_ZNK5QFont14lastResortFontEv @ 12101 NONAME
 	_ZN11QFontEngine33convertToPostscriptFontFamilyNameERK10QByteArray @ 12102 NONAME
+	_ZN15QStaticTextItem13setFontEngineEP11QFontEngine @ 12103 NONAME
+	_ZN15QStaticTextItemD1Ev @ 12104 NONAME
+	_ZN15QStaticTextItemD2Ev @ 12105 NONAME
 
diff --git a/src/s60installs/eabi/QtOpenVGu.def b/src/s60installs/eabi/QtOpenVGu.def
index 99942b8..e1828c1 100644
--- a/src/s60installs/eabi/QtOpenVGu.def
+++ b/src/s60installs/eabi/QtOpenVGu.def
@@ -205,4 +205,5 @@ EXPORTS
 	_ZN13QVGPixmapData20createPixmapForImageER6QImage6QFlagsIN2Qt19ImageConversionFlagEEb @ 204 NONAME
 	_ZN13QVGPixmapData8fromDataEPKhjPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 205 NONAME
 	_ZN13QVGPixmapData8fromFileERK7QStringPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 206 NONAME
+	_ZNK14QVGPaintEngine16canVgWritePixelsERK6QImage @ 207 NONAME
 
-- 
cgit v0.12


From 891221a3f0c952817eb7891b9243827edda61085 Mon Sep 17 00:00:00 2001
From: Jiang Jiang <jiang.jiang@nokia.com>
Date: Tue, 2 Nov 2010 13:41:50 +0100
Subject: Fix Malayalam Rendering - 'Ra' is PreBase

Task-number: QTBUG-1887
Reviewed-by: Lars Knoll
---
 src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp b/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp
index 4d8418b..237c9ae 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp
@@ -833,7 +833,7 @@ static const unsigned char indicPosition[0xe00-0x900] = {
     None, None, None, None,
     None, None, None, Post,
 
-    Post, None, Below, None,
+    Pre, None, Below, None,
     None, Post, None, None,
     None, None, None, None,
     None, None, Post, Post,
-- 
cgit v0.12


From b2016bbfc9c7389e7b64451417395ceba96af21f Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Tue, 2 Nov 2010 13:07:01 +0100
Subject: Qml Debugging: Only enable if explicitly requested

Enable the remote debugging of QDeclarativeEngines only after

  QDeclarativeDebugHelper::enableDebugging()

has been called.

Approved by 4.7 Program Team.

Reviewed-by: Alessandro Portale
Task-number: QTBUG-13762
---
 src/declarative/debugger/qdeclarativedebughelper.cpp              | 8 ++++++++
 src/declarative/debugger/qdeclarativedebughelper_p.h              | 4 ++++
 src/declarative/debugger/qdeclarativedebugservice.cpp             | 7 +++++++
 src/declarative/qml/qdeclarativeengine.cpp                        | 1 +
 src/declarative/qml/qdeclarativeengine_p.h                        | 2 ++
 src/s60installs/bwins/QtDeclarativeu.def                          | 3 ++-
 src/s60installs/eabi/QtDeclarativeu.def                           | 3 ++-
 .../auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp  | 5 ++++-
 .../qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp       | 5 ++++-
 .../private_headers/qdeclarativedebughelper_p.h                   | 4 ++++
 .../qdeclarativedebughelper/tst_qdeclarativedebughelper.cpp       | 7 +++++++
 .../qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp     | 4 ++++
 12 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/src/declarative/debugger/qdeclarativedebughelper.cpp b/src/declarative/debugger/qdeclarativedebughelper.cpp
index 207ad2b..b003c12 100644
--- a/src/declarative/debugger/qdeclarativedebughelper.cpp
+++ b/src/declarative/debugger/qdeclarativedebughelper.cpp
@@ -48,6 +48,7 @@
 
 #include <private/qdeclarativeengine_p.h>
 #include <private/qabstractanimation_p.h>
+#include <private/qdeclarativeengine_p.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -63,4 +64,11 @@ void QDeclarativeDebugHelper::setAnimationSlowDownFactor(qreal factor)
     timer->setSlowdownFactor(factor);
 }
 
+void QDeclarativeDebugHelper::enableDebugging() {
+    if (!QDeclarativeEnginePrivate::qml_debugging_enabled) {
+        qWarning("Qml debugging is enabled. Only use this in a safe environment!");
+    }
+    QDeclarativeEnginePrivate::qml_debugging_enabled = true;
+}
+
 QT_END_NAMESPACE
diff --git a/src/declarative/debugger/qdeclarativedebughelper_p.h b/src/declarative/debugger/qdeclarativedebughelper_p.h
index 5689dff..a1ac23d 100644
--- a/src/declarative/debugger/qdeclarativedebughelper_p.h
+++ b/src/declarative/debugger/qdeclarativedebughelper_p.h
@@ -60,6 +60,10 @@ class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeDebugHelper
 public:
     static QScriptEngine *getScriptEngine(QDeclarativeEngine *engine);
     static void setAnimationSlowDownFactor(qreal factor);
+
+    // Enables remote debugging functionality
+    // Only use this for debugging in a safe environment!
+    static void enableDebugging();
 };
 
 QT_END_NAMESPACE
diff --git a/src/declarative/debugger/qdeclarativedebugservice.cpp b/src/declarative/debugger/qdeclarativedebugservice.cpp
index c39da3d..8c86ae8 100644
--- a/src/declarative/debugger/qdeclarativedebugservice.cpp
+++ b/src/declarative/debugger/qdeclarativedebugservice.cpp
@@ -42,6 +42,7 @@
 #include "private/qdeclarativedebugservice_p.h"
 
 #include "private/qpacketprotocol_p.h"
+#include "private/qdeclarativeengine_p.h"
 
 #include <QtCore/qdebug.h>
 #include <QtNetwork/qtcpserver.h>
@@ -205,6 +206,12 @@ QDeclarativeDebugServer *QDeclarativeDebugServer::instance()
 
         // format: qmljsdebugger=port:3768[,block]
         if (!appD->qmljsDebugArgumentsString().isEmpty()) {
+            if (!QDeclarativeEnginePrivate::qml_debugging_enabled) {
+                qWarning() << QString::fromLatin1("QDeclarativeDebugServer: Ignoring \"-qmljsdebugger=%1\". "
+                              "Debugging has not been enabled.").arg(
+                                  appD->qmljsDebugArgumentsString()).toAscii().constData();
+                return 0;
+            }
 
             if (appD->qmljsDebugArgumentsString().indexOf(QLatin1String("port:")) == 0) {
                 int separatorIndex = appD->qmljsDebugArgumentsString().indexOf(QLatin1Char(','));
diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp
index 6906f21..808ba68 100644
--- a/src/declarative/qml/qdeclarativeengine.cpp
+++ b/src/declarative/qml/qdeclarativeengine.cpp
@@ -176,6 +176,7 @@ struct StaticQtMetaObject : public QObject
 };
 
 static bool qt_QmlQtModule_registered = false;
+bool QDeclarativeEnginePrivate::qml_debugging_enabled = false;
 
 void QDeclarativeEnginePrivate::defineModule()
 {
diff --git a/src/declarative/qml/qdeclarativeengine_p.h b/src/declarative/qml/qdeclarativeengine_p.h
index 8539fbf..deb4a77 100644
--- a/src/declarative/qml/qdeclarativeengine_p.h
+++ b/src/declarative/qml/qdeclarativeengine_p.h
@@ -321,6 +321,8 @@ public:
     static QString urlToLocalFileOrQrc(const QUrl& url);
 
     static void defineModule();
+
+    static bool qml_debugging_enabled;
 };
 
 /*!
diff --git a/src/s60installs/bwins/QtDeclarativeu.def b/src/s60installs/bwins/QtDeclarativeu.def
index db4012c..9e88df7 100644
--- a/src/s60installs/bwins/QtDeclarativeu.def
+++ b/src/s60installs/bwins/QtDeclarativeu.def
@@ -1838,5 +1838,6 @@ EXPORTS
 	?addChanged@QDeclarativeBasePositioner@@IAEXXZ @ 1837 NONAME ABSENT ; void QDeclarativeBasePositioner::addChanged(void)
 	?start@QDeclarativeAbstractAnimation@@QAEXXZ @ 1838 NONAME ABSENT ; void QDeclarativeAbstractAnimation::start(void)
 	?qt_metacall@QDeclarativeAbstractAnimation@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 1839 NONAME ABSENT ; int QDeclarativeAbstractAnimation::qt_metacall(enum QMetaObject::Call, int, void * *)
-	?connect@QDeclarativePropertyPrivate@@SA_NPBVQObject@@H0HHPAH@Z @ 1840 NONAME ABSENT ; bool QDeclarativePropertyPrivate::connect(class QObject const *, int, class QObject const *, int, int, int *)
+	?enableDebugging@QDeclarativeDebugHelper@@SAXXZ @ 1840 NONAME ; void QDeclarativeDebugHelper::enableDebugging(void)
+	?connect@QDeclarativePropertyPrivate@@SA_NPBVQObject@@H0HHPAH@Z @ 1841 NONAME ABSENT ; bool QDeclarativePropertyPrivate::connect(class QObject const *, int, class QObject const *, int, int, int *)
 
diff --git a/src/s60installs/eabi/QtDeclarativeu.def b/src/s60installs/eabi/QtDeclarativeu.def
index 849ca6a..1f69061 100644
--- a/src/s60installs/eabi/QtDeclarativeu.def
+++ b/src/s60installs/eabi/QtDeclarativeu.def
@@ -1883,5 +1883,6 @@ EXPORTS
 	_ZThn8_N29QDeclarativeAbstractAnimation9setTargetERK20QDeclarativeProperty @ 1882 NONAME ABSENT
 	_ZThn8_N29QDeclarativeAbstractAnimationD0Ev @ 1883 NONAME ABSENT
 	_ZThn8_N29QDeclarativeAbstractAnimationD1Ev @ 1884 NONAME ABSENT
-	_ZN27QDeclarativePropertyPrivate7connectEPK7QObjectiS2_iiPi @ 1885 NONAME ABSENT
+	_ZN23QDeclarativeDebugHelper15enableDebuggingEv @ 1885 NONAME
+	_ZN27QDeclarativePropertyPrivate7connectEPK7QObjectiS2_iiPi @ 1886 NONAME ABSENT
 
diff --git a/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp b/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp
index e6a81b8..53471bf 100644
--- a/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp
+++ b/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp
@@ -59,6 +59,7 @@
 #include <private/qdeclarativerectangle_p.h>
 #include <private/qdeclarativemetatype_p.h>
 #include <private/qdeclarativeproperty_p.h>
+#include <private/qdeclarativedebughelper_p.h>
 
 #include "../../../shared/util.h"
 #include "../shared/debugutil_p.h"
@@ -278,8 +279,10 @@ void tst_QDeclarativeDebug::initTestCase()
 {
     qRegisterMetaType<QDeclarativeDebugWatch::State>();
 
-    QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Waiting for connection on port 3768...");
+    QTest::ignoreMessage(QtWarningMsg, "Qml debugging is enabled. Only use this in a safe environment!");
+    QDeclarativeDebugHelper::enableDebugging();
 
+    QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Waiting for connection on port 3768...");
     m_engine = new QDeclarativeEngine(this);
 
     QList<QByteArray> qml;
diff --git a/tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp b/tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp
index 80241ba..64afd4e 100644
--- a/tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp
+++ b/tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp
@@ -51,6 +51,7 @@
 #include <private/qdeclarativeenginedebug_p.h>
 #include <private/qdeclarativedebugclient_p.h>
 #include <private/qdeclarativedebugservice_p.h>
+#include <private/qdeclarativedebughelper_p.h>
 
 #include "../../../shared/util.h"
 #include "../shared/debugutil_p.h"
@@ -72,8 +73,10 @@ private slots:
 
 void tst_QDeclarativeDebugClient::initTestCase()
 {
-    QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Waiting for connection on port 3770...");
+    QTest::ignoreMessage(QtWarningMsg, "Qml debugging is enabled. Only use this in a safe environment!");
+    QDeclarativeDebugHelper::enableDebugging();
 
+    QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Waiting for connection on port 3770...");
     new QDeclarativeEngine(this);
 
     m_conn = new QDeclarativeDebugConnection(this);
diff --git a/tests/auto/declarative/qdeclarativedebughelper/private_headers/qdeclarativedebughelper_p.h b/tests/auto/declarative/qdeclarativedebughelper/private_headers/qdeclarativedebughelper_p.h
index c9cb839..edfc58f 100644
--- a/tests/auto/declarative/qdeclarativedebughelper/private_headers/qdeclarativedebughelper_p.h
+++ b/tests/auto/declarative/qdeclarativedebughelper/private_headers/qdeclarativedebughelper_p.h
@@ -58,6 +58,10 @@ class Q_DECLARATIVE_EXPORT QDeclarativeDebugHelper
 public:
     static QScriptEngine *getScriptEngine(QDeclarativeEngine *engine);
     static void setAnimationSlowDownFactor(qreal factor);
+
+    // Enables remote debugging functionality
+    // Only use this for debugging in a safe environment!
+    static void enableDebugging();
 };
 
 QT_END_NAMESPACE
diff --git a/tests/auto/declarative/qdeclarativedebughelper/tst_qdeclarativedebughelper.cpp b/tests/auto/declarative/qdeclarativedebughelper/tst_qdeclarativedebughelper.cpp
index 36f2222..60aec9d 100644
--- a/tests/auto/declarative/qdeclarativedebughelper/tst_qdeclarativedebughelper.cpp
+++ b/tests/auto/declarative/qdeclarativedebughelper/tst_qdeclarativedebughelper.cpp
@@ -54,6 +54,7 @@ class tst_qdeclarativedebughelper : public QObject {
 private slots:
     void getScriptEngine();
     void setAnimationSlowDownFactor();
+    void enableDebugging();
 };
 
 class TestAnimation : public QAbstractAnimation {
@@ -109,6 +110,12 @@ void tst_qdeclarativedebughelper::setAnimationSlowDownFactor()
     QVERIFY(animation.updateCalled > 1);
 }
 
+void tst_qdeclarativedebughelper::enableDebugging()
+{
+    QTest::ignoreMessage(QtWarningMsg, "Qml debugging is enabled. Only use this in a safe environment!");
+    QDeclarativeDebugHelper::enableDebugging();
+}
+
 QTEST_MAIN(tst_qdeclarativedebughelper)
 
 #include "tst_qdeclarativedebughelper.moc"
diff --git a/tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp b/tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp
index 538129c..30629f9 100644
--- a/tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp
+++ b/tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp
@@ -46,6 +46,7 @@
 #include <QThread>
 
 #include <QtDeclarative/qdeclarativeengine.h>
+#include <private/qdeclarativedebughelper_p.h>
 
 #include <private/qdeclarativedebug_p.h>
 #include <private/qdeclarativeenginedebug_p.h>
@@ -75,6 +76,9 @@ private slots:
 
 void tst_QDeclarativeDebugService::initTestCase()
 {
+    QTest::ignoreMessage(QtWarningMsg, "Qml debugging is enabled. Only use this in a safe environment!");
+    QDeclarativeDebugHelper::enableDebugging();
+
     QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Waiting for connection on port 3769...");
     new QDeclarativeEngine(this);
 
-- 
cgit v0.12


From 445ef8847979dab72893aab1924d46d0fe1a8a3e Mon Sep 17 00:00:00 2001
From: Gabriel de Dietrich <gabriel.dietrich-de@nokia.com>
Date: Tue, 2 Nov 2010 17:25:54 +0100
Subject: With some locales, QDoubleValidator would not accept "C" locale valid
 numbers

Locales using dot as thousands delimiter and comma as decimal
separator are prone to this error.

This is a regression introduced by commit b81b8e43ad57183ed66.

Auto-tests included.

Reviewed-by: Olivier
Task-number: QTBUG_14935
---
 src/corelib/tools/qlocale.h                        |  2 +-
 src/gui/widgets/qvalidator.cpp                     | 45 +++++++++++++---------
 .../auto/qdoublevalidator/tst_qdoublevalidator.cpp |  4 ++
 3 files changed, 32 insertions(+), 19 deletions(-)

diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index 8b424bb..1af2cb4 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -114,7 +114,7 @@ class Q_CORE_EXPORT QLocale
     friend class QString;
     friend class QByteArray;
     friend class QIntValidator;
-    friend class QDoubleValidator;
+    friend class QDoubleValidatorPrivate;
     friend class QTextStream;
     friend class QTextStreamPrivate;
 
diff --git a/src/gui/widgets/qvalidator.cpp b/src/gui/widgets/qvalidator.cpp
index b75db45..130d091 100644
--- a/src/gui/widgets/qvalidator.cpp
+++ b/src/gui/widgets/qvalidator.cpp
@@ -499,6 +499,8 @@ public:
     }
 
     QDoubleValidator::Notation notation;
+
+    QValidator::State validateWithLocale(QString & input, QLocalePrivate::NumberMode numMode, const QLocale &locale) const;
 };
 
 
@@ -654,42 +656,49 @@ QValidator::State QDoubleValidator::validate(QString & input, int &) const
             break;
     }
 
+    State currentLocaleValidation = d->validateWithLocale(input, numMode, locale());
+    if (currentLocaleValidation == Acceptable || locale().language() == QLocale::C)
+        return currentLocaleValidation;
+    State cLocaleValidation = d->validateWithLocale(input, numMode, QLocale(QLocale::C));
+    return qMax(currentLocaleValidation, cLocaleValidation);
+}
+
+QValidator::State QDoubleValidatorPrivate::validateWithLocale(QString &input, QLocalePrivate::NumberMode numMode, const QLocale &locale) const
+{
+    Q_Q(const QDoubleValidator);
     QByteArray buff;
-    if (!locale().d()->validateChars(input, numMode, &buff, dec)) {
-        QLocale cl(QLocale::C);
-        if (!cl.d()->validateChars(input, numMode, &buff, dec))
-            return Invalid;
-    }
+    if (!locale.d()->validateChars(input, numMode, &buff, q->dec))
+        return QValidator::Invalid;
 
     if (buff.isEmpty())
-        return Intermediate;
+        return QValidator::Intermediate;
 
-    if (b >= 0 && buff.startsWith('-'))
-        return Invalid;
+    if (q->b >= 0 && buff.startsWith('-'))
+        return QValidator::Invalid;
 
-    if (t < 0 && buff.startsWith('+'))
-        return Invalid;
+    if (q->t < 0 && buff.startsWith('+'))
+        return QValidator::Invalid;
 
     bool ok, overflow;
     double i = QLocalePrivate::bytearrayToDouble(buff.constData(), &ok, &overflow);
     if (overflow)
-        return Invalid;
+        return QValidator::Invalid;
     if (!ok)
-        return Intermediate;
+        return QValidator::Intermediate;
 
-    if (i >= b && i <= t)
-        return Acceptable;
+    if (i >= q->b && i <= q->t)
+        return QValidator::Acceptable;
 
-    if (d->notation == StandardNotation) {
-        double max = qMax(qAbs(b), qAbs(t));
+    if (notation == QDoubleValidator::StandardNotation) {
+        double max = qMax(qAbs(q->b), qAbs(q->t));
         if (max < LLONG_MAX) {
             qlonglong n = pow10(numDigits(qlonglong(max))) - 1;
             if (qAbs(i) > n)
-                return Invalid;
+                return QValidator::Invalid;
         }
     }
 
-    return Intermediate;
+    return QValidator::Intermediate;
 }
 
 
diff --git a/tests/auto/qdoublevalidator/tst_qdoublevalidator.cpp b/tests/auto/qdoublevalidator/tst_qdoublevalidator.cpp
index 26890b3..3470456 100644
--- a/tests/auto/qdoublevalidator/tst_qdoublevalidator.cpp
+++ b/tests/auto/qdoublevalidator/tst_qdoublevalidator.cpp
@@ -214,6 +214,10 @@ void tst_QDoubleValidator::validate_data()
     arabicNum += QChar(1643);
     arabicNum += QChar(1636);
     QTest::newRow("arabic") << "ar" << 0.0 << 20.0 << 2 << arabicNum << ACC << ACC;
+
+    QTest::newRow("data_QTBUG_14935-1") << "de" << 0.0 << 1.0 << 5 << QString("0.31") << ACC << ACC;
+    QTest::newRow("data_QTBUG_14935-2") << "de" << 0.0 << 1000000.0 << 5 << QString("3.123") << ACC << ACC;
+    QTest::newRow("data_QTBUG_14935-3") << "de" << 0.0 << 1000000.0 << 5 << QString("123,345.678") << ACC << ACC;
 }
 
 void tst_QDoubleValidator::validate()
-- 
cgit v0.12


From af15292e4982c11542487d39fc76ccfb8516598f Mon Sep 17 00:00:00 2001
From: Yann Bodson <yann.bodson@nokia.com>
Date: Wed, 3 Nov 2010 14:55:46 +1000
Subject: Regression: QDeclarativeText does not update when text turns empty

Task-number: QTBUG-14865
Reviewed-by: Michael Brasser
---
 src/declarative/graphicsitems/qdeclarativetext.cpp |   1 +
 .../graphicsitems/qdeclarativetextlayout.cpp       |  13 +
 .../graphicsitems/qdeclarativetextlayout_p.h       |   1 +
 .../qdeclarativetext/data-MAC/qtbug_14865.0.png    | Bin 0 -> 1695 bytes
 .../qdeclarativetext/data-MAC/qtbug_14865.1.png    | Bin 0 -> 625 bytes
 .../qdeclarativetext/data-MAC/qtbug_14865.qml      | 719 +++++++++++++++++++++
 .../qmlvisual/qdeclarativetext/qtbug_14865.qml     |  17 +
 7 files changed, 751 insertions(+)
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/qtbug_14865.qml

diff --git a/src/declarative/graphicsitems/qdeclarativetext.cpp b/src/declarative/graphicsitems/qdeclarativetext.cpp
index 8cb47aa..84f276e 100644
--- a/src/declarative/graphicsitems/qdeclarativetext.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetext.cpp
@@ -219,6 +219,7 @@ void QDeclarativeTextPrivate::updateSize()
 
     QFontMetrics fm(font);
     if (text.isEmpty()) {
+        q->setImplicitWidth(0);
         q->setImplicitHeight(fm.height());
         emit q->paintedSizeChanged();
         q->update();
diff --git a/src/declarative/graphicsitems/qdeclarativetextlayout.cpp b/src/declarative/graphicsitems/qdeclarativetextlayout.cpp
index 89a2158..db5d75d 100644
--- a/src/declarative/graphicsitems/qdeclarativetextlayout.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextlayout.cpp
@@ -285,6 +285,19 @@ void QDeclarativeTextLayout::beginLayout()
     QTextLayout::beginLayout();
 }
 
+void QDeclarativeTextLayout::clearLayout()
+{
+    if (d && d->cached) {
+        d->cached = false;
+        d->items.clear();
+        d->positions.clear();
+        d->glyphs.clear();
+        d->chars.clear();
+        d->position = QPointF();
+    }
+    QTextLayout::clearLayout();
+}
+
 void QDeclarativeTextLayout::prepare()
 {
     if (!d || !d->cached) {
diff --git a/src/declarative/graphicsitems/qdeclarativetextlayout_p.h b/src/declarative/graphicsitems/qdeclarativetextlayout_p.h
index 90bf0e0..8b81db3 100644
--- a/src/declarative/graphicsitems/qdeclarativetextlayout_p.h
+++ b/src/declarative/graphicsitems/qdeclarativetextlayout_p.h
@@ -59,6 +59,7 @@ public:
     ~QDeclarativeTextLayout();
 
     void beginLayout();
+    void clearLayout();
 
     void prepare();
     void draw(QPainter *, const QPointF & = QPointF());
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png
new file mode 100644
index 0000000..a947584
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.png
new file mode 100644
index 0000000..84430bb
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml
new file mode 100644
index 0000000..940d3c1
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml
@@ -0,0 +1,719 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 32
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 48
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 64
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 80
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 96
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 112
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 128
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 144
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 160
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 176
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 192
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 208
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 224
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 240
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 256
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 272
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 288
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 304
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 320
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 336
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 352
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 368
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 384
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 400
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 416
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 432
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 448
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 464
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 480
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 496
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 512
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 528
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 544
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 560
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 576
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 592
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 608
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 624
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 640
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 656
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 672
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 688
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 704
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 720
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 736
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 752
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 768
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 784
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 800
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 816
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 832
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 848
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 864
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 880
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 896
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 912
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 928
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 944
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 960
+        image: "qtbug_14865.0.png"
+    }
+    Frame {
+        msec: 976
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 992
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 1008
+        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+    }
+    Frame {
+        msec: 1024
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1040
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1056
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1072
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1088
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1104
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1120
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1136
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1152
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1168
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1184
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1200
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1216
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1232
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1248
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1264
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1280
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1296
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1312
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1328
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1344
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1360
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1376
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1392
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1408
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1424
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1440
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1456
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1472
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1488
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1504
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1520
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1536
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1552
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1568
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1584
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1600
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1616
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1632
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1648
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1664
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1680
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1696
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1712
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1728
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1744
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1760
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1776
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1792
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1808
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1824
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1840
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1856
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1872
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1888
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1904
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1920
+        image: "qtbug_14865.1.png"
+    }
+    Frame {
+        msec: 1936
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1952
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1968
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1984
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2000
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2016
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2032
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2048
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2064
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2080
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2096
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2112
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2128
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2144
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2160
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2176
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2192
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2208
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2224
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2240
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2256
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Key {
+        type: 6
+        key: 16777249
+        modifiers: 0
+        text: ""
+        autorep: false
+        count: 1
+    }
+    Frame {
+        msec: 2272
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2288
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2304
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2320
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2336
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2352
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2368
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2384
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2400
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2416
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2432
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2448
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2464
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2480
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2496
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2512
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2528
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2544
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2560
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2576
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2592
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2608
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2624
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2640
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2656
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2672
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2688
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2704
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2720
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2736
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2752
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2768
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2784
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2800
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 2816
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/qtbug_14865.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/qtbug_14865.qml
new file mode 100644
index 0000000..07416dc
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/qtbug_14865.qml
@@ -0,0 +1,17 @@
+import QtQuick 1.0
+
+Rectangle {
+    width: 200; height: 200
+
+    Text {
+        id: label
+        objectName: "label"
+        text: "Hello world!"
+        width: 10
+    }
+
+    Timer {
+        running: true; interval: 1000
+        onTriggered: label.text = ""
+    }
+}
-- 
cgit v0.12


From 648eb76c22762c510815305e9e495db2aee9d2ad Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Wed, 3 Nov 2010 16:18:11 +1000
Subject: Combining ListView.StrictlyEnforceRange and resizing currentItem
 stalls. There were two problems.  1) layout() called fixup() was called while
 the view was being flicked. 2) the snapping code was incorrect (and
 duplicated).

Task-number: QTBUG-14821
Reviewed-by: Michael Brasser
---
 .../graphicsitems/qdeclarativeflickable.cpp        |    9 +-
 .../graphicsitems/qdeclarativeflickable_p_p.h      |    3 +
 .../graphicsitems/qdeclarativelistview.cpp         |   62 +-
 .../qmlvisual/ListView/data/enforcerange.0.png     |  Bin 0 -> 680 bytes
 .../qmlvisual/ListView/data/enforcerange.1.png     |  Bin 0 -> 704 bytes
 .../qmlvisual/ListView/data/enforcerange.2.png     |  Bin 0 -> 695 bytes
 .../qmlvisual/ListView/data/enforcerange.3.png     |  Bin 0 -> 680 bytes
 .../qmlvisual/ListView/data/enforcerange.4.png     |  Bin 0 -> 701 bytes
 .../qmlvisual/ListView/data/enforcerange.5.png     |  Bin 0 -> 704 bytes
 .../qmlvisual/ListView/data/enforcerange.qml       | 2119 ++++++++++++++++++++
 .../qmlvisual/ListView/enforcerange.qml            |   31 +
 11 files changed, 2181 insertions(+), 43 deletions(-)
 create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/enforcerange.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/enforcerange.1.png
 create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/enforcerange.2.png
 create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/enforcerange.3.png
 create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/enforcerange.4.png
 create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/enforcerange.5.png
 create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/enforcerange.qml
 create mode 100644 tests/auto/declarative/qmlvisual/ListView/enforcerange.qml

diff --git a/src/declarative/graphicsitems/qdeclarativeflickable.cpp b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
index b737785..01a8585 100644
--- a/src/declarative/graphicsitems/qdeclarativeflickable.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
@@ -53,9 +53,6 @@ QT_BEGIN_NAMESPACE
 // before we perform a flick.
 static const int FlickThreshold = 20;
 
-// Really slow flicks can be annoying.
-static const int MinimumFlickVelocity = 75;
-
 QDeclarativeFlickableVisibleArea::QDeclarativeFlickableVisibleArea(QDeclarativeFlickable *parent)
     : QObject(parent), flickable(parent), m_xPosition(0.), m_widthRatio(0.)
     , m_yPosition(0.), m_heightRatio(0.)
@@ -990,8 +987,8 @@ void QDeclarativeFlickable::viewportMoved()
 {
     Q_D(QDeclarativeFlickable);
 
-    qreal prevY = d->lastFlickablePosition.x();
-    qreal prevX = d->lastFlickablePosition.y();
+    qreal prevX = d->lastFlickablePosition.x();
+    qreal prevY = d->lastFlickablePosition.y();
     d->velocityTimeline.clear();
     if (d->pressed || d->calcVelocity) {
         int elapsed = QDeclarativeItemPrivate::restart(d->velocityTime);
@@ -1012,7 +1009,7 @@ void QDeclarativeFlickable::viewportMoved()
         }
     }
 
-    d->lastFlickablePosition = QPointF(d->vData.move.value(), d->hData.move.value());
+    d->lastFlickablePosition = QPointF(d->hData.move.value(), d->vData.move.value());
 
     d->vTime = d->timeline.time();
     d->updateBeginningEnd();
diff --git a/src/declarative/graphicsitems/qdeclarativeflickable_p_p.h b/src/declarative/graphicsitems/qdeclarativeflickable_p_p.h
index afefde2..92cf748 100644
--- a/src/declarative/graphicsitems/qdeclarativeflickable_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeflickable_p_p.h
@@ -66,6 +66,9 @@
 
 QT_BEGIN_NAMESPACE
 
+// Really slow flicks can be annoying.
+const qreal MinimumFlickVelocity = 75.0;
+
 class QDeclarativeFlickableVisibleArea;
 class QDeclarativeFlickablePrivate : public QDeclarativeItemPrivate, public QDeclarativeItemChangeListener
 {
diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp
index 38a4839..eab66d8 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp
@@ -334,28 +334,9 @@ public:
         return model && model->count() && model->isValid();
     }
 
-    int snapIndex() {
-        int index = currentIndex;
-        for (int i = 0; i < visibleItems.count(); ++i) {
-            FxListItem *item = visibleItems[i];
-            if (item->index == -1)
-                continue;
-            qreal itemTop = item->position();
-            if (itemTop >= highlight->position()-item->size()/2 && itemTop < highlight->position()+item->size()/2)
-                return item->index;
-        }
-        return index;
-    }
-
     qreal snapPosAt(qreal pos) {
-        for (int i = 0; i < visibleItems.count(); ++i) {
-            FxListItem *item = visibleItems[i];
-            if (item->index == -1)
-                continue;
-            qreal itemTop = item->position();
-            if (itemTop+item->size()/2 >= pos && itemTop <= pos)
-                return item->position();
-        }
+        if (FxListItem *snapItem = snapItemAt(pos))
+            return snapItem->position();
         if (visibleItems.count()) {
             qreal firstPos = visibleItems.first()->position();
             qreal endPos = visibleItems.last()->position();
@@ -368,17 +349,18 @@ public:
     }
 
     FxListItem *snapItemAt(qreal pos) {
+        FxListItem *snapItem = 0;
         for (int i = 0; i < visibleItems.count(); ++i) {
             FxListItem *item = visibleItems[i];
             if (item->index == -1)
                 continue;
             qreal itemTop = item->position();
-            if (item->index == model->count()-1 || (itemTop+item->size()/2 >= pos))
+            if (highlight && itemTop >= pos && item->endPosition() <= pos + highlight->size() - 1)
                 return item;
+            if (itemTop+item->size()/2 >= pos && itemTop-item->size()/2 < pos)
+                snapItem = item;
         }
-        if (visibleItems.count() && visibleItems.first()->position() <= pos)
-            return visibleItems.first();
-        return 0;
+        return snapItem;
     }
 
     int lastVisibleIndex() const {
@@ -768,8 +750,10 @@ void QDeclarativeListViewPrivate::layout()
     minExtentDirty = true;
     maxExtentDirty = true;
     updateHighlight();
-    fixupPosition();
-    q->refill();
+    if (!q->isMoving() && !q->isFlicking()) {
+        fixupPosition();
+        q->refill();
+    }
     if (header)
         updateHeader();
     if (footer)
@@ -1350,12 +1334,15 @@ void QDeclarativeListViewPrivate::flick(AxisData &data, qreal minExtent, qreal m
             qreal newtarget = data.flickTarget;
             if (snapMode != QDeclarativeListView::NoSnap || highlightRange == QDeclarativeListView::StrictlyEnforceRange)
                 newtarget = -snapPosAt(-(data.flickTarget - highlightRangeStart)) + highlightRangeStart;
-            if (velocity < 0 && newtarget < maxExtent)
-                newtarget = maxExtent;
-            else if (velocity > 0 && newtarget > minExtent)
-                newtarget = minExtent;
-            if (newtarget == data.flickTarget) // boundary unchanged - nothing to do
+            if (velocity < 0 && newtarget <= maxExtent)
+                newtarget = maxExtent - overshootDist;
+            else if (velocity > 0 && newtarget >= minExtent)
+                newtarget = minExtent + overshootDist;
+            if (newtarget == data.flickTarget) { // boundary unchanged - nothing to do
+                if (qAbs(velocity) < MinimumFlickVelocity)
+                    correctFlick = false;
                 return;
+            }
             data.flickTarget = newtarget;
             qreal dist = -newtarget + data.move.value();
             if ((v < 0 && dist < 0) || (v > 0 && dist > 0)) {
@@ -1365,7 +1352,7 @@ void QDeclarativeListViewPrivate::flick(AxisData &data, qreal minExtent, qreal m
                 return;
             }
             timeline.reset(data.move);
-            timeline.accelDistance(data.move, v, -dist + (v < 0 ? -overshootDist : overshootDist));
+            timeline.accelDistance(data.move, v, -dist);
             timeline.callback(QDeclarativeTimeLineCallback(&data.move, fixupCallback, this));
         }
     } else {
@@ -1696,7 +1683,7 @@ void QDeclarativeListView::setCurrentIndex(int index)
     if (isComponentComplete() && d->isValid()) {
         d->moveReason = QDeclarativeListViewPrivate::SetIndex;
         d->updateCurrent(index);
-    } else {
+    } else if (d->currentIndex != index) {
         d->currentIndex = index;
         emit currentIndexChanged();
     }
@@ -2323,9 +2310,10 @@ void QDeclarativeListView::viewportMoved()
             d->highlight->setPosition(qRound(pos));
 
             // update current index
-            int idx = d->snapIndex();
-            if (idx >= 0 && idx != d->currentIndex)
-                d->updateCurrent(idx);
+            if (FxListItem *snapItem = d->snapItemAt(d->highlight->position())) {
+                if (snapItem->index >= 0 && snapItem->index != d->currentIndex)
+                    d->updateCurrent(snapItem->index);
+            }
         }
     }
 
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.0.png b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.0.png
new file mode 100644
index 0000000..d466434
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.1.png b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.1.png
new file mode 100644
index 0000000..45d9712
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.2.png b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.2.png
new file mode 100644
index 0000000..3f05a5e
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.3.png b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.3.png
new file mode 100644
index 0000000..d466434
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.4.png b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.4.png
new file mode 100644
index 0000000..c902676
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.5.png b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.5.png
new file mode 100644
index 0000000..45d9712
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.5.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.qml b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.qml
new file mode 100644
index 0000000..c15b657
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.qml
@@ -0,0 +1,2119 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 32
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 48
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 64
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 80
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 96
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 112
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 128
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 144
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 160
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 176
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 192
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 208
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 224
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 240
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 256
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 272
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 288
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 304
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 320
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 336
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 352
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 368
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 384
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 400
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 416
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 432
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 448
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 464
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 480
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 496
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 512
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 528
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 544
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 560
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 576
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 592
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 608
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 624
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 640
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 656
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 672
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 688
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 704
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 720
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 736
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 752
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 768
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 784
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 800
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 816
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 832
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 848
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 864
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 880
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 896
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 912
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 928
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 944
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 960
+        image: "enforcerange.0.png"
+    }
+    Frame {
+        msec: 976
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 992
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 1008
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 1024
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 1040
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 1056
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 1072
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 1088
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 1104
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 1120
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 1136
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 1152
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 1168
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 1184
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 1200
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 77; y: 157
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1216
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 1232
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 1248
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 77; y: 156
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1264
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 77; y: 154
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 76; y: 151
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1280
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 75; y: 144
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 74; y: 136
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1296
+        hash: "c7667b5af9f2ee912abe5879266cb1e0"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 73; y: 131
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 72; y: 122
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1312
+        hash: "1e762d6ffe1ceb53046d7953645d02d5"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 71; y: 118
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 71; y: 111
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1328
+        hash: "0d2b7130a84a8efac1cf4fe8a1768231"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 71; y: 108
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 71; y: 102
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1344
+        hash: "6ef2715c3fd26d50d26fb740afa6dece"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 71; y: 98
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 71; y: 92
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 71; y: 92
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1360
+        hash: "f489b6f951281ff9a981ec046ca5b17d"
+    }
+    Frame {
+        msec: 1376
+        hash: "fd6e7d7db7c4571ee606269fb9680ed9"
+    }
+    Frame {
+        msec: 1392
+        hash: "398a238f59a2edf07870b624b914c81d"
+    }
+    Frame {
+        msec: 1408
+        hash: "fdce64faab7e7e31a229adda47924cd1"
+    }
+    Frame {
+        msec: 1424
+        hash: "8d474956331fdd0c35beb13a06b7c557"
+    }
+    Frame {
+        msec: 1440
+        hash: "f89fed6f7fa07a8320f07a1e68240a7e"
+    }
+    Frame {
+        msec: 1456
+        hash: "940b70f15082ff138579892bb6f20ce9"
+    }
+    Frame {
+        msec: 1472
+        hash: "35ab744ce2a91567dbbd769f9486f870"
+    }
+    Frame {
+        msec: 1488
+        hash: "6b2d32b8f1df871c2c014af8b5d87329"
+    }
+    Frame {
+        msec: 1504
+        hash: "edf3b33b80cca53999779555f9cd6162"
+    }
+    Frame {
+        msec: 1520
+        hash: "180f3cc4ea5ff5b6f9e8be0294732d4e"
+    }
+    Frame {
+        msec: 1536
+        hash: "28e9ca60a873910380b2d22d6b3df565"
+    }
+    Frame {
+        msec: 1552
+        hash: "3bb1e8d69f171f09eb4c6f9914fc9576"
+    }
+    Frame {
+        msec: 1568
+        hash: "0501da09be444df6cee4b19617290317"
+    }
+    Frame {
+        msec: 1584
+        hash: "8ce1ac0163b0353167488aff2879e841"
+    }
+    Frame {
+        msec: 1600
+        hash: "18e53bf6337cf6590fc3c73c00469d8e"
+    }
+    Frame {
+        msec: 1616
+        hash: "0c31ede980d07069f4977d5753d00ddf"
+    }
+    Frame {
+        msec: 1632
+        hash: "0a854a54176c24f0ebbb6cb747dc0ab7"
+    }
+    Frame {
+        msec: 1648
+        hash: "8dba1ebca6f00b7a64a6982fb8c28c50"
+    }
+    Frame {
+        msec: 1664
+        hash: "8d273efc36ba722af4d044e6552c9dcb"
+    }
+    Frame {
+        msec: 1680
+        hash: "674b07dc5b99bf2da93c40d42dc9023d"
+    }
+    Frame {
+        msec: 1696
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 1712
+        hash: "b64810845a97bedf6fe11c043457c197"
+    }
+    Frame {
+        msec: 1728
+        hash: "87aaa82b96131fed8822e57e226162a0"
+    }
+    Frame {
+        msec: 1744
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 1760
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 1776
+        hash: "81110f17d191f9795a2c57d136e86550"
+    }
+    Frame {
+        msec: 1792
+        hash: "090a76cf068a5041ff993f21e6ebd087"
+    }
+    Frame {
+        msec: 1808
+        hash: "30eb157c89ad0aeb17fd0012afb9246b"
+    }
+    Frame {
+        msec: 1824
+        hash: "6b317b59e1b0f5b17a6d7d96e745f576"
+    }
+    Frame {
+        msec: 1840
+        hash: "f9fc8467c6dbcb00d1f41a57b550193c"
+    }
+    Frame {
+        msec: 1856
+        hash: "744227adbdd31be2920a232ea0dbc85d"
+    }
+    Frame {
+        msec: 1872
+        hash: "d4b370ff8c3b66fc8a616dd9b944abd1"
+    }
+    Frame {
+        msec: 1888
+        hash: "674b07dc5b99bf2da93c40d42dc9023d"
+    }
+    Frame {
+        msec: 1904
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 1920
+        image: "enforcerange.1.png"
+    }
+    Frame {
+        msec: 1936
+        hash: "b64810845a97bedf6fe11c043457c197"
+    }
+    Frame {
+        msec: 1952
+        hash: "87aaa82b96131fed8822e57e226162a0"
+    }
+    Frame {
+        msec: 1968
+        hash: "70b475e88060ead84d05f0ba1b47c139"
+    }
+    Frame {
+        msec: 1984
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 2000
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 2016
+        hash: "81110f17d191f9795a2c57d136e86550"
+    }
+    Frame {
+        msec: 2032
+        hash: "090a76cf068a5041ff993f21e6ebd087"
+    }
+    Frame {
+        msec: 2048
+        hash: "090a76cf068a5041ff993f21e6ebd087"
+    }
+    Frame {
+        msec: 2064
+        hash: "30eb157c89ad0aeb17fd0012afb9246b"
+    }
+    Frame {
+        msec: 2080
+        hash: "6b317b59e1b0f5b17a6d7d96e745f576"
+    }
+    Frame {
+        msec: 2096
+        hash: "f9fc8467c6dbcb00d1f41a57b550193c"
+    }
+    Frame {
+        msec: 2112
+        hash: "f9fc8467c6dbcb00d1f41a57b550193c"
+    }
+    Frame {
+        msec: 2128
+        hash: "711274e9b6811b4662ac29d813574fb6"
+    }
+    Frame {
+        msec: 2144
+        hash: "744227adbdd31be2920a232ea0dbc85d"
+    }
+    Frame {
+        msec: 2160
+        hash: "744227adbdd31be2920a232ea0dbc85d"
+    }
+    Frame {
+        msec: 2176
+        hash: "d4b370ff8c3b66fc8a616dd9b944abd1"
+    }
+    Frame {
+        msec: 2192
+        hash: "d4b370ff8c3b66fc8a616dd9b944abd1"
+    }
+    Frame {
+        msec: 2208
+        hash: "674b07dc5b99bf2da93c40d42dc9023d"
+    }
+    Frame {
+        msec: 2224
+        hash: "674b07dc5b99bf2da93c40d42dc9023d"
+    }
+    Frame {
+        msec: 2240
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 2256
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 2272
+        hash: "b64810845a97bedf6fe11c043457c197"
+    }
+    Frame {
+        msec: 2288
+        hash: "b64810845a97bedf6fe11c043457c197"
+    }
+    Frame {
+        msec: 2304
+        hash: "87aaa82b96131fed8822e57e226162a0"
+    }
+    Frame {
+        msec: 2320
+        hash: "87aaa82b96131fed8822e57e226162a0"
+    }
+    Frame {
+        msec: 2336
+        hash: "87aaa82b96131fed8822e57e226162a0"
+    }
+    Frame {
+        msec: 2352
+        hash: "70b475e88060ead84d05f0ba1b47c139"
+    }
+    Frame {
+        msec: 2368
+        hash: "70b475e88060ead84d05f0ba1b47c139"
+    }
+    Frame {
+        msec: 2384
+        hash: "70b475e88060ead84d05f0ba1b47c139"
+    }
+    Frame {
+        msec: 2400
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 2416
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 2432
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 2448
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 2464
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 2480
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 2496
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 2512
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 2528
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 2544
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 2560
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 2576
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 2592
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 2608
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 2624
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 2640
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 2656
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 2672
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 2688
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 2704
+        hash: "70b475e88060ead84d05f0ba1b47c139"
+    }
+    Frame {
+        msec: 2720
+        hash: "70b475e88060ead84d05f0ba1b47c139"
+    }
+    Frame {
+        msec: 2736
+        hash: "87aaa82b96131fed8822e57e226162a0"
+    }
+    Frame {
+        msec: 2752
+        hash: "87aaa82b96131fed8822e57e226162a0"
+    }
+    Frame {
+        msec: 2768
+        hash: "b64810845a97bedf6fe11c043457c197"
+    }
+    Frame {
+        msec: 2784
+        hash: "b64810845a97bedf6fe11c043457c197"
+    }
+    Frame {
+        msec: 2800
+        hash: "b64810845a97bedf6fe11c043457c197"
+    }
+    Frame {
+        msec: 2816
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 2832
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 2848
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 2864
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 2880
+        image: "enforcerange.2.png"
+    }
+    Frame {
+        msec: 2896
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 2912
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 2928
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 2944
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 2960
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 2976
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 2992
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 3008
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 3024
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 82; y: 39
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3040
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 3056
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 82; y: 40
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3072
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 82; y: 42
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 81; y: 44
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3088
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 81; y: 47
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 81; y: 55
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3104
+        hash: "89016574205e00cf42723446d6a3437e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 81; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 81; y: 69
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3120
+        hash: "e2db9b1ae5c4be51a548834a7776da1f"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 80; y: 75
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 80; y: 87
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3136
+        hash: "fcfad57224192065782a77ad3398d0d1"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 80; y: 93
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 80; y: 107
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3152
+        hash: "bae4fc0fc2d33008ebe827ece94af196"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 84; y: 130
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 88; y: 144
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3168
+        hash: "569581944bf18c8165f72c60bdbf1011"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 96; y: 161
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 96; y: 161
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3184
+        hash: "613ff94a26bfaa9a4dc94fcbf6c3eb57"
+    }
+    Frame {
+        msec: 3200
+        hash: "a63f8e6b194f900acb1b7a332f9fb9ae"
+    }
+    Frame {
+        msec: 3216
+        hash: "6c04761cc86d28112c16f692cda58ba4"
+    }
+    Frame {
+        msec: 3232
+        hash: "544275da3f7e2ccaedc8c521bf17f59b"
+    }
+    Frame {
+        msec: 3248
+        hash: "52831480eb69184341b12ffb09ace736"
+    }
+    Frame {
+        msec: 3264
+        hash: "52831480eb69184341b12ffb09ace736"
+    }
+    Frame {
+        msec: 3280
+        hash: "52831480eb69184341b12ffb09ace736"
+    }
+    Frame {
+        msec: 3296
+        hash: "52831480eb69184341b12ffb09ace736"
+    }
+    Frame {
+        msec: 3312
+        hash: "58f2b900bc335424fc70eaaeb23ceb56"
+    }
+    Frame {
+        msec: 3328
+        hash: "58f2b900bc335424fc70eaaeb23ceb56"
+    }
+    Frame {
+        msec: 3344
+        hash: "544275da3f7e2ccaedc8c521bf17f59b"
+    }
+    Frame {
+        msec: 3360
+        hash: "df9fef370c2f6ff300b20fc24b5b9e34"
+    }
+    Frame {
+        msec: 3376
+        hash: "99cdc74eefc8c7c7df4650b373d8bc15"
+    }
+    Frame {
+        msec: 3392
+        hash: "0662898d246e5ff6981610d32e2b8375"
+    }
+    Frame {
+        msec: 3408
+        hash: "651b4c8b7a241263d48e645e603a55a3"
+    }
+    Frame {
+        msec: 3424
+        hash: "82b31c8e8794ce3a9a6a635ef93b29b3"
+    }
+    Frame {
+        msec: 3440
+        hash: "388658b5e03f3853e93173bd9501b77b"
+    }
+    Frame {
+        msec: 3456
+        hash: "cf1856e961e6b8277a82c03ace5ba864"
+    }
+    Frame {
+        msec: 3472
+        hash: "e1d022cc1b41098baffe49925b20678f"
+    }
+    Frame {
+        msec: 3488
+        hash: "ee55d155fa495f3a0da8c21ad56dfc61"
+    }
+    Frame {
+        msec: 3504
+        hash: "044c3712a6a5f6a973defe85643c8d02"
+    }
+    Frame {
+        msec: 3520
+        hash: "e4fe2f1a81a4a4806f4155807f285a2d"
+    }
+    Frame {
+        msec: 3536
+        hash: "e4fe2f1a81a4a4806f4155807f285a2d"
+    }
+    Frame {
+        msec: 3552
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3568
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3584
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3600
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3616
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3632
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3648
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3664
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3680
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3696
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3712
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3728
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3744
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3760
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3776
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3792
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3808
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3824
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3840
+        image: "enforcerange.3.png"
+    }
+    Frame {
+        msec: 3856
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3872
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3888
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3904
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3920
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3936
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3952
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3968
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 3984
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 4000
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 4016
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Frame {
+        msec: 4032
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 105; y: 169
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4048
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 106; y: 168
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 106; y: 167
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4064
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 106; y: 164
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 106; y: 163
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4080
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 106; y: 162
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 106; y: 160
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4096
+        hash: "331164730fb7ccf37dc08ddc26c0e182"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 107; y: 157
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 107; y: 156
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4112
+        hash: "73e27ff972eefc421bc65897ad8b9a11"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 108; y: 152
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 109; y: 148
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4128
+        hash: "c5e903fd827f8f1ec060dcb9a925bf6d"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 109; y: 145
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 109; y: 145
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4144
+        hash: "74d4357dff4d6e00c5ae9ea0c34f1010"
+    }
+    Frame {
+        msec: 4160
+        hash: "790274ee21ba257b84671a6fb19c142f"
+    }
+    Frame {
+        msec: 4176
+        hash: "65ccc26f20be484fefa8ea25a7daf825"
+    }
+    Frame {
+        msec: 4192
+        hash: "e435e2fbba7f0f6a65b9fecf07893eb0"
+    }
+    Frame {
+        msec: 4208
+        hash: "6a994a18a9331731d5fca50dce2b9cff"
+    }
+    Frame {
+        msec: 4224
+        hash: "9fc4405cddc06310215969a4583b2353"
+    }
+    Frame {
+        msec: 4240
+        hash: "0d2b7130a84a8efac1cf4fe8a1768231"
+    }
+    Frame {
+        msec: 4256
+        hash: "791db15db47090e1af299e5b32e53918"
+    }
+    Frame {
+        msec: 4272
+        hash: "0ec6cf7a6ed9a073d2ce8f9e534e2ee5"
+    }
+    Frame {
+        msec: 4288
+        hash: "c7b358f51a9500ca4958d266de5307e6"
+    }
+    Frame {
+        msec: 4304
+        hash: "d24d00e4cd1ea3aaacf202e2fdf1eaa0"
+    }
+    Frame {
+        msec: 4320
+        hash: "169f1a7a933d84071c449132a3c2745e"
+    }
+    Frame {
+        msec: 4336
+        hash: "b6bf9c15ed40d6e862f693155c884035"
+    }
+    Frame {
+        msec: 4352
+        hash: "8639955aa7a03f54d50d7e9051a4b997"
+    }
+    Frame {
+        msec: 4368
+        hash: "411bc9a9aedbfb75f3122eaea6be0c16"
+    }
+    Frame {
+        msec: 4384
+        hash: "827094da86716daf69386af2c8d4027a"
+    }
+    Frame {
+        msec: 4400
+        hash: "ddddd5457e4a54ca5e7415dc2c7eabe5"
+    }
+    Frame {
+        msec: 4416
+        hash: "632a5756af20083504fb1faaa019dd48"
+    }
+    Frame {
+        msec: 4432
+        hash: "0cc2901b1b25412f13865887a8c9d13e"
+    }
+    Frame {
+        msec: 4448
+        hash: "4c8a9473eb9843634340d70f8eab9487"
+    }
+    Frame {
+        msec: 4464
+        hash: "398a238f59a2edf07870b624b914c81d"
+    }
+    Frame {
+        msec: 4480
+        hash: "a7c282235e9166b900ea2ff68800a5f5"
+    }
+    Frame {
+        msec: 4496
+        hash: "bae4fc0fc2d33008ebe827ece94af196"
+    }
+    Frame {
+        msec: 4512
+        hash: "45e0670a2b4c18b847a3c7870539b962"
+    }
+    Frame {
+        msec: 4528
+        hash: "8d474956331fdd0c35beb13a06b7c557"
+    }
+    Frame {
+        msec: 4544
+        hash: "5d5bdffc30d90fd5b061c6fcf24c2599"
+    }
+    Frame {
+        msec: 4560
+        hash: "15721b103981f5fe40b5dfe7d65c5b38"
+    }
+    Frame {
+        msec: 4576
+        hash: "940b70f15082ff138579892bb6f20ce9"
+    }
+    Frame {
+        msec: 4592
+        hash: "5137ea98fd291a4b967fb66d93253a37"
+    }
+    Frame {
+        msec: 4608
+        hash: "35ab744ce2a91567dbbd769f9486f870"
+    }
+    Frame {
+        msec: 4624
+        hash: "d5c55c00b07735e5d7c02dfa99ef2f45"
+    }
+    Frame {
+        msec: 4640
+        hash: "6b2d32b8f1df871c2c014af8b5d87329"
+    }
+    Frame {
+        msec: 4656
+        hash: "edf3b33b80cca53999779555f9cd6162"
+    }
+    Frame {
+        msec: 4672
+        hash: "180f3cc4ea5ff5b6f9e8be0294732d4e"
+    }
+    Frame {
+        msec: 4688
+        hash: "9b99a1b0c0bb0ce37655d92854ee4d19"
+    }
+    Frame {
+        msec: 4704
+        hash: "28e9ca60a873910380b2d22d6b3df565"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 109; y: 131
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4720
+        hash: "28e9ca60a873910380b2d22d6b3df565"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 109; y: 126
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 109; y: 124
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4736
+        hash: "18e53bf6337cf6590fc3c73c00469d8e"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 109; y: 115
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 109; y: 110
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4752
+        hash: "81110f17d191f9795a2c57d136e86550"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 108; y: 99
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 106; y: 85
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4768
+        hash: "b64810845a97bedf6fe11c043457c197"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 105; y: 74
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 103; y: 60
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4784
+        hash: "711274e9b6811b4662ac29d813574fb6"
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 102; y: 54
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 5
+        button: 0
+        buttons: 1
+        x: 100; y: 40
+        modifiers: 0
+        sendToViewport: true
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 100; y: 40
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 4800
+        image: "enforcerange.4.png"
+    }
+    Frame {
+        msec: 4816
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 4832
+        hash: "090a76cf068a5041ff993f21e6ebd087"
+    }
+    Frame {
+        msec: 4848
+        hash: "6b317b59e1b0f5b17a6d7d96e745f576"
+    }
+    Frame {
+        msec: 4864
+        hash: "744227adbdd31be2920a232ea0dbc85d"
+    }
+    Frame {
+        msec: 4880
+        hash: "674b07dc5b99bf2da93c40d42dc9023d"
+    }
+    Frame {
+        msec: 4896
+        hash: "b64810845a97bedf6fe11c043457c197"
+    }
+    Frame {
+        msec: 4912
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 4928
+        hash: "81110f17d191f9795a2c57d136e86550"
+    }
+    Frame {
+        msec: 4944
+        hash: "30eb157c89ad0aeb17fd0012afb9246b"
+    }
+    Frame {
+        msec: 4960
+        hash: "f9fc8467c6dbcb00d1f41a57b550193c"
+    }
+    Frame {
+        msec: 4976
+        hash: "711274e9b6811b4662ac29d813574fb6"
+    }
+    Frame {
+        msec: 4992
+        hash: "d4b370ff8c3b66fc8a616dd9b944abd1"
+    }
+    Frame {
+        msec: 5008
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 5024
+        hash: "87aaa82b96131fed8822e57e226162a0"
+    }
+    Frame {
+        msec: 5040
+        hash: "70b475e88060ead84d05f0ba1b47c139"
+    }
+    Frame {
+        msec: 5056
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 5072
+        hash: "81110f17d191f9795a2c57d136e86550"
+    }
+    Frame {
+        msec: 5088
+        hash: "30eb157c89ad0aeb17fd0012afb9246b"
+    }
+    Frame {
+        msec: 5104
+        hash: "6b317b59e1b0f5b17a6d7d96e745f576"
+    }
+    Frame {
+        msec: 5120
+        hash: "711274e9b6811b4662ac29d813574fb6"
+    }
+    Frame {
+        msec: 5136
+        hash: "744227adbdd31be2920a232ea0dbc85d"
+    }
+    Frame {
+        msec: 5152
+        hash: "674b07dc5b99bf2da93c40d42dc9023d"
+    }
+    Frame {
+        msec: 5168
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 5184
+        hash: "b64810845a97bedf6fe11c043457c197"
+    }
+    Frame {
+        msec: 5200
+        hash: "87aaa82b96131fed8822e57e226162a0"
+    }
+    Frame {
+        msec: 5216
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 5232
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 5248
+        hash: "81110f17d191f9795a2c57d136e86550"
+    }
+    Frame {
+        msec: 5264
+        hash: "090a76cf068a5041ff993f21e6ebd087"
+    }
+    Frame {
+        msec: 5280
+        hash: "30eb157c89ad0aeb17fd0012afb9246b"
+    }
+    Frame {
+        msec: 5296
+        hash: "6b317b59e1b0f5b17a6d7d96e745f576"
+    }
+    Frame {
+        msec: 5312
+        hash: "f9fc8467c6dbcb00d1f41a57b550193c"
+    }
+    Frame {
+        msec: 5328
+        hash: "744227adbdd31be2920a232ea0dbc85d"
+    }
+    Frame {
+        msec: 5344
+        hash: "d4b370ff8c3b66fc8a616dd9b944abd1"
+    }
+    Frame {
+        msec: 5360
+        hash: "674b07dc5b99bf2da93c40d42dc9023d"
+    }
+    Frame {
+        msec: 5376
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 5392
+        hash: "b64810845a97bedf6fe11c043457c197"
+    }
+    Frame {
+        msec: 5408
+        hash: "b64810845a97bedf6fe11c043457c197"
+    }
+    Frame {
+        msec: 5424
+        hash: "87aaa82b96131fed8822e57e226162a0"
+    }
+    Frame {
+        msec: 5440
+        hash: "70b475e88060ead84d05f0ba1b47c139"
+    }
+    Frame {
+        msec: 5456
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 5472
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 5488
+        hash: "81110f17d191f9795a2c57d136e86550"
+    }
+    Frame {
+        msec: 5504
+        hash: "090a76cf068a5041ff993f21e6ebd087"
+    }
+    Frame {
+        msec: 5520
+        hash: "090a76cf068a5041ff993f21e6ebd087"
+    }
+    Frame {
+        msec: 5536
+        hash: "30eb157c89ad0aeb17fd0012afb9246b"
+    }
+    Frame {
+        msec: 5552
+        hash: "6b317b59e1b0f5b17a6d7d96e745f576"
+    }
+    Frame {
+        msec: 5568
+        hash: "f9fc8467c6dbcb00d1f41a57b550193c"
+    }
+    Frame {
+        msec: 5584
+        hash: "f9fc8467c6dbcb00d1f41a57b550193c"
+    }
+    Frame {
+        msec: 5600
+        hash: "711274e9b6811b4662ac29d813574fb6"
+    }
+    Frame {
+        msec: 5616
+        hash: "744227adbdd31be2920a232ea0dbc85d"
+    }
+    Frame {
+        msec: 5632
+        hash: "744227adbdd31be2920a232ea0dbc85d"
+    }
+    Frame {
+        msec: 5648
+        hash: "d4b370ff8c3b66fc8a616dd9b944abd1"
+    }
+    Frame {
+        msec: 5664
+        hash: "d4b370ff8c3b66fc8a616dd9b944abd1"
+    }
+    Frame {
+        msec: 5680
+        hash: "674b07dc5b99bf2da93c40d42dc9023d"
+    }
+    Frame {
+        msec: 5696
+        hash: "674b07dc5b99bf2da93c40d42dc9023d"
+    }
+    Frame {
+        msec: 5712
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 5728
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 5744
+        hash: "b64810845a97bedf6fe11c043457c197"
+    }
+    Frame {
+        msec: 5760
+        image: "enforcerange.5.png"
+    }
+    Frame {
+        msec: 5776
+        hash: "87aaa82b96131fed8822e57e226162a0"
+    }
+    Frame {
+        msec: 5792
+        hash: "87aaa82b96131fed8822e57e226162a0"
+    }
+    Frame {
+        msec: 5808
+        hash: "87aaa82b96131fed8822e57e226162a0"
+    }
+    Frame {
+        msec: 5824
+        hash: "70b475e88060ead84d05f0ba1b47c139"
+    }
+    Frame {
+        msec: 5840
+        hash: "70b475e88060ead84d05f0ba1b47c139"
+    }
+    Frame {
+        msec: 5856
+        hash: "70b475e88060ead84d05f0ba1b47c139"
+    }
+    Frame {
+        msec: 5872
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 5888
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 5904
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 5920
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 5936
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 5952
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 5968
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 5984
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 6000
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 6016
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 6032
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 6048
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 6064
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 6080
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 6096
+        hash: "b061ee3784fbd4a287758ffd100a623e"
+    }
+    Frame {
+        msec: 6112
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 6128
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 6144
+        hash: "7eb75e8e83874d52448a7dbf6a0ad29c"
+    }
+    Frame {
+        msec: 6160
+        hash: "70b475e88060ead84d05f0ba1b47c139"
+    }
+    Frame {
+        msec: 6176
+        hash: "70b475e88060ead84d05f0ba1b47c139"
+    }
+    Frame {
+        msec: 6192
+        hash: "87aaa82b96131fed8822e57e226162a0"
+    }
+    Frame {
+        msec: 6208
+        hash: "87aaa82b96131fed8822e57e226162a0"
+    }
+    Frame {
+        msec: 6224
+        hash: "87aaa82b96131fed8822e57e226162a0"
+    }
+    Frame {
+        msec: 6240
+        hash: "b64810845a97bedf6fe11c043457c197"
+    }
+    Frame {
+        msec: 6256
+        hash: "b64810845a97bedf6fe11c043457c197"
+    }
+    Frame {
+        msec: 6272
+        hash: "b64810845a97bedf6fe11c043457c197"
+    }
+    Frame {
+        msec: 6288
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6304
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6320
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6336
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6352
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6368
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6384
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6400
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6416
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6432
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6448
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6464
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6480
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6496
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6512
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6528
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6544
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6560
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6576
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6592
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6608
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6624
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6640
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+    Frame {
+        msec: 6656
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/ListView/enforcerange.qml b/tests/auto/declarative/qmlvisual/ListView/enforcerange.qml
new file mode 100644
index 0000000..a796be7
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/ListView/enforcerange.qml
@@ -0,0 +1,31 @@
+import QtQuick 1.0
+
+Item {
+    id: document
+    width: 200; height: 200
+
+    ListView {
+        id: serviceListView
+        anchors.fill: parent
+        model: 100
+
+        preferredHighlightBegin: 90
+        preferredHighlightEnd: 90
+
+        highlightRangeMode: ListView.StrictlyEnforceRange
+
+        delegate: Component {
+            Item {
+                height: 15 + ((serviceListView.currentIndex == index) ? 20 : 0)
+                width: 200
+                Rectangle { width: 180; height: parent.height - 4; x: 10; y: 2; color: "red" }
+            }
+        }
+    }
+
+    Rectangle {
+        y: 90; width: 200; height: 35
+        border.color: "black"
+        color: "transparent"
+    }
+}
-- 
cgit v0.12


From 3cc9c5f2541f192733436c79c4d14aa34177c3cc Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Wed, 3 Nov 2010 16:38:20 +1000
Subject: highlightranges.qml example and visual test contained binding loop.
 Also, the currentIndex stayed -1 since the views all bound to each others
 currentIndex, which starts as -1.

Task-number: QTBUG-14794
Reviewed-by: Yann Bodson
---
 .../modelviews/listview/highlightranges.qml          | 20 +++++++++++---------
 .../auto/declarative/qmlvisual/ListView/listview.qml | 12 ++++++++----
 2 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/examples/declarative/modelviews/listview/highlightranges.qml b/examples/declarative/modelviews/listview/highlightranges.qml
index 2716ee5..58d37a3 100644
--- a/examples/declarative/modelviews/listview/highlightranges.qml
+++ b/examples/declarative/modelviews/listview/highlightranges.qml
@@ -42,15 +42,14 @@ import QtQuick 1.0
 import "content"
 
 Rectangle {
+    id: root
+    property int current: 0
     width: 600; height: 300
 
     // This example shows the same model in three different ListView items, 
     // with different highlight ranges. The highlight ranges are set by the 
     // preferredHighlightBegin and preferredHighlightEnd properties in ListView.
     //
-    // The second and third ListViews set their currentIndex to be the
-    // same as the first. The first ListView is given keyboard focus.
-    //
     // The first ListView does not set a highlight range, so its currentItem
     // can move freely within the visible area. If it moves outside the
     // visible area, the view is automatically scrolled to keep the current
@@ -66,9 +65,10 @@ Rectangle {
     // forces the current item to change when the view is flicked,
     // since the highlight is unable to move.
     //
-    // Note that the first ListView sets its currentIndex to be equal to
-    // the third ListView's currentIndex.  By flicking the third ListView with
-    // the mouse, the current index of the first ListView will be changed.
+    // All ListViews bind their currentIndex to the root.current property.
+    // The first ListView sets root.current whenever its currentIndex changes
+    // due to keyboard interaction.
+    // Flicking the third ListView with the mouse also changes root.current.
 
     ListView {
         id: list1
@@ -77,7 +77,8 @@ Rectangle {
         delegate: petDelegate
 
         highlight: Rectangle { color: "lightsteelblue" }
-        currentIndex: list3.currentIndex
+        currentIndex: root.current
+        onCurrentIndexChanged: root.current = currentIndex
         focus: true
     }
 
@@ -89,7 +90,7 @@ Rectangle {
         delegate: petDelegate
 
         highlight: Rectangle { color: "yellow" }
-        currentIndex: list1.currentIndex
+        currentIndex: root.current
         preferredHighlightBegin: 80; preferredHighlightEnd: 220
         highlightRangeMode: ListView.ApplyRange
     }
@@ -102,7 +103,8 @@ Rectangle {
         delegate: petDelegate
 
         highlight: Rectangle { color: "yellow" }
-        currentIndex: list1.currentIndex
+        currentIndex: root.current
+        onCurrentIndexChanged: root.current = currentIndex
         preferredHighlightBegin: 125; preferredHighlightEnd: 125
         highlightRangeMode: ListView.StrictlyEnforceRange
     }
diff --git a/tests/auto/declarative/qmlvisual/ListView/listview.qml b/tests/auto/declarative/qmlvisual/ListView/listview.qml
index 43c86a0..6171c75 100644
--- a/tests/auto/declarative/qmlvisual/ListView/listview.qml
+++ b/tests/auto/declarative/qmlvisual/ListView/listview.qml
@@ -1,7 +1,8 @@
 import QtQuick 1.0
 
 Rectangle {
-    property string skip: "Incorrect start: QTBUG-14794"
+    id: root
+    property int current: 0
     width: 600; height: 300; color: "white"
 
     ListModel {
@@ -57,7 +58,9 @@ Rectangle {
         id: list1
         width: 200; height: parent.height
         model: myModel; delegate: myDelegate
-        highlight: myHighlight; currentIndex: list3.currentIndex
+        highlight: myHighlight
+        currentIndex: root.current
+        onCurrentIndexChanged: root.current = currentIndex
         focus: true
     }
     ListView {
@@ -67,13 +70,14 @@ Rectangle {
         preferredHighlightBegin: 80
         preferredHighlightEnd: 220
         highlightRangeMode: "ApplyRange"
-        currentIndex: list1.currentIndex
+        currentIndex: root.current
     }
     ListView {
         id: list3
         x: 400; width: 200; height: parent.height
         model: myModel; delegate: myDelegate; highlight: myHighlight
-        currentIndex: list1.currentIndex
+        currentIndex: root.current
+        onCurrentIndexChanged: root.current = currentIndex
         preferredHighlightBegin: 125
         preferredHighlightEnd: 125
         highlightRangeMode: "StrictlyEnforceRange"
-- 
cgit v0.12


From acc1a2bd5520369c690c2769f067aec6bfd869f2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 3 Nov 2010 12:10:01 +0100
Subject: Fixed grabWidget sometimes returning uninitialized memory.

Use a QImage initialized with transparent to prevent any translucent
parts of the widget to end up as garbage, and to ensure that the
resulting QPixmap ends up with an alpha format only when needed.

Task-number: QTBUG-14945
Reviewed-by: Kim
---
 src/gui/image/qpixmap.cpp          | 5 +++--
 tests/auto/qpixmap/tst_qpixmap.cpp | 2 +-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp
index 64d8ed2..290c0f0 100644
--- a/src/gui/image/qpixmap.cpp
+++ b/src/gui/image/qpixmap.cpp
@@ -1101,10 +1101,11 @@ QPixmap QPixmap::grabWidget(QWidget * widget, const QRect &rect)
     if (!r.intersects(widget->rect()))
         return QPixmap();
 
-    QPixmap res(r.size());
+    QImage res(r.size(), QImage::Format_ARGB32_Premultiplied);
+    res.fill(0);
     widget->d_func()->render(&res, QPoint(), r, QWidget::DrawWindowBackground
                              | QWidget::DrawChildren | QWidget::IgnoreMask, true);
-    return res;
+    return QPixmap::fromImage(res);
 }
 
 /*!
diff --git a/tests/auto/qpixmap/tst_qpixmap.cpp b/tests/auto/qpixmap/tst_qpixmap.cpp
index fdf8311..a733d56 100644
--- a/tests/auto/qpixmap/tst_qpixmap.cpp
+++ b/tests/auto/qpixmap/tst_qpixmap.cpp
@@ -817,7 +817,7 @@ void tst_QPixmap::grabWidget()
     for (int row = 0; row < image.height(); ++row) {
         QRgb *line = reinterpret_cast<QRgb *>(image.scanLine(row));
         for (int col = 0; col < image.width(); ++col)
-            line[col] = qRgb(rand() & 255, row, col);
+            line[col] = qRgba(rand() & 255, row, col, 127);
     }
 
     QPalette pal = widget.palette();
-- 
cgit v0.12


From 75648ab9c4f64830aa36753686bec1a8f91d2f7e Mon Sep 17 00:00:00 2001
From: Sergio Ahumada <sergio.ahumada@nokia.com>
Date: Wed, 3 Nov 2010 13:04:04 +0100
Subject: Doc: Fixing typo

---
 src/plugins/graphicssystems/meego/dithering.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/plugins/graphicssystems/meego/dithering.cpp b/src/plugins/graphicssystems/meego/dithering.cpp
index 122c51e..1a2e3fa 100644
--- a/src/plugins/graphicssystems/meego/dithering.cpp
+++ b/src/plugins/graphicssystems/meego/dithering.cpp
@@ -76,7 +76,7 @@
 // Converts incoming RGB32 (QImage::Format_RGB32) to RGB565. Returns the newly allocated data.
 unsigned short* convertRGB32_to_RGB565(const unsigned char *in, int width, int height, int stride)
 {
-    // Output line stride. Alligned to 4 bytes.
+    // Output line stride. Aligned to 4 bytes.
     int alignedWidth = width;
     if (alignedWidth % 2 > 0)
         alignedWidth++;
@@ -191,7 +191,7 @@ unsigned short* convertRGB32_to_RGB565(const unsigned char *in, int width, int h
 // The output has each scan line aligned to 4 bytes (as expected by GL by default).
 unsigned short* convertARGB32_to_RGBA4444(const unsigned char *in, int width, int height, int stride)
 {
-    // Output line stride. Alligned to 4 bytes.
+    // Output line stride. Aligned to 4 bytes.
     int alignedWidth = width;
     if (alignedWidth % 2 > 0)
         alignedWidth++;
@@ -303,4 +303,4 @@ unsigned char* convertBGRA32_to_RGBA32(const unsigned char *in, int width, int h
     }
 
     return out;
-}
\ No newline at end of file
+}
-- 
cgit v0.12


From bee2335bbb3cbfe0e2d1184ca22835b0cf15fb7b Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Thu, 4 Nov 2010 11:05:14 +1000
Subject: Doc fix

The associated bug report is invalid, but this doc fix helps people
understand why (so that they never mistakenly file it again).

Task-number: QTBUG-14950
---
 doc/src/declarative/dynamicobjects.qdoc | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/doc/src/declarative/dynamicobjects.qdoc b/doc/src/declarative/dynamicobjects.qdoc
index 3921d3e..daf2ae1 100644
--- a/doc/src/declarative/dynamicobjects.qdoc
+++ b/doc/src/declarative/dynamicobjects.qdoc
@@ -173,7 +173,11 @@ component. Each instance runs a NumberAnimation, and when the animation has fini
 Alternatively, the \c application.qml could have destroyed the created object
 by calling \c object.destroy().
 
-Notice that if a \c SelfDestroyingRect instance was created statically like this:
+Note that it is safe to call destroy() on an object within that object. Objects are not destroyed the
+instant destroy() is called, but are cleaned up sometime between the end of that script block and the next frame
+(unless you specified a non-zero delay).
+
+Note also that if a \c SelfDestroyingRect instance was created statically like this:
 
 \qml
 Item {
-- 
cgit v0.12


From 59d4e2022095d8363cd5373a1a74f86a448c3542 Mon Sep 17 00:00:00 2001
From: Michael Brasser <michael.brasser@nokia.com>
Date: Thu, 4 Nov 2010 12:41:28 +1000
Subject: Add testcase for QTBUG-13719.

---
 .../data/ConstantsOverrideBindings.qml                    |  6 ++++++
 .../data/constantsOverrideBindings.4.qml                  | 11 +++++++++++
 .../qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp | 15 +++++++++++++++
 3 files changed, 32 insertions(+)
 create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.4.qml

diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/ConstantsOverrideBindings.qml b/tests/auto/declarative/qdeclarativeecmascript/data/ConstantsOverrideBindings.qml
index b4a702b..07bb16b 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/data/ConstantsOverrideBindings.qml
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/ConstantsOverrideBindings.qml
@@ -3,4 +3,10 @@ import Qt.test 1.0
 MyQmlObject {
     property int c1: 0
     property int c2: c1
+    property alias c3: inner.ic1
+
+    objectProperty: MyQmlObject {
+        id: inner
+        property int ic1: c1
+    }
 }
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.4.qml b/tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.4.qml
new file mode 100644
index 0000000..5a2091f
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.4.qml
@@ -0,0 +1,11 @@
+import Qt.test 1.0
+
+MyQmlObject {
+    property alias c1: myConstants.c1
+    property alias c3: myConstants.c3
+
+    objectProperty: ConstantsOverrideBindings { 
+        id: myConstants
+        c3: 10
+    }
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
index 72e2e10..3dd69da 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
+++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
@@ -733,6 +733,21 @@ void tst_qdeclarativeecmascript::constantsOverrideBindings()
         QCOMPARE(object->property("c2").toInt(), 13);
     }
 #endif
+
+    // Using an alias
+    {
+        QDeclarativeComponent component(&engine, TEST_FILE("constantsOverrideBindings.4.qml"));
+        MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
+        QVERIFY(object != 0);
+
+        QCOMPARE(object->property("c1").toInt(), 0);
+        QEXPECT_FAIL("", "QTBUG-13719", Continue);
+        QCOMPARE(object->property("c3").toInt(), 10);
+        object->setProperty("c1", QVariant(9));
+        QCOMPARE(object->property("c1").toInt(), 9);
+        QEXPECT_FAIL("", "QTBUG-13719", Continue);
+        QCOMPARE(object->property("c3").toInt(), 10);
+    }
 }
 
 /*
-- 
cgit v0.12


From f1344a817fdb3d263bd64f4440fedc73ad94ad31 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Thu, 4 Nov 2010 13:00:50 +1000
Subject: Don't emit xChanged()/yChanged() twice. Once from QGraphicsObject
 (QGraphicsItemPrivate::setPosHelper()) and once from
 QDeclarativeItem::geometryChanged().  Remove from geometryChanged().

Task-number: QTBUG-14942
Reviewed-by: Michael Brasser
---
 src/declarative/graphicsitems/qdeclarativeitem.cpp             |  4 ----
 .../auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp | 10 ++++++++++
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativeitem.cpp b/src/declarative/graphicsitems/qdeclarativeitem.cpp
index 95a4fd6..e0df751 100644
--- a/src/declarative/graphicsitems/qdeclarativeitem.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeitem.cpp
@@ -1955,12 +1955,8 @@ void QDeclarativeItem::geometryChanged(const QRectF &newGeometry,
             change.listener->itemGeometryChanged(this, newGeometry, oldGeometry);
     }
 
-    if (newGeometry.x() != oldGeometry.x())
-        emit xChanged();
     if (newGeometry.width() != oldGeometry.width())
         emit widthChanged();
-    if (newGeometry.y() != oldGeometry.y())
-        emit yChanged();
     if (newGeometry.height() != oldGeometry.height())
         emit heightChanged();
 }
diff --git a/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp b/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
index b4903ae..711bf00 100644
--- a/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
+++ b/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp
@@ -686,6 +686,8 @@ void tst_QDeclarativeItem::propertyChanges()
     QSignalSpy focusSpy(item, SIGNAL(focusChanged(bool)));
     QSignalSpy wantsFocusSpy(parentItem, SIGNAL(activeFocusChanged(bool)));
     QSignalSpy childrenChangedSpy(parentItem, SIGNAL(childrenChanged()));
+    QSignalSpy xSpy(item, SIGNAL(xChanged()));
+    QSignalSpy ySpy(item, SIGNAL(yChanged()));
 
     item->setParentItem(parentItem);
     item->setWidth(100.0);
@@ -731,6 +733,14 @@ void tst_QDeclarativeItem::propertyChanges()
     QCOMPARE(parentItem->hasFocus(), false);
     QCOMPARE(wantsFocusSpy.count(),0);
 
+    item->setX(10.0);
+    QCOMPARE(item->x(), 10.0);
+    QCOMPARE(xSpy.count(), 1);
+
+    item->setY(10.0);
+    QCOMPARE(item->y(), 10.0);
+    QCOMPARE(ySpy.count(), 1);
+
     delete canvas;
 }
 
-- 
cgit v0.12


From 80544a90d165736088b8286b738fd4e3033b1ade Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Thu, 4 Nov 2010 15:07:24 +1000
Subject: Fix regression in 648eb76c and update visual tests. Once fixup()
 begins, flick should not be recalculated.

Task-number: QTBUG-14821
Reviewed-by: Michael Brasser
---
 .../graphicsitems/qdeclarativelistview.cpp         |   1 +
 .../qmlvisual/ListView/data/enforcerange.qml       |  30 +-
 .../qmlvisual/ListView/data/itemlist.0.png         | Bin 976 -> 976 bytes
 .../qmlvisual/ListView/data/itemlist.1.png         | Bin 986 -> 986 bytes
 .../qmlvisual/ListView/data/itemlist.2.png         | Bin 977 -> 977 bytes
 .../qmlvisual/ListView/data/itemlist.3.png         | Bin 977 -> 977 bytes
 .../qmlvisual/ListView/data/itemlist.4.png         | Bin 977 -> 977 bytes
 .../qmlvisual/ListView/data/itemlist.5.png         | Bin 990 -> 990 bytes
 .../qmlvisual/ListView/data/itemlist.6.png         | Bin 976 -> 976 bytes
 .../qmlvisual/ListView/data/itemlist.qml           | 104 ++--
 .../qmlvisual/ListView/data/listview.0.png         | Bin 1580 -> 1585 bytes
 .../qmlvisual/ListView/data/listview.1.png         | Bin 1580 -> 1580 bytes
 .../qmlvisual/ListView/data/listview.2.png         | Bin 1661 -> 1667 bytes
 .../qmlvisual/ListView/data/listview.3.png         | Bin 1649 -> 1599 bytes
 .../qmlvisual/ListView/data/listview.4.png         | Bin 1669 -> 1663 bytes
 .../qmlvisual/ListView/data/listview.5.png         | Bin 1651 -> 1666 bytes
 .../qmlvisual/ListView/data/listview.qml           | 604 ++++++++++-----------
 17 files changed, 370 insertions(+), 369 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp
index eab66d8..94b1cb3 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp
@@ -1157,6 +1157,7 @@ void QDeclarativeListViewPrivate::fixup(AxisData &data, qreal minExtent, qreal m
         || (orient == QDeclarativeListView::Vertical && &data == &hData))
         return;
 
+    correctFlick = false;
     int oldDuration = fixupDuration;
     fixupDuration = moveReason == Mouse ? fixupDuration : 0;
 
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.qml b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.qml
index c15b657..20ed077 100644
--- a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.qml
+++ b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.qml
@@ -1074,7 +1074,7 @@ VisualTest {
     }
     Frame {
         msec: 3296
-        hash: "52831480eb69184341b12ffb09ace736"
+        hash: "58f2b900bc335424fc70eaaeb23ceb56"
     }
     Frame {
         msec: 3312
@@ -1082,59 +1082,59 @@ VisualTest {
     }
     Frame {
         msec: 3328
-        hash: "58f2b900bc335424fc70eaaeb23ceb56"
+        hash: "544275da3f7e2ccaedc8c521bf17f59b"
     }
     Frame {
         msec: 3344
-        hash: "544275da3f7e2ccaedc8c521bf17f59b"
+        hash: "df9fef370c2f6ff300b20fc24b5b9e34"
     }
     Frame {
         msec: 3360
-        hash: "df9fef370c2f6ff300b20fc24b5b9e34"
+        hash: "0662898d246e5ff6981610d32e2b8375"
     }
     Frame {
         msec: 3376
-        hash: "99cdc74eefc8c7c7df4650b373d8bc15"
+        hash: "6c04761cc86d28112c16f692cda58ba4"
     }
     Frame {
         msec: 3392
-        hash: "0662898d246e5ff6981610d32e2b8375"
+        hash: "82b31c8e8794ce3a9a6a635ef93b29b3"
     }
     Frame {
         msec: 3408
-        hash: "651b4c8b7a241263d48e645e603a55a3"
+        hash: "388658b5e03f3853e93173bd9501b77b"
     }
     Frame {
         msec: 3424
-        hash: "82b31c8e8794ce3a9a6a635ef93b29b3"
+        hash: "cf1856e961e6b8277a82c03ace5ba864"
     }
     Frame {
         msec: 3440
-        hash: "388658b5e03f3853e93173bd9501b77b"
+        hash: "e1d022cc1b41098baffe49925b20678f"
     }
     Frame {
         msec: 3456
-        hash: "cf1856e961e6b8277a82c03ace5ba864"
+        hash: "a63f8e6b194f900acb1b7a332f9fb9ae"
     }
     Frame {
         msec: 3472
-        hash: "e1d022cc1b41098baffe49925b20678f"
+        hash: "044c3712a6a5f6a973defe85643c8d02"
     }
     Frame {
         msec: 3488
-        hash: "ee55d155fa495f3a0da8c21ad56dfc61"
+        hash: "044c3712a6a5f6a973defe85643c8d02"
     }
     Frame {
         msec: 3504
-        hash: "044c3712a6a5f6a973defe85643c8d02"
+        hash: "e4fe2f1a81a4a4806f4155807f285a2d"
     }
     Frame {
         msec: 3520
-        hash: "e4fe2f1a81a4a4806f4155807f285a2d"
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
     }
     Frame {
         msec: 3536
-        hash: "e4fe2f1a81a4a4806f4155807f285a2d"
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
     }
     Frame {
         msec: 3552
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.0.png b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.0.png
index 75d2089..6a589c6 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.0.png and b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.1.png b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.1.png
index 578b7d1..a8957d6 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.1.png and b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.2.png b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.2.png
index def378f..fe2d28b 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.2.png and b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.3.png b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.3.png
index e23b903..0f20b07 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.3.png and b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.4.png b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.4.png
index def378f..fe2d28b 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.4.png and b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.5.png b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.5.png
index b81e713..0ab58c5 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.5.png and b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.5.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.6.png b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.6.png
index 75d2089..6a589c6 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.6.png and b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.6.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.qml b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.qml
index b23594b..6d09bc0 100644
--- a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.qml
+++ b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.qml
@@ -982,67 +982,67 @@ VisualTest {
     }
     Frame {
         msec: 3088
-        hash: "4b5368f0d86bffeb6bd31b58aec88650"
+        hash: "fd8e51cca3432f6edcf949857737095f"
     }
     Frame {
         msec: 3104
-        hash: "3f4c24f7ac89da982af22032309637fb"
+        hash: "aa5d4e65932b3ec2f5549079dfc7718d"
     }
     Frame {
         msec: 3120
-        hash: "8cacde33b70fc62b9b0c753091168b97"
+        hash: "f811f3c6b022730dd68ebd7b1659ea40"
     }
     Frame {
         msec: 3136
-        hash: "7b8c1bb2a3ab9ba23ac17dc5422adac8"
+        hash: "e51a2e41972cfc3df46a7d4375024d80"
     }
     Frame {
         msec: 3152
-        hash: "5aa34dccdd406b7e93dfdf756bbca5f0"
+        hash: "275f3594a0e2cc4b6717f9f336e7e1b6"
     }
     Frame {
         msec: 3168
-        hash: "4865c30dc45fbf5ca82047b77eca0912"
+        hash: "9229054bb70662b12a4f7e45ac5b7a90"
     }
     Frame {
         msec: 3184
-        hash: "1dcecc3a899b060a1469ef91e0d21765"
+        hash: "89ff346eca0b71cad3b04a2cb8064fb0"
     }
     Frame {
         msec: 3200
-        hash: "31422699bdbbbf827f7bb1f1ef78823e"
+        hash: "94e6ecb87a7efca6344d6d63a1e3829f"
     }
     Frame {
         msec: 3216
-        hash: "5859920a625ef94a644fda85d14e92fb"
+        hash: "bc5eb6b0eeae316ddd0b308da2cc32e2"
     }
     Frame {
         msec: 3232
-        hash: "37f1f7aaeaed28807f51fd9ad8c414ac"
+        hash: "240081760f0cf2f02be4d6d2600d2bbc"
     }
     Frame {
         msec: 3248
-        hash: "14592a6c86f211c20abab5cf34a406b4"
+        hash: "69b335aeb81fc2ae6173f2ec5cdc4c55"
     }
     Frame {
         msec: 3264
-        hash: "77c18ac7dfff2a4e516915e3e3df0717"
+        hash: "10d481e57cc8cd694500d9ed6ae1f8bb"
     }
     Frame {
         msec: 3280
-        hash: "f619097356671f6eb54d3b1c481e709d"
+        hash: "6b21f71d0bedef4bbcb445a13f61e7a3"
     }
     Frame {
         msec: 3296
-        hash: "7f19ea52e9e41a3b1bd90bb2a144d305"
+        hash: "aa94ebdbb4b8423aff28c95daff0baf5"
     }
     Frame {
         msec: 3312
-        hash: "17deb6b26fc9d27d5194995c102da4ac"
+        hash: "5f6708f615654c459f5749676fc09016"
     }
     Frame {
         msec: 3328
-        hash: "29c52328b54f02cc9042f676d710b9b2"
+        hash: "8ef246d322446e7f0848b99495f89e2b"
     }
     Frame {
         msec: 3344
@@ -1050,11 +1050,11 @@ VisualTest {
     }
     Frame {
         msec: 3360
-        hash: "40204fdb7a84b86f1380224908092354"
+        hash: "3b2e2d957585fb44a7165186a146892c"
     }
     Frame {
         msec: 3376
-        hash: "de7f3c83f37cc89c87009626c72e7642"
+        hash: "124da0099a7dd6fbf6dfd0ecfb09638c"
     }
     Frame {
         msec: 3392
@@ -1074,7 +1074,7 @@ VisualTest {
     }
     Frame {
         msec: 3456
-        hash: "b554512bac0766063870c5b3acb1d24f"
+        hash: "bb5ea2a238920a8486263bc7450edfb4"
     }
     Frame {
         msec: 3472
@@ -1082,7 +1082,7 @@ VisualTest {
     }
     Frame {
         msec: 3488
-        hash: "e4dacafba5ab5f8db53f08cef458cf42"
+        hash: "b554512bac0766063870c5b3acb1d24f"
     }
     Frame {
         msec: 3504
@@ -1094,23 +1094,23 @@ VisualTest {
     }
     Frame {
         msec: 3536
-        hash: "40204fdb7a84b86f1380224908092354"
+        hash: "124da0099a7dd6fbf6dfd0ecfb09638c"
     }
     Frame {
         msec: 3552
-        hash: "3b2e2d957585fb44a7165186a146892c"
+        hash: "40204fdb7a84b86f1380224908092354"
     }
     Frame {
         msec: 3568
-        hash: "c3b219bdd7710427d134402a8d3e6429"
+        hash: "ff93c3290b7d9a9743cc11d41a112a0a"
     }
     Frame {
         msec: 3584
-        hash: "8d424f37bb6af879129e57661d30a162"
+        hash: "c3b219bdd7710427d134402a8d3e6429"
     }
     Frame {
         msec: 3600
-        hash: "29c52328b54f02cc9042f676d710b9b2"
+        hash: "56e2f6b2ac103caf7ada3b56c19622c2"
     }
     Frame {
         msec: 3616
@@ -1118,15 +1118,15 @@ VisualTest {
     }
     Frame {
         msec: 3632
-        hash: "17deb6b26fc9d27d5194995c102da4ac"
+        hash: "8eb6d69d9833d0fbf87f951f489b71fe"
     }
     Frame {
         msec: 3648
-        hash: "5f6708f615654c459f5749676fc09016"
+        hash: "17deb6b26fc9d27d5194995c102da4ac"
     }
     Frame {
         msec: 3664
-        hash: "1734205ea5e7539b47d80c5a93ec74aa"
+        hash: "5f6708f615654c459f5749676fc09016"
     }
     Frame {
         msec: 3680
@@ -1134,7 +1134,7 @@ VisualTest {
     }
     Frame {
         msec: 3696
-        hash: "88143ff6c278a5433b314b551b7b8b1d"
+        hash: "1734205ea5e7539b47d80c5a93ec74aa"
     }
     Frame {
         msec: 3712
@@ -1722,7 +1722,7 @@ VisualTest {
     }
     Frame {
         msec: 5408
-        hash: "cf2acc805e9707327b01eb979f2b67a3"
+        hash: "06ce7db518da042e04dd3f79b7220974"
     }
     Frame {
         msec: 5424
@@ -1730,55 +1730,55 @@ VisualTest {
     }
     Frame {
         msec: 5440
-        hash: "a978890b419f9503e53d4d3f4f9b8c9b"
+        hash: "53e9d5a0098f2e91bbea45360b876607"
     }
     Frame {
         msec: 5456
-        hash: "73339b67e49210b4760b8e06fa4067b7"
+        hash: "22a6c7f3dcb5a36592909783b2466c8d"
     }
     Frame {
         msec: 5472
-        hash: "d09a245890e813c248050132a76465f3"
+        hash: "9d8da9199efebb95f56e5d4ebc9a585e"
     }
     Frame {
         msec: 5488
-        hash: "35b874b3b4d7d1e59852233fce192b0b"
+        hash: "c553400402f233a6246be4e544b433ae"
     }
     Frame {
         msec: 5504
-        hash: "4f80a0da1941e9c208036f22df93bed8"
+        hash: "c2e41a54c03340832db93f6f88393f00"
     }
     Frame {
         msec: 5520
-        hash: "7bbdc4ce95bc12e505f24cb8b137a0f1"
+        hash: "3622a619a99c939e96636a86c4428ba3"
     }
     Frame {
         msec: 5536
-        hash: "e68b5fb604a45d4e7ee21f6e06460b47"
+        hash: "e65d5e6c756e750e6d98096fe211465c"
     }
     Frame {
         msec: 5552
-        hash: "903059d468bed1ac8395e38a19c9dd38"
+        hash: "cabd6d30b1f4e42b38b73803aae6d5be"
     }
     Frame {
         msec: 5568
-        hash: "d7430ebf26f2de6f648471c19455cf0f"
+        hash: "68d443f16c16821ffc9ca68b17c76034"
     }
     Frame {
         msec: 5584
-        hash: "d5268cd58c222451d48038e715e83802"
+        hash: "a68b1bc6c2963ee92c3a45f500667b3b"
     }
     Frame {
         msec: 5600
-        hash: "99b4534b0bf58dc8e28c1118a5baec33"
+        hash: "805319ac7ca842feb3649e92f8b5b72f"
     }
     Frame {
         msec: 5616
-        hash: "ade5beb259b5277c333ca806fc9bdbec"
+        hash: "fd8d3f5688b1806998c6087e18c6c730"
     }
     Frame {
         msec: 5632
-        hash: "f34d2248999f5f51210064315d631f60"
+        hash: "b135c8c9975f4d45d2054cf31d0b1fe1"
     }
     Frame {
         msec: 5648
@@ -1786,7 +1786,7 @@ VisualTest {
     }
     Frame {
         msec: 5664
-        hash: "65af7a4a4aea5a983ea3fb9324e74256"
+        hash: "aa32e4c20c6a43c4ef7991a9418e57fe"
     }
     Frame {
         msec: 5680
@@ -1794,7 +1794,7 @@ VisualTest {
     }
     Frame {
         msec: 5696
-        hash: "2311ce1a83a43619ab7ce537a2b948e1"
+        hash: "127871a98123b7bd44f4c38f27cbc836"
     }
     Frame {
         msec: 5712
@@ -1826,15 +1826,15 @@ VisualTest {
     }
     Frame {
         msec: 5824
-        hash: "127871a98123b7bd44f4c38f27cbc836"
+        hash: "2311ce1a83a43619ab7ce537a2b948e1"
     }
     Frame {
         msec: 5840
-        hash: "b8db9180b4ad15fdbd25a4e974512f92"
+        hash: "127871a98123b7bd44f4c38f27cbc836"
     }
     Frame {
         msec: 5856
-        hash: "0974df6a7277bba11a3d3f400c68f4f1"
+        hash: "b8db9180b4ad15fdbd25a4e974512f92"
     }
     Frame {
         msec: 5872
@@ -1842,11 +1842,11 @@ VisualTest {
     }
     Frame {
         msec: 5888
-        hash: "b3e92eb4cfe548b92ac526066dfc7d23"
+        hash: "aa32e4c20c6a43c4ef7991a9418e57fe"
     }
     Frame {
         msec: 5904
-        hash: "40382f644935dc4e99353fa29c3e0b21"
+        hash: "b3e92eb4cfe548b92ac526066dfc7d23"
     }
     Frame {
         msec: 5920
@@ -1862,7 +1862,7 @@ VisualTest {
     }
     Frame {
         msec: 5968
-        hash: "b135c8c9975f4d45d2054cf31d0b1fe1"
+        hash: "f34d2248999f5f51210064315d631f60"
     }
     Frame {
         msec: 5984
@@ -1870,7 +1870,7 @@ VisualTest {
     }
     Frame {
         msec: 6000
-        hash: "bf47cc398a702dd17c8efebb3d2f8073"
+        hash: "b135c8c9975f4d45d2054cf31d0b1fe1"
     }
     Frame {
         msec: 6016
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.0.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.0.png
index 78c1c27..c7fa695 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/listview.0.png and b/tests/auto/declarative/qmlvisual/ListView/data/listview.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.1.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.1.png
index ecd1e01..b6c5e19 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/listview.1.png and b/tests/auto/declarative/qmlvisual/ListView/data/listview.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.2.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.2.png
index ba1733f..711c47a 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/listview.2.png and b/tests/auto/declarative/qmlvisual/ListView/data/listview.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.3.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.3.png
index 7a393d1..e56fae0 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/listview.3.png and b/tests/auto/declarative/qmlvisual/ListView/data/listview.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.4.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.4.png
index cb73ca9..0030842 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/listview.4.png and b/tests/auto/declarative/qmlvisual/ListView/data/listview.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.5.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.5.png
index cbbe6d7..2ec8177 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/listview.5.png and b/tests/auto/declarative/qmlvisual/ListView/data/listview.5.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.qml b/tests/auto/declarative/qmlvisual/ListView/data/listview.qml
index 1db722f..45f96e1 100644
--- a/tests/auto/declarative/qmlvisual/ListView/data/listview.qml
+++ b/tests/auto/declarative/qmlvisual/ListView/data/listview.qml
@@ -6,107 +6,107 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 32
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 48
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 64
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 80
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 96
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 112
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 128
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 144
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 160
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 176
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 192
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 208
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 224
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 240
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 256
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 272
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 288
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 304
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 320
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 336
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 352
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 368
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 384
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 400
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Frame {
         msec: 416
-        hash: "95c48087b681f0bcb09b2d7aad1a0299"
+        hash: "3b88645092be28037fca4a6034f5b2f7"
     }
     Key {
         type: 6
@@ -122,15 +122,15 @@ VisualTest {
     }
     Frame {
         msec: 448
-        hash: "3b88645092be28037fca4a6034f5b2f7"
+        hash: "435ac0668ad4d0e196eb040d385053cb"
     }
     Frame {
         msec: 464
-        hash: "3b88645092be28037fca4a6034f5b2f7"
+        hash: "e9532fe1acc1c27a2119e6dde3e01637"
     }
     Frame {
         msec: 480
-        hash: "3b88645092be28037fca4a6034f5b2f7"
+        hash: "9c757feaf5a8d1e88c659fca97e3b7b2"
     }
     Key {
         type: 7
@@ -142,35 +142,35 @@ VisualTest {
     }
     Frame {
         msec: 496
-        hash: "3b88645092be28037fca4a6034f5b2f7"
+        hash: "ccc7785a45a41615db01580835a4638e"
     }
     Frame {
         msec: 512
-        hash: "3b88645092be28037fca4a6034f5b2f7"
+        hash: "11ad92022bcd5d3fbd28ffb9f51c69eb"
     }
     Frame {
         msec: 528
-        hash: "3b88645092be28037fca4a6034f5b2f7"
+        hash: "a8a94e1f95216864c368b8c3d0ae682b"
     }
     Frame {
         msec: 544
-        hash: "3b88645092be28037fca4a6034f5b2f7"
+        hash: "d83e213d35e7fcff2580b4e197547f24"
     }
     Frame {
         msec: 560
-        hash: "3b88645092be28037fca4a6034f5b2f7"
+        hash: "9e5a57fabdc443e395cacbaf6e0c9bef"
     }
     Frame {
         msec: 576
-        hash: "3b88645092be28037fca4a6034f5b2f7"
+        hash: "9e5a57fabdc443e395cacbaf6e0c9bef"
     }
     Frame {
         msec: 592
-        hash: "3b88645092be28037fca4a6034f5b2f7"
+        hash: "9e5a57fabdc443e395cacbaf6e0c9bef"
     }
     Frame {
         msec: 608
-        hash: "3b88645092be28037fca4a6034f5b2f7"
+        hash: "9e5a57fabdc443e395cacbaf6e0c9bef"
     }
     Key {
         type: 6
@@ -182,27 +182,27 @@ VisualTest {
     }
     Frame {
         msec: 624
-        hash: "3b88645092be28037fca4a6034f5b2f7"
+        hash: "9e5a57fabdc443e395cacbaf6e0c9bef"
     }
     Frame {
         msec: 640
-        hash: "435ac0668ad4d0e196eb040d385053cb"
+        hash: "0e9c577fa86d9b3734da0d50040624e0"
     }
     Frame {
         msec: 656
-        hash: "e9532fe1acc1c27a2119e6dde3e01637"
+        hash: "834cf83f0f8d613191cac775b5737664"
     }
     Frame {
         msec: 672
-        hash: "9c757feaf5a8d1e88c659fca97e3b7b2"
+        hash: "495ea7650b2ae45f9afd7f9f6ecdd793"
     }
     Frame {
         msec: 688
-        hash: "ccc7785a45a41615db01580835a4638e"
+        hash: "55c761ccee6543bb3b9564bb813df58e"
     }
     Frame {
         msec: 704
-        hash: "11ad92022bcd5d3fbd28ffb9f51c69eb"
+        hash: "e29e5f86cb3b1fb5ec77fde696024812"
     }
     Key {
         type: 7
@@ -214,19 +214,19 @@ VisualTest {
     }
     Frame {
         msec: 720
-        hash: "a8a94e1f95216864c368b8c3d0ae682b"
+        hash: "f24b7d5a8f5ab03460505d6203269d1b"
     }
     Frame {
         msec: 736
-        hash: "d83e213d35e7fcff2580b4e197547f24"
+        hash: "893473965efe9e0540b197cbaa3f765d"
     }
     Frame {
         msec: 752
-        hash: "9e5a57fabdc443e395cacbaf6e0c9bef"
+        hash: "a541b7be2f370f948048b2101b037ab7"
     }
     Frame {
         msec: 768
-        hash: "9e5a57fabdc443e395cacbaf6e0c9bef"
+        hash: "a541b7be2f370f948048b2101b037ab7"
     }
     Key {
         type: 6
@@ -238,19 +238,19 @@ VisualTest {
     }
     Frame {
         msec: 784
-        hash: "0e9c577fa86d9b3734da0d50040624e0"
+        hash: "da065f1e72883a45241630b96ee5b1f8"
     }
     Frame {
         msec: 800
-        hash: "834cf83f0f8d613191cac775b5737664"
+        hash: "e97f78604c0c6d468c8dd225642e2ebd"
     }
     Frame {
         msec: 816
-        hash: "495ea7650b2ae45f9afd7f9f6ecdd793"
+        hash: "7b9d4b14eedfa4ff10dd7e3747c4a7f5"
     }
     Frame {
         msec: 832
-        hash: "55c761ccee6543bb3b9564bb813df58e"
+        hash: "6d55ba6287c720614854d36bb681a9f3"
     }
     Key {
         type: 7
@@ -262,27 +262,27 @@ VisualTest {
     }
     Frame {
         msec: 848
-        hash: "e29e5f86cb3b1fb5ec77fde696024812"
+        hash: "3e7a44811f59bfb81de2f4f884a7af17"
     }
     Frame {
         msec: 864
-        hash: "f24b7d5a8f5ab03460505d6203269d1b"
+        hash: "101113a7723b9d09275f66152b82142f"
     }
     Frame {
         msec: 880
-        hash: "893473965efe9e0540b197cbaa3f765d"
+        hash: "0044e068522f912630868476f8bf49f8"
     }
     Frame {
         msec: 896
-        hash: "a541b7be2f370f948048b2101b037ab7"
+        hash: "92065f9f170ee09abf67f0d0c7a1b6ba"
     }
     Frame {
         msec: 912
-        hash: "a541b7be2f370f948048b2101b037ab7"
+        hash: "92065f9f170ee09abf67f0d0c7a1b6ba"
     }
     Frame {
         msec: 928
-        hash: "a541b7be2f370f948048b2101b037ab7"
+        hash: "92065f9f170ee09abf67f0d0c7a1b6ba"
     }
     Key {
         type: 6
@@ -294,7 +294,7 @@ VisualTest {
     }
     Frame {
         msec: 944
-        hash: "a541b7be2f370f948048b2101b037ab7"
+        hash: "92065f9f170ee09abf67f0d0c7a1b6ba"
     }
     Frame {
         msec: 960
@@ -302,7 +302,7 @@ VisualTest {
     }
     Frame {
         msec: 976
-        hash: "e97f78604c0c6d468c8dd225642e2ebd"
+        hash: "e15814643bad6a71cb8c318ee5fd684a"
     }
     Key {
         type: 7
@@ -314,23 +314,23 @@ VisualTest {
     }
     Frame {
         msec: 992
-        hash: "7b9d4b14eedfa4ff10dd7e3747c4a7f5"
+        hash: "9b07b6861a97d0871ed89369ff7449da"
     }
     Frame {
         msec: 1008
-        hash: "6d55ba6287c720614854d36bb681a9f3"
+        hash: "7d95daf35c1823ea7187162b62010c57"
     }
     Frame {
         msec: 1024
-        hash: "3e7a44811f59bfb81de2f4f884a7af17"
+        hash: "cc1e70fd1235d50ca291580bef1d6fc4"
     }
     Frame {
         msec: 1040
-        hash: "101113a7723b9d09275f66152b82142f"
+        hash: "c8250f4cf69642e78523412b7b75501c"
     }
     Frame {
         msec: 1056
-        hash: "0044e068522f912630868476f8bf49f8"
+        hash: "c57e421c803e8bfa1a85409cbb858829"
     }
     Key {
         type: 6
@@ -342,19 +342,19 @@ VisualTest {
     }
     Frame {
         msec: 1072
-        hash: "4a50079d15b51758bf39b6d3fc51f337"
+        hash: "19b429a90d9877e62a7dee53ebf01fb2"
     }
     Frame {
         msec: 1088
-        hash: "df659ebf6a5926943de92d6838127b9c"
+        hash: "7c810f174bed3826016272515df2d525"
     }
     Frame {
         msec: 1104
-        hash: "0aa422c4af139023817465090f42f264"
+        hash: "9034cf480bda0d8b55aa6c43fc96b23d"
     }
     Frame {
         msec: 1120
-        hash: "fb598a01e5cd9e3655f86a47ff7bda0d"
+        hash: "f62697a1f4e4df2869c14462a0d514fd"
     }
     Key {
         type: 7
@@ -366,19 +366,19 @@ VisualTest {
     }
     Frame {
         msec: 1136
-        hash: "83a63dfcdbb27035d3e5208b066a2e1e"
+        hash: "c878f53b338d1ce332973193b0fa4b86"
     }
     Frame {
         msec: 1152
-        hash: "c8250f4cf69642e78523412b7b75501c"
+        hash: "5d26f27061b319c391961dc30d985593"
     }
     Frame {
         msec: 1168
-        hash: "c57e421c803e8bfa1a85409cbb858829"
+        hash: "e038ae877e8dddd3d99bf97475f59b3d"
     }
     Frame {
         msec: 1184
-        hash: "f7611692216c0519b9188924e8a6b92e"
+        hash: "f44adc5e46d320c62095e1285ca8848b"
     }
     Key {
         type: 6
@@ -390,15 +390,15 @@ VisualTest {
     }
     Frame {
         msec: 1200
-        hash: "0f9495c9f9f91c409f868959854824ed"
+        hash: "17f6b13e0556ac07dc527a9013a307a1"
     }
     Frame {
         msec: 1216
-        hash: "d4a752aa1c4112a3b60f40468932945d"
+        hash: "70a1cc3b6dd3be4e30bb6763344fb980"
     }
     Frame {
         msec: 1232
-        hash: "fbe2d7c160132f312911aabe4cad8bf5"
+        hash: "097c37d2243a27b8e800b5d4ec94b2e3"
     }
     Key {
         type: 7
@@ -410,27 +410,27 @@ VisualTest {
     }
     Frame {
         msec: 1248
-        hash: "2d3c7dc0d0efac613a32860968d166ac"
+        hash: "15839227c002b1c71eb516f6653a7531"
     }
     Frame {
         msec: 1264
-        hash: "fa0891d8c22dd26c1cb27d86864a8225"
+        hash: "f4a8103ef9010c651368d325fe9eee98"
     }
     Frame {
         msec: 1280
-        hash: "5d26f27061b319c391961dc30d985593"
+        hash: "d158ec1c83719c58c1d0a2e4cc90998f"
     }
     Frame {
         msec: 1296
-        hash: "e038ae877e8dddd3d99bf97475f59b3d"
+        hash: "6f66a44f5dc3fe150db2291b8cbc7327"
     }
     Frame {
         msec: 1312
-        hash: "f44adc5e46d320c62095e1285ca8848b"
+        hash: "8a016eac5befb215a157f7fe5bc743de"
     }
     Frame {
         msec: 1328
-        hash: "f44adc5e46d320c62095e1285ca8848b"
+        hash: "8a016eac5befb215a157f7fe5bc743de"
     }
     Key {
         type: 6
@@ -442,15 +442,15 @@ VisualTest {
     }
     Frame {
         msec: 1344
-        hash: "17f6b13e0556ac07dc527a9013a307a1"
+        hash: "807129a4c578b1a5f0d3d84686eb0553"
     }
     Frame {
         msec: 1360
-        hash: "70a1cc3b6dd3be4e30bb6763344fb980"
+        hash: "f9f2da990518048f0b050cc193567a20"
     }
     Frame {
         msec: 1376
-        hash: "097c37d2243a27b8e800b5d4ec94b2e3"
+        hash: "762de7b1f4e56df6d7a245a23446884b"
     }
     Key {
         type: 7
@@ -462,23 +462,23 @@ VisualTest {
     }
     Frame {
         msec: 1392
-        hash: "15839227c002b1c71eb516f6653a7531"
+        hash: "84ba7354badc3dca92974933c3610010"
     }
     Frame {
         msec: 1408
-        hash: "f4a8103ef9010c651368d325fe9eee98"
+        hash: "36c3018870d74cff638d00acd03a0cf0"
     }
     Frame {
         msec: 1424
-        hash: "d158ec1c83719c58c1d0a2e4cc90998f"
+        hash: "82b756a14eb0e802cd3e2d2d2a07f28e"
     }
     Frame {
         msec: 1440
-        hash: "6f66a44f5dc3fe150db2291b8cbc7327"
+        hash: "74af1c12613130dc53533fe1178d5534"
     }
     Frame {
         msec: 1456
-        hash: "8a016eac5befb215a157f7fe5bc743de"
+        hash: "c32818b0ba24f11295580d1ccffffdc0"
     }
     Key {
         type: 6
@@ -490,19 +490,19 @@ VisualTest {
     }
     Frame {
         msec: 1472
-        hash: "807129a4c578b1a5f0d3d84686eb0553"
+        hash: "b858be109fac6852234bf1db161e515b"
     }
     Frame {
         msec: 1488
-        hash: "f9f2da990518048f0b050cc193567a20"
+        hash: "9b3f8cffd3e79241d8a3b1f7d80790db"
     }
     Frame {
         msec: 1504
-        hash: "762de7b1f4e56df6d7a245a23446884b"
+        hash: "840dc72aabc4a9b28bae641354676324"
     }
     Frame {
         msec: 1520
-        hash: "84ba7354badc3dca92974933c3610010"
+        hash: "c60bfd5cc8b26a841035db29baba5dab"
     }
     Key {
         type: 7
@@ -514,23 +514,23 @@ VisualTest {
     }
     Frame {
         msec: 1536
-        hash: "36c3018870d74cff638d00acd03a0cf0"
+        hash: "88d80dc8b0d968aa718ff464e507f53b"
     }
     Frame {
         msec: 1552
-        hash: "82b756a14eb0e802cd3e2d2d2a07f28e"
+        hash: "f7ffc82d3448c415b4997401fb61b96b"
     }
     Frame {
         msec: 1568
-        hash: "74af1c12613130dc53533fe1178d5534"
+        hash: "df8e9a09752fe2b2eff9184ba8e88ef1"
     }
     Frame {
         msec: 1584
-        hash: "c32818b0ba24f11295580d1ccffffdc0"
+        hash: "97330e949a609f5f33832dd17e0c3716"
     }
     Frame {
         msec: 1600
-        hash: "c32818b0ba24f11295580d1ccffffdc0"
+        hash: "97330e949a609f5f33832dd17e0c3716"
     }
     Key {
         type: 6
@@ -542,15 +542,15 @@ VisualTest {
     }
     Frame {
         msec: 1616
-        hash: "b858be109fac6852234bf1db161e515b"
+        hash: "97330e949a609f5f33832dd17e0c3716"
     }
     Frame {
         msec: 1632
-        hash: "9b3f8cffd3e79241d8a3b1f7d80790db"
+        hash: "97330e949a609f5f33832dd17e0c3716"
     }
     Frame {
         msec: 1648
-        hash: "840dc72aabc4a9b28bae641354676324"
+        hash: "97330e949a609f5f33832dd17e0c3716"
     }
     Key {
         type: 7
@@ -562,19 +562,19 @@ VisualTest {
     }
     Frame {
         msec: 1664
-        hash: "c60bfd5cc8b26a841035db29baba5dab"
+        hash: "97330e949a609f5f33832dd17e0c3716"
     }
     Frame {
         msec: 1680
-        hash: "88d80dc8b0d968aa718ff464e507f53b"
+        hash: "97330e949a609f5f33832dd17e0c3716"
     }
     Frame {
         msec: 1696
-        hash: "f7ffc82d3448c415b4997401fb61b96b"
+        hash: "97330e949a609f5f33832dd17e0c3716"
     }
     Frame {
         msec: 1712
-        hash: "df8e9a09752fe2b2eff9184ba8e88ef1"
+        hash: "97330e949a609f5f33832dd17e0c3716"
     }
     Frame {
         msec: 1728
@@ -966,71 +966,71 @@ VisualTest {
     }
     Frame {
         msec: 2608
-        hash: "85c0127315a489cfcf14ec7e16e43f4c"
+        hash: "68f3366932fed9156bf68dce6660b2a8"
     }
     Frame {
         msec: 2624
-        hash: "65f1be6c38fa9e024671bfe612c585b4"
+        hash: "9f4be0b58c46035a11c5b80ec60618d5"
     }
     Frame {
         msec: 2640
-        hash: "74b7b60a048d37c38f179d071e9d9730"
+        hash: "6d38a4eaa2a41c57599cca381957ec4c"
     }
     Frame {
         msec: 2656
-        hash: "13c96d066af31d75647b0be21f1ae68d"
+        hash: "1061db26c9080067bf121eb1d164a3f3"
     }
     Frame {
         msec: 2672
-        hash: "a1f880a95596f6c82385e51a4853327e"
+        hash: "c78d271711dc8f13fb48b41871249141"
     }
     Frame {
         msec: 2688
-        hash: "8596123a6b0f234d90869d823448ff8e"
+        hash: "c5825611f6c429fddd8c20495507ea5f"
     }
     Frame {
         msec: 2704
-        hash: "1ca65b63eea4034e3889f53c86ac95b7"
+        hash: "9888b608bcf80496a3fe8848be4e3629"
     }
     Frame {
         msec: 2720
-        hash: "b847b515d89ad0394ef0fd4954158940"
+        hash: "9995d6ba039045d94903d5095b018ca8"
     }
     Frame {
         msec: 2736
-        hash: "f73f7747115fdda2f0a13734a0dc9446"
+        hash: "f8ea705b4710b3ffb11c2fe08ccccda2"
     }
     Frame {
         msec: 2752
-        hash: "5b31a1aca62cf654428e4d7fc25208b6"
+        hash: "7354c2fcabdede9fb1ee823ce098da3b"
     }
     Frame {
         msec: 2768
-        hash: "f797d3c0364515138059967e17e185ed"
+        hash: "0d6beff960fa26771f09748356accedb"
     }
     Frame {
         msec: 2784
-        hash: "dff0266adf50e30bc2a7674b001d19dc"
+        hash: "0720a8a1ed85344a1de6682b3aefd502"
     }
     Frame {
         msec: 2800
-        hash: "610c72005c1aa83306fecc9ca34bf5a4"
+        hash: "0245488740e13dbfc836b587b2bdf917"
     }
     Frame {
         msec: 2816
-        hash: "542587ab3dff0cfb3f724096871e925a"
+        hash: "25c4fcdd85017d18df7e83c15f1accbc"
     }
     Frame {
         msec: 2832
-        hash: "fd79c9159a77b1be25d9cfde2e6cecb6"
+        hash: "51192ae0eae814f3dead9d949e2e4676"
     }
     Frame {
         msec: 2848
-        hash: "e3d4bb451d6210e6006c54178d406068"
+        hash: "ddbe6b273882c6018c01e0a4480b1adb"
     }
     Frame {
         msec: 2864
-        hash: "3dd3c57049bddb206c0204d7fbf673b0"
+        hash: "bb840a0677114b67d9b08589e8a8192b"
     }
     Frame {
         msec: 2880
@@ -1038,15 +1038,15 @@ VisualTest {
     }
     Frame {
         msec: 2896
-        hash: "44008e30de01ecb1893a0fe4b06ec63a"
+        hash: "6ceadf740293537c7b9f2e2cfe8e6f1e"
     }
     Frame {
         msec: 2912
-        hash: "c593c7e7edab1a034b96f778259b5b91"
+        hash: "f5c99d06e0b3055374ee4c6bf3e634f4"
     }
     Frame {
         msec: 2928
-        hash: "9ac483cb720fef5783abd4e0072cf71e"
+        hash: "18fe01fadf4c5acbd369f4450db1efa6"
     }
     Frame {
         msec: 2944
@@ -1186,63 +1186,63 @@ VisualTest {
     }
     Frame {
         msec: 3232
-        hash: "45bacd56ecaeefd9c80c7bd77e79cff0"
+        hash: "0e1f352c163ad8fe852c2e4857881d2f"
     }
     Frame {
         msec: 3248
-        hash: "ad5239583e3924c98358e0ec7d12fd39"
+        hash: "3c3b44481a6c2330a4a03076e35055f4"
     }
     Frame {
         msec: 3264
-        hash: "8e0fbae41165c553af4a49ed5691dfbb"
+        hash: "6ea3210a929774aea84a7beb4a784842"
     }
     Frame {
         msec: 3280
-        hash: "c697930f45e23628c83a248de44472fb"
+        hash: "74dd747f9a64b19e5c5230c90ad3b642"
     }
     Frame {
         msec: 3296
-        hash: "840e1f8ba5fe6e42d6dc41c1e42dc3dc"
+        hash: "c02be4ebefd19f4c5e864e8bbab7c13e"
     }
     Frame {
         msec: 3312
-        hash: "e071cd254b69da678997eeb7ac0a13f8"
+        hash: "ce661af9085c833ec7d1fd66ebe67649"
     }
     Frame {
         msec: 3328
-        hash: "27954d55c9772aa0ba237e7bdff75517"
+        hash: "4bf921874cfdc1b7d14e3a110b9e70a1"
     }
     Frame {
         msec: 3344
-        hash: "5879feff61f02a9322b8620c84be4462"
+        hash: "f3e9cf8ac9e109e88d8c426fdcee28a9"
     }
     Frame {
         msec: 3360
-        hash: "feba016bdcdc3f59b70000375a5b4242"
+        hash: "aa718a37f7ccf655d176adb799b5ddfb"
     }
     Frame {
         msec: 3376
-        hash: "e57ae7048209884fb024481318c88080"
+        hash: "aa114a9676af508b4a106b21f7a2ed10"
     }
     Frame {
         msec: 3392
-        hash: "93707dc8ec5e02adb691d0c6f3ff7772"
+        hash: "a5bbbaebb61b83384f5be82a9c3181ba"
     }
     Frame {
         msec: 3408
-        hash: "ab2d8b822a4e2cd7c6a9cfa2e81d2113"
+        hash: "83deebf650b192de7c8a764d5379eeb4"
     }
     Frame {
         msec: 3424
-        hash: "a9d0e39b30b16eafec85e08a75e2b50f"
+        hash: "5b433e1f5b97b39b6e86c837f0b91f2b"
     }
     Frame {
         msec: 3440
-        hash: "8c94d16c8cde9b3d0ac8ccfb1374387d"
+        hash: "b5236be4e416f89a91eda7afbd75fc63"
     }
     Frame {
         msec: 3456
-        hash: "7f4873f6c773b3d2d814bb1ea5c5dec6"
+        hash: "1713477f5484a1b35686f2f4bff27612"
     }
     Frame {
         msec: 3472
@@ -1254,63 +1254,63 @@ VisualTest {
     }
     Frame {
         msec: 3504
-        hash: "042adc29907ca50187d4aad772a7500d"
+        hash: "7f64804cd07a0ae63d0e3a1b9f8f8a84"
     }
     Frame {
         msec: 3520
-        hash: "90accd1b4f5bbe5cc59f3a73d697ea18"
+        hash: "9ae6bc952da97239bfee88633637aeb7"
     }
     Frame {
         msec: 3536
-        hash: "3ce26e9c0b2ee1b4cb3dc19bbac92736"
+        hash: "ba34cd0d57d5d027ad6c2de102676399"
     }
     Frame {
         msec: 3552
-        hash: "ca976ad1590e156e155cdba452dbc0ce"
+        hash: "c49632f9369aa901fcb702e76295c1e8"
     }
     Frame {
         msec: 3568
-        hash: "b342477cedfb2a3839aa145703f33cb4"
+        hash: "3adab59e06a635a033564dfc8edc4877"
     }
     Frame {
         msec: 3584
-        hash: "8fccdb3fbf637426b8b3df088a5a24a5"
+        hash: "67643cbfb3c9864b7447a9a8e316b251"
     }
     Frame {
         msec: 3600
-        hash: "973c8d2d2496c5cc871aecc0b6be0bbb"
+        hash: "d04d288cbf89e1ad3bbf25ffebd7a382"
     }
     Frame {
         msec: 3616
-        hash: "6af9574467c7b565450dc6533dddb0f2"
+        hash: "e6c4d34b9b3de464ec0dcf8719b86313"
     }
     Frame {
         msec: 3632
-        hash: "ced3d8a93bf564c0ebec837f1655c202"
+        hash: "f73462d0fe19cbbd771f9f78d7bc4384"
     }
     Frame {
         msec: 3648
-        hash: "0a38fe8ac9024b4a30b8efbcf155bbd8"
+        hash: "6369f075a492240aee36eae8dcb2ace5"
     }
     Frame {
         msec: 3664
-        hash: "2421dc73fe95e8abb246ae894ac255b2"
+        hash: "1e9424a3b93833f8ae855c5f7877679a"
     }
     Frame {
         msec: 3680
-        hash: "98789298fcc85a0b3307036c800d80af"
+        hash: "da274c1ae57d217ef4515326d32646b4"
     }
     Frame {
         msec: 3696
-        hash: "6361b512cfd9aa5f97529089ad7d902c"
+        hash: "1cbe684ba95e6ef635873f746e942f3d"
     }
     Frame {
         msec: 3712
-        hash: "5f26400f45140d634ac49ae5ce6bc2cf"
+        hash: "228e13c1d3dea6e666637de7cedd6dd4"
     }
     Frame {
         msec: 3728
-        hash: "49586dcf6a4c7a80563e9cc67b16a520"
+        hash: "a3f8fec49fb88652e9339b621ea8b972"
     }
     Mouse {
         type: 2
@@ -1322,7 +1322,7 @@ VisualTest {
     }
     Frame {
         msec: 3744
-        hash: "fa8827f2a5eefaa9f740e36e4eb05083"
+        hash: "7c3eb16bf4f66d2b9889c9d80aaae8b2"
     }
     Mouse {
         type: 5
@@ -1334,7 +1334,7 @@ VisualTest {
     }
     Frame {
         msec: 3760
-        hash: "5f2e33f8b436686840a124ba71f7d203"
+        hash: "1825d33eb9ae94a63d334d93e07ce9af"
     }
     Mouse {
         type: 5
@@ -1346,7 +1346,7 @@ VisualTest {
     }
     Frame {
         msec: 3776
-        hash: "b0093a1f538381e79f43c91192437be5"
+        hash: "306652a5a179cf23ee87c10571814f53"
     }
     Mouse {
         type: 5
@@ -1358,7 +1358,7 @@ VisualTest {
     }
     Frame {
         msec: 3792
-        hash: "9a8e645817c214a0353beadc0bc2e3f8"
+        hash: "3d3ba7cd968a1f91f7534cabd7cc034b"
     }
     Mouse {
         type: 5
@@ -1370,7 +1370,7 @@ VisualTest {
     }
     Frame {
         msec: 3808
-        hash: "3f059fefcb7908e6f89a4b245bd0c948"
+        hash: "862f70151938a5d27db37a9f5dd53faa"
     }
     Mouse {
         type: 5
@@ -1382,7 +1382,7 @@ VisualTest {
     }
     Frame {
         msec: 3824
-        hash: "48ccbb037ebe01dc9c73fafa54aa6175"
+        hash: "92b9283fa8b5642ce9bd14d875a12b75"
     }
     Mouse {
         type: 5
@@ -1406,7 +1406,7 @@ VisualTest {
     }
     Frame {
         msec: 3856
-        hash: "3398c59636fc02358fc0b22d7bc2afd3"
+        hash: "58e61d0a4f397c5a2b137d6a6e85d99b"
     }
     Mouse {
         type: 5
@@ -1418,7 +1418,7 @@ VisualTest {
     }
     Frame {
         msec: 3872
-        hash: "86ebc9911fc2da29a1960ae3999e4329"
+        hash: "6cdd764ee39789307e5e313bfbbb7765"
     }
     Mouse {
         type: 5
@@ -1438,83 +1438,83 @@ VisualTest {
     }
     Frame {
         msec: 3888
-        hash: "7e910c843f531af6d08a0c7ea890c823"
+        hash: "a88656d49e4636b18c4f6f4a0ab943d6"
     }
     Frame {
         msec: 3904
-        hash: "7e92be7beeba33541e16305d5cb7b3b6"
+        hash: "f1ec9a65d5f8d2020db1b70bcd419417"
     }
     Frame {
         msec: 3920
-        hash: "1e7caa1bb4627bea028cdd2ef2260d9f"
+        hash: "ca7d3d7d26445d13acd7fe4a2c5d1d4d"
     }
     Frame {
         msec: 3936
-        hash: "a7d77ec36935d8d8c8a6120d373d714c"
+        hash: "90016f51541a15ba4b6265f6843a2998"
     }
     Frame {
         msec: 3952
-        hash: "770e16a5c7bf17522445bdae41d170df"
+        hash: "bdb992552a5c5707ddb372631f72e6a3"
     }
     Frame {
         msec: 3968
-        hash: "d5c93bb61aeef777bb91dd504e91ecf6"
+        hash: "af69ed47f0f40648d55af10c87866805"
     }
     Frame {
         msec: 3984
-        hash: "2247494cb67e7f0cade508b6ef46cb3e"
+        hash: "33e77562bdf839ca1e969b918d90a07b"
     }
     Frame {
         msec: 4000
-        hash: "61a480c3a29f37b4383b430b02eb5dc1"
+        hash: "2001b5ca444808a79c49adc9d03c960e"
     }
     Frame {
         msec: 4016
-        hash: "f741ede20b0ad51f81c7aba44705a08e"
+        hash: "e4186283e5fe0c1efb29eca6f59e9079"
     }
     Frame {
         msec: 4032
-        hash: "73bb52725e3906ac3074371936e9f3f3"
+        hash: "dab82d0bbba66df3297712b42f74f25a"
     }
     Frame {
         msec: 4048
-        hash: "a915081e3c6ca9397567cb3df2aed517"
+        hash: "b180ad3acdfd736276ef4d1de040bb55"
     }
     Frame {
         msec: 4064
-        hash: "79b514577bcc36db6de4db2e8b284a4c"
+        hash: "577445b0e4d6f8079830c2b87ce5829d"
     }
     Frame {
         msec: 4080
-        hash: "5412571baa69b8e0c3b4daf52796482a"
+        hash: "45fffe51376abef4cb28842b392ab0b7"
     }
     Frame {
         msec: 4096
-        hash: "7f739333fdc9c3457461e7fcf49bf650"
+        hash: "fc14e3b2d16e1f078d223876ef71c81e"
     }
     Frame {
         msec: 4112
-        hash: "ed9a9fdd4bea6e9f7f7078934337b4a6"
+        hash: "4ef2b65280a00a6a4e66185f41479aef"
     }
     Frame {
         msec: 4128
-        hash: "4fbc687f1a5b4364a90441134162c817"
+        hash: "131181ce7ff2f4d4e69823fcb7a20755"
     }
     Frame {
         msec: 4144
-        hash: "7c91ad050f31e30b7f16b99dd1ed19df"
+        hash: "8e6db058e96dad9c4963b881083ab9bf"
     }
     Frame {
         msec: 4160
-        hash: "44777e9a08d5f112b922272227b22558"
+        hash: "e2d407b6dff40625790d4fd9e599b374"
     }
     Frame {
         msec: 4176
-        hash: "c4f7523d0a214e188c95d7cbd4455a9d"
+        hash: "631fe708fdcb1e4f4ea89b10da5db623"
     }
     Frame {
         msec: 4192
-        hash: "7703b85f0bda71fa8ff84a557b015458"
+        hash: "e11831f37a3a1da78cbdc7604ddccd68"
     }
     Mouse {
         type: 2
@@ -1526,7 +1526,7 @@ VisualTest {
     }
     Frame {
         msec: 4208
-        hash: "0bd445389e69d1d758a9b17eee69d584"
+        hash: "c2dccc4e890b2302edd413dcdb87b50b"
     }
     Mouse {
         type: 5
@@ -1538,7 +1538,7 @@ VisualTest {
     }
     Frame {
         msec: 4224
-        hash: "13bfb19a05b5aef65f7f70b2c0b01424"
+        hash: "b4f6a6650dd779c8ad8696c23f44411a"
     }
     Mouse {
         type: 5
@@ -1550,7 +1550,7 @@ VisualTest {
     }
     Frame {
         msec: 4240
-        hash: "9d6a81d6f7df8aa93c9421fa3cdc3a7d"
+        hash: "ad913e53e63c030ffdf4560766722760"
     }
     Mouse {
         type: 5
@@ -1570,7 +1570,7 @@ VisualTest {
     }
     Frame {
         msec: 4256
-        hash: "4d88acb157fdeb0c608b6c9d75e999e8"
+        hash: "ef31f8a4d5bde5a2e308d19ee6d5e759"
     }
     Mouse {
         type: 5
@@ -1582,7 +1582,7 @@ VisualTest {
     }
     Frame {
         msec: 4272
-        hash: "fe506e31923e1feb2d2b3c105444f61f"
+        hash: "3ba07527f66e8bea5a8fb7647b0b4f3f"
     }
     Mouse {
         type: 5
@@ -1594,7 +1594,7 @@ VisualTest {
     }
     Frame {
         msec: 4288
-        hash: "72c0ccbbf296742f67139bd9a4abcf6b"
+        hash: "70e5fe656f5fd843383964825690b678"
     }
     Mouse {
         type: 5
@@ -1614,7 +1614,7 @@ VisualTest {
     }
     Frame {
         msec: 4304
-        hash: "75b083e391afb3cdb8e4bcd885f17966"
+        hash: "b7d8738be4cd6caa63dbecdb0f810a2f"
     }
     Mouse {
         type: 5
@@ -1626,7 +1626,7 @@ VisualTest {
     }
     Frame {
         msec: 4320
-        hash: "2babcf0e4d434120e0a7eb7d8716baa7"
+        hash: "d6312191f9d7bbddc07f9253d8a93469"
     }
     Mouse {
         type: 5
@@ -1638,7 +1638,7 @@ VisualTest {
     }
     Frame {
         msec: 4336
-        hash: "676e6a7587781146f58f82ca1ceac2b3"
+        hash: "b182da64886cf4f444296e5fde26701e"
     }
     Mouse {
         type: 5
@@ -1650,7 +1650,7 @@ VisualTest {
     }
     Frame {
         msec: 4352
-        hash: "58ecd6234c3c0f7ceec942098e3ae0fc"
+        hash: "ebefef14b6fb990e0c6900884528bbd3"
     }
     Mouse {
         type: 5
@@ -1662,7 +1662,7 @@ VisualTest {
     }
     Frame {
         msec: 4368
-        hash: "25a8af71ba1cf4581682cbec3b9baf8a"
+        hash: "9a3451ed091b1bb6b975a9c5506b1ea4"
     }
     Mouse {
         type: 5
@@ -1674,7 +1674,7 @@ VisualTest {
     }
     Frame {
         msec: 4384
-        hash: "11c305643f2ed535a6dc0a7a54caf17c"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Mouse {
         type: 5
@@ -1686,7 +1686,7 @@ VisualTest {
     }
     Frame {
         msec: 4400
-        hash: "29b33349f90286b2c078ae8d5896a338"
+        hash: "eaaf9ea1d7fcf4a2a9dd58b1b5bb3cae"
     }
     Mouse {
         type: 5
@@ -1698,7 +1698,7 @@ VisualTest {
     }
     Frame {
         msec: 4416
-        hash: "af917864d02b49bef4190ee1fca607dc"
+        hash: "7ca8e3d76cf913d85f84f0b96acde829"
     }
     Mouse {
         type: 5
@@ -1710,7 +1710,7 @@ VisualTest {
     }
     Frame {
         msec: 4432
-        hash: "7b1af6cddd2f78615354f747dfd016b9"
+        hash: "7cfef56b24a552c6d4ecb3d0b88a1d08"
     }
     Mouse {
         type: 5
@@ -1730,7 +1730,7 @@ VisualTest {
     }
     Frame {
         msec: 4448
-        hash: "84f1757af8c26b4f00298090e09f7f68"
+        hash: "d032b257259810b4fe514c63ca5c9e4b"
     }
     Mouse {
         type: 5
@@ -1742,7 +1742,7 @@ VisualTest {
     }
     Frame {
         msec: 4464
-        hash: "fd214ddbd1f60dc733994ba7a2048951"
+        hash: "568f6a57e6f1644b0dc245d03a1d7b85"
     }
     Mouse {
         type: 5
@@ -1754,83 +1754,83 @@ VisualTest {
     }
     Frame {
         msec: 4480
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4496
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4512
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4528
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4544
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4560
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4576
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4592
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4608
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4624
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4640
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4656
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4672
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4688
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4704
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4720
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4736
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4752
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4768
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4784
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4800
@@ -1838,15 +1838,15 @@ VisualTest {
     }
     Frame {
         msec: 4816
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4832
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4848
-        hash: "01f209a3b5e9adaa32ad55c7d1f1d4c7"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Mouse {
         type: 5
@@ -1866,7 +1866,7 @@ VisualTest {
     }
     Frame {
         msec: 4864
-        hash: "1dc57bc129f3a6d5287ec0fa2a99d62e"
+        hash: "d48ecbd0661e08b2117fe2fd96ffeb2c"
     }
     Mouse {
         type: 5
@@ -1878,7 +1878,7 @@ VisualTest {
     }
     Frame {
         msec: 4880
-        hash: "7b1af6cddd2f78615354f747dfd016b9"
+        hash: "7cfef56b24a552c6d4ecb3d0b88a1d08"
     }
     Mouse {
         type: 5
@@ -1890,7 +1890,7 @@ VisualTest {
     }
     Frame {
         msec: 4896
-        hash: "a890208c702b9fde41584a33b3038940"
+        hash: "5b12e9d17d9d464b055601db9cf0da44"
     }
     Mouse {
         type: 5
@@ -1902,7 +1902,7 @@ VisualTest {
     }
     Frame {
         msec: 4912
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "25333e1f0cc9cfc664fd7369af544c06"
     }
     Mouse {
         type: 5
@@ -1914,39 +1914,39 @@ VisualTest {
     }
     Frame {
         msec: 4928
-        hash: "cdc2d0868771429226c74e77676f55f1"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 4944
-        hash: "cdc2d0868771429226c74e77676f55f1"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 4960
-        hash: "cdc2d0868771429226c74e77676f55f1"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 4976
-        hash: "cdc2d0868771429226c74e77676f55f1"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 4992
-        hash: "cdc2d0868771429226c74e77676f55f1"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5008
-        hash: "cdc2d0868771429226c74e77676f55f1"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5024
-        hash: "cdc2d0868771429226c74e77676f55f1"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5040
-        hash: "cdc2d0868771429226c74e77676f55f1"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5056
-        hash: "cdc2d0868771429226c74e77676f55f1"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Mouse {
         type: 3
@@ -1958,175 +1958,175 @@ VisualTest {
     }
     Frame {
         msec: 5072
-        hash: "cdc2d0868771429226c74e77676f55f1"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5088
-        hash: "cdc2d0868771429226c74e77676f55f1"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5104
-        hash: "cdc2d0868771429226c74e77676f55f1"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5120
-        hash: "cdc2d0868771429226c74e77676f55f1"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5136
-        hash: "cdc2d0868771429226c74e77676f55f1"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5152
-        hash: "cdc2d0868771429226c74e77676f55f1"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5168
-        hash: "cdc2d0868771429226c74e77676f55f1"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5184
-        hash: "768d6d504470ce841e51022dd514edc5"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5200
-        hash: "768d6d504470ce841e51022dd514edc5"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5216
-        hash: "768d6d504470ce841e51022dd514edc5"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5232
-        hash: "768d6d504470ce841e51022dd514edc5"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5248
-        hash: "768d6d504470ce841e51022dd514edc5"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5264
-        hash: "768d6d504470ce841e51022dd514edc5"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5280
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5296
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5312
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5328
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5344
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5360
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5376
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5392
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5408
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5424
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5440
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5456
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5472
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5488
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5504
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5520
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5536
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5552
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5568
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5584
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5600
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5616
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5632
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5648
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5664
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5680
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5696
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5712
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5728
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5744
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5760
@@ -2134,94 +2134,94 @@ VisualTest {
     }
     Frame {
         msec: 5776
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5792
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5808
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5824
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5840
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5856
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5872
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5888
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5904
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5920
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5936
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5952
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5968
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5984
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6000
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6016
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6032
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6048
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6064
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6080
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6096
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6112
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6128
-        hash: "6df3f8000a0d390b89d41c6ece6ea221"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
 }
-- 
cgit v0.12


From b628a6dc1373fcfbc71a7668d39111c699396674 Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Thu, 4 Nov 2010 15:18:08 +1000
Subject: Document list type operations

Task-number: QTBUG-14645
---
 doc/src/declarative/basictypes.qdoc | 85 ++++++++++++++++++++++++++++++++++---
 doc/src/declarative/extending.qdoc  |  9 +++-
 2 files changed, 87 insertions(+), 7 deletions(-)

diff --git a/doc/src/declarative/basictypes.qdoc b/doc/src/declarative/basictypes.qdoc
index 6abe96f..8ab06ab 100644
--- a/doc/src/declarative/basictypes.qdoc
+++ b/doc/src/declarative/basictypes.qdoc
@@ -355,9 +355,11 @@
 
     \brief A list of objects.
 
-    A list of objects. While not technically a basic type, QML also
-    supports lists of object types. When used from QML, the engine
-    automatically appends each value to the list.
+    A list type contains a list of objects. While not technically
+    a basic type, QML supports lists of object types. When used
+    from QML, the engine automatically appends each value to the list.
+    Items in the list can be accessed by index using the usual
+    \c listName[index] syntax.
 
     For example, the \l Item class contains a list property named
     children that can be used like this:
@@ -366,14 +368,87 @@
     Item {
         children: [
             Item { id: child1 },
-            Rectangle { id: child2 },
+            Rectangle { id: child2; width: 200 },
             Text { id: child3 }
         ]
+
+        Component.onCompleted: {
+            console.log("Width of child rectangle:", children[1].width)
+        }
     }
     \endqml
-    \c child1, \c child2 and \c child3 will all be added to the children list
+    \c child1, \c child2 and \c child3 will be added to the children list
     in the order in which they appear.
 
+    List \l {Adding new properties}{properties} can be created as a
+    \c variant type, or as a \c list<Type> type, where \c Type is the
+    type of the object in the list:
+
+    \qml
+    Item {
+        property variant values: [ 10, 20, 'abc', 'xyz' ]
+
+        property list<Rectangle> rects: [
+            Rectangle { width: 100; height: 100},
+            Rectangle { width: 200; height: 200}
+        ]
+    }
+    \endqml
+
+    A \c variant list can contain values of any of the \l {QML Basic Types}{basic QML types}
+    such as numbers, strings, etc. while a \c list<Type> list can only contain values
+    that match (or are derived from) the specified \c Type.
+
+    A list property can be cleared by setting it to an empty list:
+
+    \qml
+    Item {
+        children: []
+    }
+    \endqml
+
+    A list property cannot be modified in any other way. Items cannot be dynamically added to
+    or removed from the list through JavaScript operations; any \c push() operations on the
+    list only modify a \e copy of the list and not the actual list. (These current limitations
+    are due to restrictions on \l {Property Binding} where lists are involved.)
+
+    To create a modifiable list, create an array object from within a \c .js JavaScript file,
+    or implement a custom list element in C++. Here is a QML element that modifies the list in a
+    JavaScript file:
+
+    \table
+    \row
+    \o
+    \qml
+    // QML
+    import "script.js" as Script
+
+    Item {
+        Component.onCompleted: {
+            Script.addItem('abc')
+            console.log("Added:", Script.getList()[0])
+        }
+    }
+    \endqml
+
+    \o
+    \code
+    // script.js
+    var myArray = new Array()
+
+    function getList() {
+        return myArray
+    }
+
+    function addItem(item) {
+        myArray.push(item)
+    }
+    \endcode
+    \endtable
+
+    However, note that a JavaScript list should not be used as a QML \c property value,
+    as the property is not updated when the list changes.
+
     \sa {QML Basic Types}
 */
 
diff --git a/doc/src/declarative/extending.qdoc b/doc/src/declarative/extending.qdoc
index 18887c7..5c1b977 100644
--- a/doc/src/declarative/extending.qdoc
+++ b/doc/src/declarative/extending.qdoc
@@ -647,7 +647,8 @@ language.
 
 \section1 Adding new properties
 
-New properties can be added to an existing type.  These new properties are
+New properties can be added to an existing type using the \c property keyword.
+These new properties are
 available for use within QML, and also appear as regular Qt properties on the
 C++ object, accessible through the regular property access mechanisms.
 
@@ -679,8 +680,12 @@ like this:
     property list<Item> listOfItemsProperty
 \endcode
 
+Custom types must be registered with qmlRegisterType() to be usable as a property
+type. Also note that list properties cannot be modified like ordinary JavaScript
+arrays; see the \l {list}{list type documentation} for details.
+
 QML supports two methods for adding a new property to a type: a new property
-definition, and a property alias.
+definition, and a property alias. These are shown below.
 
 \section2 Property definitions
 
-- 
cgit v0.12


From b5588ded342ed9dbc9f00fc8a4091e447880eccc Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Thu, 4 Nov 2010 15:18:52 +1000
Subject: Largely rewrite the Using QML in C++ Applications documentation. It
 now has an overview of different approaches to QML/C++ integration and
 demonstrates how to pass data between QML and C++ through
 properties/functions/signals. The part in the old docs that focused on
 QDeclarativeContext has been merged into the QDeclarativeContext class docs
 (although most of the info was largely covered in there already) and the part
 that covered Network Components has been moved to the QDeclarativeComponent
 class docs. The custom enum types example previously in
 extending-tutorial.qdoc has been moved to these new docs.

Task-number: QTBUG-14923
---
 doc/src/declarative/extending-tutorial.qdoc        |  20 +-
 doc/src/declarative/qtbinding.qdoc                 | 631 ++++++++++++++++-----
 .../qtbinding/context-advanced/MyItem.qml          |  46 ++
 .../qtbinding/context-advanced/applicationdata.h   |  52 ++
 .../qtbinding/context-advanced/connections.qml     |  52 ++
 .../context-advanced/context-advanced.pro          |   3 +
 .../qtbinding/context-advanced/main.cpp            |  60 ++
 .../declarative/qtbinding/context/MyItem.qml       |  45 ++
 .../declarative/qtbinding/context/context.pro      |   2 +
 .../declarative/qtbinding/context/main.cpp         |  56 ++
 .../contextproperties/contextproperties.pro        |   2 -
 .../qtbinding/contextproperties/main.cpp           |  78 ---
 .../qtbinding/contextproperties/main.qml           |  55 --
 .../qtbinding/custompalette/custompalette.h        |  79 ---
 .../qtbinding/custompalette/custompalette.pro      |   3 -
 .../declarative/qtbinding/custompalette/main.cpp   |  61 --
 .../declarative/qtbinding/custompalette/main.qml   |  62 --
 .../snippets/declarative/qtbinding/enums/enums.pro |   3 +
 .../declarative/qtbinding/enums/imageviewer.h      |  68 +++
 .../snippets/declarative/qtbinding/enums/main.cpp  |  73 +++
 .../declarative/qtbinding/enums/standalone.qml     |  49 ++
 .../declarative/qtbinding/functions-cpp/MyItem.qml |  55 ++
 .../qtbinding/functions-cpp/functions-qml.pro      |   3 +
 .../declarative/qtbinding/functions-cpp/main.cpp   |  59 ++
 .../declarative/qtbinding/functions-cpp/myclass.h  |  57 ++
 .../declarative/qtbinding/functions-qml/MyItem.qml |  50 ++
 .../qtbinding/functions-qml/functions-qml.pro      |   2 +
 .../declarative/qtbinding/functions-qml/main.cpp   |  63 ++
 .../declarative/qtbinding/loading/MyItem.qml       |  56 ++
 .../declarative/qtbinding/loading/loading.pro      |   2 +
 .../declarative/qtbinding/loading/main.cpp         |  90 +++
 .../qtbinding/newelements/imageviewer.h            |  56 ++
 .../declarative/qtbinding/newelements/main.cpp     |  62 ++
 .../qtbinding/newelements/newelements.pro          |   3 +
 .../qtbinding/newelements/standalone.qml           |  44 ++
 .../qtbinding/properties-cpp/MyItem.qml            |  54 ++
 .../qtbinding/properties-cpp/applicationdata.h     |  71 +++
 .../declarative/qtbinding/properties-cpp/main.cpp  |  58 ++
 .../qtbinding/properties-cpp/properties-cpp.pro    |   3 +
 .../qtbinding/properties-qml/MyItem.qml            |  47 ++
 .../declarative/qtbinding/properties-qml/main.cpp  |  61 ++
 .../qtbinding/properties-qml/properties-qml.pro    |   2 +
 .../declarative/qtbinding/resources/main.qml       |   5 +-
 .../declarative/qtbinding/signals-cpp/MyItem.qml   |  50 ++
 .../qtbinding/signals-cpp/imageviewer.h            |  64 +++
 .../declarative/qtbinding/signals-cpp/main.cpp     |  81 +++
 .../qtbinding/signals-cpp/signals-cpp.pro          |   3 +
 .../qtbinding/signals-cpp/standalone.qml           |  48 ++
 .../declarative/qtbinding/signals-qml/MyItem.qml   |  55 ++
 .../declarative/qtbinding/signals-qml/main.cpp     |  59 ++
 .../declarative/qtbinding/signals-qml/myclass.h    |  51 ++
 .../qtbinding/signals-qml/signals-qml.pro          |   3 +
 .../declarative/qtbinding/stopwatch/main.cpp       |  62 --
 .../declarative/qtbinding/stopwatch/main.qml       |  58 --
 .../declarative/qtbinding/stopwatch/stopwatch.cpp  |  62 --
 .../declarative/qtbinding/stopwatch/stopwatch.h    |  61 --
 .../declarative/qtbinding/stopwatch/stopwatch.pro  |   3 -
 src/declarative/qml/qdeclarativecomponent.cpp      |  37 ++
 src/declarative/qml/qdeclarativecontext.cpp        |  21 +-
 tests/auto/declarative/examples/tst_examples.cpp   |   1 +
 60 files changed, 2363 insertions(+), 759 deletions(-)
 create mode 100644 doc/src/snippets/declarative/qtbinding/context-advanced/MyItem.qml
 create mode 100644 doc/src/snippets/declarative/qtbinding/context-advanced/applicationdata.h
 create mode 100644 doc/src/snippets/declarative/qtbinding/context-advanced/connections.qml
 create mode 100644 doc/src/snippets/declarative/qtbinding/context-advanced/context-advanced.pro
 create mode 100644 doc/src/snippets/declarative/qtbinding/context-advanced/main.cpp
 create mode 100644 doc/src/snippets/declarative/qtbinding/context/MyItem.qml
 create mode 100644 doc/src/snippets/declarative/qtbinding/context/context.pro
 create mode 100644 doc/src/snippets/declarative/qtbinding/context/main.cpp
 delete mode 100644 doc/src/snippets/declarative/qtbinding/contextproperties/contextproperties.pro
 delete mode 100644 doc/src/snippets/declarative/qtbinding/contextproperties/main.cpp
 delete mode 100644 doc/src/snippets/declarative/qtbinding/contextproperties/main.qml
 delete mode 100644 doc/src/snippets/declarative/qtbinding/custompalette/custompalette.h
 delete mode 100644 doc/src/snippets/declarative/qtbinding/custompalette/custompalette.pro
 delete mode 100644 doc/src/snippets/declarative/qtbinding/custompalette/main.cpp
 delete mode 100644 doc/src/snippets/declarative/qtbinding/custompalette/main.qml
 create mode 100644 doc/src/snippets/declarative/qtbinding/enums/enums.pro
 create mode 100644 doc/src/snippets/declarative/qtbinding/enums/imageviewer.h
 create mode 100644 doc/src/snippets/declarative/qtbinding/enums/main.cpp
 create mode 100644 doc/src/snippets/declarative/qtbinding/enums/standalone.qml
 create mode 100644 doc/src/snippets/declarative/qtbinding/functions-cpp/MyItem.qml
 create mode 100644 doc/src/snippets/declarative/qtbinding/functions-cpp/functions-qml.pro
 create mode 100644 doc/src/snippets/declarative/qtbinding/functions-cpp/main.cpp
 create mode 100644 doc/src/snippets/declarative/qtbinding/functions-cpp/myclass.h
 create mode 100644 doc/src/snippets/declarative/qtbinding/functions-qml/MyItem.qml
 create mode 100644 doc/src/snippets/declarative/qtbinding/functions-qml/functions-qml.pro
 create mode 100644 doc/src/snippets/declarative/qtbinding/functions-qml/main.cpp
 create mode 100644 doc/src/snippets/declarative/qtbinding/loading/MyItem.qml
 create mode 100644 doc/src/snippets/declarative/qtbinding/loading/loading.pro
 create mode 100644 doc/src/snippets/declarative/qtbinding/loading/main.cpp
 create mode 100644 doc/src/snippets/declarative/qtbinding/newelements/imageviewer.h
 create mode 100644 doc/src/snippets/declarative/qtbinding/newelements/main.cpp
 create mode 100644 doc/src/snippets/declarative/qtbinding/newelements/newelements.pro
 create mode 100644 doc/src/snippets/declarative/qtbinding/newelements/standalone.qml
 create mode 100644 doc/src/snippets/declarative/qtbinding/properties-cpp/MyItem.qml
 create mode 100644 doc/src/snippets/declarative/qtbinding/properties-cpp/applicationdata.h
 create mode 100644 doc/src/snippets/declarative/qtbinding/properties-cpp/main.cpp
 create mode 100644 doc/src/snippets/declarative/qtbinding/properties-cpp/properties-cpp.pro
 create mode 100644 doc/src/snippets/declarative/qtbinding/properties-qml/MyItem.qml
 create mode 100644 doc/src/snippets/declarative/qtbinding/properties-qml/main.cpp
 create mode 100644 doc/src/snippets/declarative/qtbinding/properties-qml/properties-qml.pro
 create mode 100644 doc/src/snippets/declarative/qtbinding/signals-cpp/MyItem.qml
 create mode 100644 doc/src/snippets/declarative/qtbinding/signals-cpp/imageviewer.h
 create mode 100644 doc/src/snippets/declarative/qtbinding/signals-cpp/main.cpp
 create mode 100644 doc/src/snippets/declarative/qtbinding/signals-cpp/signals-cpp.pro
 create mode 100644 doc/src/snippets/declarative/qtbinding/signals-cpp/standalone.qml
 create mode 100644 doc/src/snippets/declarative/qtbinding/signals-qml/MyItem.qml
 create mode 100644 doc/src/snippets/declarative/qtbinding/signals-qml/main.cpp
 create mode 100644 doc/src/snippets/declarative/qtbinding/signals-qml/myclass.h
 create mode 100644 doc/src/snippets/declarative/qtbinding/signals-qml/signals-qml.pro
 delete mode 100644 doc/src/snippets/declarative/qtbinding/stopwatch/main.cpp
 delete mode 100644 doc/src/snippets/declarative/qtbinding/stopwatch/main.qml
 delete mode 100644 doc/src/snippets/declarative/qtbinding/stopwatch/stopwatch.cpp
 delete mode 100644 doc/src/snippets/declarative/qtbinding/stopwatch/stopwatch.h
 delete mode 100644 doc/src/snippets/declarative/qtbinding/stopwatch/stopwatch.pro

diff --git a/doc/src/declarative/extending-tutorial.qdoc b/doc/src/declarative/extending-tutorial.qdoc
index 3b2fe3b..2bfe62e 100644
--- a/doc/src/declarative/extending-tutorial.qdoc
+++ b/doc/src/declarative/extending-tutorial.qdoc
@@ -260,32 +260,28 @@ custom QML types may see unexpected behavior if bindings are not implemented.
 
 The \c PieChart type currently has a string-type property and a color-type property.
 It could have many other types of properties. For example, it could have an
-enum-type property to store a display mode for each chart:
+int-type property to store an identifier for each chart:
 
 \code
     // C++
     class PieChart : public QDeclarativeItem
     {
-        Q_ENUMS(DisplayMode)
-        Q_PROPERTY(DisplayMode displayMode READ displayMode WRITE setDisplayMode)
+        Q_PROPERTY(int chartId READ chartId WRITE setChartId NOTIFY chartIdChanged)
         ...
 
     public:
-        enum DisplayMode {
-            MultiLevel,
-            Exploded,
-            ThreeDimensional
-        };
-
-        void setDisplayMode(DisplayMode mode);
-        DisplayMode displayMode() const;
+        void setChartId(int chartId);
+        int chartId() const;
         ...
+
+    signals:
+        void chartIdChanged();
     };
 
     // QML
     PieChart {
         ...
-        displayMode: PieChart.Exploded
+        chartId: 100
     }
 \endcode
 
diff --git a/doc/src/declarative/qtbinding.qdoc b/doc/src/declarative/qtbinding.qdoc
index 58d53de..8a969eb 100644
--- a/doc/src/declarative/qtbinding.qdoc
+++ b/doc/src/declarative/qtbinding.qdoc
@@ -30,126 +30,389 @@
 \target qtbinding
 \title Using QML in C++ Applications
 
-\tableofcontents
+QML is designed to be easily extensible from C++. The classes in the
+QtDeclarative module allow QML components to be loaded and manipulated from C++, and through
+Qt's \l{The Meta-Object System}{meta-object system}, QML and C++ objects can easily
+communicate through Qt signals and slots. In addition, QML plugins can be written to create
+reusable QML components for distribution.
 
-The QML API is split into three main classes - QDeclarativeEngine, QDeclarativeComponent and QDeclarativeContext.  
-QDeclarativeEngine provides the environment in which QML is run, QDeclarativeComponent encapsulates 
-\l {QML Documents}, and QDeclarativeContext allows applications to expose data to QML component instances.
+You may want to mix QML and C++ for a number of reasons. For example:
 
-QML also includes a convenience API, QDeclarativeView, for applications that simply want to embed QML
-components into a new QGraphicsView.  QDeclarativeView covers up many of the details discussed below.  
-While QDeclarativeView is mainly intended for rapid prototyping it can have uses in production applications.
+\list
+\o To use functionality defined in a C++ source (for example, when using a C++ Qt-based data model, or
+calling functions in a third-party C++ library)
+\o To access functionality in the QtDeclarative module (for example, to dynamically generate
+images using QDeclarativeImageProvider)
+\o To write your own QML elements (whether for your applications, or for distribution to others)
+\endlist
+
+To use the QtDeclarative module, you must include and link to the module appropriately, as shown on
+the \l {QtDeclarative}{module index page}. The \l {Qt Declarative UI Runtime} documentation
+shows how to build a basic C++ application that uses this module.
+
+
+\section1 Core module classes
 
-If you are looking at retrofitting an existing Qt application with QML,
-read \l{Integrating QML with existing Qt UI code}.
-\section1 Basic Usage
+The QtDeclarative module provides a set of C++ APIs for extending your QML applications from C++ and
+embedding QML into C++ applications. There are several core classes in the QtDeclarative module
+that provide the essential capabilities for doing this. These are:
 
-Every application requires at least one QDeclarativeEngine.  A QDeclarativeEngine allows the configuration of
-global settings that apply to all the QML component instances - such as the QNetworkAccessManager
-that is used for network communications, and the path used for persistent storage.  
-Multiple QDeclarativeEngine's are only needed if the application requires these settings to differ 
-between QML component instances.
+\list
+\o QDeclarativeEngine: A QML engine provides the environment for executing QML code. Every
+application requires at least one engine instance.
+\o QDeclarativeComponent: A component encapsulates a \l{QML Documents}{QML document}.
+\o QDeclarativeContext: A context allows an application to expose data to the QML components
+created by an engine.
+\endlist
 
-\l {QML Documents} are loaded using the QDeclarativeComponent class.  Each QDeclarativeComponent instance 
-represents a single QML document.  A QDeclarativeComponent can be passed a document URL, or raw text
-representing the content of the document.  The document URL can be a local filesystem URL, or
-any network URL supported by QNetworkAccessManager.
+A QDeclarativeEngine allows the configuration of global settings that apply to all of its QML
+component instances: for example, the QNetworkAccessManager to be used for network communications,
+and the file path to be used for persistent storage.
 
-QML component instances can then be created by calling the QDeclarativeComponent::create() method.  Here's
-an example of loading a QML document, and creating an object from it.
+QDeclarativeComponent is used to load QML documents. Each QDeclarativeComponent instance represents
+a single document. A component can be created from the URL or file path of a QML document, or the raw
+QML code of the document. Component instances are instatiated through the
+QDeclarativeComponent::create() method, like this:
 
 \code
-    QDeclarativeEngine *engine = new QDeclarativeEngine(parent);
-    QDeclarativeComponent component(engine, QUrl::fromLocalFile("main.qml"));
-    QObject *myObject = component.create();
+QDeclarativeEngine engine;
+QDeclarativeComponent component(&engine, QUrl::fromLocalFile("MyRectangle.qml"));
+QObject *rectangleInstance = component.create();
+
+// ...
+delete rectangleInstance;
 \endcode
 
-\section1 Exposing Data
+QML documents can also be loaded using QDeclarativeView. This class provides a convenient
+QWidget-based view for embedding QML components into QGraphicsView-based applications. (For other
+methods of integrating QML into QWidget-based applications, see \l {Integrating QML with existing Qt
+UI code}.)
+
+
+\section1 Approaches to using QML with C++
+
+There are a number of ways to extend your QML application through C++. For example, you could:
+
+\list
+\o Load a QML component and manipulate it (or its children) from C++
+\o Embed a C++ object and its properties directly into a QML component (for example, to make a
+particular C++ object callable from QML, or to replace a dummy list model data with a real data set)
+\o Define new QML elements (through QObject-based C++ classes) and create them directly from your
+QML code
+\endlist
+
+These methods are shown below. Naturally these approaches are not exclusive; you can mix any of
+these methods throughout your application as appropriate.
+
+
+\section2 Loading QML components from C++
+
+A QML document can be loaded with QDeclarativeComponent or QDeclarativeView. QDeclarativeComponent
+loads a QML component as a C++ object; QDeclarativeView also does this,
+but additionally loads the QML component directly into a QGraphicsView. It is convenient for loading
+a displayable QML component into a QWidget-based application.
+
+For example, suppose there is a \c MyItem.qml file that looks like this:
+
+\snippet doc/src/snippets/declarative/qtbinding/loading/MyItem.qml start
+\snippet doc/src/snippets/declarative/qtbinding/loading/MyItem.qml end
+
+This QML document can be loaded with QDeclarativeComponent or QDeclarativeView with the following
+C++ code. Using a QDeclarativeComponent requires calling QDeclarativeComponent::create() to create
+a new instance of the component, while a QDeclarativeView automatically creates an instance of the
+component, which is accessible via QDeclarativeView::rootObject():
+
+\table
+\row
+\o
+\snippet doc/src/snippets/declarative/qtbinding/loading/main.cpp QDeclarativeComponent-a
+\dots 0
+\snippet doc/src/snippets/declarative/qtbinding/loading/main.cpp QDeclarativeComponent-b
+\o
+\snippet doc/src/snippets/declarative/qtbinding/loading/main.cpp QDeclarativeView
+\endtable
+
+This \c object is the instance of the \c MyItem.qml component that has been created. You can now
+modify the item's properties using QObject::setProperty() or QDeclarativeProperty:
+
+\snippet doc/src/snippets/declarative/qtbinding/loading/main.cpp properties
+
+Alternatively, you can cast the object to its actual type and call functions with compile-time
+safety. In this case the base object of \c MyItem.qml is an \l Item, which is defined by the
+QDeclarativeItem class:
+
+\snippet doc/src/snippets/declarative/qtbinding/loading/main.cpp cast
+
+You can also connect to any signals or call functions defined in the component using
+QMetaObject::invokeMethod() and QObject::connect(). See \l {Exchanging data between QML and C++}
+below for further details.
+
+\section3 Locating child objects
+
+QML components are essentially object trees with children that have siblings and their own children.
+Child objects of QML components can be located using the QObject::objectName property with
+QObject::findChild(). For example, if the root item in \c MyItem.qml had a child \l Rectangle item:
+
+\snippet doc/src/snippets/declarative/qtbinding/loading/MyItem.qml start
+\codeline
+\snippet doc/src/snippets/declarative/qtbinding/loading/MyItem.qml child
+\snippet doc/src/snippets/declarative/qtbinding/loading/MyItem.qml end
+
+The child could be located like this:
+
+\snippet doc/src/snippets/declarative/qtbinding/loading/main.cpp findChild
+
+If \c objectName is used inside a delegate of a ListView, \l Repeater or some other
+element that creates multiple instances of its delegates, there will be multiple children with
+the same \c objectName. In this case, QObject::findChildren() can be used to find all children
+with a matching \c objectName.
+
+\warning While it is possible to use C++ to access and manipulate QML objects deep into the
+object tree, we recommend that you do not take this approach outside of application
+testing and prototyping. One strength of QML and C++ integration is the ability to implement the
+QML user interface separately from the C++ logic and dataset backend, and this strategy breaks if the
+C++ side reaches deep into the QML components to manipulate them directly. This would make it difficult
+to, for example, swap a QML view component for another view, if the new component was missing a
+required \c objectName. It is better for the C++ implementation to know as little as possible about
+the QML user interface implementation and the composition of the QML object tree.
+
+
+\section2 Embedding C++ objects into QML components
+
+When loading a QML scene into a C++ application, it can be useful to directly embed C++ data into
+the QML object. QDeclarativeContext enables this by exposing data to the context of a QML
+component, allowing data to be injected from C++ into QML.
+
+For example, here is a QML item that refers to a \c currentDateTime value that does not exist in
+the current scope:
+
+\snippet doc/src/snippets/declarative/qtbinding/context/MyItem.qml 0
+
+This \c currentDateTime value can be set directly by the C++ application that loads the QML
+component, using QDeclarativeContext::setContextProperty():
+
+\snippet doc/src/snippets/declarative/qtbinding/context/main.cpp 0
+
+Context properties can hold either QVariant or QObject* values. This means custom C++ objects can
+also be injected using this approach, and these objects can be modified and read directly in QML.
+Here, we modify the above example to embed a QObject instance instead of a QDateTime value, and the QML code
+invokes a method on the object instance:
+
+\table
+\row
+\o
+\snippet doc/src/snippets/declarative/qtbinding/context-advanced/applicationdata.h 0
+\codeline
+\snippet doc/src/snippets/declarative/qtbinding/context-advanced/main.cpp 0
+\o
+\snippet doc/src/snippets/declarative/qtbinding/context-advanced/MyItem.qml 0
+\endtable
+
+(Note that date/time values returned from C++ to QML can be formatted through
+\l{QML:Qt::formatDateTime}{Qt.formatDateTime()} and associated functions.)
+
+If the QML item needs to receive signals from the context property, it can connect to them using the
+\l Connections element. For example, if \c ApplicationData has a signal named \c
+dataChanged(), this signal can be connected to using an \c onDataChanged handler within
+a \l Connections object:
+
+\snippet doc/src/snippets/declarative/qtbinding/context-advanced/connections.qml 0
+
+Context properties can be useful for using C++ based data models in a QML view. See the
+\l {declarative/modelviews/stringlistmodel}{String ListModel},
+\l {declarative/modelviews/objectlistmodel}{Object ListModel} and
+\l {declarative/modelviews/abstractitemmodel}{AbstractItemModel} models for
+respective examples on using QStringListModel, QObjectList-based models and QAbstractItemModel
+in QML views.
+
+Also see the QDeclarativeContext documentation for more information.
+
+
+\section2 Defining new QML elements
+
+While new QML elements can be \l {Defining new Components}{defined in QML}, they can also be
+defined by C++ classes; in fact, many of the core \l {QML Elements} are implemented through
+C++ classes. When you create a QML object using one of these elements, you are simply creating an
+instance of a QObject-based C++ class and setting its properties.
+
+For example, here is an \c ImageViewer class with an \c image URL property:
+
+\snippet doc/src/snippets/declarative/qtbinding/newelements/imageviewer.h 0
+
+Aside from the fact that it inherits QDeclarativeItem, this is an ordinary class that could
+exist outside of QML. However, once it is registered with the QML engine using qmlRegisterType():
+
+\snippet doc/src/snippets/declarative/qtbinding/newelements/main.cpp register
+
+Then, any QML code loaded by your C++ application or \l{QDeclarativeExtensionPlugin}{plugin} can create and manipulate
+\c ImageViewer objects:
+
+\snippet doc/src/snippets/declarative/qtbinding/newelements/standalone.qml 0
+
+Note that custom C++ types do not have to inherit from QDeclarativeItem; this is only necessary if it is
+a displayable item. If the item is not displayable, it can simply inherit from QObject.
+
+For more information on defining new QML elements, see the \l {Tutorial: Writing QML extensions with C++}
+{Writing QML extensions with C++} tutorial and the \l {Extending QML in C++} reference
+documentation.
+
+
+
+\section1 Exchanging data between QML and C++
+
+QML and C++ objects can communicate with one another through signals, slots and property
+modifications. For a C++ object, any data that is exposed to Qt's \l{The Meta-Object System}{Meta-Object System}
+- that is, properties, signals, slots and Q_INVOKABLE methods - become available to QML. On
+the QML side, all QML object data is automatically made available to the meta-object system and can
+be accessed from C++.
+
+
+\section2 Calling functions
 
-QML components are instantiated in a QDeclarativeContext.  A context allows the application to expose data
-to the QML component instance.  A single QDeclarativeContext can be used to instantiate all the objects
-used by an application, or several QDeclarativeContext can be created for more fine grained control over
-the data exposed to each instance.  If a context is not passed to the QDeclarativeComponent::create()
-method, the QDeclarativeEngine's \l {QDeclarativeEngine::rootContext()}{root context} is used.  Data exposed through
-the root context is available to all object instances.
+QML functions can be called from C++ and vice-versa.
 
-\section1 Simple Data
+All QML functions are exposed to the meta-object system and can be called using
+QMetaObject::invokeMethod(). Here is a C++ application that uses this to call a QML function:
 
-To expose data to a QML component instance, applications set \l {QDeclarativeContext::setContextProperty()}
-{context properties} which are then accessible by name from QML  \l {Property Binding}s and JavaScript.
-The following example shows how to expose a background color to a QML file through QDeclarativeView:
+\table
+\row
+\o \snippet doc/src/snippets/declarative/qtbinding/functions-qml/MyItem.qml 0
+\o \snippet doc/src/snippets/declarative/qtbinding/functions-qml/main.cpp 0
+\endtable
+
+Notice the Q_RETURN_ARG() and Q_ARG() arguments for QMetaObject::invokeMethod() must be specified as
+QVariant types, as this is the generic data type used for QML functions and return values.
+
+To call a C++ function from QML, the function must be either a Qt slot, or a function marked with
+the Q_INVOKABLE macro, to be available to QML. In the following example, the QML code invokes
+methods on the \c myObject object, which has been set using QDeclarativeContext::setContextProperty():
+
+\table
+\row
+\o
+\snippet doc/src/snippets/declarative/qtbinding/functions-cpp/MyItem.qml 0
+\o
+\snippet doc/src/snippets/declarative/qtbinding/functions-cpp/myclass.h 0
+\codeline
+\snippet doc/src/snippets/declarative/qtbinding/functions-cpp/main.cpp 0
+\endtable
+
+Note that QML does not support overloaded functions. If a C++ has more than one function with the
+same name, there is no guarantee which overloaded function will be called from QML.
+
+
+\section2 Receiving signals
+
+All QML signals are automatically available to C++, and can be connected to using QObject::connect()
+like any ordinary Qt C++ signal.
+
+Here is a QML component with a signal named \c qmlSignal. This signal is connected to a C++ object's
+slot using QObject::connect():
+
+\table
+\row
+\o
+\snippet doc/src/snippets/declarative/qtbinding/signals-qml/MyItem.qml 0
+\o
+\snippet doc/src/snippets/declarative/qtbinding/signals-qml/myclass.h 0
+\codeline
+\snippet doc/src/snippets/declarative/qtbinding/signals-qml/main.cpp 0
+\endtable
+
+To connect to Qt C++ signals from within QML, use a signal handler with the \c on<SignalName> syntax.
+If the C++ object is directly creatable from within QML (see \l {Defining new QML elements} above)
+then the signal handler can be defined within the object declaration. In the following example, the
+QML code creates a \c ImageViewer object, and the \c imageChanged and \c loadingError signals of the
+C++ object are connected to through \c onImagedChanged and \c onLoadingError signal handlers in QML:
 
 \table
 \row
 \o
-\c {// main.cpp}
-\snippet doc/src/snippets/declarative/qtbinding/contextproperties/main.cpp 0
+
+\snippet doc/src/snippets/declarative/qtbinding/signals-cpp/imageviewer.h start
+\dots 4
+\snippet doc/src/snippets/declarative/qtbinding/signals-cpp/imageviewer.h end
 
 \o
-\c {// main.qml}
-\snippet doc/src/snippets/declarative/qtbinding/contextproperties/main.qml 0
+\snippet doc/src/snippets/declarative/qtbinding/signals-cpp/standalone.qml 0
+\endtable
+
+(Note that if a signal has been declared as the NOTIFY signal for a property, QML allows it to be
+received with an \c on<Property>Changed handler even if the signal's name does not follow the \c
+<Property>Changed naming convention. In the above example, if the "imageChanged" signal was named
+"imageModified" instead, the \c onImageChanged signal handler would still be called.)
+
+If, however, the object with the signal is not created from within the QML code, and the QML item only has a
+reference to the created object - for example, if the object was set using
+QDeclarativeContext::setContextProperty() - then the \l Connections element can be used
+instead to create the signal handler:
 
+\table
+\row
+\o \snippet doc/src/snippets/declarative/qtbinding/signals-cpp/main.cpp connections
+\o \snippet doc/src/snippets/declarative/qtbinding/signals-cpp/MyItem.qml 0
 \endtable
 
-Or, if you want \c main.cpp to create the component without showing it in a QDeclarativeView, you could create an instance of QDeclarativeContext using QDeclarativeEngine::rootContext() instead:
 
-\snippet doc/src/snippets/declarative/qtbinding/contextproperties/main.cpp 1
+\section2 Modifying properties
 
-Context properties work just like normal properties in QML bindings - if the \c backgroundColor
-context property in this example was changed to red, the component object instances would
-all be automatically updated.  Note that it is the responsibility of the creator to delete any
-QDeclarativeContext it constructs.  If the \c windowContext is no longer needed when
-the \c window component instantiation is destroyed, the \c windowContext must be destroyed
-explicitly.  The simplest way to ensure this is to set \c window as \c windowContext's parent.
+Any properties declared in a QML object are automatically accessible from C++. Given a QML item
+like this:
 
-QDeclarativeContexts form a tree - each QDeclarativeContext except for the root context has a parent.  Child 
-QDeclarativeContexts effectively inherit the context properties present in their parents.  This gives
-applications more freedom in partitioning the data exposed to different QML object instances.  
-If a QDeclarativeContext sets a context property that is also set in one of its parents, the new context
-property shadows that in the parent.  In The following example, the \c background context property
-in \c {Context 1} shadows the \c background context property in the root context.
+\snippet doc/src/snippets/declarative/qtbinding/properties-qml/MyItem.qml 0
 
-\image qml-context-tree.png
+The value of the \c someNumber property can be set and read using QDeclarativeProperty, or
+QObject::setProperty() and QObject::property():
 
-\section2 Structured Data
+\snippet doc/src/snippets/declarative/qtbinding/properties-qml/main.cpp 0
 
-Context properties can also be used to expose structured and writable data to QML objects.  In 
-addition to all the types already supported by QVariant, QObject derived types can be assigned to
-context properties.  QObject context properties allow the data exposed to be more structured, and
-allow QML to set values.
+You should always use QObject::setProperty(), QDeclarativeProperty or QMetaProperty::write() to
+change a QML property value, to ensure the QML engine is made aware of the property change. For example,
+say you have a custom element \c PushButton with a \c buttonText property that internally reflects
+the value of a \c m_buttonText member variable. Modifying the member variable directly like this is
+not a good idea:
 
-The following example creates a \c CustomPalette object, and sets it as the \c palette context
-property.
+\badcode
+// BAD!
+QDeclarativeComponent component(engine, "MyButton.qml");
+PushButton *button = qobject_cast<PushButton*>(component.create());
+button->m_buttonText = "Click me";
+\endcode
 
-\snippet doc/src/snippets/declarative/qtbinding/custompalette/custompalette.h 0
+Since the value is changed directly, this bypasses Qt's \l{The Meta-Object System}{meta-object system}
+and the QML engine is not made aware of the property change. This means property bindings to
+\c buttonText would not be updated, and any \c onButtonTextChanged handlers would not be called.
 
-\snippet doc/src/snippets/declarative/qtbinding/custompalette/main.cpp 0
 
-The QML that follows references the palette object, and its properties, to set the appropriate
-background and text colors.  When the window is clicked, the palette's text color is changed, and
-the window text will update accordingly.
+\target properties-cpp
 
-\snippet doc/src/snippets/declarative/qtbinding/custompalette/main.qml 0
+Any \l {The Property System}{Qt properties} - that is, those declared with the Q_PROPERTY()
+macro - are accessible from QML. Here is a modified version of the \l {Embedding C++ objects into
+QML components}{earlier example} on this page; here, the \c ApplicationData class has a \c backgroundColor
+property. This property can be written to and read from QML:
 
-To detect when a C++ property value - in this case the \c CustomPalette's \c text property - 
-changes, the property must have a corresponding NOTIFY signal.  The NOTIFY signal specifies a signal
-that is emitted whenever the property changes value.  Implementers should take care to only emit the
-signal if the value \e changes to prevent loops from occurring.  Accessing a property from a
-binding that does not have a NOTIFY signal will cause QML to issue a warning at runtime.
+\table
+\row
+\o \snippet doc/src/snippets/declarative/qtbinding/properties-cpp/applicationdata.h 0
+\o \snippet doc/src/snippets/declarative/qtbinding/properties-cpp/MyItem.qml 0
+\endtable
 
-\section2 Dynamic Structured Data
+Notice the \c backgroundColorChanged signal is declared as the NOTIFY signal for the
+\c backgroundColor property. If a Qt property does not have an associated NOTIFY signal,
+the property cannot be used for \l {Property Binding} in QML, as the QML engine would not be
+notified when the value changes. If you are using custom types in QML, make sure their
+properties have NOTIFY signals so that they can be used in property bindings.
 
-If an application is too dynamic to structure data as compile-time QObject types, dynamically
-structured data can be constructed at runtime using the QDeclarativePropertyMap class.
+See \l {Tutorial: Writing QML extensions with C++} for further details and examples
+on using Qt properties with QML.
 
 
-\section1 Calling C++ methods from QML
+\section1 Supported data types
 
-It is possible to call methods of QObject derived types by either exposing the
-methods as public slots, or by marking the methods Q_INVOKABLE.
+Any C++ data that is used from QML - whether as custom properties, or parameters for signals or
+functions - must be of a type that is recognizable by QML.
 
-The C++ methods can also have parameters and return values.  QML has support for
-the following types:
+By default, QML recognizes the following data types:
 
 \list
 \o bool
@@ -163,102 +426,168 @@ the following types:
 \o QSize, QSizeF
 \o QRect, QRectF
 \o QVariant
+\o QObject*
+\o Enumerations declared with Q_ENUMS()
 \endlist
 
-This example toggles the "Stopwatch" object on/off when the MouseArea is clicked:
+To allow a custom C++ type to be created or used in QML, the C++ class must be registered as a QML
+type using qmlRegisterType(), as shown in the \l {Defining new QML elements} section above.
 
-\table
-\row
-\o
-\c {// main.cpp}
-\snippet doc/src/snippets/declarative/qtbinding/stopwatch/stopwatch.h 0
-\snippet doc/src/snippets/declarative/qtbinding/stopwatch/main.cpp 0
 
-\o
-\c {// main.qml}
-\snippet doc/src/snippets/declarative/qtbinding/stopwatch/main.qml 0
+\section2 Using enumerations of a custom type
 
-\endtable
+To use an enumeration from a custom C++ component, the enumeration must be declared with Q_ENUMS() to
+register it with Qt's meta object system. For example, the following C++ type has a \c Status enum:
 
-Note that in this particular example a better way to achieve the same result
-is to have a "running" property in \c main.qml.  This leads to much nicer QML code:
+\snippet doc/src/snippets/declarative/qtbinding/enums/imageviewer.h start
+\snippet doc/src/snippets/declarative/qtbinding/enums/imageviewer.h end
+
+Providing the \c ImageViewer class has been registered using qmlRegisterType(), its \c Status enum can
+now be used from QML:
+
+\snippet doc/src/snippets/declarative/qtbinding/enums/standalone.qml 0
+
+The C++ type must be registered with QML to use its enums. If your C++ type is not instantiable, it
+can be registered using qmlRegisterUncreatableType().
+
+See the \l {Tutorial: Writing QML extensions with C++}{Writing QML extensions with C++} tutorial and
+the \l {Extending QML in C++} reference documentation for more information.
+
+
+\section2 Automatic type conversion
+
+As a convenience, some basic types can be specified in QML using format strings to make it easier to
+pass simple values from QML to C++.
 
 \table
+\header
+\o Type
+\o String format
+\o Example
 \row
-\o
-\code
-// main.qml
-import QtQuick 1.0
-
-Rectangle {
-    MouseArea {
-        anchors.fill: parent
-        onClicked: stopwatch.running = !stopwatch.running
-    }
-}
-\endcode
+\o QColor
+\o Color name, "#RRGGBB", "#RRGGBBAA"
+\o "red", "#ff0000", "#ff000000"
+\row
+\o QDate
+\o "YYYY-MM-DD"
+\o "2010-05-31"
+\row
+\o QPoint
+\o "x,y"
+\o "10,20"
+\row
+\o QRect
+\o "x,y,WidthxHeight"
+\o "50,50,100x100"
+\row
+\o QSize
+\o "WidthxHeight"
+\o "100x200"
+\row
+\o QTime
+\o "hh:mm:ss"
+\o "14:22:55"
+\row
+\o QUrl
+\o URL string
+\o "http://www.example.com"
+\row
+\o QVector3D
+\o "x,y,z"
+\o "0,1,0"
+\row
+\o Enumeration value
+\o Enum value name
+\o "AlignRight"
 \endtable
 
-Of course, it is also possible to call \l {Adding new methods}{functions declared in QML from C++}.
+(More details on these string formats and types can be found in the
+\l {QML Basic Types}{basic type documentation}.)
+
+These string formats can be used to set QML \c property values and pass arguments to C++
+functions. This is demonstrated by various examples on this page; in the above
+\l{#properties-cpp}{Qt properties example}, the \c ApplicationData class has a \c backgroundColor
+property of a QColor type, which is set from the QML code with the string "red" rather rather
+than an actual QColor object.
+
+If it is preferred to pass an explicitly-typed value rather than a string, the global
+\l{QmlGlobalQtObject}{Qt object} provides convenience functions for creating some of the object
+types listed above. For example, \l{QML:Qt::rgba()}{Qt.rgba()} creates a QColor value from four
+RGBA values. The QColor returned from this function could be used instead of a string to set
+a QColor-type property or to call a C++ function that requires a QColor parameter.
+
+
+\section1 Writing QML plugins
+
+The QtDeclarative module includes the QDeclarativeExtensionPlugin class, which is an abstract
+class for writing QML plugins. This allows QML extension types to be dynamically loaded into
+QML applications.
+
+See the QDeclarativeExtensionPlugin documentation and \l {How to Create Qt Plugins} for more
+details.
+
+
+\section1 Managing resource files with the Qt resource system
 
+The \l {The Qt Resource System}{Qt resource system} allows resource files to be stored as
+binary files in an application executable. This can be useful when building a mixed
+QML/C++ application as it enables QML files (as well as other resources such as images
+and sound files) to be referred to through the resource system URI scheme rather than
+relative or absolute paths to filesystem resources. Note, however, that if you use the resource
+system, the application executable must be re-compiled whenever a QML source file is changed
+in order to update the resources in the package.
 
-\section1 Network Components
+To use the resource system in a mixed QML/C++ application:
 
-If the URL passed to QDeclarativeComponent is a network resource, or if the QML document references a
-network resource, the QDeclarativeComponent has to fetch the network data before it is able to create
-objects.  In this case, the QDeclarativeComponent will have a \l {QDeclarativeComponent::Loading}{Loading}
-\l {QDeclarativeComponent::status()}{status}.  An application will have to wait until the component
-is \l {QDeclarativeComponent::Ready}{Ready} before calling \l {QDeclarativeComponent::create()}.
+\list
+\o Create a \c .qrc \l {The Qt Resource System}{resource collection file} that lists resource
+   files in XML format
+\o From C++, load the main QML file as a resource using the \c :/ prefix or as a URL with the
+   \c qrc scheme
+\endlist
+
+Once this is done, all files specified by relative paths in QML will be loaded from
+the resource system instead. Use of the resource system is completely transparent to
+the QML layer; this means all QML code should refer to resource files using relative
+paths and should \e not use the \c qrc scheme. This scheme should only be used from
+C++ code for referring to resource files.
 
-The following example shows how to load a QML file from a network resource.  After creating
-the QDeclarativeComponent, it tests whether the component is loading.  If it is, it connects to the
-QDeclarativeComponent::statusChanged() signal and otherwise calls the \c {continueLoading()} method
-directly.  This test is necessary, even for URLs that are known to be remote, just in case
-the component has been cached and is ready immediately.
+Here is a application packaged using the \l {The Qt Resource System}{Qt resource system}.
+The directory structure looks like this:
 
 \code
-MyApplication::MyApplication()
-{
-    // ...
-    component = new QDeclarativeComponent(engine, QUrl("http://www.example.com/main.qml"));
-    if (component->isLoading())
-        QObject::connect(component, SIGNAL(statusChanged(QDeclarativeComponent::Status)),
-                         this, SLOT(continueLoading()));
-    else
-        continueLoading();
-}
-
-void MyApplication::continueLoading()
-{
-    if (component->isError()) {
-        qWarning() << component->errors();
-    } else {
-        QObject *myObject = component->create();
-    }
-}
+project
+    |- example.qrc
+    |- main.qml
+    |- images
+        |- background.png
+    |- main.cpp
+    |- project.pro
 \endcode
 
-\section1 Qt Resources
+The \c main.qml and \c background.png files will be packaged as resource files. This is
+done in the \c example.qrc resource collection file:
 
-QML content can be loaded from \l {The Qt Resource System} using the \e qrc: URL scheme.
-For example:
+\quotefile doc/src/snippets/declarative/qtbinding/resources/example.qrc
 
-\c [project/example.qrc]
-\quotefile doc/src/snippets/declarative/qtbinding/resources/example.qrc 
+Since \c background.png is a resource file, \c main.qml can refer to it using the relative
+path specified in \c example.qrc:
+
+\snippet doc/src/snippets/declarative/qtbinding/resources/main.qml 0
 
-\c [project/project.pro]
-\quotefile doc/src/snippets/declarative/qtbinding/resources/resources.pro 
+To allow QML to locate resource files correctly, the \c main.cpp loads the main QML
+file, \c main.qml, as a resource file using the \c qrc scheme:
 
-\c [project/main.cpp]
 \snippet doc/src/snippets/declarative/qtbinding/resources/main.cpp 0
 
-\c [project/main.qml]
-\snippet doc/src/snippets/declarative/qtbinding/resources/main.qml 0
+Finally \c project.pro uses the RESOURCES variable to indicate that \c example.qrc should
+be used to build the application resources:
+
+\quotefile doc/src/snippets/declarative/qtbinding/resources/resources.pro
+
+See \l {The Qt Resource System} for more information.
 
-Note that the resource system cannot be accessed from QML directly. If the main QML file is
-loaded as a resource, all files specified as relative paths in QML will also be loaded from
-the resource system. Using the resource system is completely transparent to the QML layer.
-This also means that if the main QML file is not loaded as a resource then files in the resource
-system cannot be accessed from QML.
 */
 
+
diff --git a/doc/src/snippets/declarative/qtbinding/context-advanced/MyItem.qml b/doc/src/snippets/declarative/qtbinding/context-advanced/MyItem.qml
new file mode 100644
index 0000000..607651a
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/context-advanced/MyItem.qml
@@ -0,0 +1,46 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//![0]
+// MyItem.qml
+import QtQuick 1.0
+
+Text { text: applicationData.getCurrentDateTime() }
+//![0]
+
diff --git a/doc/src/snippets/declarative/qtbinding/context-advanced/applicationdata.h b/doc/src/snippets/declarative/qtbinding/context-advanced/applicationdata.h
new file mode 100644
index 0000000..930e381
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/context-advanced/applicationdata.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QObject>
+#include <QDateTime>
+
+//![0]
+class ApplicationData : public QObject
+{
+    Q_OBJECT
+public:
+    Q_INVOKABLE QDateTime getCurrentDateTime() const {
+        return QDateTime::currentDateTime();
+    }
+};
+//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/context-advanced/connections.qml b/doc/src/snippets/declarative/qtbinding/context-advanced/connections.qml
new file mode 100644
index 0000000..749bea3
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/context-advanced/connections.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 1.0
+
+//![0]
+Text {
+    text: applicationData.getCurrentDateTime()
+
+    Connections {
+        target: applicationData
+        onDataChanged: console.log("The application data changed!")
+    }
+}
+//![0]
+
diff --git a/doc/src/snippets/declarative/qtbinding/context-advanced/context-advanced.pro b/doc/src/snippets/declarative/qtbinding/context-advanced/context-advanced.pro
new file mode 100644
index 0000000..188a9fb
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/context-advanced/context-advanced.pro
@@ -0,0 +1,3 @@
+QT += declarative
+SOURCES += main.cpp
+HEADERS += applicationdata.h
diff --git a/doc/src/snippets/declarative/qtbinding/context-advanced/main.cpp b/doc/src/snippets/declarative/qtbinding/context-advanced/main.cpp
new file mode 100644
index 0000000..b92215b
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/context-advanced/main.cpp
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore>
+#include <QtDeclarative>
+
+#include "applicationdata.h"
+
+//![0]
+int main(int argc, char *argv[]) {
+    QApplication app(argc, argv);
+
+    QDeclarativeView view;
+
+    ApplicationData data;
+    view.rootContext()->setContextProperty("applicationData", &data);
+
+    view.setSource(QUrl::fromLocalFile("MyItem.qml"));
+    view.show();
+
+    return app.exec();
+}
+//![0]
+
diff --git a/doc/src/snippets/declarative/qtbinding/context/MyItem.qml b/doc/src/snippets/declarative/qtbinding/context/MyItem.qml
new file mode 100644
index 0000000..faa42dc
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/context/MyItem.qml
@@ -0,0 +1,45 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//![0]
+// MyItem.qml
+import QtQuick 1.0
+
+Text { text: currentDateTime }
+//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/context/context.pro b/doc/src/snippets/declarative/qtbinding/context/context.pro
new file mode 100644
index 0000000..68eeaf2
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/context/context.pro
@@ -0,0 +1,2 @@
+QT += declarative
+SOURCES += main.cpp
diff --git a/doc/src/snippets/declarative/qtbinding/context/main.cpp b/doc/src/snippets/declarative/qtbinding/context/main.cpp
new file mode 100644
index 0000000..bbe9956
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/context/main.cpp
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore>
+#include <QtDeclarative>
+
+int main(int argc, char *argv[])
+{
+    QApplication app(argc, argv);
+
+//![0]
+QDeclarativeView view;
+view.rootContext()->setContextProperty("currentDateTime", QDateTime::currentDateTime());
+view.setSource(QUrl::fromLocalFile("MyItem.qml"));
+view.show();
+//![0]
+
+    return app.exec();
+}
+
diff --git a/doc/src/snippets/declarative/qtbinding/contextproperties/contextproperties.pro b/doc/src/snippets/declarative/qtbinding/contextproperties/contextproperties.pro
deleted file mode 100644
index 68eeaf2..0000000
--- a/doc/src/snippets/declarative/qtbinding/contextproperties/contextproperties.pro
+++ /dev/null
@@ -1,2 +0,0 @@
-QT += declarative
-SOURCES += main.cpp
diff --git a/doc/src/snippets/declarative/qtbinding/contextproperties/main.cpp b/doc/src/snippets/declarative/qtbinding/contextproperties/main.cpp
deleted file mode 100644
index 6887e8f..0000000
--- a/doc/src/snippets/declarative/qtbinding/contextproperties/main.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-**   * Redistributions of source code must retain the above copyright
-**     notice, this list of conditions and the following disclaimer.
-**   * Redistributions in binary form must reproduce the above copyright
-**     notice, this list of conditions and the following disclaimer in
-**     the documentation and/or other materials provided with the
-**     distribution.
-**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
-**     the names of its contributors may be used to endorse or promote
-**     products derived from this software without specific prior written
-**     permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QDeclarativeComponent>
-#include <QDeclarativeEngine>
-
-//![0]
-#include <QApplication>
-#include <QDeclarativeView>
-#include <QDeclarativeContext>
-
-int main(int argc, char *argv[])
-{
-    QApplication app(argc, argv);
-
-    QDeclarativeView view;
-    QDeclarativeContext *context = view.rootContext();
-    context->setContextProperty("backgroundColor",
-                                QColor(Qt::yellow));
-
-    view.setSource(QUrl::fromLocalFile("main.qml"));
-    view.show();
-
-    return app.exec();
-}
-//![0]
-
-static void alternative()
-{
-    // Alternatively, if we don't actually want to display main.qml:
-//![1]
-    QDeclarativeEngine engine;
-    QDeclarativeContext *windowContext = new QDeclarativeContext(engine.rootContext());
-    windowContext->setContextProperty("backgroundColor", QColor(Qt::yellow));
-
-    QDeclarativeComponent component(&engine, "main.qml");
-    QObject *window = component.create(windowContext);
-//![1]
-}
-
-
diff --git a/doc/src/snippets/declarative/qtbinding/contextproperties/main.qml b/doc/src/snippets/declarative/qtbinding/contextproperties/main.qml
deleted file mode 100644
index 425346d..0000000
--- a/doc/src/snippets/declarative/qtbinding/contextproperties/main.qml
+++ /dev/null
@@ -1,55 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-**   * Redistributions of source code must retain the above copyright
-**     notice, this list of conditions and the following disclaimer.
-**   * Redistributions in binary form must reproduce the above copyright
-**     notice, this list of conditions and the following disclaimer in
-**     the documentation and/or other materials provided with the
-**     distribution.
-**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
-**     the names of its contributors may be used to endorse or promote
-**     products derived from this software without specific prior written
-**     permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//![0]
-import QtQuick 1.0
-
-Rectangle {
-    width: 300
-    height: 300
-
-    color: backgroundColor
-
-    Text {
-        anchors.centerIn: parent
-        text: "Hello Yellow World!"
-    }
-}
-//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/custompalette/custompalette.h b/doc/src/snippets/declarative/qtbinding/custompalette/custompalette.h
deleted file mode 100644
index 7e84bd4..0000000
--- a/doc/src/snippets/declarative/qtbinding/custompalette/custompalette.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-**   * Redistributions of source code must retain the above copyright
-**     notice, this list of conditions and the following disclaimer.
-**   * Redistributions in binary form must reproduce the above copyright
-**     notice, this list of conditions and the following disclaimer in
-**     the documentation and/or other materials provided with the
-**     distribution.
-**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
-**     the names of its contributors may be used to endorse or promote
-**     products derived from this software without specific prior written
-**     permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QObject>
-#include <QColor>
-
-//![0]
-class CustomPalette : public QObject
-{
-    Q_OBJECT
-    Q_PROPERTY(QColor background READ background WRITE setBackground NOTIFY backgroundChanged)
-    Q_PROPERTY(QColor text READ text WRITE setText NOTIFY textChanged)
-
-public:
-    CustomPalette() : m_background(Qt::white), m_text(Qt::black) {}
-    
-    QColor background() const { return m_background; }
-    void setBackground(const QColor &c) {
-        if (c != m_background) {
-            m_background = c;
-            emit backgroundChanged();
-        }
-    }
-    
-    QColor text() const { return m_text; }
-    void setText(const QColor &c) {
-        if (c != m_text) {
-            m_text = c;
-            emit textChanged();
-        }
-    }
-
-signals:
-    void textChanged();
-    void backgroundChanged();
-    
-private:
-    QColor m_background;
-    QColor m_text;
-};
-
-//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/custompalette/custompalette.pro b/doc/src/snippets/declarative/qtbinding/custompalette/custompalette.pro
deleted file mode 100644
index e6af0d0..0000000
--- a/doc/src/snippets/declarative/qtbinding/custompalette/custompalette.pro
+++ /dev/null
@@ -1,3 +0,0 @@
-QT += declarative
-HEADERS += custompalette.h
-SOURCES += main.cpp
diff --git a/doc/src/snippets/declarative/qtbinding/custompalette/main.cpp b/doc/src/snippets/declarative/qtbinding/custompalette/main.cpp
deleted file mode 100644
index 7481b75..0000000
--- a/doc/src/snippets/declarative/qtbinding/custompalette/main.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-**   * Redistributions of source code must retain the above copyright
-**     notice, this list of conditions and the following disclaimer.
-**   * Redistributions in binary form must reproduce the above copyright
-**     notice, this list of conditions and the following disclaimer in
-**     the documentation and/or other materials provided with the
-**     distribution.
-**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
-**     the names of its contributors may be used to endorse or promote
-**     products derived from this software without specific prior written
-**     permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QApplication>
-#include <QDeclarativeView>
-#include <QDeclarativeContext>
-
-#include "custompalette.h"
-
-//![0]
-int main(int argc, char *argv[])
-{
-    QApplication app(argc, argv);
-
-    QDeclarativeView view;
-    view.rootContext()->setContextProperty("palette", new CustomPalette);
-
-    view.setSource(QUrl::fromLocalFile("main.qml"));
-    view.show();
-
-    return app.exec();
-}
-//![0]
-
diff --git a/doc/src/snippets/declarative/qtbinding/custompalette/main.qml b/doc/src/snippets/declarative/qtbinding/custompalette/main.qml
deleted file mode 100644
index a20d9e0..0000000
--- a/doc/src/snippets/declarative/qtbinding/custompalette/main.qml
+++ /dev/null
@@ -1,62 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-**   * Redistributions of source code must retain the above copyright
-**     notice, this list of conditions and the following disclaimer.
-**   * Redistributions in binary form must reproduce the above copyright
-**     notice, this list of conditions and the following disclaimer in
-**     the documentation and/or other materials provided with the
-**     distribution.
-**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
-**     the names of its contributors may be used to endorse or promote
-**     products derived from this software without specific prior written
-**     permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//![0]
-import QtQuick 1.0
-
-Rectangle {
-    width: 240
-    height: 320
-    color: palette.background
-    
-    Text {
-        anchors.centerIn: parent
-        color: palette.text
-        text: "Click me to change color!"
-    }
-    
-    MouseArea {
-        anchors.fill: parent
-        onClicked: {
-            palette.text = "blue";
-        }
-    }
-}
-//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/enums/enums.pro b/doc/src/snippets/declarative/qtbinding/enums/enums.pro
new file mode 100644
index 0000000..82bc123
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/enums/enums.pro
@@ -0,0 +1,3 @@
+QT += declarative
+SOURCES += main.cpp
+HEADERS += imageviewer.h
diff --git a/doc/src/snippets/declarative/qtbinding/enums/imageviewer.h b/doc/src/snippets/declarative/qtbinding/enums/imageviewer.h
new file mode 100644
index 0000000..8aaddee
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/enums/imageviewer.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore>
+#include <QtDeclarative>
+
+//![start]
+class ImageViewer : public QDeclarativeItem
+{
+    Q_OBJECT
+    Q_ENUMS(Status)
+    Q_PROPERTY(Status status READ status NOTIFY statusChanged)
+public:
+    enum Status {
+        Ready,
+        Loading,
+        Error
+    };
+
+    Status status() const;
+//![start]
+
+    ImageViewer(QDeclarativeItem *parent = 0);
+
+public slots:
+    void emitSignals();
+
+//![end]
+signals:
+    void statusChanged();
+};
+//![end]
diff --git a/doc/src/snippets/declarative/qtbinding/enums/main.cpp b/doc/src/snippets/declarative/qtbinding/enums/main.cpp
new file mode 100644
index 0000000..9243f4b
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/enums/main.cpp
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore>
+#include <QtDeclarative>
+
+#include "imageviewer.h"
+
+ImageViewer::ImageViewer(QDeclarativeItem *parent)
+    : QDeclarativeItem(parent)
+{
+    QTimer::singleShot(0, this, SLOT(emitSignals()));
+}
+
+ImageViewer::Status ImageViewer::status() const
+{
+    return Ready;
+}
+
+void ImageViewer::emitSignals()
+{
+    emit statusChanged();
+}
+
+int main(int argc, char *argv[])
+{
+    QApplication app(argc, argv);
+
+    qmlRegisterType<ImageViewer>("MyLibrary", 1, 0, "ImageViewer");
+
+    QDeclarativeView view;
+    view.setSource(QUrl::fromLocalFile("standalone.qml"));
+    view.show();
+
+    return app.exec();
+}
+
diff --git a/doc/src/snippets/declarative/qtbinding/enums/standalone.qml b/doc/src/snippets/declarative/qtbinding/enums/standalone.qml
new file mode 100644
index 0000000..ad6c14c
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/enums/standalone.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import MyLibrary 1.0
+
+//![0]
+ImageViewer {
+    onStatusChanged: {
+        if (status == ImageViewer.Ready)
+            console.log("Image viewer is ready!")
+    }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/functions-cpp/MyItem.qml b/doc/src/snippets/declarative/qtbinding/functions-cpp/MyItem.qml
new file mode 100644
index 0000000..8d8cd56
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/functions-cpp/MyItem.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//![0]
+// MyItem.qml
+import QtQuick 1.0
+
+Item {
+    width: 100; height: 100
+
+    MouseArea {
+        anchors.fill: parent
+        onClicked: {
+            myObject.cppMethod("Hello from QML")
+            myObject.cppSlot(12345)
+        }
+    }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/functions-cpp/functions-qml.pro b/doc/src/snippets/declarative/qtbinding/functions-cpp/functions-qml.pro
new file mode 100644
index 0000000..01066c1
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/functions-cpp/functions-qml.pro
@@ -0,0 +1,3 @@
+QT += declarative
+SOURCES += main.cpp
+HEADERS += myclass.h
diff --git a/doc/src/snippets/declarative/qtbinding/functions-cpp/main.cpp b/doc/src/snippets/declarative/qtbinding/functions-cpp/main.cpp
new file mode 100644
index 0000000..91d6aec
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/functions-cpp/main.cpp
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore>
+#include <QtDeclarative>
+
+#include "myclass.h"
+
+//![0]
+int main(int argc, char *argv[]) {
+    QApplication app(argc, argv);
+
+    QDeclarativeView view;
+    MyClass myClass;
+    view.rootContext()->setContextProperty("myObject", &myClass);
+
+    view.setSource(QUrl::fromLocalFile("MyItem.qml"));
+    view.show();
+
+    return app.exec();
+}
+//![0]
+
diff --git a/doc/src/snippets/declarative/qtbinding/functions-cpp/myclass.h b/doc/src/snippets/declarative/qtbinding/functions-cpp/myclass.h
new file mode 100644
index 0000000..76c628e
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/functions-cpp/myclass.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QObject>
+#include <QDebug>
+
+//![0]
+class MyClass : public QObject
+{
+    Q_OBJECT
+public:
+    Q_INVOKABLE void cppMethod(const QString &msg) {
+        qDebug() << "Called the C++ method with" << msg;
+    }
+    
+public slots:
+    void cppSlot(int number) {
+        qDebug() << "Called the C++ slot with" << number;
+    }
+};
+//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/functions-qml/MyItem.qml b/doc/src/snippets/declarative/qtbinding/functions-qml/MyItem.qml
new file mode 100644
index 0000000..6161d6e
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/functions-qml/MyItem.qml
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//![0]
+// MyItem.qml
+import QtQuick 1.0
+
+Item {
+    function myQmlFunction(msg) {
+        console.log("Got message:", msg)
+        return "some return value"
+    }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/functions-qml/functions-qml.pro b/doc/src/snippets/declarative/qtbinding/functions-qml/functions-qml.pro
new file mode 100644
index 0000000..68eeaf2
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/functions-qml/functions-qml.pro
@@ -0,0 +1,2 @@
+QT += declarative
+SOURCES += main.cpp
diff --git a/doc/src/snippets/declarative/qtbinding/functions-qml/main.cpp b/doc/src/snippets/declarative/qtbinding/functions-qml/main.cpp
new file mode 100644
index 0000000..3e9e51e
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/functions-qml/main.cpp
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore>
+#include <QtDeclarative>
+
+int main(int argc, char *argv[])
+{
+    QApplication app(argc, argv);
+
+//![0]
+// main.cpp
+QDeclarativeEngine engine;
+QDeclarativeComponent component(&engine, "MyItem.qml");
+QObject *object = component.create();
+
+QVariant returnedValue;
+QVariant msg = "Hello from C++";
+QMetaObject::invokeMethod(object, "myQmlFunction",
+        Q_RETURN_ARG(QVariant, returnedValue),
+        Q_ARG(QVariant, msg));
+
+qDebug() << "QML function returned:" << returnedValue.toString();
+delete object;
+//![0]
+}
+
diff --git a/doc/src/snippets/declarative/qtbinding/loading/MyItem.qml b/doc/src/snippets/declarative/qtbinding/loading/MyItem.qml
new file mode 100644
index 0000000..40138f6
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/loading/MyItem.qml
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//![start]
+import QtQuick 1.0
+
+Item {
+    width: 100; height: 100
+//![start]
+
+//![child]
+    Rectangle {
+        anchors.fill: parent
+        objectName: "rect"
+    }
+//![child]
+
+//![end]
+}
+//![end]
diff --git a/doc/src/snippets/declarative/qtbinding/loading/loading.pro b/doc/src/snippets/declarative/qtbinding/loading/loading.pro
new file mode 100644
index 0000000..68eeaf2
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/loading/loading.pro
@@ -0,0 +1,2 @@
+QT += declarative
+SOURCES += main.cpp
diff --git a/doc/src/snippets/declarative/qtbinding/loading/main.cpp b/doc/src/snippets/declarative/qtbinding/loading/main.cpp
new file mode 100644
index 0000000..bd400b0
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/loading/main.cpp
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore>
+#include <QtDeclarative>
+
+static void withComponent()
+{
+//![QDeclarativeComponent-a]
+// Using QDeclarativeComponent
+QDeclarativeEngine engine;
+QDeclarativeComponent component(&engine,
+        QUrl::fromLocalFile("MyItem.qml"));
+QObject *object = component.create();
+//![QDeclarativeComponent-a]
+}
+
+int main(int argc, char *argv[])
+{
+    QApplication app(argc, argv);
+
+//![QDeclarativeView]
+// Using QDeclarativeView
+QDeclarativeView view;
+view.setSource(QUrl::fromLocalFile("MyItem.qml"));
+view.show();
+QObject *object = view.rootObject();
+//![QDeclarativeView]
+
+//![properties]
+object->setProperty("width", 500);
+QDeclarativeProperty(object, "width").write(500);
+//![properties]
+
+//![cast]
+QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(object);
+item->setWidth(500);
+//![cast]
+
+//![findChild]
+QObject *rect = object->findChild<QObject*>("rect");
+if (rect)
+    rect->setProperty("color", "red");
+//![findChild]
+
+//![QDeclarativeComponent-b]
+delete object;
+//![QDeclarativeComponent-b]
+
+withComponent();
+
+    return app.exec();
+}
+
diff --git a/doc/src/snippets/declarative/qtbinding/newelements/imageviewer.h b/doc/src/snippets/declarative/qtbinding/newelements/imageviewer.h
new file mode 100644
index 0000000..fd9db5e
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/newelements/imageviewer.h
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore>
+#include <QtDeclarative>
+
+//![0]
+class ImageViewer : public QDeclarativeItem
+{
+    Q_OBJECT
+    Q_PROPERTY(QUrl image READ image WRITE setImage NOTIFY imageChanged)
+
+public:
+    void setImage(const QUrl &url);
+    QUrl image() const;
+
+signals:
+    void imageChanged();
+};
+//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/newelements/main.cpp b/doc/src/snippets/declarative/qtbinding/newelements/main.cpp
new file mode 100644
index 0000000..57994ca
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/newelements/main.cpp
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore>
+#include <QtDeclarative>
+
+#include "imageviewer.h"
+
+void ImageViewer::setImage(const QUrl &url) {}
+QUrl ImageViewer::image() const { return QUrl(); }
+
+int main(int argc, char *argv[])
+{
+    QApplication app(argc, argv);
+
+    //![register]
+    qmlRegisterType<ImageViewer>("MyLibrary", 1, 0, "ImageViewer");
+    //![register]
+
+    QDeclarativeView view;
+    view.setSource(QUrl::fromLocalFile("standalone.qml"));
+    view.show();
+
+    return app.exec();
+}
+
diff --git a/doc/src/snippets/declarative/qtbinding/newelements/newelements.pro b/doc/src/snippets/declarative/qtbinding/newelements/newelements.pro
new file mode 100644
index 0000000..82bc123
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/newelements/newelements.pro
@@ -0,0 +1,3 @@
+QT += declarative
+SOURCES += main.cpp
+HEADERS += imageviewer.h
diff --git a/doc/src/snippets/declarative/qtbinding/newelements/standalone.qml b/doc/src/snippets/declarative/qtbinding/newelements/standalone.qml
new file mode 100644
index 0000000..7345f21
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/newelements/standalone.qml
@@ -0,0 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//![0]
+import MyLibrary 1.0
+
+ImageViewer { image: "smile.png" }
+//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/properties-cpp/MyItem.qml b/doc/src/snippets/declarative/qtbinding/properties-cpp/MyItem.qml
new file mode 100644
index 0000000..9db4b93
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/properties-cpp/MyItem.qml
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//![0]
+// MyItem.qml
+import QtQuick 1.0
+
+Rectangle {
+    width: 100; height: 100
+    color: applicationData.backgroundColor
+
+    MouseArea {
+        anchors.fill: parent
+        onClicked: applicationData.backgroundColor = "red"
+    }
+}
+//![0]
+
diff --git a/doc/src/snippets/declarative/qtbinding/properties-cpp/applicationdata.h b/doc/src/snippets/declarative/qtbinding/properties-cpp/applicationdata.h
new file mode 100644
index 0000000..763a451
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/properties-cpp/applicationdata.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QObject>
+#include <QColor>
+
+//![0]
+class ApplicationData : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(QColor backgroundColor
+            READ backgroundColor
+            WRITE setBackgroundColor
+            NOTIFY backgroundColorChanged)
+
+public:
+    void setBackgroundColor(const QColor &c) {
+        if (c != m_color) {
+            m_color = c;
+            emit backgroundColorChanged();
+        }
+    }
+
+    QColor backgroundColor() const {
+        return m_color;
+    }
+
+signals:
+    void backgroundColorChanged();
+
+private:
+    QColor m_color;
+};
+//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/properties-cpp/main.cpp b/doc/src/snippets/declarative/qtbinding/properties-cpp/main.cpp
new file mode 100644
index 0000000..36b508d
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/properties-cpp/main.cpp
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore>
+#include <QtDeclarative>
+
+#include "applicationdata.h"
+
+int main(int argc, char *argv[]) {
+    QApplication app(argc, argv);
+
+    QDeclarativeView view;
+
+    ApplicationData data;
+    view.rootContext()->setContextProperty("applicationData", &data);
+
+    view.setSource(QUrl::fromLocalFile("MyItem.qml"));
+    view.show();
+
+    return app.exec();
+}
+
diff --git a/doc/src/snippets/declarative/qtbinding/properties-cpp/properties-cpp.pro b/doc/src/snippets/declarative/qtbinding/properties-cpp/properties-cpp.pro
new file mode 100644
index 0000000..188a9fb
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/properties-cpp/properties-cpp.pro
@@ -0,0 +1,3 @@
+QT += declarative
+SOURCES += main.cpp
+HEADERS += applicationdata.h
diff --git a/doc/src/snippets/declarative/qtbinding/properties-qml/MyItem.qml b/doc/src/snippets/declarative/qtbinding/properties-qml/MyItem.qml
new file mode 100644
index 0000000..a43ded8
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/properties-qml/MyItem.qml
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//![0]
+// MyItem.qml
+import QtQuick 1.0
+
+Item {
+    property int someNumber: 100
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/properties-qml/main.cpp b/doc/src/snippets/declarative/qtbinding/properties-qml/main.cpp
new file mode 100644
index 0000000..d8daff8
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/properties-qml/main.cpp
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore>
+#include <QtDeclarative>
+
+int main(int argc, char *argv[])
+{
+    QApplication app(argc, argv);
+
+//![0]
+QDeclarativeEngine engine;
+QDeclarativeComponent component(&engine, "MyItem.qml");
+QObject *object = component.create();
+
+qDebug() << "Property value:" << QDeclarativeProperty::read(object, "someNumber").toInt();
+QDeclarativeProperty::write(object, "someNumber", 5000);
+
+qDebug() << "Property value:" << object->property("someNumber").toInt();
+object->setProperty("someNumber", 100);
+//![0]
+
+    return app.exec();
+}
+
diff --git a/doc/src/snippets/declarative/qtbinding/properties-qml/properties-qml.pro b/doc/src/snippets/declarative/qtbinding/properties-qml/properties-qml.pro
new file mode 100644
index 0000000..68eeaf2
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/properties-qml/properties-qml.pro
@@ -0,0 +1,2 @@
+QT += declarative
+SOURCES += main.cpp
diff --git a/doc/src/snippets/declarative/qtbinding/resources/main.qml b/doc/src/snippets/declarative/qtbinding/resources/main.qml
index 644d963..43029cf 100644
--- a/doc/src/snippets/declarative/qtbinding/resources/main.qml
+++ b/doc/src/snippets/declarative/qtbinding/resources/main.qml
@@ -39,9 +39,8 @@
 ****************************************************************************/
 
 //![0]
+// main.qml
 import QtQuick 1.0
 
-Image {
-    source: "images/background.png"
-}
+Image { source: "images/background.png" }
 //![0]
diff --git a/doc/src/snippets/declarative/qtbinding/signals-cpp/MyItem.qml b/doc/src/snippets/declarative/qtbinding/signals-cpp/MyItem.qml
new file mode 100644
index 0000000..d900830
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/signals-cpp/MyItem.qml
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//![0]
+// MyItem.qml
+import QtQuick 1.0
+
+Item {
+    Connections {
+        target: imageViewer
+        onImageChanged: console.log("Image has changed!")
+    }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/signals-cpp/imageviewer.h b/doc/src/snippets/declarative/qtbinding/signals-cpp/imageviewer.h
new file mode 100644
index 0000000..7288d11
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/signals-cpp/imageviewer.h
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore>
+#include <QtDeclarative>
+
+//![start]
+class ImageViewer : public QDeclarativeItem
+{
+    Q_OBJECT
+    Q_PROPERTY(QUrl image READ image WRITE setImage NOTIFY imageChanged)
+public:
+//![start]
+    ImageViewer(QDeclarativeItem *item = 0);
+
+    void setImage(const QUrl &url) {}
+    QUrl image() const { return QUrl(); }
+
+public slots:
+    void emitSignals();
+
+//![end]
+signals:
+    void imageChanged();
+    void loadingError(const QString &errorMsg);
+};
+//![end]
+
diff --git a/doc/src/snippets/declarative/qtbinding/signals-cpp/main.cpp b/doc/src/snippets/declarative/qtbinding/signals-cpp/main.cpp
new file mode 100644
index 0000000..e5dd33c
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/signals-cpp/main.cpp
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore>
+#include <QtDeclarative>
+
+#include "imageviewer.h"
+
+
+ImageViewer::ImageViewer(QDeclarativeItem *item)
+    : QDeclarativeItem(item)
+{
+    QTimer::singleShot(0, this, SLOT(emitSignals()));
+}
+
+void ImageViewer::emitSignals()
+{
+    emit imageChanged();
+    emit loadingError("some error message");
+}
+
+int main(int argc, char *argv[])
+{
+    QApplication app(argc, argv);
+
+    qmlRegisterType<ImageViewer>("MyLibrary", 1, 0, "ImageViewer");
+
+    QDeclarativeView standalone;
+    standalone.setSource(QUrl::fromLocalFile("standalone.qml"));
+    standalone.show();
+
+//![connections]
+ImageViewer viewer;
+
+QDeclarativeView view;
+view.rootContext()->setContextProperty("imageViewer", &viewer);
+
+view.setSource(QUrl::fromLocalFile("MyItem.qml"));
+view.show();
+//![connections]
+
+    return app.exec();
+}
+
+
diff --git a/doc/src/snippets/declarative/qtbinding/signals-cpp/signals-cpp.pro b/doc/src/snippets/declarative/qtbinding/signals-cpp/signals-cpp.pro
new file mode 100644
index 0000000..9aa8702
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/signals-cpp/signals-cpp.pro
@@ -0,0 +1,3 @@
+QT += declarative
+SOURCES += main.cpp
+HEADERS += "imageviewer.h"
diff --git a/doc/src/snippets/declarative/qtbinding/signals-cpp/standalone.qml b/doc/src/snippets/declarative/qtbinding/signals-cpp/standalone.qml
new file mode 100644
index 0000000..4027b19
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/signals-cpp/standalone.qml
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import MyLibrary 1.0
+
+//![0]
+ImageViewer {
+    onImageChanged: console.log("Image changed!")
+    onLoadingError: console.log("Image failed to load:", errorMsg)
+}
+//![0]
+
diff --git a/doc/src/snippets/declarative/qtbinding/signals-qml/MyItem.qml b/doc/src/snippets/declarative/qtbinding/signals-qml/MyItem.qml
new file mode 100644
index 0000000..e4b6ced
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/signals-qml/MyItem.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//![0]
+// MyItem.qml
+import QtQuick 1.0
+
+Item {
+    id: item
+    width: 100; height: 100
+
+    signal qmlSignal(string msg)
+
+    MouseArea {
+        anchors.fill: parent
+        onClicked: item.qmlSignal("Hello from QML")
+    }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/signals-qml/main.cpp b/doc/src/snippets/declarative/qtbinding/signals-qml/main.cpp
new file mode 100644
index 0000000..f1d03c4
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/signals-qml/main.cpp
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QtCore>
+#include <QtDeclarative>
+
+//![0]
+int main(int argc, char *argv[]) {
+    QApplication app(argc, argv);
+
+    QDeclarativeView view(QUrl::fromLocalFile("MyItem.qml"));
+    QObject *item = view.rootObject();
+
+    MyClass myClass;
+    QObject::connect(item, SIGNAL(qmlSignal(QString)),
+                     &myClass, SLOT(cppSlot(QString)));
+
+    view.show();
+    return app.exec();
+}
+//![0]
+
+#include "moc_main.cpp"
diff --git a/doc/src/snippets/declarative/qtbinding/signals-qml/myclass.h b/doc/src/snippets/declarative/qtbinding/signals-qml/myclass.h
new file mode 100644
index 0000000..c326a54
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/signals-qml/myclass.h
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+**     the names of its contributors may be used to endorse or promote
+**     products derived from this software without specific prior written
+**     permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include <QObject>
+#include <QDebug>
+//![0]
+class MyClass : public QObject
+{
+    Q_OBJECT
+public slots:
+    void cppSlot(const QString &msg) {
+        qDebug() << "Called the C++ slot with message:" << msg;
+    }
+};
+//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/signals-qml/signals-qml.pro b/doc/src/snippets/declarative/qtbinding/signals-qml/signals-qml.pro
new file mode 100644
index 0000000..01066c1
--- /dev/null
+++ b/doc/src/snippets/declarative/qtbinding/signals-qml/signals-qml.pro
@@ -0,0 +1,3 @@
+QT += declarative
+SOURCES += main.cpp
+HEADERS += myclass.h
diff --git a/doc/src/snippets/declarative/qtbinding/stopwatch/main.cpp b/doc/src/snippets/declarative/qtbinding/stopwatch/main.cpp
deleted file mode 100644
index 12481da..0000000
--- a/doc/src/snippets/declarative/qtbinding/stopwatch/main.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-**   * Redistributions of source code must retain the above copyright
-**     notice, this list of conditions and the following disclaimer.
-**   * Redistributions in binary form must reproduce the above copyright
-**     notice, this list of conditions and the following disclaimer in
-**     the documentation and/or other materials provided with the
-**     distribution.
-**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
-**     the names of its contributors may be used to endorse or promote
-**     products derived from this software without specific prior written
-**     permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "stopwatch.h"
-
-#include <QDeclarativeView>
-#include <QDeclarativeContext>
-#include <QApplication>
-
-//![0]
-int main(int argc, char *argv[])
-{
-    QApplication app(argc, argv);
-
-    QDeclarativeView view;
-    view.rootContext()->setContextProperty("stopwatch",
-                                           new Stopwatch);
-
-    view.setSource(QUrl::fromLocalFile("main.qml"));
-    view.show();
-
-    return app.exec();
-}
-//![0]
-
diff --git a/doc/src/snippets/declarative/qtbinding/stopwatch/main.qml b/doc/src/snippets/declarative/qtbinding/stopwatch/main.qml
deleted file mode 100644
index f894f71..0000000
--- a/doc/src/snippets/declarative/qtbinding/stopwatch/main.qml
+++ /dev/null
@@ -1,58 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-**   * Redistributions of source code must retain the above copyright
-**     notice, this list of conditions and the following disclaimer.
-**   * Redistributions in binary form must reproduce the above copyright
-**     notice, this list of conditions and the following disclaimer in
-**     the documentation and/or other materials provided with the
-**     distribution.
-**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
-**     the names of its contributors may be used to endorse or promote
-**     products derived from this software without specific prior written
-**     permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//![0]
-import QtQuick 1.0
-
-Rectangle {
-    width: 300
-    height: 300
-
-    MouseArea {
-        anchors.fill: parent
-        onClicked: {
-            if (stopwatch.isRunning())
-                stopwatch.stop()
-            else
-                stopwatch.start();
-        }
-    }
-}
-//![0]
diff --git a/doc/src/snippets/declarative/qtbinding/stopwatch/stopwatch.cpp b/doc/src/snippets/declarative/qtbinding/stopwatch/stopwatch.cpp
deleted file mode 100644
index 124422f..0000000
--- a/doc/src/snippets/declarative/qtbinding/stopwatch/stopwatch.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-**   * Redistributions of source code must retain the above copyright
-**     notice, this list of conditions and the following disclaimer.
-**   * Redistributions in binary form must reproduce the above copyright
-**     notice, this list of conditions and the following disclaimer in
-**     the documentation and/or other materials provided with the
-**     distribution.
-**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
-**     the names of its contributors may be used to endorse or promote
-**     products derived from this software without specific prior written
-**     permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "stopwatch.h"
-
-Stopwatch::Stopwatch()
-    : m_running(false)
-{
-}
-
-bool Stopwatch::isRunning() const
-{
-    return m_running;
-}
-
-void Stopwatch::start()
-{
-    m_running = true;
-}
-
-void Stopwatch::stop()
-{
-    m_running = false;
-}
-
diff --git a/doc/src/snippets/declarative/qtbinding/stopwatch/stopwatch.h b/doc/src/snippets/declarative/qtbinding/stopwatch/stopwatch.h
deleted file mode 100644
index fd65916..0000000
--- a/doc/src/snippets/declarative/qtbinding/stopwatch/stopwatch.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-**   * Redistributions of source code must retain the above copyright
-**     notice, this list of conditions and the following disclaimer.
-**   * Redistributions in binary form must reproduce the above copyright
-**     notice, this list of conditions and the following disclaimer in
-**     the documentation and/or other materials provided with the
-**     distribution.
-**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
-**     the names of its contributors may be used to endorse or promote
-**     products derived from this software without specific prior written
-**     permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QObject>
-
-//![0]
-class Stopwatch : public QObject
-{
-    Q_OBJECT
-public:
-    Stopwatch();
-    
-    Q_INVOKABLE bool isRunning() const;
-    
-public slots:
-    void start();
-    void stop();
-
-private:
-    bool m_running;
-};
-
-//![0]
-
diff --git a/doc/src/snippets/declarative/qtbinding/stopwatch/stopwatch.pro b/doc/src/snippets/declarative/qtbinding/stopwatch/stopwatch.pro
deleted file mode 100644
index d803e6a..0000000
--- a/doc/src/snippets/declarative/qtbinding/stopwatch/stopwatch.pro
+++ /dev/null
@@ -1,3 +0,0 @@
-QT += declarative
-HEADERS += stopwatch.h
-SOURCES += main.cpp stopwatch.cpp
diff --git a/src/declarative/qml/qdeclarativecomponent.cpp b/src/declarative/qml/qdeclarativecomponent.cpp
index 0a2a6db..2686ce3 100644
--- a/src/declarative/qml/qdeclarativecomponent.cpp
+++ b/src/declarative/qml/qdeclarativecomponent.cpp
@@ -98,6 +98,43 @@ class QByteArray;
     int width = item->width();  // width = 200
     \endcode
 
+
+    \section2 Network Components
+
+    If the URL passed to QDeclarativeComponent is a network resource, or if the QML document references a
+    network resource, the QDeclarativeComponent has to fetch the network data before it is able to create
+    objects.  In this case, the QDeclarativeComponent will have a \l {QDeclarativeComponent::Loading}{Loading}
+    \l {QDeclarativeComponent::status()}{status}.  An application will have to wait until the component
+    is \l {QDeclarativeComponent::Ready}{Ready} before calling \l {QDeclarativeComponent::create()}.
+
+    The following example shows how to load a QML file from a network resource.  After creating
+    the QDeclarativeComponent, it tests whether the component is loading.  If it is, it connects to the
+    QDeclarativeComponent::statusChanged() signal and otherwise calls the \c {continueLoading()} method
+    directly. Note that QDeclarativeComponent::isLoading() may be false for a network component if the
+    component has been cached and is ready immediately.
+
+    \code
+    MyApplication::MyApplication()
+    {
+        // ...
+        component = new QDeclarativeComponent(engine, QUrl("http://www.example.com/main.qml"));
+        if (component->isLoading())
+            QObject::connect(component, SIGNAL(statusChanged(QDeclarativeComponent::Status)),
+                             this, SLOT(continueLoading()));
+        else
+            continueLoading();
+    }
+
+    void MyApplication::continueLoading()
+    {
+        if (component->isError()) {
+            qWarning() << component->errors();
+        } else {
+            QObject *myObject = component->create();
+        }
+    }
+    \endcode
+
     \sa {Using QML in C++ Applications}, {Integrating QML with existing Qt UI code}
 */
 
diff --git a/src/declarative/qml/qdeclarativecontext.cpp b/src/declarative/qml/qdeclarativecontext.cpp
index 59d5cfa..1e58a71 100644
--- a/src/declarative/qml/qdeclarativecontext.cpp
+++ b/src/declarative/qml/qdeclarativecontext.cpp
@@ -86,9 +86,14 @@ QDeclarativeContextPrivate::QDeclarativeContextPrivate()
 
     QDeclarativeComponent component(&engine);
     component.setData("import QtQuick 1.0\nListView { model: myModel }", QUrl());
-    component.create(context);
+    QObject *window = component.create(context);
     \endcode
 
+    Note it is the responsibility of the creator to delete any QDeclarativeContext it
+    constructs. If the \c context object in the example is no longer needed when the
+    \c window component instance is destroyed, the \c context must be destroyed explicitly.
+    The simplest way to ensure this is to set \c window as the parent of \c context.
+
     To simplify binding and maintaining larger data sets, a context object can be set
     on a QDeclarativeContext.  All the properties of the context object are available
     by name in the context, as though they were all individually added through calls
@@ -119,11 +124,13 @@ QDeclarativeContextPrivate::QDeclarativeContextPrivate()
     All properties added explicitly by QDeclarativeContext::setContextProperty() take 
     precedence over the context object's properties.
 
-    Contexts form a hierarchy.  The root of this hierarchy is the QDeclarativeEngine's
-    \l {QDeclarativeEngine::rootContext()}{root context}.  A component instance can 
-    access the data in its own context, as well as all its ancestor contexts.  Data
-    can be made available to all instances by modifying the 
-    \l {QDeclarativeEngine::rootContext()}{root context}.
+    \section2 The Context Hierarchy
+
+    Contexts form a hierarchy. The root of this hierarchy is the QML engine's
+    \l {QDeclarativeEngine::rootContext()}{root context}. Child contexts inherit
+    the context properties of their parents; if a child context sets a context property
+    that already exists in its parent, the new context property overrides that of the
+    parent.
 
     The following example defines two contexts - \c context1 and \c context2.  The
     second context overrides the "b" context property inherited from the first with a
@@ -144,7 +151,7 @@ QDeclarativeContextPrivate::QDeclarativeContextPrivate()
     context, their bindings are.  If a context is destroyed, the property bindings of 
     outstanding QML objects will stop evaluating.
 
-    \note Setting the context object or adding new context properties after an object
+    \warning Setting the context object or adding new context properties after an object
     has been created in that context is an expensive operation (essentially forcing all bindings
     to reevaluate). Thus whenever possible you should complete "setup" of the context
     before using it to create any objects.
diff --git a/tests/auto/declarative/examples/tst_examples.cpp b/tests/auto/declarative/examples/tst_examples.cpp
index cff0b46..0c7f8fb 100644
--- a/tests/auto/declarative/examples/tst_examples.cpp
+++ b/tests/auto/declarative/examples/tst_examples.cpp
@@ -86,6 +86,7 @@ tst_examples::tst_examples()
 
     // Add directories you want excluded here
     excludedDirs << "doc/src/snippets/declarative/visualdatamodel_rootindex";
+    excludedDirs << "doc/src/snippets/declarative/qtbinding";
 
 #ifdef QT_NO_WEBKIT
     excludedDirs << "examples/declarative/modelviews/webview";
-- 
cgit v0.12


From eedb9980c89e77e21e1336195930a148b6a2e712 Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Thu, 4 Nov 2010 16:05:30 +1000
Subject: Fix errors in example code. Also reverts the example code to the old
 list format.

Task-number: QTBUG-14871
---
 src/declarative/graphicsitems/qdeclarativeimage.cpp  | 16 +++++++++-------
 src/declarative/graphicsitems/qdeclarativeloader.cpp | 16 +++++++++-------
 src/declarative/util/qdeclarativefontloader.cpp      | 16 +++++++++-------
 3 files changed, 27 insertions(+), 21 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativeimage.cpp b/src/declarative/graphicsitems/qdeclarativeimage.cpp
index 08d237f..1f1e93d 100644
--- a/src/declarative/graphicsitems/qdeclarativeimage.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeimage.cpp
@@ -288,23 +288,25 @@ qreal QDeclarativeImage::paintedHeight() const
     Use this status to provide an update or respond to the status change in some way.
     For example, you could:
 
-    \e {Trigger a state change:}
-    \qml 
-        State { name: 'loaded'; when: image.status = Image.Ready }
+    \list
+    \o Trigger a state change:
+    \qml
+        State { name: 'loaded'; when: image.status == Image.Ready }
     \endqml
 
-    \e {Implement an \c onStatusChanged signal handler:}
-    \qml 
+    \o Implement an \c onStatusChanged signal handler:
+    \qml
         Image {
             id: image
             onStatusChanged: if (image.status == Image.Ready) console.log('Loaded')
         }
     \endqml
 
-    \e {Bind to the status value:}
+    \o Bind to the status value:
     \qml
-        Text { text: image.status != Image.Ready ? 'Not Loaded' : 'Loaded' }
+        Text { text: image.status == Image.Ready ? 'Loaded' : 'Not loaded' }
     \endqml
+    \endlist
 
     \sa progress
 */
diff --git a/src/declarative/graphicsitems/qdeclarativeloader.cpp b/src/declarative/graphicsitems/qdeclarativeloader.cpp
index 7777567..109fbbb 100644
--- a/src/declarative/graphicsitems/qdeclarativeloader.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeloader.cpp
@@ -395,23 +395,25 @@ void QDeclarativeLoaderPrivate::_q_sourceLoaded()
     Use this status to provide an update or respond to the status change in some way.
     For example, you could:
 
-    \e {Trigger a state change:}
-    \qml 
-        State { name: 'loaded'; when: loader.status = Loader.Ready }
+    \list
+    \o Trigger a state change:
+    \qml
+        State { name: 'loaded'; when: loader.status == Loader.Ready }
     \endqml
 
-    \e {Implement an \c onStatusChanged signal handler:}
-    \qml 
+    \o Implement an \c onStatusChanged signal handler:
+    \qml
         Loader {
             id: loader
             onStatusChanged: if (loader.status == Loader.Ready) console.log('Loaded')
         }
     \endqml
 
-    \e {Bind to the status value:}
+    \o Bind to the status value:
     \qml
-        Text { text: loader.status != Loader.Ready ? 'Not Loaded' : 'Loaded' }
+        Text { text: loader.status == Loader.Ready ? 'Loaded' : 'Not loaded' }
     \endqml
+    \endlist
 
     Note that if the source is a local file, the status will initially be Ready (or Error). While
     there will be no onStatusChanged signal in that case, the onLoaded will still be invoked.
diff --git a/src/declarative/util/qdeclarativefontloader.cpp b/src/declarative/util/qdeclarativefontloader.cpp
index 9fee257..03a0561 100644
--- a/src/declarative/util/qdeclarativefontloader.cpp
+++ b/src/declarative/util/qdeclarativefontloader.cpp
@@ -297,23 +297,25 @@ void QDeclarativeFontLoader::setName(const QString &name)
     Use this status to provide an update or respond to the status change in some way.
     For example, you could:
 
-    \e {Trigger a state change:}
-    \qml 
-        State { name: 'loaded'; when: loader.status = FontLoader.Ready }
+    \list
+    \o Trigger a state change:
+    \qml
+        State { name: 'loaded'; when: loader.status == FontLoader.Ready }
     \endqml
 
-    \e {Implement an \c onStatusChanged signal handler:}
-    \qml 
+    \o Implement an \c onStatusChanged signal handler:
+    \qml
         FontLoader {
             id: loader
             onStatusChanged: if (loader.status == FontLoader.Ready) console.log('Loaded')
         }
     \endqml
 
-    \e {Bind to the status value:}
+    \o Bind to the status value:
     \qml
-        Text { text: loader.status != FontLoader.Ready ? 'Not Loaded' : 'Loaded' }
+        Text { text: loader.status == FontLoader.Ready ? 'Loaded' : 'Not loaded' }
     \endqml
+    \endlist
 */
 QDeclarativeFontLoader::Status QDeclarativeFontLoader::status() const
 {
-- 
cgit v0.12


From 693a1dd90dc2e5a9ba7aabed5fcc3984e7440ba9 Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Thu, 4 Nov 2010 16:19:25 +1000
Subject: Maintain passing visualtests on X11

springanimation/follow.qml has had updated visuals, unknown cause.
the text tests were committed without an actual testcase, now added
the 'skip' property has now been documented in the tst_qmlvisual help

Task-number: QTBUG-14792
---
 .../qdeclarativespringanimation/data/follow.qml    |   6 +-
 .../qdeclarativetext/data-X11/qtbug_14865.0.png    | Bin 0 -> 1400 bytes
 .../qdeclarativetext/data-X11/qtbug_14865.qml      | 447 +++++++++++++++++++++
 .../qdeclarativetext/data/qtbug_14865.0.png        | Bin 0 -> 1400 bytes
 .../qdeclarativetext/data/qtbug_14865.qml          | 447 +++++++++++++++++++++
 .../font/data-X11/plaintext2.0.png                 | Bin 0 -> 2778 bytes
 .../qdeclarativetext/font/data-X11/plaintext2.qml  |  11 +
 .../qdeclarativetext/font/data/plaintext2.0.png    | Bin 0 -> 2778 bytes
 .../qdeclarativetext/font/data/plaintext2.qml      |  11 +
 tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp |   6 +
 10 files changed, 925 insertions(+), 3 deletions(-)
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/data/qtbug_14865.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/data/qtbug_14865.qml
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.qml
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext2.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext2.qml

diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml
index e5c55a4..a688563 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml
@@ -450,7 +450,7 @@ VisualTest {
     }
     Frame {
         msec: 1760
-        hash: "2c01571e523002166ba6ec476bc8a68b"
+        hash: "b2b4b3de77e2b7fd58d3da1ad52355a9"
     }
     Frame {
         msec: 1776
@@ -1554,7 +1554,7 @@ VisualTest {
     }
     Frame {
         msec: 6144
-        hash: "0506667a14ace4e2edf04956c137e217"
+        hash: "8cd5edce652013a2ed4bf95693259538"
     }
     Frame {
         msec: 6160
@@ -1731,7 +1731,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 0
+        modifiers: 67108864
         text: ""
         autorep: false
         count: 1
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.0.png
new file mode 100644
index 0000000..a4bae3a
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml
new file mode 100644
index 0000000..a470a66
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml
@@ -0,0 +1,447 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 32
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 48
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 64
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 80
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 96
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 112
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 128
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 144
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 160
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 176
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 192
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 208
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 224
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 240
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 256
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 272
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 288
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 304
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 320
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 336
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 352
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 368
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 384
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 400
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 416
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 432
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 448
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 464
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 480
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 496
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 512
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 528
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 544
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 560
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 576
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 592
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 608
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 624
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 640
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 656
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 672
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 688
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 704
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 720
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 736
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 752
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 768
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 784
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 800
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 816
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 832
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 848
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 864
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 880
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 896
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 912
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 928
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 944
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 960
+        image: "qtbug_14865.0.png"
+    }
+    Frame {
+        msec: 976
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 992
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 1008
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 1024
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1040
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1056
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1072
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1088
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1104
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1120
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1136
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1152
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1168
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1184
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1200
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1216
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1232
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1248
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1264
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1280
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1296
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1312
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1328
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1344
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1360
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1376
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1392
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1408
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1424
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1440
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1456
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1472
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1488
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1504
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1520
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1536
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1552
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1568
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1584
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1600
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1616
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1632
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1648
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1664
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1680
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1696
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1712
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1728
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1744
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1760
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data/qtbug_14865.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/data/qtbug_14865.0.png
new file mode 100644
index 0000000..a4bae3a
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/data/qtbug_14865.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data/qtbug_14865.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/data/qtbug_14865.qml
new file mode 100644
index 0000000..a470a66
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/data/qtbug_14865.qml
@@ -0,0 +1,447 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 32
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 48
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 64
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 80
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 96
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 112
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 128
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 144
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 160
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 176
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 192
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 208
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 224
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 240
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 256
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 272
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 288
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 304
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 320
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 336
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 352
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 368
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 384
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 400
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 416
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 432
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 448
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 464
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 480
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 496
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 512
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 528
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 544
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 560
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 576
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 592
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 608
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 624
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 640
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 656
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 672
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 688
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 704
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 720
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 736
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 752
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 768
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 784
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 800
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 816
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 832
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 848
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 864
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 880
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 896
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 912
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 928
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 944
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 960
+        image: "qtbug_14865.0.png"
+    }
+    Frame {
+        msec: 976
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 992
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 1008
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+    }
+    Frame {
+        msec: 1024
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1040
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1056
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1072
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1088
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1104
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1120
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1136
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1152
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1168
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1184
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1200
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1216
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1232
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1248
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1264
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1280
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1296
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1312
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1328
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1344
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1360
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1376
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1392
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1408
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1424
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1440
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1456
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1472
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1488
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1504
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1520
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1536
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1552
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1568
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1584
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1600
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1616
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1632
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1648
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1664
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1680
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1696
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1712
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1728
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1744
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+    Frame {
+        msec: 1760
+        hash: "eee4600ac08b458ac7ac2320e225674c"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.0.png
new file mode 100644
index 0000000..0574f63
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.qml
new file mode 100644
index 0000000..f6cddc4
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        image: "plaintext2.0.png"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext2.0.png
new file mode 100644
index 0000000..0574f63
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext2.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext2.qml
new file mode 100644
index 0000000..f6cddc4
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext2.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        image: "plaintext2.0.png"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp b/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp
index b52b430..81404ea 100644
--- a/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp
+++ b/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp
@@ -345,6 +345,12 @@ void usage()
         "If you ONLY wish to use the 'error' property, you can record your test with\n"
         "-recordnovisuals, or discard existing visuals with -removevisuals; the test\n"
         "will then only fail on a syntax error, crash, or non-empty 'error' property.\n"
+        "\n"
+        "If your test has anything set to the 'skip' property on the root object then\n"
+        "test failures will be ignored. This allows for an opt-out of automated\n"
+        "aggregation of test results. The value of the 'skip' property (usually a\n"
+        "string) will then be printed to stdout when the test is run as part of the\n"
+        "message saying the test has been skipped.\n"
     );
 }
 
-- 
cgit v0.12


From 893e2fdc16976085092d09eb65d9650ce471af3f Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Thu, 4 Nov 2010 17:02:32 +1000
Subject: Add documentation about script evaluation context and allowed types

Task-number: QTBUG-14919
---
 src/declarative/qml/qdeclarativeworkerscript.cpp | 30 ++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)

diff --git a/src/declarative/qml/qdeclarativeworkerscript.cpp b/src/declarative/qml/qdeclarativeworkerscript.cpp
index 789116e..be7ea0e 100644
--- a/src/declarative/qml/qdeclarativeworkerscript.cpp
+++ b/src/declarative/qml/qdeclarativeworkerscript.cpp
@@ -514,7 +514,7 @@ void QDeclarativeWorkerScriptEngine::run()
 
 /*!
     \qmlclass WorkerScript QDeclarativeWorkerScript
-  \ingroup qml-utility-elements
+    \ingroup qml-utility-elements
     \brief The WorkerScript element enables the use of threads in QML.
 
     Use WorkerScript to run operations in a new thread.
@@ -528,7 +528,7 @@ void QDeclarativeWorkerScriptEngine::run()
 
     \snippet doc/src/snippets/declarative/workerscript.qml 0
 
-    The above worker script specifies a javascript file, "script.js", that handles
+    The above worker script specifies a JavaScript file, "script.js", that handles
     the operations to be performed in the new thread. Here is \c script.js:
 
     \qml
@@ -543,6 +543,19 @@ void QDeclarativeWorkerScriptEngine::run()
     \tt script.js. This in turn sends a reply message that is then received
     by the \tt onMessage() handler of \tt myWorker.
 
+
+    \section3 Restrictions
+
+    Since the \c WorkerScript.onMessage() function is run in a separate thread, the
+    JavaScript file is evaluated in a context separate from the main QML engine. This means
+    that unlike an ordinary JavaScript file that is imported into QML, the \c script.js
+    in the above example cannot access the properties, methods or other attributes
+    of the QML item, nor can it access any context properties set on the QML object
+    through QDeclarativeContext.
+
+    Additionally, there are restrictions on the types of values that can be passed to and
+    from the worker script. See the sendMessage() documentation for details.
+
     \sa {declarative/threading/workerscript}{WorkerScript example},
         {declarative/threading/threadedlistmodel}{Threaded ListModel example}
 */
@@ -586,6 +599,19 @@ void QDeclarativeWorkerScript::setSource(const QUrl &source)
     Sends the given \a message to a worker script handler in another
     thread. The other worker script handler can receive this message
     through the onMessage() handler.
+
+    The \c message object may only contain values of the following
+    types:
+
+    \list
+    \o boolean, number, string
+    \o JavaScript objects and arrays
+    \o ListModel objects (any other type of QObject* is not allowed)
+    \endlist
+
+    All objects and arrays are copied to the \c message. With the exception
+    of ListModel objects, any modifications by the other thread to an object
+    passed in \c message will not be reflected in the original object.
 */
 void QDeclarativeWorkerScript::sendMessage(const QScriptValue &message)
 {
-- 
cgit v0.12


From d5ed9ed21b67b6e5e884e7c87fabc096b8c677a2 Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Thu, 4 Nov 2010 18:01:36 +1000
Subject: Make qmlvisual tests more stable

Text elements now use shared components that have the same default
values, instead of using the system defaults (that can vary between
computers). This also removes text edit/input cursor blinking.

Task-number: QTBUG-14792
---
 .../qdeclarativetext/align/multilineAlign.qml      |   3 +-
 .../qdeclarativetext/baseline/parentanchor.qml     |   5 +-
 .../qdeclarativetext/bugs/QTBUG-14469.qml          |   1 +
 .../qdeclarativetext/elide/data-X11/elide.0.png    | Bin 1167 -> 1150 bytes
 .../qdeclarativetext/elide/data-X11/elide.qml      | 132 +++---
 .../elide/data-X11/multilength.qml                 |  66 +--
 .../qmlvisual/qdeclarativetext/elide/elide.qml     |   9 +-
 .../qmlvisual/qdeclarativetext/elide/elide2.qml    |   3 +-
 .../qdeclarativetext/elide/multilength.qml         |   3 +-
 .../qdeclarativetext/font/data-X11/plaintext.0.png | Bin 77181 -> 77252 bytes
 .../qdeclarativetext/font/data-X11/richtext.0.png  | Bin 103375 -> 101974 bytes
 .../qmlvisual/qdeclarativetext/font/plaintext.qml  |  55 +--
 .../qmlvisual/qdeclarativetext/font/plaintext2.qml |   9 +-
 .../qmlvisual/qdeclarativetext/font/richtext.qml   |  43 +-
 .../qmlvisual/qdeclarativetext/qtbug_14865.qml     |   3 +-
 .../qdeclarativetextedit/MultilineEdit.qml         |  11 +-
 .../qdeclarativetextedit/cursorDelegate.qml        |   6 +-
 .../data-X11/usingMultilineEdit.10.png             | Bin 6074 -> 6055 bytes
 .../data-X11/usingMultilineEdit.11.png             | Bin 6074 -> 6055 bytes
 .../data-X11/usingMultilineEdit.8.png              | Bin 6072 -> 6051 bytes
 .../data-X11/usingMultilineEdit.9.png              | Bin 6074 -> 6055 bytes
 .../data-X11/usingMultilineEdit.qml                | 452 ++++++++++-----------
 .../qdeclarativetextedit/data-X11/wrap.qml         | 194 ++++-----
 .../qmlvisual/qdeclarativetextedit/qt-669.qml      |   3 +-
 .../qdeclarativetextedit/usingMultilineEdit.qml    |   8 +-
 .../qmlvisual/qdeclarativetextedit/wrap.qml        |   9 +-
 .../qmlvisual/qdeclarativetextinput/LineEdit.qml   |  11 +-
 .../qdeclarativetextinput/cursorDelegate.qml       |   6 +-
 .../qdeclarativetextinput/data-X11/echoMode.0.png  | Bin 570 -> 580 bytes
 .../qdeclarativetextinput/data-X11/echoMode.1.png  | Bin 1061 -> 1073 bytes
 .../qdeclarativetextinput/data-X11/echoMode.2.png  | Bin 1661 -> 1672 bytes
 .../qdeclarativetextinput/data-X11/echoMode.qml    | 180 ++++----
 .../qmlvisual/qdeclarativetextinput/echoMode.qml   |   9 +-
 .../qmlvisual/qdeclarativetextinput/hAlign.qml     |  15 +-
 .../qdeclarativetextinput/usingLineEdit.qml        |   6 +-
 tests/auto/declarative/qmlvisual/shared/README     |   7 +
 .../auto/declarative/qmlvisual/shared/TestText.qml |   8 +
 .../declarative/qmlvisual/shared/TestTextEdit.qml  |  14 +
 .../declarative/qmlvisual/shared/TestTextInput.qml |  14 +
 tests/auto/declarative/qmlvisual/shared/Vera.ttf   | Bin 0 -> 65932 bytes
 tests/auto/declarative/qmlvisual/shared/qmldir     |   3 +
 41 files changed, 677 insertions(+), 611 deletions(-)
 create mode 100644 tests/auto/declarative/qmlvisual/shared/README
 create mode 100644 tests/auto/declarative/qmlvisual/shared/TestText.qml
 create mode 100644 tests/auto/declarative/qmlvisual/shared/TestTextEdit.qml
 create mode 100644 tests/auto/declarative/qmlvisual/shared/TestTextInput.qml
 create mode 100644 tests/auto/declarative/qmlvisual/shared/Vera.ttf
 create mode 100644 tests/auto/declarative/qmlvisual/shared/qmldir

diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/multilineAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/multilineAlign.qml
index 976f0b0..a427719 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/multilineAlign.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/multilineAlign.qml
@@ -1,4 +1,5 @@
 import QtQuick 1.0
+import "../../shared" 1.0
 
 /*Tests both the alignments of multiline text, and that
   it can deal with changing them properly
@@ -8,7 +9,7 @@ Item{
     height: 80
     property int stage: 0
     onStageChanged: if(stage == 6) Qt.quit();
-    Text{
+    TestText{
         text: "I am the very model of a modern major general."
         anchors.fill: parent;
         wrapMode: Text.WordWrap
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/parentanchor.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/parentanchor.qml
index c1920db..618a65f 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/parentanchor.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/parentanchor.qml
@@ -1,13 +1,14 @@
 import QtQuick 1.0
+import "../../shared" 1.0
 
 Rectangle {
     id: s; width: 600; height: 100;
     property string text: "The quick brown fox jumps over the lazy dog."
-    Text {
+    TestText {
         text: s.text
         anchors.verticalCenter: s.verticalCenter
     }
-    Text {
+    TestText {
         text: s.text
         anchors.baseline: s.verticalCenter
     }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/QTBUG-14469.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/QTBUG-14469.qml
index ea3a939..aca7c2d 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/QTBUG-14469.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/QTBUG-14469.qml
@@ -1,4 +1,5 @@
 import QtQuick 1.0
+import "../../shared" 1.0
 
 /* The bug was that if text was set to "" or the size didn't increase, the text didn't repaint
    ended up only repainting for 1, 10, 11, 12.
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.0.png
index b250b38..de216ba 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml
index f3bc1db..fcaeed5 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml
@@ -6,239 +6,239 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 32
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 48
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 64
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 80
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 96
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 112
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 128
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 144
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 160
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 176
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 192
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 208
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 224
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 240
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 256
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 272
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 288
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 304
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 320
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 336
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 352
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 368
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 384
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 400
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 416
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 432
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 448
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 464
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 480
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 496
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 512
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 528
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 544
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 560
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 576
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 592
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 608
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 624
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 640
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 656
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 672
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 688
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 704
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 720
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 736
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 752
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 768
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 784
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 800
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 816
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 832
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 848
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 864
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 880
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 896
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 912
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 928
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 944
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 960
@@ -246,34 +246,34 @@ VisualTest {
     }
     Frame {
         msec: 976
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Key {
         type: 6
         key: 16777249
-        modifiers: 0
+        modifiers: 67108864
         text: ""
         autorep: false
         count: 1
     }
     Frame {
         msec: 992
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 1008
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 1024
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 1040
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 1056
-        hash: "9992670f23580ce63cdd3ab3fed621a1"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml
index 5d36d48..3871f91 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml
@@ -6,71 +6,71 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "a9dc5058e29f9c129087eaa013002185"
+        hash: "51e3a7214bf2fd98108de683ae650b05"
     }
     Frame {
         msec: 32
-        hash: "da0d63697414c19f57235c4d133faf63"
+        hash: "72bd0f47e179c5356d4a0575939b6c05"
     }
     Frame {
         msec: 48
-        hash: "e3992f5512959c061d53fc3899acec14"
+        hash: "9229869bf23fe10394ffb6bacc38d2b5"
     }
     Frame {
         msec: 64
-        hash: "e225de5dc21fee719ebc43fa8838f841"
+        hash: "4f75c0a0b7a04c8abdf2768a819b6c14"
     }
     Frame {
         msec: 80
-        hash: "a5673b8b7ad5a9d67e785beaaa4c0307"
+        hash: "514a9a762cd0356cbcecb93e73c81534"
     }
     Frame {
         msec: 96
-        hash: "2c126bf2d794039e1380595b9c40ae2e"
+        hash: "68436451f6f3ee981bf8851944b82dda"
     }
     Frame {
         msec: 112
-        hash: "f974072b4863b842b520b4c11c427f5d"
+        hash: "fa33b582c0890bc9852f3a6c80864988"
     }
     Frame {
         msec: 128
-        hash: "bf06ec5a2c1c46e780cdd0d859b2becb"
+        hash: "f65928b270f12f2917193ba70d9388ee"
     }
     Frame {
         msec: 144
-        hash: "3a58b1900912a5a6ace72757f3af4d1a"
+        hash: "755d1421a9b2bf3be9d665f5f8d6f767"
     }
     Frame {
         msec: 160
-        hash: "3fa86df29f53e7f6f65fb6e605f5e705"
+        hash: "dbec63b93f3617440317f7ddc2fbd6fa"
     }
     Frame {
         msec: 176
-        hash: "6d29c12395050b049537819cf0a65746"
+        hash: "1ec885da7efc3d71904c79a4a4768f27"
     }
     Frame {
         msec: 192
-        hash: "352a390ab4e3e31b645f025e65885cfc"
+        hash: "a20981af2ce8e82a6c1825e438dfd815"
     }
     Frame {
         msec: 208
-        hash: "7c3be9d325f023a356b6ed73332bc804"
+        hash: "3c951028229d8d6a3a0faa18f21afbe6"
     }
     Frame {
         msec: 224
-        hash: "09dd10566eda09e0366b7bf0a8ce9e1b"
+        hash: "8354d4c9bd5ccb2eae46cdaf3fd337bb"
     }
     Frame {
         msec: 240
-        hash: "6cafcba107e48f7efe2db60a14c3749d"
+        hash: "05880d6d76fa8dc421af4d06cbdd4448"
     }
     Frame {
         msec: 256
-        hash: "a4b6df2874ce48ed5a17aab43f32e665"
+        hash: "370e33f141d0a8396b5c2bb279f9bb67"
     }
     Frame {
         msec: 272
-        hash: "b6a3df4b704fa7e8284572b9c520b03d"
+        hash: "663b162ce447eee0f2194a92b463d6fe"
     }
     Frame {
         msec: 288
@@ -1258,66 +1258,66 @@ VisualTest {
     }
     Frame {
         msec: 5024
-        hash: "a9dc5058e29f9c129087eaa013002185"
+        hash: "51e3a7214bf2fd98108de683ae650b05"
     }
     Frame {
         msec: 5040
-        hash: "5d06ae83ab9cc218175013042922b908"
+        hash: "af3da99b9abc3b3440b22d4d428dcd1a"
     }
     Frame {
         msec: 5056
-        hash: "e225de5dc21fee719ebc43fa8838f841"
+        hash: "4f75c0a0b7a04c8abdf2768a819b6c14"
     }
     Frame {
         msec: 5072
-        hash: "b89bf31a945cb6c880e95bf2d2a6e944"
+        hash: "c73dc19d48511634717cf4e95f843a5d"
     }
     Frame {
         msec: 5088
-        hash: "fa54db3c383bc1da121c0d3b09e942d3"
+        hash: "0f263ab43dde78f1280483c6287b44a2"
     }
     Frame {
         msec: 5104
-        hash: "2c126bf2d794039e1380595b9c40ae2e"
+        hash: "68436451f6f3ee981bf8851944b82dda"
     }
     Frame {
         msec: 5120
-        hash: "1e9639693e5ec1edb72e71d126c434bb"
+        hash: "e0ea33b011cc8aef74070e26b71bd05e"
     }
     Frame {
         msec: 5136
-        hash: "3a58b1900912a5a6ace72757f3af4d1a"
+        hash: "755d1421a9b2bf3be9d665f5f8d6f767"
     }
     Frame {
         msec: 5152
-        hash: "11a846d93430e622a9750e4e2a7b76fe"
+        hash: "7e20da3dab6bd290498756ac392bc052"
     }
     Frame {
         msec: 5168
-        hash: "801d7707e86b776fe2459c42b26337f5"
+        hash: "babdfa14fbba8f6eb0c95334588123ce"
     }
     Frame {
         msec: 5184
-        hash: "6d29c12395050b049537819cf0a65746"
+        hash: "1ec885da7efc3d71904c79a4a4768f27"
     }
     Frame {
         msec: 5200
-        hash: "5a68af870474ffb8a694710b10f52bc7"
+        hash: "2159f4c9f72bca3ba98b4fd0aeb3c1ba"
     }
     Frame {
         msec: 5216
-        hash: "09dd10566eda09e0366b7bf0a8ce9e1b"
+        hash: "8354d4c9bd5ccb2eae46cdaf3fd337bb"
     }
     Frame {
         msec: 5232
-        hash: "f43b377f99f74e2cf07e419887f7ee0b"
+        hash: "ee95872db6f9440800bb98023764dc2a"
     }
     Frame {
         msec: 5248
-        hash: "108287fc253d36a5ebf8582ef2a5fd57"
+        hash: "23197dd2bb352193b72d4445912d9c94"
     }
     Frame {
         msec: 5264
-        hash: "a4b6df2874ce48ed5a17aab43f32e665"
+        hash: "370e33f141d0a8396b5c2bb279f9bb67"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/elide.qml
index b96ecb3..e52c609 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/elide.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/elide.qml
@@ -1,4 +1,5 @@
 import QtQuick 1.0
+import "../../shared" 1.0
 
 Rectangle {
     width: childrenRect.width
@@ -6,23 +7,23 @@ Rectangle {
     Column {
         width: 80
         height: myText.height*4
-        Text {
+        TestText {
             elide: "ElideLeft"
             text: "aaa bbb ccc ddd eee fff"
             width: 80
             id: myText
         }
-        Text {
+        TestText {
             elide: "ElideMiddle"
             text: "aaa bbb ccc ddd eee fff"
             width: 80
         }
-        Text {
+        TestText {
             elide: "ElideRight"
             text: "aaa bbb ccc ddd eee fff"
             width: 80
         }
-        Text {
+        TestText {
             elide: "ElideNone"
             text: "aaa bbb ccc ddd eee fff"
             width: 80
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/elide2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/elide2.qml
index b772982..0370a73 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/elide2.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/elide2.qml
@@ -1,10 +1,11 @@
 import QtQuick 1.0
+import "../../shared" 1.0
 
 Rectangle {
     width: 500
     height: 100
 
-    Text {
+    TestText {
         NumberAnimation on width { from: 500; to: 0; loops: Animation.Infinite; duration: 5000 }
         elide: Text.ElideRight
         text: 'Here is some very long text that we should truncate when sizing window'
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/multilength.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/multilength.qml
index 3ef64ef..db991a2 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/multilength.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/multilength.qml
@@ -1,4 +1,5 @@
 import QtQuick 1.0
+import "../../shared" 1.0
 
 Rectangle {
     width: 500
@@ -9,7 +10,7 @@ Rectangle {
         height: myText.height
         color: "white"
         anchors.centerIn: parent
-        Text {
+        TestText {
             id: myText
             NumberAnimation on width { from: 500; to: 0; loops: Animation.Infinite; duration: 5000 }
             elide: "ElideRight"
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.0.png
index 89195ae..30dc0a9 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.0.png
index 6a48728..8d3c37b 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext.qml
index e82d80f..3a06cf0 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext.qml
@@ -1,4 +1,5 @@
 import QtQuick 1.0
+import "../../shared" 1.0
 
 Rectangle {
     id: s; width: 620; height: 600; color: "lightsteelblue"
@@ -6,96 +7,96 @@ Rectangle {
 
     Column {
         spacing: 8
-        Text {
+        TestText {
             text: s.text
         }
-        Text {
+        TestText {
             text: s.text; font.pixelSize: 18
         }
-        Text {
+        TestText {
             text: s.text; font.pointSize: 20
         }
-        Text {
+        TestText {
             text: s.text; color: "red"; smooth: true
         }
-        Text {
+        TestText {
             text: s.text; font.capitalization: "AllUppercase"
         }
-        Text {
+        TestText {
             text: s.text; font.underline: true
         }
-        Text {
+        TestText {
             text: s.text; font.overline: true; smooth: true
         }
-        Text {
+        TestText {
             text: s.text; font.strikeout: true
         }
-        Text {
+        TestText {
             text: s.text; font.underline: true; font.overline: true; font.strikeout: true
         }
-        Text {
+        TestText {
             text: s.text; font.letterSpacing: 2
         }
-        Text {
+        TestText {
             text: s.text; font.underline: true; font.letterSpacing: 2; font.capitalization: "AllUppercase"; color: "blue"
         }
-        Text {
+        TestText {
             text: s.text; font.overline: true; font.wordSpacing: 25; font.capitalization: "Capitalize"; color: "green"
         }
-        Text {
+        TestText {
             text: s.text; font.pixelSize: 18; style: Text.Outline; styleColor: "white"
         }
-        Text {
+        TestText {
             text: s.text; font.pixelSize: 18; style: Text.Sunken; styleColor: "gray"
         }
-        Text {
+        TestText {
             text: s.text; font.pixelSize: 18; style: Text.Raised; styleColor: "yellow"
         }
-        Text {
+        TestText {
             text: s.text; horizontalAlignment: Text.AlignLeft; width: s.width
         }
-        Text {
+        TestText {
             text: s.text; horizontalAlignment: Text.AlignHCenter; verticalAlignment: Text.AlignVCenter; width: s.width; height: 20
         }
-        Text {
+        TestText {
             text: s.text; horizontalAlignment: Text.AlignRight; verticalAlignment: Text.AlignBottom; width: s.width; height: 20
         }
         Row{
             height: childrenRect.height
             spacing: 4
-            Text {
+            TestText {
                 text: s.text; elide: Text.ElideLeft; width: 200
             }
-            Text {
+            TestText {
                 text: s.text; elide: Text.ElideMiddle; width: 200
             }
-            Text {
+            TestText {
                 text: s.text; elide: Text.ElideRight; width: 200
             }
         }
         Row{
             height: childrenRect.height
             spacing: 4
-            Text{
+            TestText{
                 text: s.text; elide: Text.ElideLeft; width: 200; wrapMode: Text.WordWrap
             }
-            Text {
+            TestText {
                 text: s.text; elide: Text.ElideMiddle; width: 200; wrapMode: Text.WordWrap
             }
-            Text {
+            TestText {
                 text: s.text; elide: Text.ElideRight; width: 200; wrapMode: Text.WordWrap
             }
         }
         Row{
             height: childrenRect.height
             spacing: 4
-            Text {
+            TestText {
                 text: s.text + " thisisaverylongstringwithnospaces"; width: 150; wrapMode: Text.WrapAnywhere
             }
-            Text {
+            TestText {
                 text: s.text + " thisisaverylongstringwithnospaces"; width: 150; wrapMode: Text.Wrap
             }
-            Text {
+            TestText {
 text: s.text; font.pixelSize: 18; style: Text.Outline; styleColor: "white"; wrapMode: Text.WordWrap; width: 200
             }
         }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext2.qml
index 901025a..01de1f0 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext2.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext2.qml
@@ -1,4 +1,5 @@
 import QtQuick 1.0
+import "../../shared" 1.0
 
 Rectangle {
     width: 400; height: 200
@@ -6,16 +7,16 @@ Rectangle {
     Row {
         spacing: 20
         anchors.centerIn: parent
-        Text {
+        TestText {
             text: "First line\nSecond line"; wrapMode: Text.Wrap
         }
-        Text {
+        TestText {
             text: "First line\nSecond line"; width: 70
         }
-        Text {
+        TestText {
             text: "First Second\nThird Fourth"; wrapMode: Text.Wrap; width: 50
         }
-        Text {
+        TestText {
             text: "First line<br>Second line"; textFormat: Text.StyledText
         }
     }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/richtext.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/richtext.qml
index 7d174cc..3670479 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/richtext.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/richtext.qml
@@ -1,4 +1,5 @@
 import QtQuick 1.0
+import "../../shared" 1.0
 
 Rectangle {
     id: s; width: 620; height: 600; color: "lightsteelblue"
@@ -6,70 +7,70 @@ Rectangle {
 
     Column {
         spacing: 6
-        Text {
+        TestText {
             text: s.text
         }
-        Text {
+        TestText {
             text: s.text; font.pixelSize: 18
         }
-        Text {
+        TestText {
             text: s.text; font.pointSize: 18
         }
-        Text {
+        TestText {
             text: s.text; color: "red"; smooth: true
         }
-        Text {
+        TestText {
             text: s.text; font.capitalization: "AllUppercase"
         }
-        Text {
+        TestText {
             text: s.text; font.underline: true
         }
-        Text {
+        TestText {
             text: s.text; font.overline: true; smooth: true
         }
-        Text {
+        TestText {
             text: s.text; font.strikeout: true
         }
-        Text {
+        TestText {
             text: s.text; font.underline: true; font.overline: true; font.strikeout: true
         }
-        Text {
+        TestText {
             text: s.text; font.letterSpacing: 2
         }
-        Text {
+        TestText {
             text: s.text; font.underline: true; font.letterSpacing: 2; font.capitalization: "AllUppercase"; color: "blue"
         }
-        Text {
+        TestText {
             text: s.text; font.overline: true; font.wordSpacing: 25; font.capitalization: "Capitalize"; color: "green"
         }
-        Text {
+        TestText {
             text: s.text; font.pixelSize: 18; style: Text.Outline; styleColor: "white"
         }
-        Text {
+        TestText {
             text: s.text; font.pixelSize: 18; style: Text.Sunken; styleColor: "gray"
         }
-        Text {
+        TestText {
             text: s.text; font.pixelSize: 18; style: Text.Raised; styleColor: "yellow"
         }
-        Text {
+        TestText {
             text: s.text; horizontalAlignment: Text.AlignLeft; width: s.width
         }
-        Text {
+        TestText {
             text: s.text; horizontalAlignment: Text.AlignHCenter; verticalAlignment: Text.AlignVCenter; width: s.width; height: 20
         }
-        Text {
+        TestText {
             text: s.text; horizontalAlignment: Text.AlignRight; verticalAlignment: Text.AlignBottom; width: s.width; height: 20
         }
         Row{
             height: childrenRect.height;
             spacing: 4
-            Text {
+            TestText {
                 text: s.text + " thisisaverylongstringwithnospaces"; width: 150; wrapMode: Text.WrapAnywhere
             }
-            Text {
+            TestText {
                 text: s.text + " thisisaverylongstringwithnospaces"; width: 150; wrapMode: Text.Wrap
             }
-            Text {
+            TestText {
                 text: s.text; font.pixelSize: 18; style: Text.Outline; styleColor: "white"; wrapMode: Text.WordWrap; width: 200
             }
         }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/qtbug_14865.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/qtbug_14865.qml
index 07416dc..3d5fbf0 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/qtbug_14865.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/qtbug_14865.qml
@@ -1,9 +1,10 @@
 import QtQuick 1.0
+import "../shared" 1.0
 
 Rectangle {
     width: 200; height: 200
 
-    Text {
+    TestText {
         id: label
         objectName: "label"
         text: "Hello world!"
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/MultilineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/MultilineEdit.qml
index fd29eb6..4273f32 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/MultilineEdit.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/MultilineEdit.qml
@@ -1,4 +1,5 @@
 import QtQuick 1.0
+import "../shared" 1.0
 
 Item {
     id:lineedit
@@ -7,16 +8,16 @@ Item {
     width: 240 + 11 //Should be set manually in most cases
     height: textEdit.height + 11 
 
-    Rectangle{
+    Rectangle {
         color: 'lightsteelblue'
         anchors.fill: parent
     }
     clip: true
     Component.onCompleted: textEdit.cursorPosition = 0;
-    TextEdit{
+    TestTextEdit {
         id:textEdit
-        cursorDelegate: Item{
-            Rectangle{
+        cursorDelegate: Item {
+            Rectangle {
                 visible: parent.parent.focus
                 color: "#009BCE"
                 height: 13
@@ -46,7 +47,7 @@ Item {
         wrapMode: TextEdit.WordWrap
         font.pixelSize:15
     }
-    MouseArea{
+    MouseArea {
         //Implements all line edit mouse handling
         id: mainMouseArea
         anchors.fill: parent;
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/cursorDelegate.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/cursorDelegate.qml
index 8798a5f..1e0f71a 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/cursorDelegate.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/cursorDelegate.qml
@@ -1,5 +1,7 @@
 import QtQuick 1.0
-    Rectangle {
+import "../shared" 1.0
+
+Rectangle {
     resources: [
         Component { id: cursorA
             Item { id: cPage;
@@ -21,7 +23,7 @@ import QtQuick 1.0
     width: 400
     height: 200
     color: "white"
-    TextEdit { id: mainText
+    TestTextEdit { id: mainText
         text: "Hello World"
         cursorDelegate: cursorA
         focus: true
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.10.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.10.png
index 9c72d52..ae21dca 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.10.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.10.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.11.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.11.png
index 9c72d52..ae21dca 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.11.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.11.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.8.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.8.png
index d49c2ff..5f329b6 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.8.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.8.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.9.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.9.png
index 9c72d52..ae21dca 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.9.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.9.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.qml
index c12094e..5a1f8de 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.qml
@@ -2218,7 +2218,7 @@ VisualTest {
     }
     Frame {
         msec: 5952
-        hash: "eba517141a4dc94025801fabc8c5e813"
+        hash: "3d71f15694368397bc8f6a6a0c2c16de"
     }
     Mouse {
         type: 5
@@ -2722,7 +2722,7 @@ VisualTest {
     }
     Frame {
         msec: 6432
-        hash: "a609d3c9cb375240e66dd316af27543c"
+        hash: "b7eeca12627f0ca82a0e56179184b3b8"
     }
     Mouse {
         type: 5
@@ -2742,7 +2742,7 @@ VisualTest {
     }
     Frame {
         msec: 6448
-        hash: "0d376060ba0f9843ed814a8d8150d047"
+        hash: "abccf1571b12444328188003928a0aea"
     }
     Mouse {
         type: 5
@@ -3554,11 +3554,11 @@ VisualTest {
     }
     Frame {
         msec: 8000
-        hash: "a62df700f3209668a813e765a79e7859"
+        hash: "236c237e3f4673d568a8cf2c3665cb49"
     }
     Frame {
         msec: 8016
-        hash: "a62df700f3209668a813e765a79e7859"
+        hash: "236c237e3f4673d568a8cf2c3665cb49"
     }
     Key {
         type: 7
@@ -3578,11 +3578,11 @@ VisualTest {
     }
     Frame {
         msec: 8032
-        hash: "e8928770969b82523e828e3036bbe106"
+        hash: "cea55dd0cd5b0c2e37808bd38c689ddf"
     }
     Frame {
         msec: 8048
-        hash: "e8928770969b82523e828e3036bbe106"
+        hash: "cea55dd0cd5b0c2e37808bd38c689ddf"
     }
     Key {
         type: 7
@@ -3602,11 +3602,11 @@ VisualTest {
     }
     Frame {
         msec: 8064
-        hash: "ba0c406580cc0fa02a6b26367a290ec9"
+        hash: "9bf8a1a8a79230f459fcec6d21843f3f"
     }
     Frame {
         msec: 8080
-        hash: "ba0c406580cc0fa02a6b26367a290ec9"
+        hash: "9bf8a1a8a79230f459fcec6d21843f3f"
     }
     Key {
         type: 6
@@ -3626,31 +3626,31 @@ VisualTest {
     }
     Frame {
         msec: 8096
-        hash: "ba0c406580cc0fa02a6b26367a290ec9"
+        hash: "9bf8a1a8a79230f459fcec6d21843f3f"
     }
     Frame {
         msec: 8112
-        hash: "ba0c406580cc0fa02a6b26367a290ec9"
+        hash: "9bf8a1a8a79230f459fcec6d21843f3f"
     }
     Frame {
         msec: 8128
-        hash: "ba0c406580cc0fa02a6b26367a290ec9"
+        hash: "9bf8a1a8a79230f459fcec6d21843f3f"
     }
     Frame {
         msec: 8144
-        hash: "ba0c406580cc0fa02a6b26367a290ec9"
+        hash: "9bf8a1a8a79230f459fcec6d21843f3f"
     }
     Frame {
         msec: 8160
-        hash: "ba0c406580cc0fa02a6b26367a290ec9"
+        hash: "9bf8a1a8a79230f459fcec6d21843f3f"
     }
     Frame {
         msec: 8176
-        hash: "ba0c406580cc0fa02a6b26367a290ec9"
+        hash: "9bf8a1a8a79230f459fcec6d21843f3f"
     }
     Frame {
         msec: 8192
-        hash: "ba0c406580cc0fa02a6b26367a290ec9"
+        hash: "9bf8a1a8a79230f459fcec6d21843f3f"
     }
     Key {
         type: 6
@@ -3662,19 +3662,19 @@ VisualTest {
     }
     Frame {
         msec: 8208
-        hash: "479b5ba3f5b3d38b5e9aba6b5204da03"
+        hash: "261d950728b1628d637e739a72c58e9f"
     }
     Frame {
         msec: 8224
-        hash: "479b5ba3f5b3d38b5e9aba6b5204da03"
+        hash: "261d950728b1628d637e739a72c58e9f"
     }
     Frame {
         msec: 8240
-        hash: "479b5ba3f5b3d38b5e9aba6b5204da03"
+        hash: "261d950728b1628d637e739a72c58e9f"
     }
     Frame {
         msec: 8256
-        hash: "479b5ba3f5b3d38b5e9aba6b5204da03"
+        hash: "261d950728b1628d637e739a72c58e9f"
     }
     Key {
         type: 7
@@ -3686,19 +3686,19 @@ VisualTest {
     }
     Frame {
         msec: 8272
-        hash: "479b5ba3f5b3d38b5e9aba6b5204da03"
+        hash: "261d950728b1628d637e739a72c58e9f"
     }
     Frame {
         msec: 8288
-        hash: "479b5ba3f5b3d38b5e9aba6b5204da03"
+        hash: "261d950728b1628d637e739a72c58e9f"
     }
     Frame {
         msec: 8304
-        hash: "479b5ba3f5b3d38b5e9aba6b5204da03"
+        hash: "261d950728b1628d637e739a72c58e9f"
     }
     Frame {
         msec: 8320
-        hash: "479b5ba3f5b3d38b5e9aba6b5204da03"
+        hash: "261d950728b1628d637e739a72c58e9f"
     }
     Key {
         type: 6
@@ -3710,19 +3710,19 @@ VisualTest {
     }
     Frame {
         msec: 8336
-        hash: "978ed05f4ea2cc7ddb06807a25883335"
+        hash: "aad904179a9dbda49f411b9ae3efcb53"
     }
     Frame {
         msec: 8352
-        hash: "978ed05f4ea2cc7ddb06807a25883335"
+        hash: "aad904179a9dbda49f411b9ae3efcb53"
     }
     Frame {
         msec: 8368
-        hash: "978ed05f4ea2cc7ddb06807a25883335"
+        hash: "aad904179a9dbda49f411b9ae3efcb53"
     }
     Frame {
         msec: 8384
-        hash: "978ed05f4ea2cc7ddb06807a25883335"
+        hash: "aad904179a9dbda49f411b9ae3efcb53"
     }
     Key {
         type: 7
@@ -3734,23 +3734,23 @@ VisualTest {
     }
     Frame {
         msec: 8400
-        hash: "978ed05f4ea2cc7ddb06807a25883335"
+        hash: "aad904179a9dbda49f411b9ae3efcb53"
     }
     Frame {
         msec: 8416
-        hash: "978ed05f4ea2cc7ddb06807a25883335"
+        hash: "aad904179a9dbda49f411b9ae3efcb53"
     }
     Frame {
         msec: 8432
-        hash: "978ed05f4ea2cc7ddb06807a25883335"
+        hash: "aad904179a9dbda49f411b9ae3efcb53"
     }
     Frame {
         msec: 8448
-        hash: "978ed05f4ea2cc7ddb06807a25883335"
+        hash: "aad904179a9dbda49f411b9ae3efcb53"
     }
     Frame {
         msec: 8464
-        hash: "978ed05f4ea2cc7ddb06807a25883335"
+        hash: "aad904179a9dbda49f411b9ae3efcb53"
     }
     Key {
         type: 6
@@ -3762,19 +3762,19 @@ VisualTest {
     }
     Frame {
         msec: 8480
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8496
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8512
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8528
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Key {
         type: 7
@@ -3786,27 +3786,27 @@ VisualTest {
     }
     Frame {
         msec: 8544
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8560
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8576
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8592
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8608
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8624
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8640
@@ -3814,7 +3814,7 @@ VisualTest {
     }
     Frame {
         msec: 8656
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Key {
         type: 7
@@ -3826,139 +3826,139 @@ VisualTest {
     }
     Frame {
         msec: 8672
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8688
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8704
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8720
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8736
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8752
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8768
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8784
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8800
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8816
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8832
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8848
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8864
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8880
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8896
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8912
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8928
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8944
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8960
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8976
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8992
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9008
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9024
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9040
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9056
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9072
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9088
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9104
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9120
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9136
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9152
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9168
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9184
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9200
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Mouse {
         type: 2
@@ -3970,11 +3970,11 @@ VisualTest {
     }
     Frame {
         msec: 9216
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9232
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Mouse {
         type: 5
@@ -3986,7 +3986,7 @@ VisualTest {
     }
     Frame {
         msec: 9248
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Mouse {
         type: 5
@@ -4006,7 +4006,7 @@ VisualTest {
     }
     Frame {
         msec: 9264
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Mouse {
         type: 5
@@ -4026,7 +4026,7 @@ VisualTest {
     }
     Frame {
         msec: 9280
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Mouse {
         type: 3
@@ -4038,43 +4038,43 @@ VisualTest {
     }
     Frame {
         msec: 9296
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9312
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9328
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9344
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9360
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9376
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9392
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9408
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9424
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 9440
-        hash: "b65c439a091d3293352de410d28aaca1"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Mouse {
         type: 2
@@ -4086,27 +4086,27 @@ VisualTest {
     }
     Frame {
         msec: 9456
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9472
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9488
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9504
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9520
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9536
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Mouse {
         type: 3
@@ -4118,15 +4118,15 @@ VisualTest {
     }
     Frame {
         msec: 9552
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9568
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9584
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9600
@@ -4134,19 +4134,19 @@ VisualTest {
     }
     Frame {
         msec: 9616
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9632
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9648
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9664
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Key {
         type: 6
@@ -4158,111 +4158,111 @@ VisualTest {
     }
     Frame {
         msec: 9680
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9696
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9712
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9728
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9744
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9760
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9776
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9792
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9808
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9824
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9840
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9856
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9872
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9888
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9904
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9920
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9936
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9952
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9968
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9984
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10000
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10016
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10032
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10048
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10064
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10080
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10096
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Key {
         type: 6
@@ -4274,35 +4274,35 @@ VisualTest {
     }
     Frame {
         msec: 10112
-        hash: "8d9ca5bff73c2c93a0db5787ca7ef76b"
+        hash: "ead21885244133a71e103eb9ae6b61e4"
     }
     Frame {
         msec: 10128
-        hash: "8d9ca5bff73c2c93a0db5787ca7ef76b"
+        hash: "ead21885244133a71e103eb9ae6b61e4"
     }
     Frame {
         msec: 10144
-        hash: "8d9ca5bff73c2c93a0db5787ca7ef76b"
+        hash: "ead21885244133a71e103eb9ae6b61e4"
     }
     Frame {
         msec: 10160
-        hash: "8d9ca5bff73c2c93a0db5787ca7ef76b"
+        hash: "ead21885244133a71e103eb9ae6b61e4"
     }
     Frame {
         msec: 10176
-        hash: "8d9ca5bff73c2c93a0db5787ca7ef76b"
+        hash: "ead21885244133a71e103eb9ae6b61e4"
     }
     Frame {
         msec: 10192
-        hash: "8d9ca5bff73c2c93a0db5787ca7ef76b"
+        hash: "ead21885244133a71e103eb9ae6b61e4"
     }
     Frame {
         msec: 10208
-        hash: "8d9ca5bff73c2c93a0db5787ca7ef76b"
+        hash: "ead21885244133a71e103eb9ae6b61e4"
     }
     Frame {
         msec: 10224
-        hash: "8d9ca5bff73c2c93a0db5787ca7ef76b"
+        hash: "ead21885244133a71e103eb9ae6b61e4"
     }
     Key {
         type: 7
@@ -4314,35 +4314,35 @@ VisualTest {
     }
     Frame {
         msec: 10240
-        hash: "8d9ca5bff73c2c93a0db5787ca7ef76b"
+        hash: "ead21885244133a71e103eb9ae6b61e4"
     }
     Frame {
         msec: 10256
-        hash: "8d9ca5bff73c2c93a0db5787ca7ef76b"
+        hash: "ead21885244133a71e103eb9ae6b61e4"
     }
     Frame {
         msec: 10272
-        hash: "8d9ca5bff73c2c93a0db5787ca7ef76b"
+        hash: "ead21885244133a71e103eb9ae6b61e4"
     }
     Frame {
         msec: 10288
-        hash: "8d9ca5bff73c2c93a0db5787ca7ef76b"
+        hash: "ead21885244133a71e103eb9ae6b61e4"
     }
     Frame {
         msec: 10304
-        hash: "8d9ca5bff73c2c93a0db5787ca7ef76b"
+        hash: "ead21885244133a71e103eb9ae6b61e4"
     }
     Frame {
         msec: 10320
-        hash: "8d9ca5bff73c2c93a0db5787ca7ef76b"
+        hash: "ead21885244133a71e103eb9ae6b61e4"
     }
     Frame {
         msec: 10336
-        hash: "8d9ca5bff73c2c93a0db5787ca7ef76b"
+        hash: "ead21885244133a71e103eb9ae6b61e4"
     }
     Frame {
         msec: 10352
-        hash: "8d9ca5bff73c2c93a0db5787ca7ef76b"
+        hash: "ead21885244133a71e103eb9ae6b61e4"
     }
     Key {
         type: 6
@@ -4354,27 +4354,27 @@ VisualTest {
     }
     Frame {
         msec: 10368
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10384
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10400
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10416
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10432
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10448
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Key {
         type: 7
@@ -4386,27 +4386,27 @@ VisualTest {
     }
     Frame {
         msec: 10464
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10480
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10496
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10512
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10528
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10544
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10560
@@ -4414,23 +4414,23 @@ VisualTest {
     }
     Frame {
         msec: 10576
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10592
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10608
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10624
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10640
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Key {
         type: 7
@@ -4442,219 +4442,219 @@ VisualTest {
     }
     Frame {
         msec: 10656
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10672
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10688
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10704
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10720
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10736
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10752
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10768
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10784
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10800
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10816
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10832
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10848
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10864
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10880
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10896
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10912
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10928
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10944
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10960
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10976
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10992
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11008
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11024
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11040
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11056
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11072
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11088
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11104
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11120
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11136
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11152
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11168
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11184
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11200
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11216
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11232
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11248
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11264
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11280
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11296
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11312
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11328
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11344
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11360
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11376
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11392
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11408
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11424
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11440
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11456
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11472
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11488
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11504
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11520
@@ -4662,26 +4662,26 @@ VisualTest {
     }
     Frame {
         msec: 11536
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11552
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11568
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11584
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11600
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11616
-        hash: "3d08eff16edf54f522a75df1734150df"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml
index defaf78..475aee1 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml
@@ -230,7 +230,7 @@ VisualTest {
     }
     Frame {
         msec: 528
-        hash: "41fc29e728daf52d54a3acacceabab39"
+        hash: "36fb24a55e2cda02c3001adaa67e82a7"
     }
     Key {
         type: 6
@@ -450,19 +450,19 @@ VisualTest {
     }
     Frame {
         msec: 1024
-        hash: "6d8069ea1f16634ebcf94ba45041984f"
+        hash: "f681181b9e889f2fe0ac5ccddaa8c39f"
     }
     Frame {
         msec: 1040
-        hash: "6d8069ea1f16634ebcf94ba45041984f"
+        hash: "f681181b9e889f2fe0ac5ccddaa8c39f"
     }
     Frame {
         msec: 1056
-        hash: "6d8069ea1f16634ebcf94ba45041984f"
+        hash: "f681181b9e889f2fe0ac5ccddaa8c39f"
     }
     Frame {
         msec: 1072
-        hash: "6d8069ea1f16634ebcf94ba45041984f"
+        hash: "f681181b9e889f2fe0ac5ccddaa8c39f"
     }
     Key {
         type: 7
@@ -474,31 +474,31 @@ VisualTest {
     }
     Frame {
         msec: 1088
-        hash: "6d8069ea1f16634ebcf94ba45041984f"
+        hash: "f681181b9e889f2fe0ac5ccddaa8c39f"
     }
     Frame {
         msec: 1104
-        hash: "6d8069ea1f16634ebcf94ba45041984f"
+        hash: "f681181b9e889f2fe0ac5ccddaa8c39f"
     }
     Frame {
         msec: 1120
-        hash: "6d8069ea1f16634ebcf94ba45041984f"
+        hash: "f681181b9e889f2fe0ac5ccddaa8c39f"
     }
     Frame {
         msec: 1136
-        hash: "6d8069ea1f16634ebcf94ba45041984f"
+        hash: "f681181b9e889f2fe0ac5ccddaa8c39f"
     }
     Frame {
         msec: 1152
-        hash: "6d8069ea1f16634ebcf94ba45041984f"
+        hash: "f681181b9e889f2fe0ac5ccddaa8c39f"
     }
     Frame {
         msec: 1168
-        hash: "6d8069ea1f16634ebcf94ba45041984f"
+        hash: "f681181b9e889f2fe0ac5ccddaa8c39f"
     }
     Frame {
         msec: 1184
-        hash: "6d8069ea1f16634ebcf94ba45041984f"
+        hash: "f681181b9e889f2fe0ac5ccddaa8c39f"
     }
     Key {
         type: 6
@@ -638,7 +638,7 @@ VisualTest {
     }
     Frame {
         msec: 1520
-        hash: "7e63c2f83280eee33bb3c954d769e297"
+        hash: "a086058fa845a399a222c2571ef25442"
     }
     Key {
         type: 7
@@ -650,11 +650,11 @@ VisualTest {
     }
     Frame {
         msec: 1536
-        hash: "7e63c2f83280eee33bb3c954d769e297"
+        hash: "a086058fa845a399a222c2571ef25442"
     }
     Frame {
         msec: 1552
-        hash: "7e63c2f83280eee33bb3c954d769e297"
+        hash: "a086058fa845a399a222c2571ef25442"
     }
     Key {
         type: 6
@@ -842,15 +842,15 @@ VisualTest {
     }
     Frame {
         msec: 2016
-        hash: "6e626464dfc68af86649589a23fe5368"
+        hash: "2ddf4c1b9ec2d5540c456e10c2af775e"
     }
     Frame {
         msec: 2032
-        hash: "6e626464dfc68af86649589a23fe5368"
+        hash: "2ddf4c1b9ec2d5540c456e10c2af775e"
     }
     Frame {
         msec: 2048
-        hash: "6e626464dfc68af86649589a23fe5368"
+        hash: "2ddf4c1b9ec2d5540c456e10c2af775e"
     }
     Key {
         type: 6
@@ -1050,11 +1050,11 @@ VisualTest {
     }
     Frame {
         msec: 2528
-        hash: "0a5589c5877c807b8d9540a1dd86e265"
+        hash: "1475ec7421f2c16f7dbb13eeb35f21c8"
     }
     Frame {
         msec: 2544
-        hash: "0a5589c5877c807b8d9540a1dd86e265"
+        hash: "1475ec7421f2c16f7dbb13eeb35f21c8"
     }
     Key {
         type: 7
@@ -1066,27 +1066,27 @@ VisualTest {
     }
     Frame {
         msec: 2560
-        hash: "0a5589c5877c807b8d9540a1dd86e265"
+        hash: "1475ec7421f2c16f7dbb13eeb35f21c8"
     }
     Frame {
         msec: 2576
-        hash: "0a5589c5877c807b8d9540a1dd86e265"
+        hash: "1475ec7421f2c16f7dbb13eeb35f21c8"
     }
     Frame {
         msec: 2592
-        hash: "0a5589c5877c807b8d9540a1dd86e265"
+        hash: "1475ec7421f2c16f7dbb13eeb35f21c8"
     }
     Frame {
         msec: 2608
-        hash: "0a5589c5877c807b8d9540a1dd86e265"
+        hash: "1475ec7421f2c16f7dbb13eeb35f21c8"
     }
     Frame {
         msec: 2624
-        hash: "0a5589c5877c807b8d9540a1dd86e265"
+        hash: "1475ec7421f2c16f7dbb13eeb35f21c8"
     }
     Frame {
         msec: 2640
-        hash: "0a5589c5877c807b8d9540a1dd86e265"
+        hash: "1475ec7421f2c16f7dbb13eeb35f21c8"
     }
     Key {
         type: 6
@@ -1246,23 +1246,23 @@ VisualTest {
     }
     Frame {
         msec: 3024
-        hash: "718894676b3feeff1924b9b315838551"
+        hash: "ab08c67bc5c8f53bba66ad48f618d9c9"
     }
     Frame {
         msec: 3040
-        hash: "718894676b3feeff1924b9b315838551"
+        hash: "ab08c67bc5c8f53bba66ad48f618d9c9"
     }
     Frame {
         msec: 3056
-        hash: "718894676b3feeff1924b9b315838551"
+        hash: "ab08c67bc5c8f53bba66ad48f618d9c9"
     }
     Frame {
         msec: 3072
-        hash: "718894676b3feeff1924b9b315838551"
+        hash: "ab08c67bc5c8f53bba66ad48f618d9c9"
     }
     Frame {
         msec: 3088
-        hash: "718894676b3feeff1924b9b315838551"
+        hash: "ab08c67bc5c8f53bba66ad48f618d9c9"
     }
     Key {
         type: 6
@@ -1606,7 +1606,7 @@ VisualTest {
     }
     Frame {
         msec: 4016
-        hash: "8c949a494d7bd5f9b6e5ac5bf3baec59"
+        hash: "67b49fc16da9390bff9814b34659baca"
     }
     Key {
         type: 6
@@ -1814,11 +1814,11 @@ VisualTest {
     }
     Frame {
         msec: 4528
-        hash: "55e236c3b51b7104cf3254a44b0f1c92"
+        hash: "c5ce4fc832787535e66e64c546383d28"
     }
     Frame {
         msec: 4544
-        hash: "55e236c3b51b7104cf3254a44b0f1c92"
+        hash: "c5ce4fc832787535e66e64c546383d28"
     }
     Key {
         type: 6
@@ -2002,127 +2002,127 @@ VisualTest {
     }
     Frame {
         msec: 5024
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5040
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5056
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5072
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5088
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5104
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5120
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5136
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5152
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5168
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5184
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5200
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5216
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5232
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5248
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5264
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5280
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5296
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5312
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5328
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5344
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5360
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5376
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5392
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5408
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5424
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5440
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5456
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5472
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5488
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5504
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5520
@@ -2250,131 +2250,131 @@ VisualTest {
     }
     Frame {
         msec: 6016
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6032
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6048
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6064
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6080
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6096
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6112
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6128
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6144
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6160
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6176
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6192
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6208
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6224
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6240
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6256
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6272
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6288
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6304
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6320
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6336
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6352
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6368
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6384
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6400
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6416
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6432
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6448
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6464
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6480
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6496
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6512
-        hash: "a0208b5276f3f26500f40535017563a6"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6528
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/qt-669.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/qt-669.qml
index d7054ba..5f80234 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/qt-669.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/qt-669.qml
@@ -1,4 +1,5 @@
 import QtQuick 1.0
+import "../shared" 1.0
 
 Rectangle {
     Component { id: testableCursor
@@ -10,7 +11,7 @@ Rectangle {
     }
     width:300;
     height:40;
-    TextEdit {
+    TestTextEdit {
         focus: true;
         cursorDelegate: testableCursor
         text: "Jackdaws love my big sphinx of Quartz"
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/usingMultilineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/usingMultilineEdit.qml
index f03e1cc..bf5e7a0 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/usingMultilineEdit.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/usingMultilineEdit.qml
@@ -3,12 +3,12 @@ import QtQuick 1.0
 Rectangle{
     width: 280
     height: 140
-    Column{
-        MultilineEdit{
+    Column {
+        MultilineEdit {
             text: 'I am the very model of a modern major general. I\'ve information vegetable, animal and mineral. I know the kings of england and I quote the fights historical - from Marathon to Waterloo in order categorical.';
             width: 182; height: 60;
         }
-        Rectangle{height: 20; width: 20;}//Spacer
-        MultilineEdit{text: 'Hello world'}
+        Rectangle {height: 20; width: 20;}//Spacer
+        MultilineEdit {text: 'Hello world'}
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/wrap.qml
index 4afe417..63400f1 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/wrap.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/wrap.qml
@@ -1,30 +1,31 @@
 import QtQuick 1.0
+import "../shared" 1.0
 
 Item {
     height:400
     width: 200
-    TextEdit {
+    TestTextEdit {
         width: 200
         height: 100
         wrapMode: TextEdit.WordWrap
         focus: true
     }
     //With QTBUG-6273 only the bottom one would be wrapped
-    TextEdit {
+    TestTextEdit {
         width: 200
         height: 100
         wrapMode: TextEdit.WordWrap
         text: "This is a test that text edit wraps correctly."
         y:100
     }
-    TextEdit {
+    TestTextEdit {
         width: 150
         height: 100
         wrapMode: TextEdit.WrapAnywhere
         text: "This is a test that text edit wraps correctly. thisisaverylongstringwithnospaces"
         y:200
     }
-    TextEdit {
+    TestTextEdit {
         width: 150
         height: 100
         wrapMode: TextEdit.Wrap
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/LineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/LineEdit.qml
index 74c16e2..50c3cb4 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/LineEdit.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/LineEdit.qml
@@ -1,4 +1,5 @@
 import QtQuick 1.0
+import "../shared" 1.0
 
 Item {
     id:lineedit
@@ -7,16 +8,16 @@ Item {
     width: textInp.width + 11 
     height: 13 + 11 
 
-    Rectangle{
+    Rectangle {
         color: 'lightsteelblue'
         anchors.fill: parent
     }
     clip: true
     Component.onCompleted: textInp.cursorPosition = 0;
-    TextInput{
+    TestTextInput {
         id:textInp
-        cursorDelegate: Item{
-            Rectangle{
+        cursorDelegate: Item {
+            Rectangle {
                 visible: parent.parent.focus
                 color: "#009BCE"
                 height: 13
@@ -42,7 +43,7 @@ Item {
         horizontalAlignment: TextInput.AlignLeft
         font.pixelSize:15
     }
-    MouseArea{
+    MouseArea {
         //Implements all line edit mouse handling
         id: mainMouseArea
         anchors.fill: parent;
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/cursorDelegate.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/cursorDelegate.qml
index 69dc32a..f2a34b7 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/cursorDelegate.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/cursorDelegate.qml
@@ -1,5 +1,7 @@
 import QtQuick 1.0
-    Rectangle {
+import "../shared" 1.0
+
+Rectangle {
     resources: [
         Component { id: cursorA
             Item { id: cPage;
@@ -22,7 +24,7 @@ import QtQuick 1.0
     width: 400
     height: 200
     color: "white"
-    TextInput { id: mainText
+    TestTextInput { id: mainText
         text: "Hello World"
         cursorDelegate: cursorA
         focus: true
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.png
index e7e4ad8..551a3de 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.1.png
index 07a19e2..826d99a 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.2.png
index 075c4d5..727e873 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.2.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml
index 31d3592..c8f1f27 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml
@@ -158,7 +158,7 @@ VisualTest {
     }
     Frame {
         msec: 528
-        hash: "48b0300c8109a227176bd90e6b8ca682"
+        hash: "86f9d315291a08f35f1c431ae802ada2"
     }
     Key {
         type: 7
@@ -170,43 +170,43 @@ VisualTest {
     }
     Frame {
         msec: 544
-        hash: "48b0300c8109a227176bd90e6b8ca682"
+        hash: "86f9d315291a08f35f1c431ae802ada2"
     }
     Frame {
         msec: 560
-        hash: "48b0300c8109a227176bd90e6b8ca682"
+        hash: "86f9d315291a08f35f1c431ae802ada2"
     }
     Frame {
         msec: 576
-        hash: "48b0300c8109a227176bd90e6b8ca682"
+        hash: "86f9d315291a08f35f1c431ae802ada2"
     }
     Frame {
         msec: 592
-        hash: "48b0300c8109a227176bd90e6b8ca682"
+        hash: "86f9d315291a08f35f1c431ae802ada2"
     }
     Frame {
         msec: 608
-        hash: "48b0300c8109a227176bd90e6b8ca682"
+        hash: "86f9d315291a08f35f1c431ae802ada2"
     }
     Frame {
         msec: 624
-        hash: "48b0300c8109a227176bd90e6b8ca682"
+        hash: "86f9d315291a08f35f1c431ae802ada2"
     }
     Frame {
         msec: 640
-        hash: "48b0300c8109a227176bd90e6b8ca682"
+        hash: "86f9d315291a08f35f1c431ae802ada2"
     }
     Frame {
         msec: 656
-        hash: "48b0300c8109a227176bd90e6b8ca682"
+        hash: "86f9d315291a08f35f1c431ae802ada2"
     }
     Frame {
         msec: 672
-        hash: "48b0300c8109a227176bd90e6b8ca682"
+        hash: "86f9d315291a08f35f1c431ae802ada2"
     }
     Frame {
         msec: 688
-        hash: "48b0300c8109a227176bd90e6b8ca682"
+        hash: "86f9d315291a08f35f1c431ae802ada2"
     }
     Key {
         type: 6
@@ -218,23 +218,23 @@ VisualTest {
     }
     Frame {
         msec: 704
-        hash: "7de871fbd0f87da5c31216863f6eb0ba"
+        hash: "5c1e01a1dd3004ea3eff7ec215cc8fdc"
     }
     Frame {
         msec: 720
-        hash: "7de871fbd0f87da5c31216863f6eb0ba"
+        hash: "5c1e01a1dd3004ea3eff7ec215cc8fdc"
     }
     Frame {
         msec: 736
-        hash: "7de871fbd0f87da5c31216863f6eb0ba"
+        hash: "5c1e01a1dd3004ea3eff7ec215cc8fdc"
     }
     Frame {
         msec: 752
-        hash: "7de871fbd0f87da5c31216863f6eb0ba"
+        hash: "5c1e01a1dd3004ea3eff7ec215cc8fdc"
     }
     Frame {
         msec: 768
-        hash: "7de871fbd0f87da5c31216863f6eb0ba"
+        hash: "5c1e01a1dd3004ea3eff7ec215cc8fdc"
     }
     Key {
         type: 7
@@ -246,23 +246,23 @@ VisualTest {
     }
     Frame {
         msec: 784
-        hash: "7de871fbd0f87da5c31216863f6eb0ba"
+        hash: "5c1e01a1dd3004ea3eff7ec215cc8fdc"
     }
     Frame {
         msec: 800
-        hash: "7de871fbd0f87da5c31216863f6eb0ba"
+        hash: "5c1e01a1dd3004ea3eff7ec215cc8fdc"
     }
     Frame {
         msec: 816
-        hash: "7de871fbd0f87da5c31216863f6eb0ba"
+        hash: "5c1e01a1dd3004ea3eff7ec215cc8fdc"
     }
     Frame {
         msec: 832
-        hash: "7de871fbd0f87da5c31216863f6eb0ba"
+        hash: "5c1e01a1dd3004ea3eff7ec215cc8fdc"
     }
     Frame {
         msec: 848
-        hash: "7de871fbd0f87da5c31216863f6eb0ba"
+        hash: "5c1e01a1dd3004ea3eff7ec215cc8fdc"
     }
     Key {
         type: 6
@@ -274,15 +274,15 @@ VisualTest {
     }
     Frame {
         msec: 864
-        hash: "2fa1f1853e1ebf127fcb42ba072bc66f"
+        hash: "b3504e4dbb653a7c039dcf8ab0351055"
     }
     Frame {
         msec: 880
-        hash: "2fa1f1853e1ebf127fcb42ba072bc66f"
+        hash: "b3504e4dbb653a7c039dcf8ab0351055"
     }
     Frame {
         msec: 896
-        hash: "2fa1f1853e1ebf127fcb42ba072bc66f"
+        hash: "b3504e4dbb653a7c039dcf8ab0351055"
     }
     Key {
         type: 7
@@ -294,15 +294,15 @@ VisualTest {
     }
     Frame {
         msec: 912
-        hash: "2fa1f1853e1ebf127fcb42ba072bc66f"
+        hash: "b3504e4dbb653a7c039dcf8ab0351055"
     }
     Frame {
         msec: 928
-        hash: "2fa1f1853e1ebf127fcb42ba072bc66f"
+        hash: "b3504e4dbb653a7c039dcf8ab0351055"
     }
     Frame {
         msec: 944
-        hash: "2fa1f1853e1ebf127fcb42ba072bc66f"
+        hash: "b3504e4dbb653a7c039dcf8ab0351055"
     }
     Frame {
         msec: 960
@@ -310,7 +310,7 @@ VisualTest {
     }
     Frame {
         msec: 976
-        hash: "2fa1f1853e1ebf127fcb42ba072bc66f"
+        hash: "b3504e4dbb653a7c039dcf8ab0351055"
     }
     Key {
         type: 6
@@ -322,11 +322,11 @@ VisualTest {
     }
     Frame {
         msec: 992
-        hash: "7bd52cf50949b283ec40b82cf457841a"
+        hash: "16069bd86f3b8a896087a455e76f1059"
     }
     Frame {
         msec: 1008
-        hash: "7bd52cf50949b283ec40b82cf457841a"
+        hash: "16069bd86f3b8a896087a455e76f1059"
     }
     Frame {
         msec: 1024
@@ -502,15 +502,15 @@ VisualTest {
     }
     Frame {
         msec: 1520
-        hash: "7b294a04afc0567d321a28930bc43600"
+        hash: "80685804ddaefa46508a3cbe4cd16f59"
     }
     Frame {
         msec: 1536
-        hash: "7b294a04afc0567d321a28930bc43600"
+        hash: "80685804ddaefa46508a3cbe4cd16f59"
     }
     Frame {
         msec: 1552
-        hash: "7b294a04afc0567d321a28930bc43600"
+        hash: "80685804ddaefa46508a3cbe4cd16f59"
     }
     Key {
         type: 7
@@ -522,27 +522,27 @@ VisualTest {
     }
     Frame {
         msec: 1568
-        hash: "7b294a04afc0567d321a28930bc43600"
+        hash: "80685804ddaefa46508a3cbe4cd16f59"
     }
     Frame {
         msec: 1584
-        hash: "7b294a04afc0567d321a28930bc43600"
+        hash: "80685804ddaefa46508a3cbe4cd16f59"
     }
     Frame {
         msec: 1600
-        hash: "7b294a04afc0567d321a28930bc43600"
+        hash: "80685804ddaefa46508a3cbe4cd16f59"
     }
     Frame {
         msec: 1616
-        hash: "7b294a04afc0567d321a28930bc43600"
+        hash: "80685804ddaefa46508a3cbe4cd16f59"
     }
     Frame {
         msec: 1632
-        hash: "7b294a04afc0567d321a28930bc43600"
+        hash: "80685804ddaefa46508a3cbe4cd16f59"
     }
     Frame {
         msec: 1648
-        hash: "7b294a04afc0567d321a28930bc43600"
+        hash: "80685804ddaefa46508a3cbe4cd16f59"
     }
     Key {
         type: 6
@@ -554,23 +554,23 @@ VisualTest {
     }
     Frame {
         msec: 1664
-        hash: "00095464e3f162c2a825f7fdae21ab6f"
+        hash: "270f91762428ce515e0de44dea26d6ed"
     }
     Frame {
         msec: 1680
-        hash: "00095464e3f162c2a825f7fdae21ab6f"
+        hash: "270f91762428ce515e0de44dea26d6ed"
     }
     Frame {
         msec: 1696
-        hash: "00095464e3f162c2a825f7fdae21ab6f"
+        hash: "270f91762428ce515e0de44dea26d6ed"
     }
     Frame {
         msec: 1712
-        hash: "00095464e3f162c2a825f7fdae21ab6f"
+        hash: "270f91762428ce515e0de44dea26d6ed"
     }
     Frame {
         msec: 1728
-        hash: "00095464e3f162c2a825f7fdae21ab6f"
+        hash: "270f91762428ce515e0de44dea26d6ed"
     }
     Key {
         type: 6
@@ -582,7 +582,7 @@ VisualTest {
     }
     Frame {
         msec: 1744
-        hash: "c25d79796963ca42789725c6621bce01"
+        hash: "5ff3755b130835886503045e45700235"
     }
     Key {
         type: 7
@@ -594,15 +594,15 @@ VisualTest {
     }
     Frame {
         msec: 1760
-        hash: "c25d79796963ca42789725c6621bce01"
+        hash: "5ff3755b130835886503045e45700235"
     }
     Frame {
         msec: 1776
-        hash: "c25d79796963ca42789725c6621bce01"
+        hash: "5ff3755b130835886503045e45700235"
     }
     Frame {
         msec: 1792
-        hash: "c25d79796963ca42789725c6621bce01"
+        hash: "5ff3755b130835886503045e45700235"
     }
     Key {
         type: 7
@@ -614,19 +614,19 @@ VisualTest {
     }
     Frame {
         msec: 1808
-        hash: "c25d79796963ca42789725c6621bce01"
+        hash: "5ff3755b130835886503045e45700235"
     }
     Frame {
         msec: 1824
-        hash: "c25d79796963ca42789725c6621bce01"
+        hash: "5ff3755b130835886503045e45700235"
     }
     Frame {
         msec: 1840
-        hash: "c25d79796963ca42789725c6621bce01"
+        hash: "5ff3755b130835886503045e45700235"
     }
     Frame {
         msec: 1856
-        hash: "c25d79796963ca42789725c6621bce01"
+        hash: "5ff3755b130835886503045e45700235"
     }
     Key {
         type: 6
@@ -638,15 +638,15 @@ VisualTest {
     }
     Frame {
         msec: 1872
-        hash: "e876aa2aaa6ae2c3a5f048771858c21b"
+        hash: "deab81e7fcc4ecc31d02fccc52a4cc17"
     }
     Frame {
         msec: 1888
-        hash: "e876aa2aaa6ae2c3a5f048771858c21b"
+        hash: "deab81e7fcc4ecc31d02fccc52a4cc17"
     }
     Frame {
         msec: 1904
-        hash: "e876aa2aaa6ae2c3a5f048771858c21b"
+        hash: "deab81e7fcc4ecc31d02fccc52a4cc17"
     }
     Frame {
         msec: 1920
@@ -662,23 +662,23 @@ VisualTest {
     }
     Frame {
         msec: 1936
-        hash: "e876aa2aaa6ae2c3a5f048771858c21b"
+        hash: "deab81e7fcc4ecc31d02fccc52a4cc17"
     }
     Frame {
         msec: 1952
-        hash: "e876aa2aaa6ae2c3a5f048771858c21b"
+        hash: "deab81e7fcc4ecc31d02fccc52a4cc17"
     }
     Frame {
         msec: 1968
-        hash: "e876aa2aaa6ae2c3a5f048771858c21b"
+        hash: "deab81e7fcc4ecc31d02fccc52a4cc17"
     }
     Frame {
         msec: 1984
-        hash: "e876aa2aaa6ae2c3a5f048771858c21b"
+        hash: "deab81e7fcc4ecc31d02fccc52a4cc17"
     }
     Frame {
         msec: 2000
-        hash: "e876aa2aaa6ae2c3a5f048771858c21b"
+        hash: "deab81e7fcc4ecc31d02fccc52a4cc17"
     }
     Frame {
         msec: 2016
@@ -898,11 +898,11 @@ VisualTest {
     }
     Frame {
         msec: 2528
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2544
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Key {
         type: 7
@@ -914,83 +914,83 @@ VisualTest {
     }
     Frame {
         msec: 2560
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2576
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2592
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2608
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2624
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2640
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2656
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2672
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2688
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2704
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2720
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2736
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2752
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2768
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2784
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2800
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2816
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2832
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2848
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2864
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2880
@@ -998,35 +998,35 @@ VisualTest {
     }
     Frame {
         msec: 2896
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2912
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2928
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2944
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2960
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2976
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2992
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 3008
-        hash: "73ebe3eec273bac501d56451c0c0a828"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 3024
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/echoMode.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/echoMode.qml
index 5d11403..83ec088 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/echoMode.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/echoMode.qml
@@ -1,10 +1,11 @@
 import QtQuick 1.0
+import "../shared" 1.0
 
-Item{
+Item {
     height: 50; width: 200
-    Column{
+    Column {
         //Not an exhaustive echo mode test, that's in QLineEdit (since the functionality is in QLineControl)
-        TextInput{ id: main; focus: true; echoMode: TextInput.Password; passwordCharacter: '.' }
-        Text{ text: main.text }
+        TestTextInput { id: main; focus: true; echoMode: TextInput.Password; passwordCharacter: '.' }
+        TestText { text: main.text }
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/hAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/hAlign.qml
index cf29f7c..ad8db33 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/hAlign.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/hAlign.qml
@@ -1,36 +1,37 @@
 import QtQuick 1.0
+import "../shared" 1.0
 
 Item{
     width:600;
     height:300;
-    Column{
+    Column {
         //Because they have auto width, these three should look the same
-        TextInput{ 
+        TestTextInput { 
             text: "Jackdaws love my big sphinx of quartz"; 
             horizontalAlignment: TextInput.AlignLeft;
         }
-        TextInput{ 
+        TestTextInput { 
             text: "Jackdaws love my big sphinx of quartz"; 
             horizontalAlignment: TextInput.AlignHCenter;
         }
-        TextInput{ 
+        TestTextInput { 
             text: "Jackdaws love my big sphinx of quartz"; 
             horizontalAlignment: TextInput.AlignRight;
         }
         Rectangle{ width: 600; height: 10; color: "pink" }
-        TextInput{ 
+        TestTextInput { 
             height: 30;
             width: 600;
             text: "Jackdaws love my big sphinx of quartz"; 
             horizontalAlignment: TextInput.AlignLeft;
         }
-        TextInput{ 
+        TestTextInput { 
             height: 30;
             width: 600;
             text: "Jackdaws love my big sphinx of quartz"; 
             horizontalAlignment: TextInput.AlignHCenter;
         }
-        TextInput{ 
+        TestTextInput { 
             height: 30;
             width: 600;
             text: "Jackdaws love my big sphinx of quartz"; 
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/usingLineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/usingLineEdit.qml
index 318af0f..758717e 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/usingLineEdit.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/usingLineEdit.qml
@@ -3,8 +3,8 @@ import QtQuick 1.0
 Rectangle{
     width: 600
     height: 200
-    Column{
-        LineEdit{text: 'Hello world'}
-        LineEdit{text: 'Hello underwhelmingly verbose world'; width: 80; height: 24;}
+    Column {
+        LineEdit {text: 'Hello world'}
+        LineEdit {text: 'Hello underwhelmingly verbose world'; width: 80; height: 24;}
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/shared/README b/tests/auto/declarative/qmlvisual/shared/README
new file mode 100644
index 0000000..56a88ae
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/shared/README
@@ -0,0 +1,7 @@
+These components provide a standard set of what would otherwise be system dependant settings. These are
+-default font
+-default fontSize
+-cursor blink time (unblinking cursor)
+
+This should probably be replaced with a Test Style/Theme once QtComponents is done.
+Note that having multiple font loaders is probably quite inefficient, so don't use these for performance tests.
diff --git a/tests/auto/declarative/qmlvisual/shared/TestText.qml b/tests/auto/declarative/qmlvisual/shared/TestText.qml
new file mode 100644
index 0000000..be40112
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/shared/TestText.qml
@@ -0,0 +1,8 @@
+import QtQuick 1.0
+import "../shared" 1.0
+
+Text{
+    FontLoader { id: fixedFont; source: "Vera.ttf" }
+    font.family: fixedFont.name
+    font.pixelSize: 12
+}
diff --git a/tests/auto/declarative/qmlvisual/shared/TestTextEdit.qml b/tests/auto/declarative/qmlvisual/shared/TestTextEdit.qml
new file mode 100644
index 0000000..fb35ae3
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/shared/TestTextEdit.qml
@@ -0,0 +1,14 @@
+import QtQuick 1.0
+import "../shared" 1.0
+
+TextEdit {
+    id: edit
+    FontLoader { id: fixedFont; source: "Vera.ttf" }
+    font.family: fixedFont.name
+    font.pixelSize: 12
+    cursorDelegate: Rectangle {
+            width: 1; 
+            color: "black";
+            visible: edit.cursorVisible
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/shared/TestTextInput.qml b/tests/auto/declarative/qmlvisual/shared/TestTextInput.qml
new file mode 100644
index 0000000..8593218
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/shared/TestTextInput.qml
@@ -0,0 +1,14 @@
+import QtQuick 1.0
+import "../shared" 1.0
+
+TextInput {
+    id: inp
+    FontLoader { id: fixedFont; source: "Vera.ttf" }
+    font.family: fixedFont.name
+    font.pixelSize: 12
+    cursorDelegate: Rectangle {
+            width: 1; 
+            color: "black";
+            visible: parent.cursorVisible//bug that 'inp' doesn't seem to work?
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/shared/Vera.ttf b/tests/auto/declarative/qmlvisual/shared/Vera.ttf
new file mode 100644
index 0000000..58cd6b5
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/shared/Vera.ttf differ
diff --git a/tests/auto/declarative/qmlvisual/shared/qmldir b/tests/auto/declarative/qmlvisual/shared/qmldir
new file mode 100644
index 0000000..4aebb39
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/shared/qmldir
@@ -0,0 +1,3 @@
+TestText 1.0 TestText.qml
+TestTextEdit 1.0 TestTextEdit.qml
+TestTextInput 1.0 TestTextInput.qml
-- 
cgit v0.12


From 2875e6b26c9a40ad1f5e4e214937e5a19a56432c Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Thu, 4 Nov 2010 18:09:37 +1000
Subject: Run all QML visual tests now.

They all pass for me, and running them through CI will help find the
unstable ones.
---
 tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp b/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp
index 81404ea..ce08eab 100644
--- a/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp
+++ b/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp
@@ -102,7 +102,7 @@ void tst_qmlvisual::visual_data()
     QTest::addColumn<QString>("testdata");
 
     QStringList files;
-    if (qgetenv("QMLVISUAL_ALL") != "")
+    if (qgetenv("QMLVISUAL_ALL") != "0")
         files << findQmlFiles(QDir(QT_TEST_SOURCE_DIR));
     else {
         //these are newly added tests we want to try out in CI (then move to the stable list)
-- 
cgit v0.12


From c454cbf083d9851107e958e6c2626f61065fee8b Mon Sep 17 00:00:00 2001
From: Yann Bodson <yann.bodson@nokia.com>
Date: Fri, 5 Nov 2010 09:21:29 +1000
Subject: Update visual tests for Mac.

---
 .../align/data-MAC/multilineAlign.0.png            |  Bin 2434 -> 2388 bytes
 .../align/data-MAC/multilineAlign.qml              |  118 +-
 .../baseline/data-MAC/parentanchor.qml             |   62 +-
 .../qdeclarativetext/data-MAC/qtbug_14865.0.png    |  Bin 1695 -> 1640 bytes
 .../qdeclarativetext/data-MAC/qtbug_14865.qml      |  396 +-----
 .../qdeclarativetext/elide/data-MAC/elide.0.png    |  Bin 1613 -> 1706 bytes
 .../qdeclarativetext/elide/data-MAC/elide.qml      |  132 +-
 .../qdeclarativetext/elide/data-MAC/elide2.0.png   |  Bin 3477 -> 3564 bytes
 .../qdeclarativetext/elide/data-MAC/elide2.1.png   |  Bin 3080 -> 3271 bytes
 .../qdeclarativetext/elide/data-MAC/elide2.2.png   |  Bin 2501 -> 2549 bytes
 .../qdeclarativetext/elide/data-MAC/elide2.3.png   |  Bin 1574 -> 1574 bytes
 .../qdeclarativetext/elide/data-MAC/elide2.qml     |  482 +++----
 .../elide/data-MAC/multilength.0.png               |  Bin 2877 -> 2883 bytes
 .../elide/data-MAC/multilength.qml                 |  146 +-
 .../qdeclarativetext/font/data-MAC/plaintext.0.png |  Bin 95506 -> 96247 bytes
 .../font/data-MAC/plaintext2.0.png                 |  Bin 0 -> 3481 bytes
 .../qdeclarativetext/font/data-MAC/plaintext2.qml  |  122 +-
 .../qdeclarativetext/font/data-MAC/richtext.0.png  |  Bin 121473 -> 118835 bytes
 .../data-MAC/cursorDelegate.0.png                  |  Bin 3542 -> 3636 bytes
 .../data-MAC/cursorDelegate.1.png                  |  Bin 3566 -> 3611 bytes
 .../data-MAC/cursorDelegate.2.png                  |  Bin 3592 -> 3612 bytes
 .../data-MAC/cursorDelegate.3.png                  |  Bin 3570 -> 3612 bytes
 .../data-MAC/cursorDelegate.4.png                  |  Bin 3569 -> 3609 bytes
 .../data-MAC/cursorDelegate.qml                    |  648 ++++-----
 .../qdeclarativetextedit/data-MAC/qt-669.0.png     |  Bin 3293 -> 3273 bytes
 .../qdeclarativetextedit/data-MAC/qt-669.1.png     |  Bin 3298 -> 3265 bytes
 .../qdeclarativetextedit/data-MAC/qt-669.2.png     |  Bin 3290 -> 3266 bytes
 .../qdeclarativetextedit/data-MAC/qt-669.3.png     |  Bin 3295 -> 3245 bytes
 .../qdeclarativetextedit/data-MAC/qt-669.qml       |  530 ++++----
 .../data-MAC/usingMultilineEdit.0.png              |  Bin 4954 -> 5123 bytes
 .../data-MAC/usingMultilineEdit.1.png              |  Bin 5289 -> 5500 bytes
 .../data-MAC/usingMultilineEdit.10.png             |  Bin 8028 -> 8641 bytes
 .../data-MAC/usingMultilineEdit.11.png             |  Bin 8028 -> 8641 bytes
 .../data-MAC/usingMultilineEdit.2.png              |  Bin 5820 -> 6163 bytes
 .../data-MAC/usingMultilineEdit.3.png              |  Bin 6293 -> 6785 bytes
 .../data-MAC/usingMultilineEdit.4.png              |  Bin 6484 -> 6943 bytes
 .../data-MAC/usingMultilineEdit.5.png              |  Bin 6657 -> 7043 bytes
 .../data-MAC/usingMultilineEdit.6.png              |  Bin 7006 -> 7428 bytes
 .../data-MAC/usingMultilineEdit.7.png              |  Bin 6792 -> 6860 bytes
 .../data-MAC/usingMultilineEdit.8.png              |  Bin 7844 -> 8659 bytes
 .../data-MAC/usingMultilineEdit.9.png              |  Bin 8028 -> 8641 bytes
 .../data-MAC/usingMultilineEdit.qml                | 1428 ++++++++++----------
 .../qdeclarativetextedit/data-MAC/wrap.0.png       |  Bin 11729 -> 11626 bytes
 .../qdeclarativetextedit/data-MAC/wrap.1.png       |  Bin 11956 -> 11869 bytes
 .../qdeclarativetextedit/data-MAC/wrap.2.png       |  Bin 12323 -> 12264 bytes
 .../qdeclarativetextedit/data-MAC/wrap.3.png       |  Bin 12931 -> 12607 bytes
 .../qdeclarativetextedit/data-MAC/wrap.4.png       |  Bin 13447 -> 13243 bytes
 .../qdeclarativetextedit/data-MAC/wrap.5.png       |  Bin 13478 -> 13260 bytes
 .../qdeclarativetextedit/data-MAC/wrap.6.png       |  Bin 13478 -> 13260 bytes
 .../qdeclarativetextedit/data-MAC/wrap.qml         |  844 ++++++------
 .../data-MAC/cursorDelegate.0.png                  |  Bin 3557 -> 3613 bytes
 .../data-MAC/cursorDelegate.1.png                  |  Bin 4062 -> 4140 bytes
 .../data-MAC/cursorDelegate.2.png                  |  Bin 3529 -> 3593 bytes
 .../data-MAC/cursorDelegate.3.png                  |  Bin 3563 -> 3605 bytes
 .../data-MAC/cursorDelegate.4.png                  |  Bin 3566 -> 3605 bytes
 .../data-MAC/cursorDelegate.qml                    |  610 ++++-----
 .../qdeclarativetextinput/data-MAC/echoMode.0.png  |  Bin 681 -> 703 bytes
 .../qdeclarativetextinput/data-MAC/echoMode.1.png  |  Bin 1299 -> 1360 bytes
 .../qdeclarativetextinput/data-MAC/echoMode.2.png  |  Bin 1968 -> 2031 bytes
 .../qdeclarativetextinput/data-MAC/echoMode.qml    |  376 +++---
 .../qdeclarativetextinput/data-MAC/hAlign.qml      |   50 +-
 61 files changed, 2776 insertions(+), 3168 deletions(-)
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.png

diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.png
index 5243f4a..8b6329d 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml
index ad7f35e..85c0cce 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml
@@ -6,239 +6,239 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "5033bd624cd855ba10da39e6cb30e7d2"
+        hash: "75c15f88551f961727b547082216d0bb"
     }
     Frame {
         msec: 32
-        hash: "5033bd624cd855ba10da39e6cb30e7d2"
+        hash: "75c15f88551f961727b547082216d0bb"
     }
     Frame {
         msec: 48
-        hash: "5033bd624cd855ba10da39e6cb30e7d2"
+        hash: "75c15f88551f961727b547082216d0bb"
     }
     Frame {
         msec: 64
-        hash: "5033bd624cd855ba10da39e6cb30e7d2"
+        hash: "75c15f88551f961727b547082216d0bb"
     }
     Frame {
         msec: 80
-        hash: "5033bd624cd855ba10da39e6cb30e7d2"
+        hash: "75c15f88551f961727b547082216d0bb"
     }
     Frame {
         msec: 96
-        hash: "5033bd624cd855ba10da39e6cb30e7d2"
+        hash: "75c15f88551f961727b547082216d0bb"
     }
     Frame {
         msec: 112
-        hash: "5033bd624cd855ba10da39e6cb30e7d2"
+        hash: "75c15f88551f961727b547082216d0bb"
     }
     Frame {
         msec: 128
-        hash: "5033bd624cd855ba10da39e6cb30e7d2"
+        hash: "75c15f88551f961727b547082216d0bb"
     }
     Frame {
         msec: 144
-        hash: "5033bd624cd855ba10da39e6cb30e7d2"
+        hash: "75c15f88551f961727b547082216d0bb"
     }
     Frame {
         msec: 160
-        hash: "5033bd624cd855ba10da39e6cb30e7d2"
+        hash: "75c15f88551f961727b547082216d0bb"
     }
     Frame {
         msec: 176
-        hash: "d0d1afd7d8ff38e033cec4fa68978767"
+        hash: "1a58de7b864ae75e65f69461155cbfb2"
     }
     Frame {
         msec: 192
-        hash: "d0d1afd7d8ff38e033cec4fa68978767"
+        hash: "1a58de7b864ae75e65f69461155cbfb2"
     }
     Frame {
         msec: 208
-        hash: "d0d1afd7d8ff38e033cec4fa68978767"
+        hash: "1a58de7b864ae75e65f69461155cbfb2"
     }
     Frame {
         msec: 224
-        hash: "d0d1afd7d8ff38e033cec4fa68978767"
+        hash: "1a58de7b864ae75e65f69461155cbfb2"
     }
     Frame {
         msec: 240
-        hash: "d0d1afd7d8ff38e033cec4fa68978767"
+        hash: "1a58de7b864ae75e65f69461155cbfb2"
     }
     Frame {
         msec: 256
-        hash: "d0d1afd7d8ff38e033cec4fa68978767"
+        hash: "1a58de7b864ae75e65f69461155cbfb2"
     }
     Frame {
         msec: 272
-        hash: "d0d1afd7d8ff38e033cec4fa68978767"
+        hash: "1a58de7b864ae75e65f69461155cbfb2"
     }
     Frame {
         msec: 288
-        hash: "d0d1afd7d8ff38e033cec4fa68978767"
+        hash: "1a58de7b864ae75e65f69461155cbfb2"
     }
     Frame {
         msec: 304
-        hash: "d0d1afd7d8ff38e033cec4fa68978767"
+        hash: "1a58de7b864ae75e65f69461155cbfb2"
     }
     Frame {
         msec: 320
-        hash: "d0d1afd7d8ff38e033cec4fa68978767"
+        hash: "1a58de7b864ae75e65f69461155cbfb2"
     }
     Frame {
         msec: 336
-        hash: "26eed73af37b01ebecb4ee98ed9d67c6"
+        hash: "8a6b615ce522e7aa1011bc1d16193871"
     }
     Frame {
         msec: 352
-        hash: "26eed73af37b01ebecb4ee98ed9d67c6"
+        hash: "8a6b615ce522e7aa1011bc1d16193871"
     }
     Frame {
         msec: 368
-        hash: "26eed73af37b01ebecb4ee98ed9d67c6"
+        hash: "8a6b615ce522e7aa1011bc1d16193871"
     }
     Frame {
         msec: 384
-        hash: "26eed73af37b01ebecb4ee98ed9d67c6"
+        hash: "8a6b615ce522e7aa1011bc1d16193871"
     }
     Frame {
         msec: 400
-        hash: "26eed73af37b01ebecb4ee98ed9d67c6"
+        hash: "8a6b615ce522e7aa1011bc1d16193871"
     }
     Frame {
         msec: 416
-        hash: "26eed73af37b01ebecb4ee98ed9d67c6"
+        hash: "8a6b615ce522e7aa1011bc1d16193871"
     }
     Frame {
         msec: 432
-        hash: "26eed73af37b01ebecb4ee98ed9d67c6"
+        hash: "8a6b615ce522e7aa1011bc1d16193871"
     }
     Frame {
         msec: 448
-        hash: "26eed73af37b01ebecb4ee98ed9d67c6"
+        hash: "8a6b615ce522e7aa1011bc1d16193871"
     }
     Frame {
         msec: 464
-        hash: "26eed73af37b01ebecb4ee98ed9d67c6"
+        hash: "8a6b615ce522e7aa1011bc1d16193871"
     }
     Frame {
         msec: 480
-        hash: "26eed73af37b01ebecb4ee98ed9d67c6"
+        hash: "8a6b615ce522e7aa1011bc1d16193871"
     }
     Frame {
         msec: 496
-        hash: "f046b9aaa9f1eba08386a160e2f281ca"
+        hash: "17141b7167d2249238c15cf751b3d8b6"
     }
     Frame {
         msec: 512
-        hash: "f046b9aaa9f1eba08386a160e2f281ca"
+        hash: "17141b7167d2249238c15cf751b3d8b6"
     }
     Frame {
         msec: 528
-        hash: "f046b9aaa9f1eba08386a160e2f281ca"
+        hash: "17141b7167d2249238c15cf751b3d8b6"
     }
     Frame {
         msec: 544
-        hash: "f046b9aaa9f1eba08386a160e2f281ca"
+        hash: "17141b7167d2249238c15cf751b3d8b6"
     }
     Frame {
         msec: 560
-        hash: "f046b9aaa9f1eba08386a160e2f281ca"
+        hash: "17141b7167d2249238c15cf751b3d8b6"
     }
     Frame {
         msec: 576
-        hash: "f046b9aaa9f1eba08386a160e2f281ca"
+        hash: "17141b7167d2249238c15cf751b3d8b6"
     }
     Frame {
         msec: 592
-        hash: "f046b9aaa9f1eba08386a160e2f281ca"
+        hash: "17141b7167d2249238c15cf751b3d8b6"
     }
     Frame {
         msec: 608
-        hash: "f046b9aaa9f1eba08386a160e2f281ca"
+        hash: "17141b7167d2249238c15cf751b3d8b6"
     }
     Frame {
         msec: 624
-        hash: "f046b9aaa9f1eba08386a160e2f281ca"
+        hash: "17141b7167d2249238c15cf751b3d8b6"
     }
     Frame {
         msec: 640
-        hash: "f046b9aaa9f1eba08386a160e2f281ca"
+        hash: "17141b7167d2249238c15cf751b3d8b6"
     }
     Frame {
         msec: 656
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 672
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 688
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 704
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 720
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 736
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 752
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 768
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 784
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 800
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 816
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 832
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 848
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 864
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 880
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 896
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 912
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 928
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 944
-        hash: "52f90c22e44475fac04559164c044aee"
+        hash: "92e4f7c09e41b5fb97feb0093e8d9c1f"
     }
     Frame {
         msec: 960
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml
index 56527d1..d7428dd 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml
@@ -6,126 +6,126 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 32
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 48
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 64
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 80
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 96
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 112
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 128
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 144
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 160
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 176
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 192
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 208
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 224
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 240
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 256
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 272
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 288
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 304
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 320
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 336
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 352
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 368
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 384
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 400
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 416
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 432
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 448
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 464
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 480
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
     Frame {
         msec: 496
-        hash: "01ef07707e44ea079350128454209892"
+        hash: "80e9ca4c4ffac9c032334a3369ef9db6"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png
index a947584..7547856 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml
index 940d3c1..6b9986f 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml
@@ -6,239 +6,239 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 32
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 48
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 64
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 80
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 96
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 112
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 128
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 144
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 160
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 176
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 192
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 208
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 224
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 240
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 256
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 272
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 288
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 304
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 320
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 336
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 352
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 368
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 384
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 400
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 416
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 432
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 448
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 464
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 480
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 496
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 512
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 528
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 544
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 560
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 576
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 592
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 608
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 624
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 640
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 656
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 672
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 688
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 704
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 720
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 736
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 752
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 768
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 784
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 800
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 816
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 832
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 848
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 864
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 880
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 896
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 912
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 928
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 944
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 960
@@ -246,15 +246,15 @@ VisualTest {
     }
     Frame {
         msec: 976
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 992
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 1008
-        hash: "f5b2ec4a5220eabe1186bb2fd65a7263"
+        hash: "35c278720fd30e14dce9cf8684dd2cd7"
     }
     Frame {
         msec: 1024
@@ -444,276 +444,4 @@ VisualTest {
         msec: 1760
         hash: "eee4600ac08b458ac7ac2320e225674c"
     }
-    Frame {
-        msec: 1776
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 1792
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 1808
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 1824
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 1840
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 1856
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 1872
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 1888
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 1904
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 1920
-        image: "qtbug_14865.1.png"
-    }
-    Frame {
-        msec: 1936
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 1952
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 1968
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 1984
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2000
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2016
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2032
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2048
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2064
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2080
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2096
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2112
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2128
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2144
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2160
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2176
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2192
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2208
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2224
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2240
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2256
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Key {
-        type: 6
-        key: 16777249
-        modifiers: 0
-        text: ""
-        autorep: false
-        count: 1
-    }
-    Frame {
-        msec: 2272
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2288
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2304
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2320
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2336
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2352
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2368
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2384
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2400
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2416
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2432
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2448
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2464
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2480
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2496
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2512
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2528
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2544
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2560
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2576
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2592
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2608
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2624
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2640
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2656
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2672
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2688
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2704
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2720
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2736
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2752
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2768
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2784
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2800
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
-    Frame {
-        msec: 2816
-        hash: "eee4600ac08b458ac7ac2320e225674c"
-    }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.png
index 91ee2e5..88e065b 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml
index 718375a..96144e1 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml
@@ -6,239 +6,239 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 32
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 48
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 64
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 80
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 96
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 112
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 128
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 144
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 160
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 176
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 192
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 208
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 224
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 240
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 256
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 272
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 288
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 304
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 320
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 336
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 352
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 368
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 384
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 400
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 416
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 432
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 448
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 464
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 480
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 496
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 512
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 528
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 544
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 560
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 576
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 592
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 608
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 624
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 640
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 656
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 672
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 688
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 704
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 720
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 736
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 752
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 768
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 784
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 800
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 816
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 832
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 848
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 864
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 880
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 896
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 912
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 928
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 944
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 960
@@ -246,34 +246,34 @@ VisualTest {
     }
     Frame {
         msec: 976
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Key {
         type: 6
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
     }
     Frame {
         msec: 992
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 1008
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 1024
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 1040
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
     Frame {
         msec: 1056
-        hash: "10e33a5f4c2161281d5a6b4481a17921"
+        hash: "7d056af7620fe8387955a1401a4f088a"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.png
index 0f9a0aa..4df514a 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.png
index f3bb7b9..e752fec 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.png
index b2f09de..d2f8633 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.png
index bca63db..0162321 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml
index 48a0ff4..b531942 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml
@@ -6,239 +6,239 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 32
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 48
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 64
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 80
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 96
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 112
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 128
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 144
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 160
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 176
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 192
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 208
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 224
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 240
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 256
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 272
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 288
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 304
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 320
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 336
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 352
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 368
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 384
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 400
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 416
-        hash: "083c607c9b66240f445611a18f3025b3"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 432
-        hash: "57993cfe25ba9e6f3dcdcea5fab6545c"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 448
-        hash: "57993cfe25ba9e6f3dcdcea5fab6545c"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 464
-        hash: "57993cfe25ba9e6f3dcdcea5fab6545c"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 480
-        hash: "45086d8e81c178855fc1e8fd283b7157"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 496
-        hash: "45086d8e81c178855fc1e8fd283b7157"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 512
-        hash: "45086d8e81c178855fc1e8fd283b7157"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 528
-        hash: "45086d8e81c178855fc1e8fd283b7157"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 544
-        hash: "45086d8e81c178855fc1e8fd283b7157"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 560
-        hash: "45086d8e81c178855fc1e8fd283b7157"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 576
-        hash: "c859ff5a516792a614008d0d3d096060"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 592
-        hash: "c859ff5a516792a614008d0d3d096060"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 608
-        hash: "c859ff5a516792a614008d0d3d096060"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 624
-        hash: "c859ff5a516792a614008d0d3d096060"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 640
-        hash: "c859ff5a516792a614008d0d3d096060"
+        hash: "90a45871fcfc509e60d4ee01527cde3b"
     }
     Frame {
         msec: 656
-        hash: "02d4eb733c7249f2c38c1768a9988739"
+        hash: "c73bf21c0c9946e123372c660c78e7dd"
     }
     Frame {
         msec: 672
-        hash: "02d4eb733c7249f2c38c1768a9988739"
+        hash: "c73bf21c0c9946e123372c660c78e7dd"
     }
     Frame {
         msec: 688
-        hash: "f87a38e5ef6cfe9d5c131671fecb7903"
+        hash: "c73bf21c0c9946e123372c660c78e7dd"
     }
     Frame {
         msec: 704
-        hash: "f87a38e5ef6cfe9d5c131671fecb7903"
+        hash: "bba29f9ce1a1d7dafdfe34b0ab952658"
     }
     Frame {
         msec: 720
-        hash: "f87a38e5ef6cfe9d5c131671fecb7903"
+        hash: "bba29f9ce1a1d7dafdfe34b0ab952658"
     }
     Frame {
         msec: 736
-        hash: "f87a38e5ef6cfe9d5c131671fecb7903"
+        hash: "bba29f9ce1a1d7dafdfe34b0ab952658"
     }
     Frame {
         msec: 752
-        hash: "f87a38e5ef6cfe9d5c131671fecb7903"
+        hash: "bba29f9ce1a1d7dafdfe34b0ab952658"
     }
     Frame {
         msec: 768
-        hash: "f87a38e5ef6cfe9d5c131671fecb7903"
+        hash: "bba29f9ce1a1d7dafdfe34b0ab952658"
     }
     Frame {
         msec: 784
-        hash: "3262cf6b60e56028056b81db17cfef61"
+        hash: "26f95496c4f1fa217d681a1ae79eff86"
     }
     Frame {
         msec: 800
-        hash: "3262cf6b60e56028056b81db17cfef61"
+        hash: "26f95496c4f1fa217d681a1ae79eff86"
     }
     Frame {
         msec: 816
-        hash: "3262cf6b60e56028056b81db17cfef61"
+        hash: "26f95496c4f1fa217d681a1ae79eff86"
     }
     Frame {
         msec: 832
-        hash: "31c337926e645ad93699a223c7ad223e"
+        hash: "26f95496c4f1fa217d681a1ae79eff86"
     }
     Frame {
         msec: 848
-        hash: "31c337926e645ad93699a223c7ad223e"
+        hash: "96a83eae50a073573ace90239a64d326"
     }
     Frame {
         msec: 864
-        hash: "31c337926e645ad93699a223c7ad223e"
+        hash: "96a83eae50a073573ace90239a64d326"
     }
     Frame {
         msec: 880
-        hash: "31c337926e645ad93699a223c7ad223e"
+        hash: "7b15d75c611f24977f2a1b44ef9e16d8"
     }
     Frame {
         msec: 896
-        hash: "31c337926e645ad93699a223c7ad223e"
+        hash: "7b15d75c611f24977f2a1b44ef9e16d8"
     }
     Frame {
         msec: 912
-        hash: "64253f08448ad6884b76271afe7831ab"
+        hash: "7b15d75c611f24977f2a1b44ef9e16d8"
     }
     Frame {
         msec: 928
-        hash: "64253f08448ad6884b76271afe7831ab"
+        hash: "7b15d75c611f24977f2a1b44ef9e16d8"
     }
     Frame {
         msec: 944
-        hash: "64253f08448ad6884b76271afe7831ab"
+        hash: "7b15d75c611f24977f2a1b44ef9e16d8"
     }
     Frame {
         msec: 960
@@ -246,247 +246,247 @@ VisualTest {
     }
     Frame {
         msec: 976
-        hash: "64253f08448ad6884b76271afe7831ab"
+        hash: "7b15d75c611f24977f2a1b44ef9e16d8"
     }
     Frame {
         msec: 992
-        hash: "f463cbd97856cd3cb0316cfbbc4c960f"
+        hash: "7b000cccb4e4cdaa53b025d235478b1c"
     }
     Frame {
         msec: 1008
-        hash: "f463cbd97856cd3cb0316cfbbc4c960f"
+        hash: "7b000cccb4e4cdaa53b025d235478b1c"
     }
     Frame {
         msec: 1024
-        hash: "06731429ea2d012364b2fd6177e4fcb1"
+        hash: "18366b01550fdd4a7dc7305a6289ac9b"
     }
     Frame {
         msec: 1040
-        hash: "06731429ea2d012364b2fd6177e4fcb1"
+        hash: "18366b01550fdd4a7dc7305a6289ac9b"
     }
     Frame {
         msec: 1056
-        hash: "06731429ea2d012364b2fd6177e4fcb1"
+        hash: "18366b01550fdd4a7dc7305a6289ac9b"
     }
     Frame {
         msec: 1072
-        hash: "06731429ea2d012364b2fd6177e4fcb1"
+        hash: "18366b01550fdd4a7dc7305a6289ac9b"
     }
     Frame {
         msec: 1088
-        hash: "06731429ea2d012364b2fd6177e4fcb1"
+        hash: "18366b01550fdd4a7dc7305a6289ac9b"
     }
     Frame {
         msec: 1104
-        hash: "a3f1acd84b5fc99e8ffa3c900013ca0d"
+        hash: "cde86069e7f9809ef2c88cc6ea83910b"
     }
     Frame {
         msec: 1120
-        hash: "a3f1acd84b5fc99e8ffa3c900013ca0d"
+        hash: "cde86069e7f9809ef2c88cc6ea83910b"
     }
     Frame {
         msec: 1136
-        hash: "a3f1acd84b5fc99e8ffa3c900013ca0d"
+        hash: "cde86069e7f9809ef2c88cc6ea83910b"
     }
     Frame {
         msec: 1152
-        hash: "2cb79791e784739b5c4a12578df47205"
+        hash: "cde86069e7f9809ef2c88cc6ea83910b"
     }
     Frame {
         msec: 1168
-        hash: "2cb79791e784739b5c4a12578df47205"
+        hash: "b8c7416944cb741ceb4ee0e8545037b1"
     }
     Frame {
         msec: 1184
-        hash: "2cb79791e784739b5c4a12578df47205"
+        hash: "b8c7416944cb741ceb4ee0e8545037b1"
     }
     Frame {
         msec: 1200
-        hash: "c040d9e9494193164206890e8dd79508"
+        hash: "b8c7416944cb741ceb4ee0e8545037b1"
     }
     Frame {
         msec: 1216
-        hash: "c040d9e9494193164206890e8dd79508"
+        hash: "74a03bf98bb205d7962e0fcc025c4ed3"
     }
     Frame {
         msec: 1232
-        hash: "c040d9e9494193164206890e8dd79508"
+        hash: "74a03bf98bb205d7962e0fcc025c4ed3"
     }
     Frame {
         msec: 1248
-        hash: "daaa92c4049a1ef9d290d99b0c83306e"
+        hash: "74a03bf98bb205d7962e0fcc025c4ed3"
     }
     Frame {
         msec: 1264
-        hash: "daaa92c4049a1ef9d290d99b0c83306e"
+        hash: "74a03bf98bb205d7962e0fcc025c4ed3"
     }
     Frame {
         msec: 1280
-        hash: "daaa92c4049a1ef9d290d99b0c83306e"
+        hash: "0d286d7e274868e87f7de4367b69386e"
     }
     Frame {
         msec: 1296
-        hash: "daaa92c4049a1ef9d290d99b0c83306e"
+        hash: "0d286d7e274868e87f7de4367b69386e"
     }
     Frame {
         msec: 1312
-        hash: "daaa92c4049a1ef9d290d99b0c83306e"
+        hash: "892e9e8feeb15bbad5f38cb354aa7290"
     }
     Frame {
         msec: 1328
-        hash: "afedb8f328ae31f2e5d68cd917d652ff"
+        hash: "892e9e8feeb15bbad5f38cb354aa7290"
     }
     Frame {
         msec: 1344
-        hash: "afedb8f328ae31f2e5d68cd917d652ff"
+        hash: "892e9e8feeb15bbad5f38cb354aa7290"
     }
     Frame {
         msec: 1360
-        hash: "afedb8f328ae31f2e5d68cd917d652ff"
+        hash: "06d6ad94b01af5b441fd64536f7740ff"
     }
     Frame {
         msec: 1376
-        hash: "afedb8f328ae31f2e5d68cd917d652ff"
+        hash: "06d6ad94b01af5b441fd64536f7740ff"
     }
     Frame {
         msec: 1392
-        hash: "afedb8f328ae31f2e5d68cd917d652ff"
+        hash: "06d6ad94b01af5b441fd64536f7740ff"
     }
     Frame {
         msec: 1408
-        hash: "1a7c95dcd5dd375a01179626d3e1bb4b"
+        hash: "0552844f7915835d3a35a01137d4c310"
     }
     Frame {
         msec: 1424
-        hash: "1a7c95dcd5dd375a01179626d3e1bb4b"
+        hash: "0552844f7915835d3a35a01137d4c310"
     }
     Frame {
         msec: 1440
-        hash: "1a7c95dcd5dd375a01179626d3e1bb4b"
+        hash: "0552844f7915835d3a35a01137d4c310"
     }
     Frame {
         msec: 1456
-        hash: "1a7c95dcd5dd375a01179626d3e1bb4b"
+        hash: "0552844f7915835d3a35a01137d4c310"
     }
     Frame {
         msec: 1472
-        hash: "1a7c95dcd5dd375a01179626d3e1bb4b"
+        hash: "0552844f7915835d3a35a01137d4c310"
     }
     Frame {
         msec: 1488
-        hash: "79e56686d52dad27374fe45933f7e045"
+        hash: "afdf5d4d9e49a82a395afad6b3fe4f86"
     }
     Frame {
         msec: 1504
-        hash: "79e56686d52dad27374fe45933f7e045"
+        hash: "afdf5d4d9e49a82a395afad6b3fe4f86"
     }
     Frame {
         msec: 1520
-        hash: "79e56686d52dad27374fe45933f7e045"
+        hash: "afdf5d4d9e49a82a395afad6b3fe4f86"
     }
     Frame {
         msec: 1536
-        hash: "79e56686d52dad27374fe45933f7e045"
+        hash: "afdf5d4d9e49a82a395afad6b3fe4f86"
     }
     Frame {
         msec: 1552
-        hash: "79e56686d52dad27374fe45933f7e045"
+        hash: "bb434e586d40ae0ebcb89cde55a4ca11"
     }
     Frame {
         msec: 1568
-        hash: "79e56686d52dad27374fe45933f7e045"
+        hash: "bb434e586d40ae0ebcb89cde55a4ca11"
     }
     Frame {
         msec: 1584
-        hash: "ad8f8e33731a8861016c3c9567419fff"
+        hash: "bb434e586d40ae0ebcb89cde55a4ca11"
     }
     Frame {
         msec: 1600
-        hash: "ad8f8e33731a8861016c3c9567419fff"
+        hash: "bb434e586d40ae0ebcb89cde55a4ca11"
     }
     Frame {
         msec: 1616
-        hash: "ad8f8e33731a8861016c3c9567419fff"
+        hash: "bb434e586d40ae0ebcb89cde55a4ca11"
     }
     Frame {
         msec: 1632
-        hash: "609e9d64c3e376b37cf0833333d57a0b"
+        hash: "771561a07b3eb2396231b17343da7125"
     }
     Frame {
         msec: 1648
-        hash: "609e9d64c3e376b37cf0833333d57a0b"
+        hash: "771561a07b3eb2396231b17343da7125"
     }
     Frame {
         msec: 1664
-        hash: "609e9d64c3e376b37cf0833333d57a0b"
+        hash: "771561a07b3eb2396231b17343da7125"
     }
     Frame {
         msec: 1680
-        hash: "609e9d64c3e376b37cf0833333d57a0b"
+        hash: "771561a07b3eb2396231b17343da7125"
     }
     Frame {
         msec: 1696
-        hash: "f3a64e17c082529f753292a722a2b3e8"
+        hash: "771561a07b3eb2396231b17343da7125"
     }
     Frame {
         msec: 1712
-        hash: "f3a64e17c082529f753292a722a2b3e8"
+        hash: "771561a07b3eb2396231b17343da7125"
     }
     Frame {
         msec: 1728
-        hash: "f3a64e17c082529f753292a722a2b3e8"
+        hash: "d3d23db79c5f2a374b267bcda8919d1e"
     }
     Frame {
         msec: 1744
-        hash: "76627f7257d24b08a9011c806d4c8458"
+        hash: "d3d23db79c5f2a374b267bcda8919d1e"
     }
     Key {
         type: 6
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
     }
     Frame {
         msec: 1760
-        hash: "76627f7257d24b08a9011c806d4c8458"
+        hash: "36a40dbdbb39122d30c26643e5924548"
     }
     Frame {
         msec: 1776
-        hash: "76627f7257d24b08a9011c806d4c8458"
+        hash: "36a40dbdbb39122d30c26643e5924548"
     }
     Frame {
         msec: 1792
-        hash: "76627f7257d24b08a9011c806d4c8458"
+        hash: "36a40dbdbb39122d30c26643e5924548"
     }
     Frame {
         msec: 1808
-        hash: "4275796ca36c974f6ba7ba2fc7c3d68f"
+        hash: "36a40dbdbb39122d30c26643e5924548"
     }
     Frame {
         msec: 1824
-        hash: "4275796ca36c974f6ba7ba2fc7c3d68f"
+        hash: "36a40dbdbb39122d30c26643e5924548"
     }
     Frame {
         msec: 1840
-        hash: "4275796ca36c974f6ba7ba2fc7c3d68f"
+        hash: "6a202f32d3d7a7c9edc97e55c2fe7aca"
     }
     Frame {
         msec: 1856
-        hash: "4275796ca36c974f6ba7ba2fc7c3d68f"
+        hash: "6a202f32d3d7a7c9edc97e55c2fe7aca"
     }
     Frame {
         msec: 1872
-        hash: "4275796ca36c974f6ba7ba2fc7c3d68f"
+        hash: "6a202f32d3d7a7c9edc97e55c2fe7aca"
     }
     Frame {
         msec: 1888
-        hash: "9005e33c220aaadb6c1b756c496140b5"
+        hash: "765b11a4fff9a7295440568899107159"
     }
     Frame {
         msec: 1904
-        hash: "9005e33c220aaadb6c1b756c496140b5"
+        hash: "765b11a4fff9a7295440568899107159"
     }
     Frame {
         msec: 1920
@@ -494,239 +494,239 @@ VisualTest {
     }
     Frame {
         msec: 1936
-        hash: "9005e33c220aaadb6c1b756c496140b5"
+        hash: "765b11a4fff9a7295440568899107159"
     }
     Frame {
         msec: 1952
-        hash: "9005e33c220aaadb6c1b756c496140b5"
+        hash: "765b11a4fff9a7295440568899107159"
     }
     Frame {
         msec: 1968
-        hash: "1664ce25b0e427b89e64c00668797dc1"
+        hash: "e2726e028d0a17a918a28d248a087d71"
     }
     Frame {
         msec: 1984
-        hash: "1664ce25b0e427b89e64c00668797dc1"
+        hash: "e2726e028d0a17a918a28d248a087d71"
     }
     Frame {
         msec: 2000
-        hash: "1664ce25b0e427b89e64c00668797dc1"
+        hash: "e2726e028d0a17a918a28d248a087d71"
     }
     Frame {
         msec: 2016
-        hash: "1664ce25b0e427b89e64c00668797dc1"
+        hash: "e2726e028d0a17a918a28d248a087d71"
     }
     Frame {
         msec: 2032
-        hash: "1664ce25b0e427b89e64c00668797dc1"
+        hash: "94243dc2a8013e86250c993103b2d789"
     }
     Frame {
         msec: 2048
-        hash: "4421ad90c93cca320b790c0432745a5e"
+        hash: "94243dc2a8013e86250c993103b2d789"
     }
     Frame {
         msec: 2064
-        hash: "4421ad90c93cca320b790c0432745a5e"
+        hash: "94243dc2a8013e86250c993103b2d789"
     }
     Frame {
         msec: 2080
-        hash: "4421ad90c93cca320b790c0432745a5e"
+        hash: "94243dc2a8013e86250c993103b2d789"
     }
     Frame {
         msec: 2096
-        hash: "c21285318beec99e9afd1dde46a5497b"
+        hash: "94243dc2a8013e86250c993103b2d789"
     }
     Frame {
         msec: 2112
-        hash: "c21285318beec99e9afd1dde46a5497b"
+        hash: "d8fdababa06e1cafa9047de16d5a07b5"
     }
     Frame {
         msec: 2128
-        hash: "c21285318beec99e9afd1dde46a5497b"
+        hash: "d8fdababa06e1cafa9047de16d5a07b5"
     }
     Frame {
         msec: 2144
-        hash: "ec4f44aa4f4b7de7e597cab376c1f82f"
+        hash: "d8fdababa06e1cafa9047de16d5a07b5"
     }
     Frame {
         msec: 2160
-        hash: "ec4f44aa4f4b7de7e597cab376c1f82f"
+        hash: "d8fdababa06e1cafa9047de16d5a07b5"
     }
     Frame {
         msec: 2176
-        hash: "ec4f44aa4f4b7de7e597cab376c1f82f"
+        hash: "d8fdababa06e1cafa9047de16d5a07b5"
     }
     Frame {
         msec: 2192
-        hash: "ad984149e44b3be55e420b1be3c0b8c3"
+        hash: "f31d3f99faff3289b38ec91a43108707"
     }
     Frame {
         msec: 2208
-        hash: "ad984149e44b3be55e420b1be3c0b8c3"
+        hash: "f31d3f99faff3289b38ec91a43108707"
     }
     Frame {
         msec: 2224
-        hash: "ad984149e44b3be55e420b1be3c0b8c3"
+        hash: "f31d3f99faff3289b38ec91a43108707"
     }
     Frame {
         msec: 2240
-        hash: "ad984149e44b3be55e420b1be3c0b8c3"
+        hash: "60468f768e70c91cd28dca9479ed7738"
     }
     Frame {
         msec: 2256
-        hash: "ad984149e44b3be55e420b1be3c0b8c3"
+        hash: "60468f768e70c91cd28dca9479ed7738"
     }
     Frame {
         msec: 2272
-        hash: "cd016ce04572119cf89263091ae55b2f"
+        hash: "fd5e8714cdd406f5626682c15a6efa38"
     }
     Frame {
         msec: 2288
-        hash: "cd016ce04572119cf89263091ae55b2f"
+        hash: "fd5e8714cdd406f5626682c15a6efa38"
     }
     Frame {
         msec: 2304
-        hash: "e621ae81e0da861323efe03d1a6f2ac4"
+        hash: "fd5e8714cdd406f5626682c15a6efa38"
     }
     Frame {
         msec: 2320
-        hash: "e621ae81e0da861323efe03d1a6f2ac4"
+        hash: "20f37569f7f3b374753b991b28d98e74"
     }
     Frame {
         msec: 2336
-        hash: "e621ae81e0da861323efe03d1a6f2ac4"
+        hash: "20f37569f7f3b374753b991b28d98e74"
     }
     Frame {
         msec: 2352
-        hash: "e621ae81e0da861323efe03d1a6f2ac4"
+        hash: "20f37569f7f3b374753b991b28d98e74"
     }
     Frame {
         msec: 2368
-        hash: "e621ae81e0da861323efe03d1a6f2ac4"
+        hash: "20f37569f7f3b374753b991b28d98e74"
     }
     Frame {
         msec: 2384
-        hash: "b9f9502b8acbd59927b78104dc39b3ea"
+        hash: "20f37569f7f3b374753b991b28d98e74"
     }
     Frame {
         msec: 2400
-        hash: "b9f9502b8acbd59927b78104dc39b3ea"
+        hash: "8ab72206d4ba87effd44844c67ab4d53"
     }
     Frame {
         msec: 2416
-        hash: "b9f9502b8acbd59927b78104dc39b3ea"
+        hash: "8ab72206d4ba87effd44844c67ab4d53"
     }
     Frame {
         msec: 2432
-        hash: "b9f9502b8acbd59927b78104dc39b3ea"
+        hash: "65fccdd3a8803ec1d70a12407366fb57"
     }
     Frame {
         msec: 2448
-        hash: "b9f9502b8acbd59927b78104dc39b3ea"
+        hash: "65fccdd3a8803ec1d70a12407366fb57"
     }
     Frame {
         msec: 2464
-        hash: "69bc7470ddd917ec73a075ba16715ccf"
+        hash: "65fccdd3a8803ec1d70a12407366fb57"
     }
     Frame {
         msec: 2480
-        hash: "69bc7470ddd917ec73a075ba16715ccf"
+        hash: "65fccdd3a8803ec1d70a12407366fb57"
     }
     Frame {
         msec: 2496
-        hash: "69bc7470ddd917ec73a075ba16715ccf"
+        hash: "65fccdd3a8803ec1d70a12407366fb57"
     }
     Frame {
         msec: 2512
-        hash: "69bc7470ddd917ec73a075ba16715ccf"
+        hash: "ea98cc56d2f402814d8c1b952c8bd9a0"
     }
     Frame {
         msec: 2528
-        hash: "69bc7470ddd917ec73a075ba16715ccf"
+        hash: "ea98cc56d2f402814d8c1b952c8bd9a0"
     }
     Frame {
         msec: 2544
-        hash: "9d2d1ad3db3f80ffc6fcd321a4f5adfa"
+        hash: "ea98cc56d2f402814d8c1b952c8bd9a0"
     }
     Frame {
         msec: 2560
-        hash: "9d2d1ad3db3f80ffc6fcd321a4f5adfa"
+        hash: "ea98cc56d2f402814d8c1b952c8bd9a0"
     }
     Frame {
         msec: 2576
-        hash: "9d2d1ad3db3f80ffc6fcd321a4f5adfa"
+        hash: "6dd6532db6afba17d36930bfd71abb5d"
     }
     Frame {
         msec: 2592
-        hash: "9d2d1ad3db3f80ffc6fcd321a4f5adfa"
+        hash: "6dd6532db6afba17d36930bfd71abb5d"
     }
     Frame {
         msec: 2608
-        hash: "c82742c641c411df5d9ecb4d19b7a30d"
+        hash: "6dd6532db6afba17d36930bfd71abb5d"
     }
     Frame {
         msec: 2624
-        hash: "c82742c641c411df5d9ecb4d19b7a30d"
+        hash: "6dd6532db6afba17d36930bfd71abb5d"
     }
     Frame {
         msec: 2640
-        hash: "c82742c641c411df5d9ecb4d19b7a30d"
+        hash: "6dd6532db6afba17d36930bfd71abb5d"
     }
     Frame {
         msec: 2656
-        hash: "ae50d41ef5289fc31b5cd18462905379"
+        hash: "70989ac02176a37beb2cf259cd2d9770"
     }
     Frame {
         msec: 2672
-        hash: "ae50d41ef5289fc31b5cd18462905379"
+        hash: "70989ac02176a37beb2cf259cd2d9770"
     }
     Frame {
         msec: 2688
-        hash: "ae50d41ef5289fc31b5cd18462905379"
+        hash: "70989ac02176a37beb2cf259cd2d9770"
     }
     Frame {
         msec: 2704
-        hash: "ae50d41ef5289fc31b5cd18462905379"
+        hash: "70989ac02176a37beb2cf259cd2d9770"
     }
     Frame {
         msec: 2720
-        hash: "38d393df298826121109b6bd2d454bc0"
+        hash: "1c6d8786cb42afa2af611dec5ebdcda7"
     }
     Frame {
         msec: 2736
-        hash: "38d393df298826121109b6bd2d454bc0"
+        hash: "1c6d8786cb42afa2af611dec5ebdcda7"
     }
     Frame {
         msec: 2752
-        hash: "38d393df298826121109b6bd2d454bc0"
+        hash: "3e8215d2cb61404230284ddd0041a79c"
     }
     Frame {
         msec: 2768
-        hash: "38d393df298826121109b6bd2d454bc0"
+        hash: "3e8215d2cb61404230284ddd0041a79c"
     }
     Frame {
         msec: 2784
-        hash: "38d393df298826121109b6bd2d454bc0"
+        hash: "3e8215d2cb61404230284ddd0041a79c"
     }
     Frame {
         msec: 2800
-        hash: "38d393df298826121109b6bd2d454bc0"
+        hash: "3e8215d2cb61404230284ddd0041a79c"
     }
     Frame {
         msec: 2816
-        hash: "38d393df298826121109b6bd2d454bc0"
+        hash: "3e8215d2cb61404230284ddd0041a79c"
     }
     Frame {
         msec: 2832
-        hash: "50a47e20ff34a2935b1dde36c85f7f54"
+        hash: "a4ed37665222950eab7fcb53dbe22bcf"
     }
     Frame {
         msec: 2848
-        hash: "50a47e20ff34a2935b1dde36c85f7f54"
+        hash: "a4ed37665222950eab7fcb53dbe22bcf"
     }
     Frame {
         msec: 2864
-        hash: "4daa350f9385217b9eef714f40b4e6d0"
+        hash: "a4ed37665222950eab7fcb53dbe22bcf"
     }
     Frame {
         msec: 2880
@@ -734,239 +734,239 @@ VisualTest {
     }
     Frame {
         msec: 2896
-        hash: "4daa350f9385217b9eef714f40b4e6d0"
+        hash: "a4ed37665222950eab7fcb53dbe22bcf"
     }
     Frame {
         msec: 2912
-        hash: "0e36ea4104aa509455555796262ea30d"
+        hash: "a4ed37665222950eab7fcb53dbe22bcf"
     }
     Frame {
         msec: 2928
-        hash: "0e36ea4104aa509455555796262ea30d"
+        hash: "a7f26f5fbcc97f408974e4bc23fd0b70"
     }
     Frame {
         msec: 2944
-        hash: "0e36ea4104aa509455555796262ea30d"
+        hash: "a7f26f5fbcc97f408974e4bc23fd0b70"
     }
     Frame {
         msec: 2960
-        hash: "0e36ea4104aa509455555796262ea30d"
+        hash: "913478b8d5d05967efd1c83e80e773e2"
     }
     Frame {
         msec: 2976
-        hash: "0e36ea4104aa509455555796262ea30d"
+        hash: "913478b8d5d05967efd1c83e80e773e2"
     }
     Frame {
         msec: 2992
-        hash: "4dd59519884c4aa19834430b2b0a3040"
+        hash: "913478b8d5d05967efd1c83e80e773e2"
     }
     Frame {
         msec: 3008
-        hash: "4dd59519884c4aa19834430b2b0a3040"
+        hash: "130749caf262b3055e7ac229b6b89548"
     }
     Frame {
         msec: 3024
-        hash: "4dd59519884c4aa19834430b2b0a3040"
+        hash: "130749caf262b3055e7ac229b6b89548"
     }
     Frame {
         msec: 3040
-        hash: "4dd59519884c4aa19834430b2b0a3040"
+        hash: "130749caf262b3055e7ac229b6b89548"
     }
     Frame {
         msec: 3056
-        hash: "4dd59519884c4aa19834430b2b0a3040"
+        hash: "130749caf262b3055e7ac229b6b89548"
     }
     Frame {
         msec: 3072
-        hash: "5e2e943b2ab6f798660b32e132ec6bef"
+        hash: "130749caf262b3055e7ac229b6b89548"
     }
     Frame {
         msec: 3088
-        hash: "5e2e943b2ab6f798660b32e132ec6bef"
+        hash: "d7260d913c58065a671ff6b931bb2fb6"
     }
     Frame {
         msec: 3104
-        hash: "5e2e943b2ab6f798660b32e132ec6bef"
+        hash: "d7260d913c58065a671ff6b931bb2fb6"
     }
     Frame {
         msec: 3120
-        hash: "a64b8d6bae4b6445d5de78b126e3af63"
+        hash: "d7260d913c58065a671ff6b931bb2fb6"
     }
     Frame {
         msec: 3136
-        hash: "a64b8d6bae4b6445d5de78b126e3af63"
+        hash: "d7260d913c58065a671ff6b931bb2fb6"
     }
     Frame {
         msec: 3152
-        hash: "8732d4c3b6ea276079794d2c892d14a9"
+        hash: "9059402dce5cb1813af8f7ebbd831bca"
     }
     Frame {
         msec: 3168
-        hash: "8732d4c3b6ea276079794d2c892d14a9"
+        hash: "9059402dce5cb1813af8f7ebbd831bca"
     }
     Frame {
         msec: 3184
-        hash: "8732d4c3b6ea276079794d2c892d14a9"
+        hash: "9059402dce5cb1813af8f7ebbd831bca"
     }
     Frame {
         msec: 3200
-        hash: "931f767d8c733d2262b8c73003629fd1"
+        hash: "80387fc8aedc0c490c689c3a1711fe9f"
     }
     Frame {
         msec: 3216
-        hash: "931f767d8c733d2262b8c73003629fd1"
+        hash: "80387fc8aedc0c490c689c3a1711fe9f"
     }
     Frame {
         msec: 3232
-        hash: "931f767d8c733d2262b8c73003629fd1"
+        hash: "80387fc8aedc0c490c689c3a1711fe9f"
     }
     Frame {
         msec: 3248
-        hash: "931f767d8c733d2262b8c73003629fd1"
+        hash: "f461bf58cbfd345a3f4e087cfcb0e9f0"
     }
     Frame {
         msec: 3264
-        hash: "931f767d8c733d2262b8c73003629fd1"
+        hash: "f461bf58cbfd345a3f4e087cfcb0e9f0"
     }
     Frame {
         msec: 3280
-        hash: "526f7d87bdce834a8d4396df4406d4c7"
+        hash: "d41a792b81cb891a91f2bff6dbee3bdd"
     }
     Frame {
         msec: 3296
-        hash: "526f7d87bdce834a8d4396df4406d4c7"
+        hash: "d41a792b81cb891a91f2bff6dbee3bdd"
     }
     Frame {
         msec: 3312
-        hash: "526f7d87bdce834a8d4396df4406d4c7"
+        hash: "d41a792b81cb891a91f2bff6dbee3bdd"
     }
     Frame {
         msec: 3328
-        hash: "526f7d87bdce834a8d4396df4406d4c7"
+        hash: "d41a792b81cb891a91f2bff6dbee3bdd"
     }
     Frame {
         msec: 3344
-        hash: "526f7d87bdce834a8d4396df4406d4c7"
+        hash: "d41a792b81cb891a91f2bff6dbee3bdd"
     }
     Frame {
         msec: 3360
-        hash: "0c9bb37ebb01a6127b60d26792cc3524"
+        hash: "664ac430dd416e6d1ed7e001458202cf"
     }
     Frame {
         msec: 3376
-        hash: "0c9bb37ebb01a6127b60d26792cc3524"
+        hash: "664ac430dd416e6d1ed7e001458202cf"
     }
     Frame {
         msec: 3392
-        hash: "0c9bb37ebb01a6127b60d26792cc3524"
+        hash: "664ac430dd416e6d1ed7e001458202cf"
     }
     Frame {
         msec: 3408
-        hash: "04b580975c168ef07b11496a18b55582"
+        hash: "664ac430dd416e6d1ed7e001458202cf"
     }
     Frame {
         msec: 3424
-        hash: "04b580975c168ef07b11496a18b55582"
+        hash: "664ac430dd416e6d1ed7e001458202cf"
     }
     Frame {
         msec: 3440
-        hash: "c4abe8e74b0a0a61ee671b4d7047b244"
+        hash: "c7a9e47b613745858a76a57e1782b566"
     }
     Frame {
         msec: 3456
-        hash: "c4abe8e74b0a0a61ee671b4d7047b244"
+        hash: "c7a9e47b613745858a76a57e1782b566"
     }
     Frame {
         msec: 3472
-        hash: "c4abe8e74b0a0a61ee671b4d7047b244"
+        hash: "b90d46cbd9d7d1d82cb9abfbe27fc549"
     }
     Frame {
         msec: 3488
-        hash: "c4abe8e74b0a0a61ee671b4d7047b244"
+        hash: "b90d46cbd9d7d1d82cb9abfbe27fc549"
     }
     Frame {
         msec: 3504
-        hash: "c4abe8e74b0a0a61ee671b4d7047b244"
+        hash: "b90d46cbd9d7d1d82cb9abfbe27fc549"
     }
     Frame {
         msec: 3520
-        hash: "c4abe8e74b0a0a61ee671b4d7047b244"
+        hash: "59c03ceae9b13576bd0e285234dfe264"
     }
     Frame {
         msec: 3536
-        hash: "179c36c797dfd91fdc6bd373f5331cbb"
+        hash: "59c03ceae9b13576bd0e285234dfe264"
     }
     Frame {
         msec: 3552
-        hash: "179c36c797dfd91fdc6bd373f5331cbb"
+        hash: "59c03ceae9b13576bd0e285234dfe264"
     }
     Frame {
         msec: 3568
-        hash: "179c36c797dfd91fdc6bd373f5331cbb"
+        hash: "59c03ceae9b13576bd0e285234dfe264"
     }
     Frame {
         msec: 3584
-        hash: "179c36c797dfd91fdc6bd373f5331cbb"
+        hash: "59c03ceae9b13576bd0e285234dfe264"
     }
     Frame {
         msec: 3600
-        hash: "179c36c797dfd91fdc6bd373f5331cbb"
+        hash: "b883d12eea2ec596cb6ee81f2d1db35f"
     }
     Frame {
         msec: 3616
-        hash: "49b9d5168c3fa5e09953251ffb509743"
+        hash: "b883d12eea2ec596cb6ee81f2d1db35f"
     }
     Frame {
         msec: 3632
-        hash: "49b9d5168c3fa5e09953251ffb509743"
+        hash: "b883d12eea2ec596cb6ee81f2d1db35f"
     }
     Frame {
         msec: 3648
-        hash: "49b9d5168c3fa5e09953251ffb509743"
+        hash: "b883d12eea2ec596cb6ee81f2d1db35f"
     }
     Frame {
         msec: 3664
-        hash: "49b9d5168c3fa5e09953251ffb509743"
+        hash: "9bd66e03c36c8cc279c9cfb1ea9e96a0"
     }
     Frame {
         msec: 3680
-        hash: "49b9d5168c3fa5e09953251ffb509743"
+        hash: "9bd66e03c36c8cc279c9cfb1ea9e96a0"
     }
     Frame {
         msec: 3696
-        hash: "da74be0adb46300cac7ba9bfe3660c33"
+        hash: "9bd66e03c36c8cc279c9cfb1ea9e96a0"
     }
     Frame {
         msec: 3712
-        hash: "da74be0adb46300cac7ba9bfe3660c33"
+        hash: "9bd66e03c36c8cc279c9cfb1ea9e96a0"
     }
     Frame {
         msec: 3728
-        hash: "9276749ab90c7da1eb62c6277613f75a"
+        hash: "9bd66e03c36c8cc279c9cfb1ea9e96a0"
     }
     Frame {
         msec: 3744
-        hash: "9276749ab90c7da1eb62c6277613f75a"
+        hash: "ee357c3850d0f328db859e7b790bed83"
     }
     Frame {
         msec: 3760
-        hash: "b85b7f367d4da5bd01fe87a292a356fd"
+        hash: "ee357c3850d0f328db859e7b790bed83"
     }
     Frame {
         msec: 3776
-        hash: "b85b7f367d4da5bd01fe87a292a356fd"
+        hash: "f706095272153c1e9fc4a4825ba54d91"
     }
     Frame {
         msec: 3792
-        hash: "b85b7f367d4da5bd01fe87a292a356fd"
+        hash: "f706095272153c1e9fc4a4825ba54d91"
     }
     Frame {
         msec: 3808
-        hash: "b85b7f367d4da5bd01fe87a292a356fd"
+        hash: "34f4d03164469f99bb7bcb365041cf8e"
     }
     Frame {
         msec: 3824
-        hash: "b85b7f367d4da5bd01fe87a292a356fd"
+        hash: "34f4d03164469f99bb7bcb365041cf8e"
     }
     Frame {
         msec: 3840
@@ -974,18 +974,18 @@ VisualTest {
     }
     Frame {
         msec: 3856
-        hash: "e871d5f9d6437154ef85a60fe5a6a08e"
+        hash: "34f4d03164469f99bb7bcb365041cf8e"
     }
     Frame {
         msec: 3872
-        hash: "e871d5f9d6437154ef85a60fe5a6a08e"
+        hash: "34f4d03164469f99bb7bcb365041cf8e"
     }
     Frame {
         msec: 3888
-        hash: "f66f5d470e913f4bec6c8982702b8a60"
+        hash: "97cb5f52e1a5e82a15542b7e5f772fba"
     }
     Frame {
         msec: 3904
-        hash: "f66f5d470e913f4bec6c8982702b8a60"
+        hash: "97cb5f52e1a5e82a15542b7e5f772fba"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.png
index 944208b..8caaf5f 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml
index e76ad11..30df3fa 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml
@@ -6,239 +6,239 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "fa4edc25cc530be81c5c18c089c76643"
+        hash: "2e258ad7cb0a2cd7c6c47a0b0a9563c1"
     }
     Frame {
         msec: 32
-        hash: "d543f734101d89c6d4e4a5992bd34cb3"
+        hash: "d818e0f4f1011a2a8f1d0d803fa18bc0"
     }
     Frame {
         msec: 48
-        hash: "fc96f61ab3f8235d96c815f8876728f5"
+        hash: "44b37be97bbd1f0e26d81f76d9643e51"
     }
     Frame {
         msec: 64
-        hash: "0bdeb73a4cfbe216ca795756baa353c8"
+        hash: "3079a5cf6b8277ae3e1b29ae09d04adc"
     }
     Frame {
         msec: 80
-        hash: "4451049db7f7d0b62325af6d27073f16"
+        hash: "ba899e6f18abb7105f915cef4e60f1e1"
     }
     Frame {
         msec: 96
-        hash: "ef51f1424db831f962960e468b547cc5"
+        hash: "6d2d2b3dc8afa60e32a39449ba90f78d"
     }
     Frame {
         msec: 112
-        hash: "c79ffb52d5aa11e2ee99e9db57c58c3e"
+        hash: "965af350a8fc20c7bcffb370802bc9d9"
     }
     Frame {
         msec: 128
-        hash: "3827b0ca877b214ceffdc7444f9eae14"
+        hash: "8e088db1ff0eb9f5c28268dee929928c"
     }
     Frame {
         msec: 144
-        hash: "8e375f05606f04f81c2ff0551ce7a290"
+        hash: "a0ba6c6bd1e491778294346eeabd8138"
     }
     Frame {
         msec: 160
-        hash: "8d48743f9d3c02cdb342c57b080ab52a"
+        hash: "068a018a5c017cb76ebf3721e0acdb35"
     }
     Frame {
         msec: 176
-        hash: "a8d1cae0e817ca059a73594f35eeccaf"
+        hash: "efa65cae0a4d027c2ec508deecef8aa5"
     }
     Frame {
         msec: 192
-        hash: "71d024907815100b5ea74e072e167384"
+        hash: "9c224e97aa56c6b203a48fb689d72c9a"
     }
     Frame {
         msec: 208
-        hash: "8f294501a7d0dff60233c922161f0b8d"
+        hash: "4f78af1e82a2dd46bab2d237d4f574e5"
     }
     Frame {
         msec: 224
-        hash: "303deae49dd99baba31af8915dd43d4d"
+        hash: "7d022c13e3ef07ca0b6618ae8865dbf1"
     }
     Frame {
         msec: 240
-        hash: "41f34af1ca4417e546d40057727a24b8"
+        hash: "1dc2ecf6cb92cd7d9e467de0049a8598"
     }
     Frame {
         msec: 256
-        hash: "baf5102132a01cb44925f7fc1532f8fb"
+        hash: "262174926ac657c3cd788e2383b5842b"
     }
     Frame {
         msec: 272
-        hash: "559c5e92b2cc8f20c2289bdabc7d2a3c"
+        hash: "984c40aaa927f9e9e73ad228f057d3d9"
     }
     Frame {
         msec: 288
-        hash: "39a50d44ae47e6c358d6ebaa2234cbfb"
+        hash: "0c74101beaeb0a59c1e6b1bf751ca71d"
     }
     Frame {
         msec: 304
-        hash: "4bdfe9e04c2ee21a584dc7612603fe62"
+        hash: "1c2dd6a6675014255e83c2ae734d717b"
     }
     Frame {
         msec: 320
-        hash: "e3ff2c98c9309964ccc612c4499817ff"
+        hash: "f6ac3e9e82a9a710f500f8053b6030ac"
     }
     Frame {
         msec: 336
-        hash: "f3509a8a9fe255e30e1b23ca36803169"
+        hash: "9676fdc060e5784e96534a962992c024"
     }
     Frame {
         msec: 352
-        hash: "644629a42f8a2c8dc1f84e274e25df52"
+        hash: "c46634183e4bde82419bf757bd674a72"
     }
     Frame {
         msec: 368
-        hash: "e169e2e67b0ebffc2181463a1e155e5c"
+        hash: "d04d082f4a1602a308da7f373cbb4094"
     }
     Frame {
         msec: 384
-        hash: "74ccb97fe629c48211543e885930f18e"
+        hash: "a4178c9ffbb74f3f221fc63bee26ca35"
     }
     Frame {
         msec: 400
-        hash: "14d97918485475971a832002a333722d"
+        hash: "0667b13789a501995b2846f7d93fb973"
     }
     Frame {
         msec: 416
-        hash: "4e768d02555701df2109d07259228b05"
+        hash: "fda46bf0beecbb4326b2fc6f6926f0a7"
     }
     Frame {
         msec: 432
-        hash: "ceeeeffb00e1f74ace1a11832d183c81"
+        hash: "85cbdea027d76dee1dad376679a40a22"
     }
     Frame {
         msec: 448
-        hash: "3e6660aff9dfd72e5bd7e67d547af8b5"
+        hash: "0fd56200749ea5882e1bd714e9803d44"
     }
     Frame {
         msec: 464
-        hash: "991a782f939dbfe96b316254177f34ad"
+        hash: "10bf5c477f64f442990716b7eec8fd70"
     }
     Frame {
         msec: 480
-        hash: "ce4adfec222428d3fd7dd6069c69674c"
+        hash: "7cbd8ba3f09c3d00051cd33006381afb"
     }
     Frame {
         msec: 496
-        hash: "27d658710bdeb0395052291bb736fdac"
+        hash: "dca10161836025808cddce9fd93f2412"
     }
     Frame {
         msec: 512
-        hash: "a448c7c9fc2b4cf62f57ced461e39a05"
+        hash: "b949ec6303ccaafc203066c7f9b33ef2"
     }
     Frame {
         msec: 528
-        hash: "0e1fd2a517db3a3fafb2840bbe550592"
+        hash: "853c521bad75c08c0dfe3a00bed01136"
     }
     Frame {
         msec: 544
-        hash: "2ff7fe0c183fddc88d0daaabb866d78b"
+        hash: "dd76c440dc8cfcb7305409483d21d65d"
     }
     Frame {
         msec: 560
-        hash: "73c952ed17daaf19755728185d999f96"
+        hash: "c9b70db4b94e4b0cc855102f43b8e731"
     }
     Frame {
         msec: 576
-        hash: "85e9928b19d66b8ab1ee6b10d8b2b401"
+        hash: "d196057b8aa1e11ec9cf11032b57ca03"
     }
     Frame {
         msec: 592
-        hash: "0c6fa7c70f98d53f2f0425e79083dc2c"
+        hash: "0fae715746a8a340a8f3c4428cf96783"
     }
     Frame {
         msec: 608
-        hash: "589813b70ea86dd5ebe47ccf2121b5a8"
+        hash: "dd2e89d00ce85b167fbc822fedbfb449"
     }
     Frame {
         msec: 624
-        hash: "7b94db2fd4f35fda4183a4351581a931"
+        hash: "a5228adf745f580364eafcbbdd994178"
     }
     Frame {
         msec: 640
-        hash: "5769822d37ed1e88aacbbaaddbd7520a"
+        hash: "f750f588ee00805bc3757940f95de9ae"
     }
     Frame {
         msec: 656
-        hash: "36ab6549d745c1d0e7a7b47b9d1f6887"
+        hash: "55a79fefc2bf6d42b442e68150e3a9bc"
     }
     Frame {
         msec: 672
-        hash: "d130cecb02cdacc0cdbcce80e492d21b"
+        hash: "7b932e7585e66cc7cd31f858ce78a6e1"
     }
     Frame {
         msec: 688
-        hash: "d1395dbf450e90c4f18c872cd50fca8f"
+        hash: "10f204c59a5bff0c49dfc7691c35cef8"
     }
     Frame {
         msec: 704
-        hash: "7415bda155a9287ba22eac9c0548f10e"
+        hash: "cf901c80729eb0b83b46777e727d43e2"
     }
     Frame {
         msec: 720
-        hash: "b65b886a632b042c00317a4013071f6c"
+        hash: "f6bf6e11ef6a71d7e746fae1d0a44531"
     }
     Frame {
         msec: 736
-        hash: "cf4289cd85cb18bbf1a677008d8f1f0a"
+        hash: "4a8795196ece8c0ef18319008dbc0f2f"
     }
     Frame {
         msec: 752
-        hash: "97a6e76519c522854ec88cc9e40165da"
+        hash: "44d32f0b5377ad3b08928413f20e95e1"
     }
     Frame {
         msec: 768
-        hash: "bb80a571507cdc994f79ef05b0ad3b68"
+        hash: "9e0dd160a465573cbac831a14e36ba6d"
     }
     Frame {
         msec: 784
-        hash: "823d647182b73e0f57ff7aca373160f1"
+        hash: "fb2e2522cee569632d9682aa04e7ca08"
     }
     Frame {
         msec: 800
-        hash: "29b649d6cc3510a904561050bea9aa5b"
+        hash: "71b0e8d7671cee10f4f71a80abcde7ec"
     }
     Frame {
         msec: 816
-        hash: "195089eb803c1eef039bac097e446ae6"
+        hash: "4affee92d320d6eca9995ddd8989627f"
     }
     Frame {
         msec: 832
-        hash: "eb5d4b8a47cec6940c5c5019e1ca2fae"
+        hash: "b3e5e26a34cd491d3cd23f4e611266e2"
     }
     Frame {
         msec: 848
-        hash: "e8aebb115dba21f631ad6bce87615fd3"
+        hash: "aa185efe8d0c4c61d4df55266830cfd8"
     }
     Frame {
         msec: 864
-        hash: "15c9982c4c71542788e563db6e069fd1"
+        hash: "19c01ead1135f84b4b3a32583815fd10"
     }
     Frame {
         msec: 880
-        hash: "8124924f33282195f0a04cb178a332b1"
+        hash: "a231a722225c26ff764f16570d1e6beb"
     }
     Frame {
         msec: 896
-        hash: "0134d4df0b3b524107baa4068c64af7f"
+        hash: "466fce12d10bd4b714d4ead14d1c5839"
     }
     Frame {
         msec: 912
-        hash: "bd3015b94540bafebfc9a7190b0e3d6c"
+        hash: "158650554c8467ed7d93c3c11177e041"
     }
     Frame {
         msec: 928
-        hash: "3edcdf689225edcba379775c86390609"
+        hash: "ac16910bc816ca6c76a78160dda8380d"
     }
     Frame {
         msec: 944
-        hash: "407d4d439efec4cb07c80a5bc6638b51"
+        hash: "23ac6eeb0c9bd48dbc844b1263a18cbb"
     }
     Frame {
         msec: 960
@@ -246,58 +246,58 @@ VisualTest {
     }
     Frame {
         msec: 976
-        hash: "7b58d2d0726bb994d9e651411d76cbe4"
+        hash: "3da0b9d963113cfb58152bac1c757065"
     }
     Frame {
         msec: 992
-        hash: "15801c5e1e470c8c45c24debfb9b478b"
+        hash: "e1a33345ee1372069d9282406f1e5605"
     }
     Frame {
         msec: 1008
-        hash: "e257158a1da8908df7522bede4e9c4d9"
+        hash: "da872c570bccf17e88ac7db1d6d076ae"
     }
     Frame {
         msec: 1024
-        hash: "3cb21bef1761c2f70b880b54ca9234fc"
+        hash: "6feea54c6a7f9895001efeff177f9be9"
     }
     Frame {
         msec: 1040
-        hash: "b5effa369f0ab095f4345e2b9f6caa5f"
+        hash: "09049b33ca46a2fc2d06855e29ae66bf"
     }
     Frame {
         msec: 1056
-        hash: "aaafb43e6290a9e7b351dd7c13b8aaaf"
+        hash: "cd96d789f57ac1d425942416337174f1"
     }
     Frame {
         msec: 1072
-        hash: "8a4b622539868188f40f8c7fe75c6ddf"
+        hash: "0a763dd626e27ad14963aecfb8d7673c"
     }
     Frame {
         msec: 1088
-        hash: "365c2f7c0d1c718cf326864c3ba75d2e"
+        hash: "3d81f68bb7aac95b66b0cd0defbb3657"
     }
     Frame {
         msec: 1104
-        hash: "bac17384d4f375652bbc574459554835"
+        hash: "469b862006f99dfefcca803bc49287e3"
     }
     Frame {
         msec: 1120
-        hash: "6bf6917ee323a05824bd6d071459d0b2"
+        hash: "c3f698102bd46231430ab9e8029b8192"
     }
     Frame {
         msec: 1136
-        hash: "7aee8af3ef6b6592011b29281fb0e545"
+        hash: "421a9b4848a59281aea73c08a7219a33"
     }
     Frame {
         msec: 1152
-        hash: "5351b508cbd2e0352f230d211b864c4f"
+        hash: "0066eaa302678a4be35dca0c3ed33b1c"
     }
     Frame {
         msec: 1168
-        hash: "5a051f26ba6287707dbff8422d1eb9f3"
+        hash: "4cceb05bfeb231189b66f1fbdfaeccd3"
     }
     Frame {
         msec: 1184
-        hash: "67611596f75fe97b13a9cf0dc0313727"
+        hash: "ccf229cdd6fde7ef663791d27a008bee"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.png
index 22863cf..cd436b5 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.png
new file mode 100644
index 0000000..e47b479
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.qml
index 1a8af0e..f6cddc4 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.qml
@@ -6,126 +6,6 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 32
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 48
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 64
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 80
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 96
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 112
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 128
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 144
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 160
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 176
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 192
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 208
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 224
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 240
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 256
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 272
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 288
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 304
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 320
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 336
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 352
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 368
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 384
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 400
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 416
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 432
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Key {
-        type: 6
-        key: 16777249
-        modifiers: 67108864
-        text: ""
-        autorep: false
-        count: 1
-    }
-    Frame {
-        msec: 448
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
-    }
-    Frame {
-        msec: 464
-        hash: "c68e50ef84647962481121e2eb1ba4d4"
+        image: "plaintext2.0.png"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.png
index aac7c8d..ba833a2 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.0.png
index 3f2c403..f41c165 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.1.png
index e94c97b..539e4df 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.2.png
index 847f8a5..47ceaac 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.2.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.3.png
index 9002e80..e24a453 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.3.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.4.png
index 0a399c8..ecf8335 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.4.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.qml
index f714adc..ff5db41 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.qml
@@ -6,87 +6,87 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "fd83046af94eac26d394a5da986e734c"
+        hash: "c1bb09480464b7813bc10b0093d14745"
     }
     Frame {
         msec: 32
-        hash: "c9bf546976fc17de9ea9e877f4978f02"
+        hash: "9d0e449506ce93052216b7a952af3dea"
     }
     Frame {
         msec: 48
-        hash: "c711fd5d0c3900494493f8309b79ad0c"
+        hash: "52641f9d6dfba8bf2b94aa37ade140d1"
     }
     Frame {
         msec: 64
-        hash: "b297d098f02fbbeac830b20b0a5194c5"
+        hash: "7610775f69a461d5487e8bc3db6b6e1f"
     }
     Frame {
         msec: 80
-        hash: "b5e956f236ba52cb673af22417d1aabc"
+        hash: "afe0c3fdcb498f1f6b877c5d808b2555"
     }
     Frame {
         msec: 96
-        hash: "e8cd9511f073ff40a6645ad6aa2b5bee"
+        hash: "97dabf3984492d2f868b36c3e7bfce50"
     }
     Frame {
         msec: 112
-        hash: "315734f8f38efbc810ca2e65bd752ddd"
+        hash: "869624c2ae63b0a447401a955a6fefb1"
     }
     Frame {
         msec: 128
-        hash: "fa7d20c99cb8c20494b558ce8ef860a2"
+        hash: "7031966f014d4acd5b00c46c89f61403"
     }
     Frame {
         msec: 144
-        hash: "56cc00965e12254e0133fe1d914fffb2"
+        hash: "bd5395e7e0aa0d50cb30504f9961c954"
     }
     Frame {
         msec: 160
-        hash: "690aa50862a887edcc9392d1c3ca0424"
+        hash: "a7142c3c1eb9c934e0b258c163fcdfec"
     }
     Frame {
         msec: 176
-        hash: "c3df3735586ed103d137d4902d7a1cc3"
+        hash: "373c57edb812db59f40710305d80e9e9"
     }
     Frame {
         msec: 192
-        hash: "0a2c07dc17922651d2abd6400fff6e43"
+        hash: "78b16507899c3c8de04b55389ea0ad49"
     }
     Frame {
         msec: 208
-        hash: "8004e4ab3ed02f68f6f5f7f5fb9fe6c6"
+        hash: "b0fd95dc2ac09a1cbd67ad0f86682666"
     }
     Frame {
         msec: 224
-        hash: "7937850b86f3611ee1d75da9deb7420d"
+        hash: "5f073a4a89413b6a6c5d6ff52717bb2f"
     }
     Frame {
         msec: 240
-        hash: "ecd42368bf2a9058185b9b25b659f4c6"
+        hash: "82e61a4d3f58ee5104893e254a77f13e"
     }
     Frame {
         msec: 256
-        hash: "e545c6ba42edd1e6a055b48f162315ab"
+        hash: "a8fe05178e6339454d57575692fa3df3"
     }
     Frame {
         msec: 272
-        hash: "f8b28cd90fe0c4aa90e8a69d2d9cdce7"
+        hash: "192f80add5f612b07dcb8d69f2161648"
     }
     Frame {
         msec: 288
-        hash: "49de66674e8f38f925f3505c64201076"
+        hash: "cfd85885f59ea80b0b0152446a829fec"
     }
     Frame {
         msec: 304
-        hash: "b33880917cae07d038620065ec2c1d1c"
+        hash: "a7295dcc92f80a5f343bf05076a03748"
     }
     Frame {
         msec: 320
-        hash: "97c8af8dc7e5372a3a0f5bed0050127e"
+        hash: "2b0b30cfb1c1e4ed8a51d36fb7ccdf57"
     }
     Frame {
         msec: 336
-        hash: "b0236b8c44398cb9f97324f6ca9ce5c4"
+        hash: "419c538908d0226ff4485f1094eaa08e"
     }
     Key {
         type: 6
@@ -98,27 +98,27 @@ VisualTest {
     }
     Frame {
         msec: 352
-        hash: "2695b45a1ea89518d236ef3b8dccd89e"
+        hash: "8afe64448d42419f97ca207487b3b0f8"
     }
     Frame {
         msec: 368
-        hash: "61370b1d04626facfd243176cb4bb79b"
+        hash: "86091218d2d066d8f95a460426266369"
     }
     Frame {
         msec: 384
-        hash: "53c53e501469ca0ef0f0325a13aa4aa4"
+        hash: "fc45978cac92b6cdeeecc2dd4c29aa53"
     }
     Frame {
         msec: 400
-        hash: "c56717a79ccffe756c5423bc5e44a53f"
+        hash: "03a90ae5cbe68cc210e303c78a14e065"
     }
     Frame {
         msec: 416
-        hash: "e5ec3e6d4a7a527e8f2c0afa5fd66c4b"
+        hash: "15603a997aa02afb688aa74cd930f3b4"
     }
     Frame {
         msec: 432
-        hash: "4ccb9af28572e13f961f2057eb98482d"
+        hash: "90bf6b2bf89e1440f0c4d1044c1bd22c"
     }
     Key {
         type: 6
@@ -130,19 +130,19 @@ VisualTest {
     }
     Frame {
         msec: 448
-        hash: "0b8ce455fd40c3cd74fb05d4b603cceb"
+        hash: "4dbdc16538cbbf1a87c6a54e09e02b16"
     }
     Frame {
         msec: 464
-        hash: "f5c3754201dbb6f4ca4f4c1611036c5a"
+        hash: "2011ee59d2ec4bb0ae0d63727f091648"
     }
     Frame {
         msec: 480
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 496
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Key {
         type: 6
@@ -154,35 +154,35 @@ VisualTest {
     }
     Frame {
         msec: 512
-        hash: "5e39a0f9bdc45a7a288f59b7cbbf749d"
+        hash: "7fc65284b99fc548de0985d94a145fa7"
     }
     Frame {
         msec: 528
-        hash: "5e39a0f9bdc45a7a288f59b7cbbf749d"
+        hash: "7fc65284b99fc548de0985d94a145fa7"
     }
     Frame {
         msec: 544
-        hash: "5e39a0f9bdc45a7a288f59b7cbbf749d"
+        hash: "7fc65284b99fc548de0985d94a145fa7"
     }
     Frame {
         msec: 560
-        hash: "5e39a0f9bdc45a7a288f59b7cbbf749d"
+        hash: "7fc65284b99fc548de0985d94a145fa7"
     }
     Frame {
         msec: 576
-        hash: "9e887b7206f31bbb95573ea4ff157579"
+        hash: "b4205f141a7a6b646cf641ba922d588b"
     }
     Frame {
         msec: 592
-        hash: "0d66c3a6c2df2a2ffe95901e55a5f945"
+        hash: "94c3adf5da700bb63ed6eaf0adf8d037"
     }
     Frame {
         msec: 608
-        hash: "af497d287a3cc1637da43f3cad97a479"
+        hash: "62c4757a2e26341655e27417f85ba6d8"
     }
     Frame {
         msec: 624
-        hash: "e7c4f22fcc84e1fdf09191b3ae8529fa"
+        hash: "9de2ce48334b088c0a0960a581f43a36"
     }
     Key {
         type: 7
@@ -194,15 +194,15 @@ VisualTest {
     }
     Frame {
         msec: 640
-        hash: "ec6b2062c0dc274febc63aa3a2313299"
+        hash: "9ca827d4812521d1590ca6e7117bd788"
     }
     Frame {
         msec: 656
-        hash: "de8e8c97aef11ee03bec315fc82a46f8"
+        hash: "66f65cd7215ea89e60d8f60337fffe97"
     }
     Frame {
         msec: 672
-        hash: "2f9e1a13c276282fd70b3242ec136b22"
+        hash: "05caae5e0d092c4d0595286aa4baa6a0"
     }
     Key {
         type: 6
@@ -214,31 +214,31 @@ VisualTest {
     }
     Frame {
         msec: 688
-        hash: "60e390b7bb10dc756c83d5d52c7832f7"
+        hash: "2282153f3ae493aa6ad5377b12d88043"
     }
     Frame {
         msec: 704
-        hash: "76bf44fbfcac0c8a6615ef4ba67ee91d"
+        hash: "aee2503a5d4ec61795b0486da5c53867"
     }
     Frame {
         msec: 720
-        hash: "614e3712c8b91bcbadaedca209fc80dc"
+        hash: "f564e1ae90bc6b1ea4bc84f1729eb487"
     }
     Frame {
         msec: 736
-        hash: "eb2204890d51b1112ea79f37768bb74e"
+        hash: "f5c70adef5725a0574b63dd5ab7d7b12"
     }
     Frame {
         msec: 752
-        hash: "d5b0d7d19ae4d9df059002e619726266"
+        hash: "74ed3230417c69b0dc82ce9cfe4b6cd0"
     }
     Frame {
         msec: 768
-        hash: "9bd5a7fde4e26a5913c41c61175a2fba"
+        hash: "374270279bcc00167d2b63bf9a658785"
     }
     Frame {
         msec: 784
-        hash: "533e6355f554cfc324f90c70484632ab"
+        hash: "68445a2b5470e44baf7af95efc20ba33"
     }
     Key {
         type: 7
@@ -250,43 +250,43 @@ VisualTest {
     }
     Frame {
         msec: 800
-        hash: "bf05da75483bdc6c4945c1c3a4f8b72a"
+        hash: "5add6c9527edf6bbdb3a79b8a524db70"
     }
     Frame {
         msec: 816
-        hash: "9b7468ba9c2d9e354d15f60ca7ecf6b6"
+        hash: "01a96c8407fa2c0f9e7a822249ac9adc"
     }
     Frame {
         msec: 832
-        hash: "5d57dbc8d8996c2275da30a6f22ea37f"
+        hash: "6b9af295d8f2fb5ba8d9c234596d0a88"
     }
     Frame {
         msec: 848
-        hash: "3efa002ab3b856b0b8d4849b8bb6e567"
+        hash: "3837442e90c2a1534e21d21bfc3b46e1"
     }
     Frame {
         msec: 864
-        hash: "84471ddf06c2c90a17bbef9d634ffabc"
+        hash: "afd7d2494dae8e7ef40a165ccc627313"
     }
     Frame {
         msec: 880
-        hash: "cf8460f68815510416dc1cd86dd80c19"
+        hash: "6e7058d540b26d3c5f15804f2f93b835"
     }
     Frame {
         msec: 896
-        hash: "7e1e02e0795e695a423ee3518c9e8e8f"
+        hash: "ffa489a15db741d8b835d998336bc1b3"
     }
     Frame {
         msec: 912
-        hash: "ca5ea92767f31f7fb7e04894edadb73b"
+        hash: "5a0308d1d2a6a36e16ddb312294fcbf8"
     }
     Frame {
         msec: 928
-        hash: "616e57b513b4e950803c49584de106bd"
+        hash: "bd56ed24908c7e8ec4e5ebc75a19ca86"
     }
     Frame {
         msec: 944
-        hash: "718badb44982d10fe92b646aa5dc3d96"
+        hash: "7bd56b12087226100da27776f8943427"
     }
     Frame {
         msec: 960
@@ -294,19 +294,19 @@ VisualTest {
     }
     Frame {
         msec: 976
-        hash: "4acc383cecec9d65dafa3b75b2711577"
+        hash: "f48a56350bba266c2f19deb46d39e174"
     }
     Frame {
         msec: 992
-        hash: "9e26dd446fe8ed2b8a57888bc7f2f643"
+        hash: "9587bb118f2eb2bf8bb3cfc40ed18310"
     }
     Frame {
         msec: 1008
-        hash: "369f454d8f387320423f2b2e568d6ad6"
+        hash: "0f9e9622427ebaf85369b3013ae9aaf0"
     }
     Frame {
         msec: 1024
-        hash: "369f454d8f387320423f2b2e568d6ad6"
+        hash: "0f9e9622427ebaf85369b3013ae9aaf0"
     }
     Key {
         type: 7
@@ -318,39 +318,39 @@ VisualTest {
     }
     Frame {
         msec: 1040
-        hash: "9e26dd446fe8ed2b8a57888bc7f2f643"
+        hash: "9587bb118f2eb2bf8bb3cfc40ed18310"
     }
     Frame {
         msec: 1056
-        hash: "4acc383cecec9d65dafa3b75b2711577"
+        hash: "f48a56350bba266c2f19deb46d39e174"
     }
     Frame {
         msec: 1072
-        hash: "2909eabaad28f76c37c780d0e0d9e357"
+        hash: "8234f16d07e76aeedb6ca14d622453cb"
     }
     Frame {
         msec: 1088
-        hash: "718badb44982d10fe92b646aa5dc3d96"
+        hash: "7bd56b12087226100da27776f8943427"
     }
     Frame {
         msec: 1104
-        hash: "616e57b513b4e950803c49584de106bd"
+        hash: "bd56ed24908c7e8ec4e5ebc75a19ca86"
     }
     Frame {
         msec: 1120
-        hash: "ca5ea92767f31f7fb7e04894edadb73b"
+        hash: "5a0308d1d2a6a36e16ddb312294fcbf8"
     }
     Frame {
         msec: 1136
-        hash: "7e1e02e0795e695a423ee3518c9e8e8f"
+        hash: "ffa489a15db741d8b835d998336bc1b3"
     }
     Frame {
         msec: 1152
-        hash: "cf8460f68815510416dc1cd86dd80c19"
+        hash: "6e7058d540b26d3c5f15804f2f93b835"
     }
     Frame {
         msec: 1168
-        hash: "84471ddf06c2c90a17bbef9d634ffabc"
+        hash: "afd7d2494dae8e7ef40a165ccc627313"
     }
     Key {
         type: 6
@@ -362,31 +362,31 @@ VisualTest {
     }
     Frame {
         msec: 1184
-        hash: "0e4120f723b1b1d879065f0324ba18fa"
+        hash: "1d5c9458d568df773dbff4e333e14de0"
     }
     Frame {
         msec: 1200
-        hash: "2a8c575dbe68797c8a909df9f1166ff8"
+        hash: "8eef242d89b7e2eff7678030f9fd808e"
     }
     Frame {
         msec: 1216
-        hash: "e26abb9311a2b25ed32efb0da41a4d53"
+        hash: "97dc6ebbf64a19f5026c02ea4c79d63b"
     }
     Frame {
         msec: 1232
-        hash: "d35ae7b04e8ddf1962a20f8593c9c18c"
+        hash: "52d2135428c3c2bf85f0fa7c2ba01a25"
     }
     Frame {
         msec: 1248
-        hash: "afbbcee5ea4c854aebb7ba56856cf9c8"
+        hash: "c713bd1d1ab2df81292020e6e822546c"
     }
     Frame {
         msec: 1264
-        hash: "2d97ae4f3657617d4f4df55090c2d0e1"
+        hash: "0c61ff34510168e324c53786720dd953"
     }
     Frame {
         msec: 1280
-        hash: "dc024030252b263dc7dd3c05580d7ec6"
+        hash: "ba1488f2d9d4482cdf41c40af7642030"
     }
     Key {
         type: 7
@@ -398,95 +398,95 @@ VisualTest {
     }
     Frame {
         msec: 1296
-        hash: "c9072651fd565ed8c6d69a258e464fca"
+        hash: "91d2da369579bb72641d4e7e7cd696f5"
     }
     Frame {
         msec: 1312
-        hash: "bb6a90fd1cb94ed4b590c9ae65d31f86"
+        hash: "1cf1d30d6def868a60f434fe84c23c47"
     }
     Frame {
         msec: 1328
-        hash: "d3e5054c8b0a25adb9bd0fe78bd72153"
+        hash: "ba5b3005af3c44caaf7272cbb56e60da"
     }
     Frame {
         msec: 1344
-        hash: "158e31266eae1718958d37d2096b32af"
+        hash: "116ab7576b5e45e6009920854ff87f39"
     }
     Frame {
         msec: 1360
-        hash: "6986bbfaedae3838de7a92f911d1e4d1"
+        hash: "294c76d6f63c230af666b0b86e0c9844"
     }
     Frame {
         msec: 1376
-        hash: "8ab83b3b3038150036d6d6135d6e2d8d"
+        hash: "c721a5b17b1eb4a063fa3b727d13ba62"
     }
     Frame {
         msec: 1392
-        hash: "6749a62f9d9eadc33e2d109c140bfdde"
+        hash: "a98bd750b67a0ef8831c9c66a0b06a28"
     }
     Frame {
         msec: 1408
-        hash: "7519758a28f49b3a669f6676a1b47253"
+        hash: "7739509b0f5e62207ba62262d8822388"
     }
     Frame {
         msec: 1424
-        hash: "a8470fa7ddf69b4f86c5933f85256684"
+        hash: "62d70a7e3ce290c52d37090bf899377c"
     }
     Frame {
         msec: 1440
-        hash: "1f2f34e0dfeb38bd568915718627abf5"
+        hash: "3f3c1137c02e14796c3a4537337d1dd8"
     }
     Frame {
         msec: 1456
-        hash: "d843ec499de0a7c0094a479f75cab4c6"
+        hash: "4997a45af699c1face114c72a9ce067d"
     }
     Frame {
         msec: 1472
-        hash: "25cf1c1efce5ad53695099ffeb93d27f"
+        hash: "093cce71722904a32b030478f3af49bb"
     }
     Frame {
         msec: 1488
-        hash: "25cf1c1efce5ad53695099ffeb93d27f"
+        hash: "093cce71722904a32b030478f3af49bb"
     }
     Frame {
         msec: 1504
-        hash: "25cf1c1efce5ad53695099ffeb93d27f"
+        hash: "093cce71722904a32b030478f3af49bb"
     }
     Frame {
         msec: 1520
-        hash: "25cf1c1efce5ad53695099ffeb93d27f"
+        hash: "093cce71722904a32b030478f3af49bb"
     }
     Frame {
         msec: 1536
-        hash: "25cf1c1efce5ad53695099ffeb93d27f"
+        hash: "093cce71722904a32b030478f3af49bb"
     }
     Frame {
         msec: 1552
-        hash: "25cf1c1efce5ad53695099ffeb93d27f"
+        hash: "093cce71722904a32b030478f3af49bb"
     }
     Frame {
         msec: 1568
-        hash: "444090b334e856ff4f9b9938c7676666"
+        hash: "a4810a97e51259350bb1543dffc156af"
     }
     Frame {
         msec: 1584
-        hash: "6064d9310e5d660c8e1aae9e9cfc6bd3"
+        hash: "838871072acbefc1c8c488f47312da9b"
     }
     Frame {
         msec: 1600
-        hash: "fc562db867e30ac63a9992b3cf554553"
+        hash: "8cfe8847729878519669caa8b702d910"
     }
     Frame {
         msec: 1616
-        hash: "e127594d11d3e4c0d1f3e4585ef3a901"
+        hash: "a2fd8e049d03b87a306bb5b81e3f7311"
     }
     Frame {
         msec: 1632
-        hash: "6d3d43b6a38cf1c64289282bbcaf2ac2"
+        hash: "29bd4d5e36cb6b232f513b6bb0c00b28"
     }
     Frame {
         msec: 1648
-        hash: "bd58d75020a5272ae3cdcb0ed780e496"
+        hash: "9637f14efb2e355bfe886d7c5f2a8d38"
     }
     Key {
         type: 6
@@ -498,35 +498,35 @@ VisualTest {
     }
     Frame {
         msec: 1664
-        hash: "655cdefae8b30a40e6baaa04b790f811"
+        hash: "0365fa8845c3c1e53ef35d22423eb973"
     }
     Frame {
         msec: 1680
-        hash: "a654e6c9c5414593425bd2ccc6a0f916"
+        hash: "bf88d5d2cd2ff062c1cc8a391a238b1d"
     }
     Frame {
         msec: 1696
-        hash: "88e3865dcb7da6be36cff12a1da7c94b"
+        hash: "46b22f33eb80f013e44da11153441864"
     }
     Frame {
         msec: 1712
-        hash: "4d85866e40d8118081d2747af7343c42"
+        hash: "05ae42e3a0296a569dec147c76be273d"
     }
     Frame {
         msec: 1728
-        hash: "d84111903e76a53be7b55d7dc3847914"
+        hash: "1a8cc65973d08bb949f7a71b0bb8be1a"
     }
     Frame {
         msec: 1744
-        hash: "4f7b708a511dc7a882af661ca3282404"
+        hash: "ca3bde8cd8de81c4210fcfd000fe0f5e"
     }
     Frame {
         msec: 1760
-        hash: "29d940c479f0c76c6f4d88e417672878"
+        hash: "e06d104d1ed451eea4c1d9bdae9d10f4"
     }
     Frame {
         msec: 1776
-        hash: "ade916241f4b2a50e6b84f8ae41369ef"
+        hash: "c95153ae401ad8a2e839905841c074f3"
     }
     Key {
         type: 6
@@ -538,35 +538,35 @@ VisualTest {
     }
     Frame {
         msec: 1792
-        hash: "ecd42368bf2a9058185b9b25b659f4c6"
+        hash: "82e61a4d3f58ee5104893e254a77f13e"
     }
     Frame {
         msec: 1808
-        hash: "7937850b86f3611ee1d75da9deb7420d"
+        hash: "5f073a4a89413b6a6c5d6ff52717bb2f"
     }
     Frame {
         msec: 1824
-        hash: "8004e4ab3ed02f68f6f5f7f5fb9fe6c6"
+        hash: "b0fd95dc2ac09a1cbd67ad0f86682666"
     }
     Frame {
         msec: 1840
-        hash: "0a2c07dc17922651d2abd6400fff6e43"
+        hash: "78b16507899c3c8de04b55389ea0ad49"
     }
     Frame {
         msec: 1856
-        hash: "c3df3735586ed103d137d4902d7a1cc3"
+        hash: "373c57edb812db59f40710305d80e9e9"
     }
     Frame {
         msec: 1872
-        hash: "690aa50862a887edcc9392d1c3ca0424"
+        hash: "a7142c3c1eb9c934e0b258c163fcdfec"
     }
     Frame {
         msec: 1888
-        hash: "56cc00965e12254e0133fe1d914fffb2"
+        hash: "bd5395e7e0aa0d50cb30504f9961c954"
     }
     Frame {
         msec: 1904
-        hash: "fa7d20c99cb8c20494b558ce8ef860a2"
+        hash: "7031966f014d4acd5b00c46c89f61403"
     }
     Key {
         type: 7
@@ -582,79 +582,79 @@ VisualTest {
     }
     Frame {
         msec: 1936
-        hash: "e8cd9511f073ff40a6645ad6aa2b5bee"
+        hash: "97dabf3984492d2f868b36c3e7bfce50"
     }
     Frame {
         msec: 1952
-        hash: "b5e956f236ba52cb673af22417d1aabc"
+        hash: "afe0c3fdcb498f1f6b877c5d808b2555"
     }
     Frame {
         msec: 1968
-        hash: "b297d098f02fbbeac830b20b0a5194c5"
+        hash: "7610775f69a461d5487e8bc3db6b6e1f"
     }
     Frame {
         msec: 1984
-        hash: "c711fd5d0c3900494493f8309b79ad0c"
+        hash: "52641f9d6dfba8bf2b94aa37ade140d1"
     }
     Frame {
         msec: 2000
-        hash: "c9bf546976fc17de9ea9e877f4978f02"
+        hash: "9d0e449506ce93052216b7a952af3dea"
     }
     Frame {
         msec: 2016
-        hash: "fd83046af94eac26d394a5da986e734c"
+        hash: "c1bb09480464b7813bc10b0093d14745"
     }
     Frame {
         msec: 2032
-        hash: "c9bf546976fc17de9ea9e877f4978f02"
+        hash: "9d0e449506ce93052216b7a952af3dea"
     }
     Frame {
         msec: 2048
-        hash: "c711fd5d0c3900494493f8309b79ad0c"
+        hash: "52641f9d6dfba8bf2b94aa37ade140d1"
     }
     Frame {
         msec: 2064
-        hash: "b297d098f02fbbeac830b20b0a5194c5"
+        hash: "7610775f69a461d5487e8bc3db6b6e1f"
     }
     Frame {
         msec: 2080
-        hash: "b5e956f236ba52cb673af22417d1aabc"
+        hash: "afe0c3fdcb498f1f6b877c5d808b2555"
     }
     Frame {
         msec: 2096
-        hash: "e8cd9511f073ff40a6645ad6aa2b5bee"
+        hash: "97dabf3984492d2f868b36c3e7bfce50"
     }
     Frame {
         msec: 2112
-        hash: "315734f8f38efbc810ca2e65bd752ddd"
+        hash: "869624c2ae63b0a447401a955a6fefb1"
     }
     Frame {
         msec: 2128
-        hash: "fa7d20c99cb8c20494b558ce8ef860a2"
+        hash: "7031966f014d4acd5b00c46c89f61403"
     }
     Frame {
         msec: 2144
-        hash: "56cc00965e12254e0133fe1d914fffb2"
+        hash: "bd5395e7e0aa0d50cb30504f9961c954"
     }
     Frame {
         msec: 2160
-        hash: "690aa50862a887edcc9392d1c3ca0424"
+        hash: "a7142c3c1eb9c934e0b258c163fcdfec"
     }
     Frame {
         msec: 2176
-        hash: "c3df3735586ed103d137d4902d7a1cc3"
+        hash: "373c57edb812db59f40710305d80e9e9"
     }
     Frame {
         msec: 2192
-        hash: "0a2c07dc17922651d2abd6400fff6e43"
+        hash: "78b16507899c3c8de04b55389ea0ad49"
     }
     Frame {
         msec: 2208
-        hash: "8004e4ab3ed02f68f6f5f7f5fb9fe6c6"
+        hash: "b0fd95dc2ac09a1cbd67ad0f86682666"
     }
     Frame {
         msec: 2224
-        hash: "7937850b86f3611ee1d75da9deb7420d"
+        hash: "5f073a4a89413b6a6c5d6ff52717bb2f"
     }
     Key {
         type: 7
@@ -666,35 +666,35 @@ VisualTest {
     }
     Frame {
         msec: 2240
-        hash: "ecd42368bf2a9058185b9b25b659f4c6"
+        hash: "82e61a4d3f58ee5104893e254a77f13e"
     }
     Frame {
         msec: 2256
-        hash: "e545c6ba42edd1e6a055b48f162315ab"
+        hash: "a8fe05178e6339454d57575692fa3df3"
     }
     Frame {
         msec: 2272
-        hash: "f8b28cd90fe0c4aa90e8a69d2d9cdce7"
+        hash: "192f80add5f612b07dcb8d69f2161648"
     }
     Frame {
         msec: 2288
-        hash: "49de66674e8f38f925f3505c64201076"
+        hash: "cfd85885f59ea80b0b0152446a829fec"
     }
     Frame {
         msec: 2304
-        hash: "b33880917cae07d038620065ec2c1d1c"
+        hash: "a7295dcc92f80a5f343bf05076a03748"
     }
     Frame {
         msec: 2320
-        hash: "97c8af8dc7e5372a3a0f5bed0050127e"
+        hash: "2b0b30cfb1c1e4ed8a51d36fb7ccdf57"
     }
     Frame {
         msec: 2336
-        hash: "b0236b8c44398cb9f97324f6ca9ce5c4"
+        hash: "419c538908d0226ff4485f1094eaa08e"
     }
     Frame {
         msec: 2352
-        hash: "2695b45a1ea89518d236ef3b8dccd89e"
+        hash: "8afe64448d42419f97ca207487b3b0f8"
     }
     Key {
         type: 6
@@ -706,35 +706,35 @@ VisualTest {
     }
     Frame {
         msec: 2368
-        hash: "61370b1d04626facfd243176cb4bb79b"
+        hash: "86091218d2d066d8f95a460426266369"
     }
     Frame {
         msec: 2384
-        hash: "53c53e501469ca0ef0f0325a13aa4aa4"
+        hash: "fc45978cac92b6cdeeecc2dd4c29aa53"
     }
     Frame {
         msec: 2400
-        hash: "c56717a79ccffe756c5423bc5e44a53f"
+        hash: "03a90ae5cbe68cc210e303c78a14e065"
     }
     Frame {
         msec: 2416
-        hash: "e5ec3e6d4a7a527e8f2c0afa5fd66c4b"
+        hash: "15603a997aa02afb688aa74cd930f3b4"
     }
     Frame {
         msec: 2432
-        hash: "4ccb9af28572e13f961f2057eb98482d"
+        hash: "90bf6b2bf89e1440f0c4d1044c1bd22c"
     }
     Frame {
         msec: 2448
-        hash: "0b8ce455fd40c3cd74fb05d4b603cceb"
+        hash: "4dbdc16538cbbf1a87c6a54e09e02b16"
     }
     Frame {
         msec: 2464
-        hash: "f5c3754201dbb6f4ca4f4c1611036c5a"
+        hash: "2011ee59d2ec4bb0ae0d63727f091648"
     }
     Frame {
         msec: 2480
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Key {
         type: 7
@@ -746,95 +746,95 @@ VisualTest {
     }
     Frame {
         msec: 2496
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 2512
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 2528
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 2544
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 2560
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 2576
-        hash: "3c1972940b70a388ebfd007b0b5d9860"
+        hash: "02996bef06c74f34cf8be4cf4d1392d5"
     }
     Frame {
         msec: 2592
-        hash: "674707d6ae5ef5109940f1bd62427a63"
+        hash: "2d8cb2d213ce22132ba63a829c07f768"
     }
     Frame {
         msec: 2608
-        hash: "8f512390b74d7a545eb60a86d4b8dee6"
+        hash: "0a16c282a18fdc657ea48fb208dea494"
     }
     Frame {
         msec: 2624
-        hash: "0502cfe70da38a6ebccd7fdf799be464"
+        hash: "86baec52ccb8ae818439c637c5be1514"
     }
     Frame {
         msec: 2640
-        hash: "23c45beae15b893ec4450b0d380aeb17"
+        hash: "72e2415581ba2a96b8f23cf8f5985afb"
     }
     Frame {
         msec: 2656
-        hash: "45de58892db757e76c95ddb76e267f6f"
+        hash: "7776d964b2b5f80bac51a29d298a067f"
     }
     Frame {
         msec: 2672
-        hash: "ff3f1529c937c4d95cf4dfb8592759dc"
+        hash: "3b5d0a9f961c2102a4118a8e2d2793ae"
     }
     Frame {
         msec: 2688
-        hash: "236c6e16bbfab9268f488d6dbf9544be"
+        hash: "048b5e51d9bcf8d1b24c8f8f98b7b4e4"
     }
     Frame {
         msec: 2704
-        hash: "3bb19cbddf5e66c08bdd5c881e93db3e"
+        hash: "d30e5d7c27b72ec95c41a87741061a3f"
     }
     Frame {
         msec: 2720
-        hash: "057ea6d1007993908c9c398391b85072"
+        hash: "0374cc41cdb6528e212f678e0e049f2b"
     }
     Frame {
         msec: 2736
-        hash: "faa124cd5d0a027dc5e3b92125bc9cc5"
+        hash: "c80bc90c90b02d1d42176f16fa992f27"
     }
     Frame {
         msec: 2752
-        hash: "234ac2e7f0b87a86e0678e3cbc5a1e30"
+        hash: "70182707dbdf87a2c8db556f030bec17"
     }
     Frame {
         msec: 2768
-        hash: "bdee3016f1811188691786bafe305196"
+        hash: "0c6c0c3d27d87128d65b40789714dd6b"
     }
     Frame {
         msec: 2784
-        hash: "9ecc192aec9b15314132b16dd3f43860"
+        hash: "46e1debee4ca606492a36de6191f4594"
     }
     Frame {
         msec: 2800
-        hash: "26dc03cf86d6812cfb788599b1c34de0"
+        hash: "f327bb2ea12b2baffc0a98d44a0ded16"
     }
     Frame {
         msec: 2816
-        hash: "8752b33ae49ea6d1ee27376d8585776e"
+        hash: "15bc04b65bde5e8ca69b6a1f88647c16"
     }
     Frame {
         msec: 2832
-        hash: "a181b264ba729ad1d8ff91a0c56fb98a"
+        hash: "27156c3309835ec20a02877f1188e14a"
     }
     Frame {
         msec: 2848
-        hash: "af426cd28c90ac2d46d2b2478ce616f3"
+        hash: "a163019c9feff0f4d1bb4aaedcd2ecd4"
     }
     Key {
         type: 6
@@ -846,7 +846,7 @@ VisualTest {
     }
     Frame {
         msec: 2864
-        hash: "7462f7f9c339fc4d8b0c08e54b0ed71d"
+        hash: "c5569c3c06bcf01b7e69e7f7ad6203ef"
     }
     Frame {
         msec: 2880
@@ -854,27 +854,27 @@ VisualTest {
     }
     Frame {
         msec: 2896
-        hash: "10f5b360c3809fbe51de55f47199c541"
+        hash: "5d1c41e371b1a95426882b3991383b6b"
     }
     Frame {
         msec: 2912
-        hash: "ecab3f62c89e1cb9ff9b10ace4cdb40b"
+        hash: "4b9581a767fc1c94451780c044baf003"
     }
     Frame {
         msec: 2928
-        hash: "d3eac9d8cd01bbb44fd61fca497230c0"
+        hash: "39978ba9bb1a535d7735228c650add38"
     }
     Frame {
         msec: 2944
-        hash: "33ff6af85e783c617a42ca5021d1463b"
+        hash: "1a2afe394227dcf2da118559e2e58fd7"
     }
     Frame {
         msec: 2960
-        hash: "a53cccc463d6f6fc24dc0d6309246640"
+        hash: "2f6bdb7af9bf9334231180b6113b125f"
     }
     Frame {
         msec: 2976
-        hash: "8fc354dd6ddbd829240a3c2c9dcafdeb"
+        hash: "85017ca5ca286830e2745abf2f1f963a"
     }
     Key {
         type: 7
@@ -886,63 +886,63 @@ VisualTest {
     }
     Frame {
         msec: 2992
-        hash: "0529a6cb7083caf513de4677970ed33f"
+        hash: "3760b42a25e332c6df49bd92109dae98"
     }
     Frame {
         msec: 3008
-        hash: "bb38f9cdd67d18bc9297b353d499bb35"
+        hash: "7c0347f97f9e4d7fcf47a90b336d264a"
     }
     Frame {
         msec: 3024
-        hash: "bb38f9cdd67d18bc9297b353d499bb35"
+        hash: "7c0347f97f9e4d7fcf47a90b336d264a"
     }
     Frame {
         msec: 3040
-        hash: "0529a6cb7083caf513de4677970ed33f"
+        hash: "3760b42a25e332c6df49bd92109dae98"
     }
     Frame {
         msec: 3056
-        hash: "8fc354dd6ddbd829240a3c2c9dcafdeb"
+        hash: "85017ca5ca286830e2745abf2f1f963a"
     }
     Frame {
         msec: 3072
-        hash: "a53cccc463d6f6fc24dc0d6309246640"
+        hash: "2f6bdb7af9bf9334231180b6113b125f"
     }
     Frame {
         msec: 3088
-        hash: "33ff6af85e783c617a42ca5021d1463b"
+        hash: "1a2afe394227dcf2da118559e2e58fd7"
     }
     Frame {
         msec: 3104
-        hash: "d3eac9d8cd01bbb44fd61fca497230c0"
+        hash: "39978ba9bb1a535d7735228c650add38"
     }
     Frame {
         msec: 3120
-        hash: "ecab3f62c89e1cb9ff9b10ace4cdb40b"
+        hash: "4b9581a767fc1c94451780c044baf003"
     }
     Frame {
         msec: 3136
-        hash: "10f5b360c3809fbe51de55f47199c541"
+        hash: "5d1c41e371b1a95426882b3991383b6b"
     }
     Frame {
         msec: 3152
-        hash: "2a0b3f5170c31a2f2ae512ab3c4268fc"
+        hash: "73c771b964becb418289e0674571eb6f"
     }
     Frame {
         msec: 3168
-        hash: "7462f7f9c339fc4d8b0c08e54b0ed71d"
+        hash: "c5569c3c06bcf01b7e69e7f7ad6203ef"
     }
     Frame {
         msec: 3184
-        hash: "0367ee5e3204a54d225791fbd833fc21"
+        hash: "7c55078e04b56c9aba7d227917323021"
     }
     Frame {
         msec: 3200
-        hash: "86f96b2b846cad8660d80f7dbda24806"
+        hash: "01c6b78b296c00e4597ae1bd36a65f3a"
     }
     Frame {
         msec: 3216
-        hash: "ce05bb9e0a7bd884c12f100b9d219461"
+        hash: "67e9271f71b2d6d9eb2e230953db06c5"
     }
     Key {
         type: 6
@@ -954,31 +954,31 @@ VisualTest {
     }
     Frame {
         msec: 3232
-        hash: "8b04473fad0ffec6b56d2dca8d4dd81c"
+        hash: "642a6f4d7b3f467263b8e033578927af"
     }
     Frame {
         msec: 3248
-        hash: "cedcf233a83047beef7a8aa3486df671"
+        hash: "9f000f97b33427860cb5daeb259c72ea"
     }
     Frame {
         msec: 3264
-        hash: "8117b9590a36bbb4fd0d73c1df2e655e"
+        hash: "d74e3f977b5decb89dda46ea608a933a"
     }
     Frame {
         msec: 3280
-        hash: "5c3168c676a7dc35913e365b2acafea1"
+        hash: "f4e446cd96a3eb1a0df83cf032e7a0b2"
     }
     Frame {
         msec: 3296
-        hash: "4314ebdafbfbad5f108a4cb9874ed06c"
+        hash: "abe715855a79a8ced43000884c4bf04b"
     }
     Frame {
         msec: 3312
-        hash: "d2ffe99b443ecf1188bd3639ddbccda3"
+        hash: "29fd5c17b9a169c1850aa538b4006084"
     }
     Frame {
         msec: 3328
-        hash: "a0894a3492ed7e5bf5b834db890325e2"
+        hash: "cefdcaebb9c319ac358b0d7fc9424327"
     }
     Key {
         type: 7
@@ -990,103 +990,103 @@ VisualTest {
     }
     Frame {
         msec: 3344
-        hash: "57498e86bdc3cfd37bf29505c289d100"
+        hash: "85bfa23957bb5cd947e0819ffa442ea3"
     }
     Frame {
         msec: 3360
-        hash: "57d77411f30c4733f2afec2fc99f3d0b"
+        hash: "48f18d9d12331dc8725ea9e4b7f79823"
     }
     Frame {
         msec: 3376
-        hash: "a3c4b4fef44c4019daba366c1e3a58b1"
+        hash: "63cde59ffbbe2b9087ca228733de18dd"
     }
     Frame {
         msec: 3392
-        hash: "f8461558248b7da3bdf2df641154171a"
+        hash: "73f5d4594f23ff4aac5e42aee00dce81"
     }
     Frame {
         msec: 3408
-        hash: "13e84656ef70bf07e2a444d60ac933e1"
+        hash: "51a1b8e79d209643d55d4cecc6a70ed0"
     }
     Frame {
         msec: 3424
-        hash: "186d8a59092cfe4128b46a3c87eb347b"
+        hash: "7f2ae476246b23d79997a2545723ff62"
     }
     Frame {
         msec: 3440
-        hash: "ac4898002fdc5ea7894d741cac863c8d"
+        hash: "996da2eff9302908a55308dbcc8fb3c2"
     }
     Frame {
         msec: 3456
-        hash: "2e95c1966c94acccd2a44a6c2942d36d"
+        hash: "264f34128dfe563126b9f187c65df61e"
     }
     Frame {
         msec: 3472
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 3488
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 3504
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 3520
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 3536
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 3552
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 3568
-        hash: "7f83ba29fd27aa4817b7b84afbc8d6d7"
+        hash: "70d6b73499c36138bee63e07afb0b186"
     }
     Frame {
         msec: 3584
-        hash: "8575a99b28bb5b8c2d01a5ed91f25d47"
+        hash: "66500c2cc3d69b9fb48dc46e384aca6d"
     }
     Frame {
         msec: 3600
-        hash: "eda67cb2d32f3f605a74a01148f04c99"
+        hash: "6ccc70f6120acb53152b71bcf95514ca"
     }
     Frame {
         msec: 3616
-        hash: "1d65e6e7160f092fe65f683df7c10f92"
+        hash: "5c10e6b0e541fe913b589601a55ea6ce"
     }
     Frame {
         msec: 3632
-        hash: "274c59f268f667a1f11b8ea04a4f88a0"
+        hash: "2c62584e4c09c1d22f9016aa6fa74e10"
     }
     Frame {
         msec: 3648
-        hash: "e46d917e79910b3319c4579776bbdd60"
+        hash: "fd8f53e36a86ae22deb4f7af5aa1eb81"
     }
     Frame {
         msec: 3664
-        hash: "42b7662aad44804653101117ca698023"
+        hash: "e33226eb0e81a64bed7bcdb50e99cd13"
     }
     Frame {
         msec: 3680
-        hash: "dda5147cb6e4e8f61819de6a90dcb165"
+        hash: "a7053a2b7bc9f4749c290bace6b55634"
     }
     Frame {
         msec: 3696
-        hash: "b4a5dcd0bb667d3a42c8f0703d753ed6"
+        hash: "782cb4e647e849ac7299d41f04bc89e3"
     }
     Frame {
         msec: 3712
-        hash: "4ae70de6785fdbecf7650637c8e99a71"
+        hash: "0f7d04fe594ae027364a7c2b570c5a27"
     }
     Frame {
         msec: 3728
-        hash: "22dc8343eab28b0526d5486405b68478"
+        hash: "dfb00adcdc2f68bfb691bce47845b0e7"
     }
     Key {
         type: 6
@@ -1098,27 +1098,27 @@ VisualTest {
     }
     Frame {
         msec: 3744
-        hash: "49de66674e8f38f925f3505c64201076"
+        hash: "cfd85885f59ea80b0b0152446a829fec"
     }
     Frame {
         msec: 3760
-        hash: "f8b28cd90fe0c4aa90e8a69d2d9cdce7"
+        hash: "192f80add5f612b07dcb8d69f2161648"
     }
     Frame {
         msec: 3776
-        hash: "e545c6ba42edd1e6a055b48f162315ab"
+        hash: "a8fe05178e6339454d57575692fa3df3"
     }
     Frame {
         msec: 3792
-        hash: "ecd42368bf2a9058185b9b25b659f4c6"
+        hash: "82e61a4d3f58ee5104893e254a77f13e"
     }
     Frame {
         msec: 3808
-        hash: "7937850b86f3611ee1d75da9deb7420d"
+        hash: "5f073a4a89413b6a6c5d6ff52717bb2f"
     }
     Frame {
         msec: 3824
-        hash: "8004e4ab3ed02f68f6f5f7f5fb9fe6c6"
+        hash: "b0fd95dc2ac09a1cbd67ad0f86682666"
     }
     Frame {
         msec: 3840
@@ -1134,59 +1134,59 @@ VisualTest {
     }
     Frame {
         msec: 3856
-        hash: "c3df3735586ed103d137d4902d7a1cc3"
+        hash: "373c57edb812db59f40710305d80e9e9"
     }
     Frame {
         msec: 3872
-        hash: "690aa50862a887edcc9392d1c3ca0424"
+        hash: "a7142c3c1eb9c934e0b258c163fcdfec"
     }
     Frame {
         msec: 3888
-        hash: "56cc00965e12254e0133fe1d914fffb2"
+        hash: "bd5395e7e0aa0d50cb30504f9961c954"
     }
     Frame {
         msec: 3904
-        hash: "fa7d20c99cb8c20494b558ce8ef860a2"
+        hash: "7031966f014d4acd5b00c46c89f61403"
     }
     Frame {
         msec: 3920
-        hash: "315734f8f38efbc810ca2e65bd752ddd"
+        hash: "869624c2ae63b0a447401a955a6fefb1"
     }
     Frame {
         msec: 3936
-        hash: "e8cd9511f073ff40a6645ad6aa2b5bee"
+        hash: "97dabf3984492d2f868b36c3e7bfce50"
     }
     Frame {
         msec: 3952
-        hash: "b5e956f236ba52cb673af22417d1aabc"
+        hash: "afe0c3fdcb498f1f6b877c5d808b2555"
     }
     Frame {
         msec: 3968
-        hash: "b297d098f02fbbeac830b20b0a5194c5"
+        hash: "7610775f69a461d5487e8bc3db6b6e1f"
     }
     Frame {
         msec: 3984
-        hash: "c711fd5d0c3900494493f8309b79ad0c"
+        hash: "52641f9d6dfba8bf2b94aa37ade140d1"
     }
     Frame {
         msec: 4000
-        hash: "c9bf546976fc17de9ea9e877f4978f02"
+        hash: "9d0e449506ce93052216b7a952af3dea"
     }
     Frame {
         msec: 4016
-        hash: "fd83046af94eac26d394a5da986e734c"
+        hash: "c1bb09480464b7813bc10b0093d14745"
     }
     Frame {
         msec: 4032
-        hash: "c9bf546976fc17de9ea9e877f4978f02"
+        hash: "9d0e449506ce93052216b7a952af3dea"
     }
     Frame {
         msec: 4048
-        hash: "c711fd5d0c3900494493f8309b79ad0c"
+        hash: "52641f9d6dfba8bf2b94aa37ade140d1"
     }
     Frame {
         msec: 4064
-        hash: "b297d098f02fbbeac830b20b0a5194c5"
+        hash: "7610775f69a461d5487e8bc3db6b6e1f"
     }
     Key {
         type: 7
@@ -1198,183 +1198,183 @@ VisualTest {
     }
     Frame {
         msec: 4080
-        hash: "b5e956f236ba52cb673af22417d1aabc"
+        hash: "afe0c3fdcb498f1f6b877c5d808b2555"
     }
     Frame {
         msec: 4096
-        hash: "e8cd9511f073ff40a6645ad6aa2b5bee"
+        hash: "97dabf3984492d2f868b36c3e7bfce50"
     }
     Frame {
         msec: 4112
-        hash: "315734f8f38efbc810ca2e65bd752ddd"
+        hash: "869624c2ae63b0a447401a955a6fefb1"
     }
     Frame {
         msec: 4128
-        hash: "fa7d20c99cb8c20494b558ce8ef860a2"
+        hash: "7031966f014d4acd5b00c46c89f61403"
     }
     Frame {
         msec: 4144
-        hash: "56cc00965e12254e0133fe1d914fffb2"
+        hash: "bd5395e7e0aa0d50cb30504f9961c954"
     }
     Frame {
         msec: 4160
-        hash: "690aa50862a887edcc9392d1c3ca0424"
+        hash: "a7142c3c1eb9c934e0b258c163fcdfec"
     }
     Frame {
         msec: 4176
-        hash: "c3df3735586ed103d137d4902d7a1cc3"
+        hash: "373c57edb812db59f40710305d80e9e9"
     }
     Frame {
         msec: 4192
-        hash: "0a2c07dc17922651d2abd6400fff6e43"
+        hash: "78b16507899c3c8de04b55389ea0ad49"
     }
     Frame {
         msec: 4208
-        hash: "8004e4ab3ed02f68f6f5f7f5fb9fe6c6"
+        hash: "b0fd95dc2ac09a1cbd67ad0f86682666"
     }
     Frame {
         msec: 4224
-        hash: "7937850b86f3611ee1d75da9deb7420d"
+        hash: "5f073a4a89413b6a6c5d6ff52717bb2f"
     }
     Frame {
         msec: 4240
-        hash: "ecd42368bf2a9058185b9b25b659f4c6"
+        hash: "82e61a4d3f58ee5104893e254a77f13e"
     }
     Frame {
         msec: 4256
-        hash: "e545c6ba42edd1e6a055b48f162315ab"
+        hash: "a8fe05178e6339454d57575692fa3df3"
     }
     Frame {
         msec: 4272
-        hash: "f8b28cd90fe0c4aa90e8a69d2d9cdce7"
+        hash: "192f80add5f612b07dcb8d69f2161648"
     }
     Frame {
         msec: 4288
-        hash: "49de66674e8f38f925f3505c64201076"
+        hash: "cfd85885f59ea80b0b0152446a829fec"
     }
     Frame {
         msec: 4304
-        hash: "b33880917cae07d038620065ec2c1d1c"
+        hash: "a7295dcc92f80a5f343bf05076a03748"
     }
     Frame {
         msec: 4320
-        hash: "97c8af8dc7e5372a3a0f5bed0050127e"
+        hash: "2b0b30cfb1c1e4ed8a51d36fb7ccdf57"
     }
     Frame {
         msec: 4336
-        hash: "b0236b8c44398cb9f97324f6ca9ce5c4"
+        hash: "419c538908d0226ff4485f1094eaa08e"
     }
     Frame {
         msec: 4352
-        hash: "2695b45a1ea89518d236ef3b8dccd89e"
+        hash: "8afe64448d42419f97ca207487b3b0f8"
     }
     Frame {
         msec: 4368
-        hash: "61370b1d04626facfd243176cb4bb79b"
+        hash: "86091218d2d066d8f95a460426266369"
     }
     Frame {
         msec: 4384
-        hash: "53c53e501469ca0ef0f0325a13aa4aa4"
+        hash: "fc45978cac92b6cdeeecc2dd4c29aa53"
     }
     Frame {
         msec: 4400
-        hash: "c56717a79ccffe756c5423bc5e44a53f"
+        hash: "03a90ae5cbe68cc210e303c78a14e065"
     }
     Frame {
         msec: 4416
-        hash: "e5ec3e6d4a7a527e8f2c0afa5fd66c4b"
+        hash: "15603a997aa02afb688aa74cd930f3b4"
     }
     Frame {
         msec: 4432
-        hash: "4ccb9af28572e13f961f2057eb98482d"
+        hash: "90bf6b2bf89e1440f0c4d1044c1bd22c"
     }
     Frame {
         msec: 4448
-        hash: "0b8ce455fd40c3cd74fb05d4b603cceb"
+        hash: "4dbdc16538cbbf1a87c6a54e09e02b16"
     }
     Frame {
         msec: 4464
-        hash: "f5c3754201dbb6f4ca4f4c1611036c5a"
+        hash: "2011ee59d2ec4bb0ae0d63727f091648"
     }
     Frame {
         msec: 4480
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 4496
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 4512
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 4528
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 4544
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 4560
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 4576
-        hash: "3c1972940b70a388ebfd007b0b5d9860"
+        hash: "02996bef06c74f34cf8be4cf4d1392d5"
     }
     Frame {
         msec: 4592
-        hash: "674707d6ae5ef5109940f1bd62427a63"
+        hash: "2d8cb2d213ce22132ba63a829c07f768"
     }
     Frame {
         msec: 4608
-        hash: "8f512390b74d7a545eb60a86d4b8dee6"
+        hash: "0a16c282a18fdc657ea48fb208dea494"
     }
     Frame {
         msec: 4624
-        hash: "0502cfe70da38a6ebccd7fdf799be464"
+        hash: "86baec52ccb8ae818439c637c5be1514"
     }
     Frame {
         msec: 4640
-        hash: "23c45beae15b893ec4450b0d380aeb17"
+        hash: "72e2415581ba2a96b8f23cf8f5985afb"
     }
     Frame {
         msec: 4656
-        hash: "45de58892db757e76c95ddb76e267f6f"
+        hash: "7776d964b2b5f80bac51a29d298a067f"
     }
     Frame {
         msec: 4672
-        hash: "ff3f1529c937c4d95cf4dfb8592759dc"
+        hash: "3b5d0a9f961c2102a4118a8e2d2793ae"
     }
     Frame {
         msec: 4688
-        hash: "236c6e16bbfab9268f488d6dbf9544be"
+        hash: "048b5e51d9bcf8d1b24c8f8f98b7b4e4"
     }
     Frame {
         msec: 4704
-        hash: "3bb19cbddf5e66c08bdd5c881e93db3e"
+        hash: "d30e5d7c27b72ec95c41a87741061a3f"
     }
     Frame {
         msec: 4720
-        hash: "057ea6d1007993908c9c398391b85072"
+        hash: "0374cc41cdb6528e212f678e0e049f2b"
     }
     Frame {
         msec: 4736
-        hash: "faa124cd5d0a027dc5e3b92125bc9cc5"
+        hash: "c80bc90c90b02d1d42176f16fa992f27"
     }
     Frame {
         msec: 4752
-        hash: "234ac2e7f0b87a86e0678e3cbc5a1e30"
+        hash: "70182707dbdf87a2c8db556f030bec17"
     }
     Frame {
         msec: 4768
-        hash: "bdee3016f1811188691786bafe305196"
+        hash: "0c6c0c3d27d87128d65b40789714dd6b"
     }
     Frame {
         msec: 4784
-        hash: "9ecc192aec9b15314132b16dd3f43860"
+        hash: "46e1debee4ca606492a36de6191f4594"
     }
     Frame {
         msec: 4800
@@ -1382,118 +1382,118 @@ VisualTest {
     }
     Frame {
         msec: 4816
-        hash: "8752b33ae49ea6d1ee27376d8585776e"
+        hash: "15bc04b65bde5e8ca69b6a1f88647c16"
     }
     Frame {
         msec: 4832
-        hash: "a181b264ba729ad1d8ff91a0c56fb98a"
+        hash: "27156c3309835ec20a02877f1188e14a"
     }
     Frame {
         msec: 4848
-        hash: "af426cd28c90ac2d46d2b2478ce616f3"
+        hash: "a163019c9feff0f4d1bb4aaedcd2ecd4"
     }
     Frame {
         msec: 4864
-        hash: "d062f03ccc0eb1f56aba411e1078c4ab"
+        hash: "35f243da98f9934d5ac0a7cc1fde73ef"
     }
     Frame {
         msec: 4880
-        hash: "793cb0a98cac4a0f5d9a1dc5df5cd0ce"
+        hash: "42d393d75e0c1d5aea0e1694190e4507"
     }
     Frame {
         msec: 4896
-        hash: "da1f9732e1d7cd0b82f0c0949937067e"
+        hash: "0ec47c6c74efd66d339d9be13148e334"
     }
     Frame {
         msec: 4912
-        hash: "35d38ce67e19453f255241473294f7e9"
+        hash: "2e7597e8d03f0a05cf96fe7e2a3ee540"
     }
     Frame {
         msec: 4928
-        hash: "e8c5d9895119167f2fcb4a15b0f1b65e"
+        hash: "093c9e5ac431284de7e81e082868c5db"
     }
     Frame {
         msec: 4944
-        hash: "26c0d91942f1cb3313d604804d1e4b9e"
+        hash: "60ae71c4a6c905f47b2b457d9167153b"
     }
     Frame {
         msec: 4960
-        hash: "eaf1ba458119f6d3dedcd581d5c04f8c"
+        hash: "e4be7897b1b30ab916a53df2998282d7"
     }
     Frame {
         msec: 4976
-        hash: "a54c778d78c9a715ce0429e9c366ef8b"
+        hash: "c082b97799dffdb73ad65b2920507e9c"
     }
     Frame {
         msec: 4992
-        hash: "f3a8edba1311c54a12024dbcf1656b85"
+        hash: "aadaab0547a4f15c533589b531f39504"
     }
     Frame {
         msec: 5008
-        hash: "7c5c30318c41ab5c5874239bbcfbaae2"
+        hash: "847f0a1faf094e73d533692fa47a030a"
     }
     Frame {
         msec: 5024
-        hash: "7c5c30318c41ab5c5874239bbcfbaae2"
+        hash: "847f0a1faf094e73d533692fa47a030a"
     }
     Frame {
         msec: 5040
-        hash: "f3a8edba1311c54a12024dbcf1656b85"
+        hash: "aadaab0547a4f15c533589b531f39504"
     }
     Frame {
         msec: 5056
-        hash: "a54c778d78c9a715ce0429e9c366ef8b"
+        hash: "c082b97799dffdb73ad65b2920507e9c"
     }
     Frame {
         msec: 5072
-        hash: "eaf1ba458119f6d3dedcd581d5c04f8c"
+        hash: "e4be7897b1b30ab916a53df2998282d7"
     }
     Frame {
         msec: 5088
-        hash: "26c0d91942f1cb3313d604804d1e4b9e"
+        hash: "60ae71c4a6c905f47b2b457d9167153b"
     }
     Frame {
         msec: 5104
-        hash: "e8c5d9895119167f2fcb4a15b0f1b65e"
+        hash: "093c9e5ac431284de7e81e082868c5db"
     }
     Frame {
         msec: 5120
-        hash: "35d38ce67e19453f255241473294f7e9"
+        hash: "2e7597e8d03f0a05cf96fe7e2a3ee540"
     }
     Frame {
         msec: 5136
-        hash: "da1f9732e1d7cd0b82f0c0949937067e"
+        hash: "0ec47c6c74efd66d339d9be13148e334"
     }
     Frame {
         msec: 5152
-        hash: "793cb0a98cac4a0f5d9a1dc5df5cd0ce"
+        hash: "42d393d75e0c1d5aea0e1694190e4507"
     }
     Frame {
         msec: 5168
-        hash: "d062f03ccc0eb1f56aba411e1078c4ab"
+        hash: "35f243da98f9934d5ac0a7cc1fde73ef"
     }
     Frame {
         msec: 5184
-        hash: "af426cd28c90ac2d46d2b2478ce616f3"
+        hash: "a163019c9feff0f4d1bb4aaedcd2ecd4"
     }
     Frame {
         msec: 5200
-        hash: "a181b264ba729ad1d8ff91a0c56fb98a"
+        hash: "27156c3309835ec20a02877f1188e14a"
     }
     Frame {
         msec: 5216
-        hash: "8752b33ae49ea6d1ee27376d8585776e"
+        hash: "15bc04b65bde5e8ca69b6a1f88647c16"
     }
     Frame {
         msec: 5232
-        hash: "26dc03cf86d6812cfb788599b1c34de0"
+        hash: "f327bb2ea12b2baffc0a98d44a0ded16"
     }
     Frame {
         msec: 5248
-        hash: "9ecc192aec9b15314132b16dd3f43860"
+        hash: "46e1debee4ca606492a36de6191f4594"
     }
     Frame {
         msec: 5264
-        hash: "bdee3016f1811188691786bafe305196"
+        hash: "0c6c0c3d27d87128d65b40789714dd6b"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.0.png
index c4bf75d..dfd30f6 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.1.png
index f28b342..9d4eb9b 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.2.png
index 955aed7..968517e 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.2.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.3.png
index 02ac575..eb62c19 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.3.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.qml
index 8d14a2b..a7df61f 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.qml
@@ -6,99 +6,99 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 32
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 48
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 64
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 80
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 96
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 112
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 128
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 144
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 160
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 176
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 192
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 208
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 224
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 240
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 256
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 272
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 288
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 304
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 320
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 336
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 352
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 368
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 384
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Key {
         type: 6
@@ -110,15 +110,15 @@ VisualTest {
     }
     Frame {
         msec: 400
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 416
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 432
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Key {
         type: 7
@@ -130,27 +130,27 @@ VisualTest {
     }
     Frame {
         msec: 448
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 464
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 480
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 496
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 512
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 528
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Key {
         type: 6
@@ -162,15 +162,15 @@ VisualTest {
     }
     Frame {
         msec: 544
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Frame {
         msec: 560
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Frame {
         msec: 576
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Key {
         type: 7
@@ -182,27 +182,27 @@ VisualTest {
     }
     Frame {
         msec: 592
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Frame {
         msec: 608
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Frame {
         msec: 624
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Frame {
         msec: 640
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Frame {
         msec: 656
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Frame {
         msec: 672
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Key {
         type: 6
@@ -214,19 +214,19 @@ VisualTest {
     }
     Frame {
         msec: 688
-        hash: "755c3478a46c430b058e99cf433942b8"
+        hash: "5a7abe3d30f7dc66c2cda37b03ff339f"
     }
     Frame {
         msec: 704
-        hash: "755c3478a46c430b058e99cf433942b8"
+        hash: "5a7abe3d30f7dc66c2cda37b03ff339f"
     }
     Frame {
         msec: 720
-        hash: "755c3478a46c430b058e99cf433942b8"
+        hash: "5a7abe3d30f7dc66c2cda37b03ff339f"
     }
     Frame {
         msec: 736
-        hash: "755c3478a46c430b058e99cf433942b8"
+        hash: "5a7abe3d30f7dc66c2cda37b03ff339f"
     }
     Key {
         type: 7
@@ -238,23 +238,23 @@ VisualTest {
     }
     Frame {
         msec: 752
-        hash: "755c3478a46c430b058e99cf433942b8"
+        hash: "5a7abe3d30f7dc66c2cda37b03ff339f"
     }
     Frame {
         msec: 768
-        hash: "755c3478a46c430b058e99cf433942b8"
+        hash: "5a7abe3d30f7dc66c2cda37b03ff339f"
     }
     Frame {
         msec: 784
-        hash: "755c3478a46c430b058e99cf433942b8"
+        hash: "5a7abe3d30f7dc66c2cda37b03ff339f"
     }
     Frame {
         msec: 800
-        hash: "755c3478a46c430b058e99cf433942b8"
+        hash: "5a7abe3d30f7dc66c2cda37b03ff339f"
     }
     Frame {
         msec: 816
-        hash: "755c3478a46c430b058e99cf433942b8"
+        hash: "5a7abe3d30f7dc66c2cda37b03ff339f"
     }
     Key {
         type: 6
@@ -266,19 +266,19 @@ VisualTest {
     }
     Frame {
         msec: 832
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Frame {
         msec: 848
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Frame {
         msec: 864
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Frame {
         msec: 880
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Key {
         type: 7
@@ -290,19 +290,19 @@ VisualTest {
     }
     Frame {
         msec: 896
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Frame {
         msec: 912
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Frame {
         msec: 928
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Frame {
         msec: 944
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Key {
         type: 6
@@ -318,15 +318,15 @@ VisualTest {
     }
     Frame {
         msec: 976
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 992
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 1008
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Key {
         type: 7
@@ -338,23 +338,23 @@ VisualTest {
     }
     Frame {
         msec: 1024
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 1040
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 1056
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 1072
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 1088
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Key {
         type: 6
@@ -366,15 +366,15 @@ VisualTest {
     }
     Frame {
         msec: 1104
-        hash: "d9af8bbbe324c23f69251847c64497d9"
+        hash: "a88ac2f56d3d75a277b0855e2baeda33"
     }
     Frame {
         msec: 1120
-        hash: "d9af8bbbe324c23f69251847c64497d9"
+        hash: "a88ac2f56d3d75a277b0855e2baeda33"
     }
     Frame {
         msec: 1136
-        hash: "d9af8bbbe324c23f69251847c64497d9"
+        hash: "a88ac2f56d3d75a277b0855e2baeda33"
     }
     Key {
         type: 7
@@ -386,23 +386,23 @@ VisualTest {
     }
     Frame {
         msec: 1152
-        hash: "d9af8bbbe324c23f69251847c64497d9"
+        hash: "a88ac2f56d3d75a277b0855e2baeda33"
     }
     Frame {
         msec: 1168
-        hash: "d9af8bbbe324c23f69251847c64497d9"
+        hash: "a88ac2f56d3d75a277b0855e2baeda33"
     }
     Frame {
         msec: 1184
-        hash: "d9af8bbbe324c23f69251847c64497d9"
+        hash: "a88ac2f56d3d75a277b0855e2baeda33"
     }
     Frame {
         msec: 1200
-        hash: "d9af8bbbe324c23f69251847c64497d9"
+        hash: "a88ac2f56d3d75a277b0855e2baeda33"
     }
     Frame {
         msec: 1216
-        hash: "d9af8bbbe324c23f69251847c64497d9"
+        hash: "a88ac2f56d3d75a277b0855e2baeda33"
     }
     Key {
         type: 6
@@ -414,19 +414,19 @@ VisualTest {
     }
     Frame {
         msec: 1232
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Frame {
         msec: 1248
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Frame {
         msec: 1264
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Frame {
         msec: 1280
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Key {
         type: 7
@@ -438,19 +438,19 @@ VisualTest {
     }
     Frame {
         msec: 1296
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Frame {
         msec: 1312
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Frame {
         msec: 1328
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Frame {
         msec: 1344
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Key {
         type: 6
@@ -462,19 +462,19 @@ VisualTest {
     }
     Frame {
         msec: 1360
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 1376
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 1392
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 1408
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Key {
         type: 7
@@ -486,23 +486,23 @@ VisualTest {
     }
     Frame {
         msec: 1424
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 1440
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 1456
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 1472
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 1488
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Key {
         type: 6
@@ -514,15 +514,15 @@ VisualTest {
     }
     Frame {
         msec: 1504
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1520
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1536
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Key {
         type: 7
@@ -534,79 +534,79 @@ VisualTest {
     }
     Frame {
         msec: 1552
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1568
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1584
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1600
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1616
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1632
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1648
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1664
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1680
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1696
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1712
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1728
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1744
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1760
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1776
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1792
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1808
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1824
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Frame {
         msec: 1840
-        hash: "2723a5a18241fd8787c2e298673e61e3"
+        hash: "ab021c71945620eba0b0cd70c7cffe5d"
     }
     Key {
         type: 6
@@ -618,19 +618,19 @@ VisualTest {
     }
     Frame {
         msec: 1856
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 1872
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 1888
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 1904
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 1920
@@ -638,19 +638,19 @@ VisualTest {
     }
     Frame {
         msec: 1936
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 1952
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 1968
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 1984
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Key {
         type: 7
@@ -662,23 +662,23 @@ VisualTest {
     }
     Frame {
         msec: 2000
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 2016
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 2032
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 2048
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Frame {
         msec: 2064
-        hash: "730ff91304bee489409ea616678a9877"
+        hash: "2ce295d30754b14d889795d2192fef41"
     }
     Key {
         type: 6
@@ -690,23 +690,23 @@ VisualTest {
     }
     Frame {
         msec: 2080
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Frame {
         msec: 2096
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Frame {
         msec: 2112
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Frame {
         msec: 2128
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Frame {
         msec: 2144
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Key {
         type: 7
@@ -718,23 +718,23 @@ VisualTest {
     }
     Frame {
         msec: 2160
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Frame {
         msec: 2176
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Frame {
         msec: 2192
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Frame {
         msec: 2208
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Frame {
         msec: 2224
-        hash: "8c9706e5cc1dd8cba4312aa07249ae74"
+        hash: "22bdd816325b5466ca937cf2535a3ef8"
     }
     Key {
         type: 6
@@ -746,11 +746,11 @@ VisualTest {
     }
     Frame {
         msec: 2240
-        hash: "d9af8bbbe324c23f69251847c64497d9"
+        hash: "a88ac2f56d3d75a277b0855e2baeda33"
     }
     Frame {
         msec: 2256
-        hash: "d9af8bbbe324c23f69251847c64497d9"
+        hash: "a88ac2f56d3d75a277b0855e2baeda33"
     }
     Key {
         type: 7
@@ -762,23 +762,23 @@ VisualTest {
     }
     Frame {
         msec: 2272
-        hash: "d9af8bbbe324c23f69251847c64497d9"
+        hash: "a88ac2f56d3d75a277b0855e2baeda33"
     }
     Frame {
         msec: 2288
-        hash: "d9af8bbbe324c23f69251847c64497d9"
+        hash: "a88ac2f56d3d75a277b0855e2baeda33"
     }
     Frame {
         msec: 2304
-        hash: "d9af8bbbe324c23f69251847c64497d9"
+        hash: "a88ac2f56d3d75a277b0855e2baeda33"
     }
     Frame {
         msec: 2320
-        hash: "d9af8bbbe324c23f69251847c64497d9"
+        hash: "a88ac2f56d3d75a277b0855e2baeda33"
     }
     Frame {
         msec: 2336
-        hash: "d9af8bbbe324c23f69251847c64497d9"
+        hash: "a88ac2f56d3d75a277b0855e2baeda33"
     }
     Key {
         type: 6
@@ -790,15 +790,15 @@ VisualTest {
     }
     Frame {
         msec: 2352
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 2368
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 2384
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Key {
         type: 7
@@ -810,55 +810,55 @@ VisualTest {
     }
     Frame {
         msec: 2400
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 2416
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 2432
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 2448
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 2464
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 2480
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 2496
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 2512
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 2528
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 2544
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 2560
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 2576
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Frame {
         msec: 2592
-        hash: "9a3654cf08a913058fd47c072e09a5c8"
+        hash: "0873eebe3bbcb864644811670642028e"
     }
     Key {
         type: 6
@@ -870,23 +870,23 @@ VisualTest {
     }
     Frame {
         msec: 2608
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Frame {
         msec: 2624
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Frame {
         msec: 2640
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Frame {
         msec: 2656
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Frame {
         msec: 2672
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Key {
         type: 7
@@ -898,23 +898,23 @@ VisualTest {
     }
     Frame {
         msec: 2688
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Frame {
         msec: 2704
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Frame {
         msec: 2720
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Frame {
         msec: 2736
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Frame {
         msec: 2752
-        hash: "dc2b08893d3ec12e2da923215eedf2de"
+        hash: "94d3da7909c84467c62deb2861104d21"
     }
     Key {
         type: 6
@@ -926,15 +926,15 @@ VisualTest {
     }
     Frame {
         msec: 2768
-        hash: "755c3478a46c430b058e99cf433942b8"
+        hash: "5a7abe3d30f7dc66c2cda37b03ff339f"
     }
     Frame {
         msec: 2784
-        hash: "755c3478a46c430b058e99cf433942b8"
+        hash: "5a7abe3d30f7dc66c2cda37b03ff339f"
     }
     Frame {
         msec: 2800
-        hash: "755c3478a46c430b058e99cf433942b8"
+        hash: "5a7abe3d30f7dc66c2cda37b03ff339f"
     }
     Key {
         type: 7
@@ -946,19 +946,19 @@ VisualTest {
     }
     Frame {
         msec: 2816
-        hash: "755c3478a46c430b058e99cf433942b8"
+        hash: "5a7abe3d30f7dc66c2cda37b03ff339f"
     }
     Frame {
         msec: 2832
-        hash: "755c3478a46c430b058e99cf433942b8"
+        hash: "5a7abe3d30f7dc66c2cda37b03ff339f"
     }
     Frame {
         msec: 2848
-        hash: "755c3478a46c430b058e99cf433942b8"
+        hash: "5a7abe3d30f7dc66c2cda37b03ff339f"
     }
     Frame {
         msec: 2864
-        hash: "755c3478a46c430b058e99cf433942b8"
+        hash: "5a7abe3d30f7dc66c2cda37b03ff339f"
     }
     Key {
         type: 6
@@ -974,15 +974,15 @@ VisualTest {
     }
     Frame {
         msec: 2896
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Frame {
         msec: 2912
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Frame {
         msec: 2928
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Key {
         type: 7
@@ -994,23 +994,23 @@ VisualTest {
     }
     Frame {
         msec: 2944
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Frame {
         msec: 2960
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Frame {
         msec: 2976
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Frame {
         msec: 2992
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Frame {
         msec: 3008
-        hash: "dbc65e33a133cd8fa7669175de83d94a"
+        hash: "ddf97bfd6216415dd2a56871f19c2d49"
     }
     Key {
         type: 6
@@ -1022,23 +1022,23 @@ VisualTest {
     }
     Frame {
         msec: 3024
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3040
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3056
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3072
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3088
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Key {
         type: 7
@@ -1050,155 +1050,155 @@ VisualTest {
     }
     Frame {
         msec: 3104
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3120
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3136
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3152
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3168
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3184
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3200
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3216
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3232
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3248
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3264
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3280
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3296
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3312
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3328
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3344
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3360
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3376
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3392
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3408
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3424
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3440
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3456
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3472
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3488
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3504
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3520
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3536
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3552
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3568
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3584
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3600
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3616
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3632
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3648
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3664
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3680
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Frame {
         msec: 3696
-        hash: "1e5621ab02591170fabc0d91c4a09c69"
+        hash: "5db508bc5a66018d9732cf8427461ef2"
     }
     Key {
         type: 6
@@ -1210,27 +1210,27 @@ VisualTest {
     }
     Frame {
         msec: 3712
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 3728
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 3744
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 3760
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 3776
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 3792
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Key {
         type: 7
@@ -1242,11 +1242,11 @@ VisualTest {
     }
     Frame {
         msec: 3808
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 3824
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 3840
@@ -1254,118 +1254,118 @@ VisualTest {
     }
     Frame {
         msec: 3856
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 3872
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 3888
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 3904
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 3920
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 3936
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 3952
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 3968
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 3984
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4000
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4016
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4032
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4048
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4064
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4080
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4096
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4112
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4128
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4144
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4160
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4176
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4192
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4208
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4224
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4240
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4256
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4272
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4288
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
     Frame {
         msec: 4304
-        hash: "7fc0cd5e044691bcef6a62d2fb6cd2d4"
+        hash: "9d4f0f25239a53ed9ac917df0c4a5f8e"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.0.png
index a3f0089..5049c3f 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.1.png
index 95772a9..ee6e16a 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.10.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.10.png
index 1b280eb..d9d2252 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.10.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.10.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.11.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.11.png
index 1b280eb..d9d2252 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.11.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.11.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.2.png
index cdd3dc0..cf99d98 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.2.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.3.png
index a3115f6..e3937f0 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.3.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.4.png
index d2c895b..2fe3337 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.4.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.5.png
index e0e1ced..97b9913 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.5.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.5.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.6.png
index bde3d7d..08e059f 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.6.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.6.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.7.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.7.png
index 38bf8be..bbc5ba2 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.7.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.7.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.8.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.8.png
index 7475f96..465b64e 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.8.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.8.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.9.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.9.png
index 1b280eb..d9d2252 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.9.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.9.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.qml
index c12ee51..a8173be 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.qml
@@ -6,83 +6,83 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 32
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 48
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 64
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 80
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 96
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 112
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 128
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 144
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 160
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 176
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 192
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 208
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 224
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 240
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 256
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 272
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 288
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 304
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 320
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Mouse {
         type: 2
@@ -94,23 +94,23 @@ VisualTest {
     }
     Frame {
         msec: 336
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 352
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 368
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 384
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 400
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Mouse {
         type: 3
@@ -122,63 +122,63 @@ VisualTest {
     }
     Frame {
         msec: 416
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 432
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 448
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 464
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 480
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 496
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 512
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 528
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 544
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 560
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 576
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 592
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 608
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 624
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Frame {
         msec: 640
-        hash: "e931c5f5d15e4f977e1822f2a6dd57df"
+        hash: "e742c08c259034e879b95eea60794e77"
     }
     Mouse {
         type: 2
@@ -190,11 +190,11 @@ VisualTest {
     }
     Frame {
         msec: 656
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 672
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Mouse {
         type: 3
@@ -206,71 +206,71 @@ VisualTest {
     }
     Frame {
         msec: 688
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 704
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 720
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 736
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 752
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 768
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 784
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 800
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 816
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 832
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 848
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 864
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 880
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 896
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 912
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 928
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 944
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 960
@@ -278,87 +278,87 @@ VisualTest {
     }
     Frame {
         msec: 976
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 992
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1008
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1024
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1040
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1056
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1072
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1088
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1104
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1120
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1136
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1152
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1168
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1184
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1200
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1216
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1232
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1248
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1264
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1280
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Frame {
         msec: 1296
-        hash: "01cf9ccfc86504bc6efe5fec1e68e537"
+        hash: "3eaecb73d32414207c898a36c9c41da3"
     }
     Key {
         type: 6
@@ -370,23 +370,23 @@ VisualTest {
     }
     Frame {
         msec: 1312
-        hash: "bac01431244974a1768d84318f49bf89"
+        hash: "c101a1d74691605f2740452950693e43"
     }
     Frame {
         msec: 1328
-        hash: "bac01431244974a1768d84318f49bf89"
+        hash: "c101a1d74691605f2740452950693e43"
     }
     Frame {
         msec: 1344
-        hash: "bac01431244974a1768d84318f49bf89"
+        hash: "c101a1d74691605f2740452950693e43"
     }
     Frame {
         msec: 1360
-        hash: "bac01431244974a1768d84318f49bf89"
+        hash: "c101a1d74691605f2740452950693e43"
     }
     Frame {
         msec: 1376
-        hash: "bac01431244974a1768d84318f49bf89"
+        hash: "c101a1d74691605f2740452950693e43"
     }
     Key {
         type: 7
@@ -398,7 +398,7 @@ VisualTest {
     }
     Frame {
         msec: 1392
-        hash: "bac01431244974a1768d84318f49bf89"
+        hash: "c101a1d74691605f2740452950693e43"
     }
     Key {
         type: 6
@@ -410,19 +410,19 @@ VisualTest {
     }
     Frame {
         msec: 1408
-        hash: "e22c6376c05d52c8997a67bf21d82a83"
+        hash: "e3e33c9f73352079db2f5e96c0069974"
     }
     Frame {
         msec: 1424
-        hash: "e22c6376c05d52c8997a67bf21d82a83"
+        hash: "e3e33c9f73352079db2f5e96c0069974"
     }
     Frame {
         msec: 1440
-        hash: "e22c6376c05d52c8997a67bf21d82a83"
+        hash: "e3e33c9f73352079db2f5e96c0069974"
     }
     Frame {
         msec: 1456
-        hash: "e22c6376c05d52c8997a67bf21d82a83"
+        hash: "e3e33c9f73352079db2f5e96c0069974"
     }
     Key {
         type: 7
@@ -434,27 +434,27 @@ VisualTest {
     }
     Frame {
         msec: 1472
-        hash: "e22c6376c05d52c8997a67bf21d82a83"
+        hash: "e3e33c9f73352079db2f5e96c0069974"
     }
     Frame {
         msec: 1488
-        hash: "e22c6376c05d52c8997a67bf21d82a83"
+        hash: "e3e33c9f73352079db2f5e96c0069974"
     }
     Frame {
         msec: 1504
-        hash: "e22c6376c05d52c8997a67bf21d82a83"
+        hash: "e3e33c9f73352079db2f5e96c0069974"
     }
     Frame {
         msec: 1520
-        hash: "e22c6376c05d52c8997a67bf21d82a83"
+        hash: "e3e33c9f73352079db2f5e96c0069974"
     }
     Frame {
         msec: 1536
-        hash: "e22c6376c05d52c8997a67bf21d82a83"
+        hash: "e3e33c9f73352079db2f5e96c0069974"
     }
     Frame {
         msec: 1552
-        hash: "e22c6376c05d52c8997a67bf21d82a83"
+        hash: "e3e33c9f73352079db2f5e96c0069974"
     }
     Key {
         type: 6
@@ -466,15 +466,15 @@ VisualTest {
     }
     Frame {
         msec: 1568
-        hash: "47f630d2cc3a3fa15309f5f631a36690"
+        hash: "0e79208365ec4b5a609d13b9e6c5c8d8"
     }
     Frame {
         msec: 1584
-        hash: "47f630d2cc3a3fa15309f5f631a36690"
+        hash: "0e79208365ec4b5a609d13b9e6c5c8d8"
     }
     Frame {
         msec: 1600
-        hash: "47f630d2cc3a3fa15309f5f631a36690"
+        hash: "0e79208365ec4b5a609d13b9e6c5c8d8"
     }
     Key {
         type: 7
@@ -486,7 +486,7 @@ VisualTest {
     }
     Frame {
         msec: 1616
-        hash: "47f630d2cc3a3fa15309f5f631a36690"
+        hash: "0e79208365ec4b5a609d13b9e6c5c8d8"
     }
     Key {
         type: 6
@@ -498,23 +498,23 @@ VisualTest {
     }
     Frame {
         msec: 1632
-        hash: "b03df007a2e778d3f055ceb12ab61ec1"
+        hash: "5485c9cf4050ef8c1dda227d27326f78"
     }
     Frame {
         msec: 1648
-        hash: "b03df007a2e778d3f055ceb12ab61ec1"
+        hash: "5485c9cf4050ef8c1dda227d27326f78"
     }
     Frame {
         msec: 1664
-        hash: "b03df007a2e778d3f055ceb12ab61ec1"
+        hash: "5485c9cf4050ef8c1dda227d27326f78"
     }
     Frame {
         msec: 1680
-        hash: "b03df007a2e778d3f055ceb12ab61ec1"
+        hash: "5485c9cf4050ef8c1dda227d27326f78"
     }
     Frame {
         msec: 1696
-        hash: "b03df007a2e778d3f055ceb12ab61ec1"
+        hash: "5485c9cf4050ef8c1dda227d27326f78"
     }
     Key {
         type: 7
@@ -526,11 +526,11 @@ VisualTest {
     }
     Frame {
         msec: 1712
-        hash: "b03df007a2e778d3f055ceb12ab61ec1"
+        hash: "5485c9cf4050ef8c1dda227d27326f78"
     }
     Frame {
         msec: 1728
-        hash: "b03df007a2e778d3f055ceb12ab61ec1"
+        hash: "5485c9cf4050ef8c1dda227d27326f78"
     }
     Key {
         type: 6
@@ -542,15 +542,15 @@ VisualTest {
     }
     Frame {
         msec: 1744
-        hash: "f73e5dc997ddc56554f914014c376f24"
+        hash: "1063a2e6164b372ba364c15c1c8b6ade"
     }
     Frame {
         msec: 1760
-        hash: "f73e5dc997ddc56554f914014c376f24"
+        hash: "1063a2e6164b372ba364c15c1c8b6ade"
     }
     Frame {
         msec: 1776
-        hash: "f73e5dc997ddc56554f914014c376f24"
+        hash: "1063a2e6164b372ba364c15c1c8b6ade"
     }
     Key {
         type: 7
@@ -562,15 +562,15 @@ VisualTest {
     }
     Frame {
         msec: 1792
-        hash: "f73e5dc997ddc56554f914014c376f24"
+        hash: "1063a2e6164b372ba364c15c1c8b6ade"
     }
     Frame {
         msec: 1808
-        hash: "f73e5dc997ddc56554f914014c376f24"
+        hash: "1063a2e6164b372ba364c15c1c8b6ade"
     }
     Frame {
         msec: 1824
-        hash: "f73e5dc997ddc56554f914014c376f24"
+        hash: "1063a2e6164b372ba364c15c1c8b6ade"
     }
     Key {
         type: 6
@@ -582,23 +582,23 @@ VisualTest {
     }
     Frame {
         msec: 1840
-        hash: "d089f840e514b68fad1edbbce686525f"
+        hash: "213c0057171a86bd4e2d898fac4d6642"
     }
     Frame {
         msec: 1856
-        hash: "d089f840e514b68fad1edbbce686525f"
+        hash: "213c0057171a86bd4e2d898fac4d6642"
     }
     Frame {
         msec: 1872
-        hash: "d089f840e514b68fad1edbbce686525f"
+        hash: "213c0057171a86bd4e2d898fac4d6642"
     }
     Frame {
         msec: 1888
-        hash: "d089f840e514b68fad1edbbce686525f"
+        hash: "213c0057171a86bd4e2d898fac4d6642"
     }
     Frame {
         msec: 1904
-        hash: "d089f840e514b68fad1edbbce686525f"
+        hash: "213c0057171a86bd4e2d898fac4d6642"
     }
     Key {
         type: 7
@@ -622,15 +622,15 @@ VisualTest {
     }
     Frame {
         msec: 1936
-        hash: "9751cdca40cadacfc28de757b20ed639"
+        hash: "df9766751a5698f84f98faa0ac0e6f1a"
     }
     Frame {
         msec: 1952
-        hash: "9751cdca40cadacfc28de757b20ed639"
+        hash: "df9766751a5698f84f98faa0ac0e6f1a"
     }
     Frame {
         msec: 1968
-        hash: "9751cdca40cadacfc28de757b20ed639"
+        hash: "df9766751a5698f84f98faa0ac0e6f1a"
     }
     Key {
         type: 6
@@ -642,11 +642,11 @@ VisualTest {
     }
     Frame {
         msec: 1984
-        hash: "8fb457eb7c17974786ff239c09101d27"
+        hash: "47cb63f13c81ac6557ecc68d4e6f9c99"
     }
     Frame {
         msec: 2000
-        hash: "8fb457eb7c17974786ff239c09101d27"
+        hash: "47cb63f13c81ac6557ecc68d4e6f9c99"
     }
     Key {
         type: 7
@@ -658,7 +658,7 @@ VisualTest {
     }
     Frame {
         msec: 2016
-        hash: "8fb457eb7c17974786ff239c09101d27"
+        hash: "47cb63f13c81ac6557ecc68d4e6f9c99"
     }
     Key {
         type: 6
@@ -670,11 +670,11 @@ VisualTest {
     }
     Frame {
         msec: 2032
-        hash: "eeb022c3dd997ce86c3a60146d19b540"
+        hash: "4f39251d7a0071a67435d088f46fc4fe"
     }
     Frame {
         msec: 2048
-        hash: "eeb022c3dd997ce86c3a60146d19b540"
+        hash: "4f39251d7a0071a67435d088f46fc4fe"
     }
     Key {
         type: 7
@@ -686,19 +686,19 @@ VisualTest {
     }
     Frame {
         msec: 2064
-        hash: "eeb022c3dd997ce86c3a60146d19b540"
+        hash: "4f39251d7a0071a67435d088f46fc4fe"
     }
     Frame {
         msec: 2080
-        hash: "eeb022c3dd997ce86c3a60146d19b540"
+        hash: "4f39251d7a0071a67435d088f46fc4fe"
     }
     Frame {
         msec: 2096
-        hash: "eeb022c3dd997ce86c3a60146d19b540"
+        hash: "4f39251d7a0071a67435d088f46fc4fe"
     }
     Frame {
         msec: 2112
-        hash: "eeb022c3dd997ce86c3a60146d19b540"
+        hash: "4f39251d7a0071a67435d088f46fc4fe"
     }
     Key {
         type: 7
@@ -710,11 +710,11 @@ VisualTest {
     }
     Frame {
         msec: 2128
-        hash: "eeb022c3dd997ce86c3a60146d19b540"
+        hash: "4f39251d7a0071a67435d088f46fc4fe"
     }
     Frame {
         msec: 2144
-        hash: "eeb022c3dd997ce86c3a60146d19b540"
+        hash: "4f39251d7a0071a67435d088f46fc4fe"
     }
     Key {
         type: 6
@@ -726,27 +726,27 @@ VisualTest {
     }
     Frame {
         msec: 2160
-        hash: "ba2033e83b5aef2408197ebf7db543a6"
+        hash: "722715a78e99d0f1f9a2830090c98f3c"
     }
     Frame {
         msec: 2176
-        hash: "ba2033e83b5aef2408197ebf7db543a6"
+        hash: "722715a78e99d0f1f9a2830090c98f3c"
     }
     Frame {
         msec: 2192
-        hash: "ba2033e83b5aef2408197ebf7db543a6"
+        hash: "722715a78e99d0f1f9a2830090c98f3c"
     }
     Frame {
         msec: 2208
-        hash: "ba2033e83b5aef2408197ebf7db543a6"
+        hash: "722715a78e99d0f1f9a2830090c98f3c"
     }
     Frame {
         msec: 2224
-        hash: "ba2033e83b5aef2408197ebf7db543a6"
+        hash: "722715a78e99d0f1f9a2830090c98f3c"
     }
     Frame {
         msec: 2240
-        hash: "ba2033e83b5aef2408197ebf7db543a6"
+        hash: "722715a78e99d0f1f9a2830090c98f3c"
     }
     Key {
         type: 7
@@ -766,23 +766,23 @@ VisualTest {
     }
     Frame {
         msec: 2256
-        hash: "8a843083f0415f1e06bfe925b3bd7f52"
+        hash: "aa085c20f74a765297f7904680c7591e"
     }
     Frame {
         msec: 2272
-        hash: "8a843083f0415f1e06bfe925b3bd7f52"
+        hash: "aa085c20f74a765297f7904680c7591e"
     }
     Frame {
         msec: 2288
-        hash: "8a843083f0415f1e06bfe925b3bd7f52"
+        hash: "aa085c20f74a765297f7904680c7591e"
     }
     Frame {
         msec: 2304
-        hash: "8a843083f0415f1e06bfe925b3bd7f52"
+        hash: "aa085c20f74a765297f7904680c7591e"
     }
     Frame {
         msec: 2320
-        hash: "8a843083f0415f1e06bfe925b3bd7f52"
+        hash: "aa085c20f74a765297f7904680c7591e"
     }
     Key {
         type: 7
@@ -794,11 +794,11 @@ VisualTest {
     }
     Frame {
         msec: 2336
-        hash: "8a843083f0415f1e06bfe925b3bd7f52"
+        hash: "aa085c20f74a765297f7904680c7591e"
     }
     Frame {
         msec: 2352
-        hash: "8a843083f0415f1e06bfe925b3bd7f52"
+        hash: "aa085c20f74a765297f7904680c7591e"
     }
     Key {
         type: 6
@@ -810,19 +810,19 @@ VisualTest {
     }
     Frame {
         msec: 2368
-        hash: "c3d6b261447c0fa65722c697b60ef415"
+        hash: "0cc1397ce700d4a84647dddee65241b3"
     }
     Frame {
         msec: 2384
-        hash: "c3d6b261447c0fa65722c697b60ef415"
+        hash: "0cc1397ce700d4a84647dddee65241b3"
     }
     Frame {
         msec: 2400
-        hash: "c3d6b261447c0fa65722c697b60ef415"
+        hash: "0cc1397ce700d4a84647dddee65241b3"
     }
     Frame {
         msec: 2416
-        hash: "c3d6b261447c0fa65722c697b60ef415"
+        hash: "0cc1397ce700d4a84647dddee65241b3"
     }
     Key {
         type: 7
@@ -834,7 +834,7 @@ VisualTest {
     }
     Frame {
         msec: 2432
-        hash: "c3d6b261447c0fa65722c697b60ef415"
+        hash: "0cc1397ce700d4a84647dddee65241b3"
     }
     Key {
         type: 6
@@ -846,27 +846,27 @@ VisualTest {
     }
     Frame {
         msec: 2448
-        hash: "7899672516311904cc7108f975290615"
+        hash: "ac693aa9030cc388dce9004916734aed"
     }
     Frame {
         msec: 2464
-        hash: "7899672516311904cc7108f975290615"
+        hash: "ac693aa9030cc388dce9004916734aed"
     }
     Frame {
         msec: 2480
-        hash: "7899672516311904cc7108f975290615"
+        hash: "ac693aa9030cc388dce9004916734aed"
     }
     Frame {
         msec: 2496
-        hash: "7899672516311904cc7108f975290615"
+        hash: "ac693aa9030cc388dce9004916734aed"
     }
     Frame {
         msec: 2512
-        hash: "7899672516311904cc7108f975290615"
+        hash: "ac693aa9030cc388dce9004916734aed"
     }
     Frame {
         msec: 2528
-        hash: "7899672516311904cc7108f975290615"
+        hash: "ac693aa9030cc388dce9004916734aed"
     }
     Key {
         type: 7
@@ -878,7 +878,7 @@ VisualTest {
     }
     Frame {
         msec: 2544
-        hash: "7899672516311904cc7108f975290615"
+        hash: "ac693aa9030cc388dce9004916734aed"
     }
     Key {
         type: 6
@@ -890,19 +890,19 @@ VisualTest {
     }
     Frame {
         msec: 2560
-        hash: "4c9dc2d3538a47f0c5f4e5b8f1863583"
+        hash: "e1f1b75892dc186e7f9546661722e259"
     }
     Frame {
         msec: 2576
-        hash: "4c9dc2d3538a47f0c5f4e5b8f1863583"
+        hash: "e1f1b75892dc186e7f9546661722e259"
     }
     Frame {
         msec: 2592
-        hash: "4c9dc2d3538a47f0c5f4e5b8f1863583"
+        hash: "e1f1b75892dc186e7f9546661722e259"
     }
     Frame {
         msec: 2608
-        hash: "4c9dc2d3538a47f0c5f4e5b8f1863583"
+        hash: "e1f1b75892dc186e7f9546661722e259"
     }
     Key {
         type: 7
@@ -914,23 +914,23 @@ VisualTest {
     }
     Frame {
         msec: 2624
-        hash: "4c9dc2d3538a47f0c5f4e5b8f1863583"
+        hash: "e1f1b75892dc186e7f9546661722e259"
     }
     Frame {
         msec: 2640
-        hash: "4c9dc2d3538a47f0c5f4e5b8f1863583"
+        hash: "e1f1b75892dc186e7f9546661722e259"
     }
     Frame {
         msec: 2656
-        hash: "4c9dc2d3538a47f0c5f4e5b8f1863583"
+        hash: "e1f1b75892dc186e7f9546661722e259"
     }
     Frame {
         msec: 2672
-        hash: "4c9dc2d3538a47f0c5f4e5b8f1863583"
+        hash: "e1f1b75892dc186e7f9546661722e259"
     }
     Frame {
         msec: 2688
-        hash: "4c9dc2d3538a47f0c5f4e5b8f1863583"
+        hash: "e1f1b75892dc186e7f9546661722e259"
     }
     Key {
         type: 6
@@ -942,27 +942,27 @@ VisualTest {
     }
     Frame {
         msec: 2704
-        hash: "0e583b5b8c82af7fe74ff845abb57069"
+        hash: "4c1829c6c263cf290e0e71035f678589"
     }
     Frame {
         msec: 2720
-        hash: "0e583b5b8c82af7fe74ff845abb57069"
+        hash: "4c1829c6c263cf290e0e71035f678589"
     }
     Frame {
         msec: 2736
-        hash: "0e583b5b8c82af7fe74ff845abb57069"
+        hash: "4c1829c6c263cf290e0e71035f678589"
     }
     Frame {
         msec: 2752
-        hash: "0e583b5b8c82af7fe74ff845abb57069"
+        hash: "4c1829c6c263cf290e0e71035f678589"
     }
     Frame {
         msec: 2768
-        hash: "0e583b5b8c82af7fe74ff845abb57069"
+        hash: "4c1829c6c263cf290e0e71035f678589"
     }
     Frame {
         msec: 2784
-        hash: "0e583b5b8c82af7fe74ff845abb57069"
+        hash: "4c1829c6c263cf290e0e71035f678589"
     }
     Key {
         type: 6
@@ -974,7 +974,7 @@ VisualTest {
     }
     Frame {
         msec: 2800
-        hash: "5b282d8041386acfd94eab03a0d40fe8"
+        hash: "fa5cf022b185f178d0121b442af01c00"
     }
     Key {
         type: 7
@@ -986,19 +986,19 @@ VisualTest {
     }
     Frame {
         msec: 2816
-        hash: "5b282d8041386acfd94eab03a0d40fe8"
+        hash: "fa5cf022b185f178d0121b442af01c00"
     }
     Frame {
         msec: 2832
-        hash: "5b282d8041386acfd94eab03a0d40fe8"
+        hash: "fa5cf022b185f178d0121b442af01c00"
     }
     Frame {
         msec: 2848
-        hash: "5b282d8041386acfd94eab03a0d40fe8"
+        hash: "fa5cf022b185f178d0121b442af01c00"
     }
     Frame {
         msec: 2864
-        hash: "5b282d8041386acfd94eab03a0d40fe8"
+        hash: "fa5cf022b185f178d0121b442af01c00"
     }
     Key {
         type: 7
@@ -1014,15 +1014,15 @@ VisualTest {
     }
     Frame {
         msec: 2896
-        hash: "5b282d8041386acfd94eab03a0d40fe8"
+        hash: "fa5cf022b185f178d0121b442af01c00"
     }
     Frame {
         msec: 2912
-        hash: "5b282d8041386acfd94eab03a0d40fe8"
+        hash: "fa5cf022b185f178d0121b442af01c00"
     }
     Frame {
         msec: 2928
-        hash: "5b282d8041386acfd94eab03a0d40fe8"
+        hash: "fa5cf022b185f178d0121b442af01c00"
     }
     Key {
         type: 6
@@ -1034,15 +1034,15 @@ VisualTest {
     }
     Frame {
         msec: 2944
-        hash: "9b19fe7f4665fdbd471e22cac9d97bab"
+        hash: "b0748cac94695eb95774e0cdfabf47cc"
     }
     Frame {
         msec: 2960
-        hash: "9b19fe7f4665fdbd471e22cac9d97bab"
+        hash: "b0748cac94695eb95774e0cdfabf47cc"
     }
     Frame {
         msec: 2976
-        hash: "9b19fe7f4665fdbd471e22cac9d97bab"
+        hash: "b0748cac94695eb95774e0cdfabf47cc"
     }
     Key {
         type: 7
@@ -1062,19 +1062,19 @@ VisualTest {
     }
     Frame {
         msec: 2992
-        hash: "ed57767e75c850ad9bf2d08050419c56"
+        hash: "b05fc4c21113146463372b1ea981e265"
     }
     Frame {
         msec: 3008
-        hash: "ed57767e75c850ad9bf2d08050419c56"
+        hash: "b05fc4c21113146463372b1ea981e265"
     }
     Frame {
         msec: 3024
-        hash: "ed57767e75c850ad9bf2d08050419c56"
+        hash: "b05fc4c21113146463372b1ea981e265"
     }
     Frame {
         msec: 3040
-        hash: "ed57767e75c850ad9bf2d08050419c56"
+        hash: "b05fc4c21113146463372b1ea981e265"
     }
     Key {
         type: 7
@@ -1086,7 +1086,7 @@ VisualTest {
     }
     Frame {
         msec: 3056
-        hash: "ed57767e75c850ad9bf2d08050419c56"
+        hash: "b05fc4c21113146463372b1ea981e265"
     }
     Key {
         type: 6
@@ -1098,15 +1098,15 @@ VisualTest {
     }
     Frame {
         msec: 3072
-        hash: "225820f0472a6af17f56687a655b382a"
+        hash: "01b789845bf308fc896d53bbbfe0dd01"
     }
     Frame {
         msec: 3088
-        hash: "225820f0472a6af17f56687a655b382a"
+        hash: "01b789845bf308fc896d53bbbfe0dd01"
     }
     Frame {
         msec: 3104
-        hash: "225820f0472a6af17f56687a655b382a"
+        hash: "01b789845bf308fc896d53bbbfe0dd01"
     }
     Key {
         type: 6
@@ -1118,7 +1118,7 @@ VisualTest {
     }
     Frame {
         msec: 3120
-        hash: "225820f0472a6af17f56687a655b382a"
+        hash: "01b789845bf308fc896d53bbbfe0dd01"
     }
     Key {
         type: 7
@@ -1130,11 +1130,11 @@ VisualTest {
     }
     Frame {
         msec: 3136
-        hash: "225820f0472a6af17f56687a655b382a"
+        hash: "01b789845bf308fc896d53bbbfe0dd01"
     }
     Frame {
         msec: 3152
-        hash: "225820f0472a6af17f56687a655b382a"
+        hash: "01b789845bf308fc896d53bbbfe0dd01"
     }
     Key {
         type: 6
@@ -1146,19 +1146,19 @@ VisualTest {
     }
     Frame {
         msec: 3168
-        hash: "719effbf9211edc87c56cb5628a57ded"
+        hash: "433d805d957203918fc4a8edfc93290e"
     }
     Frame {
         msec: 3184
-        hash: "719effbf9211edc87c56cb5628a57ded"
+        hash: "433d805d957203918fc4a8edfc93290e"
     }
     Frame {
         msec: 3200
-        hash: "719effbf9211edc87c56cb5628a57ded"
+        hash: "433d805d957203918fc4a8edfc93290e"
     }
     Frame {
         msec: 3216
-        hash: "719effbf9211edc87c56cb5628a57ded"
+        hash: "433d805d957203918fc4a8edfc93290e"
     }
     Key {
         type: 7
@@ -1170,7 +1170,7 @@ VisualTest {
     }
     Frame {
         msec: 3232
-        hash: "719effbf9211edc87c56cb5628a57ded"
+        hash: "433d805d957203918fc4a8edfc93290e"
     }
     Key {
         type: 7
@@ -1190,19 +1190,19 @@ VisualTest {
     }
     Frame {
         msec: 3248
-        hash: "5d8d2ba8c15937cc2f70414a71f87d24"
+        hash: "1ebec912ac11b11d2ba7e5abdfb9ef6d"
     }
     Frame {
         msec: 3264
-        hash: "5d8d2ba8c15937cc2f70414a71f87d24"
+        hash: "1ebec912ac11b11d2ba7e5abdfb9ef6d"
     }
     Frame {
         msec: 3280
-        hash: "5d8d2ba8c15937cc2f70414a71f87d24"
+        hash: "1ebec912ac11b11d2ba7e5abdfb9ef6d"
     }
     Frame {
         msec: 3296
-        hash: "5d8d2ba8c15937cc2f70414a71f87d24"
+        hash: "1ebec912ac11b11d2ba7e5abdfb9ef6d"
     }
     Key {
         type: 7
@@ -1214,7 +1214,7 @@ VisualTest {
     }
     Frame {
         msec: 3312
-        hash: "5d8d2ba8c15937cc2f70414a71f87d24"
+        hash: "1ebec912ac11b11d2ba7e5abdfb9ef6d"
     }
     Key {
         type: 6
@@ -1226,23 +1226,23 @@ VisualTest {
     }
     Frame {
         msec: 3328
-        hash: "4df9946eb277ca403fd63a2e19535369"
+        hash: "b4bc12141255c91630e775fcf4935f22"
     }
     Frame {
         msec: 3344
-        hash: "4df9946eb277ca403fd63a2e19535369"
+        hash: "b4bc12141255c91630e775fcf4935f22"
     }
     Frame {
         msec: 3360
-        hash: "4df9946eb277ca403fd63a2e19535369"
+        hash: "b4bc12141255c91630e775fcf4935f22"
     }
     Frame {
         msec: 3376
-        hash: "4df9946eb277ca403fd63a2e19535369"
+        hash: "b4bc12141255c91630e775fcf4935f22"
     }
     Frame {
         msec: 3392
-        hash: "4df9946eb277ca403fd63a2e19535369"
+        hash: "b4bc12141255c91630e775fcf4935f22"
     }
     Key {
         type: 7
@@ -1254,7 +1254,7 @@ VisualTest {
     }
     Frame {
         msec: 3408
-        hash: "4df9946eb277ca403fd63a2e19535369"
+        hash: "b4bc12141255c91630e775fcf4935f22"
     }
     Key {
         type: 6
@@ -1266,23 +1266,23 @@ VisualTest {
     }
     Frame {
         msec: 3424
-        hash: "bb1bde5147f4f203f2af3787df0f0c7a"
+        hash: "8d83a3f76fd8b77c6dd9fdfb573d9c52"
     }
     Frame {
         msec: 3440
-        hash: "bb1bde5147f4f203f2af3787df0f0c7a"
+        hash: "8d83a3f76fd8b77c6dd9fdfb573d9c52"
     }
     Frame {
         msec: 3456
-        hash: "bb1bde5147f4f203f2af3787df0f0c7a"
+        hash: "8d83a3f76fd8b77c6dd9fdfb573d9c52"
     }
     Frame {
         msec: 3472
-        hash: "bb1bde5147f4f203f2af3787df0f0c7a"
+        hash: "8d83a3f76fd8b77c6dd9fdfb573d9c52"
     }
     Frame {
         msec: 3488
-        hash: "bb1bde5147f4f203f2af3787df0f0c7a"
+        hash: "8d83a3f76fd8b77c6dd9fdfb573d9c52"
     }
     Key {
         type: 7
@@ -1302,27 +1302,27 @@ VisualTest {
     }
     Frame {
         msec: 3504
-        hash: "60225c94dc1e1485406d8ba59737d383"
+        hash: "3f154d5eace7e0e688fe609d7eebe80d"
     }
     Frame {
         msec: 3520
-        hash: "60225c94dc1e1485406d8ba59737d383"
+        hash: "3f154d5eace7e0e688fe609d7eebe80d"
     }
     Frame {
         msec: 3536
-        hash: "60225c94dc1e1485406d8ba59737d383"
+        hash: "3f154d5eace7e0e688fe609d7eebe80d"
     }
     Frame {
         msec: 3552
-        hash: "60225c94dc1e1485406d8ba59737d383"
+        hash: "3f154d5eace7e0e688fe609d7eebe80d"
     }
     Frame {
         msec: 3568
-        hash: "60225c94dc1e1485406d8ba59737d383"
+        hash: "3f154d5eace7e0e688fe609d7eebe80d"
     }
     Frame {
         msec: 3584
-        hash: "60225c94dc1e1485406d8ba59737d383"
+        hash: "3f154d5eace7e0e688fe609d7eebe80d"
     }
     Key {
         type: 7
@@ -1334,7 +1334,7 @@ VisualTest {
     }
     Frame {
         msec: 3600
-        hash: "60225c94dc1e1485406d8ba59737d383"
+        hash: "3f154d5eace7e0e688fe609d7eebe80d"
     }
     Key {
         type: 6
@@ -1346,19 +1346,19 @@ VisualTest {
     }
     Frame {
         msec: 3616
-        hash: "8321580dd92a92edbf12df43259999f4"
+        hash: "8cecca2b1a586b7121692a8f618a1a50"
     }
     Frame {
         msec: 3632
-        hash: "8321580dd92a92edbf12df43259999f4"
+        hash: "8cecca2b1a586b7121692a8f618a1a50"
     }
     Frame {
         msec: 3648
-        hash: "8321580dd92a92edbf12df43259999f4"
+        hash: "8cecca2b1a586b7121692a8f618a1a50"
     }
     Frame {
         msec: 3664
-        hash: "8321580dd92a92edbf12df43259999f4"
+        hash: "8cecca2b1a586b7121692a8f618a1a50"
     }
     Key {
         type: 6
@@ -1370,7 +1370,7 @@ VisualTest {
     }
     Frame {
         msec: 3680
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Key {
         type: 7
@@ -1382,15 +1382,15 @@ VisualTest {
     }
     Frame {
         msec: 3696
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Frame {
         msec: 3712
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Frame {
         msec: 3728
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Key {
         type: 7
@@ -1402,27 +1402,27 @@ VisualTest {
     }
     Frame {
         msec: 3744
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Frame {
         msec: 3760
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Frame {
         msec: 3776
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Frame {
         msec: 3792
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Frame {
         msec: 3808
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Frame {
         msec: 3824
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Frame {
         msec: 3840
@@ -1430,35 +1430,35 @@ VisualTest {
     }
     Frame {
         msec: 3856
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Frame {
         msec: 3872
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Frame {
         msec: 3888
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Frame {
         msec: 3904
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Frame {
         msec: 3920
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Frame {
         msec: 3936
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Frame {
         msec: 3952
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Frame {
         msec: 3968
-        hash: "d704cc8d5bbdc8768d25372aa654925c"
+        hash: "90bd87209b6d26785689779641b1f506"
     }
     Key {
         type: 6
@@ -1470,23 +1470,23 @@ VisualTest {
     }
     Frame {
         msec: 3984
-        hash: "5a73c6a6df5bc4808fd4ed20e44f2ea3"
+        hash: "7fac93ef3184d5a844448c75b0aa8e18"
     }
     Frame {
         msec: 4000
-        hash: "5a73c6a6df5bc4808fd4ed20e44f2ea3"
+        hash: "7fac93ef3184d5a844448c75b0aa8e18"
     }
     Frame {
         msec: 4016
-        hash: "5a73c6a6df5bc4808fd4ed20e44f2ea3"
+        hash: "7fac93ef3184d5a844448c75b0aa8e18"
     }
     Frame {
         msec: 4032
-        hash: "5a73c6a6df5bc4808fd4ed20e44f2ea3"
+        hash: "7fac93ef3184d5a844448c75b0aa8e18"
     }
     Frame {
         msec: 4048
-        hash: "5a73c6a6df5bc4808fd4ed20e44f2ea3"
+        hash: "7fac93ef3184d5a844448c75b0aa8e18"
     }
     Key {
         type: 6
@@ -1498,7 +1498,7 @@ VisualTest {
     }
     Frame {
         msec: 4064
-        hash: "89613ce626a22573fa41191fcede3273"
+        hash: "591366861f9e23276042250d5b1da7f9"
     }
     Key {
         type: 7
@@ -1510,19 +1510,19 @@ VisualTest {
     }
     Frame {
         msec: 4080
-        hash: "89613ce626a22573fa41191fcede3273"
+        hash: "591366861f9e23276042250d5b1da7f9"
     }
     Frame {
         msec: 4096
-        hash: "89613ce626a22573fa41191fcede3273"
+        hash: "591366861f9e23276042250d5b1da7f9"
     }
     Frame {
         msec: 4112
-        hash: "89613ce626a22573fa41191fcede3273"
+        hash: "591366861f9e23276042250d5b1da7f9"
     }
     Frame {
         msec: 4128
-        hash: "89613ce626a22573fa41191fcede3273"
+        hash: "591366861f9e23276042250d5b1da7f9"
     }
     Key {
         type: 6
@@ -1534,11 +1534,11 @@ VisualTest {
     }
     Frame {
         msec: 4144
-        hash: "7d9ef94b610cc7e9bcfd04bfac91ae38"
+        hash: "c5c33e5f4429698b1a1bc084a41d303d"
     }
     Frame {
         msec: 4160
-        hash: "7d9ef94b610cc7e9bcfd04bfac91ae38"
+        hash: "c5c33e5f4429698b1a1bc084a41d303d"
     }
     Key {
         type: 7
@@ -1550,15 +1550,15 @@ VisualTest {
     }
     Frame {
         msec: 4176
-        hash: "7d9ef94b610cc7e9bcfd04bfac91ae38"
+        hash: "c5c33e5f4429698b1a1bc084a41d303d"
     }
     Frame {
         msec: 4192
-        hash: "7d9ef94b610cc7e9bcfd04bfac91ae38"
+        hash: "c5c33e5f4429698b1a1bc084a41d303d"
     }
     Frame {
         msec: 4208
-        hash: "7d9ef94b610cc7e9bcfd04bfac91ae38"
+        hash: "c5c33e5f4429698b1a1bc084a41d303d"
     }
     Key {
         type: 6
@@ -1570,11 +1570,11 @@ VisualTest {
     }
     Frame {
         msec: 4224
-        hash: "9653692fe9292ef0d0559412f68e9cf7"
+        hash: "36223521c9ab06661239329c14e4fabe"
     }
     Frame {
         msec: 4240
-        hash: "9653692fe9292ef0d0559412f68e9cf7"
+        hash: "36223521c9ab06661239329c14e4fabe"
     }
     Key {
         type: 7
@@ -1586,11 +1586,11 @@ VisualTest {
     }
     Frame {
         msec: 4256
-        hash: "9653692fe9292ef0d0559412f68e9cf7"
+        hash: "36223521c9ab06661239329c14e4fabe"
     }
     Frame {
         msec: 4272
-        hash: "9653692fe9292ef0d0559412f68e9cf7"
+        hash: "36223521c9ab06661239329c14e4fabe"
     }
     Key {
         type: 7
@@ -1602,27 +1602,27 @@ VisualTest {
     }
     Frame {
         msec: 4288
-        hash: "9653692fe9292ef0d0559412f68e9cf7"
+        hash: "36223521c9ab06661239329c14e4fabe"
     }
     Frame {
         msec: 4304
-        hash: "9653692fe9292ef0d0559412f68e9cf7"
+        hash: "36223521c9ab06661239329c14e4fabe"
     }
     Frame {
         msec: 4320
-        hash: "9653692fe9292ef0d0559412f68e9cf7"
+        hash: "36223521c9ab06661239329c14e4fabe"
     }
     Frame {
         msec: 4336
-        hash: "9653692fe9292ef0d0559412f68e9cf7"
+        hash: "36223521c9ab06661239329c14e4fabe"
     }
     Frame {
         msec: 4352
-        hash: "9653692fe9292ef0d0559412f68e9cf7"
+        hash: "36223521c9ab06661239329c14e4fabe"
     }
     Frame {
         msec: 4368
-        hash: "9653692fe9292ef0d0559412f68e9cf7"
+        hash: "36223521c9ab06661239329c14e4fabe"
     }
     Key {
         type: 6
@@ -1634,23 +1634,23 @@ VisualTest {
     }
     Frame {
         msec: 4384
-        hash: "902831b5d2a134629e04b53c87cdc709"
+        hash: "22ab171b9805302b729afd314e55a0f4"
     }
     Frame {
         msec: 4400
-        hash: "902831b5d2a134629e04b53c87cdc709"
+        hash: "22ab171b9805302b729afd314e55a0f4"
     }
     Frame {
         msec: 4416
-        hash: "902831b5d2a134629e04b53c87cdc709"
+        hash: "22ab171b9805302b729afd314e55a0f4"
     }
     Frame {
         msec: 4432
-        hash: "902831b5d2a134629e04b53c87cdc709"
+        hash: "22ab171b9805302b729afd314e55a0f4"
     }
     Frame {
         msec: 4448
-        hash: "902831b5d2a134629e04b53c87cdc709"
+        hash: "22ab171b9805302b729afd314e55a0f4"
     }
     Key {
         type: 7
@@ -1662,7 +1662,7 @@ VisualTest {
     }
     Frame {
         msec: 4464
-        hash: "902831b5d2a134629e04b53c87cdc709"
+        hash: "22ab171b9805302b729afd314e55a0f4"
     }
     Key {
         type: 6
@@ -1674,23 +1674,23 @@ VisualTest {
     }
     Frame {
         msec: 4480
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4496
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4512
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4528
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4544
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Key {
         type: 7
@@ -1702,15 +1702,15 @@ VisualTest {
     }
     Frame {
         msec: 4560
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4576
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4592
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Key {
         type: 6
@@ -1722,51 +1722,51 @@ VisualTest {
     }
     Frame {
         msec: 4608
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4624
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4640
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4656
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4672
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4688
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4704
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4720
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4736
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4752
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4768
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4784
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4800
@@ -1774,11 +1774,11 @@ VisualTest {
     }
     Frame {
         msec: 4816
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Frame {
         msec: 4832
-        hash: "cc1dc01f123309c70743535f61b18278"
+        hash: "beaad223234484e21f824ceb7f1edc2a"
     }
     Key {
         type: 6
@@ -1790,31 +1790,31 @@ VisualTest {
     }
     Frame {
         msec: 4848
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 4864
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 4880
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 4896
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 4912
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 4928
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 4944
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Key {
         type: 7
@@ -1826,19 +1826,19 @@ VisualTest {
     }
     Frame {
         msec: 4960
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 4976
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 4992
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5008
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Key {
         type: 7
@@ -1850,187 +1850,187 @@ VisualTest {
     }
     Frame {
         msec: 5024
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5040
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5056
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5072
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5088
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5104
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5120
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5136
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5152
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5168
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5184
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5200
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5216
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5232
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5248
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5264
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5280
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5296
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5312
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5328
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5344
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5360
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5376
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5392
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5408
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5424
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5440
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5456
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5472
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5488
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5504
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5520
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5536
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5552
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5568
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5584
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5600
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5616
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5632
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5648
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5664
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5680
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5696
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5712
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5728
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5744
-        hash: "652b66d0b62e7fcf9d4fff50296966b0"
+        hash: "49b26f36a10d808fdcb8248a384a4da6"
     }
     Frame {
         msec: 5760
@@ -2046,19 +2046,19 @@ VisualTest {
     }
     Frame {
         msec: 5776
-        hash: "a8710131aa2cfcedeb1956319174bd44"
+        hash: "476040951352f144bda4ed7fb817cd7f"
     }
     Frame {
         msec: 5792
-        hash: "a8710131aa2cfcedeb1956319174bd44"
+        hash: "476040951352f144bda4ed7fb817cd7f"
     }
     Frame {
         msec: 5808
-        hash: "a8710131aa2cfcedeb1956319174bd44"
+        hash: "476040951352f144bda4ed7fb817cd7f"
     }
     Frame {
         msec: 5824
-        hash: "a8710131aa2cfcedeb1956319174bd44"
+        hash: "476040951352f144bda4ed7fb817cd7f"
     }
     Mouse {
         type: 5
@@ -2078,7 +2078,7 @@ VisualTest {
     }
     Frame {
         msec: 5840
-        hash: "a8710131aa2cfcedeb1956319174bd44"
+        hash: "476040951352f144bda4ed7fb817cd7f"
     }
     Mouse {
         type: 5
@@ -2098,7 +2098,7 @@ VisualTest {
     }
     Frame {
         msec: 5856
-        hash: "069e40e23640f303e24f8821907bf907"
+        hash: "9ecb1e68ab724c6f83b1a37aa1cb15c4"
     }
     Mouse {
         type: 5
@@ -2118,7 +2118,7 @@ VisualTest {
     }
     Frame {
         msec: 5872
-        hash: "069e40e23640f303e24f8821907bf907"
+        hash: "9ecb1e68ab724c6f83b1a37aa1cb15c4"
     }
     Mouse {
         type: 5
@@ -2138,7 +2138,7 @@ VisualTest {
     }
     Frame {
         msec: 5888
-        hash: "3aba0fbccdbbbfc6b452464a35941f01"
+        hash: "9ecb1e68ab724c6f83b1a37aa1cb15c4"
     }
     Mouse {
         type: 5
@@ -2158,7 +2158,7 @@ VisualTest {
     }
     Frame {
         msec: 5904
-        hash: "8d68c5797a7a3be6ab1bc83a1adea983"
+        hash: "173735fb4be11da603fb8ae8cffc609d"
     }
     Mouse {
         type: 5
@@ -2178,7 +2178,7 @@ VisualTest {
     }
     Frame {
         msec: 5920
-        hash: "633201d777634e5a2e4ccc0ba7a84ada"
+        hash: "173735fb4be11da603fb8ae8cffc609d"
     }
     Mouse {
         type: 5
@@ -2198,7 +2198,7 @@ VisualTest {
     }
     Frame {
         msec: 5936
-        hash: "e1d36d4dbdff47e6b6f864dae077bc7f"
+        hash: "b337a09f359fb2a237731c66ab95c92c"
     }
     Mouse {
         type: 5
@@ -2218,7 +2218,7 @@ VisualTest {
     }
     Frame {
         msec: 5952
-        hash: "905419e116b2c93145c85456e6e7ccac"
+        hash: "32719becb40f8c6bd49b5f5754786913"
     }
     Mouse {
         type: 5
@@ -2238,7 +2238,7 @@ VisualTest {
     }
     Frame {
         msec: 5968
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2250,7 +2250,7 @@ VisualTest {
     }
     Frame {
         msec: 5984
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2270,7 +2270,7 @@ VisualTest {
     }
     Frame {
         msec: 6000
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2290,7 +2290,7 @@ VisualTest {
     }
     Frame {
         msec: 6016
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2310,7 +2310,7 @@ VisualTest {
     }
     Frame {
         msec: 6032
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2330,7 +2330,7 @@ VisualTest {
     }
     Frame {
         msec: 6048
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2350,7 +2350,7 @@ VisualTest {
     }
     Frame {
         msec: 6064
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2370,7 +2370,7 @@ VisualTest {
     }
     Frame {
         msec: 6080
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2390,7 +2390,7 @@ VisualTest {
     }
     Frame {
         msec: 6096
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2410,7 +2410,7 @@ VisualTest {
     }
     Frame {
         msec: 6112
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2430,7 +2430,7 @@ VisualTest {
     }
     Frame {
         msec: 6128
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2450,7 +2450,7 @@ VisualTest {
     }
     Frame {
         msec: 6144
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2470,7 +2470,7 @@ VisualTest {
     }
     Frame {
         msec: 6160
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2490,7 +2490,7 @@ VisualTest {
     }
     Frame {
         msec: 6176
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2502,23 +2502,23 @@ VisualTest {
     }
     Frame {
         msec: 6192
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Frame {
         msec: 6208
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Frame {
         msec: 6224
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Frame {
         msec: 6240
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Frame {
         msec: 6256
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2530,7 +2530,7 @@ VisualTest {
     }
     Frame {
         msec: 6272
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2550,7 +2550,7 @@ VisualTest {
     }
     Frame {
         msec: 6288
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2570,7 +2570,7 @@ VisualTest {
     }
     Frame {
         msec: 6304
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2590,7 +2590,7 @@ VisualTest {
     }
     Frame {
         msec: 6320
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2610,7 +2610,7 @@ VisualTest {
     }
     Frame {
         msec: 6336
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2630,7 +2630,7 @@ VisualTest {
     }
     Frame {
         msec: 6352
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2650,7 +2650,7 @@ VisualTest {
     }
     Frame {
         msec: 6368
-        hash: "f851ebbbab70e4f283caefc26f304946"
+        hash: "e6bff88d0a5e2e7df4b3355749ecc902"
     }
     Mouse {
         type: 5
@@ -2670,7 +2670,7 @@ VisualTest {
     }
     Frame {
         msec: 6384
-        hash: "ca385b53209d35e0c78e8124c782d03f"
+        hash: "5de7bbfdf96d84c8fbe74b4817a3c88a"
     }
     Mouse {
         type: 5
@@ -2682,7 +2682,7 @@ VisualTest {
     }
     Frame {
         msec: 6400
-        hash: "ca385b53209d35e0c78e8124c782d03f"
+        hash: "5de7bbfdf96d84c8fbe74b4817a3c88a"
     }
     Mouse {
         type: 5
@@ -2702,7 +2702,7 @@ VisualTest {
     }
     Frame {
         msec: 6416
-        hash: "730fa19a0deb6e210ee7ca136ecfb4e0"
+        hash: "056d22660f6feedfb453755978aa4c1d"
     }
     Mouse {
         type: 5
@@ -2722,7 +2722,7 @@ VisualTest {
     }
     Frame {
         msec: 6432
-        hash: "e749a531bb6b30611bed794e2630555f"
+        hash: "9d8568931fdca572dd31ea62ebbaf76a"
     }
     Mouse {
         type: 5
@@ -2742,7 +2742,7 @@ VisualTest {
     }
     Frame {
         msec: 6448
-        hash: "4d7a02eeb0d0ed7eb29fbfb72bce9ba1"
+        hash: "29aa2da8a830d5605a8d2d2543097177"
     }
     Mouse {
         type: 5
@@ -2754,7 +2754,7 @@ VisualTest {
     }
     Frame {
         msec: 6464
-        hash: "2476a4d7038b9f1c50557cf077ea4412"
+        hash: "154e312998b32cc09daf1693d07eda2f"
     }
     Mouse {
         type: 5
@@ -2774,7 +2774,7 @@ VisualTest {
     }
     Frame {
         msec: 6480
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -2794,7 +2794,7 @@ VisualTest {
     }
     Frame {
         msec: 6496
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -2814,7 +2814,7 @@ VisualTest {
     }
     Frame {
         msec: 6512
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -2834,7 +2834,7 @@ VisualTest {
     }
     Frame {
         msec: 6528
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -2854,7 +2854,7 @@ VisualTest {
     }
     Frame {
         msec: 6544
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -2874,7 +2874,7 @@ VisualTest {
     }
     Frame {
         msec: 6560
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -2894,7 +2894,7 @@ VisualTest {
     }
     Frame {
         msec: 6576
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -2914,27 +2914,27 @@ VisualTest {
     }
     Frame {
         msec: 6592
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Frame {
         msec: 6608
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Frame {
         msec: 6624
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Frame {
         msec: 6640
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Frame {
         msec: 6656
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Frame {
         msec: 6672
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -2954,7 +2954,7 @@ VisualTest {
     }
     Frame {
         msec: 6688
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -2974,7 +2974,7 @@ VisualTest {
     }
     Frame {
         msec: 6704
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -3014,7 +3014,7 @@ VisualTest {
     }
     Frame {
         msec: 6736
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -3034,7 +3034,7 @@ VisualTest {
     }
     Frame {
         msec: 6752
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -3054,7 +3054,7 @@ VisualTest {
     }
     Frame {
         msec: 6768
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -3074,7 +3074,7 @@ VisualTest {
     }
     Frame {
         msec: 6784
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -3094,7 +3094,7 @@ VisualTest {
     }
     Frame {
         msec: 6800
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -3114,7 +3114,7 @@ VisualTest {
     }
     Frame {
         msec: 6816
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -3134,7 +3134,7 @@ VisualTest {
     }
     Frame {
         msec: 6832
-        hash: "ff9bdea73a03bc51f76b6732176a0bad"
+        hash: "5b3a17fd92fe5117aa405d4c737e6673"
     }
     Mouse {
         type: 5
@@ -3154,7 +3154,7 @@ VisualTest {
     }
     Frame {
         msec: 6848
-        hash: "2b0458102c2231777202e66e0eaa8c8c"
+        hash: "476040951352f144bda4ed7fb817cd7f"
     }
     Mouse {
         type: 5
@@ -3174,7 +3174,7 @@ VisualTest {
     }
     Frame {
         msec: 6864
-        hash: "2b0458102c2231777202e66e0eaa8c8c"
+        hash: "2cb10cb75beb454df7918b6948c6ad8a"
     }
     Mouse {
         type: 5
@@ -3194,7 +3194,7 @@ VisualTest {
     }
     Frame {
         msec: 6880
-        hash: "2b0458102c2231777202e66e0eaa8c8c"
+        hash: "2cb10cb75beb454df7918b6948c6ad8a"
     }
     Mouse {
         type: 3
@@ -3206,55 +3206,55 @@ VisualTest {
     }
     Frame {
         msec: 6896
-        hash: "2b0458102c2231777202e66e0eaa8c8c"
+        hash: "2cb10cb75beb454df7918b6948c6ad8a"
     }
     Frame {
         msec: 6912
-        hash: "2b0458102c2231777202e66e0eaa8c8c"
+        hash: "2cb10cb75beb454df7918b6948c6ad8a"
     }
     Frame {
         msec: 6928
-        hash: "2b0458102c2231777202e66e0eaa8c8c"
+        hash: "2cb10cb75beb454df7918b6948c6ad8a"
     }
     Frame {
         msec: 6944
-        hash: "2b0458102c2231777202e66e0eaa8c8c"
+        hash: "2cb10cb75beb454df7918b6948c6ad8a"
     }
     Frame {
         msec: 6960
-        hash: "2b0458102c2231777202e66e0eaa8c8c"
+        hash: "2cb10cb75beb454df7918b6948c6ad8a"
     }
     Frame {
         msec: 6976
-        hash: "2b0458102c2231777202e66e0eaa8c8c"
+        hash: "2cb10cb75beb454df7918b6948c6ad8a"
     }
     Frame {
         msec: 6992
-        hash: "2b0458102c2231777202e66e0eaa8c8c"
+        hash: "2cb10cb75beb454df7918b6948c6ad8a"
     }
     Frame {
         msec: 7008
-        hash: "2b0458102c2231777202e66e0eaa8c8c"
+        hash: "2cb10cb75beb454df7918b6948c6ad8a"
     }
     Frame {
         msec: 7024
-        hash: "2b0458102c2231777202e66e0eaa8c8c"
+        hash: "2cb10cb75beb454df7918b6948c6ad8a"
     }
     Frame {
         msec: 7040
-        hash: "2b0458102c2231777202e66e0eaa8c8c"
+        hash: "2cb10cb75beb454df7918b6948c6ad8a"
     }
     Frame {
         msec: 7056
-        hash: "2b0458102c2231777202e66e0eaa8c8c"
+        hash: "2cb10cb75beb454df7918b6948c6ad8a"
     }
     Frame {
         msec: 7072
-        hash: "2b0458102c2231777202e66e0eaa8c8c"
+        hash: "2cb10cb75beb454df7918b6948c6ad8a"
     }
     Frame {
         msec: 7088
-        hash: "2b0458102c2231777202e66e0eaa8c8c"
+        hash: "2cb10cb75beb454df7918b6948c6ad8a"
     }
     Mouse {
         type: 2
@@ -3266,23 +3266,23 @@ VisualTest {
     }
     Frame {
         msec: 7104
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7120
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7136
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7152
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7168
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Mouse {
         type: 3
@@ -3294,103 +3294,103 @@ VisualTest {
     }
     Frame {
         msec: 7184
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7200
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7216
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7232
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7248
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7264
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7280
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7296
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7312
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7328
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7344
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7360
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7376
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7392
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7408
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7424
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7440
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7456
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7472
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7488
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7504
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7520
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7536
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7552
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Frame {
         msec: 7568
-        hash: "2ca3f2d1e4673bd97d05b43c4b70174a"
+        hash: "eafa794e0c09cc2558575bafa945ecdf"
     }
     Key {
         type: 6
@@ -3402,15 +3402,15 @@ VisualTest {
     }
     Frame {
         msec: 7584
-        hash: "ed7e9042cc805a60b1e8cf58a654ac66"
+        hash: "0444d714b801f88685df9722390faf4f"
     }
     Frame {
         msec: 7600
-        hash: "ed7e9042cc805a60b1e8cf58a654ac66"
+        hash: "0444d714b801f88685df9722390faf4f"
     }
     Frame {
         msec: 7616
-        hash: "ed7e9042cc805a60b1e8cf58a654ac66"
+        hash: "0444d714b801f88685df9722390faf4f"
     }
     Key {
         type: 7
@@ -3422,15 +3422,15 @@ VisualTest {
     }
     Frame {
         msec: 7632
-        hash: "ed7e9042cc805a60b1e8cf58a654ac66"
+        hash: "0444d714b801f88685df9722390faf4f"
     }
     Frame {
         msec: 7648
-        hash: "ed7e9042cc805a60b1e8cf58a654ac66"
+        hash: "0444d714b801f88685df9722390faf4f"
     }
     Frame {
         msec: 7664
-        hash: "ed7e9042cc805a60b1e8cf58a654ac66"
+        hash: "0444d714b801f88685df9722390faf4f"
     }
     Frame {
         msec: 7680
@@ -3438,11 +3438,11 @@ VisualTest {
     }
     Frame {
         msec: 7696
-        hash: "ed7e9042cc805a60b1e8cf58a654ac66"
+        hash: "0444d714b801f88685df9722390faf4f"
     }
     Frame {
         msec: 7712
-        hash: "ed7e9042cc805a60b1e8cf58a654ac66"
+        hash: "0444d714b801f88685df9722390faf4f"
     }
     Key {
         type: 6
@@ -3454,63 +3454,63 @@ VisualTest {
     }
     Frame {
         msec: 7728
-        hash: "16829fffc675d304661b9ff844a675f3"
+        hash: "250a49b60ad8e9b901977e01063ec20a"
     }
     Frame {
         msec: 7744
-        hash: "16829fffc675d304661b9ff844a675f3"
+        hash: "250a49b60ad8e9b901977e01063ec20a"
     }
     Frame {
         msec: 7760
-        hash: "16829fffc675d304661b9ff844a675f3"
+        hash: "250a49b60ad8e9b901977e01063ec20a"
     }
     Frame {
         msec: 7776
-        hash: "16829fffc675d304661b9ff844a675f3"
+        hash: "250a49b60ad8e9b901977e01063ec20a"
     }
     Frame {
         msec: 7792
-        hash: "16829fffc675d304661b9ff844a675f3"
+        hash: "250a49b60ad8e9b901977e01063ec20a"
     }
     Frame {
         msec: 7808
-        hash: "16829fffc675d304661b9ff844a675f3"
+        hash: "250a49b60ad8e9b901977e01063ec20a"
     }
     Frame {
         msec: 7824
-        hash: "16829fffc675d304661b9ff844a675f3"
+        hash: "250a49b60ad8e9b901977e01063ec20a"
     }
     Frame {
         msec: 7840
-        hash: "16829fffc675d304661b9ff844a675f3"
+        hash: "250a49b60ad8e9b901977e01063ec20a"
     }
     Frame {
         msec: 7856
-        hash: "16829fffc675d304661b9ff844a675f3"
+        hash: "250a49b60ad8e9b901977e01063ec20a"
     }
     Frame {
         msec: 7872
-        hash: "16829fffc675d304661b9ff844a675f3"
+        hash: "250a49b60ad8e9b901977e01063ec20a"
     }
     Frame {
         msec: 7888
-        hash: "16829fffc675d304661b9ff844a675f3"
+        hash: "250a49b60ad8e9b901977e01063ec20a"
     }
     Frame {
         msec: 7904
-        hash: "16829fffc675d304661b9ff844a675f3"
+        hash: "250a49b60ad8e9b901977e01063ec20a"
     }
     Frame {
         msec: 7920
-        hash: "16829fffc675d304661b9ff844a675f3"
+        hash: "250a49b60ad8e9b901977e01063ec20a"
     }
     Frame {
         msec: 7936
-        hash: "16829fffc675d304661b9ff844a675f3"
+        hash: "250a49b60ad8e9b901977e01063ec20a"
     }
     Frame {
         msec: 7952
-        hash: "16829fffc675d304661b9ff844a675f3"
+        hash: "250a49b60ad8e9b901977e01063ec20a"
     }
     Key {
         type: 7
@@ -3530,11 +3530,11 @@ VisualTest {
     }
     Frame {
         msec: 7968
-        hash: "45cfab0823b20b5dc206b42781cd9fb0"
+        hash: "bec2aea61fef64475e638848b96d28c3"
     }
     Frame {
         msec: 7984
-        hash: "45cfab0823b20b5dc206b42781cd9fb0"
+        hash: "bec2aea61fef64475e638848b96d28c3"
     }
     Key {
         type: 7
@@ -3554,11 +3554,11 @@ VisualTest {
     }
     Frame {
         msec: 8000
-        hash: "01069fb12c399f4d22d4d4ec79779752"
+        hash: "54177e0d53373636850e18399640fee8"
     }
     Frame {
         msec: 8016
-        hash: "01069fb12c399f4d22d4d4ec79779752"
+        hash: "54177e0d53373636850e18399640fee8"
     }
     Key {
         type: 7
@@ -3578,11 +3578,11 @@ VisualTest {
     }
     Frame {
         msec: 8032
-        hash: "88b6c6cca32a6d4adfc51cc7cce5e4bb"
+        hash: "81c03bd9dfd562e9f13784c906fa0d9e"
     }
     Frame {
         msec: 8048
-        hash: "88b6c6cca32a6d4adfc51cc7cce5e4bb"
+        hash: "81c03bd9dfd562e9f13784c906fa0d9e"
     }
     Key {
         type: 7
@@ -3602,11 +3602,11 @@ VisualTest {
     }
     Frame {
         msec: 8064
-        hash: "7b8423cfd0806b7d29cdb366133ef828"
+        hash: "2547fbe956bab6566c2b9137c0edc841"
     }
     Frame {
         msec: 8080
-        hash: "7b8423cfd0806b7d29cdb366133ef828"
+        hash: "2547fbe956bab6566c2b9137c0edc841"
     }
     Key {
         type: 6
@@ -3626,31 +3626,31 @@ VisualTest {
     }
     Frame {
         msec: 8096
-        hash: "7b8423cfd0806b7d29cdb366133ef828"
+        hash: "2547fbe956bab6566c2b9137c0edc841"
     }
     Frame {
         msec: 8112
-        hash: "7b8423cfd0806b7d29cdb366133ef828"
+        hash: "2547fbe956bab6566c2b9137c0edc841"
     }
     Frame {
         msec: 8128
-        hash: "7b8423cfd0806b7d29cdb366133ef828"
+        hash: "2547fbe956bab6566c2b9137c0edc841"
     }
     Frame {
         msec: 8144
-        hash: "7b8423cfd0806b7d29cdb366133ef828"
+        hash: "2547fbe956bab6566c2b9137c0edc841"
     }
     Frame {
         msec: 8160
-        hash: "7b8423cfd0806b7d29cdb366133ef828"
+        hash: "2547fbe956bab6566c2b9137c0edc841"
     }
     Frame {
         msec: 8176
-        hash: "7b8423cfd0806b7d29cdb366133ef828"
+        hash: "2547fbe956bab6566c2b9137c0edc841"
     }
     Frame {
         msec: 8192
-        hash: "7b8423cfd0806b7d29cdb366133ef828"
+        hash: "2547fbe956bab6566c2b9137c0edc841"
     }
     Key {
         type: 6
@@ -3662,19 +3662,19 @@ VisualTest {
     }
     Frame {
         msec: 8208
-        hash: "45feb9f7c516693224505726324e07f1"
+        hash: "c757d4e60d18ce16f87c66e42cc81a99"
     }
     Frame {
         msec: 8224
-        hash: "45feb9f7c516693224505726324e07f1"
+        hash: "c757d4e60d18ce16f87c66e42cc81a99"
     }
     Frame {
         msec: 8240
-        hash: "45feb9f7c516693224505726324e07f1"
+        hash: "c757d4e60d18ce16f87c66e42cc81a99"
     }
     Frame {
         msec: 8256
-        hash: "45feb9f7c516693224505726324e07f1"
+        hash: "c757d4e60d18ce16f87c66e42cc81a99"
     }
     Key {
         type: 7
@@ -3686,19 +3686,19 @@ VisualTest {
     }
     Frame {
         msec: 8272
-        hash: "45feb9f7c516693224505726324e07f1"
+        hash: "c757d4e60d18ce16f87c66e42cc81a99"
     }
     Frame {
         msec: 8288
-        hash: "45feb9f7c516693224505726324e07f1"
+        hash: "c757d4e60d18ce16f87c66e42cc81a99"
     }
     Frame {
         msec: 8304
-        hash: "45feb9f7c516693224505726324e07f1"
+        hash: "c757d4e60d18ce16f87c66e42cc81a99"
     }
     Frame {
         msec: 8320
-        hash: "45feb9f7c516693224505726324e07f1"
+        hash: "c757d4e60d18ce16f87c66e42cc81a99"
     }
     Key {
         type: 6
@@ -3710,19 +3710,19 @@ VisualTest {
     }
     Frame {
         msec: 8336
-        hash: "592811b385809e02c02e5925191fbc0c"
+        hash: "2ef578193024153dc85a2a92d10dc6c0"
     }
     Frame {
         msec: 8352
-        hash: "592811b385809e02c02e5925191fbc0c"
+        hash: "2ef578193024153dc85a2a92d10dc6c0"
     }
     Frame {
         msec: 8368
-        hash: "592811b385809e02c02e5925191fbc0c"
+        hash: "2ef578193024153dc85a2a92d10dc6c0"
     }
     Frame {
         msec: 8384
-        hash: "592811b385809e02c02e5925191fbc0c"
+        hash: "2ef578193024153dc85a2a92d10dc6c0"
     }
     Key {
         type: 7
@@ -3734,23 +3734,23 @@ VisualTest {
     }
     Frame {
         msec: 8400
-        hash: "592811b385809e02c02e5925191fbc0c"
+        hash: "2ef578193024153dc85a2a92d10dc6c0"
     }
     Frame {
         msec: 8416
-        hash: "592811b385809e02c02e5925191fbc0c"
+        hash: "2ef578193024153dc85a2a92d10dc6c0"
     }
     Frame {
         msec: 8432
-        hash: "592811b385809e02c02e5925191fbc0c"
+        hash: "2ef578193024153dc85a2a92d10dc6c0"
     }
     Frame {
         msec: 8448
-        hash: "592811b385809e02c02e5925191fbc0c"
+        hash: "2ef578193024153dc85a2a92d10dc6c0"
     }
     Frame {
         msec: 8464
-        hash: "592811b385809e02c02e5925191fbc0c"
+        hash: "2ef578193024153dc85a2a92d10dc6c0"
     }
     Key {
         type: 6
@@ -3762,19 +3762,19 @@ VisualTest {
     }
     Frame {
         msec: 8480
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8496
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8512
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8528
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Key {
         type: 7
@@ -3786,27 +3786,27 @@ VisualTest {
     }
     Frame {
         msec: 8544
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8560
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8576
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8592
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8608
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8624
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8640
@@ -3814,7 +3814,7 @@ VisualTest {
     }
     Frame {
         msec: 8656
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Key {
         type: 7
@@ -3826,139 +3826,139 @@ VisualTest {
     }
     Frame {
         msec: 8672
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8688
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8704
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8720
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8736
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8752
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8768
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8784
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8800
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8816
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8832
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8848
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8864
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8880
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8896
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8912
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8928
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8944
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8960
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8976
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 8992
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9008
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9024
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9040
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9056
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9072
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9088
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9104
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9120
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9136
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9152
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9168
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9184
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9200
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Mouse {
         type: 2
@@ -3970,11 +3970,11 @@ VisualTest {
     }
     Frame {
         msec: 9216
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9232
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Mouse {
         type: 5
@@ -3986,7 +3986,7 @@ VisualTest {
     }
     Frame {
         msec: 9248
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Mouse {
         type: 5
@@ -4006,7 +4006,7 @@ VisualTest {
     }
     Frame {
         msec: 9264
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Mouse {
         type: 5
@@ -4026,7 +4026,7 @@ VisualTest {
     }
     Frame {
         msec: 9280
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Mouse {
         type: 3
@@ -4038,43 +4038,43 @@ VisualTest {
     }
     Frame {
         msec: 9296
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9312
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9328
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9344
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9360
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9376
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9392
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9408
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9424
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Frame {
         msec: 9440
-        hash: "e9b5feff425d22a5dcecc57ebb3d5379"
+        hash: "47e926162c6d695d2bdb7ec9de05f0cc"
     }
     Mouse {
         type: 2
@@ -4086,27 +4086,27 @@ VisualTest {
     }
     Frame {
         msec: 9456
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9472
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9488
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9504
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9520
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9536
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Mouse {
         type: 3
@@ -4118,15 +4118,15 @@ VisualTest {
     }
     Frame {
         msec: 9552
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9568
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9584
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9600
@@ -4134,19 +4134,19 @@ VisualTest {
     }
     Frame {
         msec: 9616
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9632
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9648
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9664
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Key {
         type: 6
@@ -4158,111 +4158,111 @@ VisualTest {
     }
     Frame {
         msec: 9680
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9696
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9712
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9728
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9744
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9760
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9776
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9792
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9808
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9824
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9840
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9856
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9872
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9888
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9904
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9920
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9936
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9952
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9968
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 9984
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10000
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10016
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10032
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10048
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10064
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10080
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10096
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Key {
         type: 6
@@ -4274,35 +4274,35 @@ VisualTest {
     }
     Frame {
         msec: 10112
-        hash: "f3e8f8174b1c995d76e68fea7f21f285"
+        hash: "2ef5e7b2c0edc631765ea12d1f7abf33"
     }
     Frame {
         msec: 10128
-        hash: "f3e8f8174b1c995d76e68fea7f21f285"
+        hash: "2ef5e7b2c0edc631765ea12d1f7abf33"
     }
     Frame {
         msec: 10144
-        hash: "f3e8f8174b1c995d76e68fea7f21f285"
+        hash: "2ef5e7b2c0edc631765ea12d1f7abf33"
     }
     Frame {
         msec: 10160
-        hash: "f3e8f8174b1c995d76e68fea7f21f285"
+        hash: "2ef5e7b2c0edc631765ea12d1f7abf33"
     }
     Frame {
         msec: 10176
-        hash: "f3e8f8174b1c995d76e68fea7f21f285"
+        hash: "2ef5e7b2c0edc631765ea12d1f7abf33"
     }
     Frame {
         msec: 10192
-        hash: "f3e8f8174b1c995d76e68fea7f21f285"
+        hash: "2ef5e7b2c0edc631765ea12d1f7abf33"
     }
     Frame {
         msec: 10208
-        hash: "f3e8f8174b1c995d76e68fea7f21f285"
+        hash: "2ef5e7b2c0edc631765ea12d1f7abf33"
     }
     Frame {
         msec: 10224
-        hash: "f3e8f8174b1c995d76e68fea7f21f285"
+        hash: "2ef5e7b2c0edc631765ea12d1f7abf33"
     }
     Key {
         type: 7
@@ -4314,35 +4314,35 @@ VisualTest {
     }
     Frame {
         msec: 10240
-        hash: "f3e8f8174b1c995d76e68fea7f21f285"
+        hash: "2ef5e7b2c0edc631765ea12d1f7abf33"
     }
     Frame {
         msec: 10256
-        hash: "f3e8f8174b1c995d76e68fea7f21f285"
+        hash: "2ef5e7b2c0edc631765ea12d1f7abf33"
     }
     Frame {
         msec: 10272
-        hash: "f3e8f8174b1c995d76e68fea7f21f285"
+        hash: "2ef5e7b2c0edc631765ea12d1f7abf33"
     }
     Frame {
         msec: 10288
-        hash: "f3e8f8174b1c995d76e68fea7f21f285"
+        hash: "2ef5e7b2c0edc631765ea12d1f7abf33"
     }
     Frame {
         msec: 10304
-        hash: "f3e8f8174b1c995d76e68fea7f21f285"
+        hash: "2ef5e7b2c0edc631765ea12d1f7abf33"
     }
     Frame {
         msec: 10320
-        hash: "f3e8f8174b1c995d76e68fea7f21f285"
+        hash: "2ef5e7b2c0edc631765ea12d1f7abf33"
     }
     Frame {
         msec: 10336
-        hash: "f3e8f8174b1c995d76e68fea7f21f285"
+        hash: "2ef5e7b2c0edc631765ea12d1f7abf33"
     }
     Frame {
         msec: 10352
-        hash: "f3e8f8174b1c995d76e68fea7f21f285"
+        hash: "2ef5e7b2c0edc631765ea12d1f7abf33"
     }
     Key {
         type: 6
@@ -4354,27 +4354,27 @@ VisualTest {
     }
     Frame {
         msec: 10368
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10384
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10400
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10416
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10432
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10448
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Key {
         type: 7
@@ -4386,27 +4386,27 @@ VisualTest {
     }
     Frame {
         msec: 10464
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10480
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10496
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10512
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10528
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10544
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10560
@@ -4414,23 +4414,23 @@ VisualTest {
     }
     Frame {
         msec: 10576
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10592
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10608
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10624
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10640
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Key {
         type: 7
@@ -4442,219 +4442,219 @@ VisualTest {
     }
     Frame {
         msec: 10656
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10672
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10688
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10704
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10720
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10736
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10752
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10768
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10784
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10800
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10816
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10832
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10848
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10864
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10880
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10896
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10912
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10928
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10944
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10960
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10976
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 10992
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11008
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11024
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11040
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11056
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11072
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11088
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11104
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11120
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11136
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11152
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11168
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11184
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11200
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11216
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11232
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11248
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11264
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11280
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11296
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11312
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11328
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11344
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11360
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11376
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11392
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11408
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11424
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11440
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11456
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11472
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11488
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11504
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11520
@@ -4662,26 +4662,26 @@ VisualTest {
     }
     Frame {
         msec: 11536
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11552
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11568
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11584
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11600
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
     Frame {
         msec: 11616
-        hash: "94c707f2778a4f327f0c49265a42dfb4"
+        hash: "c3914ed0d035a39423a1f2cf9ac6c165"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.0.png
index 0d1fa54..61606b2 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.1.png
index bedf721..a4b28fc 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.2.png
index f17abe2..5be6bbb 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.2.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.3.png
index a98e8ef..a220f65 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.3.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.4.png
index 36801d8..6946707 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.4.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.5.png
index 35c39e7..4eeb8ec 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.5.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.5.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.6.png
index 35c39e7..4eeb8ec 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.6.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.6.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.qml
index 3e36073..f1bb5a9 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "2bfc2ce5462c1b2e8177159590e8bf9d"
+        hash: "b6611676a7d38162d5c0210ea9d0e291"
     }
     Key {
         type: 6
@@ -18,7 +18,7 @@ VisualTest {
     }
     Frame {
         msec: 32
-        hash: "2aebd6f552933d74ad64e953728c44a6"
+        hash: "b7fc43d4344c8d39f4240dadead86b1e"
     }
     Key {
         type: 7
@@ -30,11 +30,11 @@ VisualTest {
     }
     Frame {
         msec: 48
-        hash: "2aebd6f552933d74ad64e953728c44a6"
+        hash: "b7fc43d4344c8d39f4240dadead86b1e"
     }
     Frame {
         msec: 64
-        hash: "2aebd6f552933d74ad64e953728c44a6"
+        hash: "b7fc43d4344c8d39f4240dadead86b1e"
     }
     Key {
         type: 7
@@ -46,11 +46,11 @@ VisualTest {
     }
     Frame {
         msec: 80
-        hash: "2aebd6f552933d74ad64e953728c44a6"
+        hash: "b7fc43d4344c8d39f4240dadead86b1e"
     }
     Frame {
         msec: 96
-        hash: "2aebd6f552933d74ad64e953728c44a6"
+        hash: "b7fc43d4344c8d39f4240dadead86b1e"
     }
     Key {
         type: 6
@@ -62,15 +62,15 @@ VisualTest {
     }
     Frame {
         msec: 112
-        hash: "96f0f1c8ddc760ddb454c374faa75239"
+        hash: "23006a07263b8b3240c4080fb1d587e9"
     }
     Frame {
         msec: 128
-        hash: "96f0f1c8ddc760ddb454c374faa75239"
+        hash: "23006a07263b8b3240c4080fb1d587e9"
     }
     Frame {
         msec: 144
-        hash: "96f0f1c8ddc760ddb454c374faa75239"
+        hash: "23006a07263b8b3240c4080fb1d587e9"
     }
     Key {
         type: 6
@@ -82,15 +82,15 @@ VisualTest {
     }
     Frame {
         msec: 160
-        hash: "5660942e66cdc499a067b1209b46a593"
+        hash: "8a60fd38fb9c171a15bf7e6e51bee664"
     }
     Frame {
         msec: 176
-        hash: "5660942e66cdc499a067b1209b46a593"
+        hash: "8a60fd38fb9c171a15bf7e6e51bee664"
     }
     Frame {
         msec: 192
-        hash: "5660942e66cdc499a067b1209b46a593"
+        hash: "8a60fd38fb9c171a15bf7e6e51bee664"
     }
     Key {
         type: 7
@@ -102,11 +102,11 @@ VisualTest {
     }
     Frame {
         msec: 208
-        hash: "5660942e66cdc499a067b1209b46a593"
+        hash: "8a60fd38fb9c171a15bf7e6e51bee664"
     }
     Frame {
         msec: 224
-        hash: "5660942e66cdc499a067b1209b46a593"
+        hash: "8a60fd38fb9c171a15bf7e6e51bee664"
     }
     Key {
         type: 6
@@ -118,7 +118,7 @@ VisualTest {
     }
     Frame {
         msec: 240
-        hash: "dd3b01d6a2a829e6ba7404d5318f7d15"
+        hash: "33cdfa214f071848ed374407b4601c5a"
     }
     Key {
         type: 7
@@ -130,19 +130,19 @@ VisualTest {
     }
     Frame {
         msec: 256
-        hash: "dd3b01d6a2a829e6ba7404d5318f7d15"
+        hash: "33cdfa214f071848ed374407b4601c5a"
     }
     Frame {
         msec: 272
-        hash: "dd3b01d6a2a829e6ba7404d5318f7d15"
+        hash: "33cdfa214f071848ed374407b4601c5a"
     }
     Frame {
         msec: 288
-        hash: "dd3b01d6a2a829e6ba7404d5318f7d15"
+        hash: "33cdfa214f071848ed374407b4601c5a"
     }
     Frame {
         msec: 304
-        hash: "dd3b01d6a2a829e6ba7404d5318f7d15"
+        hash: "33cdfa214f071848ed374407b4601c5a"
     }
     Key {
         type: 7
@@ -154,11 +154,11 @@ VisualTest {
     }
     Frame {
         msec: 320
-        hash: "dd3b01d6a2a829e6ba7404d5318f7d15"
+        hash: "33cdfa214f071848ed374407b4601c5a"
     }
     Frame {
         msec: 336
-        hash: "dd3b01d6a2a829e6ba7404d5318f7d15"
+        hash: "33cdfa214f071848ed374407b4601c5a"
     }
     Key {
         type: 6
@@ -170,19 +170,19 @@ VisualTest {
     }
     Frame {
         msec: 352
-        hash: "1cf8dbc4358e3aa51c260a3a40143318"
+        hash: "80794c72fe7dda72997122a89f33e6e4"
     }
     Frame {
         msec: 368
-        hash: "1cf8dbc4358e3aa51c260a3a40143318"
+        hash: "80794c72fe7dda72997122a89f33e6e4"
     }
     Frame {
         msec: 384
-        hash: "1cf8dbc4358e3aa51c260a3a40143318"
+        hash: "80794c72fe7dda72997122a89f33e6e4"
     }
     Frame {
         msec: 400
-        hash: "1cf8dbc4358e3aa51c260a3a40143318"
+        hash: "80794c72fe7dda72997122a89f33e6e4"
     }
     Key {
         type: 7
@@ -194,19 +194,19 @@ VisualTest {
     }
     Frame {
         msec: 416
-        hash: "1cf8dbc4358e3aa51c260a3a40143318"
+        hash: "80794c72fe7dda72997122a89f33e6e4"
     }
     Frame {
         msec: 432
-        hash: "1cf8dbc4358e3aa51c260a3a40143318"
+        hash: "80794c72fe7dda72997122a89f33e6e4"
     }
     Frame {
         msec: 448
-        hash: "1cf8dbc4358e3aa51c260a3a40143318"
+        hash: "80794c72fe7dda72997122a89f33e6e4"
     }
     Frame {
         msec: 464
-        hash: "c9f5b9e45b0bb040e669daccf8bb1eb0"
+        hash: "80794c72fe7dda72997122a89f33e6e4"
     }
     Key {
         type: 6
@@ -218,19 +218,19 @@ VisualTest {
     }
     Frame {
         msec: 480
-        hash: "fc2972eca4ca510d23c92f712fd1ceb3"
+        hash: "bfcd901aee3d9db796597834bec1f173"
     }
     Frame {
         msec: 496
-        hash: "fc2972eca4ca510d23c92f712fd1ceb3"
+        hash: "bfcd901aee3d9db796597834bec1f173"
     }
     Frame {
         msec: 512
-        hash: "fc2972eca4ca510d23c92f712fd1ceb3"
+        hash: "bfcd901aee3d9db796597834bec1f173"
     }
     Frame {
         msec: 528
-        hash: "fc2972eca4ca510d23c92f712fd1ceb3"
+        hash: "bfcd901aee3d9db796597834bec1f173"
     }
     Key {
         type: 6
@@ -250,23 +250,23 @@ VisualTest {
     }
     Frame {
         msec: 544
-        hash: "15313caf999d43a079e51c69323682f3"
+        hash: "965102cb74dcf695b950616ce5c42875"
     }
     Frame {
         msec: 560
-        hash: "15313caf999d43a079e51c69323682f3"
+        hash: "965102cb74dcf695b950616ce5c42875"
     }
     Frame {
         msec: 576
-        hash: "15313caf999d43a079e51c69323682f3"
+        hash: "965102cb74dcf695b950616ce5c42875"
     }
     Frame {
         msec: 592
-        hash: "15313caf999d43a079e51c69323682f3"
+        hash: "965102cb74dcf695b950616ce5c42875"
     }
     Frame {
         msec: 608
-        hash: "15313caf999d43a079e51c69323682f3"
+        hash: "965102cb74dcf695b950616ce5c42875"
     }
     Key {
         type: 7
@@ -286,19 +286,19 @@ VisualTest {
     }
     Frame {
         msec: 624
-        hash: "80cbbe525c033083248e4a5d636f875c"
+        hash: "73556f0cf2c8d77881a7d3881025e343"
     }
     Frame {
         msec: 640
-        hash: "80cbbe525c033083248e4a5d636f875c"
+        hash: "73556f0cf2c8d77881a7d3881025e343"
     }
     Frame {
         msec: 656
-        hash: "80cbbe525c033083248e4a5d636f875c"
+        hash: "73556f0cf2c8d77881a7d3881025e343"
     }
     Frame {
         msec: 672
-        hash: "80cbbe525c033083248e4a5d636f875c"
+        hash: "73556f0cf2c8d77881a7d3881025e343"
     }
     Key {
         type: 7
@@ -310,11 +310,11 @@ VisualTest {
     }
     Frame {
         msec: 688
-        hash: "80cbbe525c033083248e4a5d636f875c"
+        hash: "73556f0cf2c8d77881a7d3881025e343"
     }
     Frame {
         msec: 704
-        hash: "80cbbe525c033083248e4a5d636f875c"
+        hash: "73556f0cf2c8d77881a7d3881025e343"
     }
     Key {
         type: 6
@@ -326,23 +326,23 @@ VisualTest {
     }
     Frame {
         msec: 720
-        hash: "ccc8cfb1c79d043ec68b2174f3fb5b27"
+        hash: "a75bdb09a48b90936d2d4de647e7323d"
     }
     Frame {
         msec: 736
-        hash: "ccc8cfb1c79d043ec68b2174f3fb5b27"
+        hash: "a75bdb09a48b90936d2d4de647e7323d"
     }
     Frame {
         msec: 752
-        hash: "ccc8cfb1c79d043ec68b2174f3fb5b27"
+        hash: "a75bdb09a48b90936d2d4de647e7323d"
     }
     Frame {
         msec: 768
-        hash: "ccc8cfb1c79d043ec68b2174f3fb5b27"
+        hash: "a75bdb09a48b90936d2d4de647e7323d"
     }
     Frame {
         msec: 784
-        hash: "ccc8cfb1c79d043ec68b2174f3fb5b27"
+        hash: "a75bdb09a48b90936d2d4de647e7323d"
     }
     Key {
         type: 7
@@ -354,7 +354,7 @@ VisualTest {
     }
     Frame {
         msec: 800
-        hash: "ccc8cfb1c79d043ec68b2174f3fb5b27"
+        hash: "a75bdb09a48b90936d2d4de647e7323d"
     }
     Key {
         type: 6
@@ -366,15 +366,15 @@ VisualTest {
     }
     Frame {
         msec: 816
-        hash: "d13548c95a838350f2b3011e643e0182"
+        hash: "f37ab5f03e7cf86e3589fc0711b23a53"
     }
     Frame {
         msec: 832
-        hash: "d13548c95a838350f2b3011e643e0182"
+        hash: "f37ab5f03e7cf86e3589fc0711b23a53"
     }
     Frame {
         msec: 848
-        hash: "d13548c95a838350f2b3011e643e0182"
+        hash: "f37ab5f03e7cf86e3589fc0711b23a53"
     }
     Key {
         type: 7
@@ -386,15 +386,15 @@ VisualTest {
     }
     Frame {
         msec: 864
-        hash: "d13548c95a838350f2b3011e643e0182"
+        hash: "f37ab5f03e7cf86e3589fc0711b23a53"
     }
     Frame {
         msec: 880
-        hash: "d13548c95a838350f2b3011e643e0182"
+        hash: "f37ab5f03e7cf86e3589fc0711b23a53"
     }
     Frame {
         msec: 896
-        hash: "d13548c95a838350f2b3011e643e0182"
+        hash: "f37ab5f03e7cf86e3589fc0711b23a53"
     }
     Key {
         type: 6
@@ -406,15 +406,15 @@ VisualTest {
     }
     Frame {
         msec: 912
-        hash: "1c61611fc6386736782b7d61619ae9af"
+        hash: "219e5edd5f138cd113f0b929460cf074"
     }
     Frame {
         msec: 928
-        hash: "1c61611fc6386736782b7d61619ae9af"
+        hash: "219e5edd5f138cd113f0b929460cf074"
     }
     Frame {
         msec: 944
-        hash: "1c61611fc6386736782b7d61619ae9af"
+        hash: "219e5edd5f138cd113f0b929460cf074"
     }
     Frame {
         msec: 960
@@ -422,11 +422,11 @@ VisualTest {
     }
     Frame {
         msec: 976
-        hash: "224079eaeb708f8cd27326a06857f6aa"
+        hash: "219e5edd5f138cd113f0b929460cf074"
     }
     Frame {
         msec: 992
-        hash: "224079eaeb708f8cd27326a06857f6aa"
+        hash: "219e5edd5f138cd113f0b929460cf074"
     }
     Key {
         type: 6
@@ -446,23 +446,23 @@ VisualTest {
     }
     Frame {
         msec: 1008
-        hash: "07681c5879322e7ac093c9324b45520d"
+        hash: "79cf23a46fbbeddbef10ef2a62533342"
     }
     Frame {
         msec: 1024
-        hash: "07681c5879322e7ac093c9324b45520d"
+        hash: "79cf23a46fbbeddbef10ef2a62533342"
     }
     Frame {
         msec: 1040
-        hash: "07681c5879322e7ac093c9324b45520d"
+        hash: "79cf23a46fbbeddbef10ef2a62533342"
     }
     Frame {
         msec: 1056
-        hash: "07681c5879322e7ac093c9324b45520d"
+        hash: "79cf23a46fbbeddbef10ef2a62533342"
     }
     Frame {
         msec: 1072
-        hash: "07681c5879322e7ac093c9324b45520d"
+        hash: "79cf23a46fbbeddbef10ef2a62533342"
     }
     Key {
         type: 7
@@ -474,31 +474,31 @@ VisualTest {
     }
     Frame {
         msec: 1088
-        hash: "07681c5879322e7ac093c9324b45520d"
+        hash: "79cf23a46fbbeddbef10ef2a62533342"
     }
     Frame {
         msec: 1104
-        hash: "07681c5879322e7ac093c9324b45520d"
+        hash: "79cf23a46fbbeddbef10ef2a62533342"
     }
     Frame {
         msec: 1120
-        hash: "07681c5879322e7ac093c9324b45520d"
+        hash: "79cf23a46fbbeddbef10ef2a62533342"
     }
     Frame {
         msec: 1136
-        hash: "07681c5879322e7ac093c9324b45520d"
+        hash: "79cf23a46fbbeddbef10ef2a62533342"
     }
     Frame {
         msec: 1152
-        hash: "07681c5879322e7ac093c9324b45520d"
+        hash: "79cf23a46fbbeddbef10ef2a62533342"
     }
     Frame {
         msec: 1168
-        hash: "07681c5879322e7ac093c9324b45520d"
+        hash: "79cf23a46fbbeddbef10ef2a62533342"
     }
     Frame {
         msec: 1184
-        hash: "07681c5879322e7ac093c9324b45520d"
+        hash: "79cf23a46fbbeddbef10ef2a62533342"
     }
     Key {
         type: 6
@@ -510,23 +510,23 @@ VisualTest {
     }
     Frame {
         msec: 1200
-        hash: "9dda4b5fa581a01608d9c3e2ce0bc33b"
+        hash: "ccb17209d85c7e49fbb0b5f9134fc39c"
     }
     Frame {
         msec: 1216
-        hash: "9dda4b5fa581a01608d9c3e2ce0bc33b"
+        hash: "ccb17209d85c7e49fbb0b5f9134fc39c"
     }
     Frame {
         msec: 1232
-        hash: "9dda4b5fa581a01608d9c3e2ce0bc33b"
+        hash: "ccb17209d85c7e49fbb0b5f9134fc39c"
     }
     Frame {
         msec: 1248
-        hash: "9dda4b5fa581a01608d9c3e2ce0bc33b"
+        hash: "ccb17209d85c7e49fbb0b5f9134fc39c"
     }
     Frame {
         msec: 1264
-        hash: "9dda4b5fa581a01608d9c3e2ce0bc33b"
+        hash: "ccb17209d85c7e49fbb0b5f9134fc39c"
     }
     Key {
         type: 7
@@ -546,11 +546,11 @@ VisualTest {
     }
     Frame {
         msec: 1280
-        hash: "95c62fa8d99d29999ce84b975d6858bc"
+        hash: "29aaa213e4b146199289b5383528bc88"
     }
     Frame {
         msec: 1296
-        hash: "95c62fa8d99d29999ce84b975d6858bc"
+        hash: "29aaa213e4b146199289b5383528bc88"
     }
     Key {
         type: 6
@@ -562,15 +562,15 @@ VisualTest {
     }
     Frame {
         msec: 1312
-        hash: "c98dada1c82e867bd0d0ff56de86574f"
+        hash: "7f9da386497bca2dc19b1c3ab475f453"
     }
     Frame {
         msec: 1328
-        hash: "c98dada1c82e867bd0d0ff56de86574f"
+        hash: "7f9da386497bca2dc19b1c3ab475f453"
     }
     Frame {
         msec: 1344
-        hash: "c98dada1c82e867bd0d0ff56de86574f"
+        hash: "7f9da386497bca2dc19b1c3ab475f453"
     }
     Key {
         type: 7
@@ -582,11 +582,11 @@ VisualTest {
     }
     Frame {
         msec: 1360
-        hash: "c98dada1c82e867bd0d0ff56de86574f"
+        hash: "7f9da386497bca2dc19b1c3ab475f453"
     }
     Frame {
         msec: 1376
-        hash: "c98dada1c82e867bd0d0ff56de86574f"
+        hash: "7f9da386497bca2dc19b1c3ab475f453"
     }
     Key {
         type: 7
@@ -598,19 +598,19 @@ VisualTest {
     }
     Frame {
         msec: 1392
-        hash: "c98dada1c82e867bd0d0ff56de86574f"
+        hash: "7f9da386497bca2dc19b1c3ab475f453"
     }
     Frame {
         msec: 1408
-        hash: "c98dada1c82e867bd0d0ff56de86574f"
+        hash: "7f9da386497bca2dc19b1c3ab475f453"
     }
     Frame {
         msec: 1424
-        hash: "c98dada1c82e867bd0d0ff56de86574f"
+        hash: "7f9da386497bca2dc19b1c3ab475f453"
     }
     Frame {
         msec: 1440
-        hash: "c98dada1c82e867bd0d0ff56de86574f"
+        hash: "7f9da386497bca2dc19b1c3ab475f453"
     }
     Key {
         type: 6
@@ -622,23 +622,23 @@ VisualTest {
     }
     Frame {
         msec: 1456
-        hash: "30d8ac1ed88cce3df5e8e5ef209caf45"
+        hash: "eb683a6b2a9ed2cf4ea5cb424670c9d2"
     }
     Frame {
         msec: 1472
-        hash: "30d8ac1ed88cce3df5e8e5ef209caf45"
+        hash: "eb683a6b2a9ed2cf4ea5cb424670c9d2"
     }
     Frame {
         msec: 1488
-        hash: "30d8ac1ed88cce3df5e8e5ef209caf45"
+        hash: "eb683a6b2a9ed2cf4ea5cb424670c9d2"
     }
     Frame {
         msec: 1504
-        hash: "30d8ac1ed88cce3df5e8e5ef209caf45"
+        hash: "eb683a6b2a9ed2cf4ea5cb424670c9d2"
     }
     Frame {
         msec: 1520
-        hash: "30d8ac1ed88cce3df5e8e5ef209caf45"
+        hash: "eb683a6b2a9ed2cf4ea5cb424670c9d2"
     }
     Key {
         type: 7
@@ -650,11 +650,11 @@ VisualTest {
     }
     Frame {
         msec: 1536
-        hash: "30d8ac1ed88cce3df5e8e5ef209caf45"
+        hash: "eb683a6b2a9ed2cf4ea5cb424670c9d2"
     }
     Frame {
         msec: 1552
-        hash: "30d8ac1ed88cce3df5e8e5ef209caf45"
+        hash: "eb683a6b2a9ed2cf4ea5cb424670c9d2"
     }
     Key {
         type: 6
@@ -666,23 +666,23 @@ VisualTest {
     }
     Frame {
         msec: 1568
-        hash: "d0d0bd91c9ac756c43a0c0fe53797ee3"
+        hash: "c5c789ca287cf673be808f3e10e054a2"
     }
     Frame {
         msec: 1584
-        hash: "d0d0bd91c9ac756c43a0c0fe53797ee3"
+        hash: "c5c789ca287cf673be808f3e10e054a2"
     }
     Frame {
         msec: 1600
-        hash: "d0d0bd91c9ac756c43a0c0fe53797ee3"
+        hash: "c5c789ca287cf673be808f3e10e054a2"
     }
     Frame {
         msec: 1616
-        hash: "d0d0bd91c9ac756c43a0c0fe53797ee3"
+        hash: "c5c789ca287cf673be808f3e10e054a2"
     }
     Frame {
         msec: 1632
-        hash: "d0d0bd91c9ac756c43a0c0fe53797ee3"
+        hash: "c5c789ca287cf673be808f3e10e054a2"
     }
     Key {
         type: 6
@@ -702,23 +702,23 @@ VisualTest {
     }
     Frame {
         msec: 1648
-        hash: "8a2825dc4d2883fe491819ae34a2eff8"
+        hash: "5e39fc7058b64afa7036002a2dae8976"
     }
     Frame {
         msec: 1664
-        hash: "8a2825dc4d2883fe491819ae34a2eff8"
+        hash: "5e39fc7058b64afa7036002a2dae8976"
     }
     Frame {
         msec: 1680
-        hash: "8a2825dc4d2883fe491819ae34a2eff8"
+        hash: "5e39fc7058b64afa7036002a2dae8976"
     }
     Frame {
         msec: 1696
-        hash: "8a2825dc4d2883fe491819ae34a2eff8"
+        hash: "5e39fc7058b64afa7036002a2dae8976"
     }
     Frame {
         msec: 1712
-        hash: "8a2825dc4d2883fe491819ae34a2eff8"
+        hash: "5e39fc7058b64afa7036002a2dae8976"
     }
     Key {
         type: 6
@@ -730,15 +730,15 @@ VisualTest {
     }
     Frame {
         msec: 1728
-        hash: "acf73c003e786ca1756f43a2e20962d3"
+        hash: "687e69083430812cd42eff708229a176"
     }
     Frame {
         msec: 1744
-        hash: "acf73c003e786ca1756f43a2e20962d3"
+        hash: "687e69083430812cd42eff708229a176"
     }
     Frame {
         msec: 1760
-        hash: "acf73c003e786ca1756f43a2e20962d3"
+        hash: "687e69083430812cd42eff708229a176"
     }
     Key {
         type: 7
@@ -750,7 +750,7 @@ VisualTest {
     }
     Frame {
         msec: 1776
-        hash: "acf73c003e786ca1756f43a2e20962d3"
+        hash: "687e69083430812cd42eff708229a176"
     }
     Key {
         type: 6
@@ -762,11 +762,11 @@ VisualTest {
     }
     Frame {
         msec: 1792
-        hash: "715cce5efb512e76e65b6dd53de988c6"
+        hash: "f33cd379acd2785298aa74f78e22bdfb"
     }
     Frame {
         msec: 1808
-        hash: "715cce5efb512e76e65b6dd53de988c6"
+        hash: "f33cd379acd2785298aa74f78e22bdfb"
     }
     Key {
         type: 7
@@ -778,19 +778,19 @@ VisualTest {
     }
     Frame {
         msec: 1824
-        hash: "715cce5efb512e76e65b6dd53de988c6"
+        hash: "f33cd379acd2785298aa74f78e22bdfb"
     }
     Frame {
         msec: 1840
-        hash: "715cce5efb512e76e65b6dd53de988c6"
+        hash: "f33cd379acd2785298aa74f78e22bdfb"
     }
     Frame {
         msec: 1856
-        hash: "715cce5efb512e76e65b6dd53de988c6"
+        hash: "f33cd379acd2785298aa74f78e22bdfb"
     }
     Frame {
         msec: 1872
-        hash: "715cce5efb512e76e65b6dd53de988c6"
+        hash: "f33cd379acd2785298aa74f78e22bdfb"
     }
     Key {
         type: 7
@@ -802,11 +802,11 @@ VisualTest {
     }
     Frame {
         msec: 1888
-        hash: "715cce5efb512e76e65b6dd53de988c6"
+        hash: "f33cd379acd2785298aa74f78e22bdfb"
     }
     Frame {
         msec: 1904
-        hash: "715cce5efb512e76e65b6dd53de988c6"
+        hash: "f33cd379acd2785298aa74f78e22bdfb"
     }
     Frame {
         msec: 1920
@@ -814,11 +814,11 @@ VisualTest {
     }
     Frame {
         msec: 1936
-        hash: "715cce5efb512e76e65b6dd53de988c6"
+        hash: "f33cd379acd2785298aa74f78e22bdfb"
     }
     Frame {
         msec: 1952
-        hash: "715cce5efb512e76e65b6dd53de988c6"
+        hash: "f33cd379acd2785298aa74f78e22bdfb"
     }
     Key {
         type: 6
@@ -830,27 +830,27 @@ VisualTest {
     }
     Frame {
         msec: 1968
-        hash: "eb9217410ea88877b037c9f8d38413ab"
+        hash: "205e79eb4a7e515ffa5bd24677408e79"
     }
     Frame {
         msec: 1984
-        hash: "eb9217410ea88877b037c9f8d38413ab"
+        hash: "205e79eb4a7e515ffa5bd24677408e79"
     }
     Frame {
         msec: 2000
-        hash: "eb9217410ea88877b037c9f8d38413ab"
+        hash: "205e79eb4a7e515ffa5bd24677408e79"
     }
     Frame {
         msec: 2016
-        hash: "eb9217410ea88877b037c9f8d38413ab"
+        hash: "205e79eb4a7e515ffa5bd24677408e79"
     }
     Frame {
         msec: 2032
-        hash: "eb9217410ea88877b037c9f8d38413ab"
+        hash: "205e79eb4a7e515ffa5bd24677408e79"
     }
     Frame {
         msec: 2048
-        hash: "eb9217410ea88877b037c9f8d38413ab"
+        hash: "205e79eb4a7e515ffa5bd24677408e79"
     }
     Key {
         type: 6
@@ -862,7 +862,7 @@ VisualTest {
     }
     Frame {
         msec: 2064
-        hash: "d4b86b88d417e168139671f762a129a9"
+        hash: "2c1570a63d3eff7346c58356610a2f44"
     }
     Key {
         type: 7
@@ -874,15 +874,15 @@ VisualTest {
     }
     Frame {
         msec: 2080
-        hash: "d4b86b88d417e168139671f762a129a9"
+        hash: "2c1570a63d3eff7346c58356610a2f44"
     }
     Frame {
         msec: 2096
-        hash: "d4b86b88d417e168139671f762a129a9"
+        hash: "2c1570a63d3eff7346c58356610a2f44"
     }
     Frame {
         msec: 2112
-        hash: "d4b86b88d417e168139671f762a129a9"
+        hash: "2c1570a63d3eff7346c58356610a2f44"
     }
     Key {
         type: 7
@@ -894,27 +894,27 @@ VisualTest {
     }
     Frame {
         msec: 2128
-        hash: "d4b86b88d417e168139671f762a129a9"
+        hash: "2c1570a63d3eff7346c58356610a2f44"
     }
     Frame {
         msec: 2144
-        hash: "d4b86b88d417e168139671f762a129a9"
+        hash: "2c1570a63d3eff7346c58356610a2f44"
     }
     Frame {
         msec: 2160
-        hash: "d4b86b88d417e168139671f762a129a9"
+        hash: "2c1570a63d3eff7346c58356610a2f44"
     }
     Frame {
         msec: 2176
-        hash: "d4b86b88d417e168139671f762a129a9"
+        hash: "2c1570a63d3eff7346c58356610a2f44"
     }
     Frame {
         msec: 2192
-        hash: "d4b86b88d417e168139671f762a129a9"
+        hash: "2c1570a63d3eff7346c58356610a2f44"
     }
     Frame {
         msec: 2208
-        hash: "d4b86b88d417e168139671f762a129a9"
+        hash: "2c1570a63d3eff7346c58356610a2f44"
     }
     Key {
         type: 6
@@ -926,23 +926,23 @@ VisualTest {
     }
     Frame {
         msec: 2224
-        hash: "bce77452be7f54a1f42685acb79ca5a3"
+        hash: "8202436b4e184adc69cdf7dd735afe33"
     }
     Frame {
         msec: 2240
-        hash: "bce77452be7f54a1f42685acb79ca5a3"
+        hash: "8202436b4e184adc69cdf7dd735afe33"
     }
     Frame {
         msec: 2256
-        hash: "bce77452be7f54a1f42685acb79ca5a3"
+        hash: "8202436b4e184adc69cdf7dd735afe33"
     }
     Frame {
         msec: 2272
-        hash: "bce77452be7f54a1f42685acb79ca5a3"
+        hash: "8202436b4e184adc69cdf7dd735afe33"
     }
     Frame {
         msec: 2288
-        hash: "bce77452be7f54a1f42685acb79ca5a3"
+        hash: "8202436b4e184adc69cdf7dd735afe33"
     }
     Key {
         type: 6
@@ -954,7 +954,7 @@ VisualTest {
     }
     Frame {
         msec: 2304
-        hash: "c8040808e2d582a32d447eb885b6a72d"
+        hash: "855069b52f6714d54f4005751b8e2930"
     }
     Key {
         type: 7
@@ -966,15 +966,15 @@ VisualTest {
     }
     Frame {
         msec: 2320
-        hash: "c8040808e2d582a32d447eb885b6a72d"
+        hash: "855069b52f6714d54f4005751b8e2930"
     }
     Frame {
         msec: 2336
-        hash: "c8040808e2d582a32d447eb885b6a72d"
+        hash: "855069b52f6714d54f4005751b8e2930"
     }
     Frame {
         msec: 2352
-        hash: "c8040808e2d582a32d447eb885b6a72d"
+        hash: "855069b52f6714d54f4005751b8e2930"
     }
     Key {
         type: 6
@@ -986,11 +986,11 @@ VisualTest {
     }
     Frame {
         msec: 2368
-        hash: "5beb32a23637b51f1c9b117e93b2c1d0"
+        hash: "6e1a97a3e491f24e34d4b24bf3091afc"
     }
     Frame {
         msec: 2384
-        hash: "5beb32a23637b51f1c9b117e93b2c1d0"
+        hash: "6e1a97a3e491f24e34d4b24bf3091afc"
     }
     Key {
         type: 7
@@ -1002,15 +1002,15 @@ VisualTest {
     }
     Frame {
         msec: 2400
-        hash: "5beb32a23637b51f1c9b117e93b2c1d0"
+        hash: "6e1a97a3e491f24e34d4b24bf3091afc"
     }
     Frame {
         msec: 2416
-        hash: "5beb32a23637b51f1c9b117e93b2c1d0"
+        hash: "6e1a97a3e491f24e34d4b24bf3091afc"
     }
     Frame {
         msec: 2432
-        hash: "5beb32a23637b51f1c9b117e93b2c1d0"
+        hash: "6e1a97a3e491f24e34d4b24bf3091afc"
     }
     Key {
         type: 7
@@ -1022,15 +1022,15 @@ VisualTest {
     }
     Frame {
         msec: 2448
-        hash: "5beb32a23637b51f1c9b117e93b2c1d0"
+        hash: "6e1a97a3e491f24e34d4b24bf3091afc"
     }
     Frame {
         msec: 2464
-        hash: "e1020b6bb8ca2e9f0ce93f9047695f48"
+        hash: "6e1a97a3e491f24e34d4b24bf3091afc"
     }
     Frame {
         msec: 2480
-        hash: "e1020b6bb8ca2e9f0ce93f9047695f48"
+        hash: "6e1a97a3e491f24e34d4b24bf3091afc"
     }
     Key {
         type: 6
@@ -1042,19 +1042,19 @@ VisualTest {
     }
     Frame {
         msec: 2496
-        hash: "429296196c5ebf0094d5e76379f929c5"
+        hash: "12eb5152181e0bff993dc1be087969f9"
     }
     Frame {
         msec: 2512
-        hash: "429296196c5ebf0094d5e76379f929c5"
+        hash: "12eb5152181e0bff993dc1be087969f9"
     }
     Frame {
         msec: 2528
-        hash: "429296196c5ebf0094d5e76379f929c5"
+        hash: "12eb5152181e0bff993dc1be087969f9"
     }
     Frame {
         msec: 2544
-        hash: "429296196c5ebf0094d5e76379f929c5"
+        hash: "12eb5152181e0bff993dc1be087969f9"
     }
     Key {
         type: 7
@@ -1066,27 +1066,27 @@ VisualTest {
     }
     Frame {
         msec: 2560
-        hash: "429296196c5ebf0094d5e76379f929c5"
+        hash: "12eb5152181e0bff993dc1be087969f9"
     }
     Frame {
         msec: 2576
-        hash: "429296196c5ebf0094d5e76379f929c5"
+        hash: "12eb5152181e0bff993dc1be087969f9"
     }
     Frame {
         msec: 2592
-        hash: "429296196c5ebf0094d5e76379f929c5"
+        hash: "12eb5152181e0bff993dc1be087969f9"
     }
     Frame {
         msec: 2608
-        hash: "429296196c5ebf0094d5e76379f929c5"
+        hash: "12eb5152181e0bff993dc1be087969f9"
     }
     Frame {
         msec: 2624
-        hash: "429296196c5ebf0094d5e76379f929c5"
+        hash: "12eb5152181e0bff993dc1be087969f9"
     }
     Frame {
         msec: 2640
-        hash: "429296196c5ebf0094d5e76379f929c5"
+        hash: "12eb5152181e0bff993dc1be087969f9"
     }
     Key {
         type: 6
@@ -1098,19 +1098,19 @@ VisualTest {
     }
     Frame {
         msec: 2656
-        hash: "83a910a91a9c1ca60e8f021b7a96509e"
+        hash: "8a77655cae6c04453e6dc8a2321d1a32"
     }
     Frame {
         msec: 2672
-        hash: "83a910a91a9c1ca60e8f021b7a96509e"
+        hash: "8a77655cae6c04453e6dc8a2321d1a32"
     }
     Frame {
         msec: 2688
-        hash: "83a910a91a9c1ca60e8f021b7a96509e"
+        hash: "8a77655cae6c04453e6dc8a2321d1a32"
     }
     Frame {
         msec: 2704
-        hash: "83a910a91a9c1ca60e8f021b7a96509e"
+        hash: "8a77655cae6c04453e6dc8a2321d1a32"
     }
     Key {
         type: 7
@@ -1122,15 +1122,15 @@ VisualTest {
     }
     Frame {
         msec: 2720
-        hash: "83a910a91a9c1ca60e8f021b7a96509e"
+        hash: "8a77655cae6c04453e6dc8a2321d1a32"
     }
     Frame {
         msec: 2736
-        hash: "83a910a91a9c1ca60e8f021b7a96509e"
+        hash: "8a77655cae6c04453e6dc8a2321d1a32"
     }
     Frame {
         msec: 2752
-        hash: "83a910a91a9c1ca60e8f021b7a96509e"
+        hash: "8a77655cae6c04453e6dc8a2321d1a32"
     }
     Key {
         type: 6
@@ -1142,23 +1142,23 @@ VisualTest {
     }
     Frame {
         msec: 2768
-        hash: "4a2af150d069abfff098673375469b08"
+        hash: "c42349fe4b75e5d56a04ec6462cb0780"
     }
     Frame {
         msec: 2784
-        hash: "4a2af150d069abfff098673375469b08"
+        hash: "c42349fe4b75e5d56a04ec6462cb0780"
     }
     Frame {
         msec: 2800
-        hash: "4a2af150d069abfff098673375469b08"
+        hash: "c42349fe4b75e5d56a04ec6462cb0780"
     }
     Frame {
         msec: 2816
-        hash: "4a2af150d069abfff098673375469b08"
+        hash: "c42349fe4b75e5d56a04ec6462cb0780"
     }
     Frame {
         msec: 2832
-        hash: "4a2af150d069abfff098673375469b08"
+        hash: "c42349fe4b75e5d56a04ec6462cb0780"
     }
     Key {
         type: 6
@@ -1178,11 +1178,11 @@ VisualTest {
     }
     Frame {
         msec: 2848
-        hash: "f1909371c6f44fb7547916340d043ac7"
+        hash: "973c163b1ea4e6189e788b7f37013185"
     }
     Frame {
         msec: 2864
-        hash: "f1909371c6f44fb7547916340d043ac7"
+        hash: "973c163b1ea4e6189e788b7f37013185"
     }
     Frame {
         msec: 2880
@@ -1190,7 +1190,7 @@ VisualTest {
     }
     Frame {
         msec: 2896
-        hash: "f1909371c6f44fb7547916340d043ac7"
+        hash: "973c163b1ea4e6189e788b7f37013185"
     }
     Key {
         type: 6
@@ -1202,11 +1202,11 @@ VisualTest {
     }
     Frame {
         msec: 2912
-        hash: "35fecf3c5feda6afbd4eac5935dca7af"
+        hash: "a847abc1ef9a41a741f8dce6bc68e6a1"
     }
     Frame {
         msec: 2928
-        hash: "35fecf3c5feda6afbd4eac5935dca7af"
+        hash: "a847abc1ef9a41a741f8dce6bc68e6a1"
     }
     Key {
         type: 7
@@ -1218,11 +1218,11 @@ VisualTest {
     }
     Frame {
         msec: 2944
-        hash: "35fecf3c5feda6afbd4eac5935dca7af"
+        hash: "a847abc1ef9a41a741f8dce6bc68e6a1"
     }
     Frame {
         msec: 2960
-        hash: "d8e23c87332aed5105cb6d488efd4a63"
+        hash: "a847abc1ef9a41a741f8dce6bc68e6a1"
     }
     Key {
         type: 7
@@ -1234,35 +1234,35 @@ VisualTest {
     }
     Frame {
         msec: 2976
-        hash: "d8e23c87332aed5105cb6d488efd4a63"
+        hash: "a847abc1ef9a41a741f8dce6bc68e6a1"
     }
     Frame {
         msec: 2992
-        hash: "d8e23c87332aed5105cb6d488efd4a63"
+        hash: "a847abc1ef9a41a741f8dce6bc68e6a1"
     }
     Frame {
         msec: 3008
-        hash: "d8e23c87332aed5105cb6d488efd4a63"
+        hash: "a847abc1ef9a41a741f8dce6bc68e6a1"
     }
     Frame {
         msec: 3024
-        hash: "d8e23c87332aed5105cb6d488efd4a63"
+        hash: "a847abc1ef9a41a741f8dce6bc68e6a1"
     }
     Frame {
         msec: 3040
-        hash: "d8e23c87332aed5105cb6d488efd4a63"
+        hash: "a847abc1ef9a41a741f8dce6bc68e6a1"
     }
     Frame {
         msec: 3056
-        hash: "d8e23c87332aed5105cb6d488efd4a63"
+        hash: "a847abc1ef9a41a741f8dce6bc68e6a1"
     }
     Frame {
         msec: 3072
-        hash: "d8e23c87332aed5105cb6d488efd4a63"
+        hash: "a847abc1ef9a41a741f8dce6bc68e6a1"
     }
     Frame {
         msec: 3088
-        hash: "d8e23c87332aed5105cb6d488efd4a63"
+        hash: "a847abc1ef9a41a741f8dce6bc68e6a1"
     }
     Key {
         type: 6
@@ -1274,23 +1274,23 @@ VisualTest {
     }
     Frame {
         msec: 3104
-        hash: "6c3f38c1180f392082e3879e35a23c5e"
+        hash: "93d3b56a5070a84164169ab1869d6ed0"
     }
     Frame {
         msec: 3120
-        hash: "6c3f38c1180f392082e3879e35a23c5e"
+        hash: "93d3b56a5070a84164169ab1869d6ed0"
     }
     Frame {
         msec: 3136
-        hash: "6c3f38c1180f392082e3879e35a23c5e"
+        hash: "93d3b56a5070a84164169ab1869d6ed0"
     }
     Frame {
         msec: 3152
-        hash: "6c3f38c1180f392082e3879e35a23c5e"
+        hash: "93d3b56a5070a84164169ab1869d6ed0"
     }
     Frame {
         msec: 3168
-        hash: "6c3f38c1180f392082e3879e35a23c5e"
+        hash: "93d3b56a5070a84164169ab1869d6ed0"
     }
     Key {
         type: 7
@@ -1302,23 +1302,23 @@ VisualTest {
     }
     Frame {
         msec: 3184
-        hash: "6c3f38c1180f392082e3879e35a23c5e"
+        hash: "93d3b56a5070a84164169ab1869d6ed0"
     }
     Frame {
         msec: 3200
-        hash: "6c3f38c1180f392082e3879e35a23c5e"
+        hash: "93d3b56a5070a84164169ab1869d6ed0"
     }
     Frame {
         msec: 3216
-        hash: "6c3f38c1180f392082e3879e35a23c5e"
+        hash: "93d3b56a5070a84164169ab1869d6ed0"
     }
     Frame {
         msec: 3232
-        hash: "6c3f38c1180f392082e3879e35a23c5e"
+        hash: "93d3b56a5070a84164169ab1869d6ed0"
     }
     Frame {
         msec: 3248
-        hash: "6c3f38c1180f392082e3879e35a23c5e"
+        hash: "93d3b56a5070a84164169ab1869d6ed0"
     }
     Key {
         type: 6
@@ -1330,15 +1330,15 @@ VisualTest {
     }
     Frame {
         msec: 3264
-        hash: "54bbf6e8fbfc6e2a3e4f0886f1feade3"
+        hash: "60480b61f29a34c790da8fe1bfd98755"
     }
     Frame {
         msec: 3280
-        hash: "54bbf6e8fbfc6e2a3e4f0886f1feade3"
+        hash: "60480b61f29a34c790da8fe1bfd98755"
     }
     Frame {
         msec: 3296
-        hash: "54bbf6e8fbfc6e2a3e4f0886f1feade3"
+        hash: "60480b61f29a34c790da8fe1bfd98755"
     }
     Key {
         type: 7
@@ -1350,15 +1350,15 @@ VisualTest {
     }
     Frame {
         msec: 3312
-        hash: "54bbf6e8fbfc6e2a3e4f0886f1feade3"
+        hash: "60480b61f29a34c790da8fe1bfd98755"
     }
     Frame {
         msec: 3328
-        hash: "54bbf6e8fbfc6e2a3e4f0886f1feade3"
+        hash: "60480b61f29a34c790da8fe1bfd98755"
     }
     Frame {
         msec: 3344
-        hash: "54bbf6e8fbfc6e2a3e4f0886f1feade3"
+        hash: "60480b61f29a34c790da8fe1bfd98755"
     }
     Key {
         type: 6
@@ -1370,23 +1370,23 @@ VisualTest {
     }
     Frame {
         msec: 3360
-        hash: "0e7fcbbe36c374e9436e5ecccd8663ee"
+        hash: "c6f235590c03170581dfabc07bf9c20b"
     }
     Frame {
         msec: 3376
-        hash: "0e7fcbbe36c374e9436e5ecccd8663ee"
+        hash: "c6f235590c03170581dfabc07bf9c20b"
     }
     Frame {
         msec: 3392
-        hash: "0e7fcbbe36c374e9436e5ecccd8663ee"
+        hash: "c6f235590c03170581dfabc07bf9c20b"
     }
     Frame {
         msec: 3408
-        hash: "0e7fcbbe36c374e9436e5ecccd8663ee"
+        hash: "c6f235590c03170581dfabc07bf9c20b"
     }
     Frame {
         msec: 3424
-        hash: "0e7fcbbe36c374e9436e5ecccd8663ee"
+        hash: "c6f235590c03170581dfabc07bf9c20b"
     }
     Key {
         type: 7
@@ -1398,15 +1398,15 @@ VisualTest {
     }
     Frame {
         msec: 3440
-        hash: "0e7fcbbe36c374e9436e5ecccd8663ee"
+        hash: "c6f235590c03170581dfabc07bf9c20b"
     }
     Frame {
         msec: 3456
-        hash: "4928b737a83471181066d043b51e939f"
+        hash: "c6f235590c03170581dfabc07bf9c20b"
     }
     Frame {
         msec: 3472
-        hash: "4928b737a83471181066d043b51e939f"
+        hash: "c6f235590c03170581dfabc07bf9c20b"
     }
     Key {
         type: 6
@@ -1418,19 +1418,19 @@ VisualTest {
     }
     Frame {
         msec: 3488
-        hash: "541901e223b7129edcbd2264da7e13cd"
+        hash: "10a29af771a5c17b1443b10abd45c9aa"
     }
     Frame {
         msec: 3504
-        hash: "541901e223b7129edcbd2264da7e13cd"
+        hash: "10a29af771a5c17b1443b10abd45c9aa"
     }
     Frame {
         msec: 3520
-        hash: "541901e223b7129edcbd2264da7e13cd"
+        hash: "10a29af771a5c17b1443b10abd45c9aa"
     }
     Frame {
         msec: 3536
-        hash: "541901e223b7129edcbd2264da7e13cd"
+        hash: "10a29af771a5c17b1443b10abd45c9aa"
     }
     Key {
         type: 7
@@ -1442,11 +1442,11 @@ VisualTest {
     }
     Frame {
         msec: 3552
-        hash: "541901e223b7129edcbd2264da7e13cd"
+        hash: "10a29af771a5c17b1443b10abd45c9aa"
     }
     Frame {
         msec: 3568
-        hash: "541901e223b7129edcbd2264da7e13cd"
+        hash: "10a29af771a5c17b1443b10abd45c9aa"
     }
     Key {
         type: 6
@@ -1458,27 +1458,27 @@ VisualTest {
     }
     Frame {
         msec: 3584
-        hash: "86aa5d4fdc4f92c2810ccb3d5e990e22"
+        hash: "68449dbef331f4bdf4c4bc443ec98e89"
     }
     Frame {
         msec: 3600
-        hash: "86aa5d4fdc4f92c2810ccb3d5e990e22"
+        hash: "68449dbef331f4bdf4c4bc443ec98e89"
     }
     Frame {
         msec: 3616
-        hash: "86aa5d4fdc4f92c2810ccb3d5e990e22"
+        hash: "68449dbef331f4bdf4c4bc443ec98e89"
     }
     Frame {
         msec: 3632
-        hash: "86aa5d4fdc4f92c2810ccb3d5e990e22"
+        hash: "68449dbef331f4bdf4c4bc443ec98e89"
     }
     Frame {
         msec: 3648
-        hash: "86aa5d4fdc4f92c2810ccb3d5e990e22"
+        hash: "68449dbef331f4bdf4c4bc443ec98e89"
     }
     Frame {
         msec: 3664
-        hash: "86aa5d4fdc4f92c2810ccb3d5e990e22"
+        hash: "68449dbef331f4bdf4c4bc443ec98e89"
     }
     Key {
         type: 6
@@ -1490,7 +1490,7 @@ VisualTest {
     }
     Frame {
         msec: 3680
-        hash: "af1a78eca66ce7523306aaf324a59af6"
+        hash: "5c773045e3ccab933749a3f6a74dc25a"
     }
     Key {
         type: 7
@@ -1502,23 +1502,23 @@ VisualTest {
     }
     Frame {
         msec: 3696
-        hash: "af1a78eca66ce7523306aaf324a59af6"
+        hash: "5c773045e3ccab933749a3f6a74dc25a"
     }
     Frame {
         msec: 3712
-        hash: "af1a78eca66ce7523306aaf324a59af6"
+        hash: "5c773045e3ccab933749a3f6a74dc25a"
     }
     Frame {
         msec: 3728
-        hash: "af1a78eca66ce7523306aaf324a59af6"
+        hash: "5c773045e3ccab933749a3f6a74dc25a"
     }
     Frame {
         msec: 3744
-        hash: "af1a78eca66ce7523306aaf324a59af6"
+        hash: "5c773045e3ccab933749a3f6a74dc25a"
     }
     Frame {
         msec: 3760
-        hash: "af1a78eca66ce7523306aaf324a59af6"
+        hash: "5c773045e3ccab933749a3f6a74dc25a"
     }
     Key {
         type: 7
@@ -1530,19 +1530,19 @@ VisualTest {
     }
     Frame {
         msec: 3776
-        hash: "af1a78eca66ce7523306aaf324a59af6"
+        hash: "5c773045e3ccab933749a3f6a74dc25a"
     }
     Frame {
         msec: 3792
-        hash: "af1a78eca66ce7523306aaf324a59af6"
+        hash: "5c773045e3ccab933749a3f6a74dc25a"
     }
     Frame {
         msec: 3808
-        hash: "af1a78eca66ce7523306aaf324a59af6"
+        hash: "5c773045e3ccab933749a3f6a74dc25a"
     }
     Frame {
         msec: 3824
-        hash: "af1a78eca66ce7523306aaf324a59af6"
+        hash: "5c773045e3ccab933749a3f6a74dc25a"
     }
     Frame {
         msec: 3840
@@ -1550,19 +1550,19 @@ VisualTest {
     }
     Frame {
         msec: 3856
-        hash: "af1a78eca66ce7523306aaf324a59af6"
+        hash: "5c773045e3ccab933749a3f6a74dc25a"
     }
     Frame {
         msec: 3872
-        hash: "af1a78eca66ce7523306aaf324a59af6"
+        hash: "5c773045e3ccab933749a3f6a74dc25a"
     }
     Frame {
         msec: 3888
-        hash: "af1a78eca66ce7523306aaf324a59af6"
+        hash: "5c773045e3ccab933749a3f6a74dc25a"
     }
     Frame {
         msec: 3904
-        hash: "af1a78eca66ce7523306aaf324a59af6"
+        hash: "5c773045e3ccab933749a3f6a74dc25a"
     }
     Key {
         type: 6
@@ -1574,23 +1574,23 @@ VisualTest {
     }
     Frame {
         msec: 3920
-        hash: "c72ed9cecd1144b7e937c2c3c33ab0b8"
+        hash: "f1ef12790a0548cfaa4176680566680d"
     }
     Frame {
         msec: 3936
-        hash: "c72ed9cecd1144b7e937c2c3c33ab0b8"
+        hash: "f1ef12790a0548cfaa4176680566680d"
     }
     Frame {
         msec: 3952
-        hash: "c72ed9cecd1144b7e937c2c3c33ab0b8"
+        hash: "f1ef12790a0548cfaa4176680566680d"
     }
     Frame {
         msec: 3968
-        hash: "e00d1a6f1ceb15493e87151071d8ad3f"
+        hash: "f1ef12790a0548cfaa4176680566680d"
     }
     Frame {
         msec: 3984
-        hash: "e00d1a6f1ceb15493e87151071d8ad3f"
+        hash: "f1ef12790a0548cfaa4176680566680d"
     }
     Key {
         type: 7
@@ -1602,11 +1602,11 @@ VisualTest {
     }
     Frame {
         msec: 4000
-        hash: "e00d1a6f1ceb15493e87151071d8ad3f"
+        hash: "f1ef12790a0548cfaa4176680566680d"
     }
     Frame {
         msec: 4016
-        hash: "e00d1a6f1ceb15493e87151071d8ad3f"
+        hash: "f1ef12790a0548cfaa4176680566680d"
     }
     Key {
         type: 6
@@ -1618,15 +1618,15 @@ VisualTest {
     }
     Frame {
         msec: 4032
-        hash: "9b129865b81189be8c2e59178c009cd9"
+        hash: "22575a03b4c58e4391845d495c2ca48b"
     }
     Frame {
         msec: 4048
-        hash: "9b129865b81189be8c2e59178c009cd9"
+        hash: "22575a03b4c58e4391845d495c2ca48b"
     }
     Frame {
         msec: 4064
-        hash: "9b129865b81189be8c2e59178c009cd9"
+        hash: "22575a03b4c58e4391845d495c2ca48b"
     }
     Key {
         type: 7
@@ -1638,7 +1638,7 @@ VisualTest {
     }
     Frame {
         msec: 4080
-        hash: "9b129865b81189be8c2e59178c009cd9"
+        hash: "22575a03b4c58e4391845d495c2ca48b"
     }
     Key {
         type: 6
@@ -1650,19 +1650,19 @@ VisualTest {
     }
     Frame {
         msec: 4096
-        hash: "ccbc7a847315311d9661b7c3fc6057d6"
+        hash: "3243dc4562f073136782415365b7b42d"
     }
     Frame {
         msec: 4112
-        hash: "ccbc7a847315311d9661b7c3fc6057d6"
+        hash: "3243dc4562f073136782415365b7b42d"
     }
     Frame {
         msec: 4128
-        hash: "ccbc7a847315311d9661b7c3fc6057d6"
+        hash: "3243dc4562f073136782415365b7b42d"
     }
     Frame {
         msec: 4144
-        hash: "ccbc7a847315311d9661b7c3fc6057d6"
+        hash: "3243dc4562f073136782415365b7b42d"
     }
     Key {
         type: 7
@@ -1674,15 +1674,15 @@ VisualTest {
     }
     Frame {
         msec: 4160
-        hash: "ccbc7a847315311d9661b7c3fc6057d6"
+        hash: "3243dc4562f073136782415365b7b42d"
     }
     Frame {
         msec: 4176
-        hash: "ccbc7a847315311d9661b7c3fc6057d6"
+        hash: "3243dc4562f073136782415365b7b42d"
     }
     Frame {
         msec: 4192
-        hash: "ccbc7a847315311d9661b7c3fc6057d6"
+        hash: "3243dc4562f073136782415365b7b42d"
     }
     Key {
         type: 6
@@ -1694,23 +1694,23 @@ VisualTest {
     }
     Frame {
         msec: 4208
-        hash: "3532604c4d8bb23fc8fd44a153708f23"
+        hash: "44cd04d2a2bf12654cb96ec9af92b9aa"
     }
     Frame {
         msec: 4224
-        hash: "3532604c4d8bb23fc8fd44a153708f23"
+        hash: "44cd04d2a2bf12654cb96ec9af92b9aa"
     }
     Frame {
         msec: 4240
-        hash: "3532604c4d8bb23fc8fd44a153708f23"
+        hash: "44cd04d2a2bf12654cb96ec9af92b9aa"
     }
     Frame {
         msec: 4256
-        hash: "3532604c4d8bb23fc8fd44a153708f23"
+        hash: "44cd04d2a2bf12654cb96ec9af92b9aa"
     }
     Frame {
         msec: 4272
-        hash: "3532604c4d8bb23fc8fd44a153708f23"
+        hash: "44cd04d2a2bf12654cb96ec9af92b9aa"
     }
     Key {
         type: 6
@@ -1722,7 +1722,7 @@ VisualTest {
     }
     Frame {
         msec: 4288
-        hash: "7a951d7233a41e872aa8f8784edc1bff"
+        hash: "cf1eb35cb9a793769303abee0a2fcad8"
     }
     Key {
         type: 7
@@ -1734,15 +1734,15 @@ VisualTest {
     }
     Frame {
         msec: 4304
-        hash: "7a951d7233a41e872aa8f8784edc1bff"
+        hash: "cf1eb35cb9a793769303abee0a2fcad8"
     }
     Frame {
         msec: 4320
-        hash: "7a951d7233a41e872aa8f8784edc1bff"
+        hash: "cf1eb35cb9a793769303abee0a2fcad8"
     }
     Frame {
         msec: 4336
-        hash: "7a951d7233a41e872aa8f8784edc1bff"
+        hash: "cf1eb35cb9a793769303abee0a2fcad8"
     }
     Key {
         type: 7
@@ -1754,23 +1754,23 @@ VisualTest {
     }
     Frame {
         msec: 4352
-        hash: "7a951d7233a41e872aa8f8784edc1bff"
+        hash: "cf1eb35cb9a793769303abee0a2fcad8"
     }
     Frame {
         msec: 4368
-        hash: "7a951d7233a41e872aa8f8784edc1bff"
+        hash: "cf1eb35cb9a793769303abee0a2fcad8"
     }
     Frame {
         msec: 4384
-        hash: "7a951d7233a41e872aa8f8784edc1bff"
+        hash: "cf1eb35cb9a793769303abee0a2fcad8"
     }
     Frame {
         msec: 4400
-        hash: "7a951d7233a41e872aa8f8784edc1bff"
+        hash: "cf1eb35cb9a793769303abee0a2fcad8"
     }
     Frame {
         msec: 4416
-        hash: "7a951d7233a41e872aa8f8784edc1bff"
+        hash: "cf1eb35cb9a793769303abee0a2fcad8"
     }
     Key {
         type: 6
@@ -1782,15 +1782,15 @@ VisualTest {
     }
     Frame {
         msec: 4432
-        hash: "41683813bcdc1761003a9bece7752516"
+        hash: "252838a495502ba5b836ffd1b20711f4"
     }
     Frame {
         msec: 4448
-        hash: "41683813bcdc1761003a9bece7752516"
+        hash: "252838a495502ba5b836ffd1b20711f4"
     }
     Frame {
         msec: 4464
-        hash: "be52b6b350696bb8e883bd24750cce06"
+        hash: "252838a495502ba5b836ffd1b20711f4"
     }
     Key {
         type: 7
@@ -1802,23 +1802,23 @@ VisualTest {
     }
     Frame {
         msec: 4480
-        hash: "be52b6b350696bb8e883bd24750cce06"
+        hash: "252838a495502ba5b836ffd1b20711f4"
     }
     Frame {
         msec: 4496
-        hash: "be52b6b350696bb8e883bd24750cce06"
+        hash: "252838a495502ba5b836ffd1b20711f4"
     }
     Frame {
         msec: 4512
-        hash: "be52b6b350696bb8e883bd24750cce06"
+        hash: "252838a495502ba5b836ffd1b20711f4"
     }
     Frame {
         msec: 4528
-        hash: "be52b6b350696bb8e883bd24750cce06"
+        hash: "252838a495502ba5b836ffd1b20711f4"
     }
     Frame {
         msec: 4544
-        hash: "be52b6b350696bb8e883bd24750cce06"
+        hash: "252838a495502ba5b836ffd1b20711f4"
     }
     Key {
         type: 6
@@ -1830,19 +1830,19 @@ VisualTest {
     }
     Frame {
         msec: 4560
-        hash: "f4845e51dfb18617fe31471b0cb3bf16"
+        hash: "4010bb0f50630f067974e6ddb3177693"
     }
     Frame {
         msec: 4576
-        hash: "f4845e51dfb18617fe31471b0cb3bf16"
+        hash: "4010bb0f50630f067974e6ddb3177693"
     }
     Frame {
         msec: 4592
-        hash: "f4845e51dfb18617fe31471b0cb3bf16"
+        hash: "4010bb0f50630f067974e6ddb3177693"
     }
     Frame {
         msec: 4608
-        hash: "f4845e51dfb18617fe31471b0cb3bf16"
+        hash: "4010bb0f50630f067974e6ddb3177693"
     }
     Key {
         type: 7
@@ -1854,19 +1854,19 @@ VisualTest {
     }
     Frame {
         msec: 4624
-        hash: "f4845e51dfb18617fe31471b0cb3bf16"
+        hash: "4010bb0f50630f067974e6ddb3177693"
     }
     Frame {
         msec: 4640
-        hash: "f4845e51dfb18617fe31471b0cb3bf16"
+        hash: "4010bb0f50630f067974e6ddb3177693"
     }
     Frame {
         msec: 4656
-        hash: "f4845e51dfb18617fe31471b0cb3bf16"
+        hash: "4010bb0f50630f067974e6ddb3177693"
     }
     Frame {
         msec: 4672
-        hash: "f4845e51dfb18617fe31471b0cb3bf16"
+        hash: "4010bb0f50630f067974e6ddb3177693"
     }
     Key {
         type: 6
@@ -1878,19 +1878,19 @@ VisualTest {
     }
     Frame {
         msec: 4688
-        hash: "4e994f63cd763db43435fd39e864585c"
+        hash: "14dc6ee8cd3b4747650f2a458b42a6e3"
     }
     Frame {
         msec: 4704
-        hash: "4e994f63cd763db43435fd39e864585c"
+        hash: "14dc6ee8cd3b4747650f2a458b42a6e3"
     }
     Frame {
         msec: 4720
-        hash: "4e994f63cd763db43435fd39e864585c"
+        hash: "14dc6ee8cd3b4747650f2a458b42a6e3"
     }
     Frame {
         msec: 4736
-        hash: "4e994f63cd763db43435fd39e864585c"
+        hash: "14dc6ee8cd3b4747650f2a458b42a6e3"
     }
     Key {
         type: 7
@@ -1902,15 +1902,15 @@ VisualTest {
     }
     Frame {
         msec: 4752
-        hash: "4e994f63cd763db43435fd39e864585c"
+        hash: "14dc6ee8cd3b4747650f2a458b42a6e3"
     }
     Frame {
         msec: 4768
-        hash: "4e994f63cd763db43435fd39e864585c"
+        hash: "14dc6ee8cd3b4747650f2a458b42a6e3"
     }
     Frame {
         msec: 4784
-        hash: "4e994f63cd763db43435fd39e864585c"
+        hash: "14dc6ee8cd3b4747650f2a458b42a6e3"
     }
     Key {
         type: 6
@@ -1926,7 +1926,7 @@ VisualTest {
     }
     Frame {
         msec: 4816
-        hash: "2b5db83aff14077f625dbfc75830b2b0"
+        hash: "7d4a56854715772c92706522d2dcac56"
     }
     Key {
         type: 7
@@ -1938,19 +1938,19 @@ VisualTest {
     }
     Frame {
         msec: 4832
-        hash: "2b5db83aff14077f625dbfc75830b2b0"
+        hash: "7d4a56854715772c92706522d2dcac56"
     }
     Frame {
         msec: 4848
-        hash: "2b5db83aff14077f625dbfc75830b2b0"
+        hash: "7d4a56854715772c92706522d2dcac56"
     }
     Frame {
         msec: 4864
-        hash: "2b5db83aff14077f625dbfc75830b2b0"
+        hash: "7d4a56854715772c92706522d2dcac56"
     }
     Frame {
         msec: 4880
-        hash: "2b5db83aff14077f625dbfc75830b2b0"
+        hash: "7d4a56854715772c92706522d2dcac56"
     }
     Key {
         type: 6
@@ -1962,19 +1962,19 @@ VisualTest {
     }
     Frame {
         msec: 4896
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 4912
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 4928
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 4944
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Key {
         type: 7
@@ -1986,203 +1986,203 @@ VisualTest {
     }
     Frame {
         msec: 4960
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 4976
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 4992
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5008
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5024
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5040
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5056
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5072
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5088
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5104
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5120
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5136
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5152
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5168
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5184
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5200
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5216
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5232
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5248
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5264
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5280
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5296
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5312
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5328
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5344
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5360
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5376
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5392
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5408
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5424
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5440
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5456
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5472
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5488
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5504
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5520
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5536
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5552
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5568
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5584
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5600
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5616
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5632
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5648
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5664
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5680
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5696
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5712
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5728
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5744
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5760
@@ -2190,239 +2190,239 @@ VisualTest {
     }
     Frame {
         msec: 5776
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5792
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5808
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5824
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5840
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5856
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5872
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5888
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5904
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5920
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5936
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5952
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5968
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 5984
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6000
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6016
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6032
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6048
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6064
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6080
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6096
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6112
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6128
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6144
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6160
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6176
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6192
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6208
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6224
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6240
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6256
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6272
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6288
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6304
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6320
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6336
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6352
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6368
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6384
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6400
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6416
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6432
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6448
-        hash: "f902766808596ea423cbc0b7e9bdd87a"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6464
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6480
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6496
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6512
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6528
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6544
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6560
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6576
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6592
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6608
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6624
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6640
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6656
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6672
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6688
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6704
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6720
@@ -2430,38 +2430,38 @@ VisualTest {
     }
     Frame {
         msec: 6736
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6752
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6768
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6784
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6800
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6816
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6832
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6848
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
     Frame {
         msec: 6864
-        hash: "566cba616a99c92c228a4c312466b96b"
+        hash: "0c75eb65cf70c883ee4dcd2f7ee092ce"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.0.png
index d889eef..1d96795 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.1.png
index 0c8c250..a3a9bfa 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.2.png
index 76b7fce..b50028c 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.2.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.3.png
index ecc8568..1c4876e 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.3.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.4.png
index 766abaf..9d110cb 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.4.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.qml
index 37f5e46..bd4af6a 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.qml
@@ -6,115 +6,115 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 32
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 48
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 64
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 80
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 96
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 112
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 128
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 144
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 160
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 176
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 192
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 208
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 224
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 240
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 256
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 272
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 288
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 304
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 320
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 336
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 352
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 368
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 384
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 400
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 416
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 432
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Frame {
         msec: 448
-        hash: "79b388ca7d46e1efb38672c6bf8837f8"
+        hash: "c0ffaa97d1be341fafafc18762f5cb67"
     }
     Key {
         type: 6
@@ -126,23 +126,23 @@ VisualTest {
     }
     Frame {
         msec: 464
-        hash: "52c03d5681cadb1df400a0974261e05d"
+        hash: "eadbfc95de35a0d1880809b2bbaec562"
     }
     Frame {
         msec: 480
-        hash: "52c03d5681cadb1df400a0974261e05d"
+        hash: "eadbfc95de35a0d1880809b2bbaec562"
     }
     Frame {
         msec: 496
-        hash: "52c03d5681cadb1df400a0974261e05d"
+        hash: "eadbfc95de35a0d1880809b2bbaec562"
     }
     Frame {
         msec: 512
-        hash: "52c03d5681cadb1df400a0974261e05d"
+        hash: "eadbfc95de35a0d1880809b2bbaec562"
     }
     Frame {
         msec: 528
-        hash: "9c280c469d12fc0bf1ff42883ffd5155"
+        hash: "227cbfe5fc07906060951e19ebb3ad30"
     }
     Key {
         type: 7
@@ -154,19 +154,19 @@ VisualTest {
     }
     Frame {
         msec: 544
-        hash: "655716f3544c6ae649cbda487ed1916f"
+        hash: "066256a59ad290b3725193955e3c48a6"
     }
     Frame {
         msec: 560
-        hash: "e9e6a20040bedf4afb670310a7e5c2f0"
+        hash: "6709f77cbcde82886d1c5a07f06b55a5"
     }
     Frame {
         msec: 576
-        hash: "842641682f22e370402857b9cb875192"
+        hash: "da0028083048837b4756a2d3ff468378"
     }
     Frame {
         msec: 592
-        hash: "4d8258cd2fea9b4bee647b9480a743e3"
+        hash: "5f265351bed34357d603794d868dbcbc"
     }
     Key {
         type: 6
@@ -178,19 +178,19 @@ VisualTest {
     }
     Frame {
         msec: 608
-        hash: "eb7d48cbf4cad403eb7d3fa2d10e0f88"
+        hash: "3b8030849229e90b69842219e8b2d3f1"
     }
     Frame {
         msec: 624
-        hash: "c6387240c7075e8321fda5348de9b752"
+        hash: "0b08356d9b00313b2d892175dd93095a"
     }
     Frame {
         msec: 640
-        hash: "98fb4f03db3a574cf96e88ca940fcd07"
+        hash: "4780555b277d65e3e4c0c60817b63eb4"
     }
     Frame {
         msec: 656
-        hash: "19d450ee21b0c525aba2c38e62c5b117"
+        hash: "6b31c8f0569d01d97a371423a0f379c0"
     }
     Key {
         type: 7
@@ -202,19 +202,19 @@ VisualTest {
     }
     Frame {
         msec: 672
-        hash: "9943426dd31b393c4831dcfcdb266f76"
+        hash: "e9a5695636f7957d33f1c902a37a605d"
     }
     Frame {
         msec: 688
-        hash: "318bd0909d6ab32fc15ee385b69e1dc2"
+        hash: "27a783cd4ef5caab382721a98f7966da"
     }
     Frame {
         msec: 704
-        hash: "ca5f62f289b5f86e6d86afdcb0bc05f5"
+        hash: "c50598c0a5f8d501fd3ac9cddecee506"
     }
     Frame {
         msec: 720
-        hash: "2158851f276862dd1e2a7d3fee9af938"
+        hash: "2a2d0e202bc3bf7991409391a2ce2934"
     }
     Key {
         type: 6
@@ -226,19 +226,19 @@ VisualTest {
     }
     Frame {
         msec: 736
-        hash: "746e28cf8df1bcfd5a07383e4f9e1420"
+        hash: "2d97b8503c739b210615971ad08c2714"
     }
     Frame {
         msec: 752
-        hash: "8ae15b54e47c6ba43b6ddad234a65499"
+        hash: "f27fd7f1d8c6dfb7393ab0d39ed5cd02"
     }
     Frame {
         msec: 768
-        hash: "8fcb22bd16dafb62a2fdcd40feda5178"
+        hash: "32d256543e3e1ba722860e5143af9f09"
     }
     Frame {
         msec: 784
-        hash: "1ef6e14540615967e7c059fb3299c38a"
+        hash: "9123b724613ef4d3d8431afde6e9eb6b"
     }
     Key {
         type: 7
@@ -250,23 +250,23 @@ VisualTest {
     }
     Frame {
         msec: 800
-        hash: "cd260f4aa6e9772668b13f1f5e4ab3db"
+        hash: "be5249a7effc94ec2be3d6053eba7b45"
     }
     Frame {
         msec: 816
-        hash: "44aaa31fe7183e0088eb9ec12cfef69f"
+        hash: "57f2c119c9eca3d1e4acd2f775af5207"
     }
     Frame {
         msec: 832
-        hash: "575b1fbc9fa6587ce9811b5074a47a84"
+        hash: "23b79a2630448e99f27a657fd9789354"
     }
     Frame {
         msec: 848
-        hash: "83b1fe02fdbe16418231c8acbbbebcac"
+        hash: "c8faab137cbc014aef5e3212889d00b8"
     }
     Frame {
         msec: 864
-        hash: "7bfb6f545fd55e7e336431e6882c9974"
+        hash: "c9616f6fde5d6a8ecf346ece9952f09b"
     }
     Key {
         type: 6
@@ -278,15 +278,15 @@ VisualTest {
     }
     Frame {
         msec: 880
-        hash: "bf3a6677b5f815e1b66f6489032f8e1d"
+        hash: "11a861ca71d789e3d97d599608a793be"
     }
     Frame {
         msec: 896
-        hash: "cfcd90f1e97e92b0fbe2595275a64a48"
+        hash: "5a6c57df0c33b83985aeb194f291ad6c"
     }
     Frame {
         msec: 912
-        hash: "397ad28f60e1f5245b59380968ececd2"
+        hash: "2c047359db6946cb740462b0d6c695be"
     }
     Key {
         type: 7
@@ -298,11 +298,11 @@ VisualTest {
     }
     Frame {
         msec: 928
-        hash: "c6ea797bc327a7e31316f44e93d6beb9"
+        hash: "d0bb54caf661be021be8fe2691de24e8"
     }
     Frame {
         msec: 944
-        hash: "0e3c15c5328c85a54826b65ec82007f5"
+        hash: "80f0a60239f4d81b18b9cb3e80faf346"
     }
     Frame {
         msec: 960
@@ -310,11 +310,11 @@ VisualTest {
     }
     Frame {
         msec: 976
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 992
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Key {
         type: 6
@@ -326,15 +326,15 @@ VisualTest {
     }
     Frame {
         msec: 1008
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 1024
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 1040
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Key {
         type: 7
@@ -346,23 +346,23 @@ VisualTest {
     }
     Frame {
         msec: 1056
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 1072
-        hash: "676e251f10800c2a8860b43c2546524d"
+        hash: "5f6cc0c97e4748aeeaa4a00c8a8c8928"
     }
     Frame {
         msec: 1088
-        hash: "db99874ab3656663316931ea0ac4c7c3"
+        hash: "b1d71160d9a8a8edeb4cf7e00df36cfc"
     }
     Frame {
         msec: 1104
-        hash: "2c4b2205df96e09a9cd91d5efb86d820"
+        hash: "5bfd4269145cc0962e0fa9c294e8f5aa"
     }
     Frame {
         msec: 1120
-        hash: "25e6e81e4769751e9639ee4a3c4ae839"
+        hash: "4e22c95802d83f0099017c6be9d93214"
     }
     Key {
         type: 6
@@ -374,23 +374,23 @@ VisualTest {
     }
     Frame {
         msec: 1136
-        hash: "9eaa29386d3ad22b9032b8b345739342"
+        hash: "0f31d8f4867af7c2f4fb8e86aa077afd"
     }
     Frame {
         msec: 1152
-        hash: "21ebb054c5df6104bb01e0a8abe9b40c"
+        hash: "21a552133320008a4d4f77752a3cfb55"
     }
     Frame {
         msec: 1168
-        hash: "3ab8cdbe65ea34868c1a917e42d31c14"
+        hash: "3a30a4a785de21da0ff939e303202a81"
     }
     Frame {
         msec: 1184
-        hash: "05badd00be618fc4395e80936284613f"
+        hash: "b0e3ed2468538aacec354cb96d90c362"
     }
     Frame {
         msec: 1200
-        hash: "8a373ed9798a8dd33aab5191db06f190"
+        hash: "56bf6e3fe47e52046b443481fc17a3ec"
     }
     Key {
         type: 7
@@ -402,27 +402,27 @@ VisualTest {
     }
     Frame {
         msec: 1216
-        hash: "2a8c6a7cd20fcf7b5c8b75c59f50276b"
+        hash: "ce80807cde9b902ebf33281fce50d9fb"
     }
     Frame {
         msec: 1232
-        hash: "2e874a6b741d1cbfde5544fb831bdf84"
+        hash: "ed67b18b5f7b90d3bcd9f662e70dc7b8"
     }
     Frame {
         msec: 1248
-        hash: "36e3d3a9a4e7163a1c052f30a97697dc"
+        hash: "930950ce5c6b12da47eea1b92d5176eb"
     }
     Frame {
         msec: 1264
-        hash: "fb18565ab22f6b397aef65a992c0dff8"
+        hash: "5a2eeca0f1533d323cc4d7ffbb7ad6aa"
     }
     Frame {
         msec: 1280
-        hash: "13763364dd631556988fe18afce23e84"
+        hash: "3f7f3ef2d4c1353dfe7027930505f4fd"
     }
     Frame {
         msec: 1296
-        hash: "2ea2995a7c022a4959eb1128d69907cc"
+        hash: "1a3a781ac5a1e90a4415944e0c54ea4e"
     }
     Key {
         type: 6
@@ -434,7 +434,7 @@ VisualTest {
     }
     Frame {
         msec: 1312
-        hash: "88485c98b946476b52094c85702939d4"
+        hash: "d11dae0dd461fc82a73bf319905320d4"
     }
     Key {
         type: 6
@@ -446,19 +446,19 @@ VisualTest {
     }
     Frame {
         msec: 1328
-        hash: "532586645946f17a274a3f7d1077e55b"
+        hash: "00957049ea51866138cfc33451f12e17"
     }
     Frame {
         msec: 1344
-        hash: "1702f1badb65f4039536c7255220a4b9"
+        hash: "386847af9b173db7ef1554d2c85c748e"
     }
     Frame {
         msec: 1360
-        hash: "7cd23a8548d9d2d7da78fa541d1ff9ba"
+        hash: "4b715060d29d6228a40217bc769fc140"
     }
     Frame {
         msec: 1376
-        hash: "42a4e0f3511d45f56e445737cbda49b5"
+        hash: "e58a9a3623afa08819351c22435ba03f"
     }
     Key {
         type: 6
@@ -470,31 +470,31 @@ VisualTest {
     }
     Frame {
         msec: 1392
-        hash: "e326fff480404a41735b1567a784ba80"
+        hash: "6378e3faf5578818fc282de2a077da59"
     }
     Frame {
         msec: 1408
-        hash: "4d972a5cfa88e86c72dc1fa7430090e4"
+        hash: "07efb3687d29e65680e1cc831762348f"
     }
     Frame {
         msec: 1424
-        hash: "691c28e265d5cd253c06f6feff7ee536"
+        hash: "5292e7c95b3c5b11e4088b5010984257"
     }
     Frame {
         msec: 1440
-        hash: "3ebb2496ec085b92a8f130e4f54c26c9"
+        hash: "ffe95603f5fe9d63abb3b77c399c3b11"
     }
     Frame {
         msec: 1456
-        hash: "2447e98313dc850f58333c7aa630ef28"
+        hash: "ad7cb73893c27b69704c5b821738a3c1"
     }
     Frame {
         msec: 1472
-        hash: "9d8bc16d365e534e4e1feee7185db44f"
+        hash: "e25971a61888ded93b651891ec9661b0"
     }
     Frame {
         msec: 1488
-        hash: "9a4b9cb5396857f79eac3a0a4e1dc1b3"
+        hash: "80f90b3623bf34544438dd00abee7037"
     }
     Key {
         type: 7
@@ -506,51 +506,51 @@ VisualTest {
     }
     Frame {
         msec: 1504
-        hash: "2d25e8fc011ec795e1596806a81be60d"
+        hash: "797dd70572e532d4acb374230b2c8efe"
     }
     Frame {
         msec: 1520
-        hash: "2fce48cf607cc3809ee1a9f59323e23a"
+        hash: "0673db1283d874a5711520f272572cf8"
     }
     Frame {
         msec: 1536
-        hash: "0fa177b9aa230dbcd5032a6ecddf604a"
+        hash: "fbc8434912f08a93b5f884258bc754b7"
     }
     Frame {
         msec: 1552
-        hash: "2dd53f15e0787337ce0590223e5ce788"
+        hash: "e41ebaf8f2114a6e8f38f731ea164e8a"
     }
     Frame {
         msec: 1568
-        hash: "385d08fa990f40a7a1d5fd61fa9fe7ae"
+        hash: "d14bdb5bf1b4756166ecf6f3255bf3cc"
     }
     Frame {
         msec: 1584
-        hash: "481401635bd419b8a30435135f61223f"
+        hash: "5fb04569aa0e530b898a3c11725b947e"
     }
     Frame {
         msec: 1600
-        hash: "d6600e6fcfd477100b7aab3509888512"
+        hash: "03d24457fae160864fec985765f6d8d1"
     }
     Frame {
         msec: 1616
-        hash: "4ede7ec537b56352dec575bbb7dbd482"
+        hash: "56dad740bb9032d113a0dacbe986c9c0"
     }
     Frame {
         msec: 1632
-        hash: "d4ff15c0dcf76dd7c97a0bf1901d688e"
+        hash: "70d9acda83aa7db59780cf56f03e38ec"
     }
     Frame {
         msec: 1648
-        hash: "d15c7df693dfb0ef48c30d5f73b34126"
+        hash: "a272e39bc1af0f4d1bab9c3f64e746e2"
     }
     Frame {
         msec: 1664
-        hash: "6dee0c6a00fb378692277914d22607e6"
+        hash: "cf0379de604b9bb33b4456cb89e09afd"
     }
     Frame {
         msec: 1680
-        hash: "8d74e52fca14ec36b266ace5113cac2b"
+        hash: "332e7a10d75c0d21a24fc8be34269629"
     }
     Key {
         type: 6
@@ -562,31 +562,31 @@ VisualTest {
     }
     Frame {
         msec: 1696
-        hash: "a33b648bc08e2b0db4e04a28dc7f64a2"
+        hash: "c07eb71d90e74393205338bc946c1e43"
     }
     Frame {
         msec: 1712
-        hash: "04af2732e95351448a3a4e5a12eb2c0d"
+        hash: "984477de7c103ff3aebc2634785dce09"
     }
     Frame {
         msec: 1728
-        hash: "72795cad18792504420251987d814cc5"
+        hash: "958f79dd7c57387042746df2ca01779e"
     }
     Frame {
         msec: 1744
-        hash: "46e3c02ca6ea9c831b276c6f0ef954db"
+        hash: "53bb3f0718d6333ca40dc279b6300b85"
     }
     Frame {
         msec: 1760
-        hash: "42173174a90d470901cd543e2bd57225"
+        hash: "c16877cb99997cc47f1fff5af1d22bd7"
     }
     Frame {
         msec: 1776
-        hash: "57e7d302246a27430b1e60fdbdfc368a"
+        hash: "dea3e1eb6c72f0d37398e3e301a23c19"
     }
     Frame {
         msec: 1792
-        hash: "896b150b47d87ec3d279ab149195758e"
+        hash: "6bb7918f0794e6a7cbdb8847cdcf6e35"
     }
     Key {
         type: 7
@@ -598,19 +598,19 @@ VisualTest {
     }
     Frame {
         msec: 1808
-        hash: "041240041c62b4cef6f329328eee2c6f"
+        hash: "6858cd874abb1ed2fec34862f76044fa"
     }
     Frame {
         msec: 1824
-        hash: "46e38ca8d4d827dc71719d662d433983"
+        hash: "47b546ea0d5b1d4573991d4738c37f4d"
     }
     Frame {
         msec: 1840
-        hash: "7d6ea4d357f0e916eaae3edd662bec9e"
+        hash: "6c9e636dee2bb5f2a72a2c08ab9fb970"
     }
     Frame {
         msec: 1856
-        hash: "b1214158b7f01fde56ec436baf88b98f"
+        hash: "42c2b2a7f41c88ae7bb19403e2460a17"
     }
     Key {
         type: 7
@@ -622,7 +622,7 @@ VisualTest {
     }
     Frame {
         msec: 1872
-        hash: "22b59737bb8ef5ffc78f1ef4a707d328"
+        hash: "80b7986af693b89dc4d4f9533dae85cb"
     }
     Key {
         type: 6
@@ -634,11 +634,11 @@ VisualTest {
     }
     Frame {
         msec: 1888
-        hash: "70b47f9af5373d4d5e0777eb169cbfe3"
+        hash: "631bea21dde9b7647f5843bc3513f3ba"
     }
     Frame {
         msec: 1904
-        hash: "d02ddd6f4b7169dcd114c519843eb855"
+        hash: "cc40335abbea0d589180096f7d8f5426"
     }
     Frame {
         msec: 1920
@@ -646,31 +646,31 @@ VisualTest {
     }
     Frame {
         msec: 1936
-        hash: "5af4a21ba6e3b5e994557831d7063e92"
+        hash: "1c03b5384a889fe233eb1c6d14a55f36"
     }
     Frame {
         msec: 1952
-        hash: "97ef4122641ac4c49b9ef9a9dc1e5a0a"
+        hash: "7762cc4e6cf681311f5296de698c950b"
     }
     Frame {
         msec: 1968
-        hash: "7794188761d3efa4b47d4ab4c07208a3"
+        hash: "678eed1d1fec30b02156d690777397c1"
     }
     Frame {
         msec: 1984
-        hash: "4ca45c199693e767448016c4ccf1daaf"
+        hash: "96f51fee5c7baf78a3465420d63a9e5f"
     }
     Frame {
         msec: 2000
-        hash: "4ca45c199693e767448016c4ccf1daaf"
+        hash: "96f51fee5c7baf78a3465420d63a9e5f"
     }
     Frame {
         msec: 2016
-        hash: "4ca45c199693e767448016c4ccf1daaf"
+        hash: "96f51fee5c7baf78a3465420d63a9e5f"
     }
     Frame {
         msec: 2032
-        hash: "4ca45c199693e767448016c4ccf1daaf"
+        hash: "96f51fee5c7baf78a3465420d63a9e5f"
     }
     Key {
         type: 7
@@ -682,7 +682,7 @@ VisualTest {
     }
     Frame {
         msec: 2048
-        hash: "4ca45c199693e767448016c4ccf1daaf"
+        hash: "96f51fee5c7baf78a3465420d63a9e5f"
     }
     Key {
         type: 7
@@ -694,27 +694,27 @@ VisualTest {
     }
     Frame {
         msec: 2064
-        hash: "7794188761d3efa4b47d4ab4c07208a3"
+        hash: "678eed1d1fec30b02156d690777397c1"
     }
     Frame {
         msec: 2080
-        hash: "97ef4122641ac4c49b9ef9a9dc1e5a0a"
+        hash: "7762cc4e6cf681311f5296de698c950b"
     }
     Frame {
         msec: 2096
-        hash: "5af4a21ba6e3b5e994557831d7063e92"
+        hash: "1c03b5384a889fe233eb1c6d14a55f36"
     }
     Frame {
         msec: 2112
-        hash: "6f0f9bfa49f50ffd18ffe695cdc56d73"
+        hash: "2cd264339edc0338fc610e0d766425cc"
     }
     Frame {
         msec: 2128
-        hash: "d02ddd6f4b7169dcd114c519843eb855"
+        hash: "cc40335abbea0d589180096f7d8f5426"
     }
     Frame {
         msec: 2144
-        hash: "70b47f9af5373d4d5e0777eb169cbfe3"
+        hash: "631bea21dde9b7647f5843bc3513f3ba"
     }
     Key {
         type: 6
@@ -726,27 +726,27 @@ VisualTest {
     }
     Frame {
         msec: 2160
-        hash: "9e770dcd2f33ad157e86d08752458daf"
+        hash: "c5199c908df1f550d7c4f133eb926134"
     }
     Frame {
         msec: 2176
-        hash: "b6c660ffd14bb756f87adb5cf836e97f"
+        hash: "483eca22c50750e7591785ed60813d1f"
     }
     Frame {
         msec: 2192
-        hash: "c498c154fcf2d66fc0981150e575033c"
+        hash: "4091de379d8f6ccc7f19ea39f6c7993a"
     }
     Frame {
         msec: 2208
-        hash: "29277da2d1d6251e18ab89331d5df61d"
+        hash: "cd58c0d4f7248315a787542b0edcb4fb"
     }
     Frame {
         msec: 2224
-        hash: "3c7588de81cbfbba8735da74de220128"
+        hash: "458895f9ede4d56e0b851c6ed124405d"
     }
     Frame {
         msec: 2240
-        hash: "4fa61e0644ce0942a30f05ad8d3f13f6"
+        hash: "29a28a97fc78a1b01252b852fb0446e2"
     }
     Key {
         type: 7
@@ -758,31 +758,31 @@ VisualTest {
     }
     Frame {
         msec: 2256
-        hash: "3a90bb8b912d0be07e0e8b78407c54ff"
+        hash: "4fd9f22ad06e02b68319c298c2286e36"
     }
     Frame {
         msec: 2272
-        hash: "3d89454f0af4ab88ea67a075cb4e39b7"
+        hash: "a588e9dbeabd7519cd0cf2d26a123529"
     }
     Frame {
         msec: 2288
-        hash: "abdd589312402caea0b1c4f26ff6a1bf"
+        hash: "bb74f706477e277284fad50752f078b5"
     }
     Frame {
         msec: 2304
-        hash: "e6ab11dfb1965e94f5a42f2642ca0b30"
+        hash: "38f16a7deeaea6828edd15b00024fc19"
     }
     Frame {
         msec: 2320
-        hash: "c9fbfb63e19d1281b0c3a59504cd695c"
+        hash: "30c4aa33a6672f4df24186ad1e28bcf9"
     }
     Frame {
         msec: 2336
-        hash: "bc250ab3f5da66ecb0792a796b197149"
+        hash: "7f2ac0854ddbcca94a2ad160ead5d4d3"
     }
     Frame {
         msec: 2352
-        hash: "c5d26cd3ac3f87c77d716b912875b9de"
+        hash: "e1c083d0235ff5a2e002ce78f43009b0"
     }
     Key {
         type: 6
@@ -802,23 +802,23 @@ VisualTest {
     }
     Frame {
         msec: 2368
-        hash: "bbe9837039b7ea1dfab8ed30c8a15724"
+        hash: "eaee6483a2a4a0b09a8e40bb1785a498"
     }
     Frame {
         msec: 2384
-        hash: "836f9f207d8197f8e6e8e9c49f83aa4e"
+        hash: "26530bded6311640c4d3f6d1485fa7d3"
     }
     Frame {
         msec: 2400
-        hash: "235d20a347a0f7b331e707ad7de93f95"
+        hash: "e54102edbf6cc0c9a32b09858f760ee5"
     }
     Frame {
         msec: 2416
-        hash: "7f422b624488525aede06c69996fc583"
+        hash: "27434828de3ba8f6a3b83f042b70eb8b"
     }
     Frame {
         msec: 2432
-        hash: "664bef152c87b3eb6729d9b46bad750c"
+        hash: "fdf68e988b988d068ea78a5a09ef349e"
     }
     Key {
         type: 6
@@ -830,23 +830,23 @@ VisualTest {
     }
     Frame {
         msec: 2448
-        hash: "d32716cb4cb9fc8145029efb3fd1a32a"
+        hash: "0e1e9a2cf891cf65f30ead539becf408"
     }
     Frame {
         msec: 2464
-        hash: "17670e9d61ef2f9a0ec079b413ab546a"
+        hash: "46602c03632f6a47c9d523e1ea61baaf"
     }
     Frame {
         msec: 2480
-        hash: "6a3cbc70476d4e145a0e187ad7a73c52"
+        hash: "5c758ee2aa3f92b6506533f6d615bc20"
     }
     Frame {
         msec: 2496
-        hash: "aa0f4cf316026154c940261b4df848e3"
+        hash: "25edbdaae72e03426c9dfa75c08c33e6"
     }
     Frame {
         msec: 2512
-        hash: "2650d86c6aa82e4cc5e7ec4e2889f028"
+        hash: "a4bd11f15594932b996a069f3098c596"
     }
     Key {
         type: 7
@@ -858,23 +858,23 @@ VisualTest {
     }
     Frame {
         msec: 2528
-        hash: "ab392121c99d4f8f5a3622c26761a57e"
+        hash: "e4090b920ce2456149155f61fb586a6f"
     }
     Frame {
         msec: 2544
-        hash: "4f1c4006a84d794a7eaf9932a6f7d3ea"
+        hash: "ce71f4dc76f90fa300d715ed77e8a5a8"
     }
     Frame {
         msec: 2560
-        hash: "f6387eb0678a78894f607a7ff186bd19"
+        hash: "59414694d42a3942c4832fd7a3e93145"
     }
     Frame {
         msec: 2576
-        hash: "b14cb2545cb2cc055b914618d5086425"
+        hash: "1213fc9d9c1d58ceefc213a59f970679"
     }
     Frame {
         msec: 2592
-        hash: "e31ebced4421e9d5092950d373f9a4e9"
+        hash: "bbfa8471ab3fa5fc146946a6c8e0ce86"
     }
     Key {
         type: 6
@@ -886,15 +886,15 @@ VisualTest {
     }
     Frame {
         msec: 2608
-        hash: "b2177f1eed72624c4f6e4bd59902db16"
+        hash: "22a49c3b5234b4b7a2b935d58027f834"
     }
     Frame {
         msec: 2624
-        hash: "9ade9a8b436bb9481e8135b7342070ff"
+        hash: "7b81c14d5350fb55775c1cb0f3945c46"
     }
     Frame {
         msec: 2640
-        hash: "4bdbc37f8ecac1a8aae182cb3e6bf1fa"
+        hash: "8ebf266de0df228e47cc6e5a8758a6ea"
     }
     Key {
         type: 7
@@ -906,23 +906,23 @@ VisualTest {
     }
     Frame {
         msec: 2656
-        hash: "3bf69edaa0eec73246c52f310079a15d"
+        hash: "6344eb333dc28672f863bcb7ca5d6cfe"
     }
     Frame {
         msec: 2672
-        hash: "add80b7fde2865bb23ccb46a03b5604c"
+        hash: "8efc9b4a6c27b8918cba629a5a1c0f24"
     }
     Frame {
         msec: 2688
-        hash: "6259b8d763f468054f35c87f4ba47d30"
+        hash: "b586c24ce0c04391a9095c0ac4b7a05a"
     }
     Frame {
         msec: 2704
-        hash: "1dd94dcd8c7f651811f1b962a75962be"
+        hash: "191413fe51a6887ae92c135252fdeeae"
     }
     Frame {
         msec: 2720
-        hash: "f813c62008a3880d079cb1c0be9a03e1"
+        hash: "fc0b37abf12827af41e7037eab8ba5c8"
     }
     Key {
         type: 6
@@ -934,19 +934,19 @@ VisualTest {
     }
     Frame {
         msec: 2736
-        hash: "4e776b52bce5b0e0ee46f9feff684a90"
+        hash: "5efe28d02b93e094192d7fd6fe753acd"
     }
     Frame {
         msec: 2752
-        hash: "cd2c2b6e9d05b521214eeab29e89d7c4"
+        hash: "dadc1f7b14fbf9f8a174821c4197da46"
     }
     Frame {
         msec: 2768
-        hash: "8605360fcf3f24372463827a1d3f93c6"
+        hash: "124deac57a3eeaef4cb3c0c802bacc05"
     }
     Frame {
         msec: 2784
-        hash: "03b734ffb679f8718999c4e060a2febb"
+        hash: "e022a6d66a7b37d72885a7a7f6919433"
     }
     Key {
         type: 7
@@ -958,23 +958,23 @@ VisualTest {
     }
     Frame {
         msec: 2800
-        hash: "43e2020cd127ce541b54ba7814c9ba74"
+        hash: "5faa6543469753948b1636351d044329"
     }
     Frame {
         msec: 2816
-        hash: "9c1774f8ae01e37aac05d27567d3cec6"
+        hash: "a7dcf5a0b9bb00105eed173b498cb95c"
     }
     Frame {
         msec: 2832
-        hash: "6c4a7a200eba8b6c5c0b5b75d8a88811"
+        hash: "29ac83d169af2c74ffd134d771c88718"
     }
     Frame {
         msec: 2848
-        hash: "21d88afb0f05ace0710da47af275d827"
+        hash: "0a04648fdc90ec86fb55ad3a165573c4"
     }
     Frame {
         msec: 2864
-        hash: "42b56667390aa2db6d593b7af9a5021a"
+        hash: "d699c713ba939612f1e552e48db19b18"
     }
     Frame {
         msec: 2880
@@ -982,51 +982,51 @@ VisualTest {
     }
     Frame {
         msec: 2896
-        hash: "5897cafae19f8842f53a54b75e36f22d"
+        hash: "adf564652cfae394869755ff2fe5b534"
     }
     Frame {
         msec: 2912
-        hash: "11cacddae5d5361b7e87696808ac2905"
+        hash: "d1453f663217ee45a8462b7d077d7f6a"
     }
     Frame {
         msec: 2928
-        hash: "2cc3dcb900ab2bffd52fb61fff108043"
+        hash: "9f1461d63ccc49f83e58245ba75685e1"
     }
     Frame {
         msec: 2944
-        hash: "8938b8c7254873197e409206c1c20ad4"
+        hash: "8cece1543e7e9190eefaa92c2024cbd1"
     }
     Frame {
         msec: 2960
-        hash: "e343d647f236969530d0b076c3375f1a"
+        hash: "555abf8bc3fdb1eef85b1e4bd54932a3"
     }
     Frame {
         msec: 2976
-        hash: "5e39a0f9bdc45a7a288f59b7cbbf749d"
+        hash: "7fc65284b99fc548de0985d94a145fa7"
     }
     Frame {
         msec: 2992
-        hash: "5e39a0f9bdc45a7a288f59b7cbbf749d"
+        hash: "7fc65284b99fc548de0985d94a145fa7"
     }
     Frame {
         msec: 3008
-        hash: "5e39a0f9bdc45a7a288f59b7cbbf749d"
+        hash: "7fc65284b99fc548de0985d94a145fa7"
     }
     Frame {
         msec: 3024
-        hash: "5e39a0f9bdc45a7a288f59b7cbbf749d"
+        hash: "7fc65284b99fc548de0985d94a145fa7"
     }
     Frame {
         msec: 3040
-        hash: "5e39a0f9bdc45a7a288f59b7cbbf749d"
+        hash: "7fc65284b99fc548de0985d94a145fa7"
     }
     Frame {
         msec: 3056
-        hash: "5e39a0f9bdc45a7a288f59b7cbbf749d"
+        hash: "7fc65284b99fc548de0985d94a145fa7"
     }
     Frame {
         msec: 3072
-        hash: "e343d647f236969530d0b076c3375f1a"
+        hash: "555abf8bc3fdb1eef85b1e4bd54932a3"
     }
     Key {
         type: 6
@@ -1038,23 +1038,23 @@ VisualTest {
     }
     Frame {
         msec: 3088
-        hash: "ac4898002fdc5ea7894d741cac863c8d"
+        hash: "996da2eff9302908a55308dbcc8fb3c2"
     }
     Frame {
         msec: 3104
-        hash: "eda67cb2d32f3f605a74a01148f04c99"
+        hash: "6ccc70f6120acb53152b71bcf95514ca"
     }
     Frame {
         msec: 3120
-        hash: "13e84656ef70bf07e2a444d60ac933e1"
+        hash: "51a1b8e79d209643d55d4cecc6a70ed0"
     }
     Frame {
         msec: 3136
-        hash: "9d624eebe5824fc5d4a89a04f2d776a3"
+        hash: "944dc7026c6487838ede9ef94003ec90"
     }
     Frame {
         msec: 3152
-        hash: "2c7d542f60c68e16377d3c5afea0f4e3"
+        hash: "4abbd51b620ac4ea91af95bc2d0881d7"
     }
     Key {
         type: 7
@@ -1066,27 +1066,27 @@ VisualTest {
     }
     Frame {
         msec: 3168
-        hash: "7db8d678bd1890010b2a1b9bb732c17c"
+        hash: "ba721988a1708b8c0762d706820c48fc"
     }
     Frame {
         msec: 3184
-        hash: "6d6f4cc1193b73c65db893c3f983d9f0"
+        hash: "5dba56a5bb5f8a6539a0066af35c73b8"
     }
     Frame {
         msec: 3200
-        hash: "d4e8985ad4d14436a87db45585fca946"
+        hash: "bc3efeeebe7075cd09a6e57eef43d610"
     }
     Frame {
         msec: 3216
-        hash: "495b67926e9002a43e2d251b8c96564f"
+        hash: "0bd9f7de32b01d8144280bf252d9a18f"
     }
     Frame {
         msec: 3232
-        hash: "3b2dd937cfb6cd57884f3b813f3d4129"
+        hash: "29db710e47b13f26e2bf92568d52bf52"
     }
     Frame {
         msec: 3248
-        hash: "02a5902af43990021465a7df9d479982"
+        hash: "a27c65c0a49deb18b0766bba41a32e54"
     }
     Key {
         type: 6
@@ -1098,31 +1098,31 @@ VisualTest {
     }
     Frame {
         msec: 3264
-        hash: "5b14b471fffa401affc954871662e6a8"
+        hash: "484ee552e1a9c5eafcfe1ac583fcdffd"
     }
     Frame {
         msec: 3280
-        hash: "bbe03a2ea1e5b788c79d9551bd317a2d"
+        hash: "40b336a0e337b66d813089a82a88c712"
     }
     Frame {
         msec: 3296
-        hash: "10b49692f820311b8bfbc0f87c05e993"
+        hash: "b7a8d4b8bb2b83e4c886aa51c1a73895"
     }
     Frame {
         msec: 3312
-        hash: "928ee5d4ca3c31a879f82b5b4f6d1912"
+        hash: "43b3bf8425e7a6b7115d8e6a0bcfd677"
     }
     Frame {
         msec: 3328
-        hash: "9f3ea4149963d467be28fcf26a43e6d6"
+        hash: "e2ce168241b043db74867fe7ed6de956"
     }
     Frame {
         msec: 3344
-        hash: "f2ec87d7c4f6bbecc771270062e25d14"
+        hash: "0c713bbd7bb694d87f0fe14f87098b9b"
     }
     Frame {
         msec: 3360
-        hash: "f181b9aeccdecd486550c2a69e57a63f"
+        hash: "316f6bd365ca4b4f2e6fbf34a047e307"
     }
     Key {
         type: 7
@@ -1134,39 +1134,39 @@ VisualTest {
     }
     Frame {
         msec: 3376
-        hash: "ce871b1784464b56728eeb0140ad689c"
+        hash: "421fb8881fe7b300dcec0f44ff1743e3"
     }
     Frame {
         msec: 3392
-        hash: "8d1b19921c7ee633f423b3f8c1f07e6a"
+        hash: "e8376079434393467b47a56ff00efb2b"
     }
     Frame {
         msec: 3408
-        hash: "451973c72f86fc3425c31da3311d625c"
+        hash: "63259de84a6e07d42c9df94ec2a25920"
     }
     Frame {
         msec: 3424
-        hash: "64301801af58f7a9c5ea32c33eb988e2"
+        hash: "f9194d82b81f5ac58862c382caf5cf59"
     }
     Frame {
         msec: 3440
-        hash: "3406ff52f3829c56ff3b29558d6fd11c"
+        hash: "e185f2594f038532a37b351384dc97ea"
     }
     Frame {
         msec: 3456
-        hash: "0952802094d7d7f105d7f50f36c02530"
+        hash: "91edc3ca1e6c532bd92006a761073da2"
     }
     Frame {
         msec: 3472
-        hash: "daddc3aa8ae9970cc111e981adcdd9bb"
+        hash: "b47390495539756048ccc71047ebef7b"
     }
     Frame {
         msec: 3488
-        hash: "491e3241705cdc2917c6560cece6188e"
+        hash: "7c83d3bdb9abf8ab2cfe7f9464673a49"
     }
     Frame {
         msec: 3504
-        hash: "cefbdc87c704e72145e878fc944c621f"
+        hash: "b686f4013f45885ab794aba9ff491286"
     }
     Key {
         type: 7
@@ -1178,11 +1178,11 @@ VisualTest {
     }
     Frame {
         msec: 3520
-        hash: "3427e88f200a1ac2d4596cb2fec0ae66"
+        hash: "0c55d6ea330b7365825864d4bdacafcb"
     }
     Frame {
         msec: 3536
-        hash: "62eef650b45f3c2fa425d1bff88a01a7"
+        hash: "2bb72f191201572308e461021872fb4c"
     }
     Key {
         type: 7
@@ -1194,75 +1194,75 @@ VisualTest {
     }
     Frame {
         msec: 3552
-        hash: "9945cda3cf5c22d8c83b19b0f69e4e09"
+        hash: "81b04a84982698ee80d13d392742edd3"
     }
     Frame {
         msec: 3568
-        hash: "80fcd1194d1bc3e010ddc6ba224f3d40"
+        hash: "63f582dc2a9f707c1ec99f4285d13a84"
     }
     Frame {
         msec: 3584
-        hash: "59da897870a7e235a67defaff1f8f4e4"
+        hash: "f91cb29101f80f5dcb1e9e8c82e823b7"
     }
     Frame {
         msec: 3600
-        hash: "664bef152c87b3eb6729d9b46bad750c"
+        hash: "fdf68e988b988d068ea78a5a09ef349e"
     }
     Frame {
         msec: 3616
-        hash: "7f422b624488525aede06c69996fc583"
+        hash: "27434828de3ba8f6a3b83f042b70eb8b"
     }
     Frame {
         msec: 3632
-        hash: "235d20a347a0f7b331e707ad7de93f95"
+        hash: "e54102edbf6cc0c9a32b09858f760ee5"
     }
     Frame {
         msec: 3648
-        hash: "836f9f207d8197f8e6e8e9c49f83aa4e"
+        hash: "26530bded6311640c4d3f6d1485fa7d3"
     }
     Frame {
         msec: 3664
-        hash: "bbe9837039b7ea1dfab8ed30c8a15724"
+        hash: "eaee6483a2a4a0b09a8e40bb1785a498"
     }
     Frame {
         msec: 3680
-        hash: "c5d26cd3ac3f87c77d716b912875b9de"
+        hash: "e1c083d0235ff5a2e002ce78f43009b0"
     }
     Frame {
         msec: 3696
-        hash: "bc250ab3f5da66ecb0792a796b197149"
+        hash: "7f2ac0854ddbcca94a2ad160ead5d4d3"
     }
     Frame {
         msec: 3712
-        hash: "c9fbfb63e19d1281b0c3a59504cd695c"
+        hash: "30c4aa33a6672f4df24186ad1e28bcf9"
     }
     Frame {
         msec: 3728
-        hash: "e6ab11dfb1965e94f5a42f2642ca0b30"
+        hash: "38f16a7deeaea6828edd15b00024fc19"
     }
     Frame {
         msec: 3744
-        hash: "abdd589312402caea0b1c4f26ff6a1bf"
+        hash: "bb74f706477e277284fad50752f078b5"
     }
     Frame {
         msec: 3760
-        hash: "3d89454f0af4ab88ea67a075cb4e39b7"
+        hash: "a588e9dbeabd7519cd0cf2d26a123529"
     }
     Frame {
         msec: 3776
-        hash: "3a90bb8b912d0be07e0e8b78407c54ff"
+        hash: "4fd9f22ad06e02b68319c298c2286e36"
     }
     Frame {
         msec: 3792
-        hash: "4fa61e0644ce0942a30f05ad8d3f13f6"
+        hash: "29a28a97fc78a1b01252b852fb0446e2"
     }
     Frame {
         msec: 3808
-        hash: "3c7588de81cbfbba8735da74de220128"
+        hash: "458895f9ede4d56e0b851c6ed124405d"
     }
     Frame {
         msec: 3824
-        hash: "29277da2d1d6251e18ab89331d5df61d"
+        hash: "cd58c0d4f7248315a787542b0edcb4fb"
     }
     Frame {
         msec: 3840
@@ -1270,239 +1270,239 @@ VisualTest {
     }
     Frame {
         msec: 3856
-        hash: "b6c660ffd14bb756f87adb5cf836e97f"
+        hash: "483eca22c50750e7591785ed60813d1f"
     }
     Frame {
         msec: 3872
-        hash: "9e770dcd2f33ad157e86d08752458daf"
+        hash: "c5199c908df1f550d7c4f133eb926134"
     }
     Frame {
         msec: 3888
-        hash: "4c9421ff4dc80e555ac5ba4a02d0c5be"
+        hash: "efaa5e4483ed9cfec792e8f270b5079e"
     }
     Frame {
         msec: 3904
-        hash: "dcbfc9f6300363d03aa869ce3d58e6fe"
+        hash: "7ffcff87e27dcb0be0047eb6fbcc9549"
     }
     Frame {
         msec: 3920
-        hash: "491f07f2498598cf57b368ff880f85f5"
+        hash: "04339417259ddee10134e1479729ae1b"
     }
     Frame {
         msec: 3936
-        hash: "ea356dc3ef6aa6ca67e58b7b2f6912e4"
+        hash: "0f1e6a0d9db7b6b8b874333682866ffa"
     }
     Frame {
         msec: 3952
-        hash: "8575a99b28bb5b8c2d01a5ed91f25d47"
+        hash: "66500c2cc3d69b9fb48dc46e384aca6d"
     }
     Frame {
         msec: 3968
-        hash: "7f83ba29fd27aa4817b7b84afbc8d6d7"
+        hash: "70d6b73499c36138bee63e07afb0b186"
     }
     Frame {
         msec: 3984
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 4000
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 4016
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 4032
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 4048
-        hash: "0173dd60a64da4c06fa9a398d2c98206"
+        hash: "c526315dd5eec117266c68a7b6b64a3f"
     }
     Frame {
         msec: 4064
-        hash: "7f83ba29fd27aa4817b7b84afbc8d6d7"
+        hash: "70d6b73499c36138bee63e07afb0b186"
     }
     Frame {
         msec: 4080
-        hash: "8575a99b28bb5b8c2d01a5ed91f25d47"
+        hash: "66500c2cc3d69b9fb48dc46e384aca6d"
     }
     Frame {
         msec: 4096
-        hash: "ea356dc3ef6aa6ca67e58b7b2f6912e4"
+        hash: "0f1e6a0d9db7b6b8b874333682866ffa"
     }
     Frame {
         msec: 4112
-        hash: "491f07f2498598cf57b368ff880f85f5"
+        hash: "04339417259ddee10134e1479729ae1b"
     }
     Frame {
         msec: 4128
-        hash: "dcbfc9f6300363d03aa869ce3d58e6fe"
+        hash: "7ffcff87e27dcb0be0047eb6fbcc9549"
     }
     Frame {
         msec: 4144
-        hash: "4c9421ff4dc80e555ac5ba4a02d0c5be"
+        hash: "efaa5e4483ed9cfec792e8f270b5079e"
     }
     Frame {
         msec: 4160
-        hash: "9e770dcd2f33ad157e86d08752458daf"
+        hash: "c5199c908df1f550d7c4f133eb926134"
     }
     Frame {
         msec: 4176
-        hash: "b6c660ffd14bb756f87adb5cf836e97f"
+        hash: "483eca22c50750e7591785ed60813d1f"
     }
     Frame {
         msec: 4192
-        hash: "c498c154fcf2d66fc0981150e575033c"
+        hash: "4091de379d8f6ccc7f19ea39f6c7993a"
     }
     Frame {
         msec: 4208
-        hash: "29277da2d1d6251e18ab89331d5df61d"
+        hash: "cd58c0d4f7248315a787542b0edcb4fb"
     }
     Frame {
         msec: 4224
-        hash: "3c7588de81cbfbba8735da74de220128"
+        hash: "458895f9ede4d56e0b851c6ed124405d"
     }
     Frame {
         msec: 4240
-        hash: "4fa61e0644ce0942a30f05ad8d3f13f6"
+        hash: "29a28a97fc78a1b01252b852fb0446e2"
     }
     Frame {
         msec: 4256
-        hash: "3a90bb8b912d0be07e0e8b78407c54ff"
+        hash: "4fd9f22ad06e02b68319c298c2286e36"
     }
     Frame {
         msec: 4272
-        hash: "3d89454f0af4ab88ea67a075cb4e39b7"
+        hash: "a588e9dbeabd7519cd0cf2d26a123529"
     }
     Frame {
         msec: 4288
-        hash: "abdd589312402caea0b1c4f26ff6a1bf"
+        hash: "bb74f706477e277284fad50752f078b5"
     }
     Frame {
         msec: 4304
-        hash: "e6ab11dfb1965e94f5a42f2642ca0b30"
+        hash: "38f16a7deeaea6828edd15b00024fc19"
     }
     Frame {
         msec: 4320
-        hash: "c9fbfb63e19d1281b0c3a59504cd695c"
+        hash: "30c4aa33a6672f4df24186ad1e28bcf9"
     }
     Frame {
         msec: 4336
-        hash: "bc250ab3f5da66ecb0792a796b197149"
+        hash: "7f2ac0854ddbcca94a2ad160ead5d4d3"
     }
     Frame {
         msec: 4352
-        hash: "c5d26cd3ac3f87c77d716b912875b9de"
+        hash: "e1c083d0235ff5a2e002ce78f43009b0"
     }
     Frame {
         msec: 4368
-        hash: "bbe9837039b7ea1dfab8ed30c8a15724"
+        hash: "eaee6483a2a4a0b09a8e40bb1785a498"
     }
     Frame {
         msec: 4384
-        hash: "836f9f207d8197f8e6e8e9c49f83aa4e"
+        hash: "26530bded6311640c4d3f6d1485fa7d3"
     }
     Frame {
         msec: 4400
-        hash: "235d20a347a0f7b331e707ad7de93f95"
+        hash: "e54102edbf6cc0c9a32b09858f760ee5"
     }
     Frame {
         msec: 4416
-        hash: "7f422b624488525aede06c69996fc583"
+        hash: "27434828de3ba8f6a3b83f042b70eb8b"
     }
     Frame {
         msec: 4432
-        hash: "664bef152c87b3eb6729d9b46bad750c"
+        hash: "fdf68e988b988d068ea78a5a09ef349e"
     }
     Frame {
         msec: 4448
-        hash: "59da897870a7e235a67defaff1f8f4e4"
+        hash: "f91cb29101f80f5dcb1e9e8c82e823b7"
     }
     Frame {
         msec: 4464
-        hash: "80fcd1194d1bc3e010ddc6ba224f3d40"
+        hash: "63f582dc2a9f707c1ec99f4285d13a84"
     }
     Frame {
         msec: 4480
-        hash: "9945cda3cf5c22d8c83b19b0f69e4e09"
+        hash: "81b04a84982698ee80d13d392742edd3"
     }
     Frame {
         msec: 4496
-        hash: "62eef650b45f3c2fa425d1bff88a01a7"
+        hash: "2bb72f191201572308e461021872fb4c"
     }
     Frame {
         msec: 4512
-        hash: "3427e88f200a1ac2d4596cb2fec0ae66"
+        hash: "0c55d6ea330b7365825864d4bdacafcb"
     }
     Frame {
         msec: 4528
-        hash: "cefbdc87c704e72145e878fc944c621f"
+        hash: "b686f4013f45885ab794aba9ff491286"
     }
     Frame {
         msec: 4544
-        hash: "491e3241705cdc2917c6560cece6188e"
+        hash: "7c83d3bdb9abf8ab2cfe7f9464673a49"
     }
     Frame {
         msec: 4560
-        hash: "daddc3aa8ae9970cc111e981adcdd9bb"
+        hash: "b47390495539756048ccc71047ebef7b"
     }
     Frame {
         msec: 4576
-        hash: "0952802094d7d7f105d7f50f36c02530"
+        hash: "91edc3ca1e6c532bd92006a761073da2"
     }
     Frame {
         msec: 4592
-        hash: "3406ff52f3829c56ff3b29558d6fd11c"
+        hash: "e185f2594f038532a37b351384dc97ea"
     }
     Frame {
         msec: 4608
-        hash: "64301801af58f7a9c5ea32c33eb988e2"
+        hash: "f9194d82b81f5ac58862c382caf5cf59"
     }
     Frame {
         msec: 4624
-        hash: "451973c72f86fc3425c31da3311d625c"
+        hash: "63259de84a6e07d42c9df94ec2a25920"
     }
     Frame {
         msec: 4640
-        hash: "8d1b19921c7ee633f423b3f8c1f07e6a"
+        hash: "e8376079434393467b47a56ff00efb2b"
     }
     Frame {
         msec: 4656
-        hash: "ce871b1784464b56728eeb0140ad689c"
+        hash: "421fb8881fe7b300dcec0f44ff1743e3"
     }
     Frame {
         msec: 4672
-        hash: "f181b9aeccdecd486550c2a69e57a63f"
+        hash: "316f6bd365ca4b4f2e6fbf34a047e307"
     }
     Frame {
         msec: 4688
-        hash: "f2ec87d7c4f6bbecc771270062e25d14"
+        hash: "0c713bbd7bb694d87f0fe14f87098b9b"
     }
     Frame {
         msec: 4704
-        hash: "9f3ea4149963d467be28fcf26a43e6d6"
+        hash: "e2ce168241b043db74867fe7ed6de956"
     }
     Frame {
         msec: 4720
-        hash: "928ee5d4ca3c31a879f82b5b4f6d1912"
+        hash: "43b3bf8425e7a6b7115d8e6a0bcfd677"
     }
     Frame {
         msec: 4736
-        hash: "10b49692f820311b8bfbc0f87c05e993"
+        hash: "b7a8d4b8bb2b83e4c886aa51c1a73895"
     }
     Frame {
         msec: 4752
-        hash: "bbe03a2ea1e5b788c79d9551bd317a2d"
+        hash: "40b336a0e337b66d813089a82a88c712"
     }
     Frame {
         msec: 4768
-        hash: "5b14b471fffa401affc954871662e6a8"
+        hash: "484ee552e1a9c5eafcfe1ac583fcdffd"
     }
     Frame {
         msec: 4784
-        hash: "02a5902af43990021465a7df9d479982"
+        hash: "a27c65c0a49deb18b0766bba41a32e54"
     }
     Frame {
         msec: 4800
@@ -1510,42 +1510,42 @@ VisualTest {
     }
     Frame {
         msec: 4816
-        hash: "495b67926e9002a43e2d251b8c96564f"
+        hash: "0bd9f7de32b01d8144280bf252d9a18f"
     }
     Frame {
         msec: 4832
-        hash: "d4e8985ad4d14436a87db45585fca946"
+        hash: "bc3efeeebe7075cd09a6e57eef43d610"
     }
     Frame {
         msec: 4848
-        hash: "6d6f4cc1193b73c65db893c3f983d9f0"
+        hash: "5dba56a5bb5f8a6539a0066af35c73b8"
     }
     Frame {
         msec: 4864
-        hash: "7db8d678bd1890010b2a1b9bb732c17c"
+        hash: "ba721988a1708b8c0762d706820c48fc"
     }
     Frame {
         msec: 4880
-        hash: "2c7d542f60c68e16377d3c5afea0f4e3"
+        hash: "4abbd51b620ac4ea91af95bc2d0881d7"
     }
     Frame {
         msec: 4896
-        hash: "9d624eebe5824fc5d4a89a04f2d776a3"
+        hash: "944dc7026c6487838ede9ef94003ec90"
     }
     Frame {
         msec: 4912
-        hash: "13e84656ef70bf07e2a444d60ac933e1"
+        hash: "51a1b8e79d209643d55d4cecc6a70ed0"
     }
     Frame {
         msec: 4928
-        hash: "eda67cb2d32f3f605a74a01148f04c99"
+        hash: "6ccc70f6120acb53152b71bcf95514ca"
     }
     Frame {
         msec: 4944
-        hash: "ac4898002fdc5ea7894d741cac863c8d"
+        hash: "996da2eff9302908a55308dbcc8fb3c2"
     }
     Frame {
         msec: 4960
-        hash: "2e95c1966c94acccd2a44a6c2942d36d"
+        hash: "264f34128dfe563126b9f187c65df61e"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.0.png
index a4d7bef..57a1599 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.png
index a8aee18..d327d5b 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.png
index 799f422..c1e3dce 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml
index bbeb532..9a26f57 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml
@@ -6,11 +6,11 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 32
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Key {
         type: 6
@@ -22,83 +22,83 @@ VisualTest {
     }
     Frame {
         msec: 48
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 64
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 80
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 96
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 112
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 128
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 144
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 160
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 176
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 192
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 208
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 224
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 240
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 256
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 272
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 288
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 304
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 320
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 336
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Frame {
         msec: 352
-        hash: "3ea9888b1213bb799bdb01ed0eff2a78"
+        hash: "0e7c7dc19aab217751411568b58830ef"
     }
     Key {
         type: 6
@@ -110,23 +110,23 @@ VisualTest {
     }
     Frame {
         msec: 368
-        hash: "d070b6581fd109ce278cf4a8c41a6549"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 384
-        hash: "d070b6581fd109ce278cf4a8c41a6549"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 400
-        hash: "d070b6581fd109ce278cf4a8c41a6549"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 416
-        hash: "d070b6581fd109ce278cf4a8c41a6549"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 432
-        hash: "d070b6581fd109ce278cf4a8c41a6549"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Key {
         type: 7
@@ -138,27 +138,27 @@ VisualTest {
     }
     Frame {
         msec: 448
-        hash: "d070b6581fd109ce278cf4a8c41a6549"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 464
-        hash: "d070b6581fd109ce278cf4a8c41a6549"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 480
-        hash: "6a80a729e85f8dab98155e115a4193cc"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 496
-        hash: "6a80a729e85f8dab98155e115a4193cc"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 512
-        hash: "6a80a729e85f8dab98155e115a4193cc"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 528
-        hash: "6a80a729e85f8dab98155e115a4193cc"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Key {
         type: 7
@@ -170,43 +170,43 @@ VisualTest {
     }
     Frame {
         msec: 544
-        hash: "6a80a729e85f8dab98155e115a4193cc"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 560
-        hash: "6a80a729e85f8dab98155e115a4193cc"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 576
-        hash: "6a80a729e85f8dab98155e115a4193cc"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 592
-        hash: "6a80a729e85f8dab98155e115a4193cc"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 608
-        hash: "6a80a729e85f8dab98155e115a4193cc"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 624
-        hash: "6a80a729e85f8dab98155e115a4193cc"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 640
-        hash: "6a80a729e85f8dab98155e115a4193cc"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 656
-        hash: "6a80a729e85f8dab98155e115a4193cc"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 672
-        hash: "6a80a729e85f8dab98155e115a4193cc"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Frame {
         msec: 688
-        hash: "6a80a729e85f8dab98155e115a4193cc"
+        hash: "d3151ba24f0011bf1add83377f32ec85"
     }
     Key {
         type: 6
@@ -218,23 +218,23 @@ VisualTest {
     }
     Frame {
         msec: 704
-        hash: "fd47d9eaea89d6a731bdd70b39b2bc54"
+        hash: "6b7c333ce19fede43aee84cc66c4c1bc"
     }
     Frame {
         msec: 720
-        hash: "fd47d9eaea89d6a731bdd70b39b2bc54"
+        hash: "6b7c333ce19fede43aee84cc66c4c1bc"
     }
     Frame {
         msec: 736
-        hash: "fd47d9eaea89d6a731bdd70b39b2bc54"
+        hash: "6b7c333ce19fede43aee84cc66c4c1bc"
     }
     Frame {
         msec: 752
-        hash: "fd47d9eaea89d6a731bdd70b39b2bc54"
+        hash: "6b7c333ce19fede43aee84cc66c4c1bc"
     }
     Frame {
         msec: 768
-        hash: "fd47d9eaea89d6a731bdd70b39b2bc54"
+        hash: "6b7c333ce19fede43aee84cc66c4c1bc"
     }
     Key {
         type: 7
@@ -246,23 +246,23 @@ VisualTest {
     }
     Frame {
         msec: 784
-        hash: "fd47d9eaea89d6a731bdd70b39b2bc54"
+        hash: "6b7c333ce19fede43aee84cc66c4c1bc"
     }
     Frame {
         msec: 800
-        hash: "fd47d9eaea89d6a731bdd70b39b2bc54"
+        hash: "6b7c333ce19fede43aee84cc66c4c1bc"
     }
     Frame {
         msec: 816
-        hash: "fd47d9eaea89d6a731bdd70b39b2bc54"
+        hash: "6b7c333ce19fede43aee84cc66c4c1bc"
     }
     Frame {
         msec: 832
-        hash: "fd47d9eaea89d6a731bdd70b39b2bc54"
+        hash: "6b7c333ce19fede43aee84cc66c4c1bc"
     }
     Frame {
         msec: 848
-        hash: "fd47d9eaea89d6a731bdd70b39b2bc54"
+        hash: "6b7c333ce19fede43aee84cc66c4c1bc"
     }
     Key {
         type: 6
@@ -274,15 +274,15 @@ VisualTest {
     }
     Frame {
         msec: 864
-        hash: "b643c026fe7570505e72971d3b3f0ea2"
+        hash: "a5386e9b39daa0a5aad8a8cd5191909b"
     }
     Frame {
         msec: 880
-        hash: "b643c026fe7570505e72971d3b3f0ea2"
+        hash: "a5386e9b39daa0a5aad8a8cd5191909b"
     }
     Frame {
         msec: 896
-        hash: "b643c026fe7570505e72971d3b3f0ea2"
+        hash: "a5386e9b39daa0a5aad8a8cd5191909b"
     }
     Key {
         type: 7
@@ -294,15 +294,15 @@ VisualTest {
     }
     Frame {
         msec: 912
-        hash: "b643c026fe7570505e72971d3b3f0ea2"
+        hash: "a5386e9b39daa0a5aad8a8cd5191909b"
     }
     Frame {
         msec: 928
-        hash: "b643c026fe7570505e72971d3b3f0ea2"
+        hash: "a5386e9b39daa0a5aad8a8cd5191909b"
     }
     Frame {
         msec: 944
-        hash: "b643c026fe7570505e72971d3b3f0ea2"
+        hash: "a5386e9b39daa0a5aad8a8cd5191909b"
     }
     Frame {
         msec: 960
@@ -310,7 +310,7 @@ VisualTest {
     }
     Frame {
         msec: 976
-        hash: "cba83dfcd44e4ba3ea44dd8d84bde745"
+        hash: "a5386e9b39daa0a5aad8a8cd5191909b"
     }
     Key {
         type: 6
@@ -322,19 +322,19 @@ VisualTest {
     }
     Frame {
         msec: 992
-        hash: "bca450bd2b1a46da72e0ba99a70c18ab"
+        hash: "f9149723166015ed066b794cf86b27d0"
     }
     Frame {
         msec: 1008
-        hash: "bca450bd2b1a46da72e0ba99a70c18ab"
+        hash: "f9149723166015ed066b794cf86b27d0"
     }
     Frame {
         msec: 1024
-        hash: "bca450bd2b1a46da72e0ba99a70c18ab"
+        hash: "f9149723166015ed066b794cf86b27d0"
     }
     Frame {
         msec: 1040
-        hash: "bca450bd2b1a46da72e0ba99a70c18ab"
+        hash: "f9149723166015ed066b794cf86b27d0"
     }
     Key {
         type: 7
@@ -346,51 +346,51 @@ VisualTest {
     }
     Frame {
         msec: 1056
-        hash: "bca450bd2b1a46da72e0ba99a70c18ab"
+        hash: "f9149723166015ed066b794cf86b27d0"
     }
     Frame {
         msec: 1072
-        hash: "bca450bd2b1a46da72e0ba99a70c18ab"
+        hash: "f9149723166015ed066b794cf86b27d0"
     }
     Frame {
         msec: 1088
-        hash: "bca450bd2b1a46da72e0ba99a70c18ab"
+        hash: "f9149723166015ed066b794cf86b27d0"
     }
     Frame {
         msec: 1104
-        hash: "bca450bd2b1a46da72e0ba99a70c18ab"
+        hash: "f9149723166015ed066b794cf86b27d0"
     }
     Frame {
         msec: 1120
-        hash: "bca450bd2b1a46da72e0ba99a70c18ab"
+        hash: "f9149723166015ed066b794cf86b27d0"
     }
     Frame {
         msec: 1136
-        hash: "bca450bd2b1a46da72e0ba99a70c18ab"
+        hash: "f9149723166015ed066b794cf86b27d0"
     }
     Frame {
         msec: 1152
-        hash: "bca450bd2b1a46da72e0ba99a70c18ab"
+        hash: "f9149723166015ed066b794cf86b27d0"
     }
     Frame {
         msec: 1168
-        hash: "bca450bd2b1a46da72e0ba99a70c18ab"
+        hash: "f9149723166015ed066b794cf86b27d0"
     }
     Frame {
         msec: 1184
-        hash: "bca450bd2b1a46da72e0ba99a70c18ab"
+        hash: "f9149723166015ed066b794cf86b27d0"
     }
     Frame {
         msec: 1200
-        hash: "bca450bd2b1a46da72e0ba99a70c18ab"
+        hash: "f9149723166015ed066b794cf86b27d0"
     }
     Frame {
         msec: 1216
-        hash: "bca450bd2b1a46da72e0ba99a70c18ab"
+        hash: "f9149723166015ed066b794cf86b27d0"
     }
     Frame {
         msec: 1232
-        hash: "bca450bd2b1a46da72e0ba99a70c18ab"
+        hash: "f9149723166015ed066b794cf86b27d0"
     }
     Key {
         type: 6
@@ -402,15 +402,15 @@ VisualTest {
     }
     Frame {
         msec: 1248
-        hash: "55c33f786e6dc14b038dba96cc154859"
+        hash: "56dd8557435509e5a96c2f2907d474eb"
     }
     Frame {
         msec: 1264
-        hash: "55c33f786e6dc14b038dba96cc154859"
+        hash: "56dd8557435509e5a96c2f2907d474eb"
     }
     Frame {
         msec: 1280
-        hash: "55c33f786e6dc14b038dba96cc154859"
+        hash: "56dd8557435509e5a96c2f2907d474eb"
     }
     Key {
         type: 7
@@ -422,15 +422,15 @@ VisualTest {
     }
     Frame {
         msec: 1296
-        hash: "55c33f786e6dc14b038dba96cc154859"
+        hash: "56dd8557435509e5a96c2f2907d474eb"
     }
     Frame {
         msec: 1312
-        hash: "55c33f786e6dc14b038dba96cc154859"
+        hash: "56dd8557435509e5a96c2f2907d474eb"
     }
     Frame {
         msec: 1328
-        hash: "55c33f786e6dc14b038dba96cc154859"
+        hash: "56dd8557435509e5a96c2f2907d474eb"
     }
     Key {
         type: 6
@@ -442,39 +442,39 @@ VisualTest {
     }
     Frame {
         msec: 1344
-        hash: "693d9e7579752a748d4c8d7fcbd3c022"
+        hash: "b311772a9bf92f4222b1c1c7ddbe96c4"
     }
     Frame {
         msec: 1360
-        hash: "693d9e7579752a748d4c8d7fcbd3c022"
+        hash: "b311772a9bf92f4222b1c1c7ddbe96c4"
     }
     Frame {
         msec: 1376
-        hash: "693d9e7579752a748d4c8d7fcbd3c022"
+        hash: "b311772a9bf92f4222b1c1c7ddbe96c4"
     }
     Frame {
         msec: 1392
-        hash: "693d9e7579752a748d4c8d7fcbd3c022"
+        hash: "b311772a9bf92f4222b1c1c7ddbe96c4"
     }
     Frame {
         msec: 1408
-        hash: "693d9e7579752a748d4c8d7fcbd3c022"
+        hash: "b311772a9bf92f4222b1c1c7ddbe96c4"
     }
     Frame {
         msec: 1424
-        hash: "693d9e7579752a748d4c8d7fcbd3c022"
+        hash: "b311772a9bf92f4222b1c1c7ddbe96c4"
     }
     Frame {
         msec: 1440
-        hash: "693d9e7579752a748d4c8d7fcbd3c022"
+        hash: "b311772a9bf92f4222b1c1c7ddbe96c4"
     }
     Frame {
         msec: 1456
-        hash: "693d9e7579752a748d4c8d7fcbd3c022"
+        hash: "b311772a9bf92f4222b1c1c7ddbe96c4"
     }
     Frame {
         msec: 1472
-        hash: "9be278fc6ebef108857a414ecb292b46"
+        hash: "b311772a9bf92f4222b1c1c7ddbe96c4"
     }
     Key {
         type: 7
@@ -486,7 +486,7 @@ VisualTest {
     }
     Frame {
         msec: 1488
-        hash: "9be278fc6ebef108857a414ecb292b46"
+        hash: "b311772a9bf92f4222b1c1c7ddbe96c4"
     }
     Key {
         type: 6
@@ -498,19 +498,19 @@ VisualTest {
     }
     Frame {
         msec: 1504
-        hash: "b1c799fd9f4ebf097ec79448eb9b4a2c"
+        hash: "8feb240ad13e1e9d8392bfeb484261db"
     }
     Frame {
         msec: 1520
-        hash: "b1c799fd9f4ebf097ec79448eb9b4a2c"
+        hash: "8feb240ad13e1e9d8392bfeb484261db"
     }
     Frame {
         msec: 1536
-        hash: "b1c799fd9f4ebf097ec79448eb9b4a2c"
+        hash: "8feb240ad13e1e9d8392bfeb484261db"
     }
     Frame {
         msec: 1552
-        hash: "b1c799fd9f4ebf097ec79448eb9b4a2c"
+        hash: "8feb240ad13e1e9d8392bfeb484261db"
     }
     Key {
         type: 7
@@ -522,27 +522,27 @@ VisualTest {
     }
     Frame {
         msec: 1568
-        hash: "b1c799fd9f4ebf097ec79448eb9b4a2c"
+        hash: "8feb240ad13e1e9d8392bfeb484261db"
     }
     Frame {
         msec: 1584
-        hash: "b1c799fd9f4ebf097ec79448eb9b4a2c"
+        hash: "8feb240ad13e1e9d8392bfeb484261db"
     }
     Frame {
         msec: 1600
-        hash: "b1c799fd9f4ebf097ec79448eb9b4a2c"
+        hash: "8feb240ad13e1e9d8392bfeb484261db"
     }
     Frame {
         msec: 1616
-        hash: "b1c799fd9f4ebf097ec79448eb9b4a2c"
+        hash: "8feb240ad13e1e9d8392bfeb484261db"
     }
     Frame {
         msec: 1632
-        hash: "b1c799fd9f4ebf097ec79448eb9b4a2c"
+        hash: "8feb240ad13e1e9d8392bfeb484261db"
     }
     Frame {
         msec: 1648
-        hash: "b1c799fd9f4ebf097ec79448eb9b4a2c"
+        hash: "8feb240ad13e1e9d8392bfeb484261db"
     }
     Key {
         type: 6
@@ -554,23 +554,23 @@ VisualTest {
     }
     Frame {
         msec: 1664
-        hash: "46e977b7614ae6316a64106f6e5326c1"
+        hash: "cd240ccffd4b4a6304b47cfd1e55cf49"
     }
     Frame {
         msec: 1680
-        hash: "46e977b7614ae6316a64106f6e5326c1"
+        hash: "cd240ccffd4b4a6304b47cfd1e55cf49"
     }
     Frame {
         msec: 1696
-        hash: "46e977b7614ae6316a64106f6e5326c1"
+        hash: "cd240ccffd4b4a6304b47cfd1e55cf49"
     }
     Frame {
         msec: 1712
-        hash: "46e977b7614ae6316a64106f6e5326c1"
+        hash: "cd240ccffd4b4a6304b47cfd1e55cf49"
     }
     Frame {
         msec: 1728
-        hash: "46e977b7614ae6316a64106f6e5326c1"
+        hash: "cd240ccffd4b4a6304b47cfd1e55cf49"
     }
     Key {
         type: 6
@@ -582,7 +582,7 @@ VisualTest {
     }
     Frame {
         msec: 1744
-        hash: "2d7771008d9ec265f70d089bb8436e18"
+        hash: "437370a412fccbeee3d1f095e32c3584"
     }
     Key {
         type: 7
@@ -594,15 +594,15 @@ VisualTest {
     }
     Frame {
         msec: 1760
-        hash: "2d7771008d9ec265f70d089bb8436e18"
+        hash: "437370a412fccbeee3d1f095e32c3584"
     }
     Frame {
         msec: 1776
-        hash: "2d7771008d9ec265f70d089bb8436e18"
+        hash: "437370a412fccbeee3d1f095e32c3584"
     }
     Frame {
         msec: 1792
-        hash: "2d7771008d9ec265f70d089bb8436e18"
+        hash: "437370a412fccbeee3d1f095e32c3584"
     }
     Key {
         type: 7
@@ -614,19 +614,19 @@ VisualTest {
     }
     Frame {
         msec: 1808
-        hash: "2d7771008d9ec265f70d089bb8436e18"
+        hash: "437370a412fccbeee3d1f095e32c3584"
     }
     Frame {
         msec: 1824
-        hash: "2d7771008d9ec265f70d089bb8436e18"
+        hash: "437370a412fccbeee3d1f095e32c3584"
     }
     Frame {
         msec: 1840
-        hash: "2d7771008d9ec265f70d089bb8436e18"
+        hash: "437370a412fccbeee3d1f095e32c3584"
     }
     Frame {
         msec: 1856
-        hash: "2d7771008d9ec265f70d089bb8436e18"
+        hash: "437370a412fccbeee3d1f095e32c3584"
     }
     Key {
         type: 6
@@ -638,15 +638,15 @@ VisualTest {
     }
     Frame {
         msec: 1872
-        hash: "7d85b2d311514db5988e335110fb8352"
+        hash: "eb4a45722e365b103ff5423117236fd3"
     }
     Frame {
         msec: 1888
-        hash: "7d85b2d311514db5988e335110fb8352"
+        hash: "eb4a45722e365b103ff5423117236fd3"
     }
     Frame {
         msec: 1904
-        hash: "7d85b2d311514db5988e335110fb8352"
+        hash: "eb4a45722e365b103ff5423117236fd3"
     }
     Frame {
         msec: 1920
@@ -662,27 +662,27 @@ VisualTest {
     }
     Frame {
         msec: 1936
-        hash: "7d85b2d311514db5988e335110fb8352"
+        hash: "eb4a45722e365b103ff5423117236fd3"
     }
     Frame {
         msec: 1952
-        hash: "7d85b2d311514db5988e335110fb8352"
+        hash: "eb4a45722e365b103ff5423117236fd3"
     }
     Frame {
         msec: 1968
-        hash: "7d85b2d311514db5988e335110fb8352"
+        hash: "eb4a45722e365b103ff5423117236fd3"
     }
     Frame {
         msec: 1984
-        hash: "9f4258905e76a6523e015701c3278cae"
+        hash: "eb4a45722e365b103ff5423117236fd3"
     }
     Frame {
         msec: 2000
-        hash: "9f4258905e76a6523e015701c3278cae"
+        hash: "eb4a45722e365b103ff5423117236fd3"
     }
     Frame {
         msec: 2016
-        hash: "9f4258905e76a6523e015701c3278cae"
+        hash: "eb4a45722e365b103ff5423117236fd3"
     }
     Key {
         type: 6
@@ -694,11 +694,11 @@ VisualTest {
     }
     Frame {
         msec: 2032
-        hash: "8a2cf6f27a40da75be9d9bcf88b4c022"
+        hash: "b53d0651627d008545e54063ceb8d689"
     }
     Frame {
         msec: 2048
-        hash: "8a2cf6f27a40da75be9d9bcf88b4c022"
+        hash: "b53d0651627d008545e54063ceb8d689"
     }
     Key {
         type: 7
@@ -710,11 +710,11 @@ VisualTest {
     }
     Frame {
         msec: 2064
-        hash: "8a2cf6f27a40da75be9d9bcf88b4c022"
+        hash: "b53d0651627d008545e54063ceb8d689"
     }
     Frame {
         msec: 2080
-        hash: "8a2cf6f27a40da75be9d9bcf88b4c022"
+        hash: "b53d0651627d008545e54063ceb8d689"
     }
     Key {
         type: 6
@@ -726,19 +726,19 @@ VisualTest {
     }
     Frame {
         msec: 2096
-        hash: "6c679da9b822fefef626c4308fdc9080"
+        hash: "173b36137940b37001750e02d434b8e8"
     }
     Frame {
         msec: 2112
-        hash: "6c679da9b822fefef626c4308fdc9080"
+        hash: "173b36137940b37001750e02d434b8e8"
     }
     Frame {
         msec: 2128
-        hash: "6c679da9b822fefef626c4308fdc9080"
+        hash: "173b36137940b37001750e02d434b8e8"
     }
     Frame {
         msec: 2144
-        hash: "6c679da9b822fefef626c4308fdc9080"
+        hash: "173b36137940b37001750e02d434b8e8"
     }
     Key {
         type: 6
@@ -758,19 +758,19 @@ VisualTest {
     }
     Frame {
         msec: 2160
-        hash: "81399b2d1ffa0a097f9d0eea0ccf26a5"
+        hash: "2e636a964b4a1ab74ad3e23399c2ae8c"
     }
     Frame {
         msec: 2176
-        hash: "81399b2d1ffa0a097f9d0eea0ccf26a5"
+        hash: "2e636a964b4a1ab74ad3e23399c2ae8c"
     }
     Frame {
         msec: 2192
-        hash: "81399b2d1ffa0a097f9d0eea0ccf26a5"
+        hash: "2e636a964b4a1ab74ad3e23399c2ae8c"
     }
     Frame {
         msec: 2208
-        hash: "81399b2d1ffa0a097f9d0eea0ccf26a5"
+        hash: "2e636a964b4a1ab74ad3e23399c2ae8c"
     }
     Key {
         type: 6
@@ -782,7 +782,7 @@ VisualTest {
     }
     Frame {
         msec: 2224
-        hash: "aebfaf936f9c4e0f856a2a2d1b2014ee"
+        hash: "631c6034372c2e7675ebce0ec415f230"
     }
     Key {
         type: 7
@@ -794,23 +794,23 @@ VisualTest {
     }
     Frame {
         msec: 2240
-        hash: "aebfaf936f9c4e0f856a2a2d1b2014ee"
+        hash: "631c6034372c2e7675ebce0ec415f230"
     }
     Frame {
         msec: 2256
-        hash: "aebfaf936f9c4e0f856a2a2d1b2014ee"
+        hash: "631c6034372c2e7675ebce0ec415f230"
     }
     Frame {
         msec: 2272
-        hash: "aebfaf936f9c4e0f856a2a2d1b2014ee"
+        hash: "631c6034372c2e7675ebce0ec415f230"
     }
     Frame {
         msec: 2288
-        hash: "aebfaf936f9c4e0f856a2a2d1b2014ee"
+        hash: "631c6034372c2e7675ebce0ec415f230"
     }
     Frame {
         msec: 2304
-        hash: "aebfaf936f9c4e0f856a2a2d1b2014ee"
+        hash: "631c6034372c2e7675ebce0ec415f230"
     }
     Key {
         type: 7
@@ -822,11 +822,11 @@ VisualTest {
     }
     Frame {
         msec: 2320
-        hash: "aebfaf936f9c4e0f856a2a2d1b2014ee"
+        hash: "631c6034372c2e7675ebce0ec415f230"
     }
     Frame {
         msec: 2336
-        hash: "aebfaf936f9c4e0f856a2a2d1b2014ee"
+        hash: "631c6034372c2e7675ebce0ec415f230"
     }
     Key {
         type: 6
@@ -838,27 +838,27 @@ VisualTest {
     }
     Frame {
         msec: 2352
-        hash: "1e9d2117d8392ea494d28f95ddb57213"
+        hash: "ea5c3cdde73009e1bd46e71e4cc3bf0f"
     }
     Frame {
         msec: 2368
-        hash: "1e9d2117d8392ea494d28f95ddb57213"
+        hash: "ea5c3cdde73009e1bd46e71e4cc3bf0f"
     }
     Frame {
         msec: 2384
-        hash: "1e9d2117d8392ea494d28f95ddb57213"
+        hash: "ea5c3cdde73009e1bd46e71e4cc3bf0f"
     }
     Frame {
         msec: 2400
-        hash: "1e9d2117d8392ea494d28f95ddb57213"
+        hash: "ea5c3cdde73009e1bd46e71e4cc3bf0f"
     }
     Frame {
         msec: 2416
-        hash: "1e9d2117d8392ea494d28f95ddb57213"
+        hash: "ea5c3cdde73009e1bd46e71e4cc3bf0f"
     }
     Frame {
         msec: 2432
-        hash: "1e9d2117d8392ea494d28f95ddb57213"
+        hash: "ea5c3cdde73009e1bd46e71e4cc3bf0f"
     }
     Key {
         type: 7
@@ -870,19 +870,19 @@ VisualTest {
     }
     Frame {
         msec: 2448
-        hash: "1e9d2117d8392ea494d28f95ddb57213"
+        hash: "ea5c3cdde73009e1bd46e71e4cc3bf0f"
     }
     Frame {
         msec: 2464
-        hash: "1e9d2117d8392ea494d28f95ddb57213"
+        hash: "ea5c3cdde73009e1bd46e71e4cc3bf0f"
     }
     Frame {
         msec: 2480
-        hash: "a016e70b0f98846694ef3ae906faa346"
+        hash: "ea5c3cdde73009e1bd46e71e4cc3bf0f"
     }
     Frame {
         msec: 2496
-        hash: "a016e70b0f98846694ef3ae906faa346"
+        hash: "ea5c3cdde73009e1bd46e71e4cc3bf0f"
     }
     Key {
         type: 6
@@ -894,15 +894,15 @@ VisualTest {
     }
     Frame {
         msec: 2512
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2528
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2544
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Key {
         type: 7
@@ -914,83 +914,83 @@ VisualTest {
     }
     Frame {
         msec: 2560
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2576
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2592
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2608
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2624
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2640
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2656
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2672
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2688
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2704
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2720
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2736
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2752
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2768
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2784
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2800
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2816
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2832
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2848
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2864
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2880
@@ -998,46 +998,46 @@ VisualTest {
     }
     Frame {
         msec: 2896
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2912
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2928
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2944
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2960
-        hash: "818ad2e56a73599ae69ce5000d5b278f"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2976
-        hash: "147568112e60545f440f2109f918a59e"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 2992
-        hash: "147568112e60545f440f2109f918a59e"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 3008
-        hash: "147568112e60545f440f2109f918a59e"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 3024
-        hash: "147568112e60545f440f2109f918a59e"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 3040
-        hash: "147568112e60545f440f2109f918a59e"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
     Frame {
         msec: 3056
-        hash: "147568112e60545f440f2109f918a59e"
+        hash: "91ef7f08d8fec2e0d353b1bf5da99c41"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/hAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/hAlign.qml
index fb56da6..4c402ea 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/hAlign.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/hAlign.qml
@@ -6,102 +6,102 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 32
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 48
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 64
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 80
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 96
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 112
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 128
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 144
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 160
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 176
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 192
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 208
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 224
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 240
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 256
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 272
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 288
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 304
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 320
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 336
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 352
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 368
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 384
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
     Frame {
         msec: 400
-        hash: "15c91702a80de73ac1abc3db9fa8ca09"
+        hash: "840c5f54c105f90c7b0c2254fee2e434"
     }
 }
-- 
cgit v0.12


From 7f8250ddb43275d59c6f9947eebc8e66642ea5f9 Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Fri, 5 Nov 2010 09:32:19 +1000
Subject: Whitespace fixes

Supposed to be in the last commit - not really helpful if the filter
says something is wrong but pushes it anyways.
---
 .../qmlvisual/qdeclarativetextinput/hAlign.qml     | 24 +++++++++++-----------
 .../declarative/qmlvisual/shared/TestTextEdit.qml  |  2 +-
 .../declarative/qmlvisual/shared/TestTextInput.qml |  2 +-
 3 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/hAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/hAlign.qml
index ad8db33..f36a752 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/hAlign.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/hAlign.qml
@@ -6,35 +6,35 @@ Item{
     height:300;
     Column {
         //Because they have auto width, these three should look the same
-        TestTextInput { 
-            text: "Jackdaws love my big sphinx of quartz"; 
+        TestTextInput {
+            text: "Jackdaws love my big sphinx of quartz";
             horizontalAlignment: TextInput.AlignLeft;
         }
-        TestTextInput { 
-            text: "Jackdaws love my big sphinx of quartz"; 
+        TestTextInput {
+            text: "Jackdaws love my big sphinx of quartz";
             horizontalAlignment: TextInput.AlignHCenter;
         }
-        TestTextInput { 
-            text: "Jackdaws love my big sphinx of quartz"; 
+        TestTextInput {
+            text: "Jackdaws love my big sphinx of quartz";
             horizontalAlignment: TextInput.AlignRight;
         }
         Rectangle{ width: 600; height: 10; color: "pink" }
-        TestTextInput { 
+        TestTextInput {
             height: 30;
             width: 600;
-            text: "Jackdaws love my big sphinx of quartz"; 
+            text: "Jackdaws love my big sphinx of quartz";
             horizontalAlignment: TextInput.AlignLeft;
         }
-        TestTextInput { 
+        TestTextInput {
             height: 30;
             width: 600;
-            text: "Jackdaws love my big sphinx of quartz"; 
+            text: "Jackdaws love my big sphinx of quartz";
             horizontalAlignment: TextInput.AlignHCenter;
         }
-        TestTextInput { 
+        TestTextInput {
             height: 30;
             width: 600;
-            text: "Jackdaws love my big sphinx of quartz"; 
+            text: "Jackdaws love my big sphinx of quartz";
             horizontalAlignment: TextInput.AlignRight;
         }
     }
diff --git a/tests/auto/declarative/qmlvisual/shared/TestTextEdit.qml b/tests/auto/declarative/qmlvisual/shared/TestTextEdit.qml
index fb35ae3..e19e418 100644
--- a/tests/auto/declarative/qmlvisual/shared/TestTextEdit.qml
+++ b/tests/auto/declarative/qmlvisual/shared/TestTextEdit.qml
@@ -7,7 +7,7 @@ TextEdit {
     font.family: fixedFont.name
     font.pixelSize: 12
     cursorDelegate: Rectangle {
-            width: 1; 
+            width: 1;
             color: "black";
             visible: edit.cursorVisible
     }
diff --git a/tests/auto/declarative/qmlvisual/shared/TestTextInput.qml b/tests/auto/declarative/qmlvisual/shared/TestTextInput.qml
index 8593218..e01c2c2 100644
--- a/tests/auto/declarative/qmlvisual/shared/TestTextInput.qml
+++ b/tests/auto/declarative/qmlvisual/shared/TestTextInput.qml
@@ -7,7 +7,7 @@ TextInput {
     font.family: fixedFont.name
     font.pixelSize: 12
     cursorDelegate: Rectangle {
-            width: 1; 
+            width: 1;
             color: "black";
             visible: parent.cursorVisible//bug that 'inp' doesn't seem to work?
     }
-- 
cgit v0.12


From f49aa13a1bb59eaebdb958305f479dc6e7c8e857 Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Fri, 5 Nov 2010 11:19:05 +1000
Subject: Fix samegame text input focus

The real problem is QTBUG-15047, but by implementing SameGame in a
different way it gets worked around very nicely.

Task-number: QTBUG-14716
---
 demos/declarative/samegame/samegame.qml | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/demos/declarative/samegame/samegame.qml b/demos/declarative/samegame/samegame.qml
index b66c5a6..ab49c04 100644
--- a/demos/declarative/samegame/samegame.qml
+++ b/demos/declarative/samegame/samegame.qml
@@ -92,9 +92,7 @@ Rectangle {
             enabled: nameInputDialog.initialWidth != 0
         }
 
-        onOpened: nameInputText.focus = true;
         onClosed: {
-            nameInputText.focus = false;
             if (nameInputText.text != "")
                 Logic.saveHighScore(nameInputText.text);
         }
@@ -116,7 +114,7 @@ Rectangle {
         TextInput {
             id: nameInputText
             anchors { verticalCenter: parent.verticalCenter; left: dialogText.right }
-            focus: false
+            focus: visible
             autoScroll: false
             maximumLength: 24
             onTextChanged: {
-- 
cgit v0.12


From ecd81dcc33e2a7ccff851e9437f73d4d54ef3dab Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Fri, 5 Nov 2010 11:38:18 +1000
Subject: Remove Snake demo from QtDemo

Snake now uses the runtime property, which we don't have in QtDemo.

Task-number: QTBUG-15048
---
 demos/qtdemo/xml/examples.xml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/demos/qtdemo/xml/examples.xml b/demos/qtdemo/xml/examples.xml
index 27f72bb..b94d2b8 100644
--- a/demos/qtdemo/xml/examples.xml
+++ b/demos/qtdemo/xml/examples.xml
@@ -19,7 +19,6 @@
     <example filename="sub-attaq" name="Sub-attaq" />
     <example filename="spectrum" name="Spectrum Analyzer" />
     <example filename="declarative/minehunt" name="Minehunt"/>
-    <example filename="declarative/snake" name="Snake" executable="false" qml="true"/>
     <example filename="deform" name="Vector Deformation" />
     <example filename="books" name="Books" />
     <example filename="mainwindow" name="Main Window" />
-- 
cgit v0.12


From 3e30165c350b877bda74955446b0790d516c0490 Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Fri, 5 Nov 2010 13:34:34 +1000
Subject: Don't allow flagging of flipped tiles in Minehunt

Task-number: QTBUG-4249
---
 demos/declarative/minehunt/minehunt.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/demos/declarative/minehunt/minehunt.cpp b/demos/declarative/minehunt/minehunt.cpp
index 709d945..aaaaaac 100644
--- a/demos/declarative/minehunt/minehunt.cpp
+++ b/demos/declarative/minehunt/minehunt.cpp
@@ -211,7 +211,7 @@ bool MinehuntGame::flip(int row, int col)
 bool MinehuntGame::flag(int row, int col)
 {
     TileData *t = tile(row, col);
-    if(!t || !playing)
+    if(!t || !playing || t->flipped())
         return false;
 
     t->setHasFlag(!t->hasFlag());
-- 
cgit v0.12


From b74024c0d80b7bb3adf0ceca4b307695bc6db6a1 Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Fri, 5 Nov 2010 13:47:01 +1000
Subject: Fix minehunt.pro (minehunt is no longer a plugin)

Task-number: QTBUG-15011
Reviewed-by: Martin Jones
---
 demos/declarative/minehunt/minehunt.pro | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/demos/declarative/minehunt/minehunt.pro b/demos/declarative/minehunt/minehunt.pro
index 753ca4e..8a7fdc5 100644
--- a/demos/declarative/minehunt/minehunt.pro
+++ b/demos/declarative/minehunt/minehunt.pro
@@ -1,7 +1,6 @@
 TEMPLATE = app
 TARGET  = minehunt
 QT += declarative
-CONFIG += qt plugin
 
 # Input
 HEADERS += minehunt.h
@@ -21,4 +20,4 @@ symbian:{
     qmlminehuntfiles.sources = MinehuntCore minehunt.qml
     DEPLOYMENT = qmlminehuntfiles
 }
- 
\ No newline at end of file
+ 
-- 
cgit v0.12


From c32ec4e928895a85aa10ce47a73c2bd439e7fc89 Mon Sep 17 00:00:00 2001
From: Charles Yin <charles.yin@nokia.com>
Date: Thu, 4 Nov 2010 12:30:46 +1000
Subject: More fix for QTBUG-14640:oci performance problem with qlonglong

1. OCINumber must be declared & initialized seperately, and the bound OCINumber
   values must be hold until the QOCIResultPrivate object is deleted.
2. More auto tests for this bug.
3. Add qulonglong support as well
4. Make the execBatch() works with longlong and ulonglong

Task-number:QTBUG-14640
Reviewed-by: Michael Goddard

Change-Id: I7d8bf1c44ce3aaa15ee85be325a5c98dc3ed3ce1
---
 src/sql/drivers/oci/qsql_oci.cpp        | 133 ++++++++++++++++++++++++++++++--
 tests/auto/qsqldatabase/tst_databases.h |   2 +-
 tests/auto/qsqlquery/tst_qsqlquery.cpp  | 121 ++++++++++++++++++++++++-----
 3 files changed, 227 insertions(+), 29 deletions(-)

diff --git a/src/sql/drivers/oci/qsql_oci.cpp b/src/sql/drivers/oci/qsql_oci.cpp
index 2392a17..1bf59bf 100644
--- a/src/sql/drivers/oci/qsql_oci.cpp
+++ b/src/sql/drivers/oci/qsql_oci.cpp
@@ -112,7 +112,15 @@ typedef QVarLengthArray<ub2, 32> SizeArray;
 
 static QByteArray qMakeOraDate(const QDateTime& dt);
 static QDateTime qMakeDate(const char* oraDate);
+
+static QByteArray qMakeOCINumber(const qlonglong &ll, OCIError *err);
+static QByteArray qMakeOCINumber(const qulonglong& ull, OCIError* err);
+
+static qlonglong qMakeLongLong(const char* ociNumber, OCIError* err);
+static qulonglong qMakeULongLong(const char* ociNumber, OCIError* err);
+
 static QString qOraWarn(OCIError *err, int *errorCode = 0);
+
 #ifndef Q_CC_SUN
 static // for some reason, Sun CC can't use qOraWarning when it's declared static
 #endif
@@ -292,13 +300,27 @@ int QOCIResultPrivate::bindValue(OCIStmt *sql, OCIBind **hbnd, OCIError *err, in
                          SQLT_UIN, indPtr, 0, 0, 0, 0, OCI_DEFAULT);
         break;
     case QVariant::LongLong:
+    {
+        QByteArray ba = qMakeOCINumber(val.toLongLong(), err);
         r = OCIBindByPos(sql, hbnd, err,
                            pos + 1,
-                           // if it's an out value, the data is already detached
-                           // so the const cast is safe.
-                           const_cast<void *>(data),
-                           sizeof(OCINumber),
+                           ba.data(),
+                           ba.size(),
                            SQLT_VNU, indPtr, 0, 0, 0, 0, OCI_DEFAULT);
+        tmpStorage.append(ba);
+        break;
+    }
+    case QVariant::ULongLong:
+    {
+        QByteArray ba = qMakeOCINumber(val.toULongLong(), err);
+        r = OCIBindByPos(sql, hbnd, err,
+                           pos + 1,
+                           ba.data(),
+                           ba.size(),
+                           SQLT_VNU, indPtr, 0, 0, 0, 0, OCI_DEFAULT);
+        tmpStorage.append(ba);
+        break;
+    }
     case QVariant::Double:
         r = OCIBindByPos(sql, hbnd, err,
                          pos + 1,
@@ -394,7 +416,7 @@ int QOCIResultPrivate::bindValues(QVector<QVariant> &values, IndicatorArray &ind
 }
 
 // will assign out value and remove its temp storage.
-static void qOraOutValue(QVariant &value, QList<QByteArray> &storage)
+static void qOraOutValue(QVariant &value, QList<QByteArray> &storage, OCIError* err)
 {
     switch (value.type()) {
     case QVariant::Time:
@@ -406,6 +428,12 @@ static void qOraOutValue(QVariant &value, QList<QByteArray> &storage)
     case QVariant::DateTime:
         value = qMakeDate(storage.takeFirst());
         break;
+    case QVariant::LongLong:
+        value = qMakeLongLong(storage.takeFirst(), err);
+        break;
+    case QVariant::ULongLong:
+        value = qMakeULongLong(storage.takeFirst(), err);
+        break;
     case QVariant::String:
         value = QString(
                 reinterpret_cast<const QChar *>(storage.takeFirst().constData()));
@@ -423,7 +451,7 @@ void QOCIResultPrivate::outValues(QVector<QVariant> &values, IndicatorArray &ind
         if (!isOutValue(i))
             continue;
 
-        qOraOutValue(values[i], tmpStorage);
+        qOraOutValue(values[i], tmpStorage, err);
 
         QVariant::Type typ = values.at(i).type();
         if (indicators[i] == -1) // NULL
@@ -683,6 +711,56 @@ QByteArray qMakeOraDate(const QDateTime& dt)
     return ba;
 }
 
+/*!
+  \internal
+
+   Convert qlonglong to the internal Oracle OCINumber format.
+  */
+QByteArray qMakeOCINumber(const qlonglong& ll, OCIError* err)
+{
+    QByteArray ba(sizeof(OCINumber), 0);
+
+    OCINumberFromInt(err,
+                     &ll,
+                     sizeof(qlonglong),
+                     OCI_NUMBER_SIGNED,
+                     reinterpret_cast<OCINumber*>(ba.data()));
+    return ba;
+}
+
+/*!
+  \internal
+
+   Convert qulonglong to the internal Oracle OCINumber format.
+  */
+QByteArray qMakeOCINumber(const qulonglong& ull, OCIError* err)
+{
+    QByteArray ba(sizeof(OCINumber), 0);
+
+    OCINumberFromInt(err,
+                     &ull,
+                     sizeof(qlonglong),
+                     OCI_NUMBER_UNSIGNED,
+                     reinterpret_cast<OCINumber*>(ba.data()));
+    return ba;
+}
+
+qlonglong qMakeLongLong(const char* ociNumber, OCIError* err)
+{
+    qlonglong qll = 0;
+    OCINumberToInt(err, reinterpret_cast<const OCINumber *>(ociNumber), sizeof(qlonglong),
+                   OCI_NUMBER_SIGNED, &qll);
+    return qll;
+}
+
+qulonglong qMakeULongLong(const char* ociNumber, OCIError* err)
+{
+    qulonglong qull = 0;
+    OCINumberToInt(err, reinterpret_cast<const OCINumber *>(ociNumber), sizeof(qulonglong),
+                   OCI_NUMBER_UNSIGNED, &qull);
+    return qull;
+}
+
 QDateTime qMakeDate(const char* oraDate)
 {
     int century = uchar(oraDate[0]);
@@ -1267,6 +1345,16 @@ bool QOCICols::execBatch(QOCIResultPrivate *d, QVector<QVariant> &boundValues, b
                 col.maxLen = sizeof(uint);
                 break;
 
+            case QVariant::LongLong:
+                col.bindAs = SQLT_VNU;
+                col.maxLen = sizeof(OCINumber);
+                break;
+
+            case QVariant::ULongLong:
+                col.bindAs = SQLT_VNU;
+                col.maxLen = sizeof(OCINumber);
+                break;
+
             case QVariant::Double:
                 col.bindAs = SQLT_FLT;
                 col.maxLen = sizeof(double);
@@ -1338,6 +1426,22 @@ bool QOCICols::execBatch(QOCIResultPrivate *d, QVector<QVariant> &boundValues, b
                         *reinterpret_cast<uint*>(dataPtr) = val.toUInt();
                         break;
 
+                    case QVariant::LongLong:
+                    {
+                        columns[i].lengths[row] = columns[i].maxLen;
+                        const QByteArray ba = qMakeOCINumber(val.toLongLong(), d->err);
+                        Q_ASSERT(ba.size() == int(columns[i].maxLen));
+                        memcpy(dataPtr, ba.constData(), columns[i].maxLen);
+                        break;
+                    }
+                    case QVariant::ULongLong:
+                    {
+                        columns[i].lengths[row] = columns[i].maxLen;
+                        const QByteArray ba = qMakeOCINumber(val.toULongLong(), d->err);
+                        Q_ASSERT(ba.size() == int(columns[i].maxLen));
+                        memcpy(dataPtr, ba.constData(), columns[i].maxLen);
+                        break;
+                    }
                     case QVariant::Double:
                          columns[i].lengths[row] = columns[i].maxLen;
                          *reinterpret_cast<double*>(dataPtr) = val.toDouble();
@@ -1445,7 +1549,7 @@ bool QOCICols::execBatch(QOCIResultPrivate *d, QVector<QVariant> &boundValues, b
 
         QVariant::Type tp = boundValues.at(i).type();
         if (tp != QVariant::List) {
-            qOraOutValue(boundValues[i], tmpStorage);
+            qOraOutValue(boundValues[i], tmpStorage, d->err);
             if (*columns[i].indicators == -1)
                 boundValues[i] = QVariant(tp);
             continue;
@@ -1475,6 +1579,21 @@ bool QOCICols::execBatch(QOCIResultPrivate *d, QVector<QVariant> &boundValues, b
                     (*list)[r] =  *reinterpret_cast<uint*>(data + r * columns[i].maxLen);
                     break;
 
+                case SQLT_VNU:
+                {
+                    switch (boundValues.at(i).type()) {
+                    case QVariant::LongLong:
+                        (*list)[r] =  qMakeLongLong(data + r * columns[i].maxLen, d->err);
+                        break;
+                    case QVariant::ULongLong:
+                        (*list)[r] =  qMakeULongLong(data + r * columns[i].maxLen, d->err);
+                        break;
+                    default:
+                        break;
+                    }
+                    break;
+                }
+
                 case SQLT_FLT:
                     (*list)[r] =  *reinterpret_cast<double*>(data + r * columns[i].maxLen);
                     break;
diff --git a/tests/auto/qsqldatabase/tst_databases.h b/tests/auto/qsqldatabase/tst_databases.h
index 5837719..80535df 100644
--- a/tests/auto/qsqldatabase/tst_databases.h
+++ b/tests/auto/qsqldatabase/tst_databases.h
@@ -208,7 +208,7 @@ public:
 //         addDb( "QOCI8", "//horsehead.nokia.troll.no:1521/ustest.troll.no", "scott", "tiger", "" ); // Oracle 9i on horsehead
 //         addDb( "QOCI8", "//iceblink.nokia.troll.no:1521/ice.troll.no", "scott", "tiger", "" ); // Oracle 8 on iceblink (not currently working)
 //         addDb( "QOCI", "//silence.nokia.troll.no:1521/testdb", "scott", "tiger" ); // Oracle 10g on silence
-//         addDb( "QOCI", "//oracle10g-nokia.trolltech.com.au:1521/XE", "scott", "tiger" ); // Oracle 10gexpress on xen
+//         addDb( "QOCI", "//bq-oracle10g.apac.nokia.com:1521/XE", "scott", "tiger" ); // Oracle 10gexpress
 
 //      This requires a local ODBC data source to be configured( pointing to a MySql database )
 //         addDb( "QODBC", "mysqlodbc", "troll", "trond" );
diff --git a/tests/auto/qsqlquery/tst_qsqlquery.cpp b/tests/auto/qsqlquery/tst_qsqlquery.cpp
index 5367bd6..b4a3e08 100644
--- a/tests/auto/qsqlquery/tst_qsqlquery.cpp
+++ b/tests/auto/qsqlquery/tst_qsqlquery.cpp
@@ -139,6 +139,8 @@ private slots:
     void oraClob();
     void oraLong_data() { generic_data("QOCI"); }
     void oraLong();
+    void oraOCINumber_data() { generic_data("QOCI"); }
+    void oraOCINumber();
     void outValuesDB2_data() { generic_data("QDB2"); }
     void outValuesDB2();
     void storedProceduresIBase_data() {generic_data("QIBASE"); }
@@ -211,8 +213,7 @@ private slots:
     void QTBUG_5765();
     void QTBUG_14132_data() { generic_data("QOCI"); }
     void QTBUG_14132();
-    void QTBUG_14640_data() { generic_data("QOCI"); }
-    void QTBUG_14640();
+
     void sqlite_constraint_data() { generic_data("QSQLITE"); }
     void sqlite_constraint();
 
@@ -332,7 +333,7 @@ void tst_QSqlQuery::dropTestTables( QSqlDatabase db )
                << qTableName( "task_250026", __FILE__ )
                << qTableName( "task_234422", __FILE__ )
                << qTableName("test141895", __FILE__)
-               << qTableName("qtest_QTBUG14640", __FILE__);
+               << qTableName("qtest_oraOCINumber", __FILE__);
 
     if ( db.driverName().startsWith("QPSQL") )
         tablenames << qTableName("task_233829", __FILE__);
@@ -2950,11 +2951,11 @@ void tst_QSqlQuery::QTBUG_14132()
                         begin \n\
                         outStr := 'OUTSTRING'; \n\
                         end;"));
-    QString outValue = "XXXXXXXXX";
-    q.prepare("CALL "+procedureName+"(?)");
-    q.addBindValue(outValue, QSql::Out);
+    QString placeholder = "XXXXXXXXX";
+    QVERIFY(q.prepare("CALL "+procedureName+"(?)"));
+    q.addBindValue(placeholder, QSql::Out);
     QVERIFY_SQL(q, exec());
-    QCOMPARE(outValue, QLatin1String("OUTSTRING"));
+    QCOMPARE(q.boundValue(0).toString(), QLatin1String("OUTSTRING"));
 }
 
 void tst_QSqlQuery::QTBUG_5251()
@@ -3104,30 +3105,108 @@ void tst_QSqlQuery::QTBUG_5765()
     QCOMPARE(q.value(0).toInt(), 123);
 }
 
-void tst_QSqlQuery::QTBUG_14640()
+void tst_QSqlQuery::oraOCINumber()
 {
     QFETCH( QString, dbName );
     QSqlDatabase db = QSqlDatabase::database( dbName );
     CHECK_DATABASE( db );
-    const QString qtest_QTBUG14640(qTableName("qtest_QTBUG14640", __FILE__));
+    const QString qtest_oraOCINumber(qTableName("qtest_oraOCINumber", __FILE__));
 
     QSqlQuery q( db );
     q.setForwardOnly( true );
-    QVERIFY_SQL( q, exec( "create table " + qtest_QTBUG14640 +
-                            " (col1 number, col2 number)" ) );
-    QVERIFY_SQL( q, exec( "insert into " + qtest_QTBUG14640 + " values (1, 1111)" ) );
-    QVERIFY_SQL( q, exec( "insert into " + qtest_QTBUG14640 + " values (2, 2222)" ) );
-    QVERIFY_SQL( q, exec( "insert into " + qtest_QTBUG14640 + " values (3, 3333)" ) );
-
-    QString sqlStr = "select * from " + qtest_QTBUG14640 +  " where col1 == :bindValue0 AND col2 == :bindValue1";
-    q.prepare(sqlStr);
-    q.bindValue(":bindValue0", qlonglong(1), QSql::In);
-    q.bindValue(":bindValue1", qlonglong(1111), QSql::In);
+    QVERIFY_SQL( q, exec( "create table " + qtest_oraOCINumber +
+                            " (col1 number(20), col2 number(20))" ) );
+    QVERIFY(q.prepare("insert into " + qtest_oraOCINumber + " values (?, ?)"));
+    QVariantList col1Values;
+    QVariantList col2Values;
+    col1Values << (qulonglong)(1)
+               << (qulonglong)(0)
+               << (qulonglong)(INT_MAX)
+               << (qulonglong)(UINT_MAX)
+               << (qulonglong)(LONG_MAX)
+               << (qulonglong)(ULONG_MAX)
+               << (qulonglong)(LLONG_MAX)
+               << (qulonglong)(ULLONG_MAX);
+
+    col2Values << (qlonglong)(1)
+               << (qlonglong)(0)
+               << (qlonglong)(-1)
+               << (qlonglong)(LONG_MAX)
+               << (qlonglong)(LONG_MIN)
+               << (qlonglong)(ULONG_MAX)
+               << (qlonglong)(LLONG_MAX)
+               << (qlonglong)(LLONG_MIN);
+
+    q.addBindValue(col1Values);
+    q.addBindValue(col2Values);
+    QVERIFY(q.execBatch());
+    QString sqlStr = "select * from " + qtest_oraOCINumber +  " where col1 = :bindValue0 AND col2 = :bindValue1";
+    QVERIFY(q.prepare(sqlStr));
+
+    q.bindValue(":bindValue0", (qulonglong)(1), QSql::InOut);
+    q.bindValue(":bindValue1", (qlonglong)(1), QSql::InOut);
+
+    QVERIFY_SQL( q, exec() );
+    QVERIFY( q.next() );
+    QCOMPARE(q.boundValue( 0 ).toULongLong(),  qulonglong(1));
+    QCOMPARE(q.boundValue( 1 ).toLongLong(),  (qlonglong)(1));
+
+    q.bindValue(":bindValue0", (qulonglong)(0), QSql::InOut);
+    q.bindValue(":bindValue1", (qlonglong)(0), QSql::InOut);
+    QVERIFY_SQL( q, exec() );
+
+    QVERIFY( q.next() );
+    QCOMPARE(q.boundValue( 0 ).toULongLong(),  (qulonglong)(0));
+    QCOMPARE(q.boundValue( 1 ).toLongLong(),  (qlonglong)(0));
+
+    q.bindValue(":bindValue0", (qulonglong)(INT_MAX), QSql::InOut);
+    q.bindValue(":bindValue1", (qlonglong)(-1), QSql::InOut);
+    QVERIFY_SQL( q, exec() );
+
+    QVERIFY( q.next() );
+    QCOMPARE(q.boundValue( 0 ).toULongLong(),  (qulonglong)(INT_MAX));
+    QCOMPARE(q.boundValue( 1 ).toLongLong(),  (qlonglong)(-1));
+
+    q.bindValue(":bindValue0", (qulonglong)(UINT_MAX), QSql::InOut);
+    q.bindValue(":bindValue1", (qlonglong)(LONG_MAX), QSql::InOut);
+    QVERIFY_SQL( q, exec() );
+
+    QVERIFY( q.next() );
+    QCOMPARE(q.boundValue( 0 ).toULongLong(),  (qulonglong)(UINT_MAX));
+    QCOMPARE(q.boundValue( 1 ).toLongLong(),  (qlonglong)(LONG_MAX));
+
+    q.bindValue(":bindValue0", (qulonglong)(LONG_MAX), QSql::InOut);
+    q.bindValue(":bindValue1", (qlonglong)(LONG_MIN), QSql::InOut);
+    QVERIFY_SQL( q, exec() );
+
+    QVERIFY( q.next() );
+    QCOMPARE(q.boundValue( 0 ).toULongLong(),  (qulonglong)(LONG_MAX));
+    QCOMPARE(q.boundValue( 1 ).toLongLong(),  (qlonglong)(LONG_MIN));
+
+    q.bindValue(":bindValue0", (qulonglong)(ULONG_MAX), QSql::InOut);
+    q.bindValue(":bindValue1", (qlonglong)(ULONG_MAX), QSql::InOut);
     QVERIFY_SQL( q, exec() );
 
     QVERIFY( q.next() );
-    QCOMPARE(q.boundValue( 0 ).toLongLong(),  qlonglong(1));
-    QCOMPARE(q.boundValue( 1 ).toLongLong(),  qlonglong(1111));
+    QCOMPARE(q.boundValue( 0 ).toULongLong(),  (qulonglong)(ULONG_MAX));
+    QCOMPARE(q.boundValue( 1 ).toLongLong(),  (qlonglong)(ULONG_MAX));
+
+    q.bindValue(":bindValue0", (qulonglong)(LLONG_MAX), QSql::InOut);
+    q.bindValue(":bindValue1", (qlonglong)(LLONG_MAX), QSql::InOut);
+    QVERIFY_SQL( q, exec() );
+
+    QVERIFY( q.next() );
+    QCOMPARE(q.boundValue( 0 ).toULongLong(),  (qulonglong)(LLONG_MAX));
+    QCOMPARE(q.boundValue( 1 ).toLongLong(),  (qlonglong)(LLONG_MAX));
+
+    q.bindValue(":bindValue0", (qulonglong)(ULLONG_MAX), QSql::InOut);
+    q.bindValue(":bindValue1", (qlonglong)(LLONG_MIN), QSql::InOut);
+    QVERIFY_SQL( q, exec() );
+
+    QVERIFY( q.next() );
+    QCOMPARE(q.boundValue( 0 ).toULongLong(),  (qulonglong)(ULLONG_MAX));
+    QCOMPARE(q.boundValue( 1 ).toLongLong(),  (qlonglong)(LLONG_MIN));
+
 }
 
 void tst_QSqlQuery::sqlite_constraint()
-- 
cgit v0.12


From d2c204a93f30238c705209e65e2e8bce148825cd Mon Sep 17 00:00:00 2001
From: Joona Petrell <joona.t.petrell@nokia.com>
Date: Thu, 4 Nov 2010 18:07:44 +1000
Subject: Image bounding rect should always include the area being painted

This didn't always happend with fillMode PreserveAspectCrop,
resulting in drawing artifacts.

Task-number: QT-3933
Reviewed-by: Martin Jones
---
 .../graphicsitems/qdeclarativeimage.cpp            |  27 +++++++-
 .../graphicsitems/qdeclarativeimage_p.h            |   1 +
 .../declarative/qdeclarativeimage/data/rect.png    | Bin 0 -> 171 bytes
 .../qdeclarativeimage/tst_qdeclarativeimage.cpp    |  74 +++++++++++++++++++++
 4 files changed, 99 insertions(+), 3 deletions(-)
 create mode 100644 tests/auto/declarative/qdeclarativeimage/data/rect.png

diff --git a/src/declarative/graphicsitems/qdeclarativeimage.cpp b/src/declarative/graphicsitems/qdeclarativeimage.cpp
index 1f1e93d..3b08a9b 100644
--- a/src/declarative/graphicsitems/qdeclarativeimage.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeimage.cpp
@@ -259,8 +259,10 @@ void QDeclarativeImage::setFillMode(FillMode mode)
     \qmlproperty real Image::paintedHeight
 
     These properties hold the size of the image that is actually painted.
-    In most cases it is the same as \c width and \c height, but when using a \c fillMode like
-    \c PreserveAspectFit \c paintedWidth or \c paintedHeight can be smaller than \c width and \c height.
+    In most cases it is the same as \c width and \c height, but when using a 
+    \c fillMode \c PreserveAspectFit or \c fillMode \c PreserveAspectCrop 
+    \c paintedWidth or \c paintedHeight can be smaller or larger than 
+    \c width and \c height of the Image element.
 */
 qreal QDeclarativeImage::paintedWidth() const
 {
@@ -399,6 +401,19 @@ void QDeclarativeImage::updatePaintedGeometry()
         if (heightValid() && !widthValid()) {
             setImplicitWidth(d->paintedWidth);
         }
+    } else if (d->fillMode == PreserveAspectCrop) {
+        if (!d->pix.width() || !d->pix.height())
+            return;
+        qreal widthScale = width() / qreal(d->pix.width());
+        qreal heightScale = height() / qreal(d->pix.height());
+        if (widthScale < heightScale) {
+            widthScale = heightScale;
+        } else if(heightScale < widthScale) {
+            heightScale = widthScale;
+        }
+
+        d->paintedHeight = heightScale * qreal(d->pix.height());
+        d->paintedWidth = widthScale * qreal(d->pix.width());
     } else {
         d->paintedWidth = width();
         d->paintedHeight = height();
@@ -412,6 +427,12 @@ void QDeclarativeImage::geometryChanged(const QRectF &newGeometry, const QRectF
     updatePaintedGeometry();
 }
 
+QRectF QDeclarativeImage::boundingRect() const
+{
+    Q_D(const QDeclarativeImage);
+    return QRectF(0, 0, qMax(d->mWidth, d->paintedWidth), qMax(d->mHeight, d->paintedHeight));
+}
+
 /*!
     \qmlproperty url Image::source
 
@@ -496,7 +517,7 @@ void QDeclarativeImage::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWi
             }
             if (clip()) {
                 p->save();
-                p->setClipRect(boundingRect(), Qt::IntersectClip);
+                p->setClipRect(QRectF(0, 0, d->mWidth, d->mHeight), Qt::IntersectClip);
             }
             scale.scale(widthScale, heightScale);
             QTransform old = p->transform();
diff --git a/src/declarative/graphicsitems/qdeclarativeimage_p.h b/src/declarative/graphicsitems/qdeclarativeimage_p.h
index c8bb30b..0e8034e 100644
--- a/src/declarative/graphicsitems/qdeclarativeimage_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeimage_p.h
@@ -76,6 +76,7 @@ public:
     qreal paintedHeight() const;
 
     void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
+    QRectF boundingRect() const;
 
 Q_SIGNALS:
     void fillModeChanged();
diff --git a/tests/auto/declarative/qdeclarativeimage/data/rect.png b/tests/auto/declarative/qdeclarativeimage/data/rect.png
new file mode 100644
index 0000000..d564a2d
Binary files /dev/null and b/tests/auto/declarative/qdeclarativeimage/data/rect.png differ
diff --git a/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp b/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp
index f1e026f..bf779ad 100644
--- a/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp
+++ b/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp
@@ -80,6 +80,8 @@ private slots:
     void preserveAspectRatio();
     void smooth();
     void svg();
+    void geometry();
+    void geometry_data();
     void big();
     void tiling_QTBUG_6716();
     void noLoading();
@@ -288,6 +290,78 @@ void tst_qdeclarativeimage::svg()
     delete obj;
 }
 
+void tst_qdeclarativeimage::geometry_data()
+{
+    QTest::addColumn<QString>("fillMode");
+    QTest::addColumn<bool>("explicitWidth");
+    QTest::addColumn<bool>("explicitHeight");
+    QTest::addColumn<double>("itemWidth");
+    QTest::addColumn<double>("paintedWidth");
+    QTest::addColumn<double>("boundingWidth");
+    QTest::addColumn<double>("itemHeight");
+    QTest::addColumn<double>("paintedHeight");
+    QTest::addColumn<double>("boundingHeight");
+
+    // tested image has width 200, height 100
+
+    // bounding rect and item rect are equal with fillMode PreserveAspectFit, painted rect may be smaller if the aspect ratio doesn't match
+    QTest::newRow("PreserveAspectFit") << "PreserveAspectFit" << false << false << 200.0 << 200.0 << 200.0 << 100.0 << 100.0 << 100.0;
+    QTest::newRow("PreserveAspectFit explicit width 300") << "PreserveAspectFit" << true << false << 300.0 << 200.0 << 300.0 << 100.0 << 100.0 << 100.0;
+    QTest::newRow("PreserveAspectFit explicit height 400") << "PreserveAspectFit" << false << true << 200.0 << 200.0 << 200.0 << 400.0 << 100.0 << 400.0;
+    QTest::newRow("PreserveAspectFit explicit width 300, height 400") << "PreserveAspectFit" << true << true << 300.0 << 300.0 << 300.0 << 400.0 << 150.0 << 400.0;
+
+    // bounding rect and painted rect are equal with fillMode PreserveAspectCrop, item rect may be smaller if the aspect ratio doesn't match
+    QTest::newRow("PreserveAspectCrop") << "PreserveAspectCrop" << false << false << 200.0 << 200.0 << 200.0 << 100.0 << 100.0 << 100.0;
+    QTest::newRow("PreserveAspectCrop explicit width 300") << "PreserveAspectCrop" << true << false << 300.0 << 300.0 << 300.0 << 100.0 << 150.0 << 150.0;
+    QTest::newRow("PreserveAspectCrop explicit height 400") << "PreserveAspectCrop" << false << true << 200.0 << 800.0 << 800.0 << 400.0 << 400.0 << 400.0;
+    QTest::newRow("PreserveAspectCrop explicit width 300, height 400") << "PreserveAspectCrop" << true << true << 300.0 << 800.0 << 800.0 << 400.0 << 400.0 << 400.0;
+
+    // bounding rect, painted rect and item rect are equal in stretching and tiling images
+    QStringList fillModes;
+    fillModes << "Stretch" << "Tile" << "TileVertically" << "TileHorizontally";
+    foreach (QString fillMode, fillModes) {
+        QTest::newRow(fillMode.toLatin1()) << fillMode << false << false << 200.0 << 200.0 << 200.0 << 100.0 << 100.0 << 100.0;
+        QTest::newRow(QString(fillMode + " explicit width 300").toLatin1()) << fillMode << true << false << 300.0 << 300.0 << 300.0 << 100.0 << 100.0 << 100.0;
+        QTest::newRow(QString(fillMode + " explicit height 400").toLatin1()) << fillMode << false << true << 200.0 << 200.0 << 200.0 << 400.0 << 400.0 << 400.0;
+        QTest::newRow(QString(fillMode + " explicit width 300, height 400").toLatin1()) << fillMode << true << true << 300.0 << 300.0 << 300.0 << 400.0 << 400.0 << 400.0;
+    }
+}
+
+void tst_qdeclarativeimage::geometry()
+{
+    QFETCH(QString, fillMode);
+    QFETCH(bool, explicitWidth);
+    QFETCH(bool, explicitHeight);
+    QFETCH(double, itemWidth);
+    QFETCH(double, itemHeight);
+    QFETCH(double, paintedWidth);
+    QFETCH(double, paintedHeight);
+    QFETCH(double, boundingWidth);
+    QFETCH(double, boundingHeight);
+
+    QString src = QUrl::fromLocalFile(SRCDIR "/data/rect.png").toString();
+    QString componentStr = "import QtQuick 1.0\nImage { source: \"" + src + "\"; fillMode: Image." + fillMode + "; ";
+
+    if (explicitWidth)
+        componentStr.append("width: 300; ");
+    if (explicitHeight)
+        componentStr.append("height: 400; ");
+    componentStr.append("}");
+    QDeclarativeComponent component(&engine);
+    component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+    QDeclarativeImage *obj = qobject_cast<QDeclarativeImage*>(component.create());
+    QVERIFY(obj != 0);
+
+    QCOMPARE(obj->width(), itemWidth);
+    QCOMPARE(obj->paintedWidth(), paintedWidth);
+    QCOMPARE(obj->boundingRect().width(), boundingWidth);
+
+    QCOMPARE(obj->height(), itemHeight);
+    QCOMPARE(obj->paintedHeight(), paintedHeight);
+    QCOMPARE(obj->boundingRect().height(), boundingHeight);
+    delete obj;
+}
+
 void tst_qdeclarativeimage::big()
 {
     // If the JPEG loader does not implement scaling efficiently, it would
-- 
cgit v0.12


From afa9d82702cbce1a23f951ed045d038f1d16b417 Mon Sep 17 00:00:00 2001
From: Joona Petrell <joona.t.petrell@nokia.com>
Date: Mon, 8 Nov 2010 10:12:10 +1000
Subject: Update QtOpenVg def files for bug QT-3589

---
 src/s60installs/bwins/QtOpenVGu.def | 1 +
 src/s60installs/eabi/QtOpenVGu.def  | 1 +
 2 files changed, 2 insertions(+)

diff --git a/src/s60installs/bwins/QtOpenVGu.def b/src/s60installs/bwins/QtOpenVGu.def
index a67725e..87b9c7f 100644
--- a/src/s60installs/bwins/QtOpenVGu.def
+++ b/src/s60installs/bwins/QtOpenVGu.def
@@ -175,4 +175,5 @@ EXPORTS
 	?createPixmapForImage@QVGPixmapData@@IAEXAAVQImage@@V?$QFlags@W4ImageConversionFlag@Qt@@@@_N@Z @ 174 NONAME ; void QVGPixmapData::createPixmapForImage(class QImage &, class QFlags<enum Qt::ImageConversionFlag>, bool)
 	?fromData@QVGPixmapData@@UAE_NPBEIPBDV?$QFlags@W4ImageConversionFlag@Qt@@@@@Z @ 175 NONAME ; bool QVGPixmapData::fromData(unsigned char const *, unsigned int, char const *, class QFlags<enum Qt::ImageConversionFlag>)
 	?fromImageReader@QVGPixmapData@@UAEXPAVQImageReader@@V?$QFlags@W4ImageConversionFlag@Qt@@@@@Z @ 176 NONAME ; void QVGPixmapData::fromImageReader(class QImageReader *, class QFlags<enum Qt::ImageConversionFlag>)
+	?canVgWritePixels@QVGPaintEngine@@ABE_NABVQImage@@@Z @ 177 NONAME ; bool QVGPaintEngine::canVgWritePixels(class QImage const &) const
 
diff --git a/src/s60installs/eabi/QtOpenVGu.def b/src/s60installs/eabi/QtOpenVGu.def
index 99942b8..e1828c1 100644
--- a/src/s60installs/eabi/QtOpenVGu.def
+++ b/src/s60installs/eabi/QtOpenVGu.def
@@ -205,4 +205,5 @@ EXPORTS
 	_ZN13QVGPixmapData20createPixmapForImageER6QImage6QFlagsIN2Qt19ImageConversionFlagEEb @ 204 NONAME
 	_ZN13QVGPixmapData8fromDataEPKhjPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 205 NONAME
 	_ZN13QVGPixmapData8fromFileERK7QStringPKc6QFlagsIN2Qt19ImageConversionFlagEE @ 206 NONAME
+	_ZNK14QVGPaintEngine16canVgWritePixelsERK6QImage @ 207 NONAME
 
-- 
cgit v0.12


From 0f1599edcc8624682efb9514bb9b4ac0519c7017 Mon Sep 17 00:00:00 2001
From: Yann Bodson <yann.bodson@nokia.com>
Date: Mon, 8 Nov 2010 13:34:05 +1000
Subject: Text alignment is broken with multi-line text and implicit size.

Also add some visual tests for multi-line text elememts.

Task-number: QTBUG-15018
---
 src/declarative/graphicsitems/qdeclarativetext.cpp |  58 +++++++++++++++----
 .../qmlvisual/qdeclarativetext/font/TestText.qml   |  13 +++++
 .../font/data-MAC/plaintext3.0.png                 | Bin 0 -> 53503 bytes
 .../qdeclarativetext/font/data-MAC/plaintext3.qml  |  11 ++++
 .../qdeclarativetext/font/data/plaintext3.0.png    | Bin 0 -> 53503 bytes
 .../qdeclarativetext/font/data/plaintext3.qml      |  11 ++++
 .../qmlvisual/qdeclarativetext/font/plaintext3.qml |  62 +++++++++++++++++++++
 7 files changed, 143 insertions(+), 12 deletions(-)
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/TestText.qml
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.qml
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext3.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext3.qml
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext3.qml

diff --git a/src/declarative/graphicsitems/qdeclarativetext.cpp b/src/declarative/graphicsitems/qdeclarativetext.cpp
index 84f276e..615c619 100644
--- a/src/declarative/graphicsitems/qdeclarativetext.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetext.cpp
@@ -285,35 +285,56 @@ QSize QDeclarativeTextPrivate::setupTextLayout()
 {
     // ### text layout handling should be profiled and optimized as needed
     // what about QStackTextEngine engine(tmp, d->font.font()); QTextLayout textLayout(&engine);
-
     Q_Q(QDeclarativeText);
     layout.setCacheEnabled(true);
 
     qreal height = 0;
+    qreal widthUsed = 0;
     qreal lineWidth = 0;
 
-    QTextOption textOption = layout.textOption();
-    textOption.setWrapMode(QTextOption::NoWrap);
-    textOption.setAlignment(Qt::Alignment(hAlign));
-
-    // if the item has an explicit width, we set the line width and enable wrapping
-    if (q->widthValid()) {
+    //set manual width
+    if ((wrapMode != QDeclarativeText::NoWrap || elideMode != QDeclarativeText::ElideNone) && q->widthValid())
         lineWidth = q->width();
-        textOption.setWrapMode(QTextOption::WrapMode(wrapMode));
-    }
 
+    QTextOption textOption = layout.textOption();
+    textOption.setWrapMode(QTextOption::WrapMode(wrapMode));
     layout.setTextOption(textOption);
+
     layout.beginLayout();
-    while (1) {
+    forever {
         QTextLine line = layout.createLine();
         if (!line.isValid())
             break;
 
-        line.setLineWidth(lineWidth);
+        if (lineWidth)
+            line.setLineWidth(lineWidth);
+    }
+    layout.endLayout();
+
+    for (int i = 0; i < layout.lineCount(); ++i) {
+        QTextLine line = layout.lineAt(i);
+        widthUsed = qMax(widthUsed, line.naturalTextWidth());
+    }
+
+    qreal layoutWidth = q->widthValid() ? q->width() : widthUsed;
+
+    qreal x = 0;
+    for (int i = 0; i < layout.lineCount(); ++i) {
+        QTextLine line = layout.lineAt(i);
         line.setPosition(QPointF(0, height));
         height += line.height();
+
+        if (!cacheAllTextAsImage) {
+            if (hAlign == QDeclarativeText::AlignLeft) {
+                x = 0;
+            } else if (hAlign == QDeclarativeText::AlignRight) {
+                x = layoutWidth - line.naturalTextWidth();
+            } else if (hAlign == QDeclarativeText::AlignHCenter) {
+                x = (layoutWidth - line.naturalTextWidth()) / 2;
+            }
+            line.setPosition(QPointF(x, line.y()));
+        }
     }
-    layout.endLayout();
 
     return layout.boundingRect().toAlignedRect().size();
 }
@@ -327,6 +348,19 @@ QPixmap QDeclarativeTextPrivate::textLayoutImage(bool drawStyle)
     //do layout
     QSize size = layedOutTextSize;
 
+    qreal x = 0;
+    for (int i = 0; i < layout.lineCount(); ++i) {
+        QTextLine line = layout.lineAt(i);
+        if (hAlign == QDeclarativeText::AlignLeft) {
+            x = 0;
+        } else if (hAlign == QDeclarativeText::AlignRight) {
+            x = size.width() - line.naturalTextWidth();
+        } else if (hAlign == QDeclarativeText::AlignHCenter) {
+            x = (size.width() - line.naturalTextWidth()) / 2;
+        }
+        line.setPosition(QPointF(x, line.y()));
+    }
+
     //paint text
     QPixmap img(size);
     if (!size.isEmpty()) {
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/TestText.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/TestText.qml
new file mode 100644
index 0000000..690cb15
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/TestText.qml
@@ -0,0 +1,13 @@
+import QtQuick 1.0
+
+Text {
+    id: testText
+
+    property color bcolor: "blue"
+
+    text: "The quick brown fox\njumps over\nthe lazy dog."
+    font.family: "Helvetica"
+    font.pointSize: 16
+
+    Rectangle { id: borderr; color: "transparent"; border.color: bcolor; anchors.fill: parent; opacity: 0.2 }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.png
new file mode 100644
index 0000000..0d3c672
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.qml
new file mode 100644
index 0000000..13f413a
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        image: "plaintext3.0.png"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext3.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext3.0.png
new file mode 100644
index 0000000..0d3c672
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext3.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext3.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext3.qml
new file mode 100644
index 0000000..13f413a
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext3.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        image: "plaintext3.0.png"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext3.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext3.qml
new file mode 100644
index 0000000..087dfbe
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext3.qml
@@ -0,0 +1,62 @@
+import QtQuick 1.0
+
+Rectangle {
+    id: main
+    width: 800; height: 600
+
+
+    Grid {
+        x: 4; y: 4
+        spacing: 8
+        columns: 4
+
+        Column {
+            spacing: 4
+            TestText { }
+            TestText { horizontalAlignment: Text.AlignHCenter }
+            TestText { horizontalAlignment: Text.AlignRight }
+        }
+
+        Column {
+            spacing: 4
+            TestText { wrapMode: Text.Wrap }
+            TestText { horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap }
+            TestText { horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap }
+        }
+
+        Column {
+            spacing: 4
+            TestText { wrapMode: Text.Wrap; elide: Text.ElideRight }
+            TestText { horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap; elide: Text.ElideRight }
+            TestText { horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap; elide: Text.ElideRight }
+        }
+
+        Column {
+            spacing: 4
+            TestText { width: 230; wrapMode: Text.Wrap; elide: Text.ElideRight }
+            TestText { width: 230; horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap; elide: Text.ElideRight }
+            TestText { width: 230; horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap; elide: Text.ElideRight }
+        }
+
+        Column {
+            spacing: 4
+            TestText { width: 120; wrapMode: Text.Wrap; elide: Text.ElideRight }
+            TestText { width: 120; horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap; elide: Text.ElideRight }
+            TestText { width: 120; horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap; elide: Text.ElideRight }
+        }
+
+        Column {
+            spacing: 4
+            TestText { width: 120; wrapMode: Text.Wrap }
+            TestText { width: 120; horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap }
+            TestText { width: 120; horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap }
+        }
+
+        Column {
+            spacing: 4
+            TestText { width: 120 }
+            TestText { width: 120; horizontalAlignment: Text.AlignHCenter }
+            TestText { width: 120; horizontalAlignment: Text.AlignRight }
+        }
+    }
+}
-- 
cgit v0.12


From 16316f170fde30b91ed884a95d5910bd4de63782 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Mon, 8 Nov 2010 14:12:57 +1000
Subject: Don't use stdint.h in our headers since it is a C99 header. This
 caused problems in user applications depending upon the order of inlcusion
 and/or defining __STDC_LIMIT_MACROS.  stdint.h is also not present in msvc,
 but is present in mingw.  Switch to using quintptr.

Task-number: QTBUG-14691
Task-number: QTBUG-13953
Reviewed-by: Bea Lam
---
 src/declarative/qml/qdeclarativeprivate.h  |  5 +----
 src/declarative/qml/qmetaobjectbuilder.cpp | 12 ++++--------
 2 files changed, 5 insertions(+), 12 deletions(-)

diff --git a/src/declarative/qml/qdeclarativeprivate.h b/src/declarative/qml/qdeclarativeprivate.h
index d45ddbc..388c92e 100644
--- a/src/declarative/qml/qdeclarativeprivate.h
+++ b/src/declarative/qml/qdeclarativeprivate.h
@@ -55,9 +55,6 @@
 
 #include <QtCore/qglobal.h>
 #include <QtCore/qvariant.h>
-#ifndef Q_OS_WIN
-#include <stdint.h>
-#endif
 
 QT_BEGIN_HEADER
 
@@ -105,7 +102,7 @@ namespace QDeclarativePrivate
     template<class From, class To>
     struct StaticCastSelectorClass<From, To, sizeof(int)>
     {
-        static inline int cast() { return int(reinterpret_cast<intptr_t>(static_cast<To *>(reinterpret_cast<From *>(0x10000000)))) - 0x10000000; }
+        static inline int cast() { return int(reinterpret_cast<quintptr>(static_cast<To *>(reinterpret_cast<From *>(0x10000000)))) - 0x10000000; }
     };
 
     template<class From, class To>
diff --git a/src/declarative/qml/qmetaobjectbuilder.cpp b/src/declarative/qml/qmetaobjectbuilder.cpp
index 58f8811..dfe89f8 100644
--- a/src/declarative/qml/qmetaobjectbuilder.cpp
+++ b/src/declarative/qml/qmetaobjectbuilder.cpp
@@ -41,10 +41,6 @@
 
 #include "private/qmetaobjectbuilder_p.h"
 
-#ifndef Q_OS_WIN
-#include <stdint.h>
-#endif
-
 QT_BEGIN_NAMESPACE
 
 /*!
@@ -1264,8 +1260,8 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
     char *str = reinterpret_cast<char *>(buf + size);
     if (buf) {
         if (relocatable) {
-            meta->d.stringdata = reinterpret_cast<const char *>((intptr_t)size);
-            meta->d.data = reinterpret_cast<uint *>((intptr_t)pmetaSize);
+            meta->d.stringdata = reinterpret_cast<const char *>((quintptr)size);
+            meta->d.data = reinterpret_cast<uint *>((quintptr)pmetaSize);
         } else {
             meta->d.stringdata = str;
             meta->d.data = reinterpret_cast<uint *>(data);
@@ -1502,8 +1498,8 @@ void QMetaObjectBuilder::fromRelocatableData(QMetaObject *output,
     const char *buf = data.constData();
     const QMetaObject *dataMo = reinterpret_cast<const QMetaObject *>(buf);
 
-    intptr_t stringdataOffset = (intptr_t)dataMo->d.stringdata;
-    intptr_t dataOffset = (intptr_t)dataMo->d.data;
+    quintptr stringdataOffset = (quintptr)dataMo->d.stringdata;
+    quintptr dataOffset = (quintptr)dataMo->d.data;
 
     output->d.superdata = superclass;
     output->d.stringdata = buf + stringdataOffset;
-- 
cgit v0.12


From c9860f3336536bfb11c685dd25f6333409fda508 Mon Sep 17 00:00:00 2001
From: Joona Petrell <joona.t.petrell@nokia.com>
Date: Mon, 8 Nov 2010 15:22:12 +1000
Subject: Export QDeclarativeDebugHelper on Symbian for QTBUG-13762

Reviewed-by: Martin Jones
Task-number: QTBUG-13762
---
 src/declarative/debugger/qdeclarativedebughelper_p.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/declarative/debugger/qdeclarativedebughelper_p.h b/src/declarative/debugger/qdeclarativedebughelper_p.h
index a1ac23d..fcd7115 100644
--- a/src/declarative/debugger/qdeclarativedebughelper_p.h
+++ b/src/declarative/debugger/qdeclarativedebughelper_p.h
@@ -55,7 +55,7 @@ class QDeclarativeEngine;
 
 // Helper methods to access private API through a stable interface
 // This is used in the qmljsdebugger library of QtCreator.
-class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeDebugHelper
+class Q_DECLARATIVE_EXPORT QDeclarativeDebugHelper
 {
 public:
     static QScriptEngine *getScriptEngine(QDeclarativeEngine *engine);
-- 
cgit v0.12


From b78ec7dcd8b13a76703baefff1731d3f345392cc Mon Sep 17 00:00:00 2001
From: Harald Fernengel <harald.fernengel@nokia.com>
Date: Mon, 8 Nov 2010 11:10:53 +0100
Subject: fix memleak in test

---
 tests/auto/qtextdocument/tst_qtextdocument.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tests/auto/qtextdocument/tst_qtextdocument.cpp b/tests/auto/qtextdocument/tst_qtextdocument.cpp
index 808299b..23f6a6c 100644
--- a/tests/auto/qtextdocument/tst_qtextdocument.cpp
+++ b/tests/auto/qtextdocument/tst_qtextdocument.cpp
@@ -2054,6 +2054,7 @@ void tst_QTextDocument::clonePreservesIndentWidth()
     doc->setIndentWidth(42);
     QTextDocument *clone = doc->clone();
     QCOMPARE(clone->indentWidth(), qreal(42));
+    delete clone;
 }
 
 void tst_QTextDocument::blockCount()
-- 
cgit v0.12


From ee958e086847e2131f9b746e5c6de4491ae1f44b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Mon, 8 Nov 2010 10:05:28 +0100
Subject: Prevented race condition on texture destruction.

When texture destruction was triggered from a different thread, we
posted a signal to the QGLSignalProxy. However, before the signal is
delivered the corresponding QGLContext might be destroyed in the main
thread. We need to post a signal to a QObject which is destroyed when
the QGLContext is destroyed instead, to prevent trying to access an
invalid QGLContext pointer.

Task-number: QT-4238
Reviewed-by: Gunnar Sletta
---
 src/opengl/qgl.cpp         | 11 +++++++++++
 src/opengl/qgl.h           |  1 +
 src/opengl/qgl_p.h         | 30 ++++++++++++++++++++----------
 tests/auto/qgl/tst_qgl.cpp |  8 ++++++--
 4 files changed, 38 insertions(+), 12 deletions(-)

diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp
index 84cfa97..ed9753e 100644
--- a/src/opengl/qgl.cpp
+++ b/src/opengl/qgl.cpp
@@ -1642,12 +1642,23 @@ const QGLContext *qt_gl_transfer_context(const QGLContext *ctx)
         return 0;
 }
 
+QGLContextPrivate::QGLContextPrivate(QGLContext *context)
+    : internal_context(false)
+    , q_ptr(context)
+{
+    group = new QGLContextGroup(context);
+    texture_destroyer = new QGLTextureDestroyer;
+    texture_destroyer->moveToThread(qApp->thread());
+}
+
 QGLContextPrivate::~QGLContextPrivate()
 {
     if (!group->m_refs.deref()) {
         Q_ASSERT(group->context() == q_ptr);
         delete group;
     }
+
+    delete texture_destroyer;
 }
 
 void QGLContextPrivate::init(QPaintDevice *dev, const QGLFormat &format)
diff --git a/src/opengl/qgl.h b/src/opengl/qgl.h
index f85cad5..9ae619d 100644
--- a/src/opengl/qgl.h
+++ b/src/opengl/qgl.h
@@ -428,6 +428,7 @@ private:
     friend class QGLSharedResourceGuard;
     friend class QGLPixmapBlurFilter;
     friend class QGLExtensions;
+    friend class QGLTexture;
     friend QGLFormat::OpenGLVersionFlags QGLFormat::openGLVersionFlags();
 #ifdef Q_WS_MAC
 public:
diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h
index 18b2765..4742bdb 100644
--- a/src/opengl/qgl_p.h
+++ b/src/opengl/qgl_p.h
@@ -317,6 +317,7 @@ private:
 };
 
 class QGLTexture;
+class QGLTextureDestroyer;
 
 // This probably needs to grow to GL_MAX_VERTEX_ATTRIBS, but 3 is ok for now as that's
 // all the GL2 engine uses:
@@ -326,7 +327,7 @@ class QGLContextPrivate
 {
     Q_DECLARE_PUBLIC(QGLContext)
 public:
-    explicit QGLContextPrivate(QGLContext *context) : internal_context(false), q_ptr(context) {group = new QGLContextGroup(context);}
+    explicit QGLContextPrivate(QGLContext *context);
     ~QGLContextPrivate();
     QGLTexture *bindTexture(const QImage &image, GLenum target, GLint format,
                             QGLContext::BindOptions options);
@@ -417,6 +418,7 @@ public:
     GLuint current_fbo;
     GLuint default_fbo;
     QPaintEngine *active_engine;
+    QGLTextureDestroyer *texture_destroyer;
 
     bool vertexAttributeArraysEnabledState[QT_GL_VERTEX_ARRAY_TRACKED_COUNT];
 
@@ -476,25 +478,20 @@ private:
     QGLContext *m_ctx;
 };
 
-// ### make QGLContext a QObject in 5.0 and remove the proxy stuff
-class Q_OPENGL_EXPORT QGLSignalProxy : public QObject
+class QGLTextureDestroyer : public QObject
 {
     Q_OBJECT
 public:
-    QGLSignalProxy() : QObject() {
+    QGLTextureDestroyer() : QObject() {
         qRegisterMetaType<GLuint>("GLuint");
         connect(this, SIGNAL(freeTexture(QGLContext *, QPixmapData *, GLuint)),
                 this, SLOT(freeTexture_slot(QGLContext *, QPixmapData *, GLuint)));
     }
-    void emitAboutToDestroyContext(const QGLContext *context) {
-        emit aboutToDestroyContext(context);
-    }
     void emitFreeTexture(QGLContext *context, QPixmapData *boundPixmap, GLuint id) {
         emit freeTexture(context, boundPixmap, id);
     }
-    static QGLSignalProxy *instance();
+
 Q_SIGNALS:
-    void aboutToDestroyContext(const QGLContext *context);
     void freeTexture(QGLContext *context, QPixmapData *boundPixmap, GLuint id);
 
 private slots:
@@ -518,6 +515,19 @@ private slots:
     }
 };
 
+// ### make QGLContext a QObject in 5.0 and remove the proxy stuff
+class Q_OPENGL_EXPORT QGLSignalProxy : public QObject
+{
+    Q_OBJECT
+public:
+    void emitAboutToDestroyContext(const QGLContext *context) {
+        emit aboutToDestroyContext(context);
+    }
+    static QGLSignalProxy *instance();
+Q_SIGNALS:
+    void aboutToDestroyContext(const QGLContext *context);
+};
+
 class QGLTexture {
 public:
     QGLTexture(QGLContext *ctx = 0, GLuint tx_id = 0, GLenum tx_target = GL_TEXTURE_2D,
@@ -537,7 +547,7 @@ public:
 #if !defined(Q_WS_X11)
             QPixmapData *boundPixmap = 0;
 #endif
-            QGLSignalProxy::instance()->emitFreeTexture(context, boundPixmap, id);
+            context->d_ptr->texture_destroyer->emitFreeTexture(context, boundPixmap, id);
         }
      }
 
diff --git a/tests/auto/qgl/tst_qgl.cpp b/tests/auto/qgl/tst_qgl.cpp
index 4220b45..e38bf42 100644
--- a/tests/auto/qgl/tst_qgl.cpp
+++ b/tests/auto/qgl/tst_qgl.cpp
@@ -2335,8 +2335,10 @@ public:
     Widget()
         : iterations(0)
         , display(0)
+        , producer(new Producer)
     {
         startTimer(400);
+        connect(this, SIGNAL(destroyed()), producer, SLOT(deleteLater()));
     }
 
     int iterations;
@@ -2348,15 +2350,15 @@ protected:
 
         delete display;
         display = new DisplayWidget(this);
-        connect(&producer, SIGNAL(imageReady(const QImage &)), display, SLOT(setImage(const QImage &)));
+        connect(producer, SIGNAL(imageReady(const QImage &)), display, SLOT(setImage(const QImage &)));
 
         display->setGeometry(rect());
         display->show();
     }
 
 private:
-    Producer producer;
     DisplayWidget *display;
+    Producer *producer;
 };
 
 }
@@ -2369,6 +2371,8 @@ void tst_QGL::threadImages()
     while (widget->iterations <= 5) {
         qApp->processEvents();
     }
+
+    delete widget;
 }
 
 class tst_QGLDummy : public QObject
-- 
cgit v0.12


From 2da8d40ac2c7de25d811bac0befaef577a696065 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Mon, 8 Nov 2010 14:02:28 +0100
Subject: QNAM: Remove dead waitForDownstreamReadyRead() code

Reviewed-by: Thiago Macieira
---
 src/network/access/qnetworkaccessbackend_p.h         |  1 -
 src/network/access/qnetworkaccesscachebackend.cpp    |  6 ------
 src/network/access/qnetworkaccesscachebackend_p.h    |  1 -
 .../access/qnetworkaccessdebugpipebackend.cpp        |  6 ------
 .../access/qnetworkaccessdebugpipebackend_p.h        |  1 -
 src/network/access/qnetworkaccessfilebackend.cpp     |  6 ------
 src/network/access/qnetworkaccessfilebackend_p.h     |  1 -
 src/network/access/qnetworkaccessftpbackend.cpp      | 17 -----------------
 src/network/access/qnetworkaccessftpbackend_p.h      |  1 -
 src/network/access/qnetworkaccesshttpbackend.cpp     | 20 --------------------
 src/network/access/qnetworkaccesshttpbackend_p.h     |  1 -
 11 files changed, 61 deletions(-)

diff --git a/src/network/access/qnetworkaccessbackend_p.h b/src/network/access/qnetworkaccessbackend_p.h
index 4fe6de6..7faa5cb 100644
--- a/src/network/access/qnetworkaccessbackend_p.h
+++ b/src/network/access/qnetworkaccessbackend_p.h
@@ -115,7 +115,6 @@ public:
     virtual bool start();
 #endif
     virtual void closeDownstreamChannel() = 0;
-    virtual bool waitForDownstreamReadyRead(int msecs) = 0;
 
     // slot-like:
     virtual void downstreamReadyWrite();
diff --git a/src/network/access/qnetworkaccesscachebackend.cpp b/src/network/access/qnetworkaccesscachebackend.cpp
index 73491a9..597cbef 100644
--- a/src/network/access/qnetworkaccesscachebackend.cpp
+++ b/src/network/access/qnetworkaccesscachebackend.cpp
@@ -132,12 +132,6 @@ void QNetworkAccessCacheBackend::closeUpstreamChannel()
     Q_ASSERT_X(false, Q_FUNC_INFO, "This function show not have been called!");
 }
 
-bool QNetworkAccessCacheBackend::waitForDownstreamReadyRead(int)
-{
-    Q_ASSERT_X(false, Q_FUNC_INFO , "This function show not have been called!");
-    return false;
-}
-
 bool QNetworkAccessCacheBackend::waitForUpstreamBytesWritten(int)
 {
     Q_ASSERT_X(false, Q_FUNC_INFO, "This function show not have been called!");
diff --git a/src/network/access/qnetworkaccesscachebackend_p.h b/src/network/access/qnetworkaccesscachebackend_p.h
index df001ab..995c875 100644
--- a/src/network/access/qnetworkaccesscachebackend_p.h
+++ b/src/network/access/qnetworkaccesscachebackend_p.h
@@ -69,7 +69,6 @@ public:
     void open();
     void closeDownstreamChannel();
     void closeUpstreamChannel();
-    bool waitForDownstreamReadyRead(int msecs);
     bool waitForUpstreamBytesWritten(int msecs);
 
     void upstreamReadyRead();
diff --git a/src/network/access/qnetworkaccessdebugpipebackend.cpp b/src/network/access/qnetworkaccessdebugpipebackend.cpp
index cd077e7..5f99f84 100644
--- a/src/network/access/qnetworkaccessdebugpipebackend.cpp
+++ b/src/network/access/qnetworkaccessdebugpipebackend.cpp
@@ -278,12 +278,6 @@ void QNetworkAccessDebugPipeBackend::socketConnected()
 {
 }
 
-bool QNetworkAccessDebugPipeBackend::waitForDownstreamReadyRead(int ms)
-{
-    Q_UNUSED(ms);
-    qCritical("QNetworkAccess: Debug pipe backend does not support waitForReadyRead()");
-    return false;
-}
 
 #endif
 
diff --git a/src/network/access/qnetworkaccessdebugpipebackend_p.h b/src/network/access/qnetworkaccessdebugpipebackend_p.h
index 58a4fd0..918a813 100644
--- a/src/network/access/qnetworkaccessdebugpipebackend_p.h
+++ b/src/network/access/qnetworkaccessdebugpipebackend_p.h
@@ -71,7 +71,6 @@ public:
 
     virtual void open();
     virtual void closeDownstreamChannel();
-    virtual bool waitForDownstreamReadyRead(int msecs);
 
     virtual void downstreamReadyWrite();
 
diff --git a/src/network/access/qnetworkaccessfilebackend.cpp b/src/network/access/qnetworkaccessfilebackend.cpp
index 4560153..65f19ca 100644
--- a/src/network/access/qnetworkaccessfilebackend.cpp
+++ b/src/network/access/qnetworkaccessfilebackend.cpp
@@ -203,12 +203,6 @@ void QNetworkAccessFileBackend::closeDownstreamChannel()
     }
 }
 
-bool QNetworkAccessFileBackend::waitForDownstreamReadyRead(int)
-{
-    Q_ASSERT(operation() == QNetworkAccessManager::GetOperation);
-    return readMoreFromFile();
-}
-
 void QNetworkAccessFileBackend::downstreamReadyWrite()
 {
     Q_ASSERT_X(operation() == QNetworkAccessManager::GetOperation, "QNetworkAccessFileBackend",
diff --git a/src/network/access/qnetworkaccessfilebackend_p.h b/src/network/access/qnetworkaccessfilebackend_p.h
index 6df8710..d1dbe8d 100644
--- a/src/network/access/qnetworkaccessfilebackend_p.h
+++ b/src/network/access/qnetworkaccessfilebackend_p.h
@@ -69,7 +69,6 @@ public:
 
     virtual void open();
     virtual void closeDownstreamChannel();
-    virtual bool waitForDownstreamReadyRead(int msecs);
 
     virtual void downstreamReadyWrite();
 
diff --git a/src/network/access/qnetworkaccessftpbackend.cpp b/src/network/access/qnetworkaccessftpbackend.cpp
index 1a59011..d1a18d3 100644
--- a/src/network/access/qnetworkaccessftpbackend.cpp
+++ b/src/network/access/qnetworkaccessftpbackend.cpp
@@ -182,23 +182,6 @@ void QNetworkAccessFtpBackend::closeDownstreamChannel()
 #endif
 }
 
-bool QNetworkAccessFtpBackend::waitForDownstreamReadyRead(int ms)
-{
-    if (!ftp)
-        return false;
-
-    if (ftp->bytesAvailable()) {
-        ftpReadyRead();
-        return true;
-    }
-
-    if (ms == 0)
-        return false;
-
-    qCritical("QNetworkAccess: FTP backend does not support waitForReadyRead()");
-    return false;
-}
-
 void QNetworkAccessFtpBackend::downstreamReadyWrite()
 {
     if (state == Transferring && ftp && ftp->bytesAvailable())
diff --git a/src/network/access/qnetworkaccessftpbackend_p.h b/src/network/access/qnetworkaccessftpbackend_p.h
index 737fa72..8a2bfc3 100644
--- a/src/network/access/qnetworkaccessftpbackend_p.h
+++ b/src/network/access/qnetworkaccessftpbackend_p.h
@@ -87,7 +87,6 @@ public:
 
     virtual void open();
     virtual void closeDownstreamChannel();
-    virtual bool waitForDownstreamReadyRead(int msecs);
 
     virtual void downstreamReadyWrite();
 
diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp
index 2a0daf8..80b05a4 100644
--- a/src/network/access/qnetworkaccesshttpbackend.cpp
+++ b/src/network/access/qnetworkaccesshttpbackend.cpp
@@ -674,26 +674,6 @@ void QNetworkAccessHttpBackend::closeDownstreamChannel()
     // this indicates that the user closed the stream while the reply isn't finished yet
 }
 
-bool QNetworkAccessHttpBackend::waitForDownstreamReadyRead(int msecs)
-{
-    Q_ASSERT(http);
-
-    if (httpReply->bytesAvailable()) {
-        readFromHttp();
-        return true;
-    }
-
-    if (msecs == 0) {
-        // no bytes available in the socket and no waiting
-        return false;
-    }
-
-    // ### FIXME
-    qCritical("QNetworkAccess: HTTP backend does not support waitForReadyRead()");
-    return false;
-}
-
-
 void QNetworkAccessHttpBackend::downstreamReadyWrite()
 {
     readFromHttp();
diff --git a/src/network/access/qnetworkaccesshttpbackend_p.h b/src/network/access/qnetworkaccesshttpbackend_p.h
index 568b2ee..5de3429 100644
--- a/src/network/access/qnetworkaccesshttpbackend_p.h
+++ b/src/network/access/qnetworkaccesshttpbackend_p.h
@@ -79,7 +79,6 @@ public:
 
     virtual void open();
     virtual void closeDownstreamChannel();
-    virtual bool waitForDownstreamReadyRead(int msecs);
 
     virtual void downstreamReadyWrite();
     virtual void setDownstreamLimited(bool b);
-- 
cgit v0.12


From a3a84a872bb731d375a431626ccfcde5a660dd72 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Mon, 8 Nov 2010 14:08:13 +0100
Subject: QNAM: Remove dead waitForUpstreamBytesWritten() code

---
 src/network/access/qnetworkaccesscachebackend.cpp | 6 ------
 src/network/access/qnetworkaccesscachebackend_p.h | 1 -
 2 files changed, 7 deletions(-)

diff --git a/src/network/access/qnetworkaccesscachebackend.cpp b/src/network/access/qnetworkaccesscachebackend.cpp
index 597cbef..e78694e 100644
--- a/src/network/access/qnetworkaccesscachebackend.cpp
+++ b/src/network/access/qnetworkaccesscachebackend.cpp
@@ -132,12 +132,6 @@ void QNetworkAccessCacheBackend::closeUpstreamChannel()
     Q_ASSERT_X(false, Q_FUNC_INFO, "This function show not have been called!");
 }
 
-bool QNetworkAccessCacheBackend::waitForUpstreamBytesWritten(int)
-{
-    Q_ASSERT_X(false, Q_FUNC_INFO, "This function show not have been called!");
-    return false;
-}
-
 void QNetworkAccessCacheBackend::upstreamReadyRead()
 {
     Q_ASSERT_X(false, Q_FUNC_INFO, "This function show not have been called!");
diff --git a/src/network/access/qnetworkaccesscachebackend_p.h b/src/network/access/qnetworkaccesscachebackend_p.h
index 995c875..32581d5 100644
--- a/src/network/access/qnetworkaccesscachebackend_p.h
+++ b/src/network/access/qnetworkaccesscachebackend_p.h
@@ -69,7 +69,6 @@ public:
     void open();
     void closeDownstreamChannel();
     void closeUpstreamChannel();
-    bool waitForUpstreamBytesWritten(int msecs);
 
     void upstreamReadyRead();
     void downstreamReadyWrite();
-- 
cgit v0.12


From 626f13421baf258407f03e3bf21ed67138d55ea4 Mon Sep 17 00:00:00 2001
From: Kent Hansen <kent.hansen@nokia.com>
Date: Mon, 8 Nov 2010 15:03:05 +0100
Subject: Don't crash if QScriptClass property getter returns an invalid value

It's possible that a class claims to have a property of a given name
(i.e. queryProperty() returns true), but returns an invalid value
for that property. In that case we should silently convert the value
to undefined, otherwise the value may wreak havoc in JS.

This is a regression from Qt 4.5 (pre-JavaScriptCore-based), which
had this check.

Task-number: QTBUG-15079
Reviewed-by: Jedrzej Nowacki
---
 src/script/bridge/qscriptclassobject.cpp     | 12 ++++++++++++
 tests/auto/qscriptclass/tst_qscriptclass.cpp | 21 +++++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/src/script/bridge/qscriptclassobject.cpp b/src/script/bridge/qscriptclassobject.cpp
index dd229f1..228e755 100644
--- a/src/script/bridge/qscriptclassobject.cpp
+++ b/src/script/bridge/qscriptclassobject.cpp
@@ -78,6 +78,12 @@ bool ClassObjectDelegate::getOwnPropertySlot(QScriptObject* object,
         scriptObject, scriptName, QScriptClass::HandlesReadAccess, &id);
     if (flags & QScriptClass::HandlesReadAccess) {
         QScriptValue value = m_scriptClass->property(scriptObject, scriptName, id);
+        if (!value.isValid()) {
+            // The class claims to have the property, but returned an invalid
+            // value. Silently convert to undefined to avoid the invalid value
+            // "escaping" into JS.
+            value = QScriptValue(QScriptValue::UndefinedValue);
+        }
         slot.setValue(engine->scriptValueToJSCValue(value));
         return true;
     }
@@ -119,6 +125,12 @@ bool ClassObjectDelegate::getOwnPropertyDescriptor(QScriptObject *object,
         attribs |= pflags & QScriptValue::UserRange;
         // Rather than calling the getter, we could return an access descriptor here.
         QScriptValue value = m_scriptClass->property(scriptObject, scriptName, id);
+        if (!value.isValid()) {
+            // The class claims to have the property, but returned an invalid
+            // value. Silently convert to undefined to avoid the invalid value
+            // "escaping" into JS.
+            value = QScriptValue(QScriptValue::UndefinedValue);
+        }
         descriptor.setDescriptor(engine->scriptValueToJSCValue(value), attribs);
         return true;
     }
diff --git a/tests/auto/qscriptclass/tst_qscriptclass.cpp b/tests/auto/qscriptclass/tst_qscriptclass.cpp
index b4dbe73..da6c76f 100644
--- a/tests/auto/qscriptclass/tst_qscriptclass.cpp
+++ b/tests/auto/qscriptclass/tst_qscriptclass.cpp
@@ -66,6 +66,7 @@ public:
 private slots:
     void newInstance();
     void getAndSetProperty();
+    void getProperty_invalidValue();
     void enumerate();
     void extension();
 };
@@ -741,6 +742,26 @@ void tst_QScriptClass::getAndSetProperty()
     QVERIFY(!obj1.property(bar).isValid());
 }
 
+void tst_QScriptClass::getProperty_invalidValue()
+{
+    QScriptEngine eng;
+    TestClass cls(&eng);
+    cls.addCustomProperty(eng.toStringHandle("foo"), QScriptClass::HandlesReadAccess,
+                          /*id=*/0, QScriptValue::ReadOnly, QScriptValue());
+    QScriptValue obj = eng.newObject(&cls);
+
+    QVERIFY(obj.property("foo").isUndefined());
+
+    eng.globalObject().setProperty("obj", obj);
+    QVERIFY(eng.evaluate("obj.hasOwnProperty('foo'))").toBool());
+    // The JS environment expects that a valid value is returned,
+    // otherwise we could crash.
+    QVERIFY(eng.evaluate("obj.foo").isUndefined());
+    QVERIFY(eng.evaluate("obj.foo + ''").isString());
+    QVERIFY(eng.evaluate("Object.getOwnPropertyDescriptor(obj, 'foo').value").isUndefined());
+    QVERIFY(eng.evaluate("Object.getOwnPropertyDescriptor(obj, 'foo').value +''").isString());
+}
+
 void tst_QScriptClass::enumerate()
 {
     QScriptEngine eng;
-- 
cgit v0.12


From a98b9daa4cd1341ee0ce6d2cf859666db9ebda59 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Mon, 8 Nov 2010 17:23:27 +0100
Subject: QNAM: Do not need QNetworkSession in AlwaysCache load mode

Move the creation code to the top of QNAM::createRequest()
to avoid setting up a QNetworkSession when it is not needed.

Reviewed-by: ogoffart
---
 src/network/access/qnetworkaccessbackend.cpp | 12 ------------
 src/network/access/qnetworkaccessmanager.cpp | 21 +++++++++++++++++++++
 2 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/src/network/access/qnetworkaccessbackend.cpp b/src/network/access/qnetworkaccessbackend.cpp
index 0a0987a..05eb6cb 100644
--- a/src/network/access/qnetworkaccessbackend.cpp
+++ b/src/network/access/qnetworkaccessbackend.cpp
@@ -88,18 +88,6 @@ QNetworkAccessBackendFactory::~QNetworkAccessBackendFactory()
 QNetworkAccessBackend *QNetworkAccessManagerPrivate::findBackend(QNetworkAccessManager::Operation op,
                                                                  const QNetworkRequest &request)
 {
-    QNetworkRequest::CacheLoadControl mode =
-        static_cast<QNetworkRequest::CacheLoadControl>(
-            request.attribute(QNetworkRequest::CacheLoadControlAttribute,
-                              QNetworkRequest::PreferNetwork).toInt());
-    if (mode == QNetworkRequest::AlwaysCache
-        && (op == QNetworkAccessManager::GetOperation
-        || op == QNetworkAccessManager::HeadOperation)) {
-        QNetworkAccessBackend *backend = new QNetworkAccessCacheBackend;
-        backend->manager = this;
-        return backend;
-    }
-
     if (!factoryDataShutdown) {
         QMutexLocker locker(&factoryData()->mutex);
         QNetworkAccessBackendFactoryData::ConstIterator it = factoryData()->constBegin(),
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index e5f4d5a..effd79e 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -54,6 +54,7 @@
 #include "qnetworkaccessfilebackend_p.h"
 #include "qnetworkaccessdatabackend_p.h"
 #include "qnetworkaccessdebugpipebackend_p.h"
+#include "qnetworkaccesscachebackend_p.h"
 #include "qfilenetworkreply_p.h"
 
 #include "QtCore/qbuffer.h"
@@ -970,6 +971,26 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera
         return new QFileNetworkReply(this, req, op);
     }
 
+    // A request with QNetworkRequest::AlwaysCache does not need any bearer management
+    QNetworkRequest::CacheLoadControl mode =
+        static_cast<QNetworkRequest::CacheLoadControl>(
+            req.attribute(QNetworkRequest::CacheLoadControlAttribute,
+                              QNetworkRequest::PreferNetwork).toInt());
+    if (mode == QNetworkRequest::AlwaysCache
+        && (op == QNetworkAccessManager::GetOperation
+        || op == QNetworkAccessManager::HeadOperation)) {
+        // FIXME Implement a QNetworkReplyCacheImpl instead, see QTBUG-15106
+        QNetworkReplyImpl *reply = new QNetworkReplyImpl(this);
+        QNetworkReplyImplPrivate *priv = reply->d_func();
+        priv->manager = this;
+        priv->backend = new QNetworkAccessCacheBackend();
+        priv->backend->manager = this->d_func();
+        priv->backend->setParent(reply);
+        priv->backend->reply = priv;
+        priv->setup(op, req, outgoingData);
+        return reply;
+    }
+
 #ifndef QT_NO_BEARERMANAGEMENT
     // Return a disabled network reply if network access is disabled.
     // Except if the scheme is empty or file://.
-- 
cgit v0.12


From 285855b8fbbdc7ad428a0c66f6c4469d97e55769 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Mon, 8 Nov 2010 17:33:49 +0100
Subject: Fixed text rendering bug in raster engine when opacity != 1.0.

If opacity is updated independently from the pen properties sometimes
the raster engine's fast_text flag would not be updated correctly,
causing it to use a rendering path which doesn't support alpha.

Reviewed-by: Robin Burchell
Reviewed-by: Andreas Kling
---
 src/gui/painting/qpaintengine_raster.cpp |  4 +++-
 tests/auto/qpainter/tst_qpainter.cpp     | 25 +++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 161ced5..89202ac 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -875,9 +875,10 @@ void QRasterPaintEngine::updateState()
     if (s->dirty & DirtyTransform)
         updateMatrix(s->matrix);
 
-    if (s->dirty & (DirtyPen|DirtyCompositionMode)) {
+    if (s->dirty & (DirtyPen|DirtyCompositionMode|DirtyOpacity)) {
         const QPainter::CompositionMode mode = s->composition_mode;
         s->flags.fast_text = (s->penData.type == QSpanData::Solid)
+                       && s->intOpacity == 256
                        && (mode == QPainter::CompositionMode_Source
                            || (mode == QPainter::CompositionMode_SourceOver
                                && qAlpha(s->penData.solid.color) == 255));
@@ -901,6 +902,7 @@ void QRasterPaintEngine::opacityChanged()
     s->fillFlags |= DirtyOpacity;
     s->strokeFlags |= DirtyOpacity;
     s->pixmapFlags |= DirtyOpacity;
+    s->dirty |= DirtyOpacity;
     s->intOpacity = (int) (s->opacity * 256);
 }
 
diff --git a/tests/auto/qpainter/tst_qpainter.cpp b/tests/auto/qpainter/tst_qpainter.cpp
index ff9bf1c..83ff9a9 100644
--- a/tests/auto/qpainter/tst_qpainter.cpp
+++ b/tests/auto/qpainter/tst_qpainter.cpp
@@ -256,6 +256,7 @@ private slots:
     void drawPointScaled();
 
     void QTBUG14614_gradientCacheRaceCondition();
+    void drawTextOpacity();
 
 private:
     void fillData();
@@ -4576,6 +4577,30 @@ void tst_QPainter::QTBUG14614_gradientCacheRaceCondition()
         producers[i].wait();
 }
 
+void tst_QPainter::drawTextOpacity()
+{
+    QImage image(32, 32, QImage::Format_RGB32);
+    image.fill(0xffffffff);
+
+    QPainter p(&image);
+    p.setPen(QColor("#6F6F6F"));
+    p.setOpacity(0.5);
+    p.drawText(5, 30, QLatin1String("Qt"));
+    p.end();
+
+    QImage copy = image;
+    image.fill(0xffffffff);
+
+    p.begin(&image);
+    p.setPen(QColor("#6F6F6F"));
+    p.drawLine(-10, -10, -1, -1);
+    p.setOpacity(0.5);
+    p.drawText(5, 30, QLatin1String("Qt"));
+    p.end();
+
+    QCOMPARE(image, copy);
+}
+
 QTEST_MAIN(tst_QPainter)
 
 #include "tst_qpainter.moc"
-- 
cgit v0.12


From 38f7873d8f3104ede6f7e70392f2e1ba2970b508 Mon Sep 17 00:00:00 2001
From: Anders Bakken <agbakken@gmail.com>
Date: Mon, 8 Nov 2010 16:56:39 +0000
Subject: Fix some painting issues in QDirectFBPaintEngine

Inspired/rewrite of Denis Oliver Kropp's merge request
(http://qt.gitorious.org/qt/qt/merge_requests/874)

When blitting premultiplied source surfaces one has to set
DSBLIT_SRC_PREMULTIPLY.

This also reverts the erroneous 6acbf6dce98903310023284e27a65c19f9a829bc

Merge-request: 903
Reviewed-by: Donald Carr <donald.carr@nokia.com>
---
 .../gfxdrivers/directfb/qdirectfbpaintengine.cpp   | 24 ++++++++++++++--------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
index 4869eba..d5697e0 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
@@ -55,6 +55,7 @@
 #include <private/qpixmap_raster_p.h>
 #include <private/qimagepixmapcleanuphooks_p.h>
 
+
 QT_BEGIN_NAMESPACE
 
 class SurfaceCache;
@@ -112,7 +113,7 @@ public:
     static inline int cacheCost(const QImage &img) { return img.width() * img.height() * img.depth() / 8; }
 #endif
 
-    void prepareForBlit(bool alpha);
+    void prepareForBlit(IDirectFBSurface *surface);
 
     IDirectFBSurface *surface;
 
@@ -616,7 +617,7 @@ void QDirectFBPaintEngine::drawImage(const QRectF &r, const QImage &image,
 #if !defined QT_NO_DIRECTFB_PREALLOCATED || defined QT_DIRECTFB_IMAGECACHE
     bool release;
     IDirectFBSurface *imgSurface = d->getSurface(image, &release);
-    d->prepareForBlit(QDirectFBScreen::hasAlphaChannel(imgSurface));
+    d->prepareForBlit(imgSurface);
     CLIPPED_PAINT(d->blit(r, imgSurface, sr));
     if (release) {
 #if (Q_DIRECTFB_VERSION >= 0x010000)
@@ -655,8 +656,8 @@ void QDirectFBPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pixmap,
             QRasterPaintEngine::drawImage(r, *img, sr);
         } else {
             QDirectFBPaintEnginePrivate::unlock(dfbData);
-            d->prepareForBlit(pixmap.hasAlphaChannel());
             IDirectFBSurface *s = dfbData->directFBSurface();
+            d->prepareForBlit(s);
             CLIPPED_PAINT(d->blit(r, s, sr));
         }
     }
@@ -978,7 +979,7 @@ void QDirectFBPaintEnginePrivate::setCompositionMode(QPainter::CompositionMode m
         break;
     case QPainter::CompositionMode_SourceOver:
         compositionModeStatus &= ~PorterDuff_AlwaysBlend;
-        surface->SetPorterDuff(surface, DSPD_NONE);
+        surface->SetPorterDuff(surface, DSPD_SRC_OVER);
         break;
     case QPainter::CompositionMode_DestinationOver:
         surface->SetPorterDuff(surface, DSPD_DST_OVER);
@@ -1031,13 +1032,18 @@ void QDirectFBPaintEnginePrivate::setRenderHints(QPainter::RenderHints hints)
     }
 }
 
-void QDirectFBPaintEnginePrivate::prepareForBlit(bool alpha)
+void QDirectFBPaintEnginePrivate::prepareForBlit(IDirectFBSurface *s)
 {
-    DFBSurfaceBlittingFlags blittingFlags = alpha ? DSBLIT_BLEND_ALPHACHANNEL : DSBLIT_NOFX;
+    DFBSurfaceBlittingFlags blittingFlags = DSBLIT_NOFX;
+    if (QDirectFBScreen::isPremultiplied(QDirectFBScreen::getImageFormat(s)))
+        blittingFlags |= DSBLIT_SRC_PREMULTIPLY;
+    if (QDirectFBScreen::hasAlphaChannel(s))
+        blittingFlags |= DSBLIT_BLEND_ALPHACHANNEL;
     if (opacity != 255) {
         blittingFlags |= DSBLIT_BLEND_COLORALPHA;
+        surface->SetColor(surface, 0xff, 0xff, 0xff, opacity);
     }
-    surface->SetColor(surface, 0xff, 0xff, 0xff, opacity);
+
     surface->SetBlittingFlags(surface, blittingFlags);
 }
 
@@ -1154,13 +1160,13 @@ void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPix
 
     QPointF offset = off;
     Q_ASSERT(transform.type() <= QTransform::TxScale);
-    prepareForBlit(pixmap.hasAlphaChannel());
     QPixmapData *data = pixmap.pixmapData();
     Q_ASSERT(data->classId() == QPixmapData::DirectFBClass);
     QDirectFBPixmapData *dfbData = static_cast<QDirectFBPixmapData*>(data);
+    IDirectFBSurface *sourceSurface = dfbData->directFBSurface();
+    prepareForBlit(sourceSurface);
     QDirectFBPaintEnginePrivate::unlock(dfbData);
     const QSize pixmapSize = dfbData->size();
-    IDirectFBSurface *sourceSurface = dfbData->directFBSurface();
     if (transform.isScaling()) {
         Q_ASSERT(supportsStretchBlit());
         Q_ASSERT(qMin(transform.m11(), transform.m22()) >= 0);
-- 
cgit v0.12


From 551a8648b93055afa92c2938af5cede7495fd7f5 Mon Sep 17 00:00:00 2001
From: Konstantin Ritt <ritt.ks@gmail.com>
Date: Mon, 8 Nov 2010 19:26:13 +0300
Subject: fix build on mingw

> data.cpp:2: error: 'ushort' does not name a type
> data.cpp:1133: error: 'ushort' does not name a type
and lot of
> data.cpp:1276: error: too many initializers for 'StringCollection'

when the issue with ushort is fixed (by including qglobal.h, for example)
a bunch of some new build errors occurs:
> data.cpp:4: error: 'stringCollectionData' was declared 'extern' and later 'static'
> data.h:54: error: previous declaration of 'stringCollectionData'
> data.cpp:1131: error: redefinition of 'struct StringCollection'
> data.h:48: error: previous definition of 'struct StringCollection'
> data.cpp:1136: error: invalid type in declaration before '=' token
> data.cpp:1136: error: conflicting declaration 'int stringCollection []'
> data.h:55: error: 'stringCollection' has a previous declaration as 'StringCollection stringCollection []
> data.cpp:1279: error: 'stringCollectionCount' was declared 'extern' and later 'static'
> data.h:56: error: previous declaration of 'stringCollectionCount'

Merge-request: 910
Reviewed-By: Thiago Macieira <thiago.macieira@nokia.com>
---
 tests/benchmarks/corelib/tools/qstring/data.cpp        | 18 +++++++-----------
 tests/benchmarks/corelib/tools/qstring/data.h          |  7 ++++++-
 tests/benchmarks/corelib/tools/qstring/generatelist.pl |  5 ++---
 3 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/tests/benchmarks/corelib/tools/qstring/data.cpp b/tests/benchmarks/corelib/tools/qstring/data.cpp
index 6d1a069..a674336 100644
--- a/tests/benchmarks/corelib/tools/qstring/data.cpp
+++ b/tests/benchmarks/corelib/tools/qstring/data.cpp
@@ -1,5 +1,7 @@
+#include "data.h"
+
 // This is a generated file - DO NOT EDIT
-static const ushort stringCollectionData[] __attribute__((aligned(16))) = { 
+const ushort stringCollectionData[] __attribute__((aligned(16))) = {
     // #0
     65535,
          99, 111, 109, 112, 105, 108, 101, 114, 32, 118, 101, 114, 115, 105, 111, 110, 115, 47,
@@ -1123,15 +1125,9 @@ static const ushort stringCollectionData[] __attribute__((aligned(16))) = {
     65535,
          84, 69, 65, 77, 66, 85, 73, 76, 68, 69, 82, 61,
     65535,65534,65533, // 5216
-
-
 };
-static struct StringCollection
-{
-    int len;
-    int offset1, offset2;
-    ushort align1, align2;
-} stringCollection[] = {
+
+const struct StringCollection stringCollection[] = {
     {18, 1, 29, 3666, 106},     // #0
     {18, 53, 77, 106, 1978},     // #1
     {20, 97, 125, 2850, 3210},     // #2
@@ -1274,8 +1270,8 @@ static struct StringCollection
     {12, 5153, 5169, 130, 2930},     // #139
     {12, 5185, 5201, 242, 2930},     // #140
 };
-static const int stringCollectionCount = 141;
-static const int stringCollectionMaxLen = 51;
+const int stringCollectionCount = 141;
+const int stringCollectionMaxLen = 51;
 // average comparison length: 12.0922
 // cache-line crosses: 6 (2.1%)
 // alignment histogram:
diff --git a/tests/benchmarks/corelib/tools/qstring/data.h b/tests/benchmarks/corelib/tools/qstring/data.h
index c7a7467..ce733fb 100644
--- a/tests/benchmarks/corelib/tools/qstring/data.h
+++ b/tests/benchmarks/corelib/tools/qstring/data.h
@@ -39,6 +39,9 @@
 **
 ****************************************************************************/
 
+#ifndef DATA_H
+#define DATA_H
+
 #include <qglobal.h>
 
 struct StringCollection
@@ -49,5 +52,7 @@ struct StringCollection
 };
 
 extern const ushort stringCollectionData[];
-extern StringCollection stringCollection[];
+extern const StringCollection stringCollection[];
 extern const int stringCollectionCount;
+
+#endif // DATA_H
diff --git a/tests/benchmarks/corelib/tools/qstring/generatelist.pl b/tests/benchmarks/corelib/tools/qstring/generatelist.pl
index d027adb..8c8eb20 100644
--- a/tests/benchmarks/corelib/tools/qstring/generatelist.pl
+++ b/tests/benchmarks/corelib/tools/qstring/generatelist.pl
@@ -160,11 +160,10 @@ while (1) {
     $totalsize += $len;
     $maxlen = $len if $len > $maxlen;
 }
-print "\n};\n";
+print "};\n";
 close IN;
 
-print "struct StringCollection stringCollection[] = {\n";
-
+print "const struct StringCollection stringCollection[] = {\n";
 for $i (0..$count-1) {
     print "    {",
         $data[$i]->{len}, ", ",
-- 
cgit v0.12


From e00af84cc9230df411981d2f3b9296b61d5d1c50 Mon Sep 17 00:00:00 2001
From: Anders Bakken <agbakken@gmail.com>
Date: Mon, 8 Nov 2010 14:12:25 -0800
Subject: DFB: Make sure QPixmap::hasAlpha is respected

An IDirectFBSurface can have an alpha channel for an opaque QPixmap.
This change will make sure we don't blend unless QPixmap::hasAlpha
returns true.

Merge-request: 913
Reviewed-by: Donald Carr <donald.carr@nokia.com>
---
 .../gfxdrivers/directfb/qdirectfbpaintengine.cpp   | 34 +++++++++++++++++-----
 1 file changed, 27 insertions(+), 7 deletions(-)

diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
index d5697e0..c16a242 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
@@ -113,7 +113,11 @@ public:
     static inline int cacheCost(const QImage &img) { return img.width() * img.height() * img.depth() / 8; }
 #endif
 
-    void prepareForBlit(IDirectFBSurface *surface);
+    enum BlitFlag {
+        HasAlpha = 0x1,
+        Premultiplied = 0x2
+    };
+    void prepareForBlit(uint blitFlags);
 
     IDirectFBSurface *surface;
 
@@ -617,7 +621,12 @@ void QDirectFBPaintEngine::drawImage(const QRectF &r, const QImage &image,
 #if !defined QT_NO_DIRECTFB_PREALLOCATED || defined QT_DIRECTFB_IMAGECACHE
     bool release;
     IDirectFBSurface *imgSurface = d->getSurface(image, &release);
-    d->prepareForBlit(imgSurface);
+    uint blitFlags = 0;
+    if (image.hasAlphaChannel())
+        blitFlags |= QDirectFBPaintEnginePrivate::HasAlpha;
+    if (QDirectFBScreen::isPremultiplied(image.format()))
+        blitFlags |= QDirectFBPaintEnginePrivate::Premultiplied;
+    d->prepareForBlit(blitFlags);
     CLIPPED_PAINT(d->blit(r, imgSurface, sr));
     if (release) {
 #if (Q_DIRECTFB_VERSION >= 0x010000)
@@ -657,7 +666,13 @@ void QDirectFBPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pixmap,
         } else {
             QDirectFBPaintEnginePrivate::unlock(dfbData);
             IDirectFBSurface *s = dfbData->directFBSurface();
-            d->prepareForBlit(s);
+            uint blitFlags = 0;
+            if (pixmap.hasAlphaChannel())
+                blitFlags |= QDirectFBPaintEnginePrivate::HasAlpha;
+            if (QDirectFBScreen::isPremultiplied(dfbData->pixelFormat()))
+                blitFlags |= QDirectFBPaintEnginePrivate::Premultiplied;
+
+            d->prepareForBlit(blitFlags);
             CLIPPED_PAINT(d->blit(r, s, sr));
         }
     }
@@ -1032,12 +1047,12 @@ void QDirectFBPaintEnginePrivate::setRenderHints(QPainter::RenderHints hints)
     }
 }
 
-void QDirectFBPaintEnginePrivate::prepareForBlit(IDirectFBSurface *s)
+void QDirectFBPaintEnginePrivate::prepareForBlit(uint flags)
 {
     DFBSurfaceBlittingFlags blittingFlags = DSBLIT_NOFX;
-    if (QDirectFBScreen::isPremultiplied(QDirectFBScreen::getImageFormat(s)))
+    if (flags & Premultiplied)
         blittingFlags |= DSBLIT_SRC_PREMULTIPLY;
-    if (QDirectFBScreen::hasAlphaChannel(s))
+    if (flags & HasAlpha)
         blittingFlags |= DSBLIT_BLEND_ALPHACHANNEL;
     if (opacity != 255) {
         blittingFlags |= DSBLIT_BLEND_COLORALPHA;
@@ -1164,7 +1179,12 @@ void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPix
     Q_ASSERT(data->classId() == QPixmapData::DirectFBClass);
     QDirectFBPixmapData *dfbData = static_cast<QDirectFBPixmapData*>(data);
     IDirectFBSurface *sourceSurface = dfbData->directFBSurface();
-    prepareForBlit(sourceSurface);
+    uint blitFlags = 0;
+    if (dfbData->hasAlphaChannel())
+        blitFlags |= HasAlpha;
+    if (QDirectFBScreen::isPremultiplied(dfbData->pixelFormat()))
+        blitFlags |= Premultiplied;
+    prepareForBlit(blitFlags);
     QDirectFBPaintEnginePrivate::unlock(dfbData);
     const QSize pixmapSize = dfbData->size();
     if (transform.isScaling()) {
-- 
cgit v0.12


From 82c6a18bf017bb705ac5950d3ade86a492d64a0e Mon Sep 17 00:00:00 2001
From: Yann Bodson <yann.bodson@nokia.com>
Date: Tue, 9 Nov 2010 09:00:13 +1000
Subject: Fix QtQuick import.

---
 tests/auto/declarative/qdeclarativestates/data/QTBUG-14830.qml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/auto/declarative/qdeclarativestates/data/QTBUG-14830.qml b/tests/auto/declarative/qdeclarativestates/data/QTBUG-14830.qml
index 5eccdda..7f9ddbf 100644
--- a/tests/auto/declarative/qdeclarativestates/data/QTBUG-14830.qml
+++ b/tests/auto/declarative/qdeclarativestates/data/QTBUG-14830.qml
@@ -1,4 +1,4 @@
-import Qt 4.7
+import QtQuick 1.0
 
 Rectangle {
     width: 1024
-- 
cgit v0.12


From 6330e20da815890a5282dbe7ce9c2363e4b4c3b4 Mon Sep 17 00:00:00 2001
From: Yann Bodson <yann.bodson@nokia.com>
Date: Tue, 9 Nov 2010 09:16:29 +1000
Subject: Fix QML ecmascript autotest.

---
 .../qdeclarativeecmascript/data/outerBindingOverridesInnerBinding.qml  | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/outerBindingOverridesInnerBinding.qml b/tests/auto/declarative/qdeclarativeecmascript/data/outerBindingOverridesInnerBinding.qml
index 0a933e8..090c948 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/data/outerBindingOverridesInnerBinding.qml
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/outerBindingOverridesInnerBinding.qml
@@ -1,13 +1,14 @@
 import Qt.test 1.0
 
 MyQmlObject {
+    id: obj
     property alias c1: myConstants.c1
     property alias c2: myConstants.c2
     property int c3: 0
 
     objectProperty: ConstantsOverrideBindings { 
         id: myConstants 
-        c2: c3
+        c2: obj.c3
     }
 
 }
-- 
cgit v0.12


From a55c13c52822f337cc4ad708881fd54d3a1bbb1d Mon Sep 17 00:00:00 2001
From: juhvu <qt-info@nokia.com>
Date: Tue, 9 Nov 2010 10:45:18 +1000
Subject: Removed implicity QtGui linking from icd.pro as it is not needed.

Task-number: QTBUG-15059
---
 src/plugins/bearer/icd/icd.pro | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/plugins/bearer/icd/icd.pro b/src/plugins/bearer/icd/icd.pro
index 464cc1c..6700cda 100644
--- a/src/plugins/bearer/icd/icd.pro
+++ b/src/plugins/bearer/icd/icd.pro
@@ -1,7 +1,7 @@
 TARGET = qicdbearer
 include(../../qpluginbase.pri)
 
-QT += network dbus
+QT = core network dbus
 
 QMAKE_CXXFLAGS *= $$QT_CFLAGS_DBUS $$QT_CFLAGS_CONNSETTINGS
 LIBS += $$QT_LIBS_CONNSETTINGS
-- 
cgit v0.12


From bb8f085611f4cb91b7bde7220d407948edcc572c Mon Sep 17 00:00:00 2001
From: Lorn Potter <lorn.potter@nokia.com>
Date: Tue, 9 Nov 2010 11:19:01 +1000
Subject: get rid of dependency on QtGui

Task-number: QTBUG-15059
Reviewed-by: trustme
---
 src/plugins/bearer/corewlan/corewlan.pro       |  2 +-
 src/plugins/bearer/corewlan/qcorewlanengine.mm | 85 +++++++++++++++-----------
 2 files changed, 51 insertions(+), 36 deletions(-)

diff --git a/src/plugins/bearer/corewlan/corewlan.pro b/src/plugins/bearer/corewlan/corewlan.pro
index 922a501..9cb3955 100644
--- a/src/plugins/bearer/corewlan/corewlan.pro
+++ b/src/plugins/bearer/corewlan/corewlan.pro
@@ -1,7 +1,7 @@
 TARGET = qcorewlanbearer
 include(../../qpluginbase.pri)
 
-QT = core gui network
+QT = core network
 LIBS += -framework Foundation -framework SystemConfiguration
 
 contains(QT_CONFIG, corewlan) {
diff --git a/src/plugins/bearer/corewlan/qcorewlanengine.mm b/src/plugins/bearer/corewlan/qcorewlanengine.mm
index 844e38b..9946b17 100644
--- a/src/plugins/bearer/corewlan/qcorewlanengine.mm
+++ b/src/plugins/bearer/corewlan/qcorewlanengine.mm
@@ -64,12 +64,17 @@
 #include <Foundation/NSLock.h>
 
 #include <SystemConfiguration/SCNetworkConfiguration.h>
-#include <private/qt_cocoa_helpers_mac_p.h>
 #include "private/qcore_mac_p.h"
 
 #include <net/if.h>
 #include <ifaddrs.h>
 
+inline QString qt_NSStringToQString(const NSString *nsstr)
+{ return QCFString::toQString(reinterpret_cast<const CFStringRef>(nsstr)); }
+
+inline NSString *qt_QStringToNSString(const QString &qstr)
+{ return [reinterpret_cast<const NSString *>(QCFString::toCFStringRef(qstr)) autorelease]; }
+
 
 @interface QT_MANGLE_NAMESPACE(QNSListener) : NSObject
 {
@@ -93,11 +98,12 @@
 - (id) init
 {
     [locker lock];
-    QMacCocoaAutoReleasePool pool;
+    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
     notificationCenter = [NSNotificationCenter defaultCenter];
     currentInterface = [CWInterface interfaceWithName:nil];
     [notificationCenter addObserver:self selector:@selector(notificationHandler:) name:kCWPowerDidChangeNotification object:nil];
     [locker unlock];
+    [autoreleasepool release];
     return self;
 }
 
@@ -161,10 +167,10 @@ void QScanThread::quit()
 
 void QScanThread::run()
 {
-    QMacCocoaAutoReleasePool pool;
+    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
     QStringList found;
     mutex.lock();
-    CWInterface *currentInterface = [CWInterface interfaceWithName:qt_mac_QStringToNSString(interfaceName)];
+    CWInterface *currentInterface = [CWInterface interfaceWithName:qt_QStringToNSString(interfaceName)];
     mutex.unlock();
 
     if([currentInterface power]) {
@@ -182,14 +188,14 @@ void QScanThread::run()
             for(uint row=0; row < [apArray count]; row++ ) {
                 apNetwork = [apArray objectAtIndex:row];
 
-                const QString networkSsid = qt_mac_NSStringToQString([apNetwork ssid]);
+                const QString networkSsid = qt_NSStringToQString([apNetwork ssid]);
                 const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkSsid));
                 found.append(id);
 
                 QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Undefined;
                 bool known = isKnownSsid(networkSsid);
                 if( [currentInterface.interfaceState intValue] == kCWInterfaceStateRunning) {
-                    if( networkSsid == qt_mac_NSStringToQString( [currentInterface ssid])) {
+                    if( networkSsid == qt_NSStringToQString( [currentInterface ssid])) {
                         state = QNetworkConfiguration::Active;
                     }
                 }
@@ -232,7 +238,7 @@ void QScanThread::run()
             }
 
             if( [currentInterface.interfaceState intValue] == kCWInterfaceStateRunning) {
-                if( networkSsid == qt_mac_NSStringToQString([currentInterface ssid])) {
+                if( networkSsid == qt_NSStringToQString([currentInterface ssid])) {
                     state = QNetworkConfiguration::Active;
                 }
             }
@@ -251,6 +257,7 @@ void QScanThread::run()
         }
     }
     emit networksChanged();
+    [autoreleasepool release];
 }
 
 QStringList QScanThread::foundNetwork(const QString &id, const QString &name, const QNetworkConfiguration::StateFlags state, const QString &interfaceName, const QNetworkConfiguration::Purpose purpose)
@@ -290,7 +297,7 @@ void QScanThread::getUserConfigurations()
 {
     QMutexLocker locker(&mutex);
 
-    QMacCocoaAutoReleasePool pool;
+    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
     userProfiles.clear();
 
     NSArray *wifiInterfaces = [CWInterface supportedInterfaces];
@@ -310,10 +317,10 @@ void QScanThread::getUserConfigurations()
 
             NSArray *thisSsidarray = [prefNetDict valueForKey:@"SSID_STR"];
             for(NSString *ssidkey in thisSsidarray) {
-                QString thisSsid = qt_mac_NSStringToQString(ssidkey);
+                QString thisSsid = qt_NSStringToQString(ssidkey);
                 if(!userProfiles.contains(thisSsid)) {
                     QMap <QString,QString> map;
-                    map.insert(thisSsid, qt_mac_NSStringToQString(nsInterfaceName));
+                    map.insert(thisSsid, qt_NSStringToQString(nsInterfaceName));
                     userProfiles.insert(thisSsid, map);
                 }
             }
@@ -322,7 +329,7 @@ void QScanThread::getUserConfigurations()
 
         // 802.1X user profiles
         QString userProfilePath = QDir::homePath() + "/Library/Preferences/com.apple.eap.profiles.plist";
-        NSDictionary* eapDict = [[[NSDictionary alloc] initWithContentsOfFile:qt_mac_QStringToNSString(userProfilePath)] autorelease];
+        NSDictionary* eapDict = [[[NSDictionary alloc] initWithContentsOfFile:qt_QStringToNSString(userProfilePath)] autorelease];
         if(eapDict != nil) {
             NSString *profileStr= @"Profiles";
             NSString *nameStr = @"UserDefinedName";
@@ -341,15 +348,15 @@ void QScanThread::getUserConfigurations()
                         QString ssid;
                         for(int i = 0; i < dictSize; i++) {
                             if([nameStr isEqualToString:keys[i]]) {
-                                networkName = qt_mac_NSStringToQString(objects[i]);
+                                networkName = qt_NSStringToQString(objects[i]);
                             }
                             if([networkSsidStr isEqualToString:keys[i]]) {
-                                ssid = qt_mac_NSStringToQString(objects[i]);
+                                ssid = qt_NSStringToQString(objects[i]);
                             }
                             if(!userProfiles.contains(networkName)
                                 && !ssid.isEmpty()) {
                                 QMap<QString,QString> map;
-                                map.insert(ssid, qt_mac_NSStringToQString(nsInterfaceName));
+                                map.insert(ssid, qt_NSStringToQString(nsInterfaceName));
                                 userProfiles.insert(networkName, map);
                             }
                         }
@@ -358,6 +365,7 @@ void QScanThread::getUserConfigurations()
             }
         }
     }
+    [autoreleasepool release];
 }
 
 QString QScanThread::getSsidFromNetworkName(const QString &name)
@@ -434,7 +442,7 @@ QCoreWlanEngine::~QCoreWlanEngine()
 void QCoreWlanEngine::initialize()
 {
     QMutexLocker locker(&mutex);
-    QMacCocoaAutoReleasePool pool;
+    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
 
     if([[CWInterface supportedInterfaces] count] > 0 && !listener) {
         listener = [[QT_MANGLE_NAMESPACE(QNSListener) alloc] init];
@@ -446,6 +454,7 @@ void QCoreWlanEngine::initialize()
     storeSession = NULL;
 
     startNetworkChangeLoop();
+    [autoreleasepool release];
 }
 
 
@@ -466,11 +475,11 @@ bool QCoreWlanEngine::hasIdentifier(const QString &id)
 void QCoreWlanEngine::connectToId(const QString &id)
 {
     QMutexLocker locker(&mutex);
-    QMacCocoaAutoReleasePool pool;
+    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
     QString interfaceString = getInterfaceFromId(id);
 
     CWInterface *wifiInterface =
-        [CWInterface interfaceWithName: qt_mac_QStringToNSString(interfaceString)];
+        [CWInterface interfaceWithName: qt_QStringToNSString(interfaceString)];
 
     if ([wifiInterface power]) {
         NSError *err = nil;
@@ -488,9 +497,9 @@ void QCoreWlanEngine::connectToId(const QString &id)
             NSArray *array = [CW8021XProfile allUser8021XProfiles];
 
             for (NSUInteger i = 0; i < [array count]; ++i) {
-                const QString networkNameHashCheck = QString::number(qHash(QLatin1String("corewlan:") + qt_mac_NSStringToQString([[array objectAtIndex:i] userDefinedName])));
+                const QString networkNameHashCheck = QString::number(qHash(QLatin1String("corewlan:") + qt_NSStringToQString([[array objectAtIndex:i] userDefinedName])));
 
-                const QString ssidHash = QString::number(qHash(QLatin1String("corewlan:") + qt_mac_NSStringToQString([[array objectAtIndex:i] ssid])));
+                const QString ssidHash = QString::number(qHash(QLatin1String("corewlan:") + qt_NSStringToQString([[array objectAtIndex:i] ssid])));
 
                 if (id == networkNameHashCheck || id == ssidHash) {
                     const QString thisName = scanThread->getSsidFromNetworkName(id);
@@ -523,7 +532,7 @@ void QCoreWlanEngine::connectToId(const QString &id)
                                         [NSNumber numberWithBool:YES], kCWScanKeyMerge,
                                         [NSNumber numberWithInt:kCWScanTypeFast], kCWScanKeyScanType,
                                         [NSNumber numberWithInteger:100], kCWScanKeyRestTime,
-                                        qt_mac_QStringToNSString(wantedSsid), kCWScanKeySSID,
+                                        qt_QStringToNSString(wantedSsid), kCWScanKeySSID,
                                         nil];
 
         NSArray *scanArray = [wifiInterface scanForNetworksWithParameters:scanParameters error:&err];
@@ -532,7 +541,7 @@ void QCoreWlanEngine::connectToId(const QString &id)
             for(uint row=0; row < [scanArray count]; row++ ) {
                 CWNetwork *apNetwork = [scanArray objectAtIndex:row];
 
-                if(wantedSsid == qt_mac_NSStringToQString([apNetwork ssid])) {
+                if(wantedSsid == qt_NSStringToQString([apNetwork ssid])) {
 
                     if(!using8021X) {
                         SecKeychainAttribute attributes[3];
@@ -599,18 +608,19 @@ void QCoreWlanEngine::connectToId(const QString &id)
                             return;
                         }
                     } else {
-                        qDebug() <<"associate ERROR"<<  qt_mac_NSStringToQString([err localizedDescription ]);
+                        qDebug() <<"associate ERROR"<<  qt_NSStringToQString([err localizedDescription ]);
                     }
                 }
             } //end scan network
         } else {
-            qDebug() <<"scan ERROR"<<  qt_mac_NSStringToQString([err localizedDescription ]);
+            qDebug() <<"scan ERROR"<<  qt_NSStringToQString([err localizedDescription ]);
         }
         emit connectionError(id, InterfaceLookupError);
     }
 
     locker.unlock();
     emit connectionError(id, InterfaceLookupError);
+    [autoreleasepool release];
 }
 
 void QCoreWlanEngine::disconnectFromId(const QString &id)
@@ -618,10 +628,10 @@ void QCoreWlanEngine::disconnectFromId(const QString &id)
     QMutexLocker locker(&mutex);
 
     QString interfaceString = getInterfaceFromId(id);
-    QMacCocoaAutoReleasePool pool;
+    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
 
     CWInterface *wifiInterface =
-        [CWInterface interfaceWithName: qt_mac_QStringToNSString(interfaceString)];
+        [CWInterface interfaceWithName: qt_QStringToNSString(interfaceString)];
 
     [wifiInterface disassociate];
     if ([[wifiInterface interfaceState]intValue] != kCWInterfaceStateInactive) {
@@ -629,6 +639,7 @@ void QCoreWlanEngine::disconnectFromId(const QString &id)
         emit connectionError(id, DisconnectionError);
         locker.relock();
     }
+    [autoreleasepool release];
 }
 
 void QCoreWlanEngine::requestUpdate()
@@ -641,27 +652,30 @@ void QCoreWlanEngine::doRequestUpdate()
 {
     QMutexLocker locker(&mutex);
 
-    QMacCocoaAutoReleasePool pool;
+    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
 
     NSArray *wifiInterfaces = [CWInterface supportedInterfaces];
     for (uint row = 0; row < [wifiInterfaces count]; ++row) {
-            scanThread->interfaceName = qt_mac_NSStringToQString([wifiInterfaces objectAtIndex:row]);
+            scanThread->interfaceName = qt_NSStringToQString([wifiInterfaces objectAtIndex:row]);
             scanThread->start();
     }
     locker.unlock();
+    [autoreleasepool release];
 }
 
 bool QCoreWlanEngine::isWifiReady(const QString &wifiDeviceName)
 {
     QMutexLocker locker(&mutex);
-
+    bool haswifi = false;
     if(hasWifi) {
-        QMacCocoaAutoReleasePool pool;
-        CWInterface *defaultInterface = [CWInterface interfaceWithName: qt_mac_QStringToNSString(wifiDeviceName)];
-        if([defaultInterface power])
-            return true;
+        NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
+        CWInterface *defaultInterface = [CWInterface interfaceWithName: qt_QStringToNSString(wifiDeviceName)];
+        if([defaultInterface power]) {
+            haswifi = true;
+        }
+        [autoreleasepool release];
     }
-    return false;
+    return haswifi;
 }
 
 
@@ -853,7 +867,7 @@ quint64 QCoreWlanEngine::bytesReceived(const QString &id)
 quint64 QCoreWlanEngine::startTime(const QString &id)
 {
     QMutexLocker locker(&mutex);
-    QMacCocoaAutoReleasePool pool;
+    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
     quint64 timestamp = 0;
 
     NSString *filePath = @"/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist";
@@ -884,7 +898,7 @@ quint64 QCoreWlanEngine::startTime(const QString &id)
                 bool ok = false;
                 for(int i = 0; i < dictSize; i++) {
                     if([ssidStr isEqualToString:keys[i]]) {
-                        const QString ident = QString::number(qHash(QLatin1String("corewlan:") + qt_mac_NSStringToQString(objects[i])));
+                        const QString ident = QString::number(qHash(QLatin1String("corewlan:") + qt_NSStringToQString(objects[i])));
                         if(ident == id) {
                             ok = true;
                         }
@@ -900,6 +914,7 @@ quint64 QCoreWlanEngine::startTime(const QString &id)
             }
         }
     }
+    [autoreleasepool release];
     return timestamp;
 }
 
-- 
cgit v0.12


From 9b24932eba2b204852c4f2b35e05bd7d9d47ccea Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Tue, 9 Nov 2010 12:40:48 +1000
Subject: Fix Rectangle painting at small sizes. We require a minimum size of
 5x5 for the border image caching to work.

Task-number: QTBUG-15135
Reviewed-by: Michael Brasser
---
 src/declarative/graphicsitems/qdeclarativerectangle.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/declarative/graphicsitems/qdeclarativerectangle.cpp b/src/declarative/graphicsitems/qdeclarativerectangle.cpp
index 1ffd3bd..fc3954f 100644
--- a/src/declarative/graphicsitems/qdeclarativerectangle.cpp
+++ b/src/declarative/graphicsitems/qdeclarativerectangle.cpp
@@ -477,7 +477,8 @@ void QDeclarativeRectangle::drawRect(QPainter &p)
 {
     Q_D(QDeclarativeRectangle);
     if ((d->gradient && d->gradient->gradient())
-        || d->radius > width()/2 || d->radius > height()/2) {
+        || d->radius > width()/2 || d->radius > height()/2
+        || width() < 3 || height() < 3) {
         // XXX This path is still slower than the image path
         // Image path won't work for gradients or invalid radius though
         bool oldAA = p.testRenderHint(QPainter::Antialiasing);
-- 
cgit v0.12


From 736a73ac2d05bcc811ee8eaeb6aa7a026d6b018a Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Tue, 9 Nov 2010 14:33:16 +1000
Subject: Fix Text::elide docs.

Reviewed-by: Michael Brasser
---
 src/declarative/graphicsitems/qdeclarativetext.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/declarative/graphicsitems/qdeclarativetext.cpp b/src/declarative/graphicsitems/qdeclarativetext.cpp
index 615c619..82c444e 100644
--- a/src/declarative/graphicsitems/qdeclarativetext.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetext.cpp
@@ -1063,7 +1063,7 @@ void QDeclarativeText::setTextFormat(TextFormat format)
     Set this property to elide parts of the text fit to the Text item's width.
     The text will only elide if an explicit width has been set.
 
-    This property cannot be used with wrapping enabled or with rich text.
+    This property cannot be used with multi-line text or with rich text.
 
     Eliding can be:
     \list
-- 
cgit v0.12


From 58f8196fceaf375d8a5736e0505330be24bcebfa Mon Sep 17 00:00:00 2001
From: Warwick Allison <warwick.allison@nokia.com>
Date: Tue, 9 Nov 2010 17:48:29 +1000
Subject: doc

---
 examples/declarative/cppextensions/plugins/README | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/examples/declarative/cppextensions/plugins/README b/examples/declarative/cppextensions/plugins/README
index fe519f8..95e0eea 100644
--- a/examples/declarative/cppextensions/plugins/README
+++ b/examples/declarative/cppextensions/plugins/README
@@ -5,5 +5,5 @@ by a C++ plugin (providing the "Time" type), and by QML files (providing the
 To run:
 
   make install
-  qml -I . plugins.qml
+  qmlviewer -I . plugins.qml
 
-- 
cgit v0.12


From 8aee86b8ce4700f48b8a30752cb2293860957bb7 Mon Sep 17 00:00:00 2001
From: Kent Hansen <kent.hansen@nokia.com>
Date: Tue, 9 Nov 2010 09:20:36 +0100
Subject: Fix GC-related crash in QScriptValue::setData()

Yet another missing API shim.
When converting the QScriptValue to JSC, a JSCell may be allocated,
which can cause the GC to trigger.
If an identifier (JSC::Identifier) is then garbage collected, the
destructor will try to remove itself from the currentIdentifierTable().
Because the API shim was missing, the identifier table was 0.
It's difficult to create a bulletproof test for this case, but the
attached test is a best effort (it crashes on my machine without the
fix).

Task-number: QTBUG-15144
Reviewed-by: Jedrzej Nowacki
---
 src/script/api/qscriptvalue.cpp              |  1 +
 tests/auto/qscriptvalue/tst_qscriptvalue.cpp | 13 +++++++++++++
 tests/auto/qscriptvalue/tst_qscriptvalue.h   |  1 +
 3 files changed, 15 insertions(+)

diff --git a/src/script/api/qscriptvalue.cpp b/src/script/api/qscriptvalue.cpp
index f494106..e40458b 100644
--- a/src/script/api/qscriptvalue.cpp
+++ b/src/script/api/qscriptvalue.cpp
@@ -2036,6 +2036,7 @@ void QScriptValue::setData(const QScriptValue &data)
     Q_D(QScriptValue);
     if (!d || !d->isObject())
         return;
+    QScript::APIShim shim(d->engine);
     JSC::JSValue other = d->engine->scriptValueToJSCValue(data);
     if (d->jscValue.inherits(&QScriptObject::info)) {
         QScriptObject *scriptObject = static_cast<QScriptObject*>(JSC::asObject(d->jscValue));
diff --git a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp
index 639df36..53e2699 100644
--- a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp
+++ b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp
@@ -2253,6 +2253,19 @@ void tst_QScriptValue::getSetData()
     QVERIFY(!object.data().isValid());
 }
 
+void tst_QScriptValue::setData_QTBUG15144()
+{
+    QScriptEngine eng;
+    QScriptValue obj = eng.newObject();
+    for (int i = 0; i < 10000; ++i) {
+        // Create an object with property 'fooN' on it, and immediately kill
+        // the reference to the object so it and the property name become garbage.
+        eng.evaluate(QString::fromLatin1("o = {}; o.foo%0 = 10; o = null;").arg(i));
+        // Setting the data will cause a JS string to be allocated, which could
+        // trigger a GC. This should not cause a crash.
+        obj.setData("foodfight");
+    }
+}
 class TestScriptClass : public QScriptClass
 {
 public:
diff --git a/tests/auto/qscriptvalue/tst_qscriptvalue.h b/tests/auto/qscriptvalue/tst_qscriptvalue.h
index 462749a..aa6bc6c 100644
--- a/tests/auto/qscriptvalue/tst_qscriptvalue.h
+++ b/tests/auto/qscriptvalue/tst_qscriptvalue.h
@@ -216,6 +216,7 @@ private slots:
     void getSetProperty();
     void arrayElementGetterSetter();
     void getSetData();
+    void setData_QTBUG15144();
     void getSetScriptClass();
     void call();
     void construct();
-- 
cgit v0.12


From 55911952c7b195e36614372d084c473202ab1c44 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Tue, 9 Nov 2010 10:53:43 +0100
Subject: Fixed tst_qwidget::testContentsPropagation auto-test failure.

Some auto-tests render into a QPixmap and check the result against
QPixmap::grabWidget(). Change acc1a2bd5520369c made grabWidget() render
into a QImage to be able to preserve background transparency. Instead,
to avoid breaking various auto-tests, we can use a QPixmap and fill it
with transparent if the widget's isOpaque flag is not set.

Task-number: QTBUG-14945
Reviewed-by: Kim
---
 src/gui/image/qpixmap.cpp | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp
index 290c0f0..c5d9a7e 100644
--- a/src/gui/image/qpixmap.cpp
+++ b/src/gui/image/qpixmap.cpp
@@ -1101,11 +1101,13 @@ QPixmap QPixmap::grabWidget(QWidget * widget, const QRect &rect)
     if (!r.intersects(widget->rect()))
         return QPixmap();
 
-    QImage res(r.size(), QImage::Format_ARGB32_Premultiplied);
-    res.fill(0);
+    QPixmap res(r.size());
+    if (!qt_widget_private(widget)->isOpaque)
+        res.fill(Qt::transparent);
+
     widget->d_func()->render(&res, QPoint(), r, QWidget::DrawWindowBackground
                              | QWidget::DrawChildren | QWidget::IgnoreMask, true);
-    return QPixmap::fromImage(res);
+    return res;
 }
 
 /*!
-- 
cgit v0.12


From d50fb14395e8ea35d09bdfc8bb420f051b6c140a Mon Sep 17 00:00:00 2001
From: Sami Merila <sami.merila@nokia.com>
Date: Tue, 9 Nov 2010 12:50:09 +0200
Subject: QS60Style: Color calculation should be optimized

Currently, QS60Style calculates some palette colors (tooltip base and
button). Since native side does not have a color for these, but a
nine-part theme graphic, the style tries to estimate the color of the
bitmap by taking a small sample of the QPixmap and calculate the
RGB colors of 32*32 pixels. This is rather slow, it takes around
110 msecs for each QApplication, when the application is started.
Note that color is cached to member variable of style, but it is very
rarely asked again (as the color is polished to all widgets/apps)
and the cache is not shared across processes.

As a fix, style now calculates the button color (tooltip color
is no longer calculated, as no other QStyle does that, and
tooltips do not anyway work in the Qt/Symbian) and stores the
calculated value to Global QSettings together with active theme
ID. Now, when a second Qt application is launched, the stored
theme ID value is matched with currently active theme. If it
matches, then the stored Button color is used. Otherwise, color
is again calculated and stored. If theme is unchanged, the
application launch is ~95msecs faster.

Task-number: QTBUG-14860
Reviewed-by: Jani Hautakangas
---
 src/gui/styles/qs60style.cpp     | 107 ++++++++++++++++++---------------------
 src/gui/styles/qs60style_p.h     |   7 ++-
 src/gui/styles/qs60style_s60.cpp |  75 +++++++++++++++++++++++++++
 3 files changed, 130 insertions(+), 59 deletions(-)

diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp
index f3fb2f5..5e5adab 100644
--- a/src/gui/styles/qs60style.cpp
+++ b/src/gui/styles/qs60style.cpp
@@ -405,13 +405,14 @@ void QS60StylePrivate::clearCaches(CacheClearReason reason)
         QPixmapCache::clear();
         break;
     case CC_ThemeChange:
-        m_colorCache.clear();
         QPixmapCache::clear();
+#ifdef Q_WS_S60
+        deleteStoredSettings();
+#endif
         deleteBackground();
         break;
     case CC_UndefinedChange:
     default:
-        m_colorCache.clear();
         m_mappedFontsCache.clear();
         QPixmapCache::clear();
         deleteBackground();
@@ -419,64 +420,53 @@ void QS60StylePrivate::clearCaches(CacheClearReason reason)
     }
 }
 
-// Since S60Style has 'button' and 'tooltip' as a graphic, we don't have any native color which to use
-// for QPalette::Button and QPalette::ToolTipBase. Therefore S60Style needs to guesstimate
-// palette colors by calculating average rgb values for button pixels.
-// Returns Qt::black if there is an issue with the graphics (image is NULL, or no bits() found).
-QColor QS60StylePrivate::colorFromFrameGraphics(SkinFrameElements frame) const
+QColor QS60StylePrivate::calculatedColor(SkinFrameElements frame) const
 {
-    const bool cachedColorExists = m_colorCache.contains(frame);
-    if (!cachedColorExists) {
-        const int frameCornerWidth = pixelMetric(PM_FrameCornerWidth);
-        const int frameCornerHeight = pixelMetric(PM_FrameCornerHeight);
-        Q_ASSERT(2 * frameCornerWidth < 32);
-        Q_ASSERT(2 * frameCornerHeight < 32);
-
-        const QImage frameImage = QS60StylePrivate::frame(frame, QSize(32, 32)).toImage();
-        Q_ASSERT(frameImage.bytesPerLine() > 0);
-        if (frameImage.isNull())
-            return Qt::black;
-
-        const QRgb *pixelRgb = (const QRgb*)frameImage.bits();
-        const int pixels = frameImage.byteCount()/sizeof(QRgb);
-
-        int estimatedRed = 0;
-        int estimatedGreen = 0;
-        int estimatedBlue = 0;
-
-        int skips = 0;
-        int estimations = 0;
-
-        const int topBorderLastPixel = frameCornerHeight*frameImage.width() - 1;
-        const int bottomBorderFirstPixel = frameImage.width() * frameImage.height() - frameCornerHeight*frameImage.width() - 1;
-        const int rightBorderFirstPixel = frameImage.width() - frameCornerWidth;
-        const int leftBorderLastPixel = frameCornerWidth;
-
-        while ((skips + estimations) < pixels) {
-            if ((skips + estimations) > topBorderLastPixel &&
-                (skips + estimations) < bottomBorderFirstPixel) {
-                for (int rowIndex = 0; rowIndex < frameImage.width(); rowIndex++) {
-                    if (rowIndex > leftBorderLastPixel &&
-                        rowIndex < rightBorderFirstPixel) {
-                        estimatedRed += qRed(*pixelRgb);
-                        estimatedGreen += qGreen(*pixelRgb);
-                        estimatedBlue += qBlue(*pixelRgb);
-                    }
-                    pixelRgb++;
-                    estimations++;
+    const int frameCornerWidth = pixelMetric(PM_FrameCornerWidth);
+    const int frameCornerHeight = pixelMetric(PM_FrameCornerHeight);
+    Q_ASSERT(2 * frameCornerWidth < 32);
+    Q_ASSERT(2 * frameCornerHeight < 32);
+
+    const QImage frameImage = QS60StylePrivate::frame(frame, QSize(32, 32)).toImage();
+    Q_ASSERT(frameImage.bytesPerLine() > 0);
+    if (frameImage.isNull())
+        return Qt::black;
+
+    const QRgb *pixelRgb = (const QRgb*)frameImage.constBits();
+    const int pixels = frameImage.byteCount() / sizeof(QRgb);
+
+    int estimatedRed = 0;
+    int estimatedGreen = 0;
+    int estimatedBlue = 0;
+
+    int skips = 0;
+    int estimations = 0;
+
+    const int topBorderLastPixel = frameCornerHeight * frameImage.width() - 1;
+    const int bottomBorderFirstPixel = frameImage.width() * frameImage.height() - topBorderLastPixel;
+    const int rightBorderFirstPixel = frameImage.width() - frameCornerWidth;
+    const int leftBorderLastPixel = frameCornerWidth;
+
+    while ((skips + estimations) < pixels) {
+        if ((skips + estimations) > topBorderLastPixel &&
+            (skips + estimations) < bottomBorderFirstPixel) {
+            for (int rowIndex = 0; rowIndex < frameImage.width(); rowIndex++) {
+                if (rowIndex > leftBorderLastPixel &&
+                    rowIndex < rightBorderFirstPixel) {
+                    estimatedRed += qRed(*pixelRgb);
+                    estimatedGreen += qGreen(*pixelRgb);
+                    estimatedBlue += qBlue(*pixelRgb);
                 }
-            } else {
                 pixelRgb++;
-                skips++;
+                estimations++;
             }
+        } else {
+            pixelRgb++;
+            skips++;
         }
-        QColor frameColor(estimatedRed/estimations, estimatedGreen/estimations, estimatedBlue/estimations);
-        m_colorCache.insert(frame, frameColor);
-        return !estimations ? Qt::black : frameColor;
-    } else {
-        return m_colorCache.value(frame);
     }
-
+    QColor frameColor(estimatedRed/estimations, estimatedGreen/estimations, estimatedBlue/estimations);
+    return !estimations ? Qt::black : frameColor;
 }
 
 void QS60StylePrivate::setThemePalette(QApplication *app) const
@@ -731,11 +721,14 @@ void QS60StylePrivate::setThemePalette(QPalette *palette) const
     palette->setBrush(QPalette::Window, backgroundTexture());
     // set as transparent so that styled full screen theme background is visible
     palette->setBrush(QPalette::Base, Qt::transparent);
-    // set button and tooltipbase based on pixel colors
+    // set button color based on pixel colors
+#ifndef Q_WS_S60
+    //For emulated style, just calculate the color everytime
+    const QColor buttonColor = calculatedColor(SF_ButtonNormal);
+#else
     const QColor buttonColor = colorFromFrameGraphics(SF_ButtonNormal);
+#endif
     palette->setColor(QPalette::Button, buttonColor);
-    const QColor toolTipColor = colorFromFrameGraphics(SF_ToolTip);
-    palette->setColor(QPalette::ToolTipBase, toolTipColor);
     palette->setColor(QPalette::Light, palette->color(QPalette::Button).lighter());
     palette->setColor(QPalette::Dark, palette->color(QPalette::Button).darker());
     palette->setColor(QPalette::Midlight, palette->color(QPalette::Button).lighter(125));
diff --git a/src/gui/styles/qs60style_p.h b/src/gui/styles/qs60style_p.h
index b46f75e..7a7991a 100644
--- a/src/gui/styles/qs60style_p.h
+++ b/src/gui/styles/qs60style_p.h
@@ -523,8 +523,12 @@ public:
     static bool isSingleClickUi();
     static bool isWidgetPressed(const QWidget *widget);
 
-    // calculates average color based on button skin graphics (minus borders).
+#ifdef Q_WS_S60
+    static void deleteStoredSettings();
+    // calculates average color based on theme graphics (minus borders).
     QColor colorFromFrameGraphics(SkinFrameElements frame) const;
+#endif    
+    QColor calculatedColor(SkinFrameElements frame) const;
 
     //set theme palette for application
     void setThemePalette(QApplication *application) const;
@@ -542,7 +546,6 @@ public:
     static const int m_numberOfLayouts;
 
     mutable QHash<QPair<QS60StyleEnums::FontCategories , int>, QFont> m_mappedFontsCache;
-    mutable QHash<SkinFrameElements, QColor> m_colorCache;
 
     // Has one entry per SkinFrameElements
     static const struct frameElementCenter {
diff --git a/src/gui/styles/qs60style_s60.cpp b/src/gui/styles/qs60style_s60.cpp
index a1ea308..204699d 100644
--- a/src/gui/styles/qs60style_s60.cpp
+++ b/src/gui/styles/qs60style_s60.cpp
@@ -48,6 +48,7 @@
 #include "private/qpixmap_s60_p.h"
 #include "private/qcore_symbian_p.h"
 #include "qapplication.h"
+#include "qsettings.h"
 
 #include "qpluginloader.h"
 #include "qlibraryinfo.h"
@@ -69,6 +70,8 @@
 #include <gulicon.h>
 #include <AknBitmapAnimation.h>
 
+#include <centralrepository.h>
+
 #if !defined(QT_NO_STYLE_S60) || defined(QT_PLUGIN)
 
 QT_BEGIN_NAMESPACE
@@ -81,6 +84,8 @@ enum TDrawType {
     ENoDraw
 };
 
+const TUid personalisationUID = { 0x101F876F };
+
 enum TSupportRelease {
     ES60_None     = 0x0000, //indicates that the commonstyle should draw the graphics
     ES60_3_1      = 0x0001,
@@ -689,6 +694,76 @@ bool QS60StylePrivate::isSingleClickUi()
     return (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0);
 }
 
+void QS60StylePrivate::deleteStoredSettings()
+{
+    QSettings settings(QSettings::UserScope, QLatin1String("Trolltech"));
+    settings.beginGroup(QLatin1String("QS60Style"));
+    settings.remove("");
+    settings.endGroup();
+}
+
+// Since S60Style has 'button' as a graphic, we don't have any native color which to use
+// for QPalette::Button. Therefore S60Style needs to guesstimate palette color by calculating
+// average rgb values for button pixels.
+// Returns Qt::black if there is an issue with the graphics (image is NULL, or no constBits() found).
+QColor QS60StylePrivate::colorFromFrameGraphics(SkinFrameElements frame) const
+{
+#ifndef QT_NO_SETTINGS
+    TInt themeID = 0;    
+    //First we need to fetch active theme ID. We need to store the themeID at the same time
+    //as color, so that we can later check if the stored color is still from the same theme.
+    //Native side stores active theme UID/Timestamp into central repository.
+    int error = 0;
+    QT_TRAP_THROWING(
+        CRepository *themeRepository = CRepository::NewLC(personalisationUID);
+        if (themeRepository) {
+            static const TInt KThemePkgIDDesSize = 23; //size of the stored theme package ID
+            TBuf<32> value; //themeID is currently max of 8 + 1 + 8 characters, but lets have some extra space 
+            const TUint32 key = 0x00000002; //active theme key in the repository
+            error = themeRepository->Get(key, value);
+            if (error == KErrNone) {
+                TLex lex(value);                
+                TPtrC numberToken(lex.NextToken());
+                if(numberToken.Length())
+                    error = TLex(numberToken).Val(themeID);
+                else
+                    error = KErrArgument;
+            }
+        }
+        CleanupStack::PopAndDestroy(themeRepository);
+    );
+
+    QSettings settings(QSettings::UserScope, QLatin1String("Trolltech"));
+    settings.beginGroup(QLatin1String("QS60Style"));
+    if (themeID != 0) {
+        QVariant buttonColor = settings.value(QLatin1String("ButtonColor"));
+        if (!buttonColor.isNull()) {
+            //there is a stored color value, lets see if the theme ID matches
+            if (error == KErrNone) {
+                QVariant themeUID = settings.value(QLatin1String("ThemeUID"));
+                if (!themeUID.isNull() && themeUID.toInt() == themeID) {
+                    QColor storedColor(buttonColor.value<QColor>());
+                    if (storedColor.isValid())
+                        return storedColor;
+                }
+            }
+            settings.remove(""); //if color was invalid, or theme has been changed, just delete all stored settings
+        }
+    }
+#endif
+
+    QColor color = calculatedColor(frame);
+
+#ifndef QT_NO_SETTINGS
+    settings.setValue(QLatin1String("ThemeUID"), QVariant(themeID));
+    if (frame == SF_ButtonNormal) //other colors are not currently calculated from graphics
+        settings.setValue(QLatin1String("ButtonColor"), QVariant(color));
+    settings.endGroup();
+#endif
+
+    return color;
+}
+
 QPoint qt_s60_fill_background_offset(const QWidget *targetWidget)
 {
     CCoeControl *control = targetWidget->effectiveWinId();
-- 
cgit v0.12


From 0870d766b9e302081ba31a9c8f6dfa3a1e8c1e52 Mon Sep 17 00:00:00 2001
From: Sami Merila <sami.merila@nokia.com>
Date: Tue, 9 Nov 2010 12:53:07 +0200
Subject: QS60Style: Color calculation should be optimized

Addendum to the previous fix. Remove trailing white space as well.

Task-number: QTBUG-14860
Reviewed-by: Jani Hautakangas
---
 src/gui/styles/qs60style_p.h     | 2 +-
 src/gui/styles/qs60style_s60.cpp | 8 ++++----
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/gui/styles/qs60style_p.h b/src/gui/styles/qs60style_p.h
index 7a7991a..db4285d 100644
--- a/src/gui/styles/qs60style_p.h
+++ b/src/gui/styles/qs60style_p.h
@@ -527,7 +527,7 @@ public:
     static void deleteStoredSettings();
     // calculates average color based on theme graphics (minus borders).
     QColor colorFromFrameGraphics(SkinFrameElements frame) const;
-#endif    
+#endif
     QColor calculatedColor(SkinFrameElements frame) const;
 
     //set theme palette for application
diff --git a/src/gui/styles/qs60style_s60.cpp b/src/gui/styles/qs60style_s60.cpp
index 204699d..7b75d40 100644
--- a/src/gui/styles/qs60style_s60.cpp
+++ b/src/gui/styles/qs60style_s60.cpp
@@ -709,7 +709,7 @@ void QS60StylePrivate::deleteStoredSettings()
 QColor QS60StylePrivate::colorFromFrameGraphics(SkinFrameElements frame) const
 {
 #ifndef QT_NO_SETTINGS
-    TInt themeID = 0;    
+    TInt themeID = 0;
     //First we need to fetch active theme ID. We need to store the themeID at the same time
     //as color, so that we can later check if the stored color is still from the same theme.
     //Native side stores active theme UID/Timestamp into central repository.
@@ -718,13 +718,13 @@ QColor QS60StylePrivate::colorFromFrameGraphics(SkinFrameElements frame) const
         CRepository *themeRepository = CRepository::NewLC(personalisationUID);
         if (themeRepository) {
             static const TInt KThemePkgIDDesSize = 23; //size of the stored theme package ID
-            TBuf<32> value; //themeID is currently max of 8 + 1 + 8 characters, but lets have some extra space 
+            TBuf<32> value; //themeID is currently max of 8 + 1 + 8 characters, but lets have some extra space
             const TUint32 key = 0x00000002; //active theme key in the repository
             error = themeRepository->Get(key, value);
             if (error == KErrNone) {
-                TLex lex(value);                
+                TLex lex(value);
                 TPtrC numberToken(lex.NextToken());
-                if(numberToken.Length())
+                if (numberToken.Length())
                     error = TLex(numberToken).Val(themeID);
                 else
                     error = KErrArgument;
-- 
cgit v0.12


From 0a56b91991a4cce23634173eda4c5bafcd53230b Mon Sep 17 00:00:00 2001
From: Harald Fernengel <harald.fernengel@nokia.com>
Date: Tue, 9 Nov 2010 12:39:14 +0100
Subject: Make operator QRectF const
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This allows us to convert a QGLRect to a QRectF also in const functions.
Function is inline and private, no ABI break.

Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
---
 src/opengl/gl2paintengineex/qgl2pexvertexarray_p.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/opengl/gl2paintengineex/qgl2pexvertexarray_p.h b/src/opengl/gl2paintengineex/qgl2pexvertexarray_p.h
index 46029b9..b8c1018 100644
--- a/src/opengl/gl2paintengineex/qgl2pexvertexarray_p.h
+++ b/src/opengl/gl2paintengineex/qgl2pexvertexarray_p.h
@@ -93,7 +93,7 @@ struct QGLRect
     GLfloat right;
     GLfloat bottom;
 
-    operator QRectF() {return QRectF(left, top, right-left, bottom-top);}
+    operator QRectF() const {return QRectF(left, top, right-left, bottom-top);}
 };
 
 class QGL2PEXVertexArray
-- 
cgit v0.12


From 3df77bed668febf207591b88bebd73e4a17c8f23 Mon Sep 17 00:00:00 2001
From: Sergio Ahumada <sergio.ahumada@nokia.com>
Date: Tue, 9 Nov 2010 12:59:11 +0100
Subject: Doc: Fixing typo

---
 src/multimedia/audio/qaudiooutput_win32_p.cpp              | 2 +-
 src/opengl/gl2paintengineex/qglengineshadermanager_p.h     | 2 +-
 src/opengl/qgl_egl.cpp                                     | 2 +-
 src/opengl/qgl_x11egl.cpp                                  | 2 +-
 src/opengl/qpixmapdata_x11gl_egl.cpp                       | 4 ++--
 src/plugins/bearer/symbian/qnetworksession_impl.cpp        | 2 +-
 src/plugins/graphicssystems/meego/qmeegographicssystem.cpp | 4 ++--
 src/qt3support/canvas/q3canvas.cpp                         | 2 +-
 src/qt3support/text/q3richtext.cpp                         | 2 +-
 src/scripttools/debugging/qscriptdebuggeragent.cpp         | 6 +++---
 src/xmlpatterns/data/qabstractfloat.cpp                    | 2 +-
 src/xmlpatterns/data/qatomicvalue.cpp                      | 2 +-
 src/xmlpatterns/data/qschematime_p.h                       | 2 +-
 src/xmlpatterns/schema/qxsdschemaparser.cpp                | 8 ++++----
 src/xmlpatterns/schema/qxsdschemaparser_setup.cpp          | 2 +-
 src/xmlpatterns/schema/qxsdstatemachine_p.h                | 4 ++--
 src/xmlpatterns/type/qtypechecker.cpp                      | 2 +-
 tools/linguist/linguist/mainwindow.cpp                     | 4 ++--
 tools/linguist/linguist/printout.cpp                       | 2 +-
 tools/qdoc3/tokenizer.h                                    | 2 +-
 20 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/src/multimedia/audio/qaudiooutput_win32_p.cpp b/src/multimedia/audio/qaudiooutput_win32_p.cpp
index 1f304e3..1b054e5 100644
--- a/src/multimedia/audio/qaudiooutput_win32_p.cpp
+++ b/src/multimedia/audio/qaudiooutput_win32_p.cpp
@@ -586,7 +586,7 @@ bool QAudioOutputPrivate::deviceReady()
                 }
             }
             if ( out < l) {
-                // Didnt write all data
+                // Didn't write all data
                 audioSource->seek(audioSource->pos()-(l-out));
             }
 	    if(startup)
diff --git a/src/opengl/gl2paintengineex/qglengineshadermanager_p.h b/src/opengl/gl2paintengineex/qglengineshadermanager_p.h
index 92cf108..536b44a 100644
--- a/src/opengl/gl2paintengineex/qglengineshadermanager_p.h
+++ b/src/opengl/gl2paintengineex/qglengineshadermanager_p.h
@@ -72,7 +72,7 @@
     The position shaders for brushes look scary. This is because many of the
     calculations which logically belong in the fragment shader have been moved
     into the vertex shader to improve performance. This is why the position
-    calculation is in a seperate shader. Not only does it calculate the
+    calculation is in a separate shader. Not only does it calculate the
     position, but it also calculates some data to be passed to the fragment
     shader as a varying. It is optimal to move as much of the calculation as
     possible into the vertex shader as this is executed less often.
diff --git a/src/opengl/qgl_egl.cpp b/src/opengl/qgl_egl.cpp
index 27f7ad9..8902099 100644
--- a/src/opengl/qgl_egl.cpp
+++ b/src/opengl/qgl_egl.cpp
@@ -88,7 +88,7 @@ void qt_eglproperties_set_glformat(QEglProperties& eglProperties, const QGLForma
     // put in the list before 32-bit configs. So, to make sure 16-bit is preffered over 32-bit,
     // we must set the red/green/blue sizes to zero. This has an unfortunate consequence that
     // if the application sets the red/green/blue size to 5/6/5 on the QGLFormat, they will
-    // probably get a 32-bit config, even when there's an RGB565 config avaliable. Oh well.
+    // probably get a 32-bit config, even when there's an RGB565 config available. Oh well.
 
     // Now normalize the values so -1 becomes 0
     redSize   = redSize   > 0 ? redSize   : 0;
diff --git a/src/opengl/qgl_x11egl.cpp b/src/opengl/qgl_x11egl.cpp
index 9d28de0..d33ea56 100644
--- a/src/opengl/qgl_x11egl.cpp
+++ b/src/opengl/qgl_x11egl.cpp
@@ -377,7 +377,7 @@ QGLTexture *QGLContextPrivate::bindTextureFromNativePixmap(QPixmap *pixmap, cons
         checkedForEglImageTFP = true;
 
         // We need to be able to create an EGLImage from a native pixmap, which was split
-        // into a seperate EGL extension, EGL_KHR_image_pixmap. It is possible to have
+        // into a separate EGL extension, EGL_KHR_image_pixmap. It is possible to have
         // eglCreateImageKHR & eglDestroyImageKHR without support for pixmaps, so we must
         // check we have the EGLImage from pixmap functionality.
         if (QEgl::hasExtension("EGL_KHR_image") || QEgl::hasExtension("EGL_KHR_image_pixmap")) {
diff --git a/src/opengl/qpixmapdata_x11gl_egl.cpp b/src/opengl/qpixmapdata_x11gl_egl.cpp
index 2c11a0b..5cbc836 100644
--- a/src/opengl/qpixmapdata_x11gl_egl.cpp
+++ b/src/opengl/qpixmapdata_x11gl_egl.cpp
@@ -93,7 +93,7 @@ public:
             if (rgbConfig == argbConfig)
                 argbContext = rgbContext;
 
-            // Otherwise, create a seperate context to be used for ARGB pixmaps:
+            // Otherwise, create a separate context to be used for ARGB pixmaps:
             if (!argbContext) {
                 argbContext = new QEglContext;
                 argbContext->setConfig(argbConfig);
@@ -314,7 +314,7 @@ QPaintEngine* QX11GLPixmapData::paintEngine() const
         Q_ASSERT(ctx->d_func()->eglContext == 0);
         ctx->d_func()->eglContext = hasAlphaChannel() ? sharedContexts()->argbContext : sharedContexts()->rgbContext;
 
-        // While we use a seperate QGLContext for each pixmap, the underlying QEglContext is
+        // While we use a separate QGLContext for each pixmap, the underlying QEglContext is
         // the same. So we must use a "fake" QGLContext and fool the texture cache into thinking
         // each pixmap's QGLContext is sharing with this central one. The only place this is
         // going to fail is where we the underlying EGL RGB and ARGB contexts aren't sharing.
diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.cpp b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
index 85723ce..c5a39e1 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
@@ -1078,7 +1078,7 @@ void QNetworkSessionPrivateImpl::RunL()
             TInt error = KErrNone;
             QNetworkConfiguration newActiveConfig = activeConfiguration();
             if (!newActiveConfig.isValid()) {
-                // RConnection startup was successfull but no configuration
+                // RConnection startup was successful but no configuration
                 // was found. That indicates that user has chosen to create a
                 // new WLAN configuration (from scan results), but that new
                 // configuration does not have access to Internet (Internet
diff --git a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
index a633e2f..073d722 100644
--- a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
+++ b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
@@ -83,7 +83,7 @@ QWindowSurface* QMeeGoGraphicsSystem::createWindowSurface(QWidget *widget) const
 QPixmapData *QMeeGoGraphicsSystem::createPixmapData(QPixmapData::PixelType type) const
 {
     // Long story short: without this it's possible to hit an 
-    // unitialized paintDevice due to a Qt bug too complex to even 
+    // uninitialized paintDevice due to a Qt bug too complex to even 
     // explain here... not to mention fix without going crazy. 
     // MDK
     QGLShareContextScope ctx(qt_gl_share_widget()->context());
@@ -301,4 +301,4 @@ bool qt_meego_live_texture_release(QPixmap *pixmap, QImage *image)
 Qt::HANDLE qt_meego_live_texture_get_handle(QPixmap *pixmap)
 {
     return QMeeGoGraphicsSystem::getLiveTextureHandle(pixmap);
-}
\ No newline at end of file
+}
diff --git a/src/qt3support/canvas/q3canvas.cpp b/src/qt3support/canvas/q3canvas.cpp
index 959c435..1b4706d 100644
--- a/src/qt3support/canvas/q3canvas.cpp
+++ b/src/qt3support/canvas/q3canvas.cpp
@@ -1030,7 +1030,7 @@ void Q3Canvas::setUpdatePeriod(int ms)
 
     The advance takes place in two phases. In phase 0, the
     Q3CanvasItem::advance() function of each Q3CanvasItem::animated()
-    canvas item is called with paramater 0. Then all these canvas
+    canvas item is called with parameter 0. Then all these canvas
     items are called again, with parameter 1. In phase 0, the canvas
     items should not change position, merely examine other items on
     the canvas for which special processing is required, such as
diff --git a/src/qt3support/text/q3richtext.cpp b/src/qt3support/text/q3richtext.cpp
index d82d0f0..e24eeb5 100644
--- a/src/qt3support/text/q3richtext.cpp
+++ b/src/qt3support/text/q3richtext.cpp
@@ -2914,7 +2914,7 @@ QString Q3TextDocument::selectedText(int id, bool asRichText) const
         }
     }
     // ### workaround for plain text export until we get proper
-    // mime types: turn unicode line seperators into the more
+    // mime types: turn unicode line separators into the more
     // widely understood \n. Makes copy and pasting code snipplets
     // from within Assistent possible
     QChar* uc = (QChar*) s.unicode();
diff --git a/src/scripttools/debugging/qscriptdebuggeragent.cpp b/src/scripttools/debugging/qscriptdebuggeragent.cpp
index 551f6c3..9362639 100644
--- a/src/scripttools/debugging/qscriptdebuggeragent.cpp
+++ b/src/scripttools/debugging/qscriptdebuggeragent.cpp
@@ -116,7 +116,7 @@ QScriptDebuggerAgent::~QScriptDebuggerAgent()
 /*!
   Instructs the agent to perform a "step into" operation.  This
   function returns immediately. The agent will report step completion
-  at a later time, i.e. when script statements are evaluted.
+  at a later time, i.e. when script statements are evaluated.
 */
 void QScriptDebuggerAgent::enterStepIntoMode(int count)
 {
@@ -129,7 +129,7 @@ void QScriptDebuggerAgent::enterStepIntoMode(int count)
 /*!
   Instructs the agent to perform a "step over" operation.  This
   function returns immediately. The agent will report step completion
-  at a later time, i.e. when script statements are evaluted.
+  at a later time, i.e. when script statements are evaluated.
 */
 void QScriptDebuggerAgent::enterStepOverMode(int count)
 {
@@ -146,7 +146,7 @@ void QScriptDebuggerAgent::enterStepOverMode(int count)
 /*!
   Instructs the agent to perform a "step out" operation.  This
   function returns immediately. The agent will report step completion
-  at a later time, i.e. when script statements are evaluted.
+  at a later time, i.e. when script statements are evaluated.
 */
 void QScriptDebuggerAgent::enterStepOutMode()
 {
diff --git a/src/xmlpatterns/data/qabstractfloat.cpp b/src/xmlpatterns/data/qabstractfloat.cpp
index d3384fe..9f0e4e0 100644
--- a/src/xmlpatterns/data/qabstractfloat.cpp
+++ b/src/xmlpatterns/data/qabstractfloat.cpp
@@ -118,7 +118,7 @@ bool AbstractFloat<isDouble>::isEqual(const xsDouble a, const xsDouble b)
         return qIsInf(a) && internalSignbit(a) == internalSignbit(b);
     else
     {
-        /* Preferrably, we would use std::numeric_limits<xsDouble>::espilon(), but
+        /* Preferably, we would use std::numeric_limits<xsDouble>::espilon(), but
          * we cannot since we cannot depend on the STL. The small xs:double value below,
          * was extracted by printing the std::numeric_limits<xsDouble>::epsilon() using
          * gdb. */
diff --git a/src/xmlpatterns/data/qatomicvalue.cpp b/src/xmlpatterns/data/qatomicvalue.cpp
index c4f3578..ecc78bf 100644
--- a/src/xmlpatterns/data/qatomicvalue.cpp
+++ b/src/xmlpatterns/data/qatomicvalue.cpp
@@ -65,7 +65,7 @@ QT_BEGIN_NAMESPACE
 
 /**
  * @file
- * @short Contains the implementation for AtomicValue. The defintion is in qitem_p.h.
+ * @short Contains the implementation for AtomicValue. The definition is in qitem_p.h.
  */
 
 using namespace QPatternist;
diff --git a/src/xmlpatterns/data/qschematime_p.h b/src/xmlpatterns/data/qschematime_p.h
index bd63714..bff065b 100644
--- a/src/xmlpatterns/data/qschematime_p.h
+++ b/src/xmlpatterns/data/qschematime_p.h
@@ -63,7 +63,7 @@ namespace QPatternist
     /**
      * @short Implements the value instance of the @c xs:time type.
      *
-     * The header file for this class was orignally called Time.h, but this
+     * The header file for this class was originally called Time.h, but this
      * clashed with a system header on MinGW.
      *
      * @author Frans Englich <frans.englich@nokia.com>
diff --git a/src/xmlpatterns/schema/qxsdschemaparser.cpp b/src/xmlpatterns/schema/qxsdschemaparser.cpp
index fd0b95c..585cf12 100644
--- a/src/xmlpatterns/schema/qxsdschemaparser.cpp
+++ b/src/xmlpatterns/schema/qxsdschemaparser.cpp
@@ -914,7 +914,7 @@ void XsdSchemaParser::parseRedefine()
                 redefinedType->setWxsSuperType(contextType);
 
                 // 3) remove the base type resolving job from the resolver as
-                //    we have set the base type here explicitely
+                //    we have set the base type here explicitly
                 m_parserContext->resolver()->removeSimpleRestrictionBase(redefinedType);
 
                 // 4) add the redefined type to the schema
@@ -963,7 +963,7 @@ void XsdSchemaParser::parseRedefine()
                 redefinedType->setWxsSuperType(contextType);
 
                 // 3) remove the base type resolving job from the resolver as
-                //    we have set the base type here explicitely
+                //    we have set the base type here explicitly
                 m_parserContext->resolver()->removeComplexBaseType(redefinedType);
 
                 // 4) add the redefined type to the schema
@@ -5781,7 +5781,7 @@ QString XsdSchemaParser::readNamespaceAttribute(const QString &attributeName, co
 
 SchemaType::DerivationConstraints XsdSchemaParser::readDerivationConstraintAttribute(const SchemaType::DerivationConstraints &allowedConstraints, const char *elementName)
 {
-    // first convert the flags into strings for easier comparision
+    // first convert the flags into strings for easier comparison
     QSet<QString> allowedContent;
     if (allowedConstraints & SchemaType::RestrictionConstraint)
         allowedContent.insert(QString::fromLatin1("restriction"));
@@ -5844,7 +5844,7 @@ SchemaType::DerivationConstraints XsdSchemaParser::readDerivationConstraintAttri
 
 NamedSchemaComponent::BlockingConstraints XsdSchemaParser::readBlockingConstraintAttribute(const NamedSchemaComponent::BlockingConstraints &allowedConstraints, const char *elementName)
 {
-    // first convert the flags into strings for easier comparision
+    // first convert the flags into strings for easier comparison
     QSet<QString> allowedContent;
     if (allowedConstraints & NamedSchemaComponent::RestrictionConstraint)
         allowedContent.insert(QString::fromLatin1("restriction"));
diff --git a/src/xmlpatterns/schema/qxsdschemaparser_setup.cpp b/src/xmlpatterns/schema/qxsdschemaparser_setup.cpp
index 88e5f93..dc4730e 100644
--- a/src/xmlpatterns/schema/qxsdschemaparser_setup.cpp
+++ b/src/xmlpatterns/schema/qxsdschemaparser_setup.cpp
@@ -53,7 +53,7 @@ using namespace QPatternist;
  * This page describes how to use DFAs for validating that the XML child tags of an
  * XML parent tag occur in the right order.
  *
- * To validate the occurence of XML tags one need a regular expression that describes
+ * To validate the occurrence of XML tags one need a regular expression that describes
  * which tags can appear how often in what context. For example the regular expression
  * of the global <em>attribute</em> tag in XML Schema is (annotation?, simpleType?).
  * That means the <em>attribute</em> tag can contain an <em>annotation</em> tag followed
diff --git a/src/xmlpatterns/schema/qxsdstatemachine_p.h b/src/xmlpatterns/schema/qxsdstatemachine_p.h
index 294eb50..62c6ab0 100644
--- a/src/xmlpatterns/schema/qxsdstatemachine_p.h
+++ b/src/xmlpatterns/schema/qxsdstatemachine_p.h
@@ -138,7 +138,7 @@ namespace QPatternist
             /**
              * Continues execution of the machine with the given input @p transition.
              *
-             * @return @c true if the transition was successfull, @c false otherwise.
+             * @return @c true if the transition was successful, @c false otherwise.
              */
             bool proceed(TransitionType transition);
 
@@ -154,7 +154,7 @@ namespace QPatternist
              * @note To use this method, inputEqualsTransition must be implemented
              *       to find the right transition to use.
              *
-             * @return @c true if the transition was successfull, @c false otherwise.
+             * @return @c true if the transition was successful, @c false otherwise.
              */
             template <typename InputType>
             bool proceed(InputType input);
diff --git a/src/xmlpatterns/type/qtypechecker.cpp b/src/xmlpatterns/type/qtypechecker.cpp
index 879fe0e..73f83b7 100644
--- a/src/xmlpatterns/type/qtypechecker.cpp
+++ b/src/xmlpatterns/type/qtypechecker.cpp
@@ -168,7 +168,7 @@ Expression::Ptr TypeChecker::verifyType(const Expression::Ptr &operand,
 
     /* Since we haven't exited yet, it means that the operandType is a super type
      * of reqType, and that there hence is a path down to it through the
-     * type hierachy -- but that doesn't neccessarily mean that a up-cast(down the
+     * type hierachy -- but that doesn't necessarily mean that a up-cast(down the
      * hierarchy) would succeed. */
 
     Expression::Ptr result(operand);
diff --git a/tools/linguist/linguist/mainwindow.cpp b/tools/linguist/linguist/mainwindow.cpp
index 18baa24..1189b99 100644
--- a/tools/linguist/linguist/mainwindow.cpp
+++ b/tools/linguist/linguist/mainwindow.cpp
@@ -2498,8 +2498,8 @@ void MainWindow::updateDanger(const MultiDataIndex &index, bool verbose)
             }
 
             if (m_ui.actionPlaceMarkerMatches->isChecked()) {
-                // Stores the occurence count of the place markers in the map placeMarkerIndexes.
-                // i.e. the occurence count of %1 is stored at placeMarkerIndexes[1],
+                // Stores the occurrence count of the place markers in the map placeMarkerIndexes.
+                // i.e. the occurrence count of %1 is stored at placeMarkerIndexes[1],
                 // count of %2 is stored at placeMarkerIndexes[2] etc.
                 // In the first pass, it counts all place markers in the sourcetext.
                 // In the second pass it (de)counts all place markers in the translation.
diff --git a/tools/linguist/linguist/printout.cpp b/tools/linguist/linguist/printout.cpp
index 581dc00..7ec6875 100644
--- a/tools/linguist/linguist/printout.cpp
+++ b/tools/linguist/linguist/printout.cpp
@@ -130,7 +130,7 @@ void PrintOut::addBox(int percent, const QString &text, Style style, Qt::Alignme
     cp.rect.setSize(QSize(cp.rect.width() + wd, qMax(cp.rect.height(), ht)));
 }
 
-// use init if inital vsize should be calculated (first breakPage call)
+// use init if initial vsize should be calculated (first breakPage call)
 void PrintOut::breakPage(bool init)
 {
     static const int LeftAlign = Qt::AlignLeft | Qt::AlignTop;
diff --git a/tools/qdoc3/tokenizer.h b/tools/qdoc3/tokenizer.h
index af617f1..1b33f6f 100644
--- a/tools/qdoc3/tokenizer.h
+++ b/tools/qdoc3/tokenizer.h
@@ -145,7 +145,7 @@ class Tokenizer
         int ch = getch();
         if (ch == EOF)
             return EOF;
-        // cast explicitily to make sure the value of ch 
+        // cast explicitly to make sure the value of ch 
         // is in range [0..255] to avoid assert messages 
         // when using debug CRT that checks its input.
         return int(uint(uchar(ch))); 
-- 
cgit v0.12


From 83fb9c38d3f176b132138675be64ab477e72fe88 Mon Sep 17 00:00:00 2001
From: Sergio Ahumada <sergio.ahumada@nokia.com>
Date: Tue, 9 Nov 2010 13:00:25 +0100
Subject: Doc: Fixing typo

---
 src/plugins/graphicssystems/meego/qmeegographicssystem.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
index 073d722..67d760c 100644
--- a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
+++ b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
@@ -83,7 +83,7 @@ QWindowSurface* QMeeGoGraphicsSystem::createWindowSurface(QWidget *widget) const
 QPixmapData *QMeeGoGraphicsSystem::createPixmapData(QPixmapData::PixelType type) const
 {
     // Long story short: without this it's possible to hit an 
-    // uninitialized paintDevice due to a Qt bug too complex to even 
+    // uninitialized paintDevice due to a Qt bug too complex to even
     // explain here... not to mention fix without going crazy. 
     // MDK
     QGLShareContextScope ctx(qt_gl_share_widget()->context());
-- 
cgit v0.12


From e48f03a052eaa5c175b373091a65238fa7755ed4 Mon Sep 17 00:00:00 2001
From: axis <qt-info@nokia.com>
Date: Tue, 9 Nov 2010 12:25:36 +0100
Subject: Fixed wrong include path in multimedia.

RevBy:    Miikka Heikkinen
---
 src/multimedia/audio/audio.pri | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/multimedia/audio/audio.pri b/src/multimedia/audio/audio.pri
index ae28a26..7b2f9ad 100644
--- a/src/multimedia/audio/audio.pri
+++ b/src/multimedia/audio/audio.pri
@@ -42,8 +42,8 @@ mac {
     wince*:LIBS += -lcoredll
 
 } else:symbian {
-    INCLUDEPATH += /epoc32/include/mmf/common
-    INCLUDEPATH += /epoc32/include/mmf/server
+    INCLUDEPATH += $${EPOCROOT}epoc32/include/mmf/common
+    INCLUDEPATH += $${EPOCROOT}epoc32/include/mmf/server
 
     HEADERS += $$PWD/qaudio_symbian_p.h \
                $$PWD/qaudiodeviceinfo_symbian_p.h \
-- 
cgit v0.12


From 7c59ffa73a569cb18acb05a1ee6c566f4878a1e2 Mon Sep 17 00:00:00 2001
From: Dominik Holland <dominik.holland@nokia.com>
Date: Tue, 9 Nov 2010 14:21:38 +0100
Subject: Fixed random crash in QGestureManager.

When the cachedGestures are cleaned, the Gestures should be removed in all QSets first, before the Delete.

Task: QT-4013
Reviewed By: Frederik Gladhorn
---
 src/gui/kernel/qgesturemanager.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/gui/kernel/qgesturemanager.cpp b/src/gui/kernel/qgesturemanager.cpp
index 6dd8127..5e9a0cb 100644
--- a/src/gui/kernel/qgesturemanager.cpp
+++ b/src/gui/kernel/qgesturemanager.cpp
@@ -171,6 +171,10 @@ void QGestureManager::cleanupCachedGestures(QObject *target, Qt::GestureType typ
             foreach (QGesture *g, gestures) {
                 m_deletedRecognizers.remove(g);
                 m_gestureToRecognizer.remove(g);
+                m_maybeGestures.remove(g);
+                m_activeGestures.remove(g);
+                m_gestureOwners.remove(g);
+                m_gestureTargets.remove(g);
             }
 
             qDeleteAll(gestures);
-- 
cgit v0.12


From 594420567e7bfbf4f7bce0845eaf4f7d7a1e9380 Mon Sep 17 00:00:00 2001
From: Sergio Ahumada <sergio.ahumada@nokia.com>
Date: Tue, 9 Nov 2010 15:57:24 +0100
Subject: Doc: Fixing typo

---
 qmake/generators/symbian/symbiancommon.cpp    | 4 ++--
 src/declarative/qml/qdeclarativeparser_p.h    | 2 +-
 src/gui/egl/qegl.cpp                          | 4 ++--
 src/gui/graphicsview/qgraphicsproxywidget.cpp | 2 +-
 src/gui/graphicsview/qgraphicssceneevent.cpp  | 2 +-
 src/gui/graphicsview/qgraphicswidget.cpp      | 2 +-
 src/gui/image/qimage_ssse3.cpp                | 2 +-
 src/gui/image/qxpmhandler.cpp                 | 2 +-
 src/gui/itemviews/qabstractitemview.cpp       | 6 +++---
 src/gui/itemviews/qtableview.cpp              | 4 ++--
 10 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/qmake/generators/symbian/symbiancommon.cpp b/qmake/generators/symbian/symbiancommon.cpp
index 6fea8fd..6cc9fe4 100644
--- a/qmake/generators/symbian/symbiancommon.cpp
+++ b/qmake/generators/symbian/symbiancommon.cpp
@@ -742,7 +742,7 @@ void SymbianCommonGenerator::readRssRules(QString &numberOfIcons,
                     newValues << itemList.join("\n");
                 }
             }
-            // Verify thet there is exactly one value in RSS_TAG_NBROFICONS
+            // Verify that there is exactly one value in RSS_TAG_NBROFICONS
             if (newKey == RSS_TAG_NBROFICONS) {
                 if (newValues.count() == 1) {
                     numberOfIcons = newValues[0];
@@ -751,7 +751,7 @@ void SymbianCommonGenerator::readRssRules(QString &numberOfIcons,
                             RSS_RULES_BASE, RSS_TAG_NBROFICONS);
                     continue;
                 }
-            // Verify thet there is exactly one value in RSS_TAG_ICONFILE
+            // Verify that there is exactly one value in RSS_TAG_ICONFILE
             } else if (newKey == RSS_TAG_ICONFILE) {
                 if (newValues.count() == 1) {
                     iconFile = newValues[0];
diff --git a/src/declarative/qml/qdeclarativeparser_p.h b/src/declarative/qml/qdeclarativeparser_p.h
index b4753df..77184c2 100644
--- a/src/declarative/qml/qdeclarativeparser_p.h
+++ b/src/declarative/qml/qdeclarativeparser_p.h
@@ -356,7 +356,7 @@ namespace QDeclarativeParser
         // True if the setting of this property will be deferred.  Set by the
         // QDeclarativeCompiler
         bool isDeferred;
-        // True if this property is a value-type psuedo-property
+        // True if this property is a value-type pseudo-property
         bool isValueTypeSubProperty;
 
         LocationSpan location;
diff --git a/src/gui/egl/qegl.cpp b/src/gui/egl/qegl.cpp
index af3b79a..9b41909 100644
--- a/src/gui/egl/qegl.cpp
+++ b/src/gui/egl/qegl.cpp
@@ -210,7 +210,7 @@ EGLConfig QEgl::defaultConfig(int devType, API api, ConfigOptions options)
     else
         configId = qgetenv("QT_GL_EGL_CONFIG");
     if (!configId.isEmpty()) {
-        // Overriden, so get the EGLConfig for the specified config ID:
+        // Overridden, so get the EGLConfig for the specified config ID:
         EGLint properties[] = {
             EGL_CONFIG_ID, (EGLint)configId.toInt(),
             EGL_NONE
@@ -267,7 +267,7 @@ EGLConfig QEgl::defaultConfig(int devType, API api, ConfigOptions options)
         configAttribs.setValue(EGL_STENCIL_SIZE, 1);
         configAttribs.setValue(EGL_SAMPLE_BUFFERS, 1);
 #ifndef QT_OPENGL_ES_2
-        // Aditionally, the GL1 engine likes to have a depth buffer for clipping
+        // Additionally, the GL1 engine likes to have a depth buffer for clipping
         configAttribs.setValue(EGL_DEPTH_SIZE, 1);
 #endif
     }
diff --git a/src/gui/graphicsview/qgraphicsproxywidget.cpp b/src/gui/graphicsview/qgraphicsproxywidget.cpp
index 320395e..e0eb3bb 100644
--- a/src/gui/graphicsview/qgraphicsproxywidget.cpp
+++ b/src/gui/graphicsview/qgraphicsproxywidget.cpp
@@ -1508,7 +1508,7 @@ int QGraphicsProxyWidget::type() const
   Creates a proxy widget for the given \a child of the widget
   contained in this proxy.
 
-  This function makes it possible to aquire proxies for
+  This function makes it possible to acquire proxies for
   non top-level widgets. For instance, you can embed a dialog,
   and then transform only one of its widgets.
 
diff --git a/src/gui/graphicsview/qgraphicssceneevent.cpp b/src/gui/graphicsview/qgraphicssceneevent.cpp
index a0ecd4c..d9ff655 100644
--- a/src/gui/graphicsview/qgraphicssceneevent.cpp
+++ b/src/gui/graphicsview/qgraphicssceneevent.cpp
@@ -1629,7 +1629,7 @@ QGraphicsSceneMoveEvent::~QGraphicsSceneMoveEvent()
 }
 
 /*!
-    Returns the old position (i.e., the position immediatly before the widget
+    Returns the old position (i.e., the position immediately before the widget
     was moved).
 
     \sa newPos(), QGraphicsItem::setPos()
diff --git a/src/gui/graphicsview/qgraphicswidget.cpp b/src/gui/graphicsview/qgraphicswidget.cpp
index 4a733be..e48f9a7 100644
--- a/src/gui/graphicsview/qgraphicswidget.cpp
+++ b/src/gui/graphicsview/qgraphicswidget.cpp
@@ -450,7 +450,7 @@ void QGraphicsWidget::setGeometry(const QRectF &rect)
     bottom.
 
     Contents margins are used by the assigned layout to define the placement
-    of subwidgets and layouts. Margins are particularily useful for widgets
+    of subwidgets and layouts. Margins are particularly useful for widgets
     that constrain subwidgets to only a section of its own geometry. For
     example, a group box with a layout will place subwidgets inside its frame,
     but below the title.
diff --git a/src/gui/image/qimage_ssse3.cpp b/src/gui/image/qimage_ssse3.cpp
index 9aed011..836d7b0 100644
--- a/src/gui/image/qimage_ssse3.cpp
+++ b/src/gui/image/qimage_ssse3.cpp
@@ -54,7 +54,7 @@ Q_GUI_EXPORT void QT_FASTCALL qt_convert_rgb888_to_rgb32_ssse3(quint32 *dst, con
 {
     quint32 *const end = dst + len;
 
-    // Prologue, align dst to 16 bytes. The alignement is done on dst because it has 4 store()
+    // Prologue, align dst to 16 bytes. The alignment is done on dst because it has 4 store()
     // for each 3 load() of src.
     const int offsetToAlignOn16Bytes = (4 - ((reinterpret_cast<quintptr>(dst) >> 2) & 0x3)) & 0x3;
     const int prologLength = qMin(len, offsetToAlignOn16Bytes);
diff --git a/src/gui/image/qxpmhandler.cpp b/src/gui/image/qxpmhandler.cpp
index b97afd3..453100c 100644
--- a/src/gui/image/qxpmhandler.cpp
+++ b/src/gui/image/qxpmhandler.cpp
@@ -766,7 +766,7 @@ static bool qt_get_named_xpm_rgb(const char *name_no_space, QRgb *rgb)
 {
     XPMRGBData x;
     x.name = name_no_space;
-    // Funtion bsearch() is supposed to be
+    // Function bsearch() is supposed to be
     // void *bsearch(const void *key, const void *base, ...
     // So why (char*)? Are there broken bsearch() declarations out there?
     XPMRGBData *r = (XPMRGBData *)bsearch((char *)&x, (char *)xpmRgbTbl, xpmRgbTblSize,
diff --git a/src/gui/itemviews/qabstractitemview.cpp b/src/gui/itemviews/qabstractitemview.cpp
index 95e92c9..7b81761 100644
--- a/src/gui/itemviews/qabstractitemview.cpp
+++ b/src/gui/itemviews/qabstractitemview.cpp
@@ -1166,7 +1166,7 @@ QAbstractItemView::EditTriggers QAbstractItemView::editTriggers() const
     \property QAbstractItemView::verticalScrollMode
     \brief how the view scrolls its contents in the vertical direction
 
-    This property controlls how the view scroll its contents vertically.
+    This property controls how the view scroll its contents vertically.
     Scrolling can be done either per pixel or per item.
 */
 
@@ -1192,7 +1192,7 @@ QAbstractItemView::ScrollMode QAbstractItemView::verticalScrollMode() const
     \property QAbstractItemView::horizontalScrollMode
     \brief how the view scrolls its contents in the horizontal direction
 
-    This property controlls how the view scroll its contents horizontally.
+    This property controls how the view scroll its contents horizontally.
     Scrolling can be done either per pixel or per item.
 */
 
@@ -1275,7 +1275,7 @@ bool QAbstractItemView::hasAutoScroll() const
     \property QAbstractItemView::autoScrollMargin
     \brief the size of the area when auto scrolling is triggered
 
-    This property controlls the size of the area at the edge of the viewport that
+    This property controls the size of the area at the edge of the viewport that
     triggers autoscrolling. The default value is 16 pixels.
 */
 void QAbstractItemView::setAutoScrollMargin(int margin)
diff --git a/src/gui/itemviews/qtableview.cpp b/src/gui/itemviews/qtableview.cpp
index 4492e53..dc45854 100644
--- a/src/gui/itemviews/qtableview.cpp
+++ b/src/gui/itemviews/qtableview.cpp
@@ -114,7 +114,7 @@ void QSpanCollection::updateSpan(QSpanCollection::Span *span, int old_height)
         }
     } else if (old_height > span->height()) {
         //remove the span from all the subspans lists that intersect the columns not covered anymore
-        Index::iterator it_y = index.lowerBound(-qMax(span->bottom(), span->top())); //qMax usefull if height is 0
+        Index::iterator it_y = index.lowerBound(-qMax(span->bottom(), span->top())); //qMax useful if height is 0
         Q_ASSERT(it_y != index.end()); //it_y must exist since the span is in the list
         while (-it_y.key() <= span->top() + old_height -1) {
             if (-it_y.key() > span->bottom()) {
@@ -1411,7 +1411,7 @@ void QTableView::paintEvent(QPaintEvent *event)
         }
 
         if (showGrid) {
-            // Find the bottom right (the last rows/coloumns might be hidden)
+            // Find the bottom right (the last rows/columns might be hidden)
             while (verticalHeader->isSectionHidden(verticalHeader->logicalIndex(bottom))) --bottom;
             QPen old = painter.pen();
             painter.setPen(gridPen);
-- 
cgit v0.12


From 2ec60d5a71a560460c884be36de8fbad467fb69d Mon Sep 17 00:00:00 2001
From: Harald Fernengel <harald.fernengel@nokia.com>
Date: Tue, 9 Nov 2010 17:32:15 +0100
Subject: Clear X11 structure before use

This squelches valgrind warnings about uninitialized reads

Task-number: QT-3973
Reviewed-by: Robert Griebl
---
 src/gui/kernel/qmotifdnd_x11.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/gui/kernel/qmotifdnd_x11.cpp b/src/gui/kernel/qmotifdnd_x11.cpp
index 3334455..3b79129 100644
--- a/src/gui/kernel/qmotifdnd_x11.cpp
+++ b/src/gui/kernel/qmotifdnd_x11.cpp
@@ -385,7 +385,10 @@ static void DndReadSourceProperty(Display * dpy,
 static void DndWriteReceiverProperty(Display * dpy, Window window,
                                      unsigned char protocol_style)
 {
-    DndReceiverProp receiver_prop ;
+    DndReceiverProp receiver_prop;
+
+    // squelch potential valgrind errors about uninitialized reads
+    memset(&receiver_prop, 0, sizeof(receiver_prop));
 
     receiver_prop.byte_order = DndByteOrder() ;
     receiver_prop.protocol_version = DND_PROTOCOL_VERSION;
-- 
cgit v0.12


From 11ac612190b7bd637ede068d2fe8063021a2a0eb Mon Sep 17 00:00:00 2001
From: Michael Brasser <michael.brasser@nokia.com>
Date: Wed, 10 Nov 2010 09:30:06 +1000
Subject: Document TextInput::select(start,end)

Task-number: QTBUG-15162
---
 .../graphicsitems/qdeclarativetextinput.cpp        | 23 ++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativetextinput.cpp b/src/declarative/graphicsitems/qdeclarativetextinput.cpp
index 2348478..0deacf8 100644
--- a/src/declarative/graphicsitems/qdeclarativetextinput.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextinput.cpp
@@ -460,10 +460,9 @@ QRect QDeclarativeTextInput::cursorRectangle() const
     text edit.
 
     Note that if selectionStart == selectionEnd then there is no current
-    selection. If you attempt to set selectionStart to a value outside of
-    the current text, selectionStart will not be changed.
+    selection.
 
-    \sa selectionEnd, cursorPosition, selectedText
+    \sa selectionEnd, cursorPosition, selectedText, select()
 */
 int QDeclarativeTextInput::selectionStart() const
 {
@@ -479,10 +478,9 @@ int QDeclarativeTextInput::selectionStart() const
     text edit.
 
     Note that if selectionStart == selectionEnd then there is no current
-    selection. If you attempt to set selectionEnd to a value outside of
-    the current text, selectionEnd will not be changed.
+    selection.
 
-    \sa selectionStart, cursorPosition, selectedText
+    \sa selectionStart, cursorPosition, selectedText, select()
 */
 int QDeclarativeTextInput::selectionEnd() const
 {
@@ -490,6 +488,19 @@ int QDeclarativeTextInput::selectionEnd() const
     return d->lastSelectionEnd;
 }
 
+/*!
+    \qmlmethod void TextInput::select(int start, int end)
+
+    Causes the text from \a start to \a end to be selected.
+
+    If either start or end is out of range, the selection is not changed.
+
+    After calling this, selectionStart will become the lesser
+    and selectionEnd will become the greater (regardless of the order passed
+    to this method).
+
+    \sa selectionStart, selectionEnd
+*/
 void QDeclarativeTextInput::select(int start, int end)
 {
     Q_D(QDeclarativeTextInput);
-- 
cgit v0.12


From bfd87980bdc3d835723f429a3e4dbe2d884bca27 Mon Sep 17 00:00:00 2001
From: Andrew den Exter <andrew.den-exter@nokia.com>
Date: Tue, 9 Nov 2010 16:42:10 +1000
Subject: Fix potential buffer overrun in QAudioInput windows implementation.

Don't write more than len bytes to the output buffer.

Task-number: QTBUG-14549 QTBUG-8578
Reviewed-by: Derick Hawcroft
---
 src/multimedia/audio/qaudioinput_win32_p.cpp | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/multimedia/audio/qaudioinput_win32_p.cpp b/src/multimedia/audio/qaudioinput_win32_p.cpp
index 1cde159..0ec2492 100644
--- a/src/multimedia/audio/qaudioinput_win32_p.cpp
+++ b/src/multimedia/audio/qaudioinput_win32_p.cpp
@@ -400,9 +400,12 @@ qint64 QAudioInputPrivate::read(char* data, qint64 len)
 		    resuming = false;
                 }
             } else {
+                l = qMin<qint64>(len, waveBlocks[header].dwBytesRecorded);
                 // push mode
-                memcpy(p,waveBlocks[header].lpData,waveBlocks[header].dwBytesRecorded);
-                l = waveBlocks[header].dwBytesRecorded;
+                memcpy(p, waveBlocks[header].lpData, l);
+
+                len -= l;
+
 #ifdef DEBUG_AUDIO
                 qDebug()<<"IN: "<<waveBlocks[header].dwBytesRecorded<<", OUT: "<<l;
 #endif
@@ -457,7 +460,7 @@ qint64 QAudioInputPrivate::read(char* data, qint64 len)
 
         mutex.lock();
         if(!pullMode) {
-	    if(l+period_size > len && waveFreeBlockCount == buffer_size/period_size)
+            if(len < period_size || waveFreeBlockCount == buffer_size/period_size)
 	        done = true;
 	} else {
 	    if(waveFreeBlockCount == buffer_size/period_size)
@@ -568,7 +571,7 @@ bool QAudioInputPrivate::deviceReady()
 
     if(pullMode) {
         // reads some audio data and writes it to QIODevice
-        read(0,0);
+        read(0, buffer_size);
     } else {
         // emits readyRead() so user will call read() on QIODevice to get some audio data
 	InputPrivate* a = qobject_cast<InputPrivate*>(audioSource);
-- 
cgit v0.12


From e3f1268e63064a54215051cf91d5f6b8c8bd4f0f Mon Sep 17 00:00:00 2001
From: Andrew den Exter <andrew.den-exter@nokia.com>
Date: Tue, 9 Nov 2010 16:30:32 +1000
Subject: Fix potential buffer overrun in ALSA QAudioInput implementation.

Don't write more than the supplied max buffer size to the output buffer.

Task-number: QTBUG-14549 QTBUG-8578
Reviewed-by: Derick Hawcroft
---
 src/multimedia/audio/qaudioinput_alsa_p.cpp | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/src/multimedia/audio/qaudioinput_alsa_p.cpp b/src/multimedia/audio/qaudioinput_alsa_p.cpp
index ddafa3d..5265915 100644
--- a/src/multimedia/audio/qaudioinput_alsa_p.cpp
+++ b/src/multimedia/audio/qaudioinput_alsa_p.cpp
@@ -482,19 +482,18 @@ int QAudioInputPrivate::bytesReady() const
 
 qint64 QAudioInputPrivate::read(char* data, qint64 len)
 {
-    Q_UNUSED(len)
-
     // Read in some audio data and write it to QIODevice, pull mode
     if ( !handle )
         return 0;
 
-    bytesAvailable = checkBytesReady();
+    // bytesAvaiable is saved as a side effect of checkBytesReady().
+    int bytesToRead = checkBytesReady();
 
-    if (bytesAvailable < 0) {
+    if (bytesToRead < 0) {
         // bytesAvailable as negative is error code, try to recover from it.
-        xrun_recovery(bytesAvailable);
-        bytesAvailable = checkBytesReady();
-        if (bytesAvailable < 0) {
+        xrun_recovery(bytesToRead);
+        bytesToRead = checkBytesReady();
+        if (bytesToRead < 0) {
             // recovery failed must stop and set error.
             close();
             errorState = QAudio::IOError;
@@ -504,9 +503,11 @@ qint64 QAudioInputPrivate::read(char* data, qint64 len)
         }
     }
 
+    bytesToRead = qMin<qint64>(len, bytesToRead);
+    bytesToRead -= bytesToRead % period_size;
     int count=0, err = 0;
     while(count < 5) {
-        int chunks = bytesAvailable/period_size;
+        int chunks = bytesToRead/period_size;
         int frames = chunks*period_frames;
         if(frames > (int)buffer_frames)
             frames = buffer_frames;
@@ -554,6 +555,7 @@ qint64 QAudioInputPrivate::read(char* data, qint64 len)
                     emit stateChanged(deviceState);
                 }
             } else {
+                bytesAvailable -= err;
                 totalTimeValue += err;
                 resuming = false;
                 if (deviceState != QAudio::ActiveState) {
@@ -566,6 +568,7 @@ qint64 QAudioInputPrivate::read(char* data, qint64 len)
 
         } else {
             memcpy(data,audioBuffer,err);
+            bytesAvailable -= err;
             totalTimeValue += err;
             resuming = false;
             if (deviceState != QAudio::ActiveState) {
@@ -661,7 +664,7 @@ bool QAudioInputPrivate::deviceReady()
 {
     if(pullMode) {
         // reads some audio data and writes it to QIODevice
-        read(0,0);
+        read(0, buffer_size);
     } else {
         // emits readyRead() so user will call read() on QIODevice to get some audio data
         InputPrivate* a = qobject_cast<InputPrivate*>(audioSource);
-- 
cgit v0.12


From cb1f6d24e0c834d633720102c7e8edc9801196fb Mon Sep 17 00:00:00 2001
From: Michael Brasser <michael.brasser@nokia.com>
Date: Wed, 10 Nov 2010 10:17:34 +1000
Subject: Document that Transitions are exclusive.

Task-number: QTBUG-15183
---
 src/declarative/util/qdeclarativetransition.cpp | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/declarative/util/qdeclarativetransition.cpp b/src/declarative/util/qdeclarativetransition.cpp
index 478c7f4..c8bc7b3 100644
--- a/src/declarative/util/qdeclarativetransition.cpp
+++ b/src/declarative/util/qdeclarativetransition.cpp
@@ -86,12 +86,16 @@ QT_BEGIN_NAMESPACE
     Item {
         ...
         transitions: [
-            Transition { ... },
+            Transition { to: "state1" ... },
             Transition { ... }
         ]
     }
     \endqml
 
+    If multiple Transitions are specified, only a single (best-matching) Transition will be applied for any particular
+    state change. In the example above, when changing to \c state1, the first transition will be used, rather
+    than the more generic second transition.
+
     If a state change has a Transition that matches the same property as a
     \l Behavior, the Transition animation overrides the \l Behavior for that
     state change.
-- 
cgit v0.12


From cd1a69ec3e27a4b6c0df692ec5bdbc9b789c74b4 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Wed, 10 Nov 2010 14:26:08 +1000
Subject: Flickable does not reposition its content when it is resized. Call
 fixup() after Flickable resize to ensure contents are within bounds.

Task-number: QTBUG-15173
Reviewed-by: Bea Lam
---
 src/declarative/graphicsitems/qdeclarativeflickable.cpp | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/src/declarative/graphicsitems/qdeclarativeflickable.cpp b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
index 01a8585..90cf9ed 100644
--- a/src/declarative/graphicsitems/qdeclarativeflickable.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
@@ -1029,6 +1029,13 @@ void QDeclarativeFlickable::geometryChanged(const QRectF &newGeometry,
             d->contentItem->setWidth(width());
             emit contentWidthChanged();
         }
+        // Make sure that we're entirely in view.
+        if (!d->pressed && !d->movingHorizontally && !d->movingVertically) {
+            int oldDuration = d->fixupDuration;
+            d->fixupDuration = 0;
+            d->fixupX();
+            d->fixupDuration = oldDuration;
+        }
     }
     if (newGeometry.height() != oldGeometry.height()) {
         if (yflick())
@@ -1037,6 +1044,13 @@ void QDeclarativeFlickable::geometryChanged(const QRectF &newGeometry,
             d->contentItem->setHeight(height());
             emit contentHeightChanged();
         }
+        // Make sure that we're entirely in view.
+        if (!d->pressed && !d->movingHorizontally && !d->movingVertically) {
+            int oldDuration = d->fixupDuration;
+            d->fixupDuration = 0;
+            d->fixupY();
+            d->fixupDuration = oldDuration;
+        }
     }
 
     if (changed)
-- 
cgit v0.12


From 339f3d9ca43987dc2dba022ec964fa43c702cb12 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Wed, 10 Nov 2010 10:50:50 +0100
Subject: Fixed a shell syntax error in configure

When you have EPOCROOT environment variable, but compiling for desktop
Linux, the configure script showed a shell syntax error and failed to set
the install prefix, making "install" target to install to the build
directory.

Task-number: QTBUG-15008
Reviewed-by: axis
Reviewed-by: Oswald Buddenhagen
---
 configure | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/configure b/configure
index 1b2abf4..a238300 100755
--- a/configure
+++ b/configure
@@ -3314,12 +3314,9 @@ if [ -z "$QT_INSTALL_PREFIX" ]; then
         if [ "$PLATFORM" != "$XPLATFORM" ]; then
             QT_INSTALL_PREFIX="${QT_INSTALL_PREFIX}-${CFG_ARCH}"
         fi
-    elif [ -d "$EPOCROOT" ]; then
-        case "$XPLATFORM" in *symbian*)
-            QT_INSTALL_PREFIX="$EPOCROOT/epoc32/"
-            QT_INSTALL_LIBS="$EPOCROOT/epoc32/release/armv5/lib/"
-            ;;
-        esac
+    elif [ -d "$EPOCROOT" ] && echo $XPLATFORM | grep symbian > /dev/null; then
+        QT_INSTALL_PREFIX="$EPOCROOT/epoc32/"
+        QT_INSTALL_LIBS="$EPOCROOT/epoc32/release/armv5/lib/"
     else
         QT_INSTALL_PREFIX="/usr/local/Trolltech/Qt-${QT_VERSION}" # the default install prefix is /usr/local/Trolltech/Qt-$QT_VERSION
     fi
-- 
cgit v0.12


From 7e1a598296e89e498fd0c27fc0951f059d1e6ffe Mon Sep 17 00:00:00 2001
From: Harald Fernengel <harald.fernengel@nokia.com>
Date: Wed, 10 Nov 2010 11:10:00 +0100
Subject: fix tst_headers

Fix the generator and the generated file to ensure that the string
"generated" appears in the first line.
---
 tests/benchmarks/corelib/tools/qstring/data.cpp        | 3 ++-
 tests/benchmarks/corelib/tools/qstring/generatelist.pl | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/tests/benchmarks/corelib/tools/qstring/data.cpp b/tests/benchmarks/corelib/tools/qstring/data.cpp
index a674336..d44a796 100644
--- a/tests/benchmarks/corelib/tools/qstring/data.cpp
+++ b/tests/benchmarks/corelib/tools/qstring/data.cpp
@@ -1,6 +1,7 @@
+// This is a generated file - DO NOT EDIT
+
 #include "data.h"
 
-// This is a generated file - DO NOT EDIT
 const ushort stringCollectionData[] __attribute__((aligned(16))) = {
     // #0
     65535,
diff --git a/tests/benchmarks/corelib/tools/qstring/generatelist.pl b/tests/benchmarks/corelib/tools/qstring/generatelist.pl
index 8c8eb20..48a8518 100644
--- a/tests/benchmarks/corelib/tools/qstring/generatelist.pl
+++ b/tests/benchmarks/corelib/tools/qstring/generatelist.pl
@@ -103,9 +103,10 @@ sub printUshortArray($$$) {
     return ($offset + $headpadding, $offset + $headpadding + $len + $tailpadding);
 }
 
+print "// This is a generated file - DO NOT EDIT\n\n";
+
 print "#include \"data.h\"\n\n";
 
-print "// This is a generated file - DO NOT EDIT\n";
 print "const ushort stringCollectionData[] __attribute__((aligned(64))) = {\n";
 $count = 0;
 $offset = 0;
-- 
cgit v0.12


From 722d25d7a4fb0bc64d5bceae40019c7a8f3a9251 Mon Sep 17 00:00:00 2001
From: Gareth Stockwell <ext-gareth.stockwell@nokia.com>
Date: Tue, 9 Nov 2010 16:44:55 +0000
Subject: Use $${EPOCROOT} variable rather than absolute paths in .pro files

Task-number: QTBUG-15156
Reviewed-by: Miikka Heikkinen
---
 src/plugins/phonon/mmf/mmf.pro | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/plugins/phonon/mmf/mmf.pro b/src/plugins/phonon/mmf/mmf.pro
index ac11188..691fc80 100644
--- a/src/plugins/phonon/mmf/mmf.pro
+++ b/src/plugins/phonon/mmf/mmf.pro
@@ -18,7 +18,7 @@ symbian {
 	# This is necessary because both epoc32/include and Phonon contain videoplayer.h.
 	# By making /epoc32/include the first SYSTEMINCLUDE, we ensure that
 	# '#include <videoplayer.h>' picks up the Symbian header, as intended.
-	PREPEND_INCLUDEPATH = /epoc32/include
+	PREPEND_INCLUDEPATH = $${EPOCROOT}epoc32/include
 
 	PREPEND_INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty
 
-- 
cgit v0.12


From 8d88491d44fdbad7e9d6ea618f14b5230e03d6f1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 10 Nov 2010 11:05:04 +0100
Subject: Fixed tst_qpixmap::grabWidget autotest failure on QWS.

We need to use the same rendering to compute the expected pixmap as used
in QPixmap::grabWidget(), or the results will look different on a 16-bit
display, as QPixmap::fromImage(ARGB32_Premultiplied_image) will get a
different internal image format compared to QPixmap pixmap(size);
pixmap.fill(Qt::transparent);

Reviewed-by: Kim
---
 tests/auto/qpixmap/tst_qpixmap.cpp | 54 ++++++++++++++++++++++----------------
 1 file changed, 32 insertions(+), 22 deletions(-)

diff --git a/tests/auto/qpixmap/tst_qpixmap.cpp b/tests/auto/qpixmap/tst_qpixmap.cpp
index a733d56..51e6cf5 100644
--- a/tests/auto/qpixmap/tst_qpixmap.cpp
+++ b/tests/auto/qpixmap/tst_qpixmap.cpp
@@ -812,33 +812,43 @@ void tst_QPixmap::drawBitmap()
 
 void tst_QPixmap::grabWidget()
 {
-    QWidget widget;
-    QImage image(128, 128, QImage::Format_ARGB32_Premultiplied);
-    for (int row = 0; row < image.height(); ++row) {
-        QRgb *line = reinterpret_cast<QRgb *>(image.scanLine(row));
-        for (int col = 0; col < image.width(); ++col)
-            line[col] = qRgba(rand() & 255, row, col, 127);
-    }
+    for (int opaque = 0; opaque < 2; ++opaque) {
+        QWidget widget;
+        QImage image(128, 128, opaque ? QImage::Format_RGB32 : QImage::Format_ARGB32_Premultiplied);
+        for (int row = 0; row < image.height(); ++row) {
+            QRgb *line = reinterpret_cast<QRgb *>(image.scanLine(row));
+            for (int col = 0; col < image.width(); ++col)
+                line[col] = qRgba(rand() & 255, row, col, opaque ? 255 : 127);
+        }
 
-    QPalette pal = widget.palette();
-    pal.setBrush(QPalette::Window, QBrush(image));
-    widget.setPalette(pal);
-    widget.resize(128, 128);
+        QPalette pal = widget.palette();
+        pal.setBrush(QPalette::Window, QBrush(image));
+        widget.setPalette(pal);
+        widget.resize(128, 128);
 
-    QPixmap expected = QPixmap::fromImage(QImage(image.scanLine(64) + 64 * 4, 64, 64, image.bytesPerLine(), image.format()));
-    QPixmap actual = QPixmap::grabWidget(&widget, QRect(64, 64, 64, 64));
-    QVERIFY(lenientCompare(actual, expected));
+        QPixmap expected(64, 64);
+        if (!opaque)
+            expected.fill(Qt::transparent);
 
-    actual = QPixmap::grabWidget(&widget, 64, 64);
-    QVERIFY(lenientCompare(actual, expected));
+        QPainter p(&expected);
+        p.translate(-64, -64);
+        p.drawTiledPixmap(0, 0, 128, 128, pal.brush(QPalette::Window).texture(), 0, 0);
+        p.end();
 
-    // Make sure a widget that is not yet shown is grabbed correctly.
-    QTreeWidget widget2;
-    actual = QPixmap::grabWidget(&widget2);
-    widget2.show();
-    expected = QPixmap::grabWidget(&widget2);
+        QPixmap actual = QPixmap::grabWidget(&widget, QRect(64, 64, 64, 64));
+        QVERIFY(lenientCompare(actual, expected));
 
-    QVERIFY(lenientCompare(actual, expected));
+        actual = QPixmap::grabWidget(&widget, 64, 64);
+        QVERIFY(lenientCompare(actual, expected));
+
+        // Make sure a widget that is not yet shown is grabbed correctly.
+        QTreeWidget widget2;
+        actual = QPixmap::grabWidget(&widget2);
+        widget2.show();
+        expected = QPixmap::grabWidget(&widget2);
+
+        QVERIFY(lenientCompare(actual, expected));
+    }
 }
 
 void tst_QPixmap::grabWindow()
-- 
cgit v0.12


From b7d91c0d798bc10dd4f8a750723285076fb96935 Mon Sep 17 00:00:00 2001
From: Gabriel de Dietrich <gabriel.dietrich-de@nokia.com>
Date: Wed, 10 Nov 2010 13:21:02 +0100
Subject: Fix auto-test regression in tst_QDoubleValidator

The locale from a previous test was not cleared.

Another issue has been detected, though, and reported as QTBUG-15210.

Reviewed-by: Thierry
---
 tests/auto/qdoublevalidator/tst_qdoublevalidator.cpp | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/tests/auto/qdoublevalidator/tst_qdoublevalidator.cpp b/tests/auto/qdoublevalidator/tst_qdoublevalidator.cpp
index 3470456..98c4740 100644
--- a/tests/auto/qdoublevalidator/tst_qdoublevalidator.cpp
+++ b/tests/auto/qdoublevalidator/tst_qdoublevalidator.cpp
@@ -218,6 +218,9 @@ void tst_QDoubleValidator::validate_data()
     QTest::newRow("data_QTBUG_14935-1") << "de" << 0.0 << 1.0 << 5 << QString("0.31") << ACC << ACC;
     QTest::newRow("data_QTBUG_14935-2") << "de" << 0.0 << 1000000.0 << 5 << QString("3.123") << ACC << ACC;
     QTest::newRow("data_QTBUG_14935-3") << "de" << 0.0 << 1000000.0 << 5 << QString("123,345.678") << ACC << ACC;
+
+    QTest::newRow("data_de_problem-1") << "de" << 0.0 << 10.0 << 0 << QString("1.0") << ITM << ITM;
+    QTest::newRow("data_de_problem-2") << "de" << 0.0 << 10.0 << 0 << QString("0.1") << INV << INV;
 }
 
 void tst_QDoubleValidator::validate()
@@ -230,6 +233,9 @@ void tst_QDoubleValidator::validate()
     QFETCH(QValidator::State, scientific_state);
     QFETCH(QValidator::State, standard_state);
 
+    QEXPECT_FAIL("data_de_problem-1", "To be fixed. See QTBUG-15210.", Abort);
+    QEXPECT_FAIL("data_de_problem-2", "To be fixed. See QTBUG-15210.", Abort);
+
     QLocale::setDefault(QLocale(localeName));
 
     QDoubleValidator dv(minimum, maximum, decimals, 0);
@@ -312,6 +318,8 @@ void tst_QDoubleValidator::validateIntEquiv()
     QFETCH(QString, input);
     QFETCH(QValidator::State, state);
 
+    QLocale::setDefault(QLocale("C"));
+
     QDoubleValidator dv(minimum, maximum, 0, 0);
     dv.setNotation(QDoubleValidator::StandardNotation);
     int dummy;
-- 
cgit v0.12


From 7cc777265b5d6c5e87c86283b4061f2632952a8c Mon Sep 17 00:00:00 2001
From: Christiaan Janssen <christiaan.janssen@nokia.com>
Date: Wed, 10 Nov 2010 14:42:24 +0100
Subject: QDeclarativeDebug: Keep source information when changing an
 expression

Copy over the source code location of an expression when it is changed throu
the debugging facilities. This enables JavaScript breakpoints to be hit even
after the source code of the function has changed.

Task-number: QTCREATORBUG-2824
Reviewed-by: Kai Koehne
---
 src/declarative/qml/qdeclarativeenginedebug.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/declarative/qml/qdeclarativeenginedebug.cpp b/src/declarative/qml/qdeclarativeenginedebug.cpp
index ed28185..bffe681 100644
--- a/src/declarative/qml/qdeclarativeenginedebug.cpp
+++ b/src/declarative/qml/qdeclarativeenginedebug.cpp
@@ -502,7 +502,8 @@ void QDeclarativeEngineDebugServer::setBinding(int objectId,
             property.write(expression);
         } else if (hasValidSignal(object, propertyName)) {
             QDeclarativeExpression *declarativeExpression = new QDeclarativeExpression(context, object, expression.toString());
-            QDeclarativePropertyPrivate::setSignalExpression(property, declarativeExpression);
+            QDeclarativeExpression *oldExpression = QDeclarativePropertyPrivate::setSignalExpression(property, declarativeExpression);
+            declarativeExpression->setSourceLocation(oldExpression->sourceFile(), oldExpression->lineNumber());
         } else if (property.isProperty()) {
             QDeclarativeBinding *binding = new QDeclarativeBinding(expression.toString(), object, context);
             binding->setTarget(property);
-- 
cgit v0.12


From d3a6103783b161d6d35a00cb50fef50e73b6a4b6 Mon Sep 17 00:00:00 2001
From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
Date: Wed, 10 Nov 2010 22:35:50 +0100
Subject: remove pointless assignment of deprecated variable

---
 tools/qconfig/qconfig.pro | 1 -
 1 file changed, 1 deletion(-)

diff --git a/tools/qconfig/qconfig.pro b/tools/qconfig/qconfig.pro
index efbfcf2..171924f 100644
--- a/tools/qconfig/qconfig.pro
+++ b/tools/qconfig/qconfig.pro
@@ -6,5 +6,4 @@ build_all:!build_pass {
 }
 HEADERS		= feature.h featuretreemodel.h graphics.h
 SOURCES		= main.cpp feature.cpp featuretreemodel.cpp
-INTERFACES	=
 TARGET		= qconfig
-- 
cgit v0.12


From 9637cb4f7c88594d5018c97072f77a19d737a302 Mon Sep 17 00:00:00 2001
From: Michael Dominic K <mdk@codethink.co.uk>
Date: Thu, 11 Nov 2010 08:25:08 +0100
Subject: Trailing whitespace fixes.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Merge-request: 2502
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
---
 src/plugins/graphicssystems/meego/qmeegoextensions.cpp     | 12 ++++++------
 src/plugins/graphicssystems/meego/qmeegographicssystem.cpp | 12 ++++++------
 src/plugins/graphicssystems/meego/qmeegolivepixmapdata.h   |  6 +++---
 3 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/src/plugins/graphicssystems/meego/qmeegoextensions.cpp b/src/plugins/graphicssystems/meego/qmeegoextensions.cpp
index 611c962..44c1eee 100644
--- a/src/plugins/graphicssystems/meego/qmeegoextensions.cpp
+++ b/src/plugins/graphicssystems/meego/qmeegoextensions.cpp
@@ -78,7 +78,7 @@ EGLNativeSharedImageTypeNOK QMeeGoExtensions::eglCreateSharedImageNOK(EGLDisplay
 {
     if (! hasImageShared)
         qFatal("EGL_NOK_image_shared not found but trying to use capability!");
-        
+
     return _eglCreateSharedImageNOK(dpy, image, props);
 }
 
@@ -128,7 +128,7 @@ void QMeeGoExtensions::initialize()
 {
     QGLContext *ctx = (QGLContext *) QGLContext::currentContext();
     qt_resolve_eglimage_gl_extensions(ctx);
-    
+
     if (QEgl::hasExtension("EGL_NOK_image_shared")) {
         qDebug("MeegoGraphics: found EGL_NOK_image_shared");
         _eglQueryImageNOK = (eglQueryImageNOKFunc) eglGetProcAddress("eglQueryImageNOK");
@@ -136,15 +136,15 @@ void QMeeGoExtensions::initialize()
         _eglDestroySharedImageNOK = (eglDestroySharedImageNOKFunc) eglGetProcAddress("eglDestroySharedImageNOK");
         _eglLockSurfaceKHR = (eglLockSurfaceKHRFunc) eglGetProcAddress("eglLockSurfaceKHR");
         _eglUnlockSurfaceKHR = (eglUnlockSurfaceKHRFunc) eglGetProcAddress("eglUnlockSurfaceKHR");
-        
+
         Q_ASSERT(_eglQueryImageNOK && _eglCreateSharedImageNOK && _eglDestroySharedImageNOK);
         hasImageShared = true;
     }
-    
+
     if (QEgl::hasExtension("EGL_NOK_surface_scaling")) {
         qDebug("MeegoGraphics: found EGL_NOK_surface_scaling");
         _eglSetSurfaceScalingNOK = (eglSetSurfaceScalingNOKFunc) eglGetProcAddress("eglSetSurfaceScalingNOK");
-        
+
         Q_ASSERT(_eglSetSurfaceScalingNOK);
         hasSurfaceScaling = true;
     }
@@ -153,7 +153,7 @@ void QMeeGoExtensions::initialize()
         qDebug("MeegoGraphics: found EGL_KHR_lock_surface2");
         _eglLockSurfaceKHR = (eglLockSurfaceKHRFunc) eglGetProcAddress("eglLockSurfaceKHR");
         _eglUnlockSurfaceKHR = (eglUnlockSurfaceKHRFunc) eglGetProcAddress("eglUnlockSurfaceKHR");
-         
+
         Q_ASSERT(_eglLockSurfaceKHR && _eglUnlockSurfaceKHR);
         hasLockSurface = true;
     }
diff --git a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
index 67d760c..02e1143 100644
--- a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
+++ b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
@@ -87,7 +87,7 @@ QPixmapData *QMeeGoGraphicsSystem::createPixmapData(QPixmapData::PixelType type)
     // explain here... not to mention fix without going crazy. 
     // MDK
     QGLShareContextScope ctx(qt_gl_share_widget()->context());
- 
+
     return new QRasterPixmapData(type);
 }
 
@@ -103,8 +103,8 @@ QPixmapData *QMeeGoGraphicsSystem::createPixmapData(QPixmapData *origin)
 
         if (QMeeGoPixmapData::sharedImagesMap.contains(rawResource))
             return new QMeeGoPixmapData();
-    } 
-        
+    }
+
     return new QRasterPixmapData(origin->pixelType());
 }
 
@@ -155,7 +155,7 @@ QPixmapData *QMeeGoGraphicsSystem::pixmapDataFromEGLSharedImage(Qt::HANDLE handl
         qFatal("For egl shared images, the soft image has to be ARGB32_Premultiplied or RGB32");
         return NULL;
     }
-    
+
     if (QMeeGoGraphicsSystem::meeGoRunning()) {
         QMeeGoPixmapData *pmd = new QMeeGoPixmapData;
         pmd->fromEGLSharedImage(handle, softImage);
@@ -177,9 +177,9 @@ QPixmapData *QMeeGoGraphicsSystem::pixmapDataFromEGLSharedImage(Qt::HANDLE handl
 void QMeeGoGraphicsSystem::updateEGLSharedImagePixmap(QPixmap *pixmap)
 {
     QMeeGoPixmapData *pmd = (QMeeGoPixmapData *) pixmap->pixmapData();
-    
+
     // Basic sanity check to make sure this is really a QMeeGoPixmapData...
-    if (pmd->classId() != QPixmapData::OpenGLClass) 
+    if (pmd->classId() != QPixmapData::OpenGLClass)
         qFatal("Trying to updated EGLSharedImage pixmap but it's not really a shared image pixmap!");
 
     pmd->updateFromSoftImage();
diff --git a/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.h b/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.h
index 1d647f0..cb123da 100644
--- a/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.h
+++ b/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.h
@@ -50,16 +50,16 @@ public:
     QMeeGoLivePixmapData(int w, int h, QImage::Format format);
     QMeeGoLivePixmapData(Qt::HANDLE h);
     ~QMeeGoLivePixmapData();
-    
+
     QPixmapData *createCompatiblePixmapData() const;
     bool scroll(int dx, int dy, const QRect &rect);
 
     void initializeThroughEGLImage();
-        
+
     QImage* lock();
     bool release(QImage *img);
     Qt::HANDLE handle();
-    
+
     EGLSurface getSurfaceForBackingPixmap();
     void destroySurfaceForPixmapData(QPixmapData* pmd);
 
-- 
cgit v0.12


From d964fa923394ba50fa26d36c2c39bf4ac1fda78f Mon Sep 17 00:00:00 2001
From: Michael Dominic K <mdk@codethink.co.uk>
Date: Thu, 11 Nov 2010 08:25:09 +0100
Subject: Added MeeGo graphicssystem entry points for KHR_fence_sync.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Merge-request: 2502
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
---
 .../graphicssystems/meego/qmeegoextensions.cpp     | 56 +++++++++++++++++++++-
 .../graphicssystems/meego/qmeegoextensions.h       | 22 +++++++++
 2 files changed, 76 insertions(+), 2 deletions(-)

diff --git a/src/plugins/graphicssystems/meego/qmeegoextensions.cpp b/src/plugins/graphicssystems/meego/qmeegoextensions.cpp
index 44c1eee..fd17d491d 100644
--- a/src/plugins/graphicssystems/meego/qmeegoextensions.cpp
+++ b/src/plugins/graphicssystems/meego/qmeegoextensions.cpp
@@ -47,6 +47,7 @@ bool QMeeGoExtensions::initialized = false;
 bool QMeeGoExtensions::hasImageShared = false;
 bool QMeeGoExtensions::hasSurfaceScaling = false;
 bool QMeeGoExtensions::hasLockSurface = false;
+bool QMeeGoExtensions::hasFenceSync = false;
 
 /* Extension funcs */
 
@@ -54,8 +55,12 @@ typedef EGLBoolean (EGLAPIENTRY *eglQueryImageNOKFunc)(EGLDisplay, EGLImageKHR,
 typedef EGLNativeSharedImageTypeNOK (EGLAPIENTRY *eglCreateSharedImageNOKFunc)(EGLDisplay, EGLImageKHR, EGLint*);
 typedef EGLBoolean (EGLAPIENTRY *eglDestroySharedImageNOKFunc)(EGLDisplay, EGLNativeSharedImageTypeNOK);
 typedef EGLBoolean (EGLAPIENTRY *eglSetSurfaceScalingNOKFunc)(EGLDisplay, EGLSurface, EGLint, EGLint, EGLint, EGLint);
-typedef EGLBoolean (EGLAPIENTRY *eglLockSurfaceKHRFunc)(EGLDisplay display, EGLSurface surface, const EGLint *attrib_list);
-typedef EGLBoolean (EGLAPIENTRY *eglUnlockSurfaceKHRFunc)(EGLDisplay display, EGLSurface surface);
+typedef EGLBoolean (EGLAPIENTRY *eglLockSurfaceKHRFunc)(EGLDisplay, EGLSurface, const EGLint*);
+typedef EGLBoolean (EGLAPIENTRY *eglUnlockSurfaceKHRFunc)(EGLDisplay, EGLSurface);
+typedef EGLSyncKHR (EGLAPIENTRY *eglCreateSyncKHRFunc)(EGLDisplay, EGLenum, const EGLint*);
+typedef EGLBoolean (EGLAPIENTRY *eglDestroySyncKHRFunc)(EGLDisplay, EGLSyncKHR);
+typedef EGLint (EGLAPIENTRY *eglClientWaitSyncKHRFunc)(EGLDisplay, EGLSyncKHR, EGLint, EGLTimeKHR);
+typedef EGLBoolean (EGLAPIENTRY *eglGetSyncAttribKHRFunc)(EGLDisplay, EGLSyncKHR, EGLint, EGLint*);
 
 static eglQueryImageNOKFunc _eglQueryImageNOK = 0;
 static eglCreateSharedImageNOKFunc _eglCreateSharedImageNOK = 0;
@@ -63,6 +68,10 @@ static eglDestroySharedImageNOKFunc _eglDestroySharedImageNOK = 0;
 static eglSetSurfaceScalingNOKFunc _eglSetSurfaceScalingNOK = 0;
 static eglLockSurfaceKHRFunc _eglLockSurfaceKHR = 0;
 static eglUnlockSurfaceKHRFunc _eglUnlockSurfaceKHR = 0;
+static eglCreateSyncKHRFunc _eglCreateSyncKHR = 0;
+static eglDestroySyncKHRFunc _eglDestroySyncKHR = 0;
+static eglClientWaitSyncKHRFunc _eglClientWaitSyncKHR = 0;
+static eglGetSyncAttribKHRFunc _eglGetSyncAttribKHR = 0;
 
 /* Public */
 
@@ -122,6 +131,38 @@ bool QMeeGoExtensions::eglUnlockSurfaceKHR(EGLDisplay display, EGLSurface surfac
     return _eglUnlockSurfaceKHR(display, surface);
 }
 
+EGLSyncKHR QMeeGoExtensions::eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
+{
+    if (! hasFenceSync)
+        qFatal("EGL_KHR_fence_sync not found but trying to use capability!");
+
+    return _eglCreateSyncKHR(dpy, type, attrib_list);
+}
+
+bool QMeeGoExtensions::eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
+{
+    if (! hasFenceSync)
+        qFatal("EGL_KHR_fence_sync not found but trying to use capability!");
+
+    return _eglDestroySyncKHR(dpy, sync);
+}
+
+EGLint QMeeGoExtensions::eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
+{
+    if (! hasFenceSync)
+        qFatal("EGL_KHR_fence_sync not found but trying to use capability!");
+
+    return _eglClientWaitSyncKHR(dpy, sync, flags, timeout);
+}
+
+EGLBoolean QMeeGoExtensions::eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
+{
+    if (! hasFenceSync)
+        qFatal("EGL_KHR_fence_sync not found but trying to use capability!");
+
+    return _eglGetSyncAttribKHR(dpy, sync, attribute, value);
+}
+
 /* Private */
 
 void QMeeGoExtensions::initialize()
@@ -157,5 +198,16 @@ void QMeeGoExtensions::initialize()
         Q_ASSERT(_eglLockSurfaceKHR && _eglUnlockSurfaceKHR);
         hasLockSurface = true;
     }
+
+    if (QEgl::hasExtension("EGL_KHR_fence_sync")) {
+        qDebug("MeegoGraphics: found EGL_KHR_fence_sync");
+        _eglCreateSyncKHR = (eglCreateSyncKHRFunc) eglGetProcAddress("eglCreateSyncKHR");
+        _eglDestroySyncKHR = (eglDestroySyncKHRFunc) eglGetProcAddress("eglDestroySyncKHR");
+        _eglClientWaitSyncKHR = (eglClientWaitSyncKHRFunc) eglGetProcAddress("eglClientWaitSyncKHR");
+        _eglGetSyncAttribKHR = (eglGetSyncAttribKHRFunc) eglGetProcAddress("eglGetSyncAttribKHR");
+
+        Q_ASSERT(_eglCreateSyncKHR && _eglDestroySyncKHR && _eglClientWaitSyncKHR && _eglGetSyncAttribKHR);
+        hasFenceSync = true;
+    }
 }
 
diff --git a/src/plugins/graphicssystems/meego/qmeegoextensions.h b/src/plugins/graphicssystems/meego/qmeegoextensions.h
index 9e78caf..49a1e30 100644
--- a/src/plugins/graphicssystems/meego/qmeegoextensions.h
+++ b/src/plugins/graphicssystems/meego/qmeegoextensions.h
@@ -77,6 +77,23 @@ typedef void* EGLNativeSharedImageTypeNOK;
 #define EGL_WRITE_SURFACE_BIT_KHR 0x0002
 #endif
 
+#ifndef EGL_SYNC_FENCE_KHR
+#define EGL_SYNC_FENCE_KHR 0x30F9
+#define EGL_SYNC_TYPE_KHR 0x30F7
+#define EGL_SYNC_STATUS_KHR 0x30F1
+#define EGL_SYNC_CONDITION_KHR 0x30F8
+#define EGL_SIGNALED_KHR 0x30F2
+#define EGL_UNSIGNALED_KHR 0x30F3
+#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0
+#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001
+#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFFull
+#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5
+#define EGL_CONDITION_SATISFIED_KHR 0x30F6
+#define EGL_NO_SYNC_KHR ((EGLSyncKHR)0)
+typedef void* EGLSyncKHR;
+typedef khronos_utime_nanoseconds_t EGLTimeKHR;
+#endif
+
 /* Class */
 
 class QMeeGoExtensions
@@ -90,6 +107,10 @@ public:
     static bool eglSetSurfaceScalingNOK(EGLDisplay dpy, EGLSurface surface, int x, int y, int width, int height);
     static bool eglLockSurfaceKHR(EGLDisplay display, EGLSurface surface, const EGLint *attrib_list);
     static bool eglUnlockSurfaceKHR(EGLDisplay display, EGLSurface surface);
+    static EGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
+    static bool eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync);
+    static EGLint eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
+    static EGLBoolean eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
 
 private:
     static void initialize();
@@ -98,6 +119,7 @@ private:
     static bool hasImageShared;
     static bool hasSurfaceScaling;
     static bool hasLockSurface;
+    static bool hasFenceSync;
 };
 
 #endif
-- 
cgit v0.12


From 8d6c8e95f47e6be3f8db85adc2412d55a6915ac4 Mon Sep 17 00:00:00 2001
From: Michael Dominic K <mdk@codethink.co.uk>
Date: Thu, 11 Nov 2010 08:25:09 +0100
Subject: Plugin-side support for creating/destroying/waiting on fence sync.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Merge-request: 2502
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
---
 .../graphicssystems/meego/qmeegographicssystem.cpp | 38 ++++++++++++++++++----
 .../graphicssystems/meego/qmeegographicssystem.h   |  9 +++--
 .../graphicssystems/meego/qmeegolivepixmapdata.cpp | 12 +++++--
 .../graphicssystems/meego/qmeegolivepixmapdata.h   |  3 +-
 4 files changed, 49 insertions(+), 13 deletions(-)

diff --git a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
index 02e1143..063af13 100644
--- a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
+++ b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
@@ -82,9 +82,9 @@ QWindowSurface* QMeeGoGraphicsSystem::createWindowSurface(QWidget *widget) const
 
 QPixmapData *QMeeGoGraphicsSystem::createPixmapData(QPixmapData::PixelType type) const
 {
-    // Long story short: without this it's possible to hit an 
-    // uninitialized paintDevice due to a Qt bug too complex to even
-    // explain here... not to mention fix without going crazy. 
+    // Long story short: without this it's possible to hit an
+    // unitialized paintDevice due to a Qt bug too complex to even
+    // explain here... not to mention fix without going crazy.
     // MDK
     QGLShareContextScope ctx(qt_gl_share_widget()->context());
 
@@ -218,10 +218,10 @@ QPixmapData* QMeeGoGraphicsSystem::pixmapDataFromLiveTextureHandle(Qt::HANDLE ha
     return new QMeeGoLivePixmapData(handle);
 }
 
-QImage* QMeeGoGraphicsSystem::lockLiveTexture(QPixmap* pixmap)
+QImage* QMeeGoGraphicsSystem::lockLiveTexture(QPixmap* pixmap, void* fenceSync)
 {
     QMeeGoLivePixmapData *pixmapData = static_cast<QMeeGoLivePixmapData*>(pixmap->data_ptr().data());
-    return pixmapData->lock();
+    return pixmapData->lock(fenceSync);
 }
 
 bool QMeeGoGraphicsSystem::releaseLiveTexture(QPixmap *pixmap, QImage *image)
@@ -236,6 +236,20 @@ Qt::HANDLE QMeeGoGraphicsSystem::getLiveTextureHandle(QPixmap *pixmap)
     return pixmapData->handle();
 }
 
+void* QMeeGoGraphicsSystem::createFenceSync()
+{
+    QGLShareContextScope ctx(qt_gl_share_widget()->context());
+    QMeeGoExtensions::ensureInitialized();
+    return QMeeGoExtensions::eglCreateSyncKHR(QEgl::display(), EGL_SYNC_FENCE_KHR, NULL);
+}
+
+void QMeeGoGraphicsSystem::destroyFenceSync(void *fenceSync)
+{
+    QGLShareContextScope ctx(qt_gl_share_widget()->context());
+    QMeeGoExtensions::ensureInitialized();
+    QMeeGoExtensions::eglDestroySyncKHR(QEgl::display(), fenceSync);
+}
+
 /* C API */
 
 int qt_meego_image_to_egl_shared_image(const QImage &image)
@@ -288,9 +302,9 @@ QPixmapData* qt_meego_pixmapdata_from_live_texture_handle(Qt::HANDLE handle)
     return QMeeGoGraphicsSystem::pixmapDataFromLiveTextureHandle(handle);
 }
 
-QImage* qt_meego_live_texture_lock(QPixmap *pixmap)
+QImage* qt_meego_live_texture_lock(QPixmap *pixmap, void *fenceSync)
 {
-    return QMeeGoGraphicsSystem::lockLiveTexture(pixmap);
+    return QMeeGoGraphicsSystem::lockLiveTexture(pixmap, fenceSync);
 }
 
 bool qt_meego_live_texture_release(QPixmap *pixmap, QImage *image)
@@ -302,3 +316,13 @@ Qt::HANDLE qt_meego_live_texture_get_handle(QPixmap *pixmap)
 {
     return QMeeGoGraphicsSystem::getLiveTextureHandle(pixmap);
 }
+
+void* qt_meego_create_fence_sync(void)
+{
+    return QMeeGoGraphicsSystem::createFenceSync();
+}
+
+void qt_meego_destroy_fence_sync(void* fs)
+{
+    return QMeeGoGraphicsSystem::destroyFenceSync(fs);
+}
diff --git a/src/plugins/graphicssystems/meego/qmeegographicssystem.h b/src/plugins/graphicssystems/meego/qmeegographicssystem.h
index 2697f0f..1e50f00 100644
--- a/src/plugins/graphicssystems/meego/qmeegographicssystem.h
+++ b/src/plugins/graphicssystems/meego/qmeegographicssystem.h
@@ -69,10 +69,13 @@ public:
 
     static QPixmapData *pixmapDataWithNewLiveTexture(int w, int h, QImage::Format format);
     static QPixmapData *pixmapDataFromLiveTextureHandle(Qt::HANDLE handle);
-    static QImage *lockLiveTexture(QPixmap* pixmap);
+    static QImage *lockLiveTexture(QPixmap* pixmap, void* fenceSync);
     static bool releaseLiveTexture(QPixmap *pixmap, QImage *image);
     static Qt::HANDLE getLiveTextureHandle(QPixmap *pixmap);
 
+    static void* createFenceSync();
+    static void destroyFenceSync(void* fenceSync);
+
 private:
     static bool meeGoRunning();
     static EGLSurface getSurfaceForLiveTexturePixmap(QPixmap *pixmap);
@@ -95,9 +98,11 @@ extern "C" {
     Q_DECL_EXPORT void qt_meego_set_translucent(bool translucent);    
     Q_DECL_EXPORT QPixmapData* qt_meego_pixmapdata_with_new_live_texture(int w, int h, QImage::Format format);
     Q_DECL_EXPORT QPixmapData* qt_meego_pixmapdata_from_live_texture_handle(Qt::HANDLE handle);
-    Q_DECL_EXPORT QImage* qt_meego_live_texture_lock(QPixmap *pixmap);
+    Q_DECL_EXPORT QImage* qt_meego_live_texture_lock(QPixmap *pixmap, void *fenceSync);
     Q_DECL_EXPORT bool qt_meego_live_texture_release(QPixmap *pixmap, QImage *image);
     Q_DECL_EXPORT Qt::HANDLE qt_meego_live_texture_get_handle(QPixmap *pixmap);
+    Q_DECL_EXPORT void* qt_meego_create_fence_sync(void);
+    Q_DECL_EXPORT void qt_meego_destroy_fence_sync(void* fs);
 }
 
 #endif 
diff --git a/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.cpp b/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.cpp
index 405b765..3ef35e1 100644
--- a/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.cpp
+++ b/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.cpp
@@ -40,7 +40,6 @@
 ****************************************************************************/
 
 #include "qmeegolivepixmapdata.h"
-#include "qmeegoextensions.h"
 #include "qmeegorasterpixmapdata.h"
 #include <private/qimage_p.h>
 #include <private/qwindowsurface_gl_p.h>
@@ -171,11 +170,18 @@ QPixmapData *QMeeGoLivePixmapData::createCompatiblePixmapData() const
     return new QMeeGoRasterPixmapData(pixelType());
 }
 
-QImage* QMeeGoLivePixmapData::lock()
+QImage* QMeeGoLivePixmapData::lock(EGLSyncKHR fenceSync)
 {
     QGLShareContextScope ctx(qt_gl_share_widget()->context());
     QMeeGoExtensions::ensureInitialized();
 
+    if (fenceSync) {
+        QMeeGoExtensions::eglClientWaitSyncKHR(QEgl::display(),
+                                               fenceSync,
+                                               EGL_SYNC_FLUSH_COMMANDS_BIT_KHR,
+                                               EGL_FOREVER_KHR);
+    }
+
     void *data = 0;
     int pitch = 0;
     EGLSurface surface = 0;
@@ -229,7 +235,7 @@ Qt::HANDLE QMeeGoLivePixmapData::handle()
 
 bool QMeeGoLivePixmapData::scroll(int dx, int dy, const QRect &rect)
 {
-    lock();
+    lock(NULL);
 
     if (!lockedImage.isNull())
         qt_scrollRectInImage(lockedImage, rect, QPoint(dx, dy));
diff --git a/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.h b/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.h
index cb123da..2c6854e 100644
--- a/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.h
+++ b/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.h
@@ -43,6 +43,7 @@
 #define MLIVEPIXMAPDATA_H
 
 #include <private/qpixmapdata_gl_p.h>
+#include "qmeegoextensions.h"
 
 class QMeeGoLivePixmapData : public QGLPixmapData
 {
@@ -56,7 +57,7 @@ public:
 
     void initializeThroughEGLImage();
 
-    QImage* lock();
+    QImage* lock(EGLSyncKHR fenceSync);
     bool release(QImage *img);
     Qt::HANDLE handle();
 
-- 
cgit v0.12


From 4e7eb76cb231fc5a8b0deb67a87c45f6760e44bb Mon Sep 17 00:00:00 2001
From: Michael Dominic K <mdk@codethink.co.uk>
Date: Thu, 11 Nov 2010 08:25:10 +0100
Subject: Helper-side support for QMeeGoFenceSync.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Merge-request: 2502
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
---
 .../qmeegographicssystemhelper/qmeegofencesync.cpp |  79 ++++++++++++++++
 tools/qmeegographicssystemhelper/qmeegofencesync.h | 101 +++++++++++++++++++++
 .../qmeegographicssystemhelper/qmeegofencesync_p.h |  60 ++++++++++++
 .../qmeegographicssystemhelper.pro                 |   4 +-
 .../qmeegolivepixmap.cpp                           |   9 +-
 .../qmeegographicssystemhelper/qmeegolivepixmap.h  |   7 +-
 tools/qmeegographicssystemhelper/qmeegoruntime.cpp |  29 +++++-
 tools/qmeegographicssystemhelper/qmeegoruntime.h   |   4 +-
 8 files changed, 282 insertions(+), 11 deletions(-)
 create mode 100644 tools/qmeegographicssystemhelper/qmeegofencesync.cpp
 create mode 100644 tools/qmeegographicssystemhelper/qmeegofencesync.h
 create mode 100644 tools/qmeegographicssystemhelper/qmeegofencesync_p.h

diff --git a/tools/qmeegographicssystemhelper/qmeegofencesync.cpp b/tools/qmeegographicssystemhelper/qmeegofencesync.cpp
new file mode 100644
index 0000000..499e102
--- /dev/null
+++ b/tools/qmeegographicssystemhelper/qmeegofencesync.cpp
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmeegofencesync.h"
+#include "qmeegofencesync_p.h"
+#include "qmeegoruntime.h"
+
+/* QMeeGoFenceSyncPrivate */
+
+QMeeGoFenceSyncPrivate::QMeeGoFenceSyncPrivate() : syncObject(NULL)
+{
+}
+
+QMeeGoFenceSyncPrivate::~QMeeGoFenceSyncPrivate()
+{
+    if (syncObject) {
+        QMeeGoRuntime::destroyFenceSync(syncObject);
+        syncObject = NULL;
+    }
+}
+
+/* QMeeGoFenceSync */
+
+QMeeGoFenceSync::QMeeGoFenceSync(QWidget *parent) : QObject(parent), d_ptr(new QMeeGoFenceSyncPrivate())
+{
+    Q_D(QMeeGoFenceSync);
+    d->q_ptr = this;
+}
+
+QMeeGoFenceSync::~QMeeGoFenceSync()
+{
+}
+
+void QMeeGoFenceSync::setSyncPoint()
+{
+    Q_D(QMeeGoFenceSync);
+    if (d->syncObject)
+        QMeeGoRuntime::destroyFenceSync(d->syncObject);
+
+    d->syncObject = QMeeGoRuntime::createFenceSync();
+}
diff --git a/tools/qmeegographicssystemhelper/qmeegofencesync.h b/tools/qmeegographicssystemhelper/qmeegofencesync.h
new file mode 100644
index 0000000..2d3f5c5
--- /dev/null
+++ b/tools/qmeegographicssystemhelper/qmeegofencesync.h
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMEEGOFENCESYNC_H
+#define QMEEGOFENCESYNC_H
+
+#include <QWidget>
+
+class QMeeGoFenceSyncPrivate;
+
+//! A synchronization helper for GL pipeline.
+/*!
+ Fence syncs provide a mechanism for synchronizing access to certain GL primitives
+ and make it possible for the application developer to be sure that a certain point
+ in the GL processing pipeline has been already executed before continuing operation.
+
+ Currently fence syncs are only useful in conjunction with QMeeGoLivePixmaps.
+ \code
+ ...
+ // In your paint/expose event:
+ QImage *image = livePixmap->lock(&someGlobalFenceSync);
+ // Modify the image...
+ livePixmap->release(image);
+
+ painter->drawPixmap(0, 0, *livePixmap);
+ someGlobalFenceSync.setSyncPoint();
+ ...
+ \endcode
+
+ Assuming the paint/expose events come repeatedly, the lock operation
+ will block till the previous event completed painting the livePixmap.
+*/
+
+class Q_DECL_EXPORT QMeeGoFenceSync : public QObject
+{
+public:
+    //! Constructs a new fence sync.
+    /*!
+     The fence sync is created without a sync point. You need to set the sync point manually.
+    */
+    QMeeGoFenceSync(QWidget *parent = 0);
+
+    //! Destructor for the fence sync.
+    virtual ~QMeeGoFenceSync();
+
+    //! Sets the fence sync.
+    /*!
+      The fence sync synchronization point should be set after all drawing has been scheduled.
+      Setting a synchronization point always overrides the previous point -- whetver is was
+      used (waited upon) or not.
+    */
+    void setSyncPoint();
+
+private:
+    Q_DISABLE_COPY(QMeeGoFenceSync)
+    Q_DECLARE_PRIVATE(QMeeGoFenceSync)
+
+protected:
+    QScopedPointer<QMeeGoFenceSyncPrivate> d_ptr; //! Private bits.
+    friend class QMeeGoLivePixmap;
+};
+
+#endif
diff --git a/tools/qmeegographicssystemhelper/qmeegofencesync_p.h b/tools/qmeegographicssystemhelper/qmeegofencesync_p.h
new file mode 100644
index 0000000..8a5d26e
--- /dev/null
+++ b/tools/qmeegographicssystemhelper/qmeegofencesync_p.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmeegofencesync.h"
+
+#ifndef QMEEGOFENCESYNC_P_H
+#define QMEEGOFENCESYNC_P_H
+
+class QMeeGoFenceSyncPrivate
+{
+public:
+    Q_DECLARE_PUBLIC(QMeeGoFenceSync);
+    QMeeGoFenceSyncPrivate();
+
+    virtual ~QMeeGoFenceSyncPrivate();
+
+    void* syncObject;
+
+    QMeeGoFenceSync *q_ptr;
+};
+
+#endif
diff --git a/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.pro b/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.pro
index 7412fc3..161a31b 100644
--- a/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.pro
+++ b/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.pro
@@ -6,5 +6,5 @@ include(../../src/qbase.pri)
 QT += gui
 INCLUDEPATH += '../../src/plugins/graphicssystems/meego'
 
-HEADERS = qmeegographicssystemhelper.h qmeegooverlaywidget.h qmeegolivepixmap.h qmeegoruntime.h qmeegolivepixmap_p.h
-SOURCES = qmeegographicssystemhelper.cpp qmeegooverlaywidget.cpp qmeegoruntime.cpp qmeegolivepixmap.cpp qmeegographicssystemhelper.h qmeegooverlaywidget.h qmeegolivepixmap.h qmeegoruntime.h qmeegolivepixmap_p.h
+HEADERS = qmeegographicssystemhelper.h qmeegooverlaywidget.h qmeegolivepixmap.h qmeegoruntime.h qmeegolivepixmap_p.h qmeegofencesync.h qmeegofencesync_p.h
+SOURCES = qmeegographicssystemhelper.cpp qmeegooverlaywidget.cpp qmeegoruntime.cpp qmeegolivepixmap.cpp qmeegographicssystemhelper.h qmeegooverlaywidget.h qmeegolivepixmap.h qmeegoruntime.h qmeegolivepixmap_p.h qmeegofencesync.h qmeegofencesync_p.h qmeegofencesync.cpp
diff --git a/tools/qmeegographicssystemhelper/qmeegolivepixmap.cpp b/tools/qmeegographicssystemhelper/qmeegolivepixmap.cpp
index d43efe2..9700581f 100644
--- a/tools/qmeegographicssystemhelper/qmeegolivepixmap.cpp
+++ b/tools/qmeegographicssystemhelper/qmeegolivepixmap.cpp
@@ -41,6 +41,7 @@
 
 #include "qmeegolivepixmap.h"
 #include "qmeegolivepixmap_p.h"
+#include "qmeegofencesync_p.h"
 #include "qmeegoruntime.h"
 
 /* QMeeGoLivePixmapPrivate */
@@ -102,10 +103,12 @@ QMeeGoLivePixmap::~QMeeGoLivePixmap()
 {
 }
 
-QImage* QMeeGoLivePixmap::lock()
+QImage* QMeeGoLivePixmap::lock(QMeeGoFenceSync *fenceSync)
 {
-    return QMeeGoRuntime::lockLiveTexture(this);
-
+    if (fenceSync)
+        return QMeeGoRuntime::lockLiveTexture(this, fenceSync->d_func()->syncObject);
+    else
+        return QMeeGoRuntime::lockLiveTexture(this, NULL);
 }
 
 void QMeeGoLivePixmap::release(QImage *img)
diff --git a/tools/qmeegographicssystemhelper/qmeegolivepixmap.h b/tools/qmeegographicssystemhelper/qmeegolivepixmap.h
index 7be2c4b..51b5976 100644
--- a/tools/qmeegographicssystemhelper/qmeegolivepixmap.h
+++ b/tools/qmeegographicssystemhelper/qmeegolivepixmap.h
@@ -43,6 +43,7 @@
 #define QMEEGOLIVEPIXMAP_H
 
 #include <QPixmap>
+#include "qmeegofencesync.h"
 
 class QMeeGoLivePixmapPrivate;
 class QSharedMemory;
@@ -82,8 +83,12 @@ public:
     //! Locks the access to the pixmap. 
     /*! 
      The returned image can be used for direct access.
+     You can optionally specify a fence sync to wait upon before unlocking. When
+     you specify a fence sync, you can be sure that this function will return only
+     when the previsouly set QMeeGoFenceSync synchronization point has been executed/passed
+     by the GL processing pipeline.
      */
-    QImage* lock();
+    QImage* lock(QMeeGoFenceSync *fenceSync = NULL);
     
     //! Unlocks the access to the pixmap. 
     /*! 
diff --git a/tools/qmeegographicssystemhelper/qmeegoruntime.cpp b/tools/qmeegographicssystemhelper/qmeegoruntime.cpp
index ac627e5..2d3ee3c 100644
--- a/tools/qmeegographicssystemhelper/qmeegoruntime.cpp
+++ b/tools/qmeegographicssystemhelper/qmeegoruntime.cpp
@@ -60,9 +60,11 @@ typedef void (*QMeeGoSetSurfaceScalingFunc) (int x, int y, int w, int h);
 typedef void (*QMeeGoSetTranslucentFunc) (bool translucent);
 typedef QPixmapData* (*QMeeGoPixmapDataWithNewLiveTextureFunc) (int w, int h, QImage::Format format);
 typedef QPixmapData* (*QMeeGoPixmapDataFromLiveTextureHandleFunc) (Qt::HANDLE h);
-typedef QImage* (*QMeeGoLiveTextureLockFunc) (QPixmap*);
+typedef QImage* (*QMeeGoLiveTextureLockFunc) (QPixmap*, void* fenceSync);
 typedef bool (*QMeeGoLiveTextureReleaseFunc) (QPixmap*, QImage *i);
 typedef Qt::HANDLE (*QMeeGoLiveTextureGetHandleFunc) (QPixmap*);
+typedef void* (*QMeeGoCreateFenceSyncFunc) (void);
+typedef void (*QMeeGoDestroyFenceSyncFunc) (void *fs);
 
 static QMeeGoImageToEglSharedImageFunc qt_meego_image_to_egl_shared_image = NULL;
 static QMeeGoPixmapDataFromEglSharedImageFunc qt_meego_pixmapdata_from_egl_shared_image = NULL;
@@ -77,6 +79,8 @@ static QMeeGoPixmapDataFromLiveTextureHandleFunc qt_meego_pixmapdata_from_live_t
 static QMeeGoLiveTextureLockFunc qt_meego_live_texture_lock = NULL;
 static QMeeGoLiveTextureReleaseFunc qt_meego_live_texture_release = NULL;
 static QMeeGoLiveTextureGetHandleFunc qt_meego_live_texture_get_handle = NULL;
+static QMeeGoCreateFenceSyncFunc qt_meego_create_fence_sync = NULL;
+static QMeeGoDestroyFenceSyncFunc qt_meego_destroy_fence_sync = NULL;
 
 void QMeeGoRuntime::initialize()
 {
@@ -103,12 +107,15 @@ void QMeeGoRuntime::initialize()
         qt_meego_live_texture_lock = (QMeeGoLiveTextureLockFunc) library.resolve("qt_meego_live_texture_lock");
         qt_meego_live_texture_release = (QMeeGoLiveTextureReleaseFunc) library.resolve("qt_meego_live_texture_release");
         qt_meego_live_texture_get_handle = (QMeeGoLiveTextureGetHandleFunc) library.resolve("qt_meego_live_texture_get_handle");
+        qt_meego_create_fence_sync = (QMeeGoCreateFenceSyncFunc) library.resolve("qt_meego_create_fence_sync");
+        qt_meego_destroy_fence_sync = (QMeeGoDestroyFenceSyncFunc) library.resolve("qt_meego_destroy_fence_sync");
 
         if (qt_meego_image_to_egl_shared_image && qt_meego_pixmapdata_from_egl_shared_image && 
             qt_meego_pixmapdata_with_gl_texture && qt_meego_destroy_egl_shared_image && qt_meego_update_egl_shared_image_pixmap && 
             qt_meego_set_surface_fixed_size && qt_meego_set_surface_scaling && qt_meego_set_translucent && 
             qt_meego_pixmapdata_with_new_live_texture && qt_meego_pixmapdata_from_live_texture_handle &&
-            qt_meego_live_texture_lock && qt_meego_live_texture_release && qt_meego_live_texture_get_handle)
+            qt_meego_live_texture_lock && qt_meego_live_texture_release && qt_meego_live_texture_get_handle &&
+            qt_meego_create_fence_sync && qt_meego_destroy_fence_sync)
         {
             qDebug("Successfully resolved MeeGo graphics system: %s %s\n", qPrintable(libraryPrivate->fileName), qPrintable(libraryPrivate->fullVersion));
         } else {
@@ -191,11 +198,11 @@ QPixmapData* QMeeGoRuntime::pixmapDataFromLiveTextureHandle(Qt::HANDLE h)
     return qt_meego_pixmapdata_from_live_texture_handle(h);
 }
 
-QImage* QMeeGoRuntime::lockLiveTexture(QPixmap *p)
+QImage* QMeeGoRuntime::lockLiveTexture(QPixmap *p, void* fenceSync)
 {
     ENSURE_INITIALIZED;
     Q_ASSERT(qt_meego_live_texture_lock);
-    return qt_meego_live_texture_lock(p);
+    return qt_meego_live_texture_lock(p, fenceSync);
 }
 
 bool QMeeGoRuntime::releaseLiveTexture(QPixmap *p, QImage *i)
@@ -211,3 +218,17 @@ Qt::HANDLE QMeeGoRuntime::getLiveTextureHandle(QPixmap *pixmap)
     Q_ASSERT(qt_meego_live_texture_get_handle);
     return qt_meego_live_texture_get_handle(pixmap);
 }
+
+void* QMeeGoRuntime::createFenceSync()
+{
+    ENSURE_INITIALIZED;
+    Q_ASSERT(qt_meego_create_fence_sync);
+    return qt_meego_create_fence_sync();
+}
+
+void QMeeGoRuntime::destroyFenceSync(void *fs)
+{
+    ENSURE_INITIALIZED;
+    Q_ASSERT(qt_meego_destroy_fence_sync);
+    qt_meego_destroy_fence_sync(fs);
+}
diff --git a/tools/qmeegographicssystemhelper/qmeegoruntime.h b/tools/qmeegographicssystemhelper/qmeegoruntime.h
index 6b34836..be6ff6b 100644
--- a/tools/qmeegographicssystemhelper/qmeegoruntime.h
+++ b/tools/qmeegographicssystemhelper/qmeegoruntime.h
@@ -57,9 +57,11 @@ public:
     static void setTranslucent(bool translucent);
     static QPixmapData* pixmapDataWithNewLiveTexture(int w, int h, QImage::Format format);
     static QPixmapData* pixmapDataFromLiveTextureHandle(Qt::HANDLE h);
-    static QImage* lockLiveTexture(QPixmap *pixmap);
+    static QImage* lockLiveTexture(QPixmap *pixmap, void *fenceSync);
     static bool releaseLiveTexture(QPixmap *pixmap, QImage *image);
     static Qt::HANDLE getLiveTextureHandle(QPixmap *pixmap);
+    static void* createFenceSync();
+    static void destroyFenceSync(void *fs);
 
 private:
     static bool initialized;
-- 
cgit v0.12


From 86d39d4a6bfe1c7371b2a27a996db1c5ee601e91 Mon Sep 17 00:00:00 2001
From: Michael Dominic K <mdk@codethink.co.uk>
Date: Thu, 11 Nov 2010 08:25:11 +0100
Subject: Removed call to glFinish, obsoleted by fence syncs.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Merge-request: 2502
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
---
 src/plugins/graphicssystems/meego/qmeegolivepixmapdata.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.cpp b/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.cpp
index 3ef35e1..16096c9 100644
--- a/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.cpp
+++ b/src/plugins/graphicssystems/meego/qmeegolivepixmapdata.cpp
@@ -220,7 +220,6 @@ bool QMeeGoLivePixmapData::release(QImage* /*img*/)
 
     if (QMeeGoExtensions::eglUnlockSurfaceKHR(QEgl::display(), getSurfaceForBackingPixmap())) {
         lockedImage = QImage();
-        glFinish();
         return true;
     } else {
         lockedImage = QImage();
-- 
cgit v0.12


From 6ff64751994001f90bc82cb7fd25a0c20e8966eb Mon Sep 17 00:00:00 2001
From: Michael Dominic K <mdk@codethink.co.uk>
Date: Thu, 11 Nov 2010 08:25:11 +0100
Subject: Coding style: bang cleanup.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Merge-request: 2502
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
---
 .../graphicssystems/meego/qmeegoextensions.cpp       | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/plugins/graphicssystems/meego/qmeegoextensions.cpp b/src/plugins/graphicssystems/meego/qmeegoextensions.cpp
index fd17d491d..dff80a4 100644
--- a/src/plugins/graphicssystems/meego/qmeegoextensions.cpp
+++ b/src/plugins/graphicssystems/meego/qmeegoextensions.cpp
@@ -85,7 +85,7 @@ void QMeeGoExtensions::ensureInitialized()
 
 EGLNativeSharedImageTypeNOK QMeeGoExtensions::eglCreateSharedImageNOK(EGLDisplay dpy, EGLImageKHR image, EGLint *props)
 {
-    if (! hasImageShared)
+    if (!hasImageShared)
         qFatal("EGL_NOK_image_shared not found but trying to use capability!");
 
     return _eglCreateSharedImageNOK(dpy, image, props);
@@ -93,7 +93,7 @@ EGLNativeSharedImageTypeNOK QMeeGoExtensions::eglCreateSharedImageNOK(EGLDisplay
 
 bool QMeeGoExtensions::eglQueryImageNOK(EGLDisplay dpy, EGLImageKHR image, EGLint prop, EGLint *v)
 {
-    if (! hasImageShared)
+    if (!hasImageShared)
         qFatal("EGL_NOK_image_shared not found but trying to use capability!");
 
     return _eglQueryImageNOK(dpy, image, prop, v);
@@ -101,7 +101,7 @@ bool QMeeGoExtensions::eglQueryImageNOK(EGLDisplay dpy, EGLImageKHR image, EGLin
 
 bool QMeeGoExtensions::eglDestroySharedImageNOK(EGLDisplay dpy, EGLNativeSharedImageTypeNOK img)
 {
-    if (! hasImageShared)
+    if (!hasImageShared)
         qFatal("EGL_NOK_image_shared not found but trying to use capability!");
 
     return _eglDestroySharedImageNOK(dpy, img);
@@ -109,7 +109,7 @@ bool QMeeGoExtensions::eglDestroySharedImageNOK(EGLDisplay dpy, EGLNativeSharedI
 
 bool QMeeGoExtensions::eglSetSurfaceScalingNOK(EGLDisplay dpy, EGLSurface surface, int x, int y, int width, int height)
 {
-    if (! hasSurfaceScaling)
+    if (!hasSurfaceScaling)
         qFatal("EGL_NOK_surface_scaling not found but trying to use capability!");
 
    return _eglSetSurfaceScalingNOK(dpy, surface, x, y, width, height);
@@ -117,7 +117,7 @@ bool QMeeGoExtensions::eglSetSurfaceScalingNOK(EGLDisplay dpy, EGLSurface surfac
 
 bool QMeeGoExtensions::eglLockSurfaceKHR(EGLDisplay display, EGLSurface surface, const EGLint *attrib_list)
 {
-    if (! hasLockSurface)
+    if (!hasLockSurface)
         qFatal("EGL_KHR_lock_surface2 not found but trying to use capability!");
 
     return _eglLockSurfaceKHR(display, surface, attrib_list);
@@ -125,7 +125,7 @@ bool QMeeGoExtensions::eglLockSurfaceKHR(EGLDisplay display, EGLSurface surface,
 
 bool QMeeGoExtensions::eglUnlockSurfaceKHR(EGLDisplay display, EGLSurface surface)
 {
-    if (! hasLockSurface)
+    if (!hasLockSurface)
         qFatal("EGL_KHR_lock_surface2 not found but trying to use capability!");
 
     return _eglUnlockSurfaceKHR(display, surface);
@@ -133,7 +133,7 @@ bool QMeeGoExtensions::eglUnlockSurfaceKHR(EGLDisplay display, EGLSurface surfac
 
 EGLSyncKHR QMeeGoExtensions::eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
 {
-    if (! hasFenceSync)
+    if (!hasFenceSync)
         qFatal("EGL_KHR_fence_sync not found but trying to use capability!");
 
     return _eglCreateSyncKHR(dpy, type, attrib_list);
@@ -141,7 +141,7 @@ EGLSyncKHR QMeeGoExtensions::eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, cons
 
 bool QMeeGoExtensions::eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
 {
-    if (! hasFenceSync)
+    if (!hasFenceSync)
         qFatal("EGL_KHR_fence_sync not found but trying to use capability!");
 
     return _eglDestroySyncKHR(dpy, sync);
@@ -149,7 +149,7 @@ bool QMeeGoExtensions::eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
 
 EGLint QMeeGoExtensions::eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
 {
-    if (! hasFenceSync)
+    if (!hasFenceSync)
         qFatal("EGL_KHR_fence_sync not found but trying to use capability!");
 
     return _eglClientWaitSyncKHR(dpy, sync, flags, timeout);
@@ -157,7 +157,7 @@ EGLint QMeeGoExtensions::eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, E
 
 EGLBoolean QMeeGoExtensions::eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
 {
-    if (! hasFenceSync)
+    if (!hasFenceSync)
         qFatal("EGL_KHR_fence_sync not found but trying to use capability!");
 
     return _eglGetSyncAttribKHR(dpy, sync, attribute, value);
-- 
cgit v0.12


From 749632c12feb8a43594d52309ea630c2bc8c5161 Mon Sep 17 00:00:00 2001
From: Martin Smith <martin.smith@nokia.com>
Date: Thu, 11 Nov 2010 09:50:30 +0100
Subject: qdoc: Fixed virtualness and constness of the fileBase() function.

Task-number: QTBUG-13939
---
 tools/qdoc3/htmlgenerator.cpp | 9 ++++++---
 tools/qdoc3/htmlgenerator.h   | 2 +-
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/tools/qdoc3/htmlgenerator.cpp b/tools/qdoc3/htmlgenerator.cpp
index 9e45f8c..76ee4e8 100644
--- a/tools/qdoc3/htmlgenerator.cpp
+++ b/tools/qdoc3/htmlgenerator.cpp
@@ -3413,7 +3413,7 @@ QString HtmlGenerator::protect(const QString &string, const QString &outputEncod
 #undef APPEND
 }
 
-QString HtmlGenerator::fileBase(const Node *node)
+QString HtmlGenerator::fileBase(const Node *node) const
 {
     QString result;
 
@@ -3544,8 +3544,11 @@ QString HtmlGenerator::linkForNode(const Node *node, const Node *relative)
         return QString();
  
     fn = fileName(node);
-/*    if (!node->url().isEmpty())
-        return fn;*/
+#if 0
+    if (!node->url().isEmpty())
+        return fn;
+#endif    
+
 #if 0
     // ### reintroduce this test, without breaking .dcf files
     if (fn != outFileName())
diff --git a/tools/qdoc3/htmlgenerator.h b/tools/qdoc3/htmlgenerator.h
index d885ada..b96d737 100644
--- a/tools/qdoc3/htmlgenerator.h
+++ b/tools/qdoc3/htmlgenerator.h
@@ -241,7 +241,7 @@ class HtmlGenerator : public PageGenerator
     void generateStatus(const Node *node, CodeMarker *marker);
     
     QString registerRef(const QString& ref);
-    QString fileBase(const Node *node);
+    virtual QString fileBase(const Node *node) const;
 #if 0
     QString fileBase(const Node *node, const SectionIterator& section);
 #endif
-- 
cgit v0.12


From 772fbf9f5fb7578c5006f4f8a98856b8546f1f71 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Wed, 10 Nov 2010 19:32:29 +0100
Subject: Fix compilation by s/intptr_t/quintptr/

intptr_t is defined in some C header that we don't include. I don't
know which one it is, but without it, it fails to compile with:

declarative/qml/qdeclarativecontext.cpp:477: error: 'intptr_t' was not declared in this scope

Reviewed-By: Trust Me
---
 src/declarative/qml/qdeclarativecompiledbindings.cpp  | 2 +-
 src/declarative/qml/qdeclarativecontext.cpp           | 4 ++--
 src/declarative/qml/qdeclarativeobjectscriptclass.cpp | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/declarative/qml/qdeclarativecompiledbindings.cpp b/src/declarative/qml/qdeclarativecompiledbindings.cpp
index 5f0fd56..fbe5829 100644
--- a/src/declarative/qml/qdeclarativecompiledbindings.cpp
+++ b/src/declarative/qml/qdeclarativecompiledbindings.cpp
@@ -601,7 +601,7 @@ struct QDeclarativeBindingCompilerPrivate
     QDeclarativeImports imports;
     QDeclarativeEnginePrivate *engine;
 
-    QString contextName() const { return QLatin1String("$$$SCOPE_") + QString::number((intptr_t)context, 16); }
+    QString contextName() const { return QLatin1String("$$$SCOPE_") + QString::number((quintptr)context, 16); }
 
     bool compile(QDeclarativeJS::AST::Node *);
 
diff --git a/src/declarative/qml/qdeclarativecontext.cpp b/src/declarative/qml/qdeclarativecontext.cpp
index 1e58a71..3ee0e6f 100644
--- a/src/declarative/qml/qdeclarativecontext.cpp
+++ b/src/declarative/qml/qdeclarativecontext.cpp
@@ -474,7 +474,7 @@ int QDeclarativeContextPrivate::context_count(QDeclarativeListProperty<QObject>
 {
     QDeclarativeContext *context = static_cast<QDeclarativeContext*>(prop->object);
     QDeclarativeContextPrivate *d = QDeclarativeContextPrivate::get(context);
-    int contextProperty = (int)(intptr_t)prop->data;
+    int contextProperty = (int)(quintptr)prop->data;
 
     if (d->propertyValues.at(contextProperty).userType() != qMetaTypeId<QList<QObject*> >()) {
         return 0;
@@ -487,7 +487,7 @@ QObject *QDeclarativeContextPrivate::context_at(QDeclarativeListProperty<QObject
 {
     QDeclarativeContext *context = static_cast<QDeclarativeContext*>(prop->object);
     QDeclarativeContextPrivate *d = QDeclarativeContextPrivate::get(context);
-    int contextProperty = (int)(intptr_t)prop->data;
+    int contextProperty = (int)(quintptr)prop->data;
 
     if (d->propertyValues.at(contextProperty).userType() != qMetaTypeId<QList<QObject*> >()) {
         return 0;
diff --git a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
index ea92111..eff59df 100644
--- a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
+++ b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
@@ -421,7 +421,7 @@ QScriptValue QDeclarativeObjectScriptClass::tostring(QScriptContext *context, QS
 
         ret += QString::fromUtf8(obj->metaObject()->className());
         ret += QLatin1String("(0x");
-        ret += QString::number((intptr_t)obj,16);
+        ret += QString::number((quintptr)obj,16);
 
         if (!objectName.isEmpty()) {
             ret += QLatin1String(", \"");
-- 
cgit v0.12


From 661c9f93a90a8855c4dd8b6a215312387387ee9c Mon Sep 17 00:00:00 2001
From: Philip Van Hoof <philip@codeminded.be>
Date: Mon, 1 Nov 2010 16:59:44 +0100
Subject: Push and pop the thread-default context for the current thread

Merge-request: 869
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
(cherry picked from commit aa88b7044dd86850e6986aa80104bb38bb7b12eb)
---
 src/corelib/kernel/qeventdispatcher_glib.cpp | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/corelib/kernel/qeventdispatcher_glib.cpp b/src/corelib/kernel/qeventdispatcher_glib.cpp
index 8390275..6fa2707 100644
--- a/src/corelib/kernel/qeventdispatcher_glib.cpp
+++ b/src/corelib/kernel/qeventdispatcher_glib.cpp
@@ -311,6 +311,10 @@ QEventDispatcherGlibPrivate::QEventDispatcherGlibPrivate(GMainContext *context)
         }
     }
 
+#if GLIB_CHECK_VERSION (2, 22, 0)
+    g_main_context_push_thread_default (mainContext);
+#endif
+
     // setup post event source
     postEventSource = reinterpret_cast<GPostEventSource *>(g_source_new(&postEventSourceFuncs,
                                                                         sizeof(GPostEventSource)));
@@ -389,6 +393,9 @@ QEventDispatcherGlib::~QEventDispatcherGlib()
     d->postEventSource = 0;
 
     Q_ASSERT(d->mainContext != 0);
+#if GLIB_CHECK_VERSION (2, 22, 0)
+    g_main_context_pop_thread_default (d->mainContext);
+#endif
     g_main_context_unref(d->mainContext);
     d->mainContext = 0;
 }
-- 
cgit v0.12


From 9022b0e50cac244790463905511ae5a868be3526 Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Wed, 10 Nov 2010 11:28:36 +0100
Subject: Added an example for QTest::touchEvent to the documentation.

Reviewed-by: trustme
---
 doc/src/snippets/code/src_qtestlib_qtestcase.cpp | 16 ++++++++++++++++
 src/testlib/qtestcase.cpp                        |  3 +++
 2 files changed, 19 insertions(+)

diff --git a/doc/src/snippets/code/src_qtestlib_qtestcase.cpp b/doc/src/snippets/code/src_qtestlib_qtestcase.cpp
index 6ae8939..adb0c34 100644
--- a/doc/src/snippets/code/src_qtestlib_qtestcase.cpp
+++ b/doc/src/snippets/code/src_qtestlib_qtestcase.cpp
@@ -230,5 +230,21 @@ widget.show();
 QTest::qWaitForWindowShown(&widget);
 //! [24]
 
+//! [25]
+QWidget widget;
+
+QTest::touchEvent(&widget)
+    .press(0, QPoint(10, 10));
+QTest::touchEvent(&widget)
+    .stationary(0)
+    .press(1, QPoint(40, 10));
+QTest::touchEvent(&widget)
+    .move(0, QPoint(12, 12))
+    .move(1, QPoint(45, 5));
+QTest::touchEvent(&widget)
+    .release(0)
+    .release(1);
+//! [25]
+
 }
 
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index 17f1a6b..e3a8726 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -755,6 +755,9 @@ QT_BEGIN_NAMESPACE
     QTest::touchEvent to create a QTouchEventSequence instance. Add touch events to
     the sequence by calling press(), move(), release() and stationary(), and let the
     instance run out of scope to commit the sequence to the event system.
+
+    Example:
+    \snippet doc/src/snippets/code/src_qtestlib_qtestcase.cpp 25
 */
 
 /*!
-- 
cgit v0.12


From 285f49d680a824e788eb6cf107f70cd94d358dfe Mon Sep 17 00:00:00 2001
From: Sergio Ahumada <sergio.ahumada@nokia.com>
Date: Thu, 11 Nov 2010 11:38:15 +0100
Subject: Doc: Fixing typo

---
 src/gui/styles/qs60style.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp
index 5e5adab..5fe9050 100644
--- a/src/gui/styles/qs60style.cpp
+++ b/src/gui/styles/qs60style.cpp
@@ -723,7 +723,7 @@ void QS60StylePrivate::setThemePalette(QPalette *palette) const
     palette->setBrush(QPalette::Base, Qt::transparent);
     // set button color based on pixel colors
 #ifndef Q_WS_S60
-    //For emulated style, just calculate the color everytime
+    //For emulated style, just calculate the color every time
     const QColor buttonColor = calculatedColor(SF_ButtonNormal);
 #else
     const QColor buttonColor = colorFromFrameGraphics(SF_ButtonNormal);
-- 
cgit v0.12


From db1170458ca4a005f63e6aee9fe9cb346e8f54b6 Mon Sep 17 00:00:00 2001
From: Peter Hartmann <peter.hartmann@nokia.com>
Date: Thu, 11 Nov 2010 10:42:31 +0100
Subject: SSL internals: upon error, read all errors from OpenSSL

... and not only the last one. One call to OpenSSL can produce several
errors, which we should always read all. Otherwise, malicious clients
could intentionally poison the error queue.

Inspired-by: Merge request 2290
Reviewed-by: Olivier Goffart
Reviewed-by: Markus Goetz
Task-number: QTBUG-14513
---
 src/network/ssl/qsslsocket_openssl.cpp | 43 ++++++++++++++++++++--------------
 src/network/ssl/qsslsocket_openssl_p.h |  1 +
 2 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
index 2910538..1347b99 100644
--- a/src/network/ssl/qsslsocket_openssl.cpp
+++ b/src/network/ssl/qsslsocket_openssl.cpp
@@ -80,9 +80,6 @@ QT_BEGIN_NAMESPACE
 bool QSslSocketPrivate::s_libraryLoaded = false;
 bool QSslSocketPrivate::s_loadedCiphersAndCerts = false;
 
-// Useful defines
-#define SSL_ERRORSTR() QString::fromLocal8Bit(q_ERR_error_string(q_ERR_get_error(), NULL))
-
 /* \internal
 
     From OpenSSL's thread(3) manual page:
@@ -272,7 +269,7 @@ init_context:
         }
 
         // ### Bad error code
-        q->setErrorString(QSslSocket::tr("Error creating SSL context (%1)").arg(SSL_ERRORSTR()));
+        q->setErrorString(QSslSocket::tr("Error creating SSL context (%1)").arg(getErrorsFromOpenSsl()));
         q->setSocketError(QAbstractSocket::UnknownSocketError);
         emit q->error(QAbstractSocket::UnknownSocketError);
         return false;
@@ -297,7 +294,7 @@ init_context:
 
     if (!q_SSL_CTX_set_cipher_list(ctx, cipherString.data())) {
         // ### Bad error code
-        q->setErrorString(QSslSocket::tr("Invalid or empty cipher list (%1)").arg(SSL_ERRORSTR()));
+        q->setErrorString(QSslSocket::tr("Invalid or empty cipher list (%1)").arg(getErrorsFromOpenSsl()));
         q->setSocketError(QAbstractSocket::UnknownSocketError);
         emit q->error(QAbstractSocket::UnknownSocketError);
         return false;
@@ -325,14 +322,14 @@ init_context:
     if (!configuration.localCertificate.isNull()) {
         // Require a private key as well.
         if (configuration.privateKey.isNull()) {
-            q->setErrorString(QSslSocket::tr("Cannot provide a certificate with no key, %1").arg(SSL_ERRORSTR()));
+            q->setErrorString(QSslSocket::tr("Cannot provide a certificate with no key, %1").arg(getErrorsFromOpenSsl()));
             emit q->error(QAbstractSocket::UnknownSocketError);
             return false;
         }
 
         // Load certificate
         if (!q_SSL_CTX_use_certificate(ctx, (X509 *)configuration.localCertificate.handle())) {
-            q->setErrorString(QSslSocket::tr("Error loading local certificate, %1").arg(SSL_ERRORSTR()));
+            q->setErrorString(QSslSocket::tr("Error loading local certificate, %1").arg(getErrorsFromOpenSsl()));
             emit q->error(QAbstractSocket::UnknownSocketError);
             return false;
         }
@@ -347,14 +344,14 @@ init_context:
         else
             q_EVP_PKEY_set1_DSA(pkey, (DSA *)configuration.privateKey.handle());
         if (!q_SSL_CTX_use_PrivateKey(ctx, pkey)) {
-            q->setErrorString(QSslSocket::tr("Error loading private key, %1").arg(SSL_ERRORSTR()));
+            q->setErrorString(QSslSocket::tr("Error loading private key, %1").arg(getErrorsFromOpenSsl()));
             emit q->error(QAbstractSocket::UnknownSocketError);
             return false;
         }
 
         // Check if the certificate matches the private key.
         if (!q_SSL_CTX_check_private_key(ctx)) {
-            q->setErrorString(QSslSocket::tr("Private key does not certify public key, %1").arg(SSL_ERRORSTR()));
+            q->setErrorString(QSslSocket::tr("Private key does not certify public key, %1").arg(getErrorsFromOpenSsl()));
             emit q->error(QAbstractSocket::UnknownSocketError);
             return false;
         }
@@ -374,7 +371,7 @@ init_context:
     // Create and initialize SSL session
     if (!(ssl = q_SSL_new(ctx))) {
         // ### Bad error code
-        q->setErrorString(QSslSocket::tr("Error creating SSL session, %1").arg(SSL_ERRORSTR()));
+        q->setErrorString(QSslSocket::tr("Error creating SSL session, %1").arg(getErrorsFromOpenSsl()));
         q->setSocketError(QAbstractSocket::UnknownSocketError);
         emit q->error(QAbstractSocket::UnknownSocketError);
         return false;
@@ -389,7 +386,7 @@ init_context:
     writeBio = q_BIO_new(q_BIO_s_mem());
     if (!readBio || !writeBio) {
         // ### Bad error code
-        q->setErrorString(QSslSocket::tr("Error creating SSL session: %1").arg(SSL_ERRORSTR()));
+        q->setErrorString(QSslSocket::tr("Error creating SSL session: %1").arg(getErrorsFromOpenSsl()));
         q->setSocketError(QAbstractSocket::UnknownSocketError);
         emit q->error(QAbstractSocket::UnknownSocketError);
         return false;
@@ -868,7 +865,7 @@ void QSslSocketBackendPrivate::transmit()
                 int writtenBytes = q_SSL_write(ssl, writeBuffer.readPointer(), nextDataBlockSize);
                 if (writtenBytes <= 0) {
                     // ### Better error handling.
-                    q->setErrorString(QSslSocket::tr("Unable to write data: %1").arg(SSL_ERRORSTR()));
+                    q->setErrorString(QSslSocket::tr("Unable to write data: %1").arg(getErrorsFromOpenSsl()));
                     q->setSocketError(QAbstractSocket::UnknownSocketError);
                     emit q->error(QAbstractSocket::UnknownSocketError);
                     return;
@@ -931,7 +928,7 @@ void QSslSocketBackendPrivate::transmit()
                     plainSocket->read(data.data(), writtenToBio);
                 } else {
                     // ### Better error handling.
-                    q->setErrorString(QSslSocket::tr("Unable to decrypt data: %1").arg(SSL_ERRORSTR()));
+                    q->setErrorString(QSslSocket::tr("Unable to decrypt data: %1").arg(getErrorsFromOpenSsl()));
                     q->setSocketError(QAbstractSocket::UnknownSocketError);
                     emit q->error(QAbstractSocket::UnknownSocketError);
                     return;
@@ -1009,7 +1006,7 @@ void QSslSocketBackendPrivate::transmit()
             case SSL_ERROR_SSL: // error in the SSL library
                 // we do not know exactly what the error is, nor whether we can recover from it,
                 // so just return to prevent an endless loop in the outer "while" statement
-                q->setErrorString(QSslSocket::tr("Error while reading: %1").arg(SSL_ERRORSTR()));
+                q->setErrorString(QSslSocket::tr("Error while reading: %1").arg(getErrorsFromOpenSsl()));
                 q->setSocketError(QAbstractSocket::UnknownSocketError);
                 emit q->error(QAbstractSocket::UnknownSocketError);
                 return;
@@ -1019,7 +1016,7 @@ void QSslSocketBackendPrivate::transmit()
                 // SSL_ERROR_WANT_X509_LOOKUP: can only happen with a
                 // SSL_CTX_set_client_cert_cb(), which we do not call.
                 // So this default case should never be triggered.
-                q->setErrorString(QSslSocket::tr("Error while reading: %1").arg(SSL_ERRORSTR()));
+                q->setErrorString(QSslSocket::tr("Error while reading: %1").arg(getErrorsFromOpenSsl()));
                 q->setSocketError(QAbstractSocket::UnknownSocketError);
                 emit q->error(QAbstractSocket::UnknownSocketError);
                 break;
@@ -1114,8 +1111,7 @@ bool QSslSocketBackendPrivate::startHandshake()
             // The handshake is not yet complete.
             break;
         default:
-            // ### Handle errors better
-            q->setErrorString(QSslSocket::tr("Error during SSL handshake: %1").arg(SSL_ERRORSTR()));
+            q->setErrorString(QSslSocket::tr("Error during SSL handshake: %1").arg(getErrorsFromOpenSsl()));
             q->setSocketError(QAbstractSocket::SslHandshakeFailedError);
 #ifdef QSSLSOCKET_DEBUG
             qDebug() << "QSslSocketBackendPrivate::startHandshake: error!" << q->errorString();
@@ -1291,6 +1287,19 @@ QList<QSslCertificate> QSslSocketBackendPrivate::STACKOFX509_to_QSslCertificates
     return certificates;
 }
 
+QString QSslSocketBackendPrivate::getErrorsFromOpenSsl()
+{
+    QString errorString;
+    unsigned long errNum;
+    while((errNum = q_ERR_get_error())) {
+        if (! errorString.isEmpty())
+            errorString.append(QLatin1String(", "));
+        const char *error = q_ERR_error_string(errNum, NULL);
+        errorString.append(QString::fromAscii(error)); // error is ascii according to man ERR_error_string
+    }
+    return errorString;
+}
+
 bool QSslSocketBackendPrivate::isMatchingHostname(const QString &cn, const QString &hostname)
 {
     int wildcard = cn.indexOf(QLatin1Char('*'));
diff --git a/src/network/ssl/qsslsocket_openssl_p.h b/src/network/ssl/qsslsocket_openssl_p.h
index dec98ae..bd5902d 100644
--- a/src/network/ssl/qsslsocket_openssl_p.h
+++ b/src/network/ssl/qsslsocket_openssl_p.h
@@ -117,6 +117,7 @@ public:
     static QSslCipher QSslCipher_from_SSL_CIPHER(SSL_CIPHER *cipher);
     static QList<QSslCertificate> STACKOFX509_to_QSslCertificates(STACK_OF(X509) *x509);
     Q_AUTOTEST_EXPORT static bool isMatchingHostname(const QString &cn, const QString &hostname);
+    static QString getErrorsFromOpenSsl();
 };
 
 #if defined(Q_OS_SYMBIAN)
-- 
cgit v0.12


From 5feca34327eb661cc84e1d6f79052dcdbc1a09c4 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 10 Nov 2010 15:19:14 +0000
Subject: SSL: Fix crashes/hangs when retrieving CA certificates

Added error handling to the certificate retrieval thread
Made the certificate retrieval thread process critical (so if it crashes
the process will crash instead of hang)
Filter the certificate list to only fetch CA certificates which are in
X.509 format (symbian also allows WAP formats, but Qt does not support
these).
Put the TPtr8 for asynch function parameter in the class data so it does
not go out of scope while the function is in progress. Previously it was
on the stack so it could be corrupted before the certificate server had
finished using it.

Task-number: QTBUG-15005
Task-number: QTBUG-15126
Reviewed-by: Markus Goetz
---
 src/network/ssl/qsslsocket_openssl.cpp | 75 ++++++++++++++++++++++++++--------
 src/network/ssl/qsslsocket_openssl_p.h |  1 +
 2 files changed, 60 insertions(+), 16 deletions(-)

diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
index 2910538..426b07a 100644
--- a/src/network/ssl/qsslsocket_openssl.cpp
+++ b/src/network/ssl/qsslsocket_openssl.cpp
@@ -51,6 +51,7 @@
 #include <QtCore/qdebug.h>
 #include <QtCore/qdir.h>
 #include <QtCore/qdiriterator.h>
+#include <QtCore/qelapsedtimer.h>
 #include <QtCore/qfile.h>
 #include <QtCore/qfileinfo.h>
 #include <QtCore/qmutex.h>
@@ -574,7 +575,7 @@ void QSslSocketPrivate::resetDefaultCiphers()
 #if defined(Q_OS_SYMBIAN)
 
 CSymbianCertificateRetriever::CSymbianCertificateRetriever() : CActive(CActive::EPriorityStandard),
-        iSequenceError(KErrNone)
+    iCertificatePtr(0,0,0), iSequenceError(KErrNone)
 {
 }
 
@@ -618,6 +619,11 @@ void CSymbianCertificateRetriever::doThreadEntryL()
     iCertStore = CUnifiedCertStore::NewLC(qt_s60GetRFs(), EFalse);
     iCertFilter = CCertAttributeFilter::NewLC();
 
+    // only interested in CA certs
+    iCertFilter->SetOwnerType(ECACertificate);
+    // only interested in X.509 format (we don't support WAP formats)
+    iCertFilter->SetFormat(EX509Certificate);
+
     // Kick off the sequence by initializing the cert store
     iState = Initializing;
     iCertStore->Initialize(iStatus);
@@ -637,6 +643,7 @@ void CSymbianCertificateRetriever::doThreadEntryL()
 
 TInt CSymbianCertificateRetriever::ThreadEntryPoint(TAny* aParams)
 {
+    User::SetCritical(User::EProcessCritical);
     CTrapCleanup* cleanupStack = CTrapCleanup::New();
 
     CSymbianCertificateRetriever* self = (CSymbianCertificateRetriever*) aParams;
@@ -658,7 +665,17 @@ void CSymbianCertificateRetriever::ConstructL()
 
 void CSymbianCertificateRetriever::DoCancel()
 {
-    // We never cancel the sequence
+    switch(iState) {
+    case Initializing:
+        iCertStore->CancelInitialize();
+        break;
+    case Listing:
+        iCertStore->CancelList();
+        break;
+    case RetrievingCertificates:
+        iCertStore->CancelGetCert();
+        break;
+    }
 }
 
 TInt CSymbianCertificateRetriever::RunError(TInt aError)
@@ -671,37 +688,51 @@ TInt CSymbianCertificateRetriever::RunError(TInt aError)
 
 void CSymbianCertificateRetriever::GetCertificateL()
 {
-    CCTCertInfo* certInfo = iCertInfos[iCurrentCertIndex];
-    iCertificateData.resize(certInfo->Size());
-    TPtr8 des((TUint8*)iCertificateData.data(), 0, iCertificateData.size());
-    iCertStore->Retrieve(*certInfo, des, iStatus);
-    iState = RetrievingCertificates;
-    SetActive();
+    if (iCurrentCertIndex < iCertInfos.Count()) {
+        CCTCertInfo* certInfo = iCertInfos[iCurrentCertIndex++];
+        iCertificateData = QByteArray();
+        QT_TRYCATCH_LEAVING(iCertificateData.resize(certInfo->Size()));
+        iCertificatePtr.Set((TUint8*)iCertificateData.data(), 0, iCertificateData.size());
+#ifdef QSSLSOCKET_DEBUG
+        qDebug() << "getting " << qt_TDesC2QString(certInfo->Label()) << " size=" << certInfo->Size();
+        qDebug() << "format=" << certInfo->CertificateFormat();
+        qDebug() << "ownertype=" << certInfo->CertificateOwnerType();
+        qDebug() << "type=" << hex << certInfo->Type().iUid;
+#endif
+        iCertStore->Retrieve(*certInfo, iCertificatePtr, iStatus);
+        iState = RetrievingCertificates;
+        SetActive();
+    } else {
+        //reached end of list
+        CActiveScheduler::Stop();
+    }
 }
 
 void CSymbianCertificateRetriever::RunL()
 {
+#ifdef QSSLSOCKET_DEBUG
+    qDebug() << "CSymbianCertificateRetriever::RunL status " << iStatus.Int() << " count " << iCertInfos.Count() << " index " << iCurrentCertIndex;
+#endif
     switch (iState) {
     case Initializing:
+        User::LeaveIfError(iStatus.Int()); // initialise fail means pointless to continue
         iState = Listing;
         iCertStore->List(iCertInfos, *iCertFilter, iStatus);
         SetActive();
         break;
 
     case Listing:
+        User::LeaveIfError(iStatus.Int()); // listing fail means pointless to continue
         iCurrentCertIndex = 0;
         GetCertificateL();
         break;
 
     case RetrievingCertificates:
-        iCertificates->append(iCertificateData);
-        iCertificateData = QByteArray();
-        iCurrentCertIndex++;
-        if (iCurrentCertIndex < iCertInfos.Count())
-            GetCertificateL();
+        if (iStatus.Int() == KErrNone)
+            iCertificates->append(iCertificateData);
         else
-            // Stop the scheduler to return to the thread entry function
-            CActiveScheduler::Stop();
+            qWarning() << "CSymbianCertificateRetriever: failed to retreive a certificate, error " << iStatus.Int();
+        GetCertificateL();
         break;
     }
 }
@@ -710,6 +741,10 @@ void CSymbianCertificateRetriever::RunL()
 QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
 {
     ensureInitialized();
+#ifdef QSSLSOCKET_DEBUG
+    QElapsedTimer timer;
+    timer.start();
+#endif
     QList<QSslCertificate> systemCerts;
 #if defined(Q_OS_MAC)
     CFArrayRef cfCerts;
@@ -808,10 +843,18 @@ QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
     retriever->GetCertificates(certs);
     foreach (const QByteArray &encodedCert, certs) {
         QSslCertificate cert(encodedCert, QSsl::Der);
-        if (!cert.isNull())
+        if (!cert.isNull()) {
+#ifdef QSSLSOCKET_DEBUG
+            qDebug() << "imported certificate: " << cert.issuerInfo(QSslCertificate::CommonName);
+#endif
             systemCerts.append(cert);
+        }
     }
 #endif
+#ifdef QSSLSOCKET_DEBUG
+    qDebug() << "systemCaCertificates retrieval time " << timer.elapsed() << "ms";
+    qDebug() << "imported " << systemCerts.count() << " certificates";
+#endif
 
     return systemCerts;
 }
diff --git a/src/network/ssl/qsslsocket_openssl_p.h b/src/network/ssl/qsslsocket_openssl_p.h
index dec98ae..b59a6c9 100644
--- a/src/network/ssl/qsslsocket_openssl_p.h
+++ b/src/network/ssl/qsslsocket_openssl_p.h
@@ -165,6 +165,7 @@ private:
     CCertAttributeFilter* iCertFilter;
     TInt iCurrentCertIndex;
     QByteArray iCertificateData;
+    TPtr8 iCertificatePtr;
     QList<QByteArray>* iCertificates;
     TInt iSequenceError;
 };
-- 
cgit v0.12


From ea2caa8ce983f069eeeba0957b9db6b20baf82b2 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 10 Nov 2010 16:43:20 +0000
Subject: Doc: update symbian capabilities regarding SSL

Testing shows some CA certs require ReadUserData depending which part
of the database they are stored in. Updated docs to reflect this.

Reviewed-by: Markus Goetz
---
 doc/src/platforms/platform-notes.qdoc | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/doc/src/platforms/platform-notes.qdoc b/doc/src/platforms/platform-notes.qdoc
index dbedc1d..9c5f3c8 100644
--- a/doc/src/platforms/platform-notes.qdoc
+++ b/doc/src/platforms/platform-notes.qdoc
@@ -739,6 +739,9 @@
             \o \c AllFiles when \l{http://developer.symbian.org/wiki/index.php/Capabilities_%28Symbian_Signed%29/AllFiles_Capability}{accessing specific areas.}
     \row    \o QtNetwork
             \o \c NetworkServices is basically always required for this module.
+            \o \c ReadUserData is required to include all the phone's SSL certificates in the system's default CA certificate list
+                  (for example those added by the user or stored in the SIM card),
+                  without this capability only the CA certs built into the phone are used.
     \row    \o QtMultiMedia
             \o \c UserEnvironment if QAudioInput is used.
     \endtable
-- 
cgit v0.12


From 644df27056fcd697713fe2338e6743e0fd067011 Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Wed, 10 Nov 2010 16:45:29 +0000
Subject: SSL: Fix for capabilities in QSslCertificate auto test

They were in wrong section of the file due to editing error and
therefore ignored.

Reviewed-by: Markus Goetz
---
 tests/auto/qsslcertificate/qsslcertificate.pro | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tests/auto/qsslcertificate/qsslcertificate.pro b/tests/auto/qsslcertificate/qsslcertificate.pro
index d7671ea..b04dde3 100644
--- a/tests/auto/qsslcertificate/qsslcertificate.pro
+++ b/tests/auto/qsslcertificate/qsslcertificate.pro
@@ -24,5 +24,6 @@ wince*: {
   DEFINES += SRCDIR=\\\".\\\"
 } else:!symbian {
    DEFINES += SRCDIR=\\\"$$PWD/\\\"
-   TARGET.CAPABILITY = NetworkServices
 }
+
+symbian:TARGET.CAPABILITY = NetworkServices ReadUserData
-- 
cgit v0.12


From fac68dca46131d63f11c37210834073848f5a93d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Thu, 11 Nov 2010 10:39:09 +0100
Subject: Don't set -mfpu=neon globally if the compiler supports neon.

By default only drawhelpers and image loaders will now use neon.
If -mfpu=neon has been explicitly enabled in the mkspec,
QT_ALWAYS_HAVE_NEON will be defined, allowing the use of neon
intrinsics elsewhere.

Task-number: QTBUG-15163
Reviewed-by: Benjamin Poulain <benjamin.poulain@nokia.com>
---
 configure                     | 5 ++---
 src/corelib/corelib.pro       | 7 -------
 src/corelib/tools/qsimd.cpp   | 2 +-
 src/corelib/tools/qsimd_p.h   | 3 ++-
 src/corelib/tools/qstring.cpp | 2 +-
 src/gui/gui.pro               | 3 +--
 6 files changed, 7 insertions(+), 15 deletions(-)

diff --git a/configure b/configure
index a238300..5aab180 100755
--- a/configure
+++ b/configure
@@ -3526,7 +3526,7 @@ Usage:  $relconf [-h] [-prefix <dir>] [-prefix-install] [-bindir <dir>] [-libdir
         [-verbose] [-v] [-silent] [-no-nis] [-nis] [-no-cups] [-cups] [-no-iconv]
         [-iconv] [-no-pch] [-pch] [-no-dbus] [-dbus] [-dbus-linked] [-no-gui]
         [-no-separate-debug-info] [-no-mmx] [-no-3dnow] [-no-sse] [-no-sse2]
-        [-no-sse3] [-no-ssse3] [-no-sse4.1] [-no-sse4.2] [-no-avx]
+        [-no-sse3] [-no-ssse3] [-no-sse4.1] [-no-sse4.2] [-no-avx] [-no-neon]
         [-qtnamespace <namespace>] [-qtlibinfix <infix>] [-separate-debug-info] [-armfpa]
         [-no-optimized-qmake] [-optimized-qmake] [-no-xmlpatterns] [-xmlpatterns]
         [-no-multimedia] [-multimedia] [-no-phonon] [-phonon] [-no-phonon-backend] [-phonon-backend]
@@ -3730,6 +3730,7 @@ cat << EOF
     -no-sse4.1.......... Do not compile with use of SSE4.1 instructions.
     -no-sse4.2.......... Do not compile with use of SSE4.2 instructions.
     -no-avx ............ Do not compile with use of AVX instructions.
+    -no-neon ........... Do not compile with use of NEON instructions.
 
     -qtnamespace <name>  Wraps all Qt library code in 'namespace <name> {...}'.
     -qtlibinfix <infix>  Renames all libQt*.so to libQt*<infix>.so.
@@ -4161,8 +4162,6 @@ Qt for Embedded Linux only:
 
     -iwmmxt ............ Compile using the iWMMXt instruction set
                          (available on some XScale CPUs).
-
-    -no-neon ........... Do not compile with use of NEON instructions.
 EOF
 fi
 
diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro
index b7d6034..a001940 100644
--- a/src/corelib/corelib.pro
+++ b/src/corelib/corelib.pro
@@ -37,10 +37,3 @@ symbian: {
     MMP_RULES -= PAGED
     MMP_RULES *= UNPAGED
 }
-
-neon {
-    DEFINES += QT_HAVE_NEON
-    QMAKE_CXXFLAGS *= -mfpu=neon
-}
-
-
diff --git a/src/corelib/tools/qsimd.cpp b/src/corelib/tools/qsimd.cpp
index b2fe2da..63ebafb 100644
--- a/src/corelib/tools/qsimd.cpp
+++ b/src/corelib/tools/qsimd.cpp
@@ -135,7 +135,7 @@ static inline uint detectProcessorFeatures()
 #if defined(QT_HAVE_IWMMXT)
     // runtime detection only available when running as a previlegied process
     features = IWMMXT;
-#elif defined(QT_HAVE_NEON)
+#elif defined(QT_ALWAYS_HAVE_NEON)
     features = NEON;
 #endif
 
diff --git a/src/corelib/tools/qsimd_p.h b/src/corelib/tools/qsimd_p.h
index 664543b..87fa770 100644
--- a/src/corelib/tools/qsimd_p.h
+++ b/src/corelib/tools/qsimd_p.h
@@ -105,7 +105,8 @@ QT_BEGIN_HEADER
 #endif // defined(QT_HAVE_SSE2) && (defined(__SSE2__) || defined(Q_CC_MSVC))
 
 // NEON intrinsics
-#if defined(QT_HAVE_NEON)
+#if defined __ARM_NEON__
+#define QT_ALWAYS_HAVE_NEON
 #include <arm_neon.h>
 #endif
 
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp
index bfbdb73..d4a1248 100644
--- a/src/corelib/tools/qstring.cpp
+++ b/src/corelib/tools/qstring.cpp
@@ -3572,7 +3572,7 @@ static QByteArray toLatin1_helper(const QChar *data, int length)
             }
             length = length % 16;
         }
-#elif QT_HAVE_NEON
+#elif QT_ALWAYS_HAVE_NEON
         // Refer to the documentation of the SSE2 implementation
         // this use eactly the same method as for SSE except:
         // 1) neon has unsigned comparison
diff --git a/src/gui/gui.pro b/src/gui/gui.pro
index 90b5de5..4d51fa8 100644
--- a/src/gui/gui.pro
+++ b/src/gui/gui.pro
@@ -64,13 +64,12 @@ symbian {
 
 neon:*-g++* {
     DEFINES += QT_HAVE_NEON
-    QMAKE_CXXFLAGS *= -mfpu=neon
     HEADERS += $$NEON_HEADERS
     SOURCES += $$NEON_SOURCES
 
     DRAWHELPER_NEON_ASM_FILES = $$NEON_ASM
 
-    neon_compiler.commands = $$QMAKE_CXX -c
+    neon_compiler.commands = $$QMAKE_CXX -c -mfpu=neon
     neon_compiler.commands += $(CXXFLAGS) $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
     neon_compiler.dependency_type = TYPE_C
     neon_compiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
-- 
cgit v0.12


From 76d9e79d1faf174a7052b197b0fe92425bb85f3a Mon Sep 17 00:00:00 2001
From: Martin Smith <martin.smith@nokia.com>
Date: Thu, 11 Nov 2010 15:07:30 +0100
Subject: qdoc: Added QML Elements to the Assistant index

Task-number: QTBUG-15081
---
 tools/qdoc3/helpprojectwriter.cpp       | 16 +++++++++-------
 tools/qdoc3/test/qt-build-docs.qdocconf |  8 ++++++--
 tools/qdoc3/test/qt.qdocconf            |  6 +++++-
 3 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/tools/qdoc3/helpprojectwriter.cpp b/tools/qdoc3/helpprojectwriter.cpp
index 98246c4..63e8df7 100644
--- a/tools/qdoc3/helpprojectwriter.cpp
+++ b/tools/qdoc3/helpprojectwriter.cpp
@@ -49,6 +49,7 @@
 #include "config.h"
 #include "node.h"
 #include "tree.h"
+#include <qdebug.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -250,8 +251,9 @@ bool HelpProjectWriter::generateSection(HelpProject &project,
     foreach (const QString &name, project.subprojects.keys()) {
         SubProject subproject = project.subprojects[name];
         // No selectors: accept all nodes.
-        if (subproject.selectors.isEmpty())
+        if (subproject.selectors.isEmpty()) {
             project.subprojects[name].nodes[objName] = node;
+        }
         else if (subproject.selectors.contains(node->type())) {
             // Accept only the node types in the selectors hash.
             if (node->type() != Node::Fake)
@@ -262,9 +264,10 @@ bool HelpProjectWriter::generateSection(HelpProject &project,
                 const FakeNode *fakeNode = static_cast<const FakeNode *>(node);
                 if (subproject.selectors[node->type()].contains(fakeNode->subType()) &&
                     fakeNode->subType() != Node::ExternalPage &&
-                    !fakeNode->fullTitle().isEmpty())
+                    !fakeNode->fullTitle().isEmpty()) {
 
                     project.subprojects[name].nodes[objName] = node;
+                }
             }
         }
     }
@@ -527,13 +530,11 @@ void HelpProjectWriter::writeNode(HelpProject &project, QXmlStreamWriter &writer
             writer.writeStartElement("section");
             writer.writeAttribute("ref", href);
             writer.writeAttribute("title", fakeNode->fullTitle());
-            //            qDebug() << "Title:" << fakeNode->fullTitle();
             
-            if (fakeNode->subType() == Node::HeaderFile) {
-
+            if ((fakeNode->subType() == Node::HeaderFile) || (fakeNode->subType() == Node::QmlClass)) {
                 // Write subsections for all members, obsolete members and Qt 3
                 // members.
-                if (!project.memberStatus[node].isEmpty()) {
+                if (!project.memberStatus[node].isEmpty() || (fakeNode->subType() == Node::QmlClass)) {
                     QString membersPath = href.left(href.size()-5) + "-members.html";
                     writer.writeStartElement("section");
                     writer.writeAttribute("ref", membersPath);
@@ -690,8 +691,9 @@ void HelpProjectWriter::generateProject(HelpProject &project)
             if (subproject.sortPages) {
                 QStringList titles = subproject.nodes.keys();
                 titles.sort();
-                foreach (const QString &title, titles)
+                foreach (const QString &title, titles) {
                     writeNode(project, writer, subproject.nodes[title]);
+                }
             } else {
                 // Find a contents node and navigate from there, using the NextLink values.
                 foreach (const Node *node, subproject.nodes) {
diff --git a/tools/qdoc3/test/qt-build-docs.qdocconf b/tools/qdoc3/test/qt-build-docs.qdocconf
index dcabeb4..358f17f 100644
--- a/tools/qdoc3/test/qt-build-docs.qdocconf
+++ b/tools/qdoc3/test/qt-build-docs.qdocconf
@@ -62,11 +62,15 @@ qhp.Qt.extraFiles          = index.html \
 qhp.Qt.filterAttributes    = qt 4.7.1 qtrefdoc
 qhp.Qt.customFilters.Qt.name = Qt 4.7.1
 qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.1
-qhp.Qt.subprojects         = classes overviews examples
+qhp.Qt.subprojects         = classes qmlelements overviews examples
 qhp.Qt.subprojects.classes.title = Classes
-qhp.Qt.subprojects.classes.indexTitle = Qt's Classes
+qhp.Qt.subprojects.classes.indexTitle = All Classes
 qhp.Qt.subprojects.classes.selectors = class fake:headerfile
 qhp.Qt.subprojects.classes.sortPages = true
+qhp.Qt.subprojects.qmlelements.title = QML Elements
+qhp.Qt.subprojects.qmlelements.indexTitle = QML Elements
+qhp.Qt.subprojects.qmlelements.selectors = fake:qmlclass
+qhp.Qt.subprojects.qmlelements.sortPages = true
 qhp.Qt.subprojects.overviews.title = Overviews
 qhp.Qt.subprojects.overviews.indexTitle = All Overviews and HOWTOs
 qhp.Qt.subprojects.overviews.selectors = fake:page,group,module
diff --git a/tools/qdoc3/test/qt.qdocconf b/tools/qdoc3/test/qt.qdocconf
index ea97205..947beb2 100644
--- a/tools/qdoc3/test/qt.qdocconf
+++ b/tools/qdoc3/test/qt.qdocconf
@@ -62,11 +62,15 @@ qhp.Qt.extraFiles          = index.html \
 qhp.Qt.filterAttributes    = qt 4.7.1 qtrefdoc
 qhp.Qt.customFilters.Qt.name = Qt 4.7.1
 qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.1
-qhp.Qt.subprojects         = classes overviews examples
+qhp.Qt.subprojects         = classes qmlelements overviews examples
 qhp.Qt.subprojects.classes.title = Classes
 qhp.Qt.subprojects.classes.indexTitle = Qt's Classes
 qhp.Qt.subprojects.classes.selectors = class fake:headerfile
 qhp.Qt.subprojects.classes.sortPages = true
+qhp.Qt.subprojects.qmlelements.title = QML Elements
+qhp.Qt.subprojects.qmlelements.indexTitle = QML Elements
+qhp.Qt.subprojects.qmlelements.selectors = fake:qmlclass
+qhp.Qt.subprojects.qmlelements.sortPages = true
 qhp.Qt.subprojects.overviews.title = Overviews
 qhp.Qt.subprojects.overviews.indexTitle = All Overviews and HOWTOs
 qhp.Qt.subprojects.overviews.selectors = fake:page,group,module
-- 
cgit v0.12


From 978f67a14a1a28881214a6ae31c3852c6cfdc7c9 Mon Sep 17 00:00:00 2001
From: Raphael Kubo da Costa <kubito@gmail.com>
Date: Thu, 11 Nov 2010 18:30:40 +0100
Subject: Add FreeBSD's certificate bundle to the certificates list.

The FreeBSD base system does not ship a certificate bundle, but the
ca_root_nss port provides one extracted from Mozilla's root CA list.

As discussed in QTBUG-14013, it should be preferrable to have bundle
files than separate certificate files, so the path for the certificate
has been added directly.

Signed-off-by: Raphael Kubo da Costa <kubito@gmail.com>

Merge-request: 896
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 src/network/ssl/qsslsocket_openssl.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
index 1347b99..0aeaba9 100644
--- a/src/network/ssl/qsslsocket_openssl.cpp
+++ b/src/network/ssl/qsslsocket_openssl.cpp
@@ -797,6 +797,7 @@ QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
         systemCerts.append(QSslCertificate::fromPath(it.next()));
     }
     systemCerts.append(QSslCertificate::fromPath(QLatin1String("/etc/pki/tls/certs/ca-bundle.crt"), QSsl::Pem)); // Fedora, Mandriva
+    systemCerts.append(QSslCertificate::fromPath(QLatin1String("/usr/local/share/certs/ca-root-nss.crt"), QSsl::Pem)); // FreeBSD's ca_root_nss
 
 #elif defined(Q_OS_SYMBIAN)
     QList<QByteArray> certs;
-- 
cgit v0.12


From acde750479653837612131a847b2fb1246a1ff10 Mon Sep 17 00:00:00 2001
From: Sam Magnuson <smagnuso@gmail.com>
Date: Mon, 8 Nov 2010 13:21:05 -0800
Subject: Implement brush transformations for directfb.

Merge-request: 915
Reviewed-by: Donald Carr <donald.carr@nokia.com>
(cherry picked from commit b62079cf17044e09999eb1808788926ea921fb05)
---
 .../gfxdrivers/directfb/qdirectfbpaintengine.cpp   | 42 ++++++++++++++--------
 1 file changed, 28 insertions(+), 14 deletions(-)

diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
index c16a242..85ff925 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
@@ -68,6 +68,14 @@ public:
         Matrix_BlitsUnsupported = (Matrix_NegativeScale|Matrix_RectsUnsupported)
     };
 
+    inline static uint getTransformationType(const QTransform &transform) {
+        int ret = transform.type();
+        if (qMin(transform.m11(), transform.m22()) < 0) {
+            ret |= QDirectFBPaintEnginePrivate::Matrix_NegativeScale;
+        }
+        return ret;
+    }
+
     enum CompositionModeStatus {
         PorterDuff_None = 0x0,
         PorterDuff_Supported = 0x1,
@@ -99,7 +107,7 @@ public:
 
     inline bool isSimpleBrush(const QBrush &brush) const;
 
-    void drawTiledPixmap(const QRectF &dest, const QPixmap &pixmap, const QPointF &pos);
+    void drawTiledPixmap(const QRectF &dest, const QPixmap &pixmap, const QPointF &pos, const QTransform &pixmapTransform);
     void blit(const QRectF &dest, IDirectFBSurface *surface, const QRectF &src);
 
     inline bool supportsStretchBlit() const;
@@ -707,7 +715,8 @@ void QDirectFBPaintEngine::drawTiledPixmap(const QRectF &r,
         const QPixmap pix(data);
         QRasterPaintEngine::drawTiledPixmap(r, pix, offset);
     } else {
-        CLIPPED_PAINT(d->drawTiledPixmap(r, pixmap, offset));
+        QTransform transform(state()->matrix);
+        CLIPPED_PAINT(d->drawTiledPixmap(r, pixmap, offset, transform));
     }
 }
 
@@ -827,9 +836,14 @@ void QDirectFBPaintEngine::fillRect(const QRectF &rect, const QBrush &brush)
             return; }
 
         case Qt::TexturePattern: {
+            const QPointF &brushOrigin = state()->brushOrigin;
+            const QTransform stateTransform = state()->matrix;
+            QTransform transform(stateTransform);
+            transform.translate(brushOrigin.x(), brushOrigin.y());
+            transform = brush.transform() * transform;
             if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)
-                || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported)
-                || (!d->supportsStretchBlit() && state()->matrix.isScaling())) {
+                || (QDirectFBPaintEnginePrivate::getTransformationType(transform) & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported)
+                || (!d->supportsStretchBlit() && transform.isScaling())) {
                 break;
             }
 
@@ -837,7 +851,7 @@ void QDirectFBPaintEngine::fillRect(const QRectF &rect, const QBrush &brush)
             if (texture.pixmapData()->classId() != QPixmapData::DirectFBClass)
                 break;
 
-            CLIPPED_PAINT(d->drawTiledPixmap(rect, texture, rect.topLeft() - state()->brushOrigin));
+            CLIPPED_PAINT(d->drawTiledPixmap(stateTransform.mapRect(rect), texture, rect.topLeft() - brushOrigin, transform));
             return; }
         default:
             break;
@@ -948,10 +962,7 @@ void QDirectFBPaintEnginePrivate::unlock(QDirectFBPaintDevice *device)
 
 void QDirectFBPaintEnginePrivate::setTransform(const QTransform &transform)
 {
-    transformationType = transform.type();
-    if (qMin(transform.m11(), transform.m22()) < 0) {
-        transformationType |= QDirectFBPaintEnginePrivate::Matrix_NegativeScale;
-    }
+    transformationType = getTransformationType(transform);
     setPen(q->state()->pen);
 }
 
@@ -1153,10 +1164,12 @@ static inline qreal fixCoord(qreal rect_pos, qreal pixmapSize, qreal offset)
     return pos;
 }
 
-void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPixmap &pixmap, const QPointF &off)
+void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPixmap &pixmap,
+                                                  const QPointF &off, const QTransform &pixmapTransform)
 {
-    Q_ASSERT(!(transformationType & Matrix_BlitsUnsupported));
     const QTransform &transform = q->state()->matrix;
+    Q_ASSERT(!(getTransformationType(transform) & Matrix_BlitsUnsupported) &&
+             !(getTransformationType(pixmapTransform) & Matrix_BlitsUnsupported));
     const QRect destinationRect = transform.mapRect(dest).toRect().normalized();
     QRect newClip = destinationRect;
     if (!currentClip.isEmpty())
@@ -1173,7 +1186,7 @@ void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPix
     };
     surface->SetClip(surface, &clip);
 
-    QPointF offset = off;
+    QPointF offset = pixmapTransform.inverted().map(off);
     Q_ASSERT(transform.type() <= QTransform::TxScale);
     QPixmapData *data = pixmap.pixmapData();
     Q_ASSERT(data->classId() == QPixmapData::DirectFBClass);
@@ -1187,13 +1200,14 @@ void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPix
     prepareForBlit(blitFlags);
     QDirectFBPaintEnginePrivate::unlock(dfbData);
     const QSize pixmapSize = dfbData->size();
-    if (transform.isScaling()) {
+    IDirectFBSurface *sourceSurface = dfbData->directFBSurface();
+    if (transform.isScaling() || pixmapTransform.isScaling()) {
         Q_ASSERT(supportsStretchBlit());
         Q_ASSERT(qMin(transform.m11(), transform.m22()) >= 0);
         offset.rx() *= transform.m11();
         offset.ry() *= transform.m22();
 
-        const QSizeF mappedSize(pixmapSize.width() * transform.m11(), pixmapSize.height() * transform.m22());
+        const QSizeF mappedSize(pixmapSize.width() * pixmapTransform.m11(), pixmapSize.height() * pixmapTransform.m22());
         qreal y = fixCoord(destinationRect.y(), mappedSize.height(), offset.y());
         const qreal startX = fixCoord(destinationRect.x(), mappedSize.width(), offset.x());
         while (y <= destinationRect.bottom()) {
-- 
cgit v0.12


From 540d5bde104dd924b24850c0ed8e8ee285b6ec69 Mon Sep 17 00:00:00 2001
From: Donald Carr <donald.carr@nokia.com>
Date: Thu, 11 Nov 2010 17:33:36 +0000
Subject: Minor adjustments to merge-request 915

Fix minor stylistic issue raised by Oswald

Removed duplicate sourceSurface pointer introduced by sibling merge request
---
 src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
index 85ff925..ceed7ae 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
@@ -68,7 +68,8 @@ public:
         Matrix_BlitsUnsupported = (Matrix_NegativeScale|Matrix_RectsUnsupported)
     };
 
-    inline static uint getTransformationType(const QTransform &transform) {
+    inline static uint getTransformationType(const QTransform &transform)
+    {
         int ret = transform.type();
         if (qMin(transform.m11(), transform.m22()) < 0) {
             ret |= QDirectFBPaintEnginePrivate::Matrix_NegativeScale;
@@ -1200,7 +1201,6 @@ void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPix
     prepareForBlit(blitFlags);
     QDirectFBPaintEnginePrivate::unlock(dfbData);
     const QSize pixmapSize = dfbData->size();
-    IDirectFBSurface *sourceSurface = dfbData->directFBSurface();
     if (transform.isScaling() || pixmapTransform.isScaling()) {
         Q_ASSERT(supportsStretchBlit());
         Q_ASSERT(qMin(transform.m11(), transform.m22()) >= 0);
-- 
cgit v0.12


From 0b175f5f224e33f4e51873607fe78a4c203ab896 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Fri, 12 Nov 2010 13:39:58 +1000
Subject: Ensure loaded item's parent is set before component completion.

Also documented Loader sizing behavior.

Task-number: QTBUG-14873
Reviewed-by: Michael Brasser
---
 doc/src/snippets/declarative/loader/sizeitem.qml   | 62 ++++++++++++++++++++++
 doc/src/snippets/declarative/loader/sizeloader.qml | 62 ++++++++++++++++++++++
 .../graphicsitems/qdeclarativeloader.cpp           | 41 +++++++++++---
 3 files changed, 159 insertions(+), 6 deletions(-)
 create mode 100644 doc/src/snippets/declarative/loader/sizeitem.qml
 create mode 100644 doc/src/snippets/declarative/loader/sizeloader.qml

diff --git a/doc/src/snippets/declarative/loader/sizeitem.qml b/doc/src/snippets/declarative/loader/sizeitem.qml
new file mode 100644
index 0000000..6ace8d6
--- /dev/null
+++ b/doc/src/snippets/declarative/loader/sizeitem.qml
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//![0]
+import QtQuick 1.0
+
+Item {
+    width: 200; height: 200
+
+    Loader {
+        // position the Loader in the center of the parent
+        anchors.centerIn: parent
+        sourceComponent: rect
+    }
+
+    Component {
+        id: rect
+        Rectangle {
+            width: 50
+            height: 50
+            color: "red"
+        }
+    }
+}
+//![0]
diff --git a/doc/src/snippets/declarative/loader/sizeloader.qml b/doc/src/snippets/declarative/loader/sizeloader.qml
new file mode 100644
index 0000000..eac7d57
--- /dev/null
+++ b/doc/src/snippets/declarative/loader/sizeloader.qml
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//![0]
+import QtQuick 1.0
+
+Item {
+    width: 200; height: 200
+
+    Loader {
+        // Explicitly set the size of the Loader to the parent item's size
+        anchors.fill: parent
+        sourceComponent: rect
+    }
+
+    Component {
+        id: rect
+        Rectangle {
+            width: 50
+            height: 50
+            color: "red"
+        }
+    }
+}
+//![0]
diff --git a/src/declarative/graphicsitems/qdeclarativeloader.cpp b/src/declarative/graphicsitems/qdeclarativeloader.cpp
index 109fbbb..1119b92 100644
--- a/src/declarative/graphicsitems/qdeclarativeloader.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeloader.cpp
@@ -129,15 +129,41 @@ void QDeclarativeLoaderPrivate::initResize()
 
     The loaded item can be accessed using the \l item property.
 
-    Loader is like any other visual item and must be positioned and sized 
-    accordingly to become visible. Once the component is loaded, the Loader 
-    is automatically resized to the size of the component.
-
     If the \l source or \l sourceComponent changes, any previously instantiated
     items are destroyed. Setting \l source to an empty string or setting
     \l sourceComponent to \c undefined destroys the currently loaded item,
     freeing resources and leaving the Loader empty.
 
+    \section2 Loader sizing behavior
+
+    Loader is like any other visual item and must be positioned and sized
+    accordingly to become visible.
+
+    \list
+    \o If an explicit size is not specified for the Loader, the Loader
+    is automatically resized to the size of the loaded item once the
+    component is loaded.
+    \o If the size of the Loader is specified explicitly by setting
+    the width, height or by anchoring, the loaded item will be resized
+    to the size of the Loader.
+    \endlist
+
+    In both scenarios the size of the item and the Loader are identical.
+    This ensures that anchoring to the Loader is equivalent to anchoring
+    to the loaded item.
+
+    \table
+    \row
+    \o sizeloader.qml
+    \o sizeitem.qml
+    \row
+    \o \snippet doc/src/snippets/declarative/loader/sizeloader.qml 0
+    \o \snippet doc/src/snippets/declarative/loader/sizeitem.qml 0
+    \row
+    \o The red rectangle will be sized to the size of the root item.
+    \o The red rectangle will be 50x50, centered in the root item.
+    \endtable
+
 
     \section2 Receiving signals from loaded items
 
@@ -343,12 +369,14 @@ void QDeclarativeLoaderPrivate::_q_sourceLoaded()
         QDeclarativeContext *ctxt = new QDeclarativeContext(creationContext);
         ctxt->setContextObject(q);
 
-        QDeclarativeComponent *c = component;
-        QObject *obj = component->create(ctxt);
+        QDeclarativeGuard<QDeclarativeComponent> c = component;
+        QObject *obj = component->beginCreate(ctxt);
         if (component != c) {
             // component->create could trigger a change in source that causes
             // component to be set to something else. In that case we just
             // need to cleanup.
+            if (c)
+                c->completeCreate();
             delete obj;
             delete ctxt;
             return;
@@ -373,6 +401,7 @@ void QDeclarativeLoaderPrivate::_q_sourceLoaded()
             delete ctxt;
             source = QUrl();
         }
+        component->completeCreate();
         emit q->sourceChanged();
         emit q->statusChanged();
         emit q->progressChanged();
-- 
cgit v0.12


From ec288ed3720ab3fdc41f3c3698fe58fb322ad090 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Fri, 12 Nov 2010 15:35:41 +1000
Subject: Ensure increment/decrementCurrentIndex always move items in the
 correct direction.

With < 4 items the shortest distance algorithm doesn't work since it
is equal distance either way.

Task-number: QTBUG-15260
Reviewed-by: Yann Bodson
---
 .../graphicsitems/qdeclarativepathview.cpp         | 30 +++++++++++++++-------
 .../graphicsitems/qdeclarativepathview_p_p.h       |  4 ++-
 2 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativepathview.cpp b/src/declarative/graphicsitems/qdeclarativepathview.cpp
index dc3d5ee..ea929cf 100644
--- a/src/declarative/graphicsitems/qdeclarativepathview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepathview.cpp
@@ -607,6 +607,8 @@ void QDeclarativePathView::setCurrentIndex(int idx)
 */
 void QDeclarativePathView::incrementCurrentIndex()
 {
+    Q_D(QDeclarativePathView);
+    d->moveDirection = QDeclarativePathViewPrivate::Positive;
     setCurrentIndex(currentIndex()+1);
 }
 
@@ -625,6 +627,7 @@ void QDeclarativePathView::decrementCurrentIndex()
         int idx = currentIndex()-1;
         if (idx < 0)
             idx = d->modelCount - 1;
+        d->moveDirection = QDeclarativePathViewPrivate::Negative;
         setCurrentIndex(idx);
     }
 }
@@ -1636,7 +1639,7 @@ void QDeclarativePathViewPrivate::snapToCurrent()
     if (!model || modelCount <= 0)
         return;
 
-    qreal targetOffset = modelCount - currentIndex;
+    qreal targetOffset = qmlMod(modelCount - currentIndex, modelCount);
 
     moveReason = Other;
     offsetAdj = 0.0;
@@ -1645,19 +1648,28 @@ void QDeclarativePathViewPrivate::snapToCurrent()
 
     const int duration = highlightMoveDuration;
 
-    if (targetOffset - offset > modelCount/2) {
+    if (moveDirection == Positive || (moveDirection == Shortest && targetOffset - offset > modelCount/2)) {
         qreal distance = modelCount - targetOffset + offset;
-        tl.move(moveOffset, 0.0, QEasingCurve(QEasingCurve::InQuad), int(duration * offset / distance));
-        tl.set(moveOffset, modelCount);
-        tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::OutQuad), int(duration * (modelCount-targetOffset) / distance));
-    } else if (targetOffset - offset <= -modelCount/2) {
+        if (targetOffset > moveOffset) {
+            tl.move(moveOffset, 0.0, QEasingCurve(QEasingCurve::InQuad), int(duration * offset / distance));
+            tl.set(moveOffset, modelCount);
+            tl.move(moveOffset, targetOffset, QEasingCurve(offset == 0.0 ? QEasingCurve::InOutQuad : QEasingCurve::OutQuad), int(duration * (modelCount-targetOffset) / distance));
+        } else {
+            tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::InOutQuad), duration);
+        }
+    } else if (moveDirection == Negative || targetOffset - offset <= -modelCount/2) {
         qreal distance = modelCount - offset + targetOffset;
-        tl.move(moveOffset, modelCount, QEasingCurve(QEasingCurve::InQuad), int(duration * (modelCount-offset) / distance));
-        tl.set(moveOffset, 0.0);
-        tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::OutQuad), int(duration * targetOffset / distance));
+        if (targetOffset < moveOffset) {
+            tl.move(moveOffset, modelCount, QEasingCurve(targetOffset == 0 ? QEasingCurve::InOutQuad : QEasingCurve::InQuad), int(duration * (modelCount-offset) / distance));
+            tl.set(moveOffset, 0.0);
+            tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::OutQuad), int(duration * targetOffset / distance));
+        } else {
+            tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::InOutQuad), duration);
+        }
     } else {
         tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::InOutQuad), duration);
     }
+    moveDirection = Shortest;
 }
 
 QDeclarativePathViewAttached *QDeclarativePathView::qmlAttachedProperties(QObject *obj)
diff --git a/src/declarative/graphicsitems/qdeclarativepathview_p_p.h b/src/declarative/graphicsitems/qdeclarativepathview_p_p.h
index b217216..6232b83 100644
--- a/src/declarative/graphicsitems/qdeclarativepathview_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativepathview_p_p.h
@@ -82,7 +82,7 @@ public:
         , dragMargin(0), deceleration(100)
         , moveOffset(this, &QDeclarativePathViewPrivate::setAdjustedOffset)
         , firstIndex(-1), pathItems(-1), requestedIndex(-1)
-        , moveReason(Other), attType(0), highlightComponent(0), highlightItem(0)
+        , moveReason(Other), moveDirection(Shortest), attType(0), highlightComponent(0), highlightItem(0)
         , moveHighlight(this, &QDeclarativePathViewPrivate::setHighlightPosition)
         , highlightPosition(0)
         , highlightRangeStart(0), highlightRangeEnd(0)
@@ -173,6 +173,8 @@ public:
     QVariant modelVariant;
     enum MovementReason { Other, SetIndex, Mouse };
     MovementReason moveReason;
+    enum MovementDirection { Shortest, Negative, Positive };
+    MovementDirection moveDirection;
     QDeclarativeOpenMetaObjectType *attType;
     QDeclarativeComponent *highlightComponent;
     QDeclarativeItem *highlightItem;
-- 
cgit v0.12


From 4a01dc326faa0bc7d61f67e8848e194c3c3b99c5 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Fri, 12 Nov 2010 15:54:50 +1000
Subject: Fix PathView key navigation docs.

Task-number: QTBUG-15222
Reviewed-by: Yann Bodson
---
 src/declarative/graphicsitems/qdeclarativepathview.cpp | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/declarative/graphicsitems/qdeclarativepathview.cpp b/src/declarative/graphicsitems/qdeclarativepathview.cpp
index ea929cf..926bec2 100644
--- a/src/declarative/graphicsitems/qdeclarativepathview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepathview.cpp
@@ -373,7 +373,21 @@ void QDeclarativePathViewPrivate::regenerate()
     opacity of the items as they rotate. This additional code can be seen in the
     PathAttribute documentation.)
 
-    The \c focus can be set to \c true to enable keyboard navigation.
+    PathView does not automatically handle keyboard navigation.  This is because
+    the keys to use for navigation will depend upon the shape of the path.  Navigation
+    can be added quite simply by setting \c focus to \c true and calling
+    \l decrementCurrentIndex() or \l incrementCurrentIndex(), for example to navigate
+    using the left and right arrow keys:
+
+    \code
+    PathView {
+        ...
+        focus: true
+        Keys.onLeftPressed: decrementCurrentIndex()
+        Keys.onRightPressed: incrementCurrentIndex()
+    }
+    \endcode
+
     The path view itself is a focus scope (see \l{qmlfocus#Acquiring Focus and Focus Scopes}{the focus documentation page} for more details).
 
     Delegates are instantiated as needed and may be destroyed at any time.
-- 
cgit v0.12


From 54ce087390724b5e03f95b93a5661d0a60765daa Mon Sep 17 00:00:00 2001
From: Dominik Holland <dominik.holland@nokia.com>
Date: Fri, 12 Nov 2010 10:47:55 +0100
Subject: Crash fix, when the Object will be deleted during handling a
 QGestureEvent.

The QGestures will now not be deleted immediatly. QGestureManager waits until all
QGestureEvents are processed and will delete the QGestures afterwards.

Task: QT-4022
Reviewed By: Zeno Albisser
---
 src/gui/kernel/qgesturemanager.cpp | 10 ++++++++--
 src/gui/kernel/qgesturemanager_p.h |  1 +
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/gui/kernel/qgesturemanager.cpp b/src/gui/kernel/qgesturemanager.cpp
index 5e9a0cb..9519447 100644
--- a/src/gui/kernel/qgesturemanager.cpp
+++ b/src/gui/kernel/qgesturemanager.cpp
@@ -175,9 +175,9 @@ void QGestureManager::cleanupCachedGestures(QObject *target, Qt::GestureType typ
                 m_activeGestures.remove(g);
                 m_gestureOwners.remove(g);
                 m_gestureTargets.remove(g);
+                m_gesturesToDelete.insert(g);
             }
 
-            qDeleteAll(gestures);
             iter = m_objectGestures.erase(iter);
         } else {
             ++iter;
@@ -385,6 +385,11 @@ bool QGestureManager::filterEventThroughContexts(const QMultiMap<QObject *,
         recycle(gesture);
         m_gestureTargets.remove(gesture);
     }
+
+    //Clean up the Gestures
+    qDeleteAll(m_gesturesToDelete);
+    m_gesturesToDelete.clear();
+
     return ret;
 }
 
@@ -447,7 +452,8 @@ void QGestureManager::cancelGesturesForChildren(QGesture *original)
 void QGestureManager::cleanupGesturesForRemovedRecognizer(QGesture *gesture)
 {
     QGestureRecognizer *recognizer = m_deletedRecognizers.value(gesture);
-    Q_ASSERT(recognizer);
+    if(!recognizer) //The Gesture is removed while in the even loop, so the recognizers for this gestures was removed
+        return;
     m_deletedRecognizers.remove(gesture);
     if (m_deletedRecognizers.keys(recognizer).isEmpty()) {
         // no more active gestures, cleanup!
diff --git a/src/gui/kernel/qgesturemanager_p.h b/src/gui/kernel/qgesturemanager_p.h
index 0d84b67..a5a3482 100644
--- a/src/gui/kernel/qgesturemanager_p.h
+++ b/src/gui/kernel/qgesturemanager_p.h
@@ -130,6 +130,7 @@ private:
 
     QHash<QGestureRecognizer *, QSet<QGesture *> > m_obsoleteGestures;
     QHash<QGesture *, QGestureRecognizer *> m_deletedRecognizers;
+    QSet<QGesture *> m_gesturesToDelete;
     void cleanupGesturesForRemovedRecognizer(QGesture *gesture);
 
     QGesture *getState(QObject *widget, QGestureRecognizer *recognizer,
-- 
cgit v0.12


From 4e0865200244b70e6d4be62b57bdf248342834ba Mon Sep 17 00:00:00 2001
From: Martin Smith <martin.smith@nokia.com>
Date: Fri, 12 Nov 2010 12:05:04 +0100
Subject: doc: Stated that the destructor does not call close().

Task-number: QTBUG-15277, QTBUG-8231
---
 src/corelib/io/qiodevice.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp
index 26e587d..68fb2bf 100644
--- a/src/corelib/io/qiodevice.cpp
+++ b/src/corelib/io/qiodevice.cpp
@@ -395,7 +395,10 @@ QIODevice::QIODevice(QIODevicePrivate &dd, QObject *parent)
 
 
 /*!
-    Destructs the QIODevice object.
+  The destructor is virtual, and QIODevice is an abstract base
+  class. This destructor does not call close(), but the subclass
+  destructor might. If you are in doubt, call close() before
+  destroying the QIODevice.
 */
 QIODevice::~QIODevice()
 {
-- 
cgit v0.12


From 4ba3dadcae97bfde6216c32cfa339f8f0e0253c7 Mon Sep 17 00:00:00 2001
From: Joerg Bornemann <joerg.bornemann@nokia.com>
Date: Fri, 12 Nov 2010 13:16:03 +0100
Subject: qmake vcxproj generator: fix description of custom build tools

The description of custom build tools that handle more than one extra
compiler cannot be separated by ampersands in Visual Studio 2010.
This seems to be a msbuild bug. We'll just circumvent this issue by
changing the separator in the description to comma.

Task-number: QTBUG-13986
Reviewed-by: ossi
---
 qmake/generators/win32/msbuild_objectmodel.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp
index c963f46..c3436b4 100644
--- a/qmake/generators/win32/msbuild_objectmodel.cpp
+++ b/qmake/generators/win32/msbuild_objectmodel.cpp
@@ -2507,7 +2507,7 @@ bool VCXFilter::addExtraCompiler(const VCXFilterFile &info)
 
         // Output in info.additionalFile -----------
         if (!CustomBuildTool.Description.isEmpty())
-            CustomBuildTool.Description += " & ";
+            CustomBuildTool.Description += ", ";
         CustomBuildTool.Description += cmd_name;
         CustomBuildTool.CommandLine += VCToolBase::fixCommandLine(cmd.trimmed());
         int space = cmd.indexOf(' ');
-- 
cgit v0.12


From f31f50852b8bbfc658708be44e7d495637a63f4f Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Wed, 10 Nov 2010 19:32:29 +0100
Subject: Fix compilation by s/intptr_t/quintptr/

intptr_t is defined in some C header that we don't include. I don't
know which one it is, but without it, it fails to compile with:

declarative/qml/qdeclarativecontext.cpp:477: error: 'intptr_t' was not declared in this scope

Reviewed-By: Trust Me
---
 src/declarative/qml/qdeclarativecompiledbindings.cpp  | 2 +-
 src/declarative/qml/qdeclarativecontext.cpp           | 4 ++--
 src/declarative/qml/qdeclarativeobjectscriptclass.cpp | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/declarative/qml/qdeclarativecompiledbindings.cpp b/src/declarative/qml/qdeclarativecompiledbindings.cpp
index 5f0fd56..fbe5829 100644
--- a/src/declarative/qml/qdeclarativecompiledbindings.cpp
+++ b/src/declarative/qml/qdeclarativecompiledbindings.cpp
@@ -601,7 +601,7 @@ struct QDeclarativeBindingCompilerPrivate
     QDeclarativeImports imports;
     QDeclarativeEnginePrivate *engine;
 
-    QString contextName() const { return QLatin1String("$$$SCOPE_") + QString::number((intptr_t)context, 16); }
+    QString contextName() const { return QLatin1String("$$$SCOPE_") + QString::number((quintptr)context, 16); }
 
     bool compile(QDeclarativeJS::AST::Node *);
 
diff --git a/src/declarative/qml/qdeclarativecontext.cpp b/src/declarative/qml/qdeclarativecontext.cpp
index 1e58a71..3ee0e6f 100644
--- a/src/declarative/qml/qdeclarativecontext.cpp
+++ b/src/declarative/qml/qdeclarativecontext.cpp
@@ -474,7 +474,7 @@ int QDeclarativeContextPrivate::context_count(QDeclarativeListProperty<QObject>
 {
     QDeclarativeContext *context = static_cast<QDeclarativeContext*>(prop->object);
     QDeclarativeContextPrivate *d = QDeclarativeContextPrivate::get(context);
-    int contextProperty = (int)(intptr_t)prop->data;
+    int contextProperty = (int)(quintptr)prop->data;
 
     if (d->propertyValues.at(contextProperty).userType() != qMetaTypeId<QList<QObject*> >()) {
         return 0;
@@ -487,7 +487,7 @@ QObject *QDeclarativeContextPrivate::context_at(QDeclarativeListProperty<QObject
 {
     QDeclarativeContext *context = static_cast<QDeclarativeContext*>(prop->object);
     QDeclarativeContextPrivate *d = QDeclarativeContextPrivate::get(context);
-    int contextProperty = (int)(intptr_t)prop->data;
+    int contextProperty = (int)(quintptr)prop->data;
 
     if (d->propertyValues.at(contextProperty).userType() != qMetaTypeId<QList<QObject*> >()) {
         return 0;
diff --git a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
index ea92111..eff59df 100644
--- a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
+++ b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
@@ -421,7 +421,7 @@ QScriptValue QDeclarativeObjectScriptClass::tostring(QScriptContext *context, QS
 
         ret += QString::fromUtf8(obj->metaObject()->className());
         ret += QLatin1String("(0x");
-        ret += QString::number((intptr_t)obj,16);
+        ret += QString::number((quintptr)obj,16);
 
         if (!objectName.isEmpty()) {
             ret += QLatin1String(", \"");
-- 
cgit v0.12


From 4f8d55c493db989984ec64bd05453e14d7a0cab2 Mon Sep 17 00:00:00 2001
From: Philip Van Hoof <philip@codeminded.be>
Date: Mon, 1 Nov 2010 16:59:44 +0100
Subject: Push and pop the thread-default context for the current thread

Merge-request: 869
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
(cherry picked from commit aa88b7044dd86850e6986aa80104bb38bb7b12eb)
---
 src/corelib/kernel/qeventdispatcher_glib.cpp | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/corelib/kernel/qeventdispatcher_glib.cpp b/src/corelib/kernel/qeventdispatcher_glib.cpp
index 8390275..6fa2707 100644
--- a/src/corelib/kernel/qeventdispatcher_glib.cpp
+++ b/src/corelib/kernel/qeventdispatcher_glib.cpp
@@ -311,6 +311,10 @@ QEventDispatcherGlibPrivate::QEventDispatcherGlibPrivate(GMainContext *context)
         }
     }
 
+#if GLIB_CHECK_VERSION (2, 22, 0)
+    g_main_context_push_thread_default (mainContext);
+#endif
+
     // setup post event source
     postEventSource = reinterpret_cast<GPostEventSource *>(g_source_new(&postEventSourceFuncs,
                                                                         sizeof(GPostEventSource)));
@@ -389,6 +393,9 @@ QEventDispatcherGlib::~QEventDispatcherGlib()
     d->postEventSource = 0;
 
     Q_ASSERT(d->mainContext != 0);
+#if GLIB_CHECK_VERSION (2, 22, 0)
+    g_main_context_pop_thread_default (d->mainContext);
+#endif
     g_main_context_unref(d->mainContext);
     d->mainContext = 0;
 }
-- 
cgit v0.12


From 18ac111fe5fafed5ac2b5db97def3be2a898df7e Mon Sep 17 00:00:00 2001
From: Denis Dzyubenko <denis.dzyubenko@nokia.com>
Date: Wed, 10 Nov 2010 11:28:36 +0100
Subject: Added an example for QTest::touchEvent to the documentation.

Reviewed-by: trustme
---
 doc/src/snippets/code/src_qtestlib_qtestcase.cpp | 16 ++++++++++++++++
 src/testlib/qtestcase.cpp                        |  3 +++
 2 files changed, 19 insertions(+)

diff --git a/doc/src/snippets/code/src_qtestlib_qtestcase.cpp b/doc/src/snippets/code/src_qtestlib_qtestcase.cpp
index 6ae8939..adb0c34 100644
--- a/doc/src/snippets/code/src_qtestlib_qtestcase.cpp
+++ b/doc/src/snippets/code/src_qtestlib_qtestcase.cpp
@@ -230,5 +230,21 @@ widget.show();
 QTest::qWaitForWindowShown(&widget);
 //! [24]
 
+//! [25]
+QWidget widget;
+
+QTest::touchEvent(&widget)
+    .press(0, QPoint(10, 10));
+QTest::touchEvent(&widget)
+    .stationary(0)
+    .press(1, QPoint(40, 10));
+QTest::touchEvent(&widget)
+    .move(0, QPoint(12, 12))
+    .move(1, QPoint(45, 5));
+QTest::touchEvent(&widget)
+    .release(0)
+    .release(1);
+//! [25]
+
 }
 
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index 17f1a6b..e3a8726 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -755,6 +755,9 @@ QT_BEGIN_NAMESPACE
     QTest::touchEvent to create a QTouchEventSequence instance. Add touch events to
     the sequence by calling press(), move(), release() and stationary(), and let the
     instance run out of scope to commit the sequence to the event system.
+
+    Example:
+    \snippet doc/src/snippets/code/src_qtestlib_qtestcase.cpp 25
 */
 
 /*!
-- 
cgit v0.12


From 7298b6b708752f68d16088e35e0aa9614052957c Mon Sep 17 00:00:00 2001
From: Peter Hartmann <peter.hartmann@nokia.com>
Date: Thu, 11 Nov 2010 10:42:31 +0100
Subject: SSL internals: upon error, read all errors from OpenSSL

... and not only the last one. One call to OpenSSL can produce several
errors, which we should always read all. Otherwise, malicious clients
could intentionally poison the error queue.

Inspired-by: Merge request 2290
Reviewed-by: Olivier Goffart
Reviewed-by: Markus Goetz
Task-number: QTBUG-14513
---
 src/network/ssl/qsslsocket_openssl.cpp | 43 ++++++++++++++++++++--------------
 src/network/ssl/qsslsocket_openssl_p.h |  1 +
 2 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
index 426b07a..adeb6f9 100644
--- a/src/network/ssl/qsslsocket_openssl.cpp
+++ b/src/network/ssl/qsslsocket_openssl.cpp
@@ -81,9 +81,6 @@ QT_BEGIN_NAMESPACE
 bool QSslSocketPrivate::s_libraryLoaded = false;
 bool QSslSocketPrivate::s_loadedCiphersAndCerts = false;
 
-// Useful defines
-#define SSL_ERRORSTR() QString::fromLocal8Bit(q_ERR_error_string(q_ERR_get_error(), NULL))
-
 /* \internal
 
     From OpenSSL's thread(3) manual page:
@@ -273,7 +270,7 @@ init_context:
         }
 
         // ### Bad error code
-        q->setErrorString(QSslSocket::tr("Error creating SSL context (%1)").arg(SSL_ERRORSTR()));
+        q->setErrorString(QSslSocket::tr("Error creating SSL context (%1)").arg(getErrorsFromOpenSsl()));
         q->setSocketError(QAbstractSocket::UnknownSocketError);
         emit q->error(QAbstractSocket::UnknownSocketError);
         return false;
@@ -298,7 +295,7 @@ init_context:
 
     if (!q_SSL_CTX_set_cipher_list(ctx, cipherString.data())) {
         // ### Bad error code
-        q->setErrorString(QSslSocket::tr("Invalid or empty cipher list (%1)").arg(SSL_ERRORSTR()));
+        q->setErrorString(QSslSocket::tr("Invalid or empty cipher list (%1)").arg(getErrorsFromOpenSsl()));
         q->setSocketError(QAbstractSocket::UnknownSocketError);
         emit q->error(QAbstractSocket::UnknownSocketError);
         return false;
@@ -326,14 +323,14 @@ init_context:
     if (!configuration.localCertificate.isNull()) {
         // Require a private key as well.
         if (configuration.privateKey.isNull()) {
-            q->setErrorString(QSslSocket::tr("Cannot provide a certificate with no key, %1").arg(SSL_ERRORSTR()));
+            q->setErrorString(QSslSocket::tr("Cannot provide a certificate with no key, %1").arg(getErrorsFromOpenSsl()));
             emit q->error(QAbstractSocket::UnknownSocketError);
             return false;
         }
 
         // Load certificate
         if (!q_SSL_CTX_use_certificate(ctx, (X509 *)configuration.localCertificate.handle())) {
-            q->setErrorString(QSslSocket::tr("Error loading local certificate, %1").arg(SSL_ERRORSTR()));
+            q->setErrorString(QSslSocket::tr("Error loading local certificate, %1").arg(getErrorsFromOpenSsl()));
             emit q->error(QAbstractSocket::UnknownSocketError);
             return false;
         }
@@ -348,14 +345,14 @@ init_context:
         else
             q_EVP_PKEY_set1_DSA(pkey, (DSA *)configuration.privateKey.handle());
         if (!q_SSL_CTX_use_PrivateKey(ctx, pkey)) {
-            q->setErrorString(QSslSocket::tr("Error loading private key, %1").arg(SSL_ERRORSTR()));
+            q->setErrorString(QSslSocket::tr("Error loading private key, %1").arg(getErrorsFromOpenSsl()));
             emit q->error(QAbstractSocket::UnknownSocketError);
             return false;
         }
 
         // Check if the certificate matches the private key.
         if (!q_SSL_CTX_check_private_key(ctx)) {
-            q->setErrorString(QSslSocket::tr("Private key does not certify public key, %1").arg(SSL_ERRORSTR()));
+            q->setErrorString(QSslSocket::tr("Private key does not certify public key, %1").arg(getErrorsFromOpenSsl()));
             emit q->error(QAbstractSocket::UnknownSocketError);
             return false;
         }
@@ -375,7 +372,7 @@ init_context:
     // Create and initialize SSL session
     if (!(ssl = q_SSL_new(ctx))) {
         // ### Bad error code
-        q->setErrorString(QSslSocket::tr("Error creating SSL session, %1").arg(SSL_ERRORSTR()));
+        q->setErrorString(QSslSocket::tr("Error creating SSL session, %1").arg(getErrorsFromOpenSsl()));
         q->setSocketError(QAbstractSocket::UnknownSocketError);
         emit q->error(QAbstractSocket::UnknownSocketError);
         return false;
@@ -390,7 +387,7 @@ init_context:
     writeBio = q_BIO_new(q_BIO_s_mem());
     if (!readBio || !writeBio) {
         // ### Bad error code
-        q->setErrorString(QSslSocket::tr("Error creating SSL session: %1").arg(SSL_ERRORSTR()));
+        q->setErrorString(QSslSocket::tr("Error creating SSL session: %1").arg(getErrorsFromOpenSsl()));
         q->setSocketError(QAbstractSocket::UnknownSocketError);
         emit q->error(QAbstractSocket::UnknownSocketError);
         return false;
@@ -911,7 +908,7 @@ void QSslSocketBackendPrivate::transmit()
                 int writtenBytes = q_SSL_write(ssl, writeBuffer.readPointer(), nextDataBlockSize);
                 if (writtenBytes <= 0) {
                     // ### Better error handling.
-                    q->setErrorString(QSslSocket::tr("Unable to write data: %1").arg(SSL_ERRORSTR()));
+                    q->setErrorString(QSslSocket::tr("Unable to write data: %1").arg(getErrorsFromOpenSsl()));
                     q->setSocketError(QAbstractSocket::UnknownSocketError);
                     emit q->error(QAbstractSocket::UnknownSocketError);
                     return;
@@ -974,7 +971,7 @@ void QSslSocketBackendPrivate::transmit()
                     plainSocket->read(data.data(), writtenToBio);
                 } else {
                     // ### Better error handling.
-                    q->setErrorString(QSslSocket::tr("Unable to decrypt data: %1").arg(SSL_ERRORSTR()));
+                    q->setErrorString(QSslSocket::tr("Unable to decrypt data: %1").arg(getErrorsFromOpenSsl()));
                     q->setSocketError(QAbstractSocket::UnknownSocketError);
                     emit q->error(QAbstractSocket::UnknownSocketError);
                     return;
@@ -1052,7 +1049,7 @@ void QSslSocketBackendPrivate::transmit()
             case SSL_ERROR_SSL: // error in the SSL library
                 // we do not know exactly what the error is, nor whether we can recover from it,
                 // so just return to prevent an endless loop in the outer "while" statement
-                q->setErrorString(QSslSocket::tr("Error while reading: %1").arg(SSL_ERRORSTR()));
+                q->setErrorString(QSslSocket::tr("Error while reading: %1").arg(getErrorsFromOpenSsl()));
                 q->setSocketError(QAbstractSocket::UnknownSocketError);
                 emit q->error(QAbstractSocket::UnknownSocketError);
                 return;
@@ -1062,7 +1059,7 @@ void QSslSocketBackendPrivate::transmit()
                 // SSL_ERROR_WANT_X509_LOOKUP: can only happen with a
                 // SSL_CTX_set_client_cert_cb(), which we do not call.
                 // So this default case should never be triggered.
-                q->setErrorString(QSslSocket::tr("Error while reading: %1").arg(SSL_ERRORSTR()));
+                q->setErrorString(QSslSocket::tr("Error while reading: %1").arg(getErrorsFromOpenSsl()));
                 q->setSocketError(QAbstractSocket::UnknownSocketError);
                 emit q->error(QAbstractSocket::UnknownSocketError);
                 break;
@@ -1157,8 +1154,7 @@ bool QSslSocketBackendPrivate::startHandshake()
             // The handshake is not yet complete.
             break;
         default:
-            // ### Handle errors better
-            q->setErrorString(QSslSocket::tr("Error during SSL handshake: %1").arg(SSL_ERRORSTR()));
+            q->setErrorString(QSslSocket::tr("Error during SSL handshake: %1").arg(getErrorsFromOpenSsl()));
             q->setSocketError(QAbstractSocket::SslHandshakeFailedError);
 #ifdef QSSLSOCKET_DEBUG
             qDebug() << "QSslSocketBackendPrivate::startHandshake: error!" << q->errorString();
@@ -1334,6 +1330,19 @@ QList<QSslCertificate> QSslSocketBackendPrivate::STACKOFX509_to_QSslCertificates
     return certificates;
 }
 
+QString QSslSocketBackendPrivate::getErrorsFromOpenSsl()
+{
+    QString errorString;
+    unsigned long errNum;
+    while((errNum = q_ERR_get_error())) {
+        if (! errorString.isEmpty())
+            errorString.append(QLatin1String(", "));
+        const char *error = q_ERR_error_string(errNum, NULL);
+        errorString.append(QString::fromAscii(error)); // error is ascii according to man ERR_error_string
+    }
+    return errorString;
+}
+
 bool QSslSocketBackendPrivate::isMatchingHostname(const QString &cn, const QString &hostname)
 {
     int wildcard = cn.indexOf(QLatin1Char('*'));
diff --git a/src/network/ssl/qsslsocket_openssl_p.h b/src/network/ssl/qsslsocket_openssl_p.h
index b59a6c9..878c654 100644
--- a/src/network/ssl/qsslsocket_openssl_p.h
+++ b/src/network/ssl/qsslsocket_openssl_p.h
@@ -117,6 +117,7 @@ public:
     static QSslCipher QSslCipher_from_SSL_CIPHER(SSL_CIPHER *cipher);
     static QList<QSslCertificate> STACKOFX509_to_QSslCertificates(STACK_OF(X509) *x509);
     Q_AUTOTEST_EXPORT static bool isMatchingHostname(const QString &cn, const QString &hostname);
+    static QString getErrorsFromOpenSsl();
 };
 
 #if defined(Q_OS_SYMBIAN)
-- 
cgit v0.12


From 852fd6b9c05fd082a6a357faae18e63c2687058b Mon Sep 17 00:00:00 2001
From: Raphael Kubo da Costa <kubito@gmail.com>
Date: Thu, 11 Nov 2010 18:30:40 +0100
Subject: Add FreeBSD's certificate bundle to the certificates list.

The FreeBSD base system does not ship a certificate bundle, but the
ca_root_nss port provides one extracted from Mozilla's root CA list.

As discussed in QTBUG-14013, it should be preferrable to have bundle
files than separate certificate files, so the path for the certificate
has been added directly.

Signed-off-by: Raphael Kubo da Costa <kubito@gmail.com>

Merge-request: 896
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 src/network/ssl/qsslsocket_openssl.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
index adeb6f9..70ef7ba 100644
--- a/src/network/ssl/qsslsocket_openssl.cpp
+++ b/src/network/ssl/qsslsocket_openssl.cpp
@@ -832,6 +832,7 @@ QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
         systemCerts.append(QSslCertificate::fromPath(it.next()));
     }
     systemCerts.append(QSslCertificate::fromPath(QLatin1String("/etc/pki/tls/certs/ca-bundle.crt"), QSsl::Pem)); // Fedora, Mandriva
+    systemCerts.append(QSslCertificate::fromPath(QLatin1String("/usr/local/share/certs/ca-root-nss.crt"), QSsl::Pem)); // FreeBSD's ca_root_nss
 
 #elif defined(Q_OS_SYMBIAN)
     QList<QByteArray> certs;
-- 
cgit v0.12


From ba086383365c16f68c7032fca7631570f61de648 Mon Sep 17 00:00:00 2001
From: Sam Magnuson <smagnuso@gmail.com>
Date: Mon, 8 Nov 2010 13:21:05 -0800
Subject: Implement brush transformations for directfb.

Merge-request: 915
Reviewed-by: Donald Carr <donald.carr@nokia.com>
(cherry picked from commit b62079cf17044e09999eb1808788926ea921fb05)
---
 .../gfxdrivers/directfb/qdirectfbpaintengine.cpp   | 42 ++++++++++++++--------
 1 file changed, 28 insertions(+), 14 deletions(-)

diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
index c16a242..85ff925 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
@@ -68,6 +68,14 @@ public:
         Matrix_BlitsUnsupported = (Matrix_NegativeScale|Matrix_RectsUnsupported)
     };
 
+    inline static uint getTransformationType(const QTransform &transform) {
+        int ret = transform.type();
+        if (qMin(transform.m11(), transform.m22()) < 0) {
+            ret |= QDirectFBPaintEnginePrivate::Matrix_NegativeScale;
+        }
+        return ret;
+    }
+
     enum CompositionModeStatus {
         PorterDuff_None = 0x0,
         PorterDuff_Supported = 0x1,
@@ -99,7 +107,7 @@ public:
 
     inline bool isSimpleBrush(const QBrush &brush) const;
 
-    void drawTiledPixmap(const QRectF &dest, const QPixmap &pixmap, const QPointF &pos);
+    void drawTiledPixmap(const QRectF &dest, const QPixmap &pixmap, const QPointF &pos, const QTransform &pixmapTransform);
     void blit(const QRectF &dest, IDirectFBSurface *surface, const QRectF &src);
 
     inline bool supportsStretchBlit() const;
@@ -707,7 +715,8 @@ void QDirectFBPaintEngine::drawTiledPixmap(const QRectF &r,
         const QPixmap pix(data);
         QRasterPaintEngine::drawTiledPixmap(r, pix, offset);
     } else {
-        CLIPPED_PAINT(d->drawTiledPixmap(r, pixmap, offset));
+        QTransform transform(state()->matrix);
+        CLIPPED_PAINT(d->drawTiledPixmap(r, pixmap, offset, transform));
     }
 }
 
@@ -827,9 +836,14 @@ void QDirectFBPaintEngine::fillRect(const QRectF &rect, const QBrush &brush)
             return; }
 
         case Qt::TexturePattern: {
+            const QPointF &brushOrigin = state()->brushOrigin;
+            const QTransform stateTransform = state()->matrix;
+            QTransform transform(stateTransform);
+            transform.translate(brushOrigin.x(), brushOrigin.y());
+            transform = brush.transform() * transform;
             if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)
-                || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported)
-                || (!d->supportsStretchBlit() && state()->matrix.isScaling())) {
+                || (QDirectFBPaintEnginePrivate::getTransformationType(transform) & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported)
+                || (!d->supportsStretchBlit() && transform.isScaling())) {
                 break;
             }
 
@@ -837,7 +851,7 @@ void QDirectFBPaintEngine::fillRect(const QRectF &rect, const QBrush &brush)
             if (texture.pixmapData()->classId() != QPixmapData::DirectFBClass)
                 break;
 
-            CLIPPED_PAINT(d->drawTiledPixmap(rect, texture, rect.topLeft() - state()->brushOrigin));
+            CLIPPED_PAINT(d->drawTiledPixmap(stateTransform.mapRect(rect), texture, rect.topLeft() - brushOrigin, transform));
             return; }
         default:
             break;
@@ -948,10 +962,7 @@ void QDirectFBPaintEnginePrivate::unlock(QDirectFBPaintDevice *device)
 
 void QDirectFBPaintEnginePrivate::setTransform(const QTransform &transform)
 {
-    transformationType = transform.type();
-    if (qMin(transform.m11(), transform.m22()) < 0) {
-        transformationType |= QDirectFBPaintEnginePrivate::Matrix_NegativeScale;
-    }
+    transformationType = getTransformationType(transform);
     setPen(q->state()->pen);
 }
 
@@ -1153,10 +1164,12 @@ static inline qreal fixCoord(qreal rect_pos, qreal pixmapSize, qreal offset)
     return pos;
 }
 
-void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPixmap &pixmap, const QPointF &off)
+void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPixmap &pixmap,
+                                                  const QPointF &off, const QTransform &pixmapTransform)
 {
-    Q_ASSERT(!(transformationType & Matrix_BlitsUnsupported));
     const QTransform &transform = q->state()->matrix;
+    Q_ASSERT(!(getTransformationType(transform) & Matrix_BlitsUnsupported) &&
+             !(getTransformationType(pixmapTransform) & Matrix_BlitsUnsupported));
     const QRect destinationRect = transform.mapRect(dest).toRect().normalized();
     QRect newClip = destinationRect;
     if (!currentClip.isEmpty())
@@ -1173,7 +1186,7 @@ void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPix
     };
     surface->SetClip(surface, &clip);
 
-    QPointF offset = off;
+    QPointF offset = pixmapTransform.inverted().map(off);
     Q_ASSERT(transform.type() <= QTransform::TxScale);
     QPixmapData *data = pixmap.pixmapData();
     Q_ASSERT(data->classId() == QPixmapData::DirectFBClass);
@@ -1187,13 +1200,14 @@ void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPix
     prepareForBlit(blitFlags);
     QDirectFBPaintEnginePrivate::unlock(dfbData);
     const QSize pixmapSize = dfbData->size();
-    if (transform.isScaling()) {
+    IDirectFBSurface *sourceSurface = dfbData->directFBSurface();
+    if (transform.isScaling() || pixmapTransform.isScaling()) {
         Q_ASSERT(supportsStretchBlit());
         Q_ASSERT(qMin(transform.m11(), transform.m22()) >= 0);
         offset.rx() *= transform.m11();
         offset.ry() *= transform.m22();
 
-        const QSizeF mappedSize(pixmapSize.width() * transform.m11(), pixmapSize.height() * transform.m22());
+        const QSizeF mappedSize(pixmapSize.width() * pixmapTransform.m11(), pixmapSize.height() * pixmapTransform.m22());
         qreal y = fixCoord(destinationRect.y(), mappedSize.height(), offset.y());
         const qreal startX = fixCoord(destinationRect.x(), mappedSize.width(), offset.x());
         while (y <= destinationRect.bottom()) {
-- 
cgit v0.12


From 4034f4e99f4821947c8b4fd5e1470964ff9da740 Mon Sep 17 00:00:00 2001
From: Donald Carr <donald.carr@nokia.com>
Date: Thu, 11 Nov 2010 17:33:36 +0000
Subject: Minor adjustments to merge-request 915

Fix minor stylistic issue raised by Oswald

Removed duplicate sourceSurface pointer introduced by sibling merge request
---
 src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
index 85ff925..ceed7ae 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
@@ -68,7 +68,8 @@ public:
         Matrix_BlitsUnsupported = (Matrix_NegativeScale|Matrix_RectsUnsupported)
     };
 
-    inline static uint getTransformationType(const QTransform &transform) {
+    inline static uint getTransformationType(const QTransform &transform)
+    {
         int ret = transform.type();
         if (qMin(transform.m11(), transform.m22()) < 0) {
             ret |= QDirectFBPaintEnginePrivate::Matrix_NegativeScale;
@@ -1200,7 +1201,6 @@ void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPix
     prepareForBlit(blitFlags);
     QDirectFBPaintEnginePrivate::unlock(dfbData);
     const QSize pixmapSize = dfbData->size();
-    IDirectFBSurface *sourceSurface = dfbData->directFBSurface();
     if (transform.isScaling() || pixmapTransform.isScaling()) {
         Q_ASSERT(supportsStretchBlit());
         Q_ASSERT(qMin(transform.m11(), transform.m22()) >= 0);
-- 
cgit v0.12


From e4d429f955a9db248b71c95f59902be01eaed062 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Fri, 12 Nov 2010 14:34:46 +0100
Subject: Remove driver bug work-around from GL 2 paint engine.

For platforms where the driver bug isn't fixed, the work-around should
be done by packagers instead.

Reviewed-by: Gunnar Sletta
---
 src/opengl/gl2paintengineex/qglengineshadersource_p.h | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/src/opengl/gl2paintengineex/qglengineshadersource_p.h b/src/opengl/gl2paintengineex/qglengineshadersource_p.h
index a7ece0f..0d30f9a 100644
--- a/src/opengl/gl2paintengineex/qglengineshadersource_p.h
+++ b/src/opengl/gl2paintengineex/qglengineshadersource_p.h
@@ -340,12 +340,7 @@ static const char* const qglslImageSrcFragmentShader = "\n\
     uniform   lowp    sampler2D imageTexture; \n\
     lowp vec4 srcPixel() \n\
     { \n"
-#ifdef QT_OPENGL_ES_2
-        // work-around for driver bug
-        "return 1.0 * texture2D(imageTexture, textureCoords); \n"
-#else
         "return texture2D(imageTexture, textureCoords); \n"
-#endif
     "}\n";
 
 static const char* const qglslCustomSrcFragmentShader = "\n\
-- 
cgit v0.12


From 41cc62e076c9fc01d9cd2c66325a785d1643f6b6 Mon Sep 17 00:00:00 2001
From: Ville Pernu <ville.pernu@nokia.com>
Date: Fri, 12 Nov 2010 14:08:54 +0200
Subject: Fix for KERN-EXEC 0 caused by QNetworkAccessManager::get

QT-4155 bug.
Canceling Network Session before canceling connection notifier
notifications causes a call to an invalid RConnection instance.
Fix: CanceL Network session after canceling notifications.
---
 src/plugins/bearer/symbian/qnetworksession_impl.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.cpp b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
index c5a39e1..53a5b4d 100644
--- a/src/plugins/bearer/symbian/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/symbian/qnetworksession_impl.cpp
@@ -1151,10 +1151,10 @@ void QNetworkSessionPrivateImpl::RunL()
             serviceConfig = QNetworkConfiguration();
             iError = QNetworkSession::InvalidConfigurationError;
             QT_TRYCATCH_LEAVING(emit QNetworkSessionPrivate::error(iError));
-            Cancel();
             if (ipConnectionNotifier) {
                 ipConnectionNotifier->StopNotifications();
             }
+            Cancel();
             QT_TRYCATCH_LEAVING(syncStateWithInterface());
             break;
         case KErrCancel: // Connection attempt cancelled
@@ -1173,10 +1173,10 @@ void QNetworkSessionPrivateImpl::RunL()
                 iError = QNetworkSession::UnknownSessionError;
             }
             QT_TRYCATCH_LEAVING(emit QNetworkSessionPrivate::error(iError));
-            Cancel();
             if (ipConnectionNotifier) {
                 ipConnectionNotifier->StopNotifications();
             }
+            Cancel();
             QT_TRYCATCH_LEAVING(syncStateWithInterface());
             break;
     }
@@ -1268,10 +1268,10 @@ bool QNetworkSessionPrivateImpl::newState(QNetworkSession::State newState, TUint
         serviceConfig = QNetworkConfiguration();
         iError = QNetworkSession::SessionAbortedError;
         emit QNetworkSessionPrivate::error(iError);
-        Cancel();
         if (ipConnectionNotifier) {
             ipConnectionNotifier->StopNotifications();
         }
+        Cancel();
         // Start handling IAP state change signals from QNetworkConfigurationManagerPrivate
         iHandleStateNotificationsFromManager = true;
         emitSessionClosed = true; // Emit SessionClosed after state change has been reported
-- 
cgit v0.12


From 8593133729ca2a92cd5dcc87c5e56031708949bf Mon Sep 17 00:00:00 2001
From: Joerg Bornemann <joerg.bornemann@nokia.com>
Date: Fri, 12 Nov 2010 13:16:03 +0100
Subject: qmake vcxproj generator: fix description of custom build tools

The description of custom build tools that handle more than one extra
compiler cannot be separated by ampersands in Visual Studio 2010.
This seems to be a msbuild bug. We'll just circumvent this issue by
changing the separator in the description to comma.

Task-number: QTBUG-13986
Reviewed-by: ossi
---
 qmake/generators/win32/msbuild_objectmodel.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp
index c963f46..c3436b4 100644
--- a/qmake/generators/win32/msbuild_objectmodel.cpp
+++ b/qmake/generators/win32/msbuild_objectmodel.cpp
@@ -2507,7 +2507,7 @@ bool VCXFilter::addExtraCompiler(const VCXFilterFile &info)
 
         // Output in info.additionalFile -----------
         if (!CustomBuildTool.Description.isEmpty())
-            CustomBuildTool.Description += " & ";
+            CustomBuildTool.Description += ", ";
         CustomBuildTool.Description += cmd_name;
         CustomBuildTool.CommandLine += VCToolBase::fixCommandLine(cmd.trimmed());
         int space = cmd.indexOf(' ');
-- 
cgit v0.12


From 57ad39ec62175eeea023ca802448ebb1605dca23 Mon Sep 17 00:00:00 2001
From: Andreas Kling <andreas.kling@nokia.com>
Date: Fri, 12 Nov 2010 16:08:35 +0100
Subject: Don't pack Harfbuzz structs, this causes unaligned access crashes.

The memory-greediest structs have been reordered anyway, so the gain
from forcibly packing them is mostly negligible.

Task-number: QTBUG-13395
Reviewed-by: Thiago Macieira <thiago.macieira@nokia.com>
---
 src/3rdparty/harfbuzz/src/harfbuzz-buffer.h       | 8 --------
 src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h | 9 ---------
 src/3rdparty/harfbuzz/src/harfbuzz-gdef.h         | 8 --------
 src/3rdparty/harfbuzz/src/harfbuzz-global.h       | 4 ----
 src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h | 8 --------
 src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h | 8 --------
 src/3rdparty/harfbuzz/src/harfbuzz-gsub.h         | 9 ---------
 src/3rdparty/harfbuzz/src/harfbuzz-open.h         | 8 --------
 src/3rdparty/harfbuzz/src/harfbuzz-shaper.h       | 8 --------
 src/3rdparty/harfbuzz/src/harfbuzz-stream.h       | 8 --------
 10 files changed, 78 deletions(-)

diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-buffer.h b/src/3rdparty/harfbuzz/src/harfbuzz-buffer.h
index 0d7c2c2..0d631b2 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-buffer.h
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-buffer.h
@@ -32,10 +32,6 @@
 
 HB_BEGIN_HEADER
 
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
 typedef struct HB_GlyphItemRec_ {
   HB_UInt     gindex;
   HB_UInt     properties;
@@ -93,10 +89,6 @@ hb_buffer_add_glyph( HB_Buffer buffer,
 		      HB_UInt    properties,
 		      HB_UInt    cluster );
 
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
 HB_END_HEADER
 
 #endif /* HARFBUZZ_BUFFER_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h
index 2a6d958..94e9b43 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h
@@ -33,11 +33,6 @@
 
 HB_BEGIN_HEADER
 
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
 /* Attachment related structures */
 
 struct  HB_AttachPoint_
@@ -126,10 +121,6 @@ _HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( HB_GDEFHeader* gdef,
 						  HB_Lookup*     lo,
 						  HB_UShort      num_lookups );
 
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
 HB_END_HEADER
 
 #endif /* HARFBUZZ_GDEF_PRIVATE_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gdef.h b/src/3rdparty/harfbuzz/src/harfbuzz-gdef.h
index f9a03dd..ccb6bf9 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-gdef.h
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-gdef.h
@@ -31,10 +31,6 @@
 
 HB_BEGIN_HEADER
 
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
 /* GDEF glyph properties.  Note that HB_GDEF_COMPONENT has no corresponding
  * flag in the LookupFlag field.     */
 #define HB_GDEF_BASE_GLYPH  0x0002
@@ -131,10 +127,6 @@ HB_Error  HB_GDEF_Build_ClassDefinition( HB_GDEFHeader*  gdef,
 					 HB_UShort*       glyph_array,
 					 HB_UShort*       class_array );
 
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
 HB_END_HEADER
 
 #endif /* HARFBUZZ_GDEF_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-global.h b/src/3rdparty/harfbuzz/src/harfbuzz-global.h
index bccd6a2..d4e6b46 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-global.h
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-global.h
@@ -39,10 +39,6 @@
 #define HB_END_HEADER  /* nothing */
 #endif
 
-#if defined(__GNUC__) || defined(_MSC_VER)
-#define HB_USE_PACKED_STRUCTS
-#endif
-
 HB_BEGIN_HEADER
 
 #ifndef FALSE
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h
index 39f3159..63ba907 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h
@@ -32,10 +32,6 @@
 
 HB_BEGIN_HEADER
 
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
 /* shared tables */
 
 #define VR_X_PLACEMENT_DEVICE 0
@@ -720,10 +716,6 @@ HB_INTERNAL void
 _HB_GPOS_Free_SubTable( HB_GPOS_SubTable* st,
 			      HB_UShort     lookup_type );
 
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
 HB_END_HEADER
 
 #endif /* HARFBUZZ_GPOS_PRIVATE_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h
index 7eb329e..df0c3f6 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h
@@ -32,10 +32,6 @@
 
 HB_BEGIN_HEADER
 
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
 typedef union HB_GSUB_SubTable_  HB_GSUB_SubTable;
 
 /* LookupType 1 */
@@ -474,10 +470,6 @@ HB_INTERNAL void
 _HB_GSUB_Free_SubTable( HB_GSUB_SubTable* st,
 			      HB_UShort     lookup_type );
 
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
 HB_END_HEADER
 
 #endif /* HARFBUZZ_GSUB_PRIVATE_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gsub.h b/src/3rdparty/harfbuzz/src/harfbuzz-gsub.h
index b00df44..6e452bd 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-gsub.h
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-gsub.h
@@ -31,11 +31,6 @@
 
 HB_BEGIN_HEADER
 
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
 /* Lookup types for glyph substitution */
 
 #define HB_GSUB_LOOKUP_SINGLE        1
@@ -139,10 +134,6 @@ HB_Error  HB_GSUB_Register_Alternate_Function( HB_GSUBHeader*  gsub,
 HB_Error  HB_GSUB_Apply_String( HB_GSUBHeader*   gsub,
 				HB_Buffer        buffer );
 
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
 HB_END_HEADER
 
 #endif /* HARFBUZZ_GSUB_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-open.h b/src/3rdparty/harfbuzz/src/harfbuzz-open.h
index 4ba6cf5..9ad7c98 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-open.h
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-open.h
@@ -30,10 +30,6 @@
 
 HB_BEGIN_HEADER
 
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
 /* Use this if a feature applies to all glyphs */
 #define HB_ALL_GLYPHS                    0xFFFF
 
@@ -279,10 +275,6 @@ enum  HB_Type_
 
 typedef enum HB_Type_  HB_Type;
 
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
 HB_END_HEADER
 
 #endif /* HARFBUZZ_OPEN_H */
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.h b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.h
index ab5c07a..470e27b 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.h
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.h
@@ -34,10 +34,6 @@
 
 HB_BEGIN_HEADER
 
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
 /*
    using anything else than signed or unsigned for bitfields in C is non standard,
    but accepted by almost all compilers. And it gives a significant reduction in
@@ -258,10 +254,6 @@ typedef struct HB_Font_ {
     void *userData;
 } HB_FontRec;
 
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
 typedef struct HB_ShaperItem_ HB_ShaperItem;
 
 struct HB_ShaperItem_ {
diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-stream.h b/src/3rdparty/harfbuzz/src/harfbuzz-stream.h
index a155cc2..cfbfb1c 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-stream.h
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-stream.h
@@ -30,10 +30,6 @@
 
 HB_BEGIN_HEADER
 
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
 typedef struct HB_StreamRec_
 {
     HB_Byte*       base;
@@ -42,10 +38,6 @@ typedef struct HB_StreamRec_
     HB_UInt        pos;
 } HB_StreamRec;
 
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
 HB_END_HEADER
 
 #endif
-- 
cgit v0.12


From 76055d4e4a3023ef6390d85a02688bb11df57284 Mon Sep 17 00:00:00 2001
From: Markus Goetz <Markus.Goetz@nokia.com>
Date: Sat, 13 Nov 2010 14:38:49 +0100
Subject: QNAM HTTP: Ignore double content-length headers

Task-number: QTBUG-15311
Reviewed-by: ogoffart
---
 src/network/access/qhttpnetworkheader.cpp      | 12 +++++++++++-
 src/network/access/qnetworkrequest.cpp         | 10 ++++++++--
 tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 22 ++++++++++++++++++++++
 3 files changed, 41 insertions(+), 3 deletions(-)

diff --git a/src/network/access/qhttpnetworkheader.cpp b/src/network/access/qhttpnetworkheader.cpp
index 669f9cf..3eb2f3b 100644
--- a/src/network/access/qhttpnetworkheader.cpp
+++ b/src/network/access/qhttpnetworkheader.cpp
@@ -60,7 +60,17 @@ QHttpNetworkHeaderPrivate::QHttpNetworkHeaderPrivate(const QHttpNetworkHeaderPri
 qint64 QHttpNetworkHeaderPrivate::contentLength() const
 {
     bool ok = false;
-    QByteArray value = headerField("content-length");
+    // We are not using the headerField() method here because servers might send us multiple content-length
+    // headers which is crap (see QTBUG-15311). Therefore just take the first content-length header field.
+    QByteArray value;
+    QList<QPair<QByteArray, QByteArray> >::ConstIterator it = fields.constBegin(),
+                                                        end = fields.constEnd();
+    for ( ; it != end; ++it)
+        if (qstricmp("content-length", it->first) == 0) {
+            value = it->second;
+            break;
+        }
+
     qint64 length = value.toULongLong(&ok);
     if (ok)
         return length;
diff --git a/src/network/access/qnetworkrequest.cpp b/src/network/access/qnetworkrequest.cpp
index b761af5..162392d 100644
--- a/src/network/access/qnetworkrequest.cpp
+++ b/src/network/access/qnetworkrequest.cpp
@@ -899,10 +899,16 @@ void QNetworkHeadersPrivate::parseAndSetHeader(const QByteArray &key, const QByt
     // is it a known header?
     QNetworkRequest::KnownHeaders parsedKey = parseHeaderName(key);
     if (parsedKey != QNetworkRequest::KnownHeaders(-1)) {
-        if (value.isNull())
+        if (value.isNull()) {
             cookedHeaders.remove(parsedKey);
-        else
+        } else if (parsedKey == QNetworkRequest::ContentLengthHeader
+                 && cookedHeaders.contains(QNetworkRequest::ContentLengthHeader)) {
+            // Only set the cooked header "Content-Length" once.
+            // See bug QTBUG-15311
+        } else {
             cookedHeaders.insert(parsedKey, parseHeaderValue(parsedKey, value));
+        }
+
     }
 }
 
diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
index a986438..41b3e0a 100644
--- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp
@@ -301,6 +301,8 @@ private Q_SLOTS:
 
     void httpWithNoCredentialUsage();
 
+    void qtbug15311doubleContentLength();
+
     // NOTE: This test must be last!
     void parentingRepliesToTheApp();
 };
@@ -4724,6 +4726,26 @@ void tst_QNetworkReply::httpWithNoCredentialUsage()
     QCOMPARE(reply->error(), QNetworkReply::AuthenticationRequiredError);
 }
 
+void tst_QNetworkReply::qtbug15311doubleContentLength()
+{
+    QByteArray response("HTTP/1.0 200 OK\r\nContent-Length: 3\r\nServer: bogus\r\nContent-Length: 3\r\n\r\nABC");
+    MiniHttpServer server(response);
+    server.doClose = true;
+
+    QNetworkRequest request(QUrl("http://localhost:" + QString::number(server.serverPort())));
+    QNetworkReplyPtr reply = manager.get(request);
+
+    connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
+    QTestEventLoop::instance().enterLoop(10);
+    QVERIFY(!QTestEventLoop::instance().timeout());
+    QVERIFY(reply->isFinished());
+    QCOMPARE(reply->error(), QNetworkReply::NoError);
+    QCOMPARE(reply->size(), qint64(3));
+    QCOMPARE(reply->header(QNetworkRequest::ContentLengthHeader).toLongLong(), qint64(3));
+    QCOMPARE(reply->rawHeader("Content-length"), QByteArray("3, 3"));
+    QCOMPARE(reply->readAll(), QByteArray("ABC"));
+}
+
 
 
 // NOTE: This test must be last testcase in tst_qnetworkreply!
-- 
cgit v0.12


From 976f6e05d1220f6292633b28c174c0c96573f09a Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Mon, 15 Nov 2010 11:23:52 +1000
Subject: Remove unneeded semicolons.

Extra semicolons break building with sun studio.

Task-number: QTBUG-15326
Reviewed-by: Alan Alpert
---
 tests/auto/declarative/qdeclarativeecmascript/testtypes.h | 2 +-
 tests/auto/declarative/qdeclarativelanguage/testtypes.h   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h
index 40451c3..15c310f 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h
+++ b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h
@@ -92,7 +92,7 @@ class MyQmlObject : public QObject
     Q_PROPERTY(QDeclarativeListProperty<QObject> objectListProperty READ objectListProperty CONSTANT)
     Q_PROPERTY(int resettableProperty READ resettableProperty WRITE setResettableProperty RESET resetProperty)
     Q_PROPERTY(QRegExp regExp READ regExp WRITE setRegExp)
-    Q_PROPERTY(int nonscriptable READ nonscriptable WRITE setNonscriptable SCRIPTABLE false);
+    Q_PROPERTY(int nonscriptable READ nonscriptable WRITE setNonscriptable SCRIPTABLE false)
 
 public:
     MyQmlObject(): myinvokableObject(0), m_methodCalled(false), m_methodIntCalled(false), m_object(0), m_value(0), m_resetProperty(13) {}
diff --git a/tests/auto/declarative/qdeclarativelanguage/testtypes.h b/tests/auto/declarative/qdeclarativelanguage/testtypes.h
index 2b23a49..f8d785c 100644
--- a/tests/auto/declarative/qdeclarativelanguage/testtypes.h
+++ b/tests/auto/declarative/qdeclarativelanguage/testtypes.h
@@ -112,7 +112,7 @@ class MyQmlObject : public QObject, public MyInterface
     Q_PROPERTY(MyCustomVariantType customType READ customType WRITE setCustomType)
     Q_PROPERTY(MyQmlObject *qmlobjectProperty READ qmlobject WRITE setQmlobject)
     Q_PROPERTY(int propertyWithNotify READ propertyWithNotify WRITE setPropertyWithNotify NOTIFY oddlyNamedNotifySignal)
-    Q_PROPERTY(int nonScriptable READ nonScriptable WRITE setNonScriptable SCRIPTABLE false);
+    Q_PROPERTY(int nonScriptable READ nonScriptable WRITE setNonScriptable SCRIPTABLE false)
 
     Q_INTERFACES(MyInterface)
 public:
-- 
cgit v0.12


From b60d1cee999ff01a93521e831a2c58679559382e Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Mon, 15 Nov 2010 13:24:39 +1000
Subject: Fix failing visual tests

One case of non-standardized text, and one case of what is presumably
random number generation.

Task-number: QTBUG-14792
---
 .../qmlvisual/qdeclarativeparticles/particles.qml  |   1 +
 .../qdeclarativetext/font/BorderedText.qml         |   8 ++++
 .../qmlvisual/qdeclarativetext/font/TestText.qml   |  13 ------
 .../font/data-X11/plaintext3.0.png                 | Bin 0 -> 29478 bytes
 .../qdeclarativetext/font/data-X11/plaintext3.qml  |  11 ++++++
 .../qmlvisual/qdeclarativetext/font/plaintext3.qml |  44 ++++++++++-----------
 6 files changed, 42 insertions(+), 35 deletions(-)
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/BorderedText.qml
 delete mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/TestText.qml
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext3.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext3.qml

diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeparticles/particles.qml b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/particles.qml
index 78ba061..38506a0 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativeparticles/particles.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/particles.qml
@@ -2,6 +2,7 @@ import QtQuick 1.0
 import Qt.labs.particles 1.0
 
 Rectangle {
+    property string skip: "May contain random numbers"
     width: 640; height: 480; color: "black"
 
     Particles { id:particlesAneverEmitting
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/BorderedText.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/BorderedText.qml
new file mode 100644
index 0000000..6514694
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/BorderedText.qml
@@ -0,0 +1,8 @@
+import QtQuick 1.0
+import "../../shared" 1.0
+
+TestText {
+    property color bcolor: "blue"
+    text: "The quick brown fox\njumps over\nthe lazy dog."
+    Rectangle { id: border; color: "transparent"; border.color: bcolor; anchors.fill: parent; opacity: 0.2 }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/TestText.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/TestText.qml
deleted file mode 100644
index 690cb15..0000000
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/TestText.qml
+++ /dev/null
@@ -1,13 +0,0 @@
-import QtQuick 1.0
-
-Text {
-    id: testText
-
-    property color bcolor: "blue"
-
-    text: "The quick brown fox\njumps over\nthe lazy dog."
-    font.family: "Helvetica"
-    font.pointSize: 16
-
-    Rectangle { id: borderr; color: "transparent"; border.color: bcolor; anchors.fill: parent; opacity: 0.2 }
-}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext3.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext3.0.png
new file mode 100644
index 0000000..d7de152
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext3.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext3.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext3.qml
new file mode 100644
index 0000000..13f413a
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext3.qml
@@ -0,0 +1,11 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        image: "plaintext3.0.png"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext3.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext3.qml
index 087dfbe..715ada6 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext3.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext3.qml
@@ -2,7 +2,7 @@ import QtQuick 1.0
 
 Rectangle {
     id: main
-    width: 800; height: 600
+    width: 800; height: 400
 
 
     Grid {
@@ -12,51 +12,51 @@ Rectangle {
 
         Column {
             spacing: 4
-            TestText { }
-            TestText { horizontalAlignment: Text.AlignHCenter }
-            TestText { horizontalAlignment: Text.AlignRight }
+            BorderedText { }
+            BorderedText { horizontalAlignment: Text.AlignHCenter }
+            BorderedText { horizontalAlignment: Text.AlignRight }
         }
 
         Column {
             spacing: 4
-            TestText { wrapMode: Text.Wrap }
-            TestText { horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap }
-            TestText { horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap }
+            BorderedText { wrapMode: Text.Wrap }
+            BorderedText { horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap }
+            BorderedText { horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap }
         }
 
         Column {
             spacing: 4
-            TestText { wrapMode: Text.Wrap; elide: Text.ElideRight }
-            TestText { horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap; elide: Text.ElideRight }
-            TestText { horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap; elide: Text.ElideRight }
+            BorderedText { wrapMode: Text.Wrap; elide: Text.ElideRight }
+            BorderedText { horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap; elide: Text.ElideRight }
+            BorderedText { horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap; elide: Text.ElideRight }
         }
 
         Column {
             spacing: 4
-            TestText { width: 230; wrapMode: Text.Wrap; elide: Text.ElideRight }
-            TestText { width: 230; horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap; elide: Text.ElideRight }
-            TestText { width: 230; horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap; elide: Text.ElideRight }
+            BorderedText { width: 230; wrapMode: Text.Wrap; elide: Text.ElideRight }
+            BorderedText { width: 230; horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap; elide: Text.ElideRight }
+            BorderedText { width: 230; horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap; elide: Text.ElideRight }
         }
 
         Column {
             spacing: 4
-            TestText { width: 120; wrapMode: Text.Wrap; elide: Text.ElideRight }
-            TestText { width: 120; horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap; elide: Text.ElideRight }
-            TestText { width: 120; horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap; elide: Text.ElideRight }
+            BorderedText { width: 120; wrapMode: Text.Wrap; elide: Text.ElideRight }
+            BorderedText { width: 120; horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap; elide: Text.ElideRight }
+            BorderedText { width: 120; horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap; elide: Text.ElideRight }
         }
 
         Column {
             spacing: 4
-            TestText { width: 120; wrapMode: Text.Wrap }
-            TestText { width: 120; horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap }
-            TestText { width: 120; horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap }
+            BorderedText { width: 120; wrapMode: Text.Wrap }
+            BorderedText { width: 120; horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap }
+            BorderedText { width: 120; horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap }
         }
 
         Column {
             spacing: 4
-            TestText { width: 120 }
-            TestText { width: 120; horizontalAlignment: Text.AlignHCenter }
-            TestText { width: 120; horizontalAlignment: Text.AlignRight }
+            BorderedText { width: 120 }
+            BorderedText { width: 120; horizontalAlignment: Text.AlignHCenter }
+            BorderedText { width: 120; horizontalAlignment: Text.AlignRight }
         }
     }
 }
-- 
cgit v0.12


From 7f00736ab2c4471fb11c12505f905526fa86c059 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Mon, 15 Nov 2010 14:44:50 +1000
Subject: ListView.SnapToItem with ListView.StrictlyEnforceRange is broken.

The bounds behavior with ListView.StrictlyEnforceRange enabled should
not be affected by snapping behavior in fixup() since
ListView.StrictlyEnforceRange has a stronger positioning policy.

Task-number: QTBUG-15329
Reviewed-by: Michael Brasser
---
 .../graphicsitems/qdeclarativelistview.cpp         | 54 ++++++++--------------
 1 file changed, 20 insertions(+), 34 deletions(-)

diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp
index 94b1cb3..c7b027d 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp
@@ -1161,30 +1161,35 @@ void QDeclarativeListViewPrivate::fixup(AxisData &data, qreal minExtent, qreal m
     int oldDuration = fixupDuration;
     fixupDuration = moveReason == Mouse ? fixupDuration : 0;
 
-    if (snapMode != QDeclarativeListView::NoSnap) {
+    if (currentItem && haveHighlightRange && highlightRange == QDeclarativeListView::StrictlyEnforceRange) {
+        updateHighlight();
+        qreal pos = currentItem->itemPosition();
+        qreal viewPos = position();
+        if (viewPos < pos + currentItem->itemSize() - highlightRangeEnd)
+            viewPos = pos + currentItem->itemSize() - highlightRangeEnd;
+        if (viewPos > pos - highlightRangeStart)
+            viewPos = pos - highlightRangeStart;
+
+        timeline.reset(data.move);
+        if (viewPos != position()) {
+            if (fixupDuration)
+                timeline.move(data.move, -viewPos, QEasingCurve(QEasingCurve::InOutQuad), fixupDuration/2);
+            else
+                timeline.set(data.move, -viewPos);
+        }
+        vTime = timeline.time();
+    } else if (snapMode != QDeclarativeListView::NoSnap) {
         FxListItem *topItem = snapItemAt(position()+highlightRangeStart);
         FxListItem *bottomItem = snapItemAt(position()+highlightRangeEnd);
         qreal pos;
-        if (topItem && bottomItem && haveHighlightRange && highlightRange == QDeclarativeListView::StrictlyEnforceRange) {
-            qreal topPos = qMin(topItem->position() - highlightRangeStart, -maxExtent);
-            qreal bottomPos = qMax(bottomItem->position() - highlightRangeEnd, -minExtent);
-            pos = qAbs(data.move + topPos) < qAbs(data.move + bottomPos) ? topPos : bottomPos;
-        } else if (topItem) {
+        if (topItem) {
             pos = qMax(qMin(topItem->position() - highlightRangeStart, -maxExtent), -minExtent);
         } else if (bottomItem) {
-            pos = qMax(qMin(bottomItem->position() - highlightRangeStart, -maxExtent), -minExtent);
+           pos = qMax(qMin(bottomItem->position() - highlightRangeStart, -maxExtent), -minExtent);
         } else {
             fixupDuration = oldDuration;
             return;
         }
-        if (currentItem && haveHighlightRange && highlightRange == QDeclarativeListView::StrictlyEnforceRange) {
-            updateHighlight();
-            qreal currPos = currentItem->itemPosition();
-            if (pos < currPos + currentItem->itemSize() - highlightRangeEnd)
-                pos = currPos + currentItem->itemSize() - highlightRangeEnd;
-            if (pos > currPos - highlightRangeStart)
-                pos = currPos - highlightRangeStart;
-        }
 
         qreal dist = qAbs(data.move + pos);
         if (dist > 0) {
@@ -1195,25 +1200,6 @@ void QDeclarativeListViewPrivate::fixup(AxisData &data, qreal minExtent, qreal m
                 timeline.set(data.move, -pos);
             vTime = timeline.time();
         }
-    } else if (haveHighlightRange && highlightRange == QDeclarativeListView::StrictlyEnforceRange) {
-        if (currentItem) {
-            updateHighlight();
-            qreal pos = currentItem->itemPosition();
-            qreal viewPos = position();
-            if (viewPos < pos + currentItem->itemSize() - highlightRangeEnd)
-                viewPos = pos + currentItem->itemSize() - highlightRangeEnd;
-            if (viewPos > pos - highlightRangeStart)
-                viewPos = pos - highlightRangeStart;
-
-            timeline.reset(data.move);
-            if (viewPos != position()) {
-                if (fixupDuration)
-                    timeline.move(data.move, -viewPos, QEasingCurve(QEasingCurve::InOutQuad), fixupDuration/2);
-                else
-                    timeline.set(data.move, -viewPos);
-            }
-            vTime = timeline.time();
-        }
     } else {
         QDeclarativeFlickablePrivate::fixup(data, minExtent, maxExtent);
     }
-- 
cgit v0.12


From 153991a45647755c0186f985da255caa09444ff4 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Mon, 15 Nov 2010 17:35:12 +1000
Subject: ListView: items with size < 1.0 were layed out incorrectly.

If the size of an item was less than one its endPosition() was less
than its position(), which caused incorrect layout (overlapping items).

Task-number: QTBUG-15242
Reviewed-by: Yann Bodson
---
 .../graphicsitems/qdeclarativelistview.cpp         |  6 ++--
 .../qdeclarativelistview/data/sizelessthan1.qml    | 26 ++++++++++++++++
 .../tst_qdeclarativelistview.cpp                   | 36 ++++++++++++++++++++++
 3 files changed, 65 insertions(+), 3 deletions(-)
 create mode 100644 tests/auto/declarative/qdeclarativelistview/data/sizelessthan1.qml

diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp
index c7b027d..6be49ba 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp
@@ -124,8 +124,8 @@ public:
     }
     qreal endPosition() const {
         return (view->orientation() == QDeclarativeListView::Vertical
-                                        ? item->y() + (item->height() > 0 ? item->height() : 1)
-                                        : item->x() + (item->width() > 0 ? item->width() : 1)) - 1;
+                                        ? item->y() + (item->height() >= 1.0 ? item->height() : 1)
+                                        : item->x() + (item->width() >= 1.0 ? item->width() : 1)) - 1;
     }
     void setPosition(qreal pos) {
         if (view->orientation() == QDeclarativeListView::Vertical) {
@@ -736,7 +736,7 @@ void QDeclarativeListViewPrivate::layout()
     }
     if (!visibleItems.isEmpty()) {
         qreal oldEnd = visibleItems.last()->endPosition();
-        qreal pos = visibleItems.first()->endPosition() + spacing + 1;
+        qreal pos = visibleItems.first()->position() + visibleItems.first()->size() + spacing;
         for (int i=1; i < visibleItems.count(); ++i) {
             FxListItem *item = visibleItems.at(i);
             item->setPosition(pos);
diff --git a/tests/auto/declarative/qdeclarativelistview/data/sizelessthan1.qml b/tests/auto/declarative/qdeclarativelistview/data/sizelessthan1.qml
new file mode 100644
index 0000000..77bfef8
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativelistview/data/sizelessthan1.qml
@@ -0,0 +1,26 @@
+import QtQuick 1.0
+
+Rectangle {
+    width: 240
+    height: 320
+    color: "#ffffff"
+    Component {
+        id: myDelegate
+        Rectangle {
+            id: wrapper
+            objectName: "wrapper"
+            height: 0.5
+            width: 240
+            color: ((index % 2) == 1 ? "red" : "blue")
+        }
+    }
+    ListView {
+        id: list
+        objectName: "list"
+        focus: true
+        width: 240
+        height: 320
+        model: testModel
+        delegate: myDelegate
+    }
+}
diff --git a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
index 79fef7a..a4b4f21 100644
--- a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
+++ b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp
@@ -100,6 +100,7 @@ private slots:
     void QTBUG_11105();
     void footer();
     void resizeView();
+    void sizeLessThan1();
 
 private:
     template <class T> void items();
@@ -1732,6 +1733,41 @@ void tst_QDeclarativeListView::resizeView()
     QCOMPARE(heightRatio.toReal(), 0.25);
 }
 
+void tst_QDeclarativeListView::sizeLessThan1()
+{
+    QDeclarativeView *canvas = createView();
+
+    TestModel model;
+    for (int i = 0; i < 30; i++)
+        model.addItem("Item" + QString::number(i), "");
+
+    QDeclarativeContext *ctxt = canvas->rootContext();
+    ctxt->setContextProperty("testModel", &model);
+
+    TestObject *testObject = new TestObject;
+    ctxt->setContextProperty("testObject", testObject);
+
+    canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/sizelessthan1.qml"));
+    qApp->processEvents();
+
+    QDeclarativeListView *listview = findItem<QDeclarativeListView>(canvas->rootObject(), "list");
+    QTRY_VERIFY(listview != 0);
+
+    QDeclarativeItem *contentItem = listview->contentItem();
+    QTRY_VERIFY(contentItem != 0);
+
+    // Confirm items positioned correctly
+    int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count();
+    for (int i = 0; i < model.count() && i < itemCount; ++i) {
+        QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i);
+        if (!item) qWarning() << "Item" << i << "not found";
+        QTRY_VERIFY(item);
+        QTRY_COMPARE(item->y(), i*0.5);
+    }
+
+    delete canvas;
+}
+
 void tst_QDeclarativeListView::qListModelInterface_items()
 {
     items<TestModel>();
-- 
cgit v0.12


From 113a23a61b3ac840cfdec2d2297b7881f495c924 Mon Sep 17 00:00:00 2001
From: Perttu Pohjonen <perttu.pohjonen@nokia.com>
Date: Mon, 15 Nov 2010 09:49:32 +0200
Subject: Fix for E32User-CBASE 46 Panic when using CActiveSchedulerWait

Fixing the initial problem of this error opened up a possibility to
start a new WLAN scan while there was one still ongoing. This caused
a crash.

Task-number: QT-3996
---
 src/plugins/bearer/symbian/symbianengine.cpp | 41 ++++++++++++++++++++--------
 src/plugins/bearer/symbian/symbianengine.h   |  6 ++--
 2 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/src/plugins/bearer/symbian/symbianengine.cpp b/src/plugins/bearer/symbian/symbianengine.cpp
index b4dfc4d..33fa508 100644
--- a/src/plugins/bearer/symbian/symbianengine.cpp
+++ b/src/plugins/bearer/symbian/symbianengine.cpp
@@ -135,10 +135,9 @@ void SymbianEngine::initialize()
 
     updateConfigurations();
     updateStatesToSnaps();
-    updateAvailableAccessPoints(); // On first time updates synchronously (without WLAN scans)
+    updateAvailableAccessPoints(); // On first time updates (without WLAN scans)
     // Start monitoring IAP and/or SNAP changes in Symbian CommsDB
     startCommsDatabaseNotifications();
-    iFirstUpdate = false;
 }
 
 SymbianEngine::~SymbianEngine()
@@ -790,6 +789,12 @@ void SymbianEngine::accessPointScanningReady(TBool scanSuccessful, TConnMonIapIn
         mutex.unlock();
         emit updateCompleted();
         mutex.lock();
+    } else {
+        iFirstUpdate = false;
+        if (iScanInQueue) {
+            iScanInQueue = EFalse;
+            updateAvailableAccessPoints();
+        }
     }
 }
 
@@ -976,7 +981,7 @@ void SymbianEngine::RunL()
     QMutexLocker locker(&mutex);
 
     if (iStatus != KErrCancel) {
-        // By default, start relistening notifications. Stop only if interesting event occurred.
+        // By default, start relistening notifications. Stop only if interesting event occured.
         iWaitingCommsDatabaseNotifications = true;
         RDbNotifier::TEvent event = STATIC_CAST(RDbNotifier::TEvent, iStatus.Int());
         switch (event) {
@@ -1356,27 +1361,39 @@ AccessPointsAvailabilityScanner::~AccessPointsAvailabilityScanner()
 void AccessPointsAvailabilityScanner::DoCancel()
 {
     iConnectionMonitor.CancelAsyncRequest(EConnMonGetPckgAttribute);
+    iScanActive = EFalse;
+    iOwner.iScanInQueue = EFalse;
 }
 
 void AccessPointsAvailabilityScanner::StartScanning()
 {
-    if (iOwner.iFirstUpdate) {
-        // On first update (the mgr is being instantiated) update only those bearers who
-        // don't need time-consuming scans (WLAN).
-        // Note: EBearerIdWCDMA covers also GPRS bearer
-        iConnectionMonitor.GetPckgAttribute(EBearerIdWCDMA, 0, KIapAvailability, iIapBuf, iStatus);
+    if (!iScanActive) {
+        iScanActive = ETrue;
+        if (iOwner.iFirstUpdate) {
+            // On first update (the mgr is being instantiated) update only those bearers who
+            // don't need time-consuming scans (WLAN).
+            // Note: EBearerIdWCDMA covers also GPRS bearer
+            iConnectionMonitor.GetPckgAttribute(EBearerIdWCDMA, 0, KIapAvailability, iIapBuf, iStatus);
+        } else {
+            iConnectionMonitor.GetPckgAttribute(EBearerIdAll, 0, KIapAvailability, iIapBuf, iStatus);
+        }
+
+        if (!IsActive()) {
+            SetActive();
+        }
     } else {
-        iConnectionMonitor.GetPckgAttribute(EBearerIdAll, 0, KIapAvailability, iIapBuf, iStatus);
+        // Queue scan for getting WLAN info after first request returns
+        if (iOwner.iFirstUpdate) {
+            iOwner.iScanInQueue = ETrue;
+        }
     }
-
-    if (!IsActive())
-        SetActive();
 }
 
 void AccessPointsAvailabilityScanner::RunL()
 {
     QMutexLocker locker(&iOwner.mutex);
 
+    iScanActive = EFalse;
     if (iStatus.Int() != KErrNone) {
         iIapBuf().iCount = 0;
         QT_TRYCATCH_LEAVING(iOwner.accessPointScanningReady(false,iIapBuf()));
diff --git a/src/plugins/bearer/symbian/symbianengine.h b/src/plugins/bearer/symbian/symbianengine.h
index 7c1076e..337d4d1 100644
--- a/src/plugins/bearer/symbian/symbianengine.h
+++ b/src/plugins/bearer/symbian/symbianengine.h
@@ -207,6 +207,7 @@ private: // Data
     TBool              iInitOk;
     TBool              iUpdateGoingOn;
     TBool              iUpdatePending;
+    TBool              iScanInQueue;
 
     AccessPointsAvailabilityScanner* ipAccessPointsAvailabilityScanner;
 
@@ -234,9 +235,10 @@ protected: // From CActive
     void DoCancel();
 
 private: // Data
-    SymbianEngine& iOwner;
+    SymbianEngine&      iOwner;
     RConnectionMonitor& iConnectionMonitor;
-    TConnMonIapInfoBuf iIapBuf;
+    TConnMonIapInfoBuf  iIapBuf;
+    TBool               iScanActive;
 };
 
 QT_END_NAMESPACE
-- 
cgit v0.12


From aa1a47af767eefea3e2ff248d1e7493031896fe8 Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Mon, 15 Nov 2010 19:16:05 +1000
Subject: Stabilize visual test focusscope/test3.qml

Colored rects are better than text. At least here.

Task-number: QTBUG-14792
---
 .../qmlvisual/focusscope/data/test3.0.png          | Bin 1333 -> 509 bytes
 .../qmlvisual/focusscope/data/test3.1.png          | Bin 994 -> 488 bytes
 .../qmlvisual/focusscope/data/test3.2.png          | Bin 1156 -> 502 bytes
 .../qmlvisual/focusscope/data/test3.3.png          | Bin 1057 -> 487 bytes
 .../qmlvisual/focusscope/data/test3.qml            | 524 ++++++++++-----------
 .../declarative/qmlvisual/focusscope/test3.qml     |  21 +-
 6 files changed, 272 insertions(+), 273 deletions(-)

diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test3.0.png b/tests/auto/declarative/qmlvisual/focusscope/data/test3.0.png
index baac346..49113dd 100644
Binary files a/tests/auto/declarative/qmlvisual/focusscope/data/test3.0.png and b/tests/auto/declarative/qmlvisual/focusscope/data/test3.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test3.1.png b/tests/auto/declarative/qmlvisual/focusscope/data/test3.1.png
index 25d3c66..609d1ab 100644
Binary files a/tests/auto/declarative/qmlvisual/focusscope/data/test3.1.png and b/tests/auto/declarative/qmlvisual/focusscope/data/test3.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test3.2.png b/tests/auto/declarative/qmlvisual/focusscope/data/test3.2.png
index fc90552..8c81be6 100644
Binary files a/tests/auto/declarative/qmlvisual/focusscope/data/test3.2.png and b/tests/auto/declarative/qmlvisual/focusscope/data/test3.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test3.3.png b/tests/auto/declarative/qmlvisual/focusscope/data/test3.3.png
index 2f0519e..c092535 100644
Binary files a/tests/auto/declarative/qmlvisual/focusscope/data/test3.3.png and b/tests/auto/declarative/qmlvisual/focusscope/data/test3.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test3.qml b/tests/auto/declarative/qmlvisual/focusscope/data/test3.qml
index 686fc8d..5acfcc2 100644
--- a/tests/auto/declarative/qmlvisual/focusscope/data/test3.qml
+++ b/tests/auto/declarative/qmlvisual/focusscope/data/test3.qml
@@ -6,135 +6,135 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 32
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 48
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 64
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 80
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 96
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 112
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 128
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 144
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 160
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 176
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 192
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 208
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 224
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 240
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 256
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 272
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 288
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 304
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 320
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 336
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 352
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 368
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 384
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 400
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 416
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 432
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 448
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 464
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 480
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 496
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 512
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 528
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Key {
         type: 6
@@ -146,23 +146,23 @@ VisualTest {
     }
     Frame {
         msec: 544
-        hash: "60101929d88be9177f4988573c35dcdb"
+        hash: "e24319b7e562a668e86ac17f4914bcb7"
     }
     Frame {
         msec: 560
-        hash: "519bbcffcafe96253923994ce7cae971"
+        hash: "742f87f00d2d7e64b4a579823fa99df2"
     }
     Frame {
         msec: 576
-        hash: "e46fd44935f37eadee7520f17ad7cf01"
+        hash: "db6793df1b6d00f4b6286253173ee2b5"
     }
     Frame {
         msec: 592
-        hash: "2a0ed4cb9940ff82d4a56dc3dc94f333"
+        hash: "3da67f52ad1bc0ee55f8d6637286f420"
     }
     Frame {
         msec: 608
-        hash: "a97ff19bb6493b7a026c9c549aafff04"
+        hash: "89e8c8fd913cb229f5adc221090d789c"
     }
     Key {
         type: 7
@@ -174,31 +174,31 @@ VisualTest {
     }
     Frame {
         msec: 624
-        hash: "52fe44fff5c72e1585e000e73086c2e9"
+        hash: "d47cc2fe207628f4deddd58c3697171a"
     }
     Frame {
         msec: 640
-        hash: "76f62e0619ed15894d7fb6fe9e1a7700"
+        hash: "9ab1f939324602533b14b20d6160ae57"
     }
     Frame {
         msec: 656
-        hash: "aceb3ae38213d097bd0f50d64779fbda"
+        hash: "798b200076ec6688cda78fd273a9fde1"
     }
     Frame {
         msec: 672
-        hash: "c62f8846e1076adcd7c9a8bc1164c0a8"
+        hash: "5c485ac62f637db9e3aa327dd1bee801"
     }
     Frame {
         msec: 688
-        hash: "c62f8846e1076adcd7c9a8bc1164c0a8"
+        hash: "5c485ac62f637db9e3aa327dd1bee801"
     }
     Frame {
         msec: 704
-        hash: "c62f8846e1076adcd7c9a8bc1164c0a8"
+        hash: "5c485ac62f637db9e3aa327dd1bee801"
     }
     Frame {
         msec: 720
-        hash: "c62f8846e1076adcd7c9a8bc1164c0a8"
+        hash: "5c485ac62f637db9e3aa327dd1bee801"
     }
     Key {
         type: 6
@@ -210,19 +210,19 @@ VisualTest {
     }
     Frame {
         msec: 736
-        hash: "9f3ab4856c51ee635b8dbce4778053f0"
+        hash: "75bbe5082eebec814c726adc8fc076ec"
     }
     Frame {
         msec: 752
-        hash: "4fe79ffc2bb078c8cb8c3cdbb57d3c5e"
+        hash: "58d8051766872d54831bec4c8c7cbd63"
     }
     Frame {
         msec: 768
-        hash: "9caefb6edbfeadacd54a9f4e06e40ddc"
+        hash: "f474b747b4b7bb2a5b2c418f35aa1b09"
     }
     Frame {
         msec: 784
-        hash: "a8dc7e314b3bd2fb8d16bcf68bfbc7e8"
+        hash: "d561cf0dbded0b2bd85c7c88fb3afdd6"
     }
     Key {
         type: 7
@@ -234,27 +234,27 @@ VisualTest {
     }
     Frame {
         msec: 800
-        hash: "342e75af68d345574c551ff65ac2f2de"
+        hash: "49c0616c4d5cedeb9fdb12fb7d7f504d"
     }
     Frame {
         msec: 816
-        hash: "a26927b8cdfa8813c5e0661d154bb36b"
+        hash: "9e5c66cfc3af51b7a10f6a969452dafe"
     }
     Frame {
         msec: 832
-        hash: "0214f5055daa4a761d2e791d06744ac5"
+        hash: "72d765f52ce8ab3748cd43d859285ca7"
     }
     Frame {
         msec: 848
-        hash: "d2d4296a49de27da45381fa250fb1f38"
+        hash: "732987bbdc421c4650d7503387acd4de"
     }
     Frame {
         msec: 864
-        hash: "a375e3df0b00754fa4208aecbf1b218d"
+        hash: "439456ecedad4674b6ecef415e53334b"
     }
     Frame {
         msec: 880
-        hash: "a375e3df0b00754fa4208aecbf1b218d"
+        hash: "439456ecedad4674b6ecef415e53334b"
     }
     Key {
         type: 6
@@ -266,15 +266,15 @@ VisualTest {
     }
     Frame {
         msec: 896
-        hash: "0cd7a1cfb7fafdb406b5e3a612dd61b7"
+        hash: "5f2d5dc55b551713c4219bc55124f7db"
     }
     Frame {
         msec: 912
-        hash: "0315c0011c75f254337cb5e557dc6dad"
+        hash: "54e2150829c6201b3ba8eb61f4142de7"
     }
     Frame {
         msec: 928
-        hash: "2633ea851ec228dc1d5149ef65b1c910"
+        hash: "f916ac803817b7cd7e29c05ac23449fc"
     }
     Key {
         type: 7
@@ -286,7 +286,7 @@ VisualTest {
     }
     Frame {
         msec: 944
-        hash: "cd8870a81860a9926f4d5580dabf3479"
+        hash: "590b45a3fb1571428c8da48f026fab3b"
     }
     Frame {
         msec: 960
@@ -294,27 +294,27 @@ VisualTest {
     }
     Frame {
         msec: 976
-        hash: "419ec77dceb052c41e072b9513124794"
+        hash: "24eebfd01ea479015fac91198ede9e0d"
     }
     Frame {
         msec: 992
-        hash: "68fd88f83bf707fbc3ae29840bfb2110"
+        hash: "877ca6b70b6535f868d3a450045f70a0"
     }
     Frame {
         msec: 1008
-        hash: "bfb514b9a9c57d6b78149b81f4adb177"
+        hash: "559a5c06ed2d1030d21f56aaaded8869"
     }
     Frame {
         msec: 1024
-        hash: "bfb514b9a9c57d6b78149b81f4adb177"
+        hash: "559a5c06ed2d1030d21f56aaaded8869"
     }
     Frame {
         msec: 1040
-        hash: "bfb514b9a9c57d6b78149b81f4adb177"
+        hash: "559a5c06ed2d1030d21f56aaaded8869"
     }
     Frame {
         msec: 1056
-        hash: "bfb514b9a9c57d6b78149b81f4adb177"
+        hash: "559a5c06ed2d1030d21f56aaaded8869"
     }
     Key {
         type: 6
@@ -326,11 +326,11 @@ VisualTest {
     }
     Frame {
         msec: 1072
-        hash: "e0707db3c9da95ab02be8dec08d1eea9"
+        hash: "f6d3d4fd5d9d1be96646891cbf0740e5"
     }
     Frame {
         msec: 1088
-        hash: "78d405f63a5ed781ce36ed4844621a26"
+        hash: "2ba5d4da68051a96fed2b54804854a8e"
     }
     Key {
         type: 7
@@ -342,35 +342,35 @@ VisualTest {
     }
     Frame {
         msec: 1104
-        hash: "d7dc78c2a3cb4a059322b20622dfa0ed"
+        hash: "2b1b72dfac63903377b427ef4149dfd7"
     }
     Frame {
         msec: 1120
-        hash: "c7bfc322da4a3e112324bd024d271dda"
+        hash: "7ada77586dd0583a66c801b6faf78e2a"
     }
     Frame {
         msec: 1136
-        hash: "a94d4a6f15404f10cad31ad5337f0f10"
+        hash: "a5c527fa2095e2d8949d36351994624a"
     }
     Frame {
         msec: 1152
-        hash: "49f03ed7afac886a45268aef990cb176"
+        hash: "f89bf3f20d3f7284ba52338c1cfb91e1"
     }
     Frame {
         msec: 1168
-        hash: "9fbacc43c6a796f81af102e95d05c17e"
+        hash: "e7de3174a111f26f4d92a273e2c43b61"
     }
     Frame {
         msec: 1184
-        hash: "ec3231a8ba136d2edd5265c51cd82d4f"
+        hash: "d9ef1156a1f7bfe86f97717a600b31c9"
     }
     Frame {
         msec: 1200
-        hash: "070bec590f2379198933cf68db678821"
+        hash: "0b216b28513d00939531e409aac328e8"
     }
     Frame {
         msec: 1216
-        hash: "070bec590f2379198933cf68db678821"
+        hash: "0b216b28513d00939531e409aac328e8"
     }
     Key {
         type: 6
@@ -382,11 +382,11 @@ VisualTest {
     }
     Frame {
         msec: 1232
-        hash: "b9bb4eee4ea2fe26178ece2be67111e3"
+        hash: "d92131f183e9d926a2718559f58f17cb"
     }
     Frame {
         msec: 1248
-        hash: "06fe10dc99a8f28a64942bd76bdd401b"
+        hash: "9e5985271ddec748803ea3c72d40ad97"
     }
     Key {
         type: 7
@@ -398,63 +398,63 @@ VisualTest {
     }
     Frame {
         msec: 1264
-        hash: "63f4e972f1b8f3273170436c673120ca"
+        hash: "2462ddfcf93f96ad6a3164c7f21e2948"
     }
     Frame {
         msec: 1280
-        hash: "25a83b96f733add828557775d4aabe21"
+        hash: "4ce27e3e77d9c80982c5197c2a440dc4"
     }
     Frame {
         msec: 1296
-        hash: "73de2ed5df81559c7a24d9a5b73a2ce9"
+        hash: "e4afa6dc35ddd52876af514ec151900e"
     }
     Frame {
         msec: 1312
-        hash: "43bdf31d652394c4d2b881ca6ad326ed"
+        hash: "3e542da8a83e53c66fd96d2c003a8b67"
     }
     Frame {
         msec: 1328
-        hash: "f5f564fcb39a7e007c30150c1a54283c"
+        hash: "6b0afb12551ada7501346125ac29071c"
     }
     Frame {
         msec: 1344
-        hash: "270321ae5fe7a0e457d2897480e5bbbc"
+        hash: "202d4ca464f73e28a286ebed05e86d9d"
     }
     Frame {
         msec: 1360
-        hash: "270321ae5fe7a0e457d2897480e5bbbc"
+        hash: "202d4ca464f73e28a286ebed05e86d9d"
     }
     Frame {
         msec: 1376
-        hash: "270321ae5fe7a0e457d2897480e5bbbc"
+        hash: "202d4ca464f73e28a286ebed05e86d9d"
     }
     Frame {
         msec: 1392
-        hash: "270321ae5fe7a0e457d2897480e5bbbc"
+        hash: "202d4ca464f73e28a286ebed05e86d9d"
     }
     Frame {
         msec: 1408
-        hash: "270321ae5fe7a0e457d2897480e5bbbc"
+        hash: "202d4ca464f73e28a286ebed05e86d9d"
     }
     Frame {
         msec: 1424
-        hash: "270321ae5fe7a0e457d2897480e5bbbc"
+        hash: "202d4ca464f73e28a286ebed05e86d9d"
     }
     Frame {
         msec: 1440
-        hash: "270321ae5fe7a0e457d2897480e5bbbc"
+        hash: "202d4ca464f73e28a286ebed05e86d9d"
     }
     Frame {
         msec: 1456
-        hash: "270321ae5fe7a0e457d2897480e5bbbc"
+        hash: "202d4ca464f73e28a286ebed05e86d9d"
     }
     Frame {
         msec: 1472
-        hash: "270321ae5fe7a0e457d2897480e5bbbc"
+        hash: "202d4ca464f73e28a286ebed05e86d9d"
     }
     Frame {
         msec: 1488
-        hash: "270321ae5fe7a0e457d2897480e5bbbc"
+        hash: "202d4ca464f73e28a286ebed05e86d9d"
     }
     Key {
         type: 6
@@ -466,15 +466,15 @@ VisualTest {
     }
     Frame {
         msec: 1504
-        hash: "a56bcb200f3ed037bfea052df2910902"
+        hash: "ca6c00b583f88efb6efe285a0903392b"
     }
     Frame {
         msec: 1520
-        hash: "2b3561807f9681f6b875e7f4fcd33223"
+        hash: "2a2fcb90a6a7ae6d3d08f49c7a7177c0"
     }
     Frame {
         msec: 1536
-        hash: "2cee5a4a22f72058a61cd9cb9d39e818"
+        hash: "3a7cd960ff367793e09d73302e57b6e4"
     }
     Key {
         type: 7
@@ -486,39 +486,39 @@ VisualTest {
     }
     Frame {
         msec: 1552
-        hash: "cd1f3f9a2bcd0efd4ba252454c51e261"
+        hash: "581121ab5334a6122bf9ca4489c9b971"
     }
     Frame {
         msec: 1568
-        hash: "b2d8e52a59d1141cfaf6b22ba9aa74cf"
+        hash: "8690456fa25a12ef28f014b86cc94c81"
     }
     Frame {
         msec: 1584
-        hash: "f218a82081c0552d2caccaa840decfbb"
+        hash: "27a395e2e25eedba8f361a20f917590b"
     }
     Frame {
         msec: 1600
-        hash: "ae20ae49364bddbe3dcd9e09c36b7423"
+        hash: "5eae6bbdd6acd7f21eccf277f21f4893"
     }
     Frame {
         msec: 1616
-        hash: "63d8d2d948e3cab3a50ef4db61ca4c48"
+        hash: "f5ebab53b77dcea32e821c8e551077e4"
     }
     Frame {
         msec: 1632
-        hash: "f29a9aa2e469e3fb4bedfe11523212c9"
+        hash: "738278d39b73bfa15fc8b19b5720bbd7"
     }
     Frame {
         msec: 1648
-        hash: "f29a9aa2e469e3fb4bedfe11523212c9"
+        hash: "738278d39b73bfa15fc8b19b5720bbd7"
     }
     Frame {
         msec: 1664
-        hash: "f29a9aa2e469e3fb4bedfe11523212c9"
+        hash: "738278d39b73bfa15fc8b19b5720bbd7"
     }
     Frame {
         msec: 1680
-        hash: "f29a9aa2e469e3fb4bedfe11523212c9"
+        hash: "738278d39b73bfa15fc8b19b5720bbd7"
     }
     Key {
         type: 6
@@ -530,19 +530,19 @@ VisualTest {
     }
     Frame {
         msec: 1696
-        hash: "c46539fd3ef1e01519b43855c0831213"
+        hash: "7c83c13e1d9e6456023ba7e2a1f3875c"
     }
     Frame {
         msec: 1712
-        hash: "40a4666320efaa62904d390add745bb3"
+        hash: "f12f6c5111de654e90d462a4d44f12ec"
     }
     Frame {
         msec: 1728
-        hash: "a490a1904e909f3e2ade5ee8a7e9dbf3"
+        hash: "dcb7712d8320bf4096a3af794facad4d"
     }
     Frame {
         msec: 1744
-        hash: "2e67ac8bbc37731e590156348563bb98"
+        hash: "84f7c046592d31f403b56ee1fd6fcbc4"
     }
     Key {
         type: 7
@@ -554,35 +554,35 @@ VisualTest {
     }
     Frame {
         msec: 1760
-        hash: "daab7eba2dbf88b920b1cc61aa114435"
+        hash: "1b05381e85ec8bbf69edacbedce01fb8"
     }
     Frame {
         msec: 1776
-        hash: "5e6611b6024be9f48e6356bb46fe91db"
+        hash: "b2c148675ffe1ef5110602f7a4feab74"
     }
     Frame {
         msec: 1792
-        hash: "6329448571671f77102e14f3f05d3a66"
+        hash: "d082931d05d2b2dc24ccfa5d7a703291"
     }
     Frame {
         msec: 1808
-        hash: "2a40d32c1c81fb85dab745a05cca500b"
+        hash: "99783e2541d03a7ce9ee4e69a2b21993"
     }
     Frame {
         msec: 1824
-        hash: "6579f0cfe1fd762818d69ded26e47c77"
+        hash: "503ff7e940ac59006c1486e3d2027d35"
     }
     Frame {
         msec: 1840
-        hash: "6579f0cfe1fd762818d69ded26e47c77"
+        hash: "503ff7e940ac59006c1486e3d2027d35"
     }
     Frame {
         msec: 1856
-        hash: "6579f0cfe1fd762818d69ded26e47c77"
+        hash: "503ff7e940ac59006c1486e3d2027d35"
     }
     Frame {
         msec: 1872
-        hash: "6579f0cfe1fd762818d69ded26e47c77"
+        hash: "503ff7e940ac59006c1486e3d2027d35"
     }
     Key {
         type: 6
@@ -594,11 +594,11 @@ VisualTest {
     }
     Frame {
         msec: 1888
-        hash: "899d92a8106e85ff1131c07af3971879"
+        hash: "06fbf3d840cbf170c94377d767d1d49f"
     }
     Frame {
         msec: 1904
-        hash: "8566d59024d7dcf410d4d87e234f477c"
+        hash: "34f538738046a1d6932ef1a6f59eb6be"
     }
     Frame {
         msec: 1920
@@ -606,11 +606,11 @@ VisualTest {
     }
     Frame {
         msec: 1936
-        hash: "ba9b93e9762667c4a7c123933720fb06"
+        hash: "855b97f29624ce545e50834a807694f8"
     }
     Frame {
         msec: 1952
-        hash: "cffb82799861d551cc208b7fe2922ea2"
+        hash: "115f1c37d6492bbc4848cc4be6ddd2b0"
     }
     Key {
         type: 7
@@ -622,131 +622,131 @@ VisualTest {
     }
     Frame {
         msec: 1968
-        hash: "efe3ec54dfd82b06d6cb8d7813030894"
+        hash: "40d5255e7e5ca12b90f5cbede1e9b2cd"
     }
     Frame {
         msec: 1984
-        hash: "80934efe77a8e1d8460b55c0d5831a17"
+        hash: "3a6f6b4cee75f8b1b0b2b5674c3df0a8"
     }
     Frame {
         msec: 2000
-        hash: "5954c3e6ebe78c50776cfa48c152cf46"
+        hash: "2c24eab593d56a7554f9ba925f858d5b"
     }
     Frame {
         msec: 2016
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2032
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2048
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2064
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2080
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2096
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2112
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2128
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2144
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2160
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2176
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2192
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2208
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2224
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2240
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2256
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2272
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2288
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2304
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2320
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2336
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2352
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2368
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2384
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2400
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2416
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2432
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2448
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Frame {
         msec: 2464
-        hash: "588140c8a668842ec06e424692b57918"
+        hash: "bb10ef1703674147351968121ebe0154"
     }
     Key {
         type: 6
@@ -758,23 +758,23 @@ VisualTest {
     }
     Frame {
         msec: 2480
-        hash: "4ba7e4ed21d496abc7ab4651afb5880b"
+        hash: "1e61fbb8c054c6b8fdb895d236514bfa"
     }
     Frame {
         msec: 2496
-        hash: "497188bf0ef98eb246399f025b9259bc"
+        hash: "3a1b093963a0cb898a68f87a3c2056a9"
     }
     Frame {
         msec: 2512
-        hash: "173049c273e4ea2f63428c0838f029ef"
+        hash: "9fe3eb5cbc621401be9ab7bc7d28bb24"
     }
     Frame {
         msec: 2528
-        hash: "c8199565d52abb5bdf64b31c2f965038"
+        hash: "1bb16e3d17506913e295d68e8d4ffa88"
     }
     Frame {
         msec: 2544
-        hash: "995ca28ee06c376a8527992b1396374a"
+        hash: "19389ae4da2ad3bc7076632366db55c7"
     }
     Key {
         type: 7
@@ -786,23 +786,23 @@ VisualTest {
     }
     Frame {
         msec: 2560
-        hash: "62b4b4b4e35cb3594b827a3f0488e016"
+        hash: "5f1731dd62f61ddafb7cfe66167b7408"
     }
     Frame {
         msec: 2576
-        hash: "5cd79f2fff8e35c2ce6167d3a3999bc2"
+        hash: "e37b8399f9ea92a91b0d98b01a4ef72b"
     }
     Frame {
         msec: 2592
-        hash: "3c64ff196b49488d48214562849deec7"
+        hash: "e1282e3afc46fa8828a138e4722707b5"
     }
     Frame {
         msec: 2608
-        hash: "6579f0cfe1fd762818d69ded26e47c77"
+        hash: "503ff7e940ac59006c1486e3d2027d35"
     }
     Frame {
         msec: 2624
-        hash: "6579f0cfe1fd762818d69ded26e47c77"
+        hash: "503ff7e940ac59006c1486e3d2027d35"
     }
     Key {
         type: 6
@@ -814,23 +814,23 @@ VisualTest {
     }
     Frame {
         msec: 2640
-        hash: "3ae9139845494acafc2212843271e80c"
+        hash: "925852b350354bb596d749fe31828147"
     }
     Frame {
         msec: 2656
-        hash: "9bd81bd575c63bbedbcb19452e52f9aa"
+        hash: "1e302775a002185b888b590cc6533b28"
     }
     Frame {
         msec: 2672
-        hash: "8a8fd3ec0ac02d3e8d37ade92e5b0b28"
+        hash: "b147169c3688148bda5b82afa1f5d2dc"
     }
     Frame {
         msec: 2688
-        hash: "3da79a037c7c8fca1a133c65766cd7a4"
+        hash: "34964e45ff808595845f4a868be3782e"
     }
     Frame {
         msec: 2704
-        hash: "31f24ec970184bf253ce0a80cca8c15d"
+        hash: "b86ef7d97f20c3894dc5a551f41ab9c4"
     }
     Key {
         type: 7
@@ -842,23 +842,23 @@ VisualTest {
     }
     Frame {
         msec: 2720
-        hash: "8e41287dd7f3d17107336f79ea4a57b5"
+        hash: "dc9981cb1833b34fc4fc9b833281348e"
     }
     Frame {
         msec: 2736
-        hash: "0eced41494be06a4a2d11aee076c0eab"
+        hash: "b28644e06195849afd44143bd60aa27d"
     }
     Frame {
         msec: 2752
-        hash: "f29a9aa2e469e3fb4bedfe11523212c9"
+        hash: "738278d39b73bfa15fc8b19b5720bbd7"
     }
     Frame {
         msec: 2768
-        hash: "f29a9aa2e469e3fb4bedfe11523212c9"
+        hash: "738278d39b73bfa15fc8b19b5720bbd7"
     }
     Frame {
         msec: 2784
-        hash: "f29a9aa2e469e3fb4bedfe11523212c9"
+        hash: "738278d39b73bfa15fc8b19b5720bbd7"
     }
     Key {
         type: 6
@@ -870,23 +870,23 @@ VisualTest {
     }
     Frame {
         msec: 2800
-        hash: "2161ebbc0b1a8326d778657ded7993a8"
+        hash: "745230d107911d033ebeb58dc8a94445"
     }
     Frame {
         msec: 2816
-        hash: "65bdbbcea1cf5629e1c04ff09bd2b867"
+        hash: "81cc4ac88a51518cf50cd6b46c3e0cb7"
     }
     Frame {
         msec: 2832
-        hash: "4cfe120b55285efb9484f696146fa297"
+        hash: "10b7cff34298222ee305c9895bcdef21"
     }
     Frame {
         msec: 2848
-        hash: "d50ded95cf2418ef2ab3c4d7dd32babe"
+        hash: "622a027091c1577a646ece0331016783"
     }
     Frame {
         msec: 2864
-        hash: "722e3342d833809e2e6c6ecb5774fb86"
+        hash: "ab527747f9918774c7a4cfb476cc31f4"
     }
     Key {
         type: 7
@@ -902,19 +902,19 @@ VisualTest {
     }
     Frame {
         msec: 2896
-        hash: "0193889d59dc40150eab584dd1665b5e"
+        hash: "fa7e0091764dc67878bce696f728254d"
     }
     Frame {
         msec: 2912
-        hash: "cd39f2cee2cf7507203a340ceaa961f5"
+        hash: "19a2f59bfe96a0a33ff45ab72cc2a2fc"
     }
     Frame {
         msec: 2928
-        hash: "270321ae5fe7a0e457d2897480e5bbbc"
+        hash: "202d4ca464f73e28a286ebed05e86d9d"
     }
     Frame {
         msec: 2944
-        hash: "270321ae5fe7a0e457d2897480e5bbbc"
+        hash: "202d4ca464f73e28a286ebed05e86d9d"
     }
     Key {
         type: 6
@@ -926,27 +926,27 @@ VisualTest {
     }
     Frame {
         msec: 2960
-        hash: "d19642853fc07a54711b6afbca4453fd"
+        hash: "6b172121f35f9667f40b0006d5875685"
     }
     Frame {
         msec: 2976
-        hash: "70db31594995fa6c05347ebc5aedd063"
+        hash: "6e65dfe717a69de65d58e059904bb00a"
     }
     Frame {
         msec: 2992
-        hash: "8d8ab3076baae893037a1b16880db6b6"
+        hash: "e660212f2d7d477213ef8b8262e8f2b1"
     }
     Frame {
         msec: 3008
-        hash: "32c05a581d854a828f2049c5aa588afd"
+        hash: "df1e770a7177b7871cf734c47e1227ba"
     }
     Frame {
         msec: 3024
-        hash: "7f8f111aa6e8e802beca3b7fd2a28007"
+        hash: "9d103d49ea30b04f3e97ecad3c13a816"
     }
     Frame {
         msec: 3040
-        hash: "c0ae8434516e2f77d78279c8e37a9f0a"
+        hash: "4602aaf8b65c4ff5b9c8d4ba8d5b89d5"
     }
     Key {
         type: 7
@@ -958,27 +958,27 @@ VisualTest {
     }
     Frame {
         msec: 3056
-        hash: "7cc66b7432d2c73258e4c7910870d166"
+        hash: "bf029f1cb5ddf0dc3931b47895a2141d"
     }
     Frame {
         msec: 3072
-        hash: "070bec590f2379198933cf68db678821"
+        hash: "0b216b28513d00939531e409aac328e8"
     }
     Frame {
         msec: 3088
-        hash: "070bec590f2379198933cf68db678821"
+        hash: "0b216b28513d00939531e409aac328e8"
     }
     Frame {
         msec: 3104
-        hash: "070bec590f2379198933cf68db678821"
+        hash: "0b216b28513d00939531e409aac328e8"
     }
     Frame {
         msec: 3120
-        hash: "070bec590f2379198933cf68db678821"
+        hash: "0b216b28513d00939531e409aac328e8"
     }
     Frame {
         msec: 3136
-        hash: "070bec590f2379198933cf68db678821"
+        hash: "0b216b28513d00939531e409aac328e8"
     }
     Key {
         type: 6
@@ -990,15 +990,15 @@ VisualTest {
     }
     Frame {
         msec: 3152
-        hash: "f45969e94df0c5ea7c153e6952479ec8"
+        hash: "807fe46158fdc72c45cd6c8024ce705d"
     }
     Frame {
         msec: 3168
-        hash: "55f4733f50b90d723c88ef74d66ee8a9"
+        hash: "58dc1ca8e39488479acdb79762000ad5"
     }
     Frame {
         msec: 3184
-        hash: "980ea06fe8405ce29514cbc752a581c2"
+        hash: "48dd97d986ee545f6727128b7a06529f"
     }
     Key {
         type: 7
@@ -1010,27 +1010,27 @@ VisualTest {
     }
     Frame {
         msec: 3200
-        hash: "0a5a6d62d13876c9562253645381702a"
+        hash: "a7f0c00cb4bbbd65c02b3949c90564ad"
     }
     Frame {
         msec: 3216
-        hash: "0ade580a20e10d9887d6bc544025770e"
+        hash: "3f1c40e8d17b83ff3a251d9284bd4282"
     }
     Frame {
         msec: 3232
-        hash: "707524f7b0fad3879d41c8ff5d339b87"
+        hash: "d7527558128467c64cf0a07289158238"
     }
     Frame {
         msec: 3248
-        hash: "1786e49beb751b4b8cf4492f63b3db77"
+        hash: "3af9f7618d0c9ffedb942ae422d61dcb"
     }
     Frame {
         msec: 3264
-        hash: "a44ca7861ccd844eb284ab310751351a"
+        hash: "eb1703107106afc54d47d8600ea40f18"
     }
     Frame {
         msec: 3280
-        hash: "bfb514b9a9c57d6b78149b81f4adb177"
+        hash: "559a5c06ed2d1030d21f56aaaded8869"
     }
     Key {
         type: 6
@@ -1042,19 +1042,19 @@ VisualTest {
     }
     Frame {
         msec: 3296
-        hash: "e36d2476c9954e6a4372ded19efd06a1"
+        hash: "c9a69d9ad499e6537ef047382dc01460"
     }
     Frame {
         msec: 3312
-        hash: "c324cc45624346f32a776a87ec5fcc7e"
+        hash: "594911681db91c825b93633b6aa3fe1f"
     }
     Frame {
         msec: 3328
-        hash: "fcf1629f58a73492f1afa74672013602"
+        hash: "f566d5e728e9a45c7d339282c0c6709c"
     }
     Frame {
         msec: 3344
-        hash: "853e27fd37b764a852a2c4fabbaae6bc"
+        hash: "49f1d0164a1ae3c361421635a2038697"
     }
     Key {
         type: 7
@@ -1066,27 +1066,27 @@ VisualTest {
     }
     Frame {
         msec: 3360
-        hash: "a75d77b15211080e12b397c3cee93568"
+        hash: "a22b4ea9973c03042a3cfa5d23a79c86"
     }
     Frame {
         msec: 3376
-        hash: "936fb8c2c0909a77a9bdc654d91d13ad"
+        hash: "abab27079cd52caaaf421d1b4d8d8066"
     }
     Frame {
         msec: 3392
-        hash: "f11dde44c028dbd299bc6733218969f7"
+        hash: "e528a9ab6ae13518fa541d7f2c6e09a8"
     }
     Frame {
         msec: 3408
-        hash: "a375e3df0b00754fa4208aecbf1b218d"
+        hash: "439456ecedad4674b6ecef415e53334b"
     }
     Frame {
         msec: 3424
-        hash: "a375e3df0b00754fa4208aecbf1b218d"
+        hash: "439456ecedad4674b6ecef415e53334b"
     }
     Frame {
         msec: 3440
-        hash: "a375e3df0b00754fa4208aecbf1b218d"
+        hash: "439456ecedad4674b6ecef415e53334b"
     }
     Key {
         type: 6
@@ -1098,11 +1098,11 @@ VisualTest {
     }
     Frame {
         msec: 3456
-        hash: "3ce1288d66836b6224f471903454be37"
+        hash: "57543f91e958840efcad1948a19aa8e1"
     }
     Frame {
         msec: 3472
-        hash: "9bff5f42f23b504ee013df4834ed884c"
+        hash: "534fc45fdace49ebf444e393b57c1315"
     }
     Key {
         type: 7
@@ -1114,31 +1114,31 @@ VisualTest {
     }
     Frame {
         msec: 3488
-        hash: "523df7cc8d991695722b521282824627"
+        hash: "0eee986f096e3ebddf61d3b0a18f2eff"
     }
     Frame {
         msec: 3504
-        hash: "5c16f8efbab40bcf8016bd7334eb99fa"
+        hash: "74f702ca61d97d31f79d8ce3be53eee7"
     }
     Frame {
         msec: 3520
-        hash: "bee74f34ee101f0fef0967801498de75"
+        hash: "1f0b630548fe93f93550439b4945bdda"
     }
     Frame {
         msec: 3536
-        hash: "a08ee211d870bc3f97f1e698cd887908"
+        hash: "1eb442ca5e7e1f476d8297c3bdb7bbd1"
     }
     Frame {
         msec: 3552
-        hash: "89ac21176fd4ce1bbbd0b7dd6904c12c"
+        hash: "1689cba06c74a6204d80cc651b1d2150"
     }
     Frame {
         msec: 3568
-        hash: "95608d850a3c5cfbded1aafb33885bad"
+        hash: "8711b6647c4146dfa3e3c680fbd1bf08"
     }
     Frame {
         msec: 3584
-        hash: "c62f8846e1076adcd7c9a8bc1164c0a8"
+        hash: "5c485ac62f637db9e3aa327dd1bee801"
     }
     Key {
         type: 6
@@ -1150,19 +1150,19 @@ VisualTest {
     }
     Frame {
         msec: 3600
-        hash: "54705722d344bfbe829211019f2865ba"
+        hash: "0ac2726d000ba2ef1097a49f37d5c209"
     }
     Frame {
         msec: 3616
-        hash: "d63b2ce9e16583671a5e6d266393b11c"
+        hash: "83d00571e499039b7f577e393eed881a"
     }
     Frame {
         msec: 3632
-        hash: "3979df5d0aa1c3610e1d3562e34385c6"
+        hash: "46724d427a8f6d7737abcacd76701259"
     }
     Frame {
         msec: 3648
-        hash: "782d14c3a1baf9a3017ec5b514492860"
+        hash: "a63554a4839e8874cbebe5204d43c6d5"
     }
     Key {
         type: 7
@@ -1174,47 +1174,47 @@ VisualTest {
     }
     Frame {
         msec: 3664
-        hash: "0d219c97e1278474b74ed16f29fae1a1"
+        hash: "5946c98c4204d454a41575242db5fd45"
     }
     Frame {
         msec: 3680
-        hash: "3df0e87dd3d5f50b9c4bb3db8d73d421"
+        hash: "a3d0107e71a6b454f8fdc7557eb9ce18"
     }
     Frame {
         msec: 3696
-        hash: "1c5e5da874ae95548431677246c80734"
+        hash: "86d9ad1831acc4a73075e6792efb7db4"
     }
     Frame {
         msec: 3712
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3728
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3744
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3760
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3776
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3792
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3808
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3824
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3840
@@ -1222,106 +1222,106 @@ VisualTest {
     }
     Frame {
         msec: 3856
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3872
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3888
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3904
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3920
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3936
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3952
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3968
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3984
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4000
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4016
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4032
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4048
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4064
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4080
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4096
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4112
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4128
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4144
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4160
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4176
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4192
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4208
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4224
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4240
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 4256
-        hash: "4a753a2b626eaf8336cd5e5d04d05d5b"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/focusscope/test3.qml b/tests/auto/declarative/qmlvisual/focusscope/test3.qml
index 01fb580..90c2357 100644
--- a/tests/auto/declarative/qmlvisual/focusscope/test3.qml
+++ b/tests/auto/declarative/qmlvisual/focusscope/test3.qml
@@ -12,15 +12,15 @@ Rectangle {
 
     ListModel {
         id: model
-        ListElement { name: "1" }
-        ListElement { name: "2" }
-        ListElement { name: "3" }
-        ListElement { name: "4" }
-        ListElement { name: "5" }
-        ListElement { name: "6" }
-        ListElement { name: "7" }
-        ListElement { name: "8" }
-        ListElement { name: "9" }
+        ListElement { name: "red" }
+        ListElement { name: "orange" }
+        ListElement { name: "yellow" }
+        ListElement { name: "green" }
+        ListElement { name: "cyan" }
+        ListElement { name: "blue" }
+        ListElement { name: "indigo" }
+        ListElement { name: "violet" }
+        ListElement { name: "pink" }
     }
 
     Component {
@@ -33,8 +33,7 @@ Rectangle {
                 focus: true
                 Keys.onDigit9Pressed: console.log(name)
                 width: 50; height: 50; 
-                color: root.ListView.isCurrentItem?"red":"green"
-                Text { text: name; anchors.centerIn: parent }
+                color: root.ListView.isCurrentItem?"black":name
             }
         }
     }
-- 
cgit v0.12


From 69d9e773c246b39561fb86861491aad6d9d34060 Mon Sep 17 00:00:00 2001
From: Petri Latvala <ext-petri.latvala@nokia.com>
Date: Wed, 10 Nov 2010 12:38:22 +0200
Subject: Remove -fno-omit-frame-pointer and -fno-optimize-sibling-calls in
 mkspecs, add -Wno-psabi

Reviewed-by: Adrian Constantin
---
 mkspecs/linux-g++-maemo/qmake.conf | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/mkspecs/linux-g++-maemo/qmake.conf b/mkspecs/linux-g++-maemo/qmake.conf
index a977e7a..f023634 100644
--- a/mkspecs/linux-g++-maemo/qmake.conf
+++ b/mkspecs/linux-g++-maemo/qmake.conf
@@ -21,8 +21,8 @@ QMAKE_LIBDIR_X11      = /usr/lib
 QMAKE_LIBDIR_OPENGL   = /usr/lib
 
 # We still need to generate debug symbols in release mode to put into the *-dbg packages:
-QMAKE_CFLAGS_RELEASE    += -g -fno-omit-frame-pointer -fno-optimize-sibling-calls
-QMAKE_CXXFLAGS_RELEASE  += -g -fno-omit-frame-pointer -fno-optimize-sibling-calls
+QMAKE_CFLAGS_RELEASE    += -g -Wno-psabi
+QMAKE_CXXFLAGS_RELEASE  += -g -Wno-psabi
 
 # Work round PowerVR SGX 1.3 driver bug with glScissor & FBOs:
 DEFINES += QT_GL_NO_SCISSOR_TEST
-- 
cgit v0.12


From 96f8a8f87c28df9c753d9f3494d806a6dea24ba7 Mon Sep 17 00:00:00 2001
From: Adrian Constantin <adrian.constantin@nokia.com>
Date: Mon, 15 Nov 2010 11:13:22 +0200
Subject: Enable OpenGL scissors test

Reviewed-by: Petri Latvala
---
 mkspecs/linux-g++-maemo/qmake.conf | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/mkspecs/linux-g++-maemo/qmake.conf b/mkspecs/linux-g++-maemo/qmake.conf
index f023634..0178f14 100644
--- a/mkspecs/linux-g++-maemo/qmake.conf
+++ b/mkspecs/linux-g++-maemo/qmake.conf
@@ -24,7 +24,4 @@ QMAKE_LIBDIR_OPENGL   = /usr/lib
 QMAKE_CFLAGS_RELEASE    += -g -Wno-psabi
 QMAKE_CXXFLAGS_RELEASE  += -g -Wno-psabi
 
-# Work round PowerVR SGX 1.3 driver bug with glScissor & FBOs:
-DEFINES += QT_GL_NO_SCISSOR_TEST
-
 load(qt_config)
-- 
cgit v0.12


From 8fc0d1c36cae1b0d659e119032af006b8f8eca52 Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Mon, 15 Nov 2010 19:44:40 +1000
Subject: Take snapshots starting from the first frame

Partly because it's invaluble for the times people forget to record a
test as a snapshot, partly because it provides more data on the initial
state of the test case.

Task-number: QTBUG-14792
---
 tools/qml/qdeclarativetester.cpp | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/tools/qml/qdeclarativetester.cpp b/tools/qml/qdeclarativetester.cpp
index eaf3403..499822a 100644
--- a/tools/qml/qdeclarativetester.cpp
+++ b/tools/qml/qdeclarativetester.cpp
@@ -286,7 +286,7 @@ void QDeclarativeTester::updateCurrentTime(int msec)
     fe.msec = msec;
     if (msec == 0 || !(options & QDeclarativeViewer::TestImages)) {
         // Skip first frame, skip if not doing images
-    } else if (0 == (m_savedFrameEvents.count() % 60) || snapshot) {
+    } else if (0 == (m_savedFrameEvents.count()-1 % 60) || snapshot) {
         fe.image = img;
     } else {
         QCryptographicHash hash(QCryptographicHash::Md5);
@@ -356,6 +356,11 @@ void QDeclarativeTester::updateCurrentTime(int msec)
 
             if (options & QDeclarativeViewer::TestImages && !(options & QDeclarativeViewer::Record) && !frame->image().isEmpty()) {
                 QImage goodImage(frame->image().toLocalFile());
+                if (frame->msec() == 16 && goodImage.size() != img.size()){
+                    //Also an image mismatch, but this warning is more informative. Only checked at start though.
+                    qWarning() << "QDeclarativeTester(" << m_script << "): Size mismatch. This test must be run at " << goodImage.size();
+                    imagefailure();
+                }
                 if (goodImage != img) {
                     QString reject(frame->image().toLocalFile() + ".reject.png");
                     qWarning() << "QDeclarativeTester: Image mismatch.  Reject saved to:" 
-- 
cgit v0.12


From 1150f994464719000071f7ef5836c9e1dd695c65 Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Mon, 15 Nov 2010 20:18:21 +1000
Subject: Update all qmlvisual tests

Previous commit means that the snapshots are in different frames. All
tests must be updated.

Task-number: QTBUG-14792
---
 .../qmlvisual/ListView/data/basic1.0.png           | Bin 0 -> 948 bytes
 .../declarative/qmlvisual/ListView/data/basic1.qml |   2 +-
 .../qmlvisual/ListView/data/basic2.0.png           | Bin 0 -> 948 bytes
 .../declarative/qmlvisual/ListView/data/basic2.qml |   2 +-
 .../qmlvisual/ListView/data/basic3.0.png           | Bin 0 -> 948 bytes
 .../declarative/qmlvisual/ListView/data/basic3.qml |   2 +-
 .../qmlvisual/ListView/data/basic4.0.png           | Bin 0 -> 948 bytes
 .../declarative/qmlvisual/ListView/data/basic4.qml |   2 +-
 .../qmlvisual/ListView/data/enforcerange.0.png     | Bin 680 -> 680 bytes
 .../qmlvisual/ListView/data/enforcerange.qml       |  14 +-
 .../qmlvisual/ListView/data/itemlist.0.png         | Bin 976 -> 976 bytes
 .../qmlvisual/ListView/data/itemlist.qml           |  16 +-
 .../qmlvisual/ListView/data/listview.0.png         | Bin 1585 -> 1525 bytes
 .../qmlvisual/ListView/data/listview.qml           |  14 +-
 .../Package_Views/data/packageviews.0.png          | Bin 797 -> 766 bytes
 .../qmlvisual/Package_Views/data/packageviews.qml  |  14 +-
 .../bindinganimation/data/bindinganimation.0.png   | Bin 830 -> 832 bytes
 .../bindinganimation/data/bindinganimation.qml     |   8 +-
 .../data-X11/colorAnimation-visual.0.png           | Bin 627 -> 622 bytes
 .../data-X11/colorAnimation-visual.1.png           | Bin 626 -> 626 bytes
 .../data-X11/colorAnimation-visual.2.png           | Bin 625 -> 625 bytes
 .../data-X11/colorAnimation-visual.qml             |   8 +-
 .../qmlvisual/animation/easing/data/easing.0.png   | Bin 3393 -> 3116 bytes
 .../qmlvisual/animation/easing/data/easing.qml     |   8 +-
 .../qmlvisual/animation/loop/data/loop.0.png       | Bin 508 -> 502 bytes
 .../qmlvisual/animation/loop/data/loop.qml         |  14 +-
 .../data/parallelAnimation-visual.0.png            | Bin 0 -> 777 bytes
 .../data/parallelAnimation-visual.qml              |   6 +-
 .../data/parentAnimation-visual.0.png              | Bin 0 -> 3742 bytes
 .../data/parentAnimation-visual.qml                |  16 +-
 .../parentAnimation2/data/parentAnimation2.0.png   | Bin 2046 -> 2011 bytes
 .../parentAnimation2/data/parentAnimation2.qml     |  12 +-
 .../data/pauseAnimation-visual.0.png               | Bin 0 -> 3224 bytes
 .../pauseAnimation/data/pauseAnimation-visual.qml  |  16 +-
 .../data/propertyAction-visual.0.png               | Bin 335 -> 336 bytes
 .../propertyAction/data/propertyAction-visual.qml  |   8 +-
 .../animation/qtbug10586/data/qtbug10586.0.png     | Bin 1135 -> 1131 bytes
 .../animation/qtbug10586/data/qtbug10586.qml       |   8 +-
 .../animation/qtbug13398/data/qtbug13398.0.png     | Bin 1265 -> 1281 bytes
 .../animation/qtbug13398/data/qtbug13398.qml       |   4 +-
 .../animation/reanchor/data/reanchor.0.png         | Bin 637 -> 637 bytes
 .../qmlvisual/animation/reanchor/data/reanchor.qml |  22 +-
 .../scriptAction/data/scriptAction-visual.0.png    | Bin 335 -> 334 bytes
 .../scriptAction/data/scriptAction-visual.qml      |   6 +-
 .../qmlvisual/fillmode/data/fillmode.0.png         | Bin 28900 -> 28900 bytes
 .../qmlvisual/focusscope/data/test.0.png           | Bin 1968 -> 1974 bytes
 .../declarative/qmlvisual/focusscope/data/test.qml |   8 +-
 .../qmlvisual/focusscope/data/test2.qml            |   4 +-
 .../qmlvisual/focusscope/data/test3.0.png          | Bin 509 -> 487 bytes
 .../qmlvisual/focusscope/data/test3.qml            |  10 +-
 .../data/animated-smooth.0.png                     | Bin 89135 -> 9375 bytes
 .../data/animated-smooth.qml                       |   6 +-
 .../qdeclarativeborderimage/data/animated.0.png    | Bin 30167 -> 9375 bytes
 .../qdeclarativeborderimage/data/animated.qml      |   6 +-
 .../data/flickable-horizontal.0.png                | Bin 1423 -> 1439 bytes
 .../data/flickable-horizontal.qml                  |  10 +-
 .../data/flickable-vertical.0.png                  | Bin 1971 -> 1966 bytes
 .../data/flickable-vertical.qml                    |  30 +-
 .../qdeclarativeflipable/data/test-flipable.0.png  | Bin 1090 -> 942 bytes
 .../qdeclarativeflipable/data/test-flipable.qml    |  16 +-
 .../data/test_flipable_resize.0.png                | Bin 0 -> 1649 bytes
 .../data/test_flipable_resize.qml                  |   4 +-
 .../qdeclarativegridview/data/gridview.0.png       | Bin 1318 -> 1318 bytes
 .../qdeclarativegridview/data/gridview.qml         |  24 +-
 .../qdeclarativegridview/data/gridview2.0.png      | Bin 1310 -> 1325 bytes
 .../qdeclarativegridview/data/gridview2.qml        | 666 ++++++++---------
 .../qdeclarativemousearea/data/drag.0.png          | Bin 1578 -> 1578 bytes
 .../qmlvisual/qdeclarativemousearea/data/drag.qml  |  18 +-
 .../data/mousearea-flickable.0.png                 | Bin 1701 -> 1701 bytes
 .../data/mousearea-flickable.qml                   |  32 +-
 .../data/mousearea-visual.0.png                    | Bin 0 -> 486 bytes
 .../data/mousearea-visual.qml                      |  32 +-
 .../qdeclarativeparticles/data/particles.0.png     | Bin 9951 -> 1055 bytes
 .../qdeclarativeparticles/data/particles.qml       |   8 +-
 .../qdeclarativepathview/data/test-pathview-2.qml  |  16 +-
 .../qdeclarativepathview/data/test-pathview.0.png  | Bin 2412 -> 2371 bytes
 .../qdeclarativepathview/data/test-pathview.qml    |  14 +-
 .../qdeclarativepositioners/data/dynamic.0.png     | Bin 1429 -> 263 bytes
 .../qdeclarativepositioners/data/dynamic.qml       | 798 ++++++++++-----------
 .../data/usingRepeater.0.png                       | Bin 0 -> 1199 bytes
 .../qdeclarativepositioners/data/usingRepeater.qml |   2 +-
 .../data/smoothedfollow.0.png                      | Bin 3692 -> 3680 bytes
 .../data/smoothedfollow.qml                        |   8 +-
 .../qdeclarativespringanimation/data/clock.0.png   | Bin 16437 -> 16333 bytes
 .../qdeclarativespringanimation/data/clock.qml     |   6 +-
 .../qdeclarativespringanimation/data/follow.0.png  | Bin 975 -> 941 bytes
 .../qdeclarativespringanimation/data/follow.qml    |  18 +-
 .../align/data-X11/multilineAlign.0.png            | Bin 1895 -> 1870 bytes
 .../align/data-X11/multilineAlign.qml              |   4 +-
 .../baseline/data-X11/parentanchor.0.png           | Bin 0 -> 3854 bytes
 .../baseline/data-X11/parentanchor.qml             |   2 +-
 .../bugs/data-X11/QTBUG-14469.0.png                | Bin 422 -> 210 bytes
 .../qdeclarativetext/bugs/data-X11/QTBUG-14469.qml |   4 +-
 .../qdeclarativetext/data-X11/qtbug_14865.qml      |   4 +-
 .../qdeclarativetext/elide/data-X11/elide.qml      |   6 +-
 .../qdeclarativetext/elide/data-X11/elide2.0.png   | Bin 2795 -> 2910 bytes
 .../qdeclarativetext/elide/data-X11/elide2.qml     |  12 +-
 .../elide/data-X11/multilength.0.png               | Bin 2285 -> 2500 bytes
 .../elide/data-X11/multilength.qml                 |  12 +-
 .../data-X11/cursorDelegate.0.png                  | Bin 3171 -> 3133 bytes
 .../data-X11/cursorDelegate.qml                    |  12 +-
 .../qdeclarativetextedit/data-X11/qt-669.0.png     | Bin 2483 -> 2443 bytes
 .../qdeclarativetextedit/data-X11/qt-669.1.png     | Bin 2474 -> 4804 bytes
 .../qdeclarativetextedit/data-X11/qt-669.2.png     | Bin 2480 -> 4801 bytes
 .../qdeclarativetextedit/data-X11/qt-669.3.png     | Bin 2443 -> 4791 bytes
 .../qdeclarativetextedit/data-X11/qt-669.qml       |  10 +-
 .../data-X11/usingMultilineEdit.0.png              | Bin 4006 -> 3997 bytes
 .../data-X11/usingMultilineEdit.10.png             | Bin 6055 -> 6074 bytes
 .../data-X11/usingMultilineEdit.11.png             | Bin 6055 -> 6074 bytes
 .../data-X11/usingMultilineEdit.8.png              | Bin 6051 -> 6072 bytes
 .../data-X11/usingMultilineEdit.9.png              | Bin 6055 -> 6074 bytes
 .../data-X11/usingMultilineEdit.qml                |  26 +-
 .../qdeclarativetextedit/data-X11/wrap.0.png       | Bin 8764 -> 8344 bytes
 .../qdeclarativetextedit/data-X11/wrap.1.png       | Bin 8922 -> 1110 bytes
 .../qdeclarativetextedit/data-X11/wrap.2.png       | Bin 9175 -> 1110 bytes
 .../qdeclarativetextedit/data-X11/wrap.3.png       | Bin 9553 -> 1110 bytes
 .../qdeclarativetextedit/data-X11/wrap.4.png       | Bin 9975 -> 1110 bytes
 .../qdeclarativetextedit/data-X11/wrap.5.png       | Bin 9977 -> 1110 bytes
 .../qdeclarativetextedit/data-X11/wrap.6.png       | Bin 9977 -> 1110 bytes
 .../qdeclarativetextedit/data-X11/wrap.qml         |  16 +-
 .../data-X11/cursorDelegate.0.png                  | Bin 3153 -> 3133 bytes
 .../data-X11/cursorDelegate.qml                    |  12 +-
 .../qdeclarativetextinput/data-X11/echoMode.0.png  | Bin 580 -> 256 bytes
 .../qdeclarativetextinput/data-X11/echoMode.qml    |   8 +-
 .../qdeclarativetextinput/data-X11/hAlign.0.png    | Bin 0 -> 10607 bytes
 .../qdeclarativetextinput/data-X11/hAlign.qml      |   2 +-
 .../data-X11/usingLineEdit.0.png                   | Bin 2659 -> 2648 bytes
 .../data-X11/usingLineEdit.qml                     |  36 +-
 128 files changed, 1052 insertions(+), 1052 deletions(-)
 create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/basic1.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/basic2.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/basic3.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/basic4.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/animation/parallelAnimation/data/parallelAnimation-visual.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test_flipable_resize.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.0.png

diff --git a/tests/auto/declarative/qmlvisual/ListView/data/basic1.0.png b/tests/auto/declarative/qmlvisual/ListView/data/basic1.0.png
new file mode 100644
index 0000000..049d9c8
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/basic1.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/basic1.qml b/tests/auto/declarative/qmlvisual/ListView/data/basic1.qml
index 6670ae5..838b708 100644
--- a/tests/auto/declarative/qmlvisual/ListView/data/basic1.qml
+++ b/tests/auto/declarative/qmlvisual/ListView/data/basic1.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "7b874555d744b10ed666dcb6fad79a19"
+        image: "basic1.0.png"
     }
     Frame {
         msec: 32
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/basic2.0.png b/tests/auto/declarative/qmlvisual/ListView/data/basic2.0.png
new file mode 100644
index 0000000..049d9c8
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/basic2.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/basic2.qml b/tests/auto/declarative/qmlvisual/ListView/data/basic2.qml
index 283b443..327fbf3 100644
--- a/tests/auto/declarative/qmlvisual/ListView/data/basic2.qml
+++ b/tests/auto/declarative/qmlvisual/ListView/data/basic2.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "7b874555d744b10ed666dcb6fad79a19"
+        image: "basic2.0.png"
     }
     Frame {
         msec: 32
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/basic3.0.png b/tests/auto/declarative/qmlvisual/ListView/data/basic3.0.png
new file mode 100644
index 0000000..049d9c8
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/basic3.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/basic3.qml b/tests/auto/declarative/qmlvisual/ListView/data/basic3.qml
index 2ee835a..030a842 100644
--- a/tests/auto/declarative/qmlvisual/ListView/data/basic3.qml
+++ b/tests/auto/declarative/qmlvisual/ListView/data/basic3.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "7b874555d744b10ed666dcb6fad79a19"
+        image: "basic3.0.png"
     }
     Frame {
         msec: 32
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/basic4.0.png b/tests/auto/declarative/qmlvisual/ListView/data/basic4.0.png
new file mode 100644
index 0000000..049d9c8
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/basic4.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/basic4.qml b/tests/auto/declarative/qmlvisual/ListView/data/basic4.qml
index 3bbf836..c2b1470 100644
--- a/tests/auto/declarative/qmlvisual/ListView/data/basic4.qml
+++ b/tests/auto/declarative/qmlvisual/ListView/data/basic4.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "7b874555d744b10ed666dcb6fad79a19"
+        image: "basic4.0.png"
     }
     Frame {
         msec: 32
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.0.png b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.0.png
index d466434..5c0b6a6 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.0.png and b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.qml b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.qml
index 20ed077..faa806f 100644
--- a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.qml
+++ b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
+        image: "enforcerange.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "enforcerange.0.png"
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
     }
     Frame {
         msec: 976
@@ -602,7 +602,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "enforcerange.1.png"
+        hash: "b64810845a97bedf6fe11c043457c197"
     }
     Frame {
         msec: 1936
@@ -842,7 +842,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "enforcerange.2.png"
+        hash: "a4ff6c6c43697808f9ad7387d152cef3"
     }
     Frame {
         msec: 2896
@@ -1210,7 +1210,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "enforcerange.3.png"
+        hash: "19c43fcf2875769c9a15f1ce317a0f1e"
     }
     Frame {
         msec: 3856
@@ -1650,7 +1650,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "enforcerange.4.png"
+        hash: "da5a30a6f9f40fbb5e2b150965be8ac0"
     }
     Frame {
         msec: 4816
@@ -1890,7 +1890,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "enforcerange.5.png"
+        hash: "b64810845a97bedf6fe11c043457c197"
     }
     Frame {
         msec: 5776
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.0.png b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.0.png
index 6a589c6..75d2089 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.0.png and b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.qml b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.qml
index 6d09bc0..097080c 100644
--- a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.qml
+++ b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "bf47cc398a702dd17c8efebb3d2f8073"
+        image: "itemlist.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "itemlist.0.png"
+        hash: "bf47cc398a702dd17c8efebb3d2f8073"
     }
     Frame {
         msec: 976
@@ -602,7 +602,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "itemlist.1.png"
+        hash: "75ab445a739fb2415e20e8997b043656"
     }
     Frame {
         msec: 1936
@@ -850,7 +850,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "itemlist.2.png"
+        hash: "99f9988040a389576cb6420b5391f768"
     }
     Frame {
         msec: 2896
@@ -1170,7 +1170,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "itemlist.3.png"
+        hash: "88143ff6c278a5433b314b551b7b8b1d"
     }
     Frame {
         msec: 3856
@@ -1490,7 +1490,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "itemlist.4.png"
+        hash: "99f9988040a389576cb6420b5391f768"
     }
     Frame {
         msec: 4816
@@ -1810,7 +1810,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "itemlist.5.png"
+        hash: "35fe67a91e50f8ebc896451b39cb8f1c"
     }
     Frame {
         msec: 5776
@@ -2050,7 +2050,7 @@ VisualTest {
     }
     Frame {
         msec: 6720
-        image: "itemlist.6.png"
+        hash: "bf47cc398a702dd17c8efebb3d2f8073"
     }
     Frame {
         msec: 6736
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.0.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.0.png
index c7fa695..71926d7 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/listview.0.png and b/tests/auto/declarative/qmlvisual/ListView/data/listview.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.qml b/tests/auto/declarative/qmlvisual/ListView/data/listview.qml
index 45f96e1..07718ca 100644
--- a/tests/auto/declarative/qmlvisual/ListView/data/listview.qml
+++ b/tests/auto/declarative/qmlvisual/ListView/data/listview.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "3b88645092be28037fca4a6034f5b2f7"
+        image: "listview.0.png"
     }
     Frame {
         msec: 32
@@ -298,7 +298,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "listview.0.png"
+        hash: "d193987835dc12e4391e55ff5fee4ce1"
     }
     Frame {
         msec: 976
@@ -650,7 +650,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "listview.1.png"
+        hash: "02f34b6fde613c7c5928285bf81837d6"
     }
     Frame {
         msec: 1936
@@ -1034,7 +1034,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "listview.2.png"
+        hash: "5387de4152cac542735a4debf997b56f"
     }
     Frame {
         msec: 2896
@@ -1394,7 +1394,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "listview.3.png"
+        hash: "294e6961316b028201657ab6b244559f"
     }
     Mouse {
         type: 5
@@ -1834,7 +1834,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "listview.4.png"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4816
@@ -2130,7 +2130,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "listview.5.png"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5776
diff --git a/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.0.png b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.0.png
index f94e879..85f8691 100644
Binary files a/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.0.png and b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.qml b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.qml
index 1804382..fb5e8fb 100644
--- a/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.qml
+++ b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "7cf95f1bc67a90c0df788787589a75a9"
+        image: "packageviews.0.png"
     }
     Frame {
         msec: 32
@@ -258,7 +258,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "packageviews.0.png"
+        hash: "9748e4da669f474bf10abfe7a9c013fd"
     }
     Frame {
         msec: 976
@@ -530,7 +530,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "packageviews.1.png"
+        hash: "6056cb02b921b56c63696d7fe9fe90fa"
     }
     Frame {
         msec: 1936
@@ -818,7 +818,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "packageviews.2.png"
+        hash: "7bb02b032c1dcb4a7b3e6604ea5a8a8d"
     }
     Frame {
         msec: 2896
@@ -1114,7 +1114,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "packageviews.3.png"
+        hash: "6dbc00069eca813c20731afdf0d25e35"
     }
     Frame {
         msec: 3856
@@ -1426,7 +1426,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "packageviews.4.png"
+        hash: "a703cbbef38b49be2d3033163ad450e7"
     }
     Frame {
         msec: 4816
@@ -1714,7 +1714,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "packageviews.5.png"
+        hash: "8d52a504170547407fad6d8785b7199b"
     }
     Frame {
         msec: 5776
diff --git a/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.0.png b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.0.png
index cba9bce..24c11be 100644
Binary files a/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.0.png and b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.qml b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.qml
index b4c7542..f07bdb2 100644
--- a/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.qml
+++ b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "7cb5fc371040e587de9f06ce14a4b29a"
+        image: "bindinganimation.0.png"
     }
     Frame {
         msec: 32
@@ -250,7 +250,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "bindinganimation.0.png"
+        hash: "383ba6b9efcc58fca512982a207631f6"
     }
     Frame {
         msec: 976
@@ -506,7 +506,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "bindinganimation.1.png"
+        hash: "abc2ec0bc7a93e75b5823310e6284db1"
     }
     Frame {
         msec: 1936
@@ -810,7 +810,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "bindinganimation.2.png"
+        hash: "82363265ed2b611a54f8d48b2af22f11"
     }
     Frame {
         msec: 2896
diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.0.png b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.0.png
index c5e8029..99748a7 100644
Binary files a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.0.png and b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.1.png b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.1.png
index b0f69c2..b75ba61 100644
Binary files a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.1.png and b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.2.png b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.2.png
index 1317eef..4320f6f 100644
Binary files a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.2.png and b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.qml b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.qml
index eb4564c..d318bda 100644
--- a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.qml
+++ b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "acc736435c9f84aa82941ba561bc5dbc"
+        image: "colorAnimation-visual.0.png"
     }
     Frame {
         msec: 32
@@ -258,7 +258,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "colorAnimation-visual.0.png"
+        hash: "2d133e7ee60c97386f57838b3f0976c7"
     }
     Frame {
         msec: 976
@@ -498,7 +498,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "colorAnimation-visual.1.png"
+        hash: "02bafb5a81ca66f7670ac93de5123860"
     }
     Frame {
         msec: 1936
@@ -738,7 +738,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "colorAnimation-visual.2.png"
+        hash: "8c0fcda4f8956394c53fc4ba18caa850"
     }
     Frame {
         msec: 2896
diff --git a/tests/auto/declarative/qmlvisual/animation/easing/data/easing.0.png b/tests/auto/declarative/qmlvisual/animation/easing/data/easing.0.png
index 4f75bfd..28b6fb6 100644
Binary files a/tests/auto/declarative/qmlvisual/animation/easing/data/easing.0.png and b/tests/auto/declarative/qmlvisual/animation/easing/data/easing.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/animation/easing/data/easing.qml b/tests/auto/declarative/qmlvisual/animation/easing/data/easing.qml
index 5923222..8048608 100644
--- a/tests/auto/declarative/qmlvisual/animation/easing/data/easing.qml
+++ b/tests/auto/declarative/qmlvisual/animation/easing/data/easing.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "bb8e2ba14526dc5ad74f74e8ff3d96a5"
+        image: "easing.0.png"
     }
     Frame {
         msec: 32
@@ -250,7 +250,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "easing.0.png"
+        hash: "4c9de74276d32c5b2787cf75e612f97d"
     }
     Frame {
         msec: 976
@@ -498,7 +498,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "easing.1.png"
+        hash: "2d2ce71a074f045916a207044abd055a"
     }
     Frame {
         msec: 1936
@@ -738,7 +738,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "easing.2.png"
+        hash: "bb8e2ba14526dc5ad74f74e8ff3d96a5"
     }
     Frame {
         msec: 2896
diff --git a/tests/auto/declarative/qmlvisual/animation/loop/data/loop.0.png b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.0.png
index f4301d3..ca37de9 100644
Binary files a/tests/auto/declarative/qmlvisual/animation/loop/data/loop.0.png and b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/animation/loop/data/loop.qml b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.qml
index 58d0b26..1d326b5 100644
--- a/tests/auto/declarative/qmlvisual/animation/loop/data/loop.qml
+++ b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "eff7cc4b163dceb6084270cc589393f1"
+        image: "loop.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "loop.0.png"
+        hash: "0de25d97a43cf1a7551c8e8dd1943039"
     }
     Frame {
         msec: 976
@@ -482,7 +482,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "loop.1.png"
+        hash: "72c0bf8225504e86ff023242b84513a8"
     }
     Frame {
         msec: 1936
@@ -722,7 +722,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "loop.2.png"
+        hash: "d57e1a10e48938e1f7fc219220fe1204"
     }
     Frame {
         msec: 2896
@@ -962,7 +962,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "loop.3.png"
+        hash: "fd7157aef6dfb303472cd33b176f91d8"
     }
     Frame {
         msec: 3856
@@ -1202,7 +1202,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "loop.4.png"
+        hash: "2fb9e078573ebd1a5cf0f615c97f1d20"
     }
     Frame {
         msec: 4816
@@ -1442,7 +1442,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "loop.5.png"
+        hash: "99789b6e168355a3960986c7d1f21f82"
     }
     Frame {
         msec: 5776
diff --git a/tests/auto/declarative/qmlvisual/animation/parallelAnimation/data/parallelAnimation-visual.0.png b/tests/auto/declarative/qmlvisual/animation/parallelAnimation/data/parallelAnimation-visual.0.png
new file mode 100644
index 0000000..e60cc38
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/parallelAnimation/data/parallelAnimation-visual.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/animation/parallelAnimation/data/parallelAnimation-visual.qml b/tests/auto/declarative/qmlvisual/animation/parallelAnimation/data/parallelAnimation-visual.qml
index 8fd5944..1dd1259 100644
--- a/tests/auto/declarative/qmlvisual/animation/parallelAnimation/data/parallelAnimation-visual.qml
+++ b/tests/auto/declarative/qmlvisual/animation/parallelAnimation/data/parallelAnimation-visual.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "4faa7727bafeea0771f2db62f0141ac9"
+        image: "parallelAnimation-visual.0.png"
     }
     Frame {
         msec: 32
@@ -258,7 +258,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "parallelAnimation.0.png"
+        hash: "115cb0b4c2c0dcd44618b5891aa210e1"
     }
     Frame {
         msec: 976
@@ -399,7 +399,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.0.png b/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.0.png
new file mode 100644
index 0000000..fded8c3
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.qml b/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.qml
index edefd01..7388b79 100644
--- a/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.qml
+++ b/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "4135271d78a5c63c3837a09c86f35ebe"
+        image: "parentAnimation-visual.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "parentAnimation.0.png"
+        hash: "4135271d78a5c63c3837a09c86f35ebe"
     }
     Frame {
         msec: 976
@@ -490,7 +490,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "parentAnimation.1.png"
+        hash: "f1bc451d1f62cfb5dd60a7ea483d3844"
     }
     Frame {
         msec: 1936
@@ -738,7 +738,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "parentAnimation.2.png"
+        hash: "4135271d78a5c63c3837a09c86f35ebe"
     }
     Frame {
         msec: 2896
@@ -1002,7 +1002,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "parentAnimation.3.png"
+        hash: "c8269ecdcd1c898b48280d10a20674b7"
     }
     Frame {
         msec: 3856
@@ -1274,7 +1274,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "parentAnimation.4.png"
+        hash: "b24ae0cb512abfd2606ff9c20a6751bf"
     }
     Frame {
         msec: 4816
@@ -1522,7 +1522,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "parentAnimation.5.png"
+        hash: "4135271d78a5c63c3837a09c86f35ebe"
     }
     Frame {
         msec: 5776
@@ -1591,7 +1591,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.0.png b/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.0.png
index 135911c..03ae932 100644
Binary files a/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.0.png and b/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.qml b/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.qml
index 9e1b923..ad3b5bb 100644
--- a/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.qml
+++ b/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "b3bfd7a06d3e246f4256ab5a267360b0"
+        image: "parentAnimation2.0.png"
     }
     Frame {
         msec: 32
@@ -258,7 +258,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "parentAnimation2.0.png"
+        hash: "5983f3e0800859134bff0182fe9e0142"
     }
     Frame {
         msec: 976
@@ -514,7 +514,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "parentAnimation2.1.png"
+        hash: "3210f97ac2799d84fc1d872c4c2994f7"
     }
     Frame {
         msec: 1936
@@ -762,7 +762,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "parentAnimation2.2.png"
+        hash: "acab4a79f22ebc8a45759ae282e8f3db"
     }
     Frame {
         msec: 2896
@@ -967,7 +967,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
@@ -1018,6 +1018,6 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "parentAnimation2.3.png"
+        hash: "b3bfd7a06d3e246f4256ab5a267360b0"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.0.png b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.0.png
new file mode 100644
index 0000000..cb0971a
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.qml b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.qml
index 8e1e1d7..b2fa1f4 100644
--- a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.qml
+++ b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "a350b70c5238a340e85fd4a3ec0390a3"
+        image: "pauseAnimation-visual.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "pauseAnimation.0.png"
+        hash: "f1e0301430d153fb9d15eaffdfcd5c58"
     }
     Frame {
         msec: 976
@@ -482,7 +482,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "pauseAnimation.1.png"
+        hash: "3042003c067b257de2cb32f650dde693"
     }
     Frame {
         msec: 1936
@@ -722,7 +722,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "pauseAnimation.2.png"
+        hash: "a350b70c5238a340e85fd4a3ec0390a3"
     }
     Frame {
         msec: 2896
@@ -962,7 +962,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "pauseAnimation.3.png"
+        hash: "7c27ef654e645679c90520d6cf00b0c4"
     }
     Frame {
         msec: 3856
@@ -1202,7 +1202,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "pauseAnimation.4.png"
+        hash: "336d31586171f22d541b989d24b95cbb"
     }
     Frame {
         msec: 4816
@@ -1442,7 +1442,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "pauseAnimation.5.png"
+        hash: "ce57e27af329eba4fac3ab891f0407ce"
     }
     Frame {
         msec: 5776
@@ -1599,7 +1599,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
diff --git a/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.0.png b/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.0.png
index a02c063..7d2b66e 100644
Binary files a/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.0.png and b/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.qml b/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.qml
index 09febd7..3216c0a 100644
--- a/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.qml
+++ b/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "1e5ac43e0f553886bcb2b4016f7e3414"
+        image: "propertyAction-visual.0.png"
     }
     Frame {
         msec: 32
@@ -250,7 +250,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "propertyAction-visual.0.png"
+        hash: "4ba1bf769de9bc45630485d06642dc30"
     }
     Frame {
         msec: 976
@@ -498,7 +498,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "propertyAction-visual.1.png"
+        hash: "81c157daf3086b21ea2ba39277a31f3d"
     }
     Frame {
         msec: 1936
@@ -738,7 +738,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "propertyAction-visual.2.png"
+        hash: "1e5ac43e0f553886bcb2b4016f7e3414"
     }
     Frame {
         msec: 2896
diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.0.png b/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.0.png
index 3545e5a..4af1744 100644
Binary files a/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.0.png and b/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.qml b/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.qml
index 774cc13..48ca755 100644
--- a/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.qml
+++ b/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "0755ae54acb6af587bbf7ca509146e0f"
+        image: "qtbug10586.0.png"
     }
     Frame {
         msec: 32
@@ -338,7 +338,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "qtbug10586.0.png"
+        hash: "dff3c85f1bb42138410e9db7be98425b"
     }
     Frame {
         msec: 976
@@ -666,7 +666,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "qtbug10586.1.png"
+        hash: "d84bf962449716cc64cb34b285926c48"
     }
     Frame {
         msec: 1936
@@ -906,7 +906,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "qtbug10586.2.png"
+        hash: "7454984bc5316de021b87d04daf0e8bb"
     }
     Frame {
         msec: 2896
diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.0.png b/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.0.png
index 16adc51..29f7c75 100644
Binary files a/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.0.png and b/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.qml b/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.qml
index 0cc98ce..fce5474 100644
--- a/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.qml
+++ b/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "2452007928bf86b9c42e666c7a7afc89"
+        image: "qtbug13398.0.png"
     }
     Frame {
         msec: 32
@@ -266,7 +266,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "qtbug13398.0.png"
+        hash: "e09a359578935b988ac1cc8c40b25547"
     }
     Frame {
         msec: 976
diff --git a/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.0.png b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.0.png
index 454f6c1..f08e048 100644
Binary files a/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.0.png and b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.qml b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.qml
index b4ee569..9628802 100644
--- a/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.qml
+++ b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "213811853dbefdc418099721e3bf8651"
+        image: "reanchor.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "reanchor.0.png"
+        hash: "213811853dbefdc418099721e3bf8651"
     }
     Frame {
         msec: 976
@@ -498,7 +498,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "reanchor.1.png"
+        hash: "ad3837dcf3e69274ac2918d796974f29"
     }
     Frame {
         msec: 1936
@@ -770,7 +770,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "reanchor.2.png"
+        hash: "213811853dbefdc418099721e3bf8651"
     }
     Frame {
         msec: 2896
@@ -1026,7 +1026,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "reanchor.3.png"
+        hash: "213811853dbefdc418099721e3bf8651"
     }
     Frame {
         msec: 3856
@@ -1282,7 +1282,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "reanchor.4.png"
+        hash: "df51ffd71a82742af7c06f8a786f6bf2"
     }
     Frame {
         msec: 4816
@@ -1522,7 +1522,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "reanchor.5.png"
+        hash: "1137e22c68e043950811dee295e19b04"
     }
     Frame {
         msec: 5776
@@ -1778,7 +1778,7 @@ VisualTest {
     }
     Frame {
         msec: 6720
-        image: "reanchor.6.png"
+        hash: "213811853dbefdc418099721e3bf8651"
     }
     Frame {
         msec: 6736
@@ -2034,7 +2034,7 @@ VisualTest {
     }
     Frame {
         msec: 7680
-        image: "reanchor.7.png"
+        hash: "213811853dbefdc418099721e3bf8651"
     }
     Frame {
         msec: 7696
@@ -2290,7 +2290,7 @@ VisualTest {
     }
     Frame {
         msec: 8640
-        image: "reanchor.8.png"
+        hash: "b36a09269dfc9173ff8583a62ae87e8a"
     }
     Frame {
         msec: 8656
@@ -2419,7 +2419,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 0
+        modifiers: 67108864
         text: ""
         autorep: false
         count: 1
diff --git a/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.0.png b/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.0.png
index e7571f2..5bf32dd 100644
Binary files a/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.0.png and b/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.qml b/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.qml
index 82303ef..5c2f098 100644
--- a/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.qml
+++ b/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "c5d2b291578c11c11452c29dc02bcad9"
+        image: "scriptAction-visual.0.png"
     }
     Frame {
         msec: 32
@@ -250,7 +250,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "scriptAction-visual.0.png"
+        hash: "1761f6606bbdf5772594cf96412337ca"
     }
     Frame {
         msec: 976
@@ -498,7 +498,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "scriptAction-visual.1.png"
+        hash: "6741d853f099a5a98fcdf87053b69ec8"
     }
     Frame {
         msec: 1936
diff --git a/tests/auto/declarative/qmlvisual/fillmode/data/fillmode.0.png b/tests/auto/declarative/qmlvisual/fillmode/data/fillmode.0.png
index ee07a68..b551e6b 100644
Binary files a/tests/auto/declarative/qmlvisual/fillmode/data/fillmode.0.png and b/tests/auto/declarative/qmlvisual/fillmode/data/fillmode.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test.0.png b/tests/auto/declarative/qmlvisual/focusscope/data/test.0.png
index 986a164..fd28a93 100644
Binary files a/tests/auto/declarative/qmlvisual/focusscope/data/test.0.png and b/tests/auto/declarative/qmlvisual/focusscope/data/test.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test.qml b/tests/auto/declarative/qmlvisual/focusscope/data/test.qml
index da99cfd..6294112 100644
--- a/tests/auto/declarative/qmlvisual/focusscope/data/test.qml
+++ b/tests/auto/declarative/qmlvisual/focusscope/data/test.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "94675f9c9afb6834b91a69fd0ce35a22"
+        image: "test.0.png"
     }
     Frame {
         msec: 32
@@ -290,7 +290,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "test.0.png"
+        hash: "f369109744055d30eadf2832a028a104"
     }
     Frame {
         msec: 976
@@ -594,7 +594,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "test.1.png"
+        hash: "f369109744055d30eadf2832a028a104"
     }
     Frame {
         msec: 1936
@@ -882,7 +882,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "test.2.png"
+        hash: "94675f9c9afb6834b91a69fd0ce35a22"
     }
     Frame {
         msec: 2896
diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test2.qml b/tests/auto/declarative/qmlvisual/focusscope/data/test2.qml
index ff977ac..2bff871 100644
--- a/tests/auto/declarative/qmlvisual/focusscope/data/test2.qml
+++ b/tests/auto/declarative/qmlvisual/focusscope/data/test2.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "4823f4520db0c1f64d887f172b3efa17"
+        image: "test2.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "test2.0.png"
+        hash: "4823f4520db0c1f64d887f172b3efa17"
     }
     Frame {
         msec: 976
diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test3.0.png b/tests/auto/declarative/qmlvisual/focusscope/data/test3.0.png
index 49113dd..c092535 100644
Binary files a/tests/auto/declarative/qmlvisual/focusscope/data/test3.0.png and b/tests/auto/declarative/qmlvisual/focusscope/data/test3.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test3.qml b/tests/auto/declarative/qmlvisual/focusscope/data/test3.qml
index 5acfcc2..d7b19a1 100644
--- a/tests/auto/declarative/qmlvisual/focusscope/data/test3.qml
+++ b/tests/auto/declarative/qmlvisual/focusscope/data/test3.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
+        image: "test3.0.png"
     }
     Frame {
         msec: 32
@@ -290,7 +290,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "test3.0.png"
+        hash: "b5a811e6d1b956af67c6df4c9eabd0a3"
     }
     Frame {
         msec: 976
@@ -602,7 +602,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "test3.1.png"
+        hash: "2553f91e5ea5a4da70eb3825a0cdfa10"
     }
     Frame {
         msec: 1936
@@ -898,7 +898,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "test3.2.png"
+        hash: "1bf8a37b5aeb9df37f97083ce19a0c1a"
     }
     Frame {
         msec: 2896
@@ -1218,7 +1218,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "test3.3.png"
+        hash: "cb3a3cca07a49fadf8bb00834ea24f73"
     }
     Frame {
         msec: 3856
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.0.png
index b6ef0f5..bebca88 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.qml b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.qml
index 1200099..7bec3fb 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "aec13bcab337e55832b0a02fb5c6b526"
+        image: "animated-smooth.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "animated-smooth.0.png"
+        hash: "d9ab04d0a6a9373e5622e1124db17866"
     }
     Frame {
         msec: 976
@@ -482,7 +482,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "animated-smooth.1.png"
+        hash: "a9b6aeb509076bf17c2068ce280326fb"
     }
     Frame {
         msec: 1936
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.0.png
index 3efd596..bebca88 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.qml b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.qml
index 236003a..55cf602 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "aec13bcab337e55832b0a02fb5c6b526"
+        image: "animated.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "animated.0.png"
+        hash: "d1ed4916cb1ecff60277d74369ff311b"
     }
     Frame {
         msec: 976
@@ -482,7 +482,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "animated.1.png"
+        hash: "b63e4d1686057828fd8781f1c33585f5"
     }
     Frame {
         msec: 1936
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.0.png
index f8b7339..e1b0967 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml
index 92f108c..0b84ecd 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        image: "flickable-horizontal.0.png"
     }
     Frame {
         msec: 32
@@ -314,7 +314,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "flickable-horizontal.0.png"
+        hash: "a2093589363ac2d50491412e99e0193a"
     }
     Frame {
         msec: 976
@@ -594,7 +594,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "flickable-horizontal.1.png"
+        hash: "21e0f21edc77424e8327c9a3350ecc1d"
     }
     Mouse {
         type: 5
@@ -874,7 +874,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "flickable-horizontal.2.png"
+        hash: "43fa578250e214ed9ad6894329a27c54"
     }
     Frame {
         msec: 2896
@@ -1354,7 +1354,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "flickable-horizontal.3.png"
+        hash: "d73c1059219c0655968af268d22e2c18"
     }
     Frame {
         msec: 3856
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.0.png
index 67f2de8..d525858 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml
index 86fd3ca..dc24d99 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "b0e76c5cfeb797888e8c032b3f2781bd"
+        image: "flickable-vertical.0.png"
     }
     Frame {
         msec: 32
@@ -346,7 +346,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "flickable-vertical.0.png"
+        hash: "f1192763bfb9efacc47828866abacaea"
     }
     Frame {
         msec: 976
@@ -658,7 +658,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "flickable-vertical.1.png"
+        hash: "c591e684fa9a8888d6117af66eaec299"
     }
     Frame {
         msec: 1936
@@ -994,7 +994,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "flickable-vertical.2.png"
+        hash: "96fb3652bfcf0aac1e35a2e50532816f"
     }
     Mouse {
         type: 5
@@ -1498,7 +1498,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "flickable-vertical.3.png"
+        hash: "b0e76c5cfeb797888e8c032b3f2781bd"
     }
     Frame {
         msec: 3856
@@ -1762,7 +1762,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "flickable-vertical.4.png"
+        hash: "b0e76c5cfeb797888e8c032b3f2781bd"
     }
     Frame {
         msec: 4816
@@ -2154,7 +2154,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "flickable-vertical.5.png"
+        hash: "5eb13b99216b29a54d4676c171949cf6"
     }
     Mouse {
         type: 5
@@ -2442,7 +2442,7 @@ VisualTest {
     }
     Frame {
         msec: 6720
-        image: "flickable-vertical.6.png"
+        hash: "4cd763300154da47a8ce8fc13b2213c5"
     }
     Frame {
         msec: 6736
@@ -2698,7 +2698,7 @@ VisualTest {
     }
     Frame {
         msec: 7680
-        image: "flickable-vertical.7.png"
+        hash: "1889f1f0e319b90b6a68d76df6eebe96"
     }
     Frame {
         msec: 7696
@@ -3154,7 +3154,7 @@ VisualTest {
     }
     Frame {
         msec: 8640
-        image: "flickable-vertical.8.png"
+        hash: "1889f1f0e319b90b6a68d76df6eebe96"
     }
     Frame {
         msec: 8656
@@ -3754,7 +3754,7 @@ VisualTest {
     }
     Frame {
         msec: 9600
-        image: "flickable-vertical.9.png"
+        hash: "b3003855e3805c0a514bf2c7a42d398f"
     }
     Mouse {
         type: 5
@@ -4242,7 +4242,7 @@ VisualTest {
     }
     Frame {
         msec: 10560
-        image: "flickable-vertical.10.png"
+        hash: "b0e76c5cfeb797888e8c032b3f2781bd"
     }
     Mouse {
         type: 5
@@ -4602,7 +4602,7 @@ VisualTest {
     }
     Frame {
         msec: 11520
-        image: "flickable-vertical.11.png"
+        hash: "b0e76c5cfeb797888e8c032b3f2781bd"
     }
     Frame {
         msec: 11536
@@ -5122,7 +5122,7 @@ VisualTest {
     }
     Frame {
         msec: 12480
-        image: "flickable-vertical.12.png"
+        hash: "b0e76c5cfeb797888e8c032b3f2781bd"
     }
     Mouse {
         type: 5
@@ -5498,7 +5498,7 @@ VisualTest {
     }
     Frame {
         msec: 13440
-        image: "flickable-vertical.13.png"
+        hash: "f77f12bdb352d5a8470ae8c93ae3646e"
     }
     Frame {
         msec: 13456
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.0.png
index 53a8b42..b3ae1bc 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.qml
index d2d46e4..4b089d1 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "7e16e6360fc2e9db67dbf11d58042745"
+        image: "test-flipable.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "test-flipable.0.png"
+        hash: "c03406106847c03c73f5897e65690925"
     }
     Frame {
         msec: 976
@@ -482,7 +482,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "test-flipable.1.png"
+        hash: "1e8348fbb51871dffe9543fca19bb452"
     }
     Frame {
         msec: 1936
@@ -722,7 +722,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "test-flipable.2.png"
+        hash: "373141f99bc88c40ead161502c9750e9"
     }
     Frame {
         msec: 2896
@@ -962,7 +962,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "test-flipable.3.png"
+        hash: "464a78e75e10b62773ab64af4fc4c7aa"
     }
     Frame {
         msec: 3856
@@ -1202,7 +1202,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "test-flipable.4.png"
+        hash: "03f17b2cd781f2ee0ae5664a0491166c"
     }
     Frame {
         msec: 4816
@@ -1442,7 +1442,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "test-flipable.5.png"
+        hash: "73c06997014af4e008b546b53fe349fb"
     }
     Frame {
         msec: 5776
@@ -1559,7 +1559,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test_flipable_resize.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test_flipable_resize.0.png
new file mode 100644
index 0000000..814cc89
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test_flipable_resize.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test_flipable_resize.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test_flipable_resize.qml
index d1a5ade..08c5e16 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test_flipable_resize.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test_flipable_resize.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "04382a80a203e1fe3d0d4944c9195e0b"
+        image: "test_flipable_resize.0.png"
     }
     Frame {
         msec: 32
@@ -187,7 +187,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.0.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.0.png
index c675be7..b053048 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.qml b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.qml
index a3e5ea0..2f7ed93 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "c33447c78ea64452ec3cd1696fb502eb"
+        image: "gridview.0.png"
     }
     Frame {
         msec: 32
@@ -274,7 +274,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "gridview.0.png"
+        hash: "02c632713d0dc64bff9d8e58f745df95"
     }
     Frame {
         msec: 976
@@ -546,7 +546,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "gridview.1.png"
+        hash: "8304d2432168a2ea8a887d9a135b40b4"
     }
     Frame {
         msec: 1936
@@ -826,7 +826,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "gridview.2.png"
+        hash: "e9112eea445585b17d58b6f9ba039c39"
     }
     Frame {
         msec: 2896
@@ -1106,7 +1106,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "gridview.3.png"
+        hash: "e63d987ba303a42046827f14941b444a"
     }
     Frame {
         msec: 3856
@@ -1394,7 +1394,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "gridview.4.png"
+        hash: "11150995098af8516513230360d40108"
     }
     Frame {
         msec: 4816
@@ -1666,7 +1666,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "gridview.5.png"
+        hash: "3de570332e8a1e01f409d892feb7930e"
     }
     Frame {
         msec: 5776
@@ -1946,7 +1946,7 @@ VisualTest {
     }
     Frame {
         msec: 6720
-        image: "gridview.6.png"
+        hash: "dcf8c3078973ad99fbbcc763e433de11"
     }
     Frame {
         msec: 6736
@@ -2218,7 +2218,7 @@ VisualTest {
     }
     Frame {
         msec: 7680
-        image: "gridview.7.png"
+        hash: "2a5a7dfcd64200864abfa9267e802f4e"
     }
     Frame {
         msec: 7696
@@ -2506,7 +2506,7 @@ VisualTest {
     }
     Frame {
         msec: 8640
-        image: "gridview.8.png"
+        hash: "fb8acbfc93b64d960abb17f097fe36fe"
     }
     Key {
         type: 7
@@ -2786,7 +2786,7 @@ VisualTest {
     }
     Frame {
         msec: 9600
-        image: "gridview.9.png"
+        hash: "02c632713d0dc64bff9d8e58f745df95"
     }
     Frame {
         msec: 9616
@@ -2831,7 +2831,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 0
+        modifiers: 67108864
         text: ""
         autorep: false
         count: 1
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.0.png
index 3021d58..27e0783 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.qml b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.qml
index 1c90af9..8ac4cbf 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "dba2f6f1c773bd4cd9523108fca861c4"
+        image: "gridview2.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "gridview2.0.png"
+        hash: "33d81c39d16c6a326012499796e50e03"
     }
     Frame {
         msec: 976
@@ -330,27 +330,27 @@ VisualTest {
     }
     Frame {
         msec: 1280
-        hash: "aaec7184a27e6700d96ffff376b8fa53"
+        hash: "4ffd56d59c14ba676393686d753951d7"
     }
     Frame {
         msec: 1296
-        hash: "3fa3a890a4ff4a59336a9a2d478d0dde"
+        hash: "e2f7702ed749330b2f027aa73967a4cf"
     }
     Frame {
         msec: 1312
-        hash: "3711c6c2f4f9aba7f2c72bd1f1d85016"
+        hash: "3f4dcee547e925db9b3da1fa08bab3c9"
     }
     Frame {
         msec: 1328
-        hash: "23da2f9a800b805ce7b77ff08218907d"
+        hash: "12b0bf8abbb9b6a0597eccebe5322551"
     }
     Frame {
         msec: 1344
-        hash: "12e4bc953b06cdaad0720f87fb96a37e"
+        hash: "23da2f9a800b805ce7b77ff08218907d"
     }
     Frame {
         msec: 1360
-        hash: "46e69658bda69bab202a2790a76ba1cd"
+        hash: "9c039c94a4202b99bf913891bdcb3698"
     }
     Key {
         type: 7
@@ -362,27 +362,27 @@ VisualTest {
     }
     Frame {
         msec: 1376
-        hash: "44608e67c69b92ccbb45e119e1158fe3"
+        hash: "dd7c95ca98c4f37837c2ff7f03243fc3"
     }
     Frame {
         msec: 1392
-        hash: "97a309b47017d38294644a486a7ce68e"
+        hash: "6f31f7af4e68ab0eab101e7ae840b4b6"
     }
     Frame {
         msec: 1408
-        hash: "41f42b50b22e0496c8aca5019b24b9cb"
+        hash: "29943a44b9830bb64b3e5a3b6abd8c42"
     }
     Frame {
         msec: 1424
-        hash: "8603ea1cb60c804563f50bc41c0180fe"
+        hash: "93d37221e8e022c84e35c7bd44b0644e"
     }
     Frame {
         msec: 1440
-        hash: "e29777fa70daafe9640c6e9bb7bd63d6"
+        hash: "9ce3cd471dba7fe94de4e9ad321803b2"
     }
     Frame {
         msec: 1456
-        hash: "2c4c360320f527e99fee799e68c2c0aa"
+        hash: "0d30916c7e05ff8609af5894f47a89bb"
     }
     Frame {
         msec: 1472
@@ -430,23 +430,23 @@ VisualTest {
     }
     Frame {
         msec: 1616
-        hash: "17027b7c099b11cb5382f30dbbd1e647"
+        hash: "6775c78beca0f078c5f2c57370de1946"
     }
     Frame {
         msec: 1632
-        hash: "0e17461a4ca843f9903b7f03e99a0b00"
+        hash: "898709f3871e13825baf48861930f26c"
     }
     Frame {
         msec: 1648
-        hash: "a5e61901920553e59892fa405beea15a"
+        hash: "c1a568599592a3f455ad550c2e4878a8"
     }
     Frame {
         msec: 1664
-        hash: "310eaf71fe8d3807606e58a666c65ccd"
+        hash: "a80d8cbf0c6fe8383badbb2badb361ad"
     }
     Frame {
         msec: 1680
-        hash: "76f556d05fb77082f33eb1836c10587a"
+        hash: "310eaf71fe8d3807606e58a666c65ccd"
     }
     Key {
         type: 7
@@ -458,31 +458,31 @@ VisualTest {
     }
     Frame {
         msec: 1696
-        hash: "4e7e4b7790a96396e7ea3533b5c32ed9"
+        hash: "0f317f50b0d2a4c5daf819431527416e"
     }
     Frame {
         msec: 1712
-        hash: "b065287b6490f58ca6f0e9eb2027cf20"
+        hash: "d251b64b794902fe2c5da3cee43ff82d"
     }
     Frame {
         msec: 1728
-        hash: "907cd9dbdffa1d395caaabd466dc8e86"
+        hash: "757adc256e1b5d739c29ee82bdacfa16"
     }
     Frame {
         msec: 1744
-        hash: "3b144e5b4867328beafa3020ce931480"
+        hash: "1c20e69e033a5fa4825fd46f51d1e348"
     }
     Frame {
         msec: 1760
-        hash: "b59b2b60b7d55424b61b1b0ed3e227b8"
+        hash: "03cbcd361ec24925222802c8ece99793"
     }
     Frame {
         msec: 1776
-        hash: "4032e934871b315b68c7c2abea42efee"
+        hash: "dffaa2dd4d6dd89a1b26d5db38906059"
     }
     Frame {
         msec: 1792
-        hash: "8f80127b2f8d6fc10aa84062544cc381"
+        hash: "77d5193bc5f53fe5cb98a236c55f841e"
     }
     Frame {
         msec: 1808
@@ -514,7 +514,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "gridview2.1.png"
+        hash: "77d5193bc5f53fe5cb98a236c55f841e"
     }
     Frame {
         msec: 1936
@@ -554,23 +554,23 @@ VisualTest {
     }
     Frame {
         msec: 2048
-        hash: "a45d2630872a14541f39b862e15ff461"
+        hash: "1f046afe50ee5e1fc07e89a40528351c"
     }
     Frame {
         msec: 2064
-        hash: "714711d7382ef8bba5fb39e2e44bd59c"
+        hash: "132fbaa8fc2890d48f1916a25cb09887"
     }
     Frame {
         msec: 2080
-        hash: "63deed0356e761f94f88be18a7d10053"
+        hash: "e904c892dc27ff1700009470f234ce0d"
     }
     Frame {
         msec: 2096
-        hash: "d5b4fc1b568a4a1b63a91b422272c704"
+        hash: "0968397c7a209059cd466c61ac891081"
     }
     Frame {
         msec: 2112
-        hash: "b6d2c80925cc6b4b7b297bd6ee903c7c"
+        hash: "d5b4fc1b568a4a1b63a91b422272c704"
     }
     Key {
         type: 7
@@ -582,31 +582,31 @@ VisualTest {
     }
     Frame {
         msec: 2128
-        hash: "38117482196360353586cb7ace593894"
+        hash: "a980a2e7bd10328fbd4400e799aa7c24"
     }
     Frame {
         msec: 2144
-        hash: "2301f3a148bf4e311cc8ce011ddf65f8"
+        hash: "b74be5349822d52ced201d7f34a96122"
     }
     Frame {
         msec: 2160
-        hash: "2a4982a0961f89a15618f8d4c2081f5a"
+        hash: "f7c6dbcd7d55b3230af463098f346bd8"
     }
     Frame {
         msec: 2176
-        hash: "acf8666d6a8a29925f3895aa8e93f713"
+        hash: "393358a0ee7636a535f14f0dc9c3d609"
     }
     Frame {
         msec: 2192
-        hash: "967ed026bc92a6d2747c5227105543a6"
+        hash: "cad337b87b629b1eee78407aacfd279e"
     }
     Frame {
         msec: 2208
-        hash: "ff72f3fb95f25990c99c1c14cfef57da"
+        hash: "d90b762e62867e3ff928160bed85d2ff"
     }
     Frame {
         msec: 2224
-        hash: "0874a4f863596c3860dcf5b1f7f6ceb2"
+        hash: "520445d8619ad9bdde0db0e61f17567c"
     }
     Frame {
         msec: 2240
@@ -658,31 +658,31 @@ VisualTest {
     }
     Frame {
         msec: 2400
-        hash: "7c4bbf0423d63d7642d218cac56a6215"
+        hash: "5c9801ffdb07be53524cf0a4f8709ee4"
     }
     Frame {
         msec: 2416
-        hash: "e8c77dbc89721b51549f8d46453fe09d"
+        hash: "adef25d77f816e40ec02886187f456bf"
     }
     Frame {
         msec: 2432
-        hash: "7953503590b639872ac12215695e8cea"
+        hash: "56290066fa32054bb7e1669bbda3f3bb"
     }
     Frame {
         msec: 2448
-        hash: "edaee946a2e25fed6de9acfda0d44a14"
+        hash: "101b94bcf3f536bd64f0ac50f21cd5de"
     }
     Frame {
         msec: 2464
-        hash: "4996ef39bb0122c10d65f8dd8674b386"
+        hash: "edaee946a2e25fed6de9acfda0d44a14"
     }
     Frame {
         msec: 2480
-        hash: "ede7c6ca9d6deb7819c3715e98755d6e"
+        hash: "b170b60632b17595713dd911afc46fcc"
     }
     Frame {
         msec: 2496
-        hash: "e703fad2fcf9244ec9865200c7d17ce3"
+        hash: "57550914cd214025c6b1f3dfa446417f"
     }
     Key {
         type: 7
@@ -694,23 +694,23 @@ VisualTest {
     }
     Frame {
         msec: 2512
-        hash: "e2bfc16fd893bb3eb0e5df89a0169af3"
+        hash: "3fd7252f5e61e3c348219a54fd5b95d9"
     }
     Frame {
         msec: 2528
-        hash: "cfd0eb2bc378bd46644f3f7820150685"
+        hash: "c6c27dd386e40bc0a02ad8104301d391"
     }
     Frame {
         msec: 2544
-        hash: "442b05b04762c2bcda291aaa0341398e"
+        hash: "dd476c04d3612f940e1959030ee8e264"
     }
     Frame {
         msec: 2560
-        hash: "55842a6503057eea98e2075ef160873e"
+        hash: "f2f8d9bb8a1865237398421f6a6d89dc"
     }
     Frame {
         msec: 2576
-        hash: "730f80233dacf1119660a76d2a34c5fc"
+        hash: "d4a48ee79a18cc5c0bc123fbb40c3efd"
     }
     Frame {
         msec: 2592
@@ -766,23 +766,23 @@ VisualTest {
     }
     Frame {
         msec: 2768
-        hash: "4d04c12bc7fab0b22df3135bf3a87a22"
+        hash: "f13bc957329adad9dcb1ce0c408eeaaf"
     }
     Frame {
         msec: 2784
-        hash: "fdca5a3f8312452feba7f37b1caa6419"
+        hash: "9a676805f3474f924cbe7ea21ee9dcab"
     }
     Frame {
         msec: 2800
-        hash: "97b955e0f8cde30299b238d9ac0eb308"
+        hash: "f0161b0d27757137bcb7fd3e6db2280c"
     }
     Frame {
         msec: 2816
-        hash: "19664de1a738458810896959ba4087ad"
+        hash: "c7034a0e8956c9f483c128a934d68fa7"
     }
     Frame {
         msec: 2832
-        hash: "4f9a4b6de6a2969e4639076a8f7c258e"
+        hash: "19664de1a738458810896959ba4087ad"
     }
     Key {
         type: 7
@@ -794,31 +794,31 @@ VisualTest {
     }
     Frame {
         msec: 2848
-        hash: "a10f18aa686be2681a48082ec9f01df7"
+        hash: "c5d5ff1884dd0ede23097530c249678c"
     }
     Frame {
         msec: 2864
-        hash: "b8f39a6cca377dd573429d879286dd63"
+        hash: "131ae4a26ad06bbef105668d30e154aa"
     }
     Frame {
         msec: 2880
-        image: "gridview2.2.png"
+        hash: "5d6ba09a5038e00007af0fa3f89b67b8"
     }
     Frame {
         msec: 2896
-        hash: "3301e52a46efbc49882401c77853ffde"
+        hash: "c88c120d64171197e4050cb73b56a766"
     }
     Frame {
         msec: 2912
-        hash: "0c614597f17496ebc701efe7b0c1fbb6"
+        hash: "9d5ee2458abc5dfd56abfd42c906270f"
     }
     Frame {
         msec: 2928
-        hash: "6dda2d6b034c932e279cf216c9b3e6ad"
+        hash: "823b5d63768f5a18e795d5ed61f4dec8"
     }
     Frame {
         msec: 2944
-        hash: "7bf08cd5fe3ad3f83bbef28f452e0545"
+        hash: "1b7ebcf0e3d68e429cb04966120985e5"
     }
     Frame {
         msec: 2960
@@ -854,35 +854,35 @@ VisualTest {
     }
     Frame {
         msec: 3056
-        hash: "0fe7d46e7c18ce7bb5a098c5c662d557"
+        hash: "1a8a32127c1b699bc282b0c209117a00"
     }
     Frame {
         msec: 3072
-        hash: "cd5df541cc1ed545bc27da9e4a937261"
+        hash: "2f5f2ab12410c070a7c05a1674e273fe"
     }
     Frame {
         msec: 3088
-        hash: "35762467b83fee1870cff9b0436994d3"
+        hash: "afe7c2cd74cc90d67e8c068eaf5988eb"
     }
     Frame {
         msec: 3104
-        hash: "75a620b42caabf5b1576041dbd4c2808"
+        hash: "e063d9eb45dc42b3f8b66937b7b4c19a"
     }
     Frame {
         msec: 3120
-        hash: "f1b06290a6cbd48b8d3d4ce1e42ed754"
+        hash: "75a620b42caabf5b1576041dbd4c2808"
     }
     Frame {
         msec: 3136
-        hash: "8e1a50dc082828587a4656117760a852"
+        hash: "2e2b9db4d2f19035c7c29489332b2550"
     }
     Frame {
         msec: 3152
-        hash: "aae8e5f166e736040138d8e222a844dd"
+        hash: "32370cba80db8eaf1f5cd9b73d3472ed"
     }
     Frame {
         msec: 3168
-        hash: "f69e5cf2bcb26fe49126776695b0b7e0"
+        hash: "3a79c47a8eb8bb79316e61a7eed58e57"
     }
     Key {
         type: 7
@@ -894,19 +894,19 @@ VisualTest {
     }
     Frame {
         msec: 3184
-        hash: "7b482fece0255ea07496ef0545b008a2"
+        hash: "c84e47182ef6ebec61163f9b42d03c64"
     }
     Frame {
         msec: 3200
-        hash: "3f96eaebfebe8d4eeb347b201b59ab11"
+        hash: "6a0a83a39e6ab82b5437d46468e4776d"
     }
     Frame {
         msec: 3216
-        hash: "9943626d2226c3be711c8213906133f0"
+        hash: "945929656c1d27bcba51ce908e72a770"
     }
     Frame {
         msec: 3232
-        hash: "fd5fd8177b3957c27f1de0d95621351a"
+        hash: "506283ccfe9670633ce0bf60b437b37b"
     }
     Frame {
         msec: 3248
@@ -958,31 +958,31 @@ VisualTest {
     }
     Frame {
         msec: 3408
-        hash: "fb437f6c23561092a124e498f1604ff2"
+        hash: "7d12bcac0fcaaff7467c444ab89f1e06"
     }
     Frame {
         msec: 3424
-        hash: "402ba144bbb7260eec4553e68eb35cda"
+        hash: "2f4538eec0c704af25b0a73d5a8dded4"
     }
     Frame {
         msec: 3440
-        hash: "76a983de9e85e0c81dfb8908252bd6c9"
+        hash: "4722cbfba5de7e4f7b3cee10bd0f75b5"
     }
     Frame {
         msec: 3456
-        hash: "09219f55fae47a0afed887ebf68a36bc"
+        hash: "3a6df7e6d771c6edc5218ad9a4bf6ab0"
     }
     Frame {
         msec: 3472
-        hash: "344e81cc262093facef2f6a235a734dc"
+        hash: "09219f55fae47a0afed887ebf68a36bc"
     }
     Frame {
         msec: 3488
-        hash: "8f1c5544eb537555b1c59a377b15e31d"
+        hash: "c04c0010761f572c5b16963699c70135"
     }
     Frame {
         msec: 3504
-        hash: "606b9bb549fe2e4bbd09d67b7dea0d1a"
+        hash: "52d59ffff0f2109f9a584f3582158798"
     }
     Key {
         type: 7
@@ -994,23 +994,23 @@ VisualTest {
     }
     Frame {
         msec: 3520
-        hash: "63e239c97bd01a61cb31ef2869e7f47c"
+        hash: "9b1d58189c56205ba8963671bfb86742"
     }
     Frame {
         msec: 3536
-        hash: "f7c176550c39f8a1ad64590cf33a60a4"
+        hash: "7de84895e12919ffe935b23372db95db"
     }
     Frame {
         msec: 3552
-        hash: "8581cb14ed81efdf9abb638b5e542cc3"
+        hash: "d9c5b4c2a7831c216fe2266fe26306b0"
     }
     Frame {
         msec: 3568
-        hash: "7a1e9354ecc49d8bc27d303c7bdc81f9"
+        hash: "1c2bc039c48e7e9da07165f405a6f207"
     }
     Frame {
         msec: 3584
-        hash: "610288b97276ee03702ed8a814ef333d"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 3600
@@ -1074,19 +1074,19 @@ VisualTest {
     }
     Frame {
         msec: 3808
-        hash: "9713c6b9aff051dd0cc45c545d34b688"
+        hash: "abf9f5ef21fb62e5ad89ae2640a5a7e1"
     }
     Frame {
         msec: 3824
-        hash: "1f8fd4d759e343720a8681b6ad126b72"
+        hash: "58103d91498617585163e0508bdb724d"
     }
     Frame {
         msec: 3840
-        image: "gridview2.3.png"
+        hash: "c46ea52b070681155466b30096379c4f"
     }
     Frame {
         msec: 3856
-        hash: "8550d916d91a40b0c3a886b962e07ffc"
+        hash: "b78cfa8624a7f7b382bb628648f8a9df"
     }
     Key {
         type: 7
@@ -1098,143 +1098,143 @@ VisualTest {
     }
     Frame {
         msec: 3872
-        hash: "df0c2e474139e79429bfc19c79a65ef8"
+        hash: "523667a6f3213fb67de1744636780831"
     }
     Frame {
         msec: 3888
-        hash: "acfb99d081d754276e5ed59bd590aeab"
+        hash: "f0b7d38f695a29f6787dc3683a05a7c8"
     }
     Frame {
         msec: 3904
-        hash: "2b34cd101b442f7a3de2893fd5514c16"
+        hash: "1e5cf55e27217e67a5deb89e2d46349a"
     }
     Frame {
         msec: 3920
-        hash: "df92ced66faa1d59354d8010278438ec"
+        hash: "c49869491f484d07da838a21564e5e19"
     }
     Frame {
         msec: 3936
-        hash: "dd39a8e6fa3784453461193a6da416cd"
+        hash: "1acce2b796476d2d7d130749b06f334f"
     }
     Frame {
         msec: 3952
-        hash: "5670e8f91ea2df451f0974a51cd77d7d"
+        hash: "19ee6550b52517345859f9feb0b0d5a4"
     }
     Frame {
         msec: 3968
-        hash: "74b97a09bfe7400872a2c6214e04a5ac"
+        hash: "d2f360af319c740ad095ee0a463fa6fa"
     }
     Frame {
         msec: 3984
-        hash: "cfd55b963506ab54cf09a7311e84bcc9"
+        hash: "032326c6cf2a9da09c2388626ce942ef"
     }
     Frame {
         msec: 4000
-        hash: "59657ee9293c03f064d62de826931435"
+        hash: "ba2a7178b7c68001ecfdfea053507d0e"
     }
     Frame {
         msec: 4016
-        hash: "31f6a4adf31be5ed0af0ea4097e3acee"
+        hash: "9afddf683c810e288ed0da2fa44c5182"
     }
     Frame {
         msec: 4032
-        hash: "8f5bfc40c8cdb2f8ce69adb72e7efe76"
+        hash: "93a7145e4bafa1e40a1db013b1c4337c"
     }
     Frame {
         msec: 4048
-        hash: "9dc38985113124130e2ca7950e0bd144"
+        hash: "3d48687ecb20a8670dd656c5705a0797"
     }
     Frame {
         msec: 4064
-        hash: "786e6e8b9e74876a6f393d61a78b8fc7"
+        hash: "7578264d5ea215f7fde90478ba5e6d32"
     }
     Frame {
         msec: 4080
-        hash: "1f4d59a4e4684aab309363a711b30006"
+        hash: "fb84bbce52e9c4dc4efc1eed7e863007"
     }
     Frame {
         msec: 4096
-        hash: "a11e332de151b43051796e16dbcf75c3"
+        hash: "df5d88d8421af767057fc4b3d0de23b1"
     }
     Frame {
         msec: 4112
-        hash: "1a0e82029ae107cb2a018786752433ff"
+        hash: "dae3e3e10fe7e0ddcf10a7bb4ecc3f1a"
     }
     Frame {
         msec: 4128
-        hash: "b14c51977c7fbf51f9cf6fec309bff6a"
+        hash: "eb15ba34411afd416dea5bc2b18cfb27"
     }
     Frame {
         msec: 4144
-        hash: "2b418f811992399c3f87c268db745632"
+        hash: "5f51ade6a1400093e9dd2b80d6f7a6ca"
     }
     Frame {
         msec: 4160
-        hash: "0e9a056207053ca98c4e9f42de244c62"
+        hash: "5e240752b752ca2ed4e6087f4deb0fbf"
     }
     Frame {
         msec: 4176
-        hash: "1945c3f9e3a1337e7d111e15adea345f"
+        hash: "ae1931b9f168211c44c7269a245635fd"
     }
     Frame {
         msec: 4192
-        hash: "d8cf36b6cc15a01ead815d814ae81cb4"
+        hash: "83588693715deadea8b875d6c6547371"
     }
     Frame {
         msec: 4208
-        hash: "d8cf36b6cc15a01ead815d814ae81cb4"
+        hash: "83588693715deadea8b875d6c6547371"
     }
     Frame {
         msec: 4224
-        hash: "d8cf36b6cc15a01ead815d814ae81cb4"
+        hash: "83588693715deadea8b875d6c6547371"
     }
     Frame {
         msec: 4240
-        hash: "d8cf36b6cc15a01ead815d814ae81cb4"
+        hash: "83588693715deadea8b875d6c6547371"
     }
     Frame {
         msec: 4256
-        hash: "d8cf36b6cc15a01ead815d814ae81cb4"
+        hash: "83588693715deadea8b875d6c6547371"
     }
     Frame {
         msec: 4272
-        hash: "d8cf36b6cc15a01ead815d814ae81cb4"
+        hash: "83588693715deadea8b875d6c6547371"
     }
     Frame {
         msec: 4288
-        hash: "d8cf36b6cc15a01ead815d814ae81cb4"
+        hash: "83588693715deadea8b875d6c6547371"
     }
     Frame {
         msec: 4304
-        hash: "d8cf36b6cc15a01ead815d814ae81cb4"
+        hash: "83588693715deadea8b875d6c6547371"
     }
     Frame {
         msec: 4320
-        hash: "d8cf36b6cc15a01ead815d814ae81cb4"
+        hash: "83588693715deadea8b875d6c6547371"
     }
     Frame {
         msec: 4336
-        hash: "d8cf36b6cc15a01ead815d814ae81cb4"
+        hash: "83588693715deadea8b875d6c6547371"
     }
     Frame {
         msec: 4352
-        hash: "d8cf36b6cc15a01ead815d814ae81cb4"
+        hash: "83588693715deadea8b875d6c6547371"
     }
     Frame {
         msec: 4368
-        hash: "d8cf36b6cc15a01ead815d814ae81cb4"
+        hash: "83588693715deadea8b875d6c6547371"
     }
     Frame {
         msec: 4384
-        hash: "d8cf36b6cc15a01ead815d814ae81cb4"
+        hash: "83588693715deadea8b875d6c6547371"
     }
     Frame {
         msec: 4400
-        hash: "d8cf36b6cc15a01ead815d814ae81cb4"
+        hash: "83588693715deadea8b875d6c6547371"
     }
     Frame {
         msec: 4416
-        hash: "d8cf36b6cc15a01ead815d814ae81cb4"
+        hash: "83588693715deadea8b875d6c6547371"
     }
     Key {
         type: 6
@@ -1246,31 +1246,31 @@ VisualTest {
     }
     Frame {
         msec: 4432
-        hash: "d8cf36b6cc15a01ead815d814ae81cb4"
+        hash: "83588693715deadea8b875d6c6547371"
     }
     Frame {
         msec: 4448
-        hash: "1945c3f9e3a1337e7d111e15adea345f"
+        hash: "ae1931b9f168211c44c7269a245635fd"
     }
     Frame {
         msec: 4464
-        hash: "0e9a056207053ca98c4e9f42de244c62"
+        hash: "a8e4b69162a6298929c12a91e60f20c1"
     }
     Frame {
         msec: 4480
-        hash: "2b418f811992399c3f87c268db745632"
+        hash: "ca4694bbbdc206c46600c894ed853390"
     }
     Frame {
         msec: 4496
-        hash: "b14c51977c7fbf51f9cf6fec309bff6a"
+        hash: "21b2f2ee716d6b28066d44bfdc57babf"
     }
     Frame {
         msec: 4512
-        hash: "1a0e82029ae107cb2a018786752433ff"
+        hash: "d37df25a59f3ba88b78f548521a6e5b2"
     }
     Frame {
         msec: 4528
-        hash: "a11e332de151b43051796e16dbcf75c3"
+        hash: "b554cb62b97bbbb671d9b34389d4187a"
     }
     Key {
         type: 7
@@ -1282,75 +1282,75 @@ VisualTest {
     }
     Frame {
         msec: 4544
-        hash: "1f4d59a4e4684aab309363a711b30006"
+        hash: "d28889303f98c47665247009bcfd68e7"
     }
     Frame {
         msec: 4560
-        hash: "786e6e8b9e74876a6f393d61a78b8fc7"
+        hash: "80e7808641fc79c893a02842f641249b"
     }
     Frame {
         msec: 4576
-        hash: "9dc38985113124130e2ca7950e0bd144"
+        hash: "4f3a39e8c61ad9197e7f24058671e510"
     }
     Frame {
         msec: 4592
-        hash: "8f5bfc40c8cdb2f8ce69adb72e7efe76"
+        hash: "ba2a7178b7c68001ecfdfea053507d0e"
     }
     Frame {
         msec: 4608
-        hash: "31f6a4adf31be5ed0af0ea4097e3acee"
+        hash: "ca1c72729c41845151820d362721a1e7"
     }
     Frame {
         msec: 4624
-        hash: "59657ee9293c03f064d62de826931435"
+        hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f"
     }
     Frame {
         msec: 4640
-        hash: "23aa652a0de7fced4a780d72f0940a1b"
+        hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f"
     }
     Frame {
         msec: 4656
-        hash: "23aa652a0de7fced4a780d72f0940a1b"
+        hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f"
     }
     Frame {
         msec: 4672
-        hash: "23aa652a0de7fced4a780d72f0940a1b"
+        hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f"
     }
     Frame {
         msec: 4688
-        hash: "23aa652a0de7fced4a780d72f0940a1b"
+        hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f"
     }
     Frame {
         msec: 4704
-        hash: "23aa652a0de7fced4a780d72f0940a1b"
+        hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f"
     }
     Frame {
         msec: 4720
-        hash: "23aa652a0de7fced4a780d72f0940a1b"
+        hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f"
     }
     Frame {
         msec: 4736
-        hash: "23aa652a0de7fced4a780d72f0940a1b"
+        hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f"
     }
     Frame {
         msec: 4752
-        hash: "23aa652a0de7fced4a780d72f0940a1b"
+        hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f"
     }
     Frame {
         msec: 4768
-        hash: "23aa652a0de7fced4a780d72f0940a1b"
+        hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f"
     }
     Frame {
         msec: 4784
-        hash: "23aa652a0de7fced4a780d72f0940a1b"
+        hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f"
     }
     Frame {
         msec: 4800
-        image: "gridview2.4.png"
+        hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f"
     }
     Frame {
         msec: 4816
-        hash: "23aa652a0de7fced4a780d72f0940a1b"
+        hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f"
     }
     Key {
         type: 6
@@ -1362,27 +1362,27 @@ VisualTest {
     }
     Frame {
         msec: 4832
-        hash: "23aa652a0de7fced4a780d72f0940a1b"
+        hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f"
     }
     Frame {
         msec: 4848
-        hash: "d46eea049d6156a5e85d9c6811d9d367"
+        hash: "1176eed6f023a843a646517e60f848b5"
     }
     Frame {
         msec: 4864
-        hash: "d5796ae85247cb8502f92f0d044e4e1f"
+        hash: "26eca367a7fe38ac123fa63cfbb20421"
     }
     Frame {
         msec: 4880
-        hash: "90987ac49c1a4e6b668436e3ff631e6c"
+        hash: "d471f06d345e5a09bf4ea540b80fe1e3"
     }
     Frame {
         msec: 4896
-        hash: "c38d69759ad80242b1fe83ba191cd421"
+        hash: "e3694d271e363df1b212d975a464df62"
     }
     Frame {
         msec: 4912
-        hash: "09d08aed76a04e492d8a39cc4dd2b8f5"
+        hash: "3dc24a10bbf6a6a0ba85f50de8646305"
     }
     Key {
         type: 7
@@ -1394,175 +1394,175 @@ VisualTest {
     }
     Frame {
         msec: 4928
-        hash: "9671d2ff9a2ef46ce3c750a1965404a4"
+        hash: "08e7979e36a9a8a500193020ab68c616"
     }
     Frame {
         msec: 4944
-        hash: "f55857816d666ece4a7987a70883b3d1"
+        hash: "bd91601e455c2c37c786f907bd20b447"
     }
     Frame {
         msec: 4960
-        hash: "a2d80527b30316d9120b057bbfcfa666"
+        hash: "e4b676fc9752f3bff5353a2bf528b3ac"
     }
     Frame {
         msec: 4976
-        hash: "87ca69287c1469cbc7e65d1673016de7"
+        hash: "c772188a68cc0958c247145005d580ef"
     }
     Frame {
         msec: 4992
-        hash: "51588c7ebbe2dcd87a3c9bebf028aee3"
+        hash: "eded946d9e7c6418e3933624fe2f1dbf"
     }
     Frame {
         msec: 5008
-        hash: "917a9a171273fe9fd4c450eeed6f58ed"
+        hash: "46a2dd2bfa66a3781a00fe466e05eeb0"
     }
     Frame {
         msec: 5024
-        hash: "6e7ade250a9a9692caee2a220dd2ac53"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5040
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5056
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5072
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5088
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5104
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5120
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5136
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5152
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5168
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5184
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5200
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5216
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5232
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5248
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5264
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5280
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5296
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5312
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5328
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5344
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5360
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5376
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5392
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5408
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5424
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5440
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5456
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5472
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5488
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5504
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5520
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5536
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5552
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5568
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5584
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5600
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Key {
         type: 6
@@ -1574,31 +1574,31 @@ VisualTest {
     }
     Frame {
         msec: 5616
-        hash: "ca2dcb16d553889a3a57b48700c2a595"
+        hash: "4e11a072f1136c2c6298e6cfb25700dd"
     }
     Frame {
         msec: 5632
-        hash: "c5c9aab9bea757f1c451e89df72bd836"
+        hash: "e44ee0f83cbd176620d5c91851402b5b"
     }
     Frame {
         msec: 5648
-        hash: "a8cf3085f8c3b743f3f15db1ad7b8801"
+        hash: "c18bc8109b350673faf64b4722e86f3d"
     }
     Frame {
         msec: 5664
-        hash: "c25a92050eced1c304506572723273a3"
+        hash: "1b552ed8555c61e1fa664e6c88aee64d"
     }
     Frame {
         msec: 5680
-        hash: "cff981039c1a3eb6c3c1a20f142fbae2"
+        hash: "11284c77b23ba4b4b0c664b387dc9d48"
     }
     Frame {
         msec: 5696
-        hash: "930765587fe3355873bbdff66b812b74"
+        hash: "fbd015d60a8ada6a671301d01846b4c8"
     }
     Frame {
         msec: 5712
-        hash: "6a60f97c7b39add465e1bd366e9c644b"
+        hash: "1456fca256ab6fdf930dd079ee8b77a7"
     }
     Key {
         type: 7
@@ -1610,99 +1610,99 @@ VisualTest {
     }
     Frame {
         msec: 5728
-        hash: "7a1fd3c488d1064a75dc598c9a773291"
+        hash: "bf7f688319a89ade564734d7fc658167"
     }
     Frame {
         msec: 5744
-        hash: "e2ecd7e68e27eb3d2dcb5e368d3ee5a0"
+        hash: "68819e722d6032881824448ed63248b2"
     }
     Frame {
         msec: 5760
-        image: "gridview2.5.png"
+        hash: "510589f35813c6c1d6484f614da92ae3"
     }
     Frame {
         msec: 5776
-        hash: "20f3aaca2efc3066076e73d1d95e5363"
+        hash: "03714e1fe57c2a438b0c89374a0d51b4"
     }
     Frame {
         msec: 5792
-        hash: "b18d476cadc36e22dddc3185f595c123"
+        hash: "37f9e630ac66e999046d686078cf5a68"
     }
     Frame {
         msec: 5808
-        hash: "8cbc47555178c8ee355774eab17b4b19"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 5824
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 5840
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 5856
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 5872
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 5888
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 5904
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 5920
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 5936
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 5952
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 5968
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 5984
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 6000
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 6016
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 6032
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 6048
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 6064
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 6080
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 6096
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Key {
         type: 6
@@ -1714,39 +1714,39 @@ VisualTest {
     }
     Frame {
         msec: 6112
-        hash: "e488fb76fb550fba51b95bee3fee80d5"
+        hash: "b534ccea1f69ececc54d943e73b7e9f4"
     }
     Frame {
         msec: 6128
-        hash: "8c2fab0c73d1cfbeeb0ec937085d6b3b"
+        hash: "f45eb6005981864d7e4d1379a4390b02"
     }
     Frame {
         msec: 6144
-        hash: "5d9353517177ef7c6314d8a65cb009ec"
+        hash: "a644905acb7cf6e4d9351f1140985a98"
     }
     Frame {
         msec: 6160
-        hash: "ed8de504f7e2028cd369c1555314fd81"
+        hash: "011be55b909843b2506c5a97e7571e51"
     }
     Frame {
         msec: 6176
-        hash: "8fe84d8badbe5bd08d097ba6bda10611"
+        hash: "35b224d84ae3a4bdba0ace487471f0a6"
     }
     Frame {
         msec: 6192
-        hash: "d77419a55a3cf933505e793bb258e6af"
+        hash: "dcfd5536e6065a19650fe67914211223"
     }
     Frame {
         msec: 6208
-        hash: "457ac82be02e2f5e08e51ccc78c94781"
+        hash: "8ad99c352901c54ecc601ca2ac8c1f08"
     }
     Frame {
         msec: 6224
-        hash: "e57e2852f065afff9c24c5bc9f29edee"
+        hash: "e4774d15b45865b9f445f679cd0414ea"
     }
     Frame {
         msec: 6240
-        hash: "f72cd6ad3324936c3a18c264e23e05a9"
+        hash: "a5b78dfb09b9031f0aabfa7439cbc433"
     }
     Key {
         type: 7
@@ -1758,127 +1758,127 @@ VisualTest {
     }
     Frame {
         msec: 6256
-        hash: "a4bf7eae6fc7a05239d09421ae95304a"
+        hash: "20b87dc26080f8e8e070b2fa299f496a"
     }
     Frame {
         msec: 6272
-        hash: "423f3bd07df8bee25818644c07201a3c"
+        hash: "0e6d05d1df8328ca17d953476d19ae14"
     }
     Frame {
         msec: 6288
-        hash: "225e9c698424f287b9458b7839b4479b"
+        hash: "e2b1ec6b985bbc57f0384a49f3af545c"
     }
     Frame {
         msec: 6304
-        hash: "0f463db7e4acc184a4efb7b5e5c0d397"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6320
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6336
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6352
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6368
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6384
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6400
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6416
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6432
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6448
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6464
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6480
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6496
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6512
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6528
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6544
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6560
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6576
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6592
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6608
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6624
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6640
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6656
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6672
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6688
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6704
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6720
-        image: "gridview2.6.png"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6736
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Key {
         type: 6
@@ -1890,27 +1890,27 @@ VisualTest {
     }
     Frame {
         msec: 6752
-        hash: "b92ad1c3be35c46c0d12bf7701c56f23"
+        hash: "8d36bc2f3ab614d19f3ec8821f3e81ed"
     }
     Frame {
         msec: 6768
-        hash: "738f6bcc043d221488285c7e529b1d1c"
+        hash: "6cbeb42ae5aa75638fedcaf38d25370a"
     }
     Frame {
         msec: 6784
-        hash: "cb0a4e8e79372dd67e8ecfea2143a47c"
+        hash: "fe3b287b14cbfbca4e19a2de979e9e16"
     }
     Frame {
         msec: 6800
-        hash: "544d1825b36f4e7950c1a62b26c1fd9b"
+        hash: "69650da29b84b8009c30de516fb9b623"
     }
     Frame {
         msec: 6816
-        hash: "df99396622342b4f092b0db34a224c3d"
+        hash: "5cbcaf1e6916aa635e31ac4219e387f7"
     }
     Frame {
         msec: 6832
-        hash: "47391f51e5df2249a6ca1f1f6e8e80e0"
+        hash: "acb7f98da26b70bebe20336c51449318"
     }
     Key {
         type: 7
@@ -1922,19 +1922,19 @@ VisualTest {
     }
     Frame {
         msec: 6848
-        hash: "d8079a874ca18d00aeeb611effcbeb8b"
+        hash: "8588b82fadca8ea18d4cc268508119e0"
     }
     Frame {
         msec: 6864
-        hash: "4cfd9264af6935aca425da75ebb2d7cc"
+        hash: "e2cf9055220b1c8126423df30e3607ed"
     }
     Frame {
         msec: 6880
-        hash: "aee6547cb653cd2d56d07285d836149d"
+        hash: "d06e77ff2044ba3f6fc1664af5720a0a"
     }
     Frame {
         msec: 6896
-        hash: "969720f17eae51258e2e143e14bfa737"
+        hash: "b931ef84ecc38676d602638081b1f126"
     }
     Frame {
         msec: 6912
@@ -1998,203 +1998,203 @@ VisualTest {
     }
     Frame {
         msec: 7152
-        hash: "beeaec4b983c970ae448e33047dfdfea"
+        hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad"
     }
     Frame {
         msec: 7168
-        hash: "7c415ab1b7d8e25b71af75d3eec8ee4a"
+        hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad"
     }
     Frame {
         msec: 7184
-        hash: "8913037e57b9a6a58b68f2d6e69b1bd1"
+        hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad"
     }
     Frame {
         msec: 7200
-        hash: "19e59e9409fdaf90ccf75606b58688b7"
+        hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad"
     }
     Frame {
         msec: 7216
-        hash: "1ae71ef5b1006f637bd8df0769af65a6"
+        hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad"
     }
     Frame {
         msec: 7232
-        hash: "1f0aa8b368b2dbccafd54b923d8cce95"
+        hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad"
     }
     Frame {
         msec: 7248
-        hash: "c5079fb25a8c80a995d7aa5fbbd91428"
+        hash: "d30ed063d99d02f6d8302847e83d60a1"
     }
     Frame {
         msec: 7264
-        hash: "59f41220fa5d23db298c9e94f115c17b"
+        hash: "30b128c6248cb35ee4c55e1c2129a19c"
     }
     Frame {
         msec: 7280
-        hash: "48259dfe8b266d9e7f50b187be98c3cb"
+        hash: "1ae71ef5b1006f637bd8df0769af65a6"
     }
     Frame {
         msec: 7296
-        hash: "f7554552598351c3b8dfcbe3ebc32b3b"
+        hash: "6bd6f0c35aeede01d1a8e42c81cd6fb8"
     }
     Frame {
         msec: 7312
-        hash: "219e9cd84d7e5c5c0e6cb80100aa3ab5"
+        hash: "ca90dcb70d416616dcae2df84956cff1"
     }
     Frame {
         msec: 7328
-        hash: "5578e870ee8ce00bce5a59bb25e3d0a9"
+        hash: "a33bc4f7c40fa3eb36803c20222d75f6"
     }
     Frame {
         msec: 7344
-        hash: "4d9cebbf750c03380694245e0e22ab94"
+        hash: "12430a710362b47fef8dfc022b789e07"
     }
     Frame {
         msec: 7360
-        hash: "a60a8032e97ed0a3caa05012c1283de5"
+        hash: "a18abef207f5f6bbd260ca98cce91380"
     }
     Frame {
         msec: 7376
-        hash: "3bee20b349a7e9d67f7770ede6da8673"
+        hash: "e853ea2eba5e3baeba0f43e57d2415ba"
     }
     Frame {
         msec: 7392
-        hash: "d8c34576c25fb8b5e4fa12680ac32e99"
+        hash: "294cff3e6d3a1101f76d2ecce14e11a1"
     }
     Frame {
         msec: 7408
-        hash: "cd1360aa7db7c3b2f2012dfc44de2198"
+        hash: "c38ee992a1b435c12a66e4d49d78c2ed"
     }
     Frame {
         msec: 7424
-        hash: "cd82782f63c9a7d21d51b3440c2f038b"
+        hash: "54775aed3a6283c1fa330d65de5bc70c"
     }
     Frame {
         msec: 7440
-        hash: "e59061967a841aa45607c0828b687527"
+        hash: "eba9a696d9ab1e8da7c6c59787d3f311"
     }
     Frame {
         msec: 7456
-        hash: "01962406c9aaf1aa8bf3ab49e30ddf5f"
+        hash: "2048cd8abb56be34f9e475d7f92b6153"
     }
     Frame {
         msec: 7472
-        hash: "5a5732a568189e598c7985ee806bc67e"
+        hash: "d56b4a04f1d2835a0852ea20e8e2f451"
     }
     Frame {
         msec: 7488
-        hash: "54775aed3a6283c1fa330d65de5bc70c"
+        hash: "f5afb489b7aee20b45c9f5eb5a9eb8d7"
     }
     Frame {
         msec: 7504
-        hash: "66640b4a5c1e68924b25de24e3c3f008"
+        hash: "26f25129f9d2c73a7a5168c73e299919"
     }
     Frame {
         msec: 7520
-        hash: "76999d3125f20ba47dbdff38ee722a8a"
+        hash: "6f23e3c4ec738903b5011cbee1141b00"
     }
     Frame {
         msec: 7536
-        hash: "5159c81533bee8825cff11910bcb90dc"
+        hash: "e10d4bf08980ea7d079a2f359ee62b95"
     }
     Frame {
         msec: 7552
-        hash: "ac0295495345987d1e000f6bb2436927"
+        hash: "eb0a656e8feabcb131e59c66b64f7d09"
     }
     Frame {
         msec: 7568
-        hash: "d56b4a04f1d2835a0852ea20e8e2f451"
+        hash: "94cfa3f71326f6e188fee32c0970de30"
     }
     Frame {
         msec: 7584
-        hash: "ae41fe23e2ab508d7642973c0d9d35b0"
+        hash: "8bc4274a3f0498d600405409f69c1d16"
     }
     Frame {
         msec: 7600
-        hash: "730ca01fbee6ec4928715ec52773c06c"
+        hash: "995cb12e1d07488ae4139d2c67552dc6"
     }
     Frame {
         msec: 7616
-        hash: "ad1fa52c617a2b119d61eb9fb7d58a82"
+        hash: "2d9d9f3fb43e2280b0dea054dc8d7dd4"
     }
     Frame {
         msec: 7632
-        hash: "c74321a822b515a393e8e218bd45e8e3"
+        hash: "dd68eb502e1fe114a24d902b50a5dff9"
     }
     Frame {
         msec: 7648
-        hash: "a9e2f3bee1d47166204c74bdf90cd8c8"
+        hash: "b2738b11e34c5d7840e9aacc443cc1f0"
     }
     Frame {
         msec: 7664
-        hash: "e10d4bf08980ea7d079a2f359ee62b95"
+        hash: "de148713c156476ca7c4021633596782"
     }
     Frame {
         msec: 7680
-        image: "gridview2.7.png"
+        hash: "0e273dbaaab76058b6e04a830bbd80d3"
     }
     Frame {
         msec: 7696
-        hash: "9f0ba6051e684e54ff4e36d980a7e600"
+        hash: "5b3d4cd60019fb3382534949342f63ce"
     }
     Frame {
         msec: 7712
-        hash: "aa6268d8d7fb3d2b91db3e225e8c818a"
+        hash: "5dcad019a1c0eaaab381a7602e1914ff"
     }
     Frame {
         msec: 7728
-        hash: "8e547e55279b1929f42bf51e753f142e"
+        hash: "e046dc0869cc629de5037214af1d58f8"
     }
     Frame {
         msec: 7744
-        hash: "5386c71f8d6701379e177f161d714da2"
+        hash: "affc71688994d6b6763e78305ba1d6b3"
     }
     Frame {
         msec: 7760
-        hash: "a184e9e6012c72fc1aeaed9f98b0fb1e"
+        hash: "d5ec397fdf17bf864e4575543c535dad"
     }
     Frame {
         msec: 7776
-        hash: "777a6b70ca77c45e2e5e3914cc328dcb"
+        hash: "b37cb5816c2077b8018f78985b91fdeb"
     }
     Frame {
         msec: 7792
-        hash: "424f73f25a1e91126f951838d45adc3b"
+        hash: "a3060fa79b1f7f0d9e61ad8c69be19ed"
     }
     Frame {
         msec: 7808
-        hash: "3f7f2eb6b9a5d19fbfcd700baf566dfb"
+        hash: "236dcbaf20e11335efc64b2ce87b551d"
     }
     Frame {
         msec: 7824
-        hash: "c3c4c72b25c2295b82a5fd7454942f77"
+        hash: "09af1c488b56dc3c7c3893b024f6d53f"
     }
     Frame {
         msec: 7840
-        hash: "3b35e93d3eb9d28c5c03d6d353f805d2"
+        hash: "ef2bf66ac68002102476d3cfe4501cb7"
     }
     Frame {
         msec: 7856
-        hash: "5dcad019a1c0eaaab381a7602e1914ff"
+        hash: "165c02de63604aa118d9f8995e6b45af"
     }
     Frame {
         msec: 7872
-        hash: "602a5c569555767413bf445af44c744f"
+        hash: "fb790a0e4bc20afe24639dadf50a03c0"
     }
     Frame {
         msec: 7888
-        hash: "3e9facab95dae772f695b6f7c5175063"
+        hash: "881298b629aeaeb23fa9e9eb446912d2"
     }
     Frame {
         msec: 7904
-        hash: "0921220ec36ca7b25eaae699872a2006"
+        hash: "2175ff436c42616147b2e71b91e34060"
     }
     Frame {
         msec: 7920
-        hash: "1d5fa7fd630af62bcc805bdc6686df37"
+        hash: "85bc0cd40ddc08814a2c3677e7e43bcf"
     }
     Frame {
         msec: 7936
-        hash: "165c02de63604aa118d9f8995e6b45af"
+        hash: "33d81c39d16c6a326012499796e50e03"
     }
     Frame {
         msec: 7952
@@ -2370,7 +2370,7 @@ VisualTest {
     }
     Frame {
         msec: 8640
-        image: "gridview2.8.png"
+        hash: "33d81c39d16c6a326012499796e50e03"
     }
     Frame {
         msec: 8656
@@ -2391,7 +2391,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.0.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.0.png
index 5b7b426..dd992cc 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.qml b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.qml
index b88bd83..907480e 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "668cc6d9d699b947a7c0f3ff4b26853f"
+        image: "drag.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "drag.0.png"
+        hash: "668cc6d9d699b947a7c0f3ff4b26853f"
     }
     Frame {
         msec: 976
@@ -554,7 +554,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "drag.1.png"
+        hash: "a611a57ed2bdf4eaa5e13612346ecce7"
     }
     Mouse {
         type: 5
@@ -1426,7 +1426,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "drag.2.png"
+        hash: "9356ce797d12ae076af947cd0e658551"
     }
     Mouse {
         type: 5
@@ -2290,7 +2290,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "drag.3.png"
+        hash: "668cc6d9d699b947a7c0f3ff4b26853f"
     }
     Mouse {
         type: 5
@@ -2962,7 +2962,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "drag.4.png"
+        hash: "c6d398d42d968763c7597728e86304f2"
     }
     Mouse {
         type: 5
@@ -3850,7 +3850,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "drag.5.png"
+        hash: "f0454d80a51c5f2226bd45aba58dc1e9"
     }
     Mouse {
         type: 5
@@ -4730,7 +4730,7 @@ VisualTest {
     }
     Frame {
         msec: 6720
-        image: "drag.6.png"
+        hash: "bf4b18a73b53c0a554f9bb0ac32a465d"
     }
     Mouse {
         type: 5
@@ -5122,7 +5122,7 @@ VisualTest {
     }
     Frame {
         msec: 7680
-        image: "drag.7.png"
+        hash: "2c1ce07ab6ce0072f6cb205f1e5297e0"
     }
     Frame {
         msec: 7696
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.0.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.0.png
index c9536dc..87305b3 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.qml b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.qml
index 50ef6e8..0371a26 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "cc1fd2f4c3be318052254a9b6be7a57b"
+        image: "mousearea-flickable.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "mousearea-flickable.0.png"
+        hash: "cc1fd2f4c3be318052254a9b6be7a57b"
     }
     Frame {
         msec: 976
@@ -482,7 +482,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "mousearea-flickable.1.png"
+        hash: "cc1fd2f4c3be318052254a9b6be7a57b"
     }
     Frame {
         msec: 1936
@@ -730,7 +730,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "mousearea-flickable.2.png"
+        hash: "4a60ab820ca66548384b2257b21de8ec"
     }
     Frame {
         msec: 2896
@@ -970,7 +970,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "mousearea-flickable.3.png"
+        hash: "4a60ab820ca66548384b2257b21de8ec"
     }
     Frame {
         msec: 3856
@@ -1474,7 +1474,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "mousearea-flickable.4.png"
+        hash: "b66571ae47bf129be88dc66785a81a7d"
     }
     Mouse {
         type: 5
@@ -2090,7 +2090,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "mousearea-flickable.5.png"
+        hash: "d75a43305e2884759ca41d7b1cbadf52"
     }
     Frame {
         msec: 5776
@@ -2338,7 +2338,7 @@ VisualTest {
     }
     Frame {
         msec: 6720
-        image: "mousearea-flickable.6.png"
+        hash: "037386eb30a5e8d53a20a11258ee0f60"
     }
     Frame {
         msec: 6736
@@ -2578,7 +2578,7 @@ VisualTest {
     }
     Frame {
         msec: 7680
-        image: "mousearea-flickable.7.png"
+        hash: "037386eb30a5e8d53a20a11258ee0f60"
     }
     Frame {
         msec: 7696
@@ -3178,7 +3178,7 @@ VisualTest {
     }
     Frame {
         msec: 8640
-        image: "mousearea-flickable.8.png"
+        hash: "524db6ce45674c777d72f9206415be2f"
     }
     Mouse {
         type: 5
@@ -3546,7 +3546,7 @@ VisualTest {
     }
     Frame {
         msec: 9600
-        image: "mousearea-flickable.9.png"
+        hash: "cc1fd2f4c3be318052254a9b6be7a57b"
     }
     Frame {
         msec: 9616
@@ -3794,7 +3794,7 @@ VisualTest {
     }
     Frame {
         msec: 10560
-        image: "mousearea-flickable.10.png"
+        hash: "90cdfe8920f115fd55cde6fdbd95e867"
     }
     Frame {
         msec: 10576
@@ -4346,7 +4346,7 @@ VisualTest {
     }
     Frame {
         msec: 11520
-        image: "mousearea-flickable.11.png"
+        hash: "72e75cfa62993593303b25cbff4af0e6"
     }
     Mouse {
         type: 5
@@ -4858,7 +4858,7 @@ VisualTest {
     }
     Frame {
         msec: 12480
-        image: "mousearea-flickable.12.png"
+        hash: "86b32befe0dada5bdce82a7dd14777ce"
     }
     Frame {
         msec: 12496
@@ -5083,7 +5083,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777251
-        modifiers: 0
+        modifiers: 134217728
         text: ""
         autorep: false
         count: 1
@@ -5106,7 +5106,7 @@ VisualTest {
     }
     Frame {
         msec: 13440
-        image: "mousearea-flickable.13.png"
+        hash: "cc1fd2f4c3be318052254a9b6be7a57b"
     }
     Frame {
         msec: 13456
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.0.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.0.png
new file mode 100644
index 0000000..e2e90d2
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.qml b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.qml
index 433fd82..63c2012 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "1121bb51fc2d4c5c7ef3ae2c44794b49"
+        image: "mousearea-visual.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "mouseregion.0.png"
+        hash: "1121bb51fc2d4c5c7ef3ae2c44794b49"
     }
     Frame {
         msec: 976
@@ -634,7 +634,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "mouseregion.1.png"
+        hash: "73f1639b9e2164c7b974042934c0d151"
     }
     Mouse {
         type: 5
@@ -1002,7 +1002,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "mouseregion.2.png"
+        hash: "73f1639b9e2164c7b974042934c0d151"
     }
     Frame {
         msec: 2896
@@ -1386,7 +1386,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "mouseregion.3.png"
+        hash: "73f1639b9e2164c7b974042934c0d151"
     }
     Frame {
         msec: 3856
@@ -1698,7 +1698,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "mouseregion.4.png"
+        hash: "12edb0902e4d480c9052b00edc1a0a42"
     }
     Mouse {
         type: 5
@@ -2202,7 +2202,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "mouseregion.5.png"
+        hash: "12edb0902e4d480c9052b00edc1a0a42"
     }
     Frame {
         msec: 5776
@@ -2474,7 +2474,7 @@ VisualTest {
     }
     Frame {
         msec: 6720
-        image: "mouseregion.6.png"
+        hash: "12edb0902e4d480c9052b00edc1a0a42"
     }
     Frame {
         msec: 6736
@@ -2738,7 +2738,7 @@ VisualTest {
     }
     Frame {
         msec: 7680
-        image: "mouseregion.7.png"
+        hash: "12edb0902e4d480c9052b00edc1a0a42"
     }
     Frame {
         msec: 7696
@@ -3082,7 +3082,7 @@ VisualTest {
     }
     Frame {
         msec: 8640
-        image: "mouseregion.8.png"
+        hash: "194ebac4ae7d95bf427f8161885a13e1"
     }
     Mouse {
         type: 5
@@ -3538,7 +3538,7 @@ VisualTest {
     }
     Frame {
         msec: 9600
-        image: "mouseregion.9.png"
+        hash: "194ebac4ae7d95bf427f8161885a13e1"
     }
     Mouse {
         type: 5
@@ -4418,7 +4418,7 @@ VisualTest {
     }
     Frame {
         msec: 10560
-        image: "mouseregion.10.png"
+        hash: "194ebac4ae7d95bf427f8161885a13e1"
     }
     Mouse {
         type: 5
@@ -4690,7 +4690,7 @@ VisualTest {
     }
     Frame {
         msec: 11520
-        image: "mouseregion.11.png"
+        hash: "194ebac4ae7d95bf427f8161885a13e1"
     }
     Frame {
         msec: 11536
@@ -4978,7 +4978,7 @@ VisualTest {
     }
     Frame {
         msec: 12480
-        image: "mouseregion.12.png"
+        hash: "194ebac4ae7d95bf427f8161885a13e1"
     }
     Frame {
         msec: 12496
@@ -5314,7 +5314,7 @@ VisualTest {
     }
     Frame {
         msec: 13440
-        image: "mouseregion.13.png"
+        hash: "194ebac4ae7d95bf427f8161885a13e1"
     }
     Frame {
         msec: 13456
@@ -5730,7 +5730,7 @@ VisualTest {
     }
     Frame {
         msec: 14400
-        image: "mouseregion.14.png"
+        hash: "194ebac4ae7d95bf427f8161885a13e1"
     }
     Frame {
         msec: 14416
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.0.png
index da77af9..88924b1 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.qml b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.qml
index 3fec1ef..b307141 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "b4df49cbd7cf972af9879399808f6c53"
+        image: "particles.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "particles.0.png"
+        hash: "d52c30bc201afd3d1caf34efcddafdee"
     }
     Frame {
         msec: 976
@@ -482,7 +482,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "particles.1.png"
+        hash: "57976a66963718e90c62535a936d9251"
     }
     Frame {
         msec: 1936
@@ -722,7 +722,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "particles.2.png"
+        hash: "ac6878edac61916bf424dcee2d7790e8"
     }
     Frame {
         msec: 2896
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml
index e3baa4d..bd480cc 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "cffe9de189a5c9bed3d98f8803b47212"
+        image: "test-pathview-2.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "test-pathview-2.0.png"
+        hash: "cffe9de189a5c9bed3d98f8803b47212"
     }
     Frame {
         msec: 976
@@ -570,7 +570,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "test-pathview-2.1.png"
+        hash: "f5ba4db3c12a466791dc657e10d5d380"
     }
     Frame {
         msec: 1936
@@ -890,7 +890,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "test-pathview-2.2.png"
+        hash: "51203c662d086a15cecc390f0aeeac0d"
     }
     Frame {
         msec: 2896
@@ -1130,7 +1130,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "test-pathview-2.3.png"
+        hash: "5e21e09fa0ec2b1e9f29be60100c40f2"
     }
     Frame {
         msec: 3856
@@ -1586,7 +1586,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "test-pathview-2.4.png"
+        hash: "5e21e09fa0ec2b1e9f29be60100c40f2"
     }
     Frame {
         msec: 4816
@@ -1922,7 +1922,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "test-pathview-2.5.png"
+        hash: "13588d644d17394ac4f8997046089071"
     }
     Frame {
         msec: 5776
@@ -2162,7 +2162,7 @@ VisualTest {
     }
     Frame {
         msec: 6720
-        image: "test-pathview-2.6.png"
+        hash: "a9c65a178a4b4598705bf736c0b1b595"
     }
     Frame {
         msec: 6736
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png
index d94ea19..c6a9ca6 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml
index 949807d..625f839 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "01b9c877f51b878ed262943aedcf89b4"
+        image: "test-pathview.0.png"
     }
     Frame {
         msec: 32
@@ -282,7 +282,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "test-pathview.0.png"
+        hash: "be9817e44df33d4018a174ce350c7244"
     }
     Mouse {
         type: 5
@@ -634,7 +634,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "test-pathview.1.png"
+        hash: "79ad4a90ab449e3232db993b30786d89"
     }
     Frame {
         msec: 1936
@@ -914,7 +914,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "test-pathview.2.png"
+        hash: "dd861293918ee3685ffc48f1670a19df"
     }
     Mouse {
         type: 2
@@ -1226,7 +1226,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "test-pathview.3.png"
+        hash: "ff3df1951adc01e5046d807873b06992"
     }
     Mouse {
         type: 5
@@ -1554,7 +1554,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "test-pathview.4.png"
+        hash: "6cddaed756ff1bcbd9a4627a4c8a44d8"
     }
     Frame {
         msec: 4816
@@ -1794,7 +1794,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "test-pathview.5.png"
+        hash: "c0d0f62d9078f6be493d5545a2ae78ad"
     }
     Frame {
         msec: 5776
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.0.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.0.png
index f474afe..a02a00d 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.qml b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.qml
index 4b36e16..2366f71 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.qml
@@ -6,1598 +6,1598 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        image: "dynamic.0.png"
     }
     Frame {
         msec: 32
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 48
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 64
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 80
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 96
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 112
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 128
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 144
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 160
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 176
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 192
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 208
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 224
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 240
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 256
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 272
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 288
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 304
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 320
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 336
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 352
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 368
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 384
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 400
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 416
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 432
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 448
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 464
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 480
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 496
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 512
-        hash: "ee42cfa8cbbd67becb7d50998d26fe73"
+        hash: "d203c2cb69cb0841827e14bddc206d1f"
     }
     Frame {
         msec: 528
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "453d5fb9d38f37bb8c23e376de76db06"
     }
     Frame {
         msec: 544
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "c4a103de3b7207b3c6277e8ecf79f7dc"
     }
     Frame {
         msec: 560
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "f58b0eb42d9b6ace87379f205da57550"
     }
     Frame {
         msec: 576
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "3384c5b5939d8297e0834c7cd347d579"
     }
     Frame {
         msec: 592
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "420b55371c69c6e1a17ef85a600c75d1"
     }
     Frame {
         msec: 608
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "55cc6fb3424ef69d316ef29f6563a025"
     }
     Frame {
         msec: 624
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "045b5ac545e69777b814423f77575990"
     }
     Frame {
         msec: 640
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "45b05241e8e83180a8d92a37dc859ce0"
     }
     Frame {
         msec: 656
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "97915dfbe4943e1f583ee134bc7a0117"
     }
     Frame {
         msec: 672
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "9b4ce5ed20dd81698b4dd8e48f799c5c"
     }
     Frame {
         msec: 688
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "24bdcea108cdbb3898a4d9216e9f9510"
     }
     Frame {
         msec: 704
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "d1427093b1a375e86a69c6f65cb1f8e5"
     }
     Frame {
         msec: 720
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "43dd666b15697ae18eb2410017256e4c"
     }
     Frame {
         msec: 736
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "8043755f5a8a528353f1e7c310a46a97"
     }
     Frame {
         msec: 752
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "d6b2ef0cb81395cd7454392aed4571f0"
     }
     Frame {
         msec: 768
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "c249fd272e02cbdde972e85fc6dac695"
     }
     Frame {
         msec: 784
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "1df5f8fce7b0c102e9902912600054e7"
     }
     Frame {
         msec: 800
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "a9d16b180634620e3fe6caacb730885b"
     }
     Frame {
         msec: 816
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "7228ce597720520bc12911fdef70ca86"
     }
     Frame {
         msec: 832
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "1faa5c3e72740941234ff4a93388edc9"
     }
     Frame {
         msec: 848
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "997ee1c6d5838153182473a3724df4ad"
     }
     Frame {
         msec: 864
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "6ebbc0a0427825ea701f5bb4758f11a2"
     }
     Frame {
         msec: 880
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "a2ac19360d631fd6d58f8a5ee85e40b4"
     }
     Frame {
         msec: 896
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "17a5842b47a220bb8bd74a368cea6c1f"
     }
     Frame {
         msec: 912
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "b37bae9c3384c068a7dd4f1135d3bfaa"
     }
     Frame {
         msec: 928
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "65ffb0b6629364ebc687da7785601abd"
     }
     Frame {
         msec: 944
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "27c7a43515fb2d8cddde42263f6ac9df"
     }
     Frame {
         msec: 960
-        image: "dynamic.0.png"
+        hash: "cc292df8a090c08d135dedf5e2a0af7c"
     }
     Frame {
         msec: 976
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "53540ff71d74d705a7f19325b50f81ce"
     }
     Frame {
         msec: 992
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "59735c8372774b50052d15232d2f6d01"
     }
     Frame {
         msec: 1008
-        hash: "62727b1025930e19bb03c8f533a12ced"
+        hash: "9c239c4439009465dd91606ac84a3bf0"
     }
     Frame {
         msec: 1024
-        hash: "3e52e7d7d428cf1b850cb9c60dbb3c21"
+        hash: "8b9715d6468c8501895545bd84bf7f57"
     }
     Frame {
         msec: 1040
-        hash: "64f75ab14c979d33d6e0c0d86b76cd35"
+        hash: "0f7a123bfff1dbe059b6ceb3a3f44180"
     }
     Frame {
         msec: 1056
-        hash: "c198a48f4050f176465649d203d6e09a"
+        hash: "c1bc31a379d15ca67d0ffc7139800b3f"
     }
     Frame {
         msec: 1072
-        hash: "6dd8cee5a585a96e78f2cf7478c4da62"
+        hash: "ebf470cd7cff4a836da9e721acfd327d"
     }
     Frame {
         msec: 1088
-        hash: "09edfbce2ea4b8a547f769ce709dcb6b"
+        hash: "e2b89846459f8ae48117ab4393d493bf"
     }
     Frame {
         msec: 1104
-        hash: "e93d01aa6e4f5d3fc82cf5a008e3ea17"
+        hash: "5b980dcc070faf4ab4099cd5f711259c"
     }
     Frame {
         msec: 1120
-        hash: "0e2e7b5eec0e62853972b0139b8c17c6"
+        hash: "4640ed55c1608d76109407279a1f02db"
     }
     Frame {
         msec: 1136
-        hash: "26d4f54628ce20f5665bdc6ddc7f3b6a"
+        hash: "d839b597a3afef61de7b14ffb7ae518e"
     }
     Frame {
         msec: 1152
-        hash: "59836aa6eff85b0152be352b97076d89"
+        hash: "2810e01355c32d3f7a9352676e6b5eef"
     }
     Frame {
         msec: 1168
-        hash: "47cc9894096731a52ca342ab04df9aad"
+        hash: "f1ac8b222e0068320827564e759e87ba"
     }
     Frame {
         msec: 1184
-        hash: "ec95dd3b34a0f17f6fb9b5bedab73653"
+        hash: "7da89563319dd4045e7f9c40a712d722"
     }
     Frame {
         msec: 1200
-        hash: "e32c2b70882828b5082ca3ec889a0dde"
+        hash: "09c55dba364e484eec1a1badb4319003"
     }
     Frame {
         msec: 1216
-        hash: "68d3f8e9c9d5388a6f8360368c8f4d2f"
+        hash: "defd5c9a8003c58a7bef1930efdd6f29"
     }
     Frame {
         msec: 1232
-        hash: "17378b2bd8bde7f357fa5463f457c7b2"
+        hash: "0f84e515b41b5c064ece9002e5edff0d"
     }
     Frame {
         msec: 1248
-        hash: "03db786cd54ec34ce8db15953a5fc847"
+        hash: "d1a0405a18fe5b54e79ca0cadf46743b"
     }
     Frame {
         msec: 1264
-        hash: "9e22a82a622ed0287c44cc629059d5bd"
+        hash: "6046feb2fad386ae25ddd0d0e8ecb673"
     }
     Frame {
         msec: 1280
-        hash: "42955cd23747f7c37d0f0229c0955e90"
+        hash: "b4374b0d9d709b0d7a9f8949616a16bf"
     }
     Frame {
         msec: 1296
-        hash: "42955cd23747f7c37d0f0229c0955e90"
+        hash: "4d9d7d28f32ce2acd14c8dca0bc11fa0"
     }
     Frame {
         msec: 1312
-        hash: "42955cd23747f7c37d0f0229c0955e90"
+        hash: "384afb63bdf34729132ac57080fa2988"
     }
     Frame {
         msec: 1328
-        hash: "42955cd23747f7c37d0f0229c0955e90"
+        hash: "44ac2a9783c450a8c39b09387f0439e2"
     }
     Frame {
         msec: 1344
-        hash: "42955cd23747f7c37d0f0229c0955e90"
+        hash: "26e1dfc2b54370f94881c2341b6e0618"
     }
     Frame {
         msec: 1360
-        hash: "42955cd23747f7c37d0f0229c0955e90"
+        hash: "be47d72ae7c57e255706a8a5afe1fd3f"
     }
     Frame {
         msec: 1376
-        hash: "42955cd23747f7c37d0f0229c0955e90"
+        hash: "92cb490b081bccedf0bbdee86dbc50ed"
     }
     Frame {
         msec: 1392
-        hash: "42955cd23747f7c37d0f0229c0955e90"
+        hash: "1f0a09601474246e94c5ec3763cfa83e"
     }
     Frame {
         msec: 1408
-        hash: "42955cd23747f7c37d0f0229c0955e90"
+        hash: "73f1a5c57a2c96e18ba894a7adb9a014"
     }
     Frame {
         msec: 1424
-        hash: "42955cd23747f7c37d0f0229c0955e90"
+        hash: "8aa130cf4b2706afc8d582ee4c5f510d"
     }
     Frame {
         msec: 1440
-        hash: "42955cd23747f7c37d0f0229c0955e90"
+        hash: "1c0de0f1f4aa5f44bdf774169296487d"
     }
     Frame {
         msec: 1456
-        hash: "42955cd23747f7c37d0f0229c0955e90"
+        hash: "1e9b701ee63effb760e733ac623d75d7"
     }
     Frame {
         msec: 1472
-        hash: "42955cd23747f7c37d0f0229c0955e90"
+        hash: "c30620b6d5d41937217fa9d3e0bf367d"
     }
     Frame {
         msec: 1488
-        hash: "42955cd23747f7c37d0f0229c0955e90"
+        hash: "1f96e1da113d4a6cdb7179771ef7967d"
     }
     Frame {
         msec: 1504
-        hash: "42955cd23747f7c37d0f0229c0955e90"
+        hash: "aa31458e44ba42a633421e8688a3af7e"
     }
     Frame {
         msec: 1520
-        hash: "981fb1ee75e307b548a32df08a86f4cd"
+        hash: "a7a560c05566d0bbea3f2bf397a0063a"
     }
     Frame {
         msec: 1536
-        hash: "f77568307e93d8cd9f0ae417cc19d6e3"
+        hash: "fdd290bc46b86a11afdffb95570d9a67"
     }
     Frame {
         msec: 1552
-        hash: "3bdd4468e26aceee0dad6b3b97b1c1ea"
+        hash: "46574d7bfc15bc5b9124eb0e12741724"
     }
     Frame {
         msec: 1568
-        hash: "252c9ebc2c32755b2289ee1b03877fe3"
+        hash: "aed2015031da6c7e5064fe5fcd1e86e3"
     }
     Frame {
         msec: 1584
-        hash: "64169b7eb7b7ae8573556c5f80230965"
+        hash: "dea39f30e686771ca516ac32e3dc4cb0"
     }
     Frame {
         msec: 1600
-        hash: "4965dfa709a9ac7d8f7dfb4bf8303c65"
+        hash: "4a9839f52a7ee6732c5e18c0d67534be"
     }
     Frame {
         msec: 1616
-        hash: "8c53cf92510154087341ac65a93aae5a"
+        hash: "df21723df1031542483684ff92aaf40a"
     }
     Frame {
         msec: 1632
-        hash: "4dd7502e3e238743d2f3cf038270491e"
+        hash: "53683b7b52d0940aac744f0ef03a4527"
     }
     Frame {
         msec: 1648
-        hash: "cd9a58316837eb92f4ac92dbd86bdba3"
+        hash: "e6177b60c5586e79ca82e1bc7af41737"
     }
     Frame {
         msec: 1664
-        hash: "5de043e3ac8696b59293a2fa60ed7e65"
+        hash: "592a60e226aa6967a8a41bc0e4288583"
     }
     Frame {
         msec: 1680
-        hash: "1bf42a6f6be5a3468d2f47cccfac761e"
+        hash: "534512915d800d00350803c3fdcccaf3"
     }
     Frame {
         msec: 1696
-        hash: "ca05510c1ad25e5d3b002603f4379a09"
+        hash: "a01ffd7ab177f850f3d8320da19a03ce"
     }
     Frame {
         msec: 1712
-        hash: "f6904a918a6475f1965d74372e52a4b1"
+        hash: "15bd47f2c5c8cefe7565790b429aa6a4"
     }
     Frame {
         msec: 1728
-        hash: "9e2312ddfc1648b615288107a06c9f9c"
+        hash: "b90692eafe68c2b04057af887617667c"
     }
     Frame {
         msec: 1744
-        hash: "95c470273b1cb08d4d602efcce339554"
+        hash: "edb22bd93a83de0cd3a046ed5a513ece"
     }
     Frame {
         msec: 1760
-        hash: "dade96f707d4a21885480e13b258b7e9"
+        hash: "f08fa88d05f48c42dd1eba538dc464d4"
     }
     Frame {
         msec: 1776
-        hash: "0bfbd46f1d4cf562253fb383776cb601"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 1792
-        hash: "0bfbd46f1d4cf562253fb383776cb601"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 1808
-        hash: "0bfbd46f1d4cf562253fb383776cb601"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 1824
-        hash: "0bfbd46f1d4cf562253fb383776cb601"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 1840
-        hash: "0bfbd46f1d4cf562253fb383776cb601"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 1856
-        hash: "0bfbd46f1d4cf562253fb383776cb601"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 1872
-        hash: "0bfbd46f1d4cf562253fb383776cb601"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 1888
-        hash: "0bfbd46f1d4cf562253fb383776cb601"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 1904
-        hash: "0bfbd46f1d4cf562253fb383776cb601"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 1920
-        image: "dynamic.1.png"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 1936
-        hash: "0bfbd46f1d4cf562253fb383776cb601"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 1952
-        hash: "0bfbd46f1d4cf562253fb383776cb601"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 1968
-        hash: "0bfbd46f1d4cf562253fb383776cb601"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 1984
-        hash: "0bfbd46f1d4cf562253fb383776cb601"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2000
-        hash: "0bfbd46f1d4cf562253fb383776cb601"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2016
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2032
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2048
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2064
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2080
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2096
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2112
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2128
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2144
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2160
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2176
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2192
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2208
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2224
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2240
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2256
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ec46803523ee0516ed2c89923ff2ded7"
     }
     Frame {
         msec: 2272
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "6b8b68e359f532729bf25a6851563ad7"
     }
     Frame {
         msec: 2288
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "1ee3cf0c3c738a909f1b40b4ef49ac50"
     }
     Frame {
         msec: 2304
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "71889e0f81eeb252dd91a46af5ce24e7"
     }
     Frame {
         msec: 2320
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "99390a696ac524d752672df6f2136fa3"
     }
     Frame {
         msec: 2336
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "00919914f1623bb260e0f99b471aa182"
     }
     Frame {
         msec: 2352
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "64bd7ff1518a3e84c4b40511c5c0ff2d"
     }
     Frame {
         msec: 2368
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "b68da721bf79592e49408b098f72e884"
     }
     Frame {
         msec: 2384
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "6a8ca937b7c961c403ab1662d170c1a5"
     }
     Frame {
         msec: 2400
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "3f4034da4cd71738d1130c3baa38cf9b"
     }
     Frame {
         msec: 2416
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "97a86d3c04d07508604b46732b121edd"
     }
     Frame {
         msec: 2432
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "42e9ab3ed744d1a9a7eb5b7a206f29b3"
     }
     Frame {
         msec: 2448
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "ff86192c1b9c0faabb5563260cb1bff2"
     }
     Frame {
         msec: 2464
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "e1de0e431b971deb546935b6b2fc78e7"
     }
     Frame {
         msec: 2480
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "b7817a7f15d8e727e25719de8cc7d50a"
     }
     Frame {
         msec: 2496
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "66772971897fc00d01d067e5fc38f848"
     }
     Frame {
         msec: 2512
-        hash: "6fc83e8d4ac99b34062c122a8f7f1850"
+        hash: "175db8c0324af4c206f9673f0a8d0477"
     }
     Frame {
         msec: 2528
-        hash: "fabf4e535bc4cc17497939d2eeae4a2d"
+        hash: "f3dea687e0ca335b987b6b3c7d736469"
     }
     Frame {
         msec: 2544
-        hash: "a7981035f46869f5ae824d0c58b263b2"
+        hash: "44d035dd8e302b75c5a7f98a2005fe75"
     }
     Frame {
         msec: 2560
-        hash: "86d8e369bdceb499b244f84ed9e80ba3"
+        hash: "140cf53cb6873b14e6263537f84b0aa0"
     }
     Frame {
         msec: 2576
-        hash: "e28a7dc7ea8690da75670b5a6e93a26b"
+        hash: "6c9090d4488289e69562747271459d7d"
     }
     Frame {
         msec: 2592
-        hash: "bf4e815360a67bd80732bd8812269b21"
+        hash: "49e92db256f5be8c4e35566eea8fca70"
     }
     Frame {
         msec: 2608
-        hash: "a6f8c56cb93da8acc0c90e35596a60d4"
+        hash: "80f41d2eb743ee13fcc486651e310fe2"
     }
     Frame {
         msec: 2624
-        hash: "1e60656f0758605169e51b57bd03af36"
+        hash: "f581fdcaf30c0efd4518e538e88c2ebf"
     }
     Frame {
         msec: 2640
-        hash: "c069b26b9fae47e0104070d702ba9562"
+        hash: "c028db6753cf60bf587e6c46080a31ea"
     }
     Frame {
         msec: 2656
-        hash: "457eb2ca1adff6cbb158afa140b2f20b"
+        hash: "231b69aa9bdadbaf47cbfbc44a322a51"
     }
     Frame {
         msec: 2672
-        hash: "4e5e750b0d94b6777aebff85d38225d9"
+        hash: "f0bcc02aaab3fad2ff53fc2d7541d4aa"
     }
     Frame {
         msec: 2688
-        hash: "96d9840c2354a8786a8470309be97544"
+        hash: "80e34154585ba3480e37eaac6bfa396c"
     }
     Frame {
         msec: 2704
-        hash: "ac7570cc7eeff1acd8c47f2d9328f8be"
+        hash: "e1ebf3ba98b2df53ac9f72744034ba6d"
     }
     Frame {
         msec: 2720
-        hash: "887f937bb263c54f29659f27f2b7a3e3"
+        hash: "b8f749a58888f90ed5cabe7aa2eee1ee"
     }
     Frame {
         msec: 2736
-        hash: "616371183c82b97f69a4c6e2367b8066"
+        hash: "3a78458aa124a331f5b1616be5eea914"
     }
     Frame {
         msec: 2752
-        hash: "36de8ffa9abe850fb681b37aea45ef8b"
+        hash: "c442c02859bc35a8e5493200e68b1730"
     }
     Frame {
         msec: 2768
-        hash: "0505101f0edaaf7ff17deeaaddc6bbf9"
+        hash: "0cc4d24a1e1fa75a339a5b3dd07f18f3"
     }
     Frame {
         msec: 2784
-        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+        hash: "0d124bc578058db99e32d58f4b412758"
     }
     Frame {
         msec: 2800
-        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+        hash: "fc174a039606c5457532c9ac27c6faec"
     }
     Frame {
         msec: 2816
-        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+        hash: "db5d25d7c01605ec81cdab3e239a1f0f"
     }
     Frame {
         msec: 2832
-        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+        hash: "7dcffdbf9ac992aac0751bed5c38a0eb"
     }
     Frame {
         msec: 2848
-        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+        hash: "b59dc4f39b3e032d5cd34ffca098889f"
     }
     Frame {
         msec: 2864
-        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+        hash: "925d232189a3eee4bae08a8fe86a488b"
     }
     Frame {
         msec: 2880
-        image: "dynamic.2.png"
+        hash: "4ab3a889e27de8f45670c240f6d452a6"
     }
     Frame {
         msec: 2896
-        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+        hash: "235bf197b3867c734c4f4ead9db466d1"
     }
     Frame {
         msec: 2912
-        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+        hash: "9b8629b588dcb840fcd32f73f66016ee"
     }
     Frame {
         msec: 2928
-        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+        hash: "dca8e45e930314a860f36343f4577738"
     }
     Frame {
         msec: 2944
-        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+        hash: "b68f3b38e154b65225211c6a1ca8ddb8"
     }
     Frame {
         msec: 2960
-        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+        hash: "d8168aea7962cad60132da9baf66f95c"
     }
     Frame {
         msec: 2976
-        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+        hash: "6f83cd7be71666e08172a2c59e715f2e"
     }
     Frame {
         msec: 2992
-        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+        hash: "f98c68954ed98f340e86c159fcf4f013"
     }
     Frame {
         msec: 3008
-        hash: "e8c53dd8343d7d4c384c2f8507ff0631"
+        hash: "e4692a0e6d82864e9027bcf893e0cf90"
     }
     Frame {
         msec: 3024
-        hash: "99e4d853d64a381e8db27707b5ff2b25"
+        hash: "ed02ff4d37ad03c0d0d53cf8163ed1c5"
     }
     Frame {
         msec: 3040
-        hash: "ab0e62aeffc0d57a5e1d63e6cf49b809"
+        hash: "fb116353a2ceabae2d93c9aac48727d8"
     }
     Frame {
         msec: 3056
-        hash: "4ab11bbf1fb6adb0eec8895f78a24a41"
+        hash: "7b8c99b86838c46db4e756cc039ba045"
     }
     Frame {
         msec: 3072
-        hash: "634ff2ceb39a3f263a3362238a4ae252"
+        hash: "c8d8e194bc957402fe2236b1a472faa6"
     }
     Frame {
         msec: 3088
-        hash: "7f4856873dc23a02297b2497101de9b9"
+        hash: "f0f3d8c8ac3604cd11b7492fe5ee023e"
     }
     Frame {
         msec: 3104
-        hash: "bca3919e9d8e6dc5badd8090401dc934"
+        hash: "b41cf314e4684423b4708ccd55904d60"
     }
     Frame {
         msec: 3120
-        hash: "824bfe40c3657cfe1368563640e4cfce"
+        hash: "4f578969386627b6e620e83bad5a6a6c"
     }
     Frame {
         msec: 3136
-        hash: "f831c1600f68bda139697c406ca70c5e"
+        hash: "bd9fcfaa4e79f969548af12d072c1ec2"
     }
     Frame {
         msec: 3152
-        hash: "f8102ca251a9ff46a8fe5a24cff0d2d6"
+        hash: "a418dc92f8b04fddf95f38bd24825ee6"
     }
     Frame {
         msec: 3168
-        hash: "f33407ad684aa16efc6615d1cf6fa4b9"
+        hash: "4684b3e318a08f0f2331a13143592d18"
     }
     Frame {
         msec: 3184
-        hash: "a73d27f776a6ebfc90309b34421700e5"
+        hash: "1e135a4fd2e7336d8a59ca3497374a3d"
     }
     Frame {
         msec: 3200
-        hash: "ff2a4e2663fc50dfec35152f0e79f935"
+        hash: "d1be76e2c56422b469a9d09e22f62df5"
     }
     Frame {
         msec: 3216
-        hash: "4935f5f58f2672e9d240625151044bda"
+        hash: "8827523a7f8fa89a56d932102dff7b52"
     }
     Frame {
         msec: 3232
-        hash: "f3ad5c203f621fe4d5d321c3c1880743"
+        hash: "e12e6b907af5e6feffed0b9e68c71895"
     }
     Frame {
         msec: 3248
-        hash: "d4fb7cd2e1f6a533dae65ddbb50da8ac"
+        hash: "7bc3605f5f241170732aba19ca649896"
     }
     Frame {
         msec: 3264
-        hash: "91705e9234c4f02d0a730f6270f9e95f"
+        hash: "d7da9274f30cacd419f0b0b7c8c8a728"
     }
     Frame {
         msec: 3280
-        hash: "41e177bec783497b996d6d5f6dac1a15"
+        hash: "154775464235d2a2fb338c27f1490f27"
     }
     Frame {
         msec: 3296
-        hash: "41e177bec783497b996d6d5f6dac1a15"
+        hash: "1657f65e8759eec3c026262bb271dd1c"
     }
     Frame {
         msec: 3312
-        hash: "41e177bec783497b996d6d5f6dac1a15"
+        hash: "29b4c68846aab3c1dcf4e58861915c33"
     }
     Frame {
         msec: 3328
-        hash: "41e177bec783497b996d6d5f6dac1a15"
+        hash: "fe22b3b991a80b34d6fe12515bfa2fd0"
     }
     Frame {
         msec: 3344
-        hash: "41e177bec783497b996d6d5f6dac1a15"
+        hash: "961343bb9dcc1fbe81b4c20392c28cb9"
     }
     Frame {
         msec: 3360
-        hash: "41e177bec783497b996d6d5f6dac1a15"
+        hash: "a2adb3179465e34b517bf906491a1b60"
     }
     Frame {
         msec: 3376
-        hash: "41e177bec783497b996d6d5f6dac1a15"
+        hash: "067fb8a2f5043dd4616fb1539e3e9c4a"
     }
     Frame {
         msec: 3392
-        hash: "41e177bec783497b996d6d5f6dac1a15"
+        hash: "009329915e9027d77218fd83334960ed"
     }
     Frame {
         msec: 3408
-        hash: "41e177bec783497b996d6d5f6dac1a15"
+        hash: "81b05d8aef8152830c6f199d6dd94fd5"
     }
     Frame {
         msec: 3424
-        hash: "41e177bec783497b996d6d5f6dac1a15"
+        hash: "b23fa537f88a97490e48fb3a8cd4b507"
     }
     Frame {
         msec: 3440
-        hash: "41e177bec783497b996d6d5f6dac1a15"
+        hash: "182464f620768efe0253c97cda75d839"
     }
     Frame {
         msec: 3456
-        hash: "41e177bec783497b996d6d5f6dac1a15"
+        hash: "f1ddbec396cead5d4acf9b65822becb6"
     }
     Frame {
         msec: 3472
-        hash: "41e177bec783497b996d6d5f6dac1a15"
+        hash: "a73085722d33638517b3f60a16ce9fcd"
     }
     Frame {
         msec: 3488
-        hash: "41e177bec783497b996d6d5f6dac1a15"
+        hash: "ecce53b0c525834341ee4b3c546e670c"
     }
     Frame {
         msec: 3504
-        hash: "41e177bec783497b996d6d5f6dac1a15"
+        hash: "86f1da737164290a90c1aef9355e2375"
     }
     Frame {
         msec: 3520
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "722ec874122ad8dcc73820a3a2fb7dca"
     }
     Frame {
         msec: 3536
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "35eb086b11482b752e2c02f1dc4d9099"
     }
     Frame {
         msec: 3552
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "83cf9c0b5d0afd5d3cee4c446274f5c4"
     }
     Frame {
         msec: 3568
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "e1bbef11fe02adb0756113e1106fe7f1"
     }
     Frame {
         msec: 3584
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "774c8bb4585954274852d6bb07e64916"
     }
     Frame {
         msec: 3600
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "b0264bcddf313d4e819a608143a86ac9"
     }
     Frame {
         msec: 3616
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "5e3859fd56e5022cbc7831e22447f05d"
     }
     Frame {
         msec: 3632
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "8c2a8b7321d2598b08d483914d4f319c"
     }
     Frame {
         msec: 3648
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "f13913dbc015836e35d5a2ebc94bbeef"
     }
     Frame {
         msec: 3664
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "1309af996f2d7a686f1d9177bc5c9be6"
     }
     Frame {
         msec: 3680
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "460b3500b41624486fe8dcfde087d2b5"
     }
     Frame {
         msec: 3696
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "de0837d19497021528dc782db4da084a"
     }
     Frame {
         msec: 3712
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "18afb8f8e9aa6d4a5db376e26cd9a56d"
     }
     Frame {
         msec: 3728
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "4fc1a8173824c2725160798b7d70aec2"
     }
     Frame {
         msec: 3744
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "87a593f74c946d6af6e31c5a25898766"
     }
     Frame {
         msec: 3760
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "57e68ec2aa5a21b11d21f388399713e5"
     }
     Frame {
         msec: 3776
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
     }
     Frame {
         msec: 3792
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "3eebd1f4f58210f6b546715997a984c2"
     }
     Frame {
         msec: 3808
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "39eabc07bfcefb2ecd369abf94d706cd"
     }
     Frame {
         msec: 3824
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "a0c46402b4700cc2099bdf42c47faf9b"
     }
     Frame {
         msec: 3840
-        image: "dynamic.3.png"
+        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
     }
     Frame {
         msec: 3856
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "c92cba3c2825db4293153588c4b7b229"
     }
     Frame {
         msec: 3872
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
     }
     Frame {
         msec: 3888
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "09b76db3e4a95666ba9c37dd89996fa3"
     }
     Frame {
         msec: 3904
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "b692386f34972d80aded2347e64ad2b6"
     }
     Frame {
         msec: 3920
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "dc65b0a791002efffec05884aa948842"
     }
     Frame {
         msec: 3936
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "069bab78e29d322894647f81d315184a"
     }
     Frame {
         msec: 3952
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "39c8d804b3caf53845baba4ce98e007d"
     }
     Frame {
         msec: 3968
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
     }
     Frame {
         msec: 3984
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
     }
     Frame {
         msec: 4000
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "441d34bff2755e3c30bed80e2bdde69c"
     }
     Frame {
         msec: 4016
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
     }
     Frame {
         msec: 4032
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "3eebd1f4f58210f6b546715997a984c2"
     }
     Frame {
         msec: 4048
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "39eabc07bfcefb2ecd369abf94d706cd"
     }
     Frame {
         msec: 4064
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "a0c46402b4700cc2099bdf42c47faf9b"
     }
     Frame {
         msec: 4080
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
     }
     Frame {
         msec: 4096
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "c92cba3c2825db4293153588c4b7b229"
     }
     Frame {
         msec: 4112
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
     }
     Frame {
         msec: 4128
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "09b76db3e4a95666ba9c37dd89996fa3"
     }
     Frame {
         msec: 4144
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "b692386f34972d80aded2347e64ad2b6"
     }
     Frame {
         msec: 4160
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "dc65b0a791002efffec05884aa948842"
     }
     Frame {
         msec: 4176
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "069bab78e29d322894647f81d315184a"
     }
     Frame {
         msec: 4192
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "39c8d804b3caf53845baba4ce98e007d"
     }
     Frame {
         msec: 4208
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
     }
     Frame {
         msec: 4224
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
     }
     Frame {
         msec: 4240
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "441d34bff2755e3c30bed80e2bdde69c"
     }
     Frame {
         msec: 4256
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "57e68ec2aa5a21b11d21f388399713e5"
     }
     Frame {
         msec: 4272
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
     }
     Frame {
         msec: 4288
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "3eebd1f4f58210f6b546715997a984c2"
     }
     Frame {
         msec: 4304
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "39eabc07bfcefb2ecd369abf94d706cd"
     }
     Frame {
         msec: 4320
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "a0c46402b4700cc2099bdf42c47faf9b"
     }
     Frame {
         msec: 4336
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
     }
     Frame {
         msec: 4352
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "c92cba3c2825db4293153588c4b7b229"
     }
     Frame {
         msec: 4368
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
     }
     Frame {
         msec: 4384
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "09b76db3e4a95666ba9c37dd89996fa3"
     }
     Frame {
         msec: 4400
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "b692386f34972d80aded2347e64ad2b6"
     }
     Frame {
         msec: 4416
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "dc65b0a791002efffec05884aa948842"
     }
     Frame {
         msec: 4432
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "069bab78e29d322894647f81d315184a"
     }
     Frame {
         msec: 4448
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "39c8d804b3caf53845baba4ce98e007d"
     }
     Frame {
         msec: 4464
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
     }
     Frame {
         msec: 4480
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
     }
     Frame {
         msec: 4496
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "441d34bff2755e3c30bed80e2bdde69c"
     }
     Frame {
         msec: 4512
-        hash: "496dc6261695bcf04a8e574146544e98"
+        hash: "57e68ec2aa5a21b11d21f388399713e5"
     }
     Frame {
         msec: 4528
-        hash: "9681be99003f8a14cc5654d06d2c8255"
+        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
     }
     Frame {
         msec: 4544
-        hash: "bcb592a2335aa2e35956881fd028f4e6"
+        hash: "3eebd1f4f58210f6b546715997a984c2"
     }
     Frame {
         msec: 4560
-        hash: "f914b25fdcb02a02b71220d82b7b2a75"
+        hash: "39eabc07bfcefb2ecd369abf94d706cd"
     }
     Frame {
         msec: 4576
-        hash: "63c82c08eb7f2bd50b54b94c952df3f2"
+        hash: "a0c46402b4700cc2099bdf42c47faf9b"
     }
     Frame {
         msec: 4592
-        hash: "8a8dc82be81fa55605c6c2e749895120"
+        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
     }
     Frame {
         msec: 4608
-        hash: "271f8d79b8052dfcd840ffa9ba9ffeec"
+        hash: "c92cba3c2825db4293153588c4b7b229"
     }
     Frame {
         msec: 4624
-        hash: "8f77bbd0585b57e69ac1919bd81ee3b1"
+        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
     }
     Frame {
         msec: 4640
-        hash: "b974260a2f90e141ebc33ced98fbca88"
+        hash: "09b76db3e4a95666ba9c37dd89996fa3"
     }
     Frame {
         msec: 4656
-        hash: "77ada180f8a45652a6fa636d7ece4d9d"
+        hash: "b692386f34972d80aded2347e64ad2b6"
     }
     Frame {
         msec: 4672
-        hash: "4c8dc2e33cd989cb3b0938c6c75b5f95"
+        hash: "dc65b0a791002efffec05884aa948842"
     }
     Frame {
         msec: 4688
-        hash: "a145954989508b925a444e14f0c27a20"
+        hash: "069bab78e29d322894647f81d315184a"
     }
     Frame {
         msec: 4704
-        hash: "8d27ff203819174747ae4a5cee8d0ae8"
+        hash: "39c8d804b3caf53845baba4ce98e007d"
     }
     Frame {
         msec: 4720
-        hash: "830f34b0dab780c6efe2294872ba8508"
+        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
     }
     Frame {
         msec: 4736
-        hash: "5d70a4bbd815569cfe5735b596bad080"
+        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
     }
     Frame {
         msec: 4752
-        hash: "964527bb82ea006e03b030c787a8597c"
+        hash: "441d34bff2755e3c30bed80e2bdde69c"
     }
     Frame {
         msec: 4768
-        hash: "1ad54954b818fa9e6032ac4b6114e7db"
+        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
     }
     Frame {
         msec: 4784
-        hash: "47865243cc252aef67774001af70c54c"
+        hash: "3eebd1f4f58210f6b546715997a984c2"
     }
     Frame {
         msec: 4800
-        image: "dynamic.4.png"
+        hash: "39eabc07bfcefb2ecd369abf94d706cd"
     }
     Frame {
         msec: 4816
-        hash: "47865243cc252aef67774001af70c54c"
+        hash: "a0c46402b4700cc2099bdf42c47faf9b"
     }
     Frame {
         msec: 4832
-        hash: "47865243cc252aef67774001af70c54c"
+        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
     }
     Frame {
         msec: 4848
-        hash: "47865243cc252aef67774001af70c54c"
+        hash: "c92cba3c2825db4293153588c4b7b229"
     }
     Frame {
         msec: 4864
-        hash: "47865243cc252aef67774001af70c54c"
+        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
     }
     Frame {
         msec: 4880
-        hash: "47865243cc252aef67774001af70c54c"
+        hash: "09b76db3e4a95666ba9c37dd89996fa3"
     }
     Frame {
         msec: 4896
-        hash: "47865243cc252aef67774001af70c54c"
+        hash: "b692386f34972d80aded2347e64ad2b6"
     }
     Frame {
         msec: 4912
-        hash: "47865243cc252aef67774001af70c54c"
+        hash: "dc65b0a791002efffec05884aa948842"
     }
     Frame {
         msec: 4928
-        hash: "47865243cc252aef67774001af70c54c"
+        hash: "069bab78e29d322894647f81d315184a"
     }
     Frame {
         msec: 4944
-        hash: "47865243cc252aef67774001af70c54c"
+        hash: "39c8d804b3caf53845baba4ce98e007d"
     }
     Frame {
         msec: 4960
-        hash: "47865243cc252aef67774001af70c54c"
+        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
     }
     Frame {
         msec: 4976
-        hash: "47865243cc252aef67774001af70c54c"
+        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
     }
     Frame {
         msec: 4992
-        hash: "47865243cc252aef67774001af70c54c"
+        hash: "441d34bff2755e3c30bed80e2bdde69c"
     }
     Frame {
         msec: 5008
-        hash: "47865243cc252aef67774001af70c54c"
+        hash: "57e68ec2aa5a21b11d21f388399713e5"
     }
     Frame {
         msec: 5024
-        hash: "47865243cc252aef67774001af70c54c"
+        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
     }
     Frame {
         msec: 5040
-        hash: "baeb8adffc13e230e797e0437f2ad5fa"
+        hash: "3eebd1f4f58210f6b546715997a984c2"
     }
     Frame {
         msec: 5056
-        hash: "d2e440fcad0ee2b7b35d7e5c4e581f73"
+        hash: "39eabc07bfcefb2ecd369abf94d706cd"
     }
     Frame {
         msec: 5072
-        hash: "fb8acb2f69234d3ee089281d0297ad7c"
+        hash: "a0c46402b4700cc2099bdf42c47faf9b"
     }
     Frame {
         msec: 5088
-        hash: "7fda29a83dc535ed8d6b35e999400311"
+        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
     }
     Frame {
         msec: 5104
-        hash: "6482e3eb10cfdbdeb57dd38ba3e3d67e"
+        hash: "c92cba3c2825db4293153588c4b7b229"
     }
     Frame {
         msec: 5120
-        hash: "4d222549bc2565c1598a532460aae4e6"
+        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
     }
     Frame {
         msec: 5136
-        hash: "776d1b0f9945c0e1ceda0cf117264919"
+        hash: "09b76db3e4a95666ba9c37dd89996fa3"
     }
     Frame {
         msec: 5152
-        hash: "f2c362b34a0982ee1a11dea6b063945e"
+        hash: "b692386f34972d80aded2347e64ad2b6"
     }
     Frame {
         msec: 5168
-        hash: "115f02b8893972b5b1d63525ce70762e"
+        hash: "dc65b0a791002efffec05884aa948842"
     }
     Frame {
         msec: 5184
-        hash: "7f2d53581fe2c6c45a628fa4cd9b5742"
+        hash: "069bab78e29d322894647f81d315184a"
     }
     Frame {
         msec: 5200
-        hash: "b5ed1120c4edf842b15d5144adbd93b0"
+        hash: "39c8d804b3caf53845baba4ce98e007d"
     }
     Frame {
         msec: 5216
-        hash: "3511938df57c4cdce316692de204b057"
+        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
     }
     Frame {
         msec: 5232
-        hash: "99583918d068ab5d132fe7a699c2a7a6"
+        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
     }
     Frame {
         msec: 5248
-        hash: "c0ce9df18479dbb57fb1dbc777f4f0e5"
+        hash: "441d34bff2755e3c30bed80e2bdde69c"
     }
     Frame {
         msec: 5264
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "57e68ec2aa5a21b11d21f388399713e5"
     }
     Frame {
         msec: 5280
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
     }
     Frame {
         msec: 5296
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "3eebd1f4f58210f6b546715997a984c2"
     }
     Frame {
         msec: 5312
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "39eabc07bfcefb2ecd369abf94d706cd"
     }
     Frame {
         msec: 5328
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "a0c46402b4700cc2099bdf42c47faf9b"
     }
     Frame {
         msec: 5344
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
     }
     Frame {
         msec: 5360
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "c92cba3c2825db4293153588c4b7b229"
     }
     Frame {
         msec: 5376
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
     }
     Frame {
         msec: 5392
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "09b76db3e4a95666ba9c37dd89996fa3"
     }
     Frame {
         msec: 5408
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "b692386f34972d80aded2347e64ad2b6"
     }
     Frame {
         msec: 5424
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "dc65b0a791002efffec05884aa948842"
     }
     Frame {
         msec: 5440
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "069bab78e29d322894647f81d315184a"
     }
     Frame {
         msec: 5456
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "39c8d804b3caf53845baba4ce98e007d"
     }
     Frame {
         msec: 5472
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
     }
     Frame {
         msec: 5488
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
     }
     Frame {
         msec: 5504
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "441d34bff2755e3c30bed80e2bdde69c"
     }
     Frame {
         msec: 5520
-        hash: "b24db7b5c406328380fcf9927fb26c5c"
+        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
     }
     Frame {
         msec: 5536
-        hash: "98cc64411264d8a635a6afe6b11cee6e"
+        hash: "3eebd1f4f58210f6b546715997a984c2"
     }
     Frame {
         msec: 5552
-        hash: "b86434b7af8ad1db946c43a2791d69ab"
+        hash: "39eabc07bfcefb2ecd369abf94d706cd"
     }
     Frame {
         msec: 5568
-        hash: "f45616f9e33658d1dddb537e842c8768"
+        hash: "a0c46402b4700cc2099bdf42c47faf9b"
     }
     Frame {
         msec: 5584
-        hash: "e49d8955e27cdc19a37c331e56c81af1"
+        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
     }
     Frame {
         msec: 5600
-        hash: "b2dbe764906b50195f65dc11a5842515"
+        hash: "c92cba3c2825db4293153588c4b7b229"
     }
     Frame {
         msec: 5616
-        hash: "71ce7c63d65c29cdffd83f5ae07f0b93"
+        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
     }
     Frame {
         msec: 5632
-        hash: "901d01e1fc777ec185cd023ad0ace4c1"
+        hash: "09b76db3e4a95666ba9c37dd89996fa3"
     }
     Frame {
         msec: 5648
-        hash: "a3f31de30fc2e92bae1f735504216216"
+        hash: "b692386f34972d80aded2347e64ad2b6"
     }
     Frame {
         msec: 5664
-        hash: "0fc52dd8102506e3e7671fa548551b23"
+        hash: "dc65b0a791002efffec05884aa948842"
     }
     Frame {
         msec: 5680
-        hash: "fb92809e728416035dbb91116ad8fe0e"
+        hash: "069bab78e29d322894647f81d315184a"
     }
     Frame {
         msec: 5696
-        hash: "9003dc8ca4f781909035cb03dc45864f"
+        hash: "39c8d804b3caf53845baba4ce98e007d"
     }
     Frame {
         msec: 5712
-        hash: "2bff1de793ad8521fd54413849c3cf29"
+        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
     }
     Frame {
         msec: 5728
-        hash: "8362e4db7c4446282d844a4fc6632d19"
+        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
     }
     Frame {
         msec: 5744
-        hash: "b874fa274c6ec77c106ff4a0288f9169"
+        hash: "441d34bff2755e3c30bed80e2bdde69c"
     }
     Frame {
         msec: 5760
-        image: "dynamic.5.png"
+        hash: "57e68ec2aa5a21b11d21f388399713e5"
     }
     Frame {
         msec: 5776
-        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
     }
     Frame {
         msec: 5792
-        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+        hash: "3eebd1f4f58210f6b546715997a984c2"
     }
     Frame {
         msec: 5808
-        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+        hash: "39eabc07bfcefb2ecd369abf94d706cd"
     }
     Frame {
         msec: 5824
-        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+        hash: "a0c46402b4700cc2099bdf42c47faf9b"
     }
     Frame {
         msec: 5840
-        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
     }
     Frame {
         msec: 5856
-        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+        hash: "c92cba3c2825db4293153588c4b7b229"
     }
     Frame {
         msec: 5872
-        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
     }
     Frame {
         msec: 5888
-        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+        hash: "09b76db3e4a95666ba9c37dd89996fa3"
     }
     Frame {
         msec: 5904
-        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+        hash: "b692386f34972d80aded2347e64ad2b6"
     }
     Frame {
         msec: 5920
-        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+        hash: "dc65b0a791002efffec05884aa948842"
     }
     Frame {
         msec: 5936
-        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+        hash: "069bab78e29d322894647f81d315184a"
     }
     Frame {
         msec: 5952
-        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+        hash: "39c8d804b3caf53845baba4ce98e007d"
     }
     Frame {
         msec: 5968
-        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
     }
     Frame {
         msec: 5984
-        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
     }
     Frame {
         msec: 6000
-        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+        hash: "441d34bff2755e3c30bed80e2bdde69c"
     }
     Frame {
         msec: 6016
-        hash: "e64ac8e11e36cafb25c947c5802d54b9"
+        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
     }
     Frame {
         msec: 6032
-        hash: "7621e64568058b82bcb6f6b46cee3ebc"
+        hash: "3eebd1f4f58210f6b546715997a984c2"
     }
     Frame {
         msec: 6048
-        hash: "f77f6de6fc88813f49427b4888a59dbf"
+        hash: "39eabc07bfcefb2ecd369abf94d706cd"
     }
     Frame {
         msec: 6064
-        hash: "d3a48f596219372ac25941e4c5ec5b2b"
+        hash: "a0c46402b4700cc2099bdf42c47faf9b"
     }
     Frame {
         msec: 6080
-        hash: "d572d932b613f9ca1e0acf144f127dd1"
+        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
     }
     Frame {
         msec: 6096
-        hash: "edf317eaf51d933bcd0f57f214921a81"
+        hash: "c92cba3c2825db4293153588c4b7b229"
     }
     Frame {
         msec: 6112
-        hash: "e0cee7959a5a8a08ad03d75e7b5c6ca1"
+        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
     }
     Frame {
         msec: 6128
-        hash: "96877a15f44d4a2c8d9974cb28b9e1b6"
+        hash: "09b76db3e4a95666ba9c37dd89996fa3"
     }
     Frame {
         msec: 6144
-        hash: "c0ffb0ef6dd9d007d201feebd2f68e44"
+        hash: "b692386f34972d80aded2347e64ad2b6"
     }
     Frame {
         msec: 6160
-        hash: "209fb930223243fa19c5dde9e85ec518"
+        hash: "dc65b0a791002efffec05884aa948842"
     }
     Frame {
         msec: 6176
-        hash: "ae98ac4dba0e78eb8fb7f7dbe29b2832"
+        hash: "069bab78e29d322894647f81d315184a"
     }
     Frame {
         msec: 6192
-        hash: "c94a7d68ce007d83df77a595a5815a96"
+        hash: "39c8d804b3caf53845baba4ce98e007d"
     }
     Frame {
         msec: 6208
-        hash: "4c28e409bf5a6c1289bcab8cd59a9e42"
+        hash: "3b477dfd05f07bdf0ba562d6068cafdb"
     }
     Frame {
         msec: 6224
-        hash: "ea1009f1a3446dd5ce937e6949794794"
+        hash: "eb84ee75bdbf25dcc32587007f5dc9bd"
     }
     Frame {
         msec: 6240
-        hash: "940c16766c2f87feef48e1187672ca9b"
+        hash: "441d34bff2755e3c30bed80e2bdde69c"
     }
     Frame {
         msec: 6256
-        hash: "93664c87c8dcfadc0345f646b2508625"
+        hash: "57e68ec2aa5a21b11d21f388399713e5"
     }
     Frame {
         msec: 6272
-        hash: "93664c87c8dcfadc0345f646b2508625"
+        hash: "4cb9ee1d12b99fb98bedcbcc048867e4"
     }
     Frame {
         msec: 6288
-        hash: "93664c87c8dcfadc0345f646b2508625"
+        hash: "3eebd1f4f58210f6b546715997a984c2"
     }
     Frame {
         msec: 6304
-        hash: "93664c87c8dcfadc0345f646b2508625"
+        hash: "39eabc07bfcefb2ecd369abf94d706cd"
     }
     Frame {
         msec: 6320
-        hash: "93664c87c8dcfadc0345f646b2508625"
+        hash: "a0c46402b4700cc2099bdf42c47faf9b"
     }
     Frame {
         msec: 6336
-        hash: "93664c87c8dcfadc0345f646b2508625"
+        hash: "3c8b4831583922c7c1c85f227ef2b3dc"
     }
     Frame {
         msec: 6352
-        hash: "93664c87c8dcfadc0345f646b2508625"
+        hash: "c92cba3c2825db4293153588c4b7b229"
     }
     Frame {
         msec: 6368
-        hash: "93664c87c8dcfadc0345f646b2508625"
+        hash: "e1b0d4cae609f3074fb1ac46c172bf4a"
     }
     Frame {
         msec: 6384
-        hash: "93664c87c8dcfadc0345f646b2508625"
+        hash: "09b76db3e4a95666ba9c37dd89996fa3"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.0.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.0.png
new file mode 100644
index 0000000..75a6c49
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.qml b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.qml
index 5d88df7..3365d40 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "1a396cf01a6c31155609532654653599"
+        image: "usingRepeater.0.png"
     }
     Frame {
         msec: 32
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.0.png b/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.0.png
index bf02e1a..a104312 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.qml b/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.qml
index 3124973..fd262e0 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "2c6600b50a18c415032fa95fe5089da6"
+        image: "smoothedfollow.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "smoothedfollow.0.png"
+        hash: "cecdb41f4b121dcb9ea8eedacdc4653b"
     }
     Frame {
         msec: 976
@@ -482,7 +482,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "smoothedfollow.1.png"
+        hash: "6b810b1a3a9090ea11456a0bdf170c8a"
     }
     Frame {
         msec: 1936
@@ -722,7 +722,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "smoothedfollow.2.png"
+        hash: "d97e6dd2b3c79fe0b306981c08b6cea4"
     }
     Frame {
         msec: 2896
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.0.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.0.png
index f159b6b..a3bb3ac 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.qml b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.qml
index a3cd66b..6f0c939 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "cb33c89e5108c85e43b53489d1255862"
+        image: "clock.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "clock.0.png"
+        hash: "2ff4e8f394a62892adb348271435205c"
     }
     Frame {
         msec: 976
@@ -482,7 +482,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "clock.1.png"
+        hash: "a3e6173e6d82d2cb52149588b32851e4"
     }
     Frame {
         msec: 1936
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.0.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.0.png
index c79ac9c..ae89849 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml
index a688563..12d7897 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "e94ba580322887dbbbf9cb6309e39c23"
+        image: "follow.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "follow.0.png"
+        hash: "00586f2f1d49fa81f90f7b06614311b4"
     }
     Frame {
         msec: 976
@@ -490,7 +490,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "follow.1.png"
+        hash: "a40e5e2744d1d84c8b9a45525801a745"
     }
     Frame {
         msec: 1936
@@ -730,7 +730,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "follow.2.png"
+        hash: "3c5d3d10bacc093afc6a9c0b5aa4cddc"
     }
     Frame {
         msec: 2896
@@ -978,7 +978,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "follow.3.png"
+        hash: "6686f9c1a814c6a6b785b70f94937b68"
     }
     Frame {
         msec: 3856
@@ -1218,7 +1218,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "follow.4.png"
+        hash: "315764d20b647f6ab1ba30239a69bf72"
     }
     Frame {
         msec: 4816
@@ -1458,7 +1458,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "follow.5.png"
+        hash: "b7133225daa03563d3f5b1dac5f56a23"
     }
     Frame {
         msec: 5776
@@ -1698,7 +1698,7 @@ VisualTest {
     }
     Frame {
         msec: 6720
-        image: "follow.6.png"
+        hash: "228920e994ebf71d542c71ce8263614e"
     }
     Frame {
         msec: 6736
@@ -1731,7 +1731,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.0.png
index e6b2b3c..9b76db0 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.qml
index 1b43aa3..1059209 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "1ec47db85ba34bf1900445a2ab87b5e3"
+        image: "multilineAlign.0.png"
     }
     Frame {
         msec: 32
@@ -242,6 +242,6 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "multilineAlign.0.png"
+        hash: "436000b48f688120d96919227d9e67b4"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.0.png
new file mode 100644
index 0000000..b2ac22f
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.qml
index c526f47..22c4b93 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "e38b59f2c271def037213e57a966bd95"
+        image: "parentanchor.0.png"
     }
     Frame {
         msec: 32
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-X11/QTBUG-14469.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-X11/QTBUG-14469.0.png
index b8cc1c7..ee3c744 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-X11/QTBUG-14469.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-X11/QTBUG-14469.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-X11/QTBUG-14469.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-X11/QTBUG-14469.qml
index 6201c72..01ec5d6 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-X11/QTBUG-14469.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-X11/QTBUG-14469.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "fab978e1e0ee5140d8131320ff2322e9"
+        image: "QTBUG-14469.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "QTBUG-14469.0.png"
+        hash: "b1a283365bbffbc0ddaa4aa661e52add"
     }
     Frame {
         msec: 976
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml
index a470a66..5c1f112 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
+        image: "qtbug_14865.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "qtbug_14865.0.png"
+        hash: "fd4d35de0a95388dd92ffbb82fbe0e8a"
     }
     Frame {
         msec: 976
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml
index fcaeed5..949f077 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "bdf278826a033dbb744d1fa9492c9351"
+        image: "elide.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "elide.0.png"
+        hash: "bdf278826a033dbb744d1fa9492c9351"
     }
     Frame {
         msec: 976
@@ -251,7 +251,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.0.png
index 03b6e5d..51d009f 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.qml
index 1c1d5eb..7d2ee3d 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "26a468619443250a160845a894643eb9"
+        image: "elide2.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "elide2.0.png"
+        hash: "186db3738dc443d66b5b0352d7753b26"
     }
     Frame {
         msec: 976
@@ -443,7 +443,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 0
+        modifiers: 67108864
         text: ""
         autorep: false
         count: 1
@@ -490,7 +490,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "elide2.1.png"
+        hash: "03123bcb0f4ff032257415f713a5873c"
     }
     Frame {
         msec: 1936
@@ -730,7 +730,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "elide2.2.png"
+        hash: "905d42c34198abdc68a3c6f69bfbd293"
     }
     Frame {
         msec: 2896
@@ -970,7 +970,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "elide2.3.png"
+        hash: "6e800f4aacf0096f34acdf13678cab25"
     }
     Frame {
         msec: 3856
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.0.png
index 7980f23..33f7eb0 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml
index 3871f91..ae009f7 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "51e3a7214bf2fd98108de683ae650b05"
+        image: "multilength.0.png"
     }
     Frame {
         msec: 32
@@ -242,7 +242,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "multilength.0.png"
+        hash: "7ee899df8915bc0c523e0bb01fc210ca"
     }
     Frame {
         msec: 976
@@ -482,7 +482,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "multilength.1.png"
+        hash: "a631a4ba1e9638943719dcc2ea5cdb3c"
     }
     Frame {
         msec: 1936
@@ -722,7 +722,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "multilength.2.png"
+        hash: "72cc0f0bd55773611952347b2b177d2c"
     }
     Frame {
         msec: 2896
@@ -962,7 +962,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "multilength.3.png"
+        hash: "4f2bd407ac54541506ec10edb4dbec58"
     }
     Frame {
         msec: 3856
@@ -1202,7 +1202,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "multilength.4.png"
+        hash: "ea23a6ba2406a5cd0cb8a8a7477bdf94"
     }
     Frame {
         msec: 4816
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.0.png
index b24344c..8803b36 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.qml
index 0407aaf..a0803a4 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "6e8324bf913d9df21a59ab4337257c15"
+        image: "cursorDelegate.0.png"
     }
     Frame {
         msec: 32
@@ -290,7 +290,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "cursorDelegate.0.png"
+        hash: "d23d7492b85e4f30994ecd64e8273ff6"
     }
     Frame {
         msec: 976
@@ -578,7 +578,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "cursorDelegate.1.png"
+        hash: "a5f90da82b51bc866648304a20a1dcd3"
     }
     Frame {
         msec: 1936
@@ -850,7 +850,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "cursorDelegate.2.png"
+        hash: "1bb236db749ef514c00d0a3dd698d24f"
     }
     Frame {
         msec: 2896
@@ -1122,7 +1122,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "cursorDelegate.3.png"
+        hash: "2d1b406be294727a278ba6bbc97be62a"
     }
     Key {
         type: 7
@@ -1378,7 +1378,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "cursorDelegate.4.png"
+        hash: "4f0d49aff27a1c83287d38e760c10f16"
     }
     Frame {
         msec: 4816
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.0.png
index 7c68d9c..95f0c98 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.1.png
index 96afa8d..409192c 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.2.png
index 58b168d..cd2f112 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.2.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.3.png
index 95f0c98..7191c1e 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.3.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.qml
index 7b00cdd..f9d728e 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "8d8671fb6c3413f38308a0dd15026eae"
+        image: "qt-669.0.png"
     }
     Frame {
         msec: 32
@@ -314,7 +314,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "qt-669.0.png"
+        hash: "0c7162e2bf228c76c7b9247e7ee1cf63"
     }
     Frame {
         msec: 976
@@ -634,7 +634,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "qt-669.1.png"
+        hash: "2dc196a65cb13214901e0189c2b1984b"
     }
     Frame {
         msec: 1936
@@ -970,7 +970,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "qt-669.2.png"
+        hash: "b6f3847d394c87873e34814e332e205a"
     }
     Frame {
         msec: 2896
@@ -1250,7 +1250,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "qt-669.3.png"
+        hash: "8d8671fb6c3413f38308a0dd15026eae"
     }
     Frame {
         msec: 3856
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.0.png
index e69860e..0d989de 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.10.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.10.png
index ae21dca..9c72d52 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.10.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.10.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.11.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.11.png
index ae21dca..9c72d52 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.11.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.11.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.8.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.8.png
index 5f329b6..d49c2ff 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.8.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.8.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.9.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.9.png
index ae21dca..9c72d52 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.9.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.9.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.qml
index 5a1f8de..91489b9 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "a4edfba57a47b45f96fe1fa7a37c1720"
+        image: "usingMultilineEdit.0.png"
     }
     Frame {
         msec: 32
@@ -274,7 +274,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "usingMultilineEdit.0.png"
+        hash: "bf9ad629e190df34f8bbb242e986083f"
     }
     Frame {
         msec: 976
@@ -618,7 +618,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "usingMultilineEdit.1.png"
+        hash: "1d5b3f8dc6e0701c0c11a330e055ba5d"
     }
     Frame {
         msec: 1936
@@ -1010,7 +1010,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "usingMultilineEdit.2.png"
+        hash: "3646bd6ea35fb8f0160a24a203b0f469"
     }
     Frame {
         msec: 2896
@@ -1426,7 +1426,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "usingMultilineEdit.3.png"
+        hash: "00972f42fed66eb94832506b436b203d"
     }
     Frame {
         msec: 3856
@@ -1770,7 +1770,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "usingMultilineEdit.4.png"
+        hash: "67facce41bc51af385bd8102a7e1285e"
     }
     Frame {
         msec: 4816
@@ -2034,7 +2034,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "usingMultilineEdit.5.png"
+        hash: "a616e994d83964ff75d95b702f355937"
     }
     Mouse {
         type: 2
@@ -2994,7 +2994,7 @@ VisualTest {
     }
     Frame {
         msec: 6720
-        image: "usingMultilineEdit.6.png"
+        hash: "bc4cd74678c08403bb16b74630d0fd18"
     }
     Mouse {
         type: 5
@@ -3434,7 +3434,7 @@ VisualTest {
     }
     Frame {
         msec: 7680
-        image: "usingMultilineEdit.7.png"
+        hash: "f8d7e167379a5109b1744727b3bb5050"
     }
     Frame {
         msec: 7696
@@ -3810,7 +3810,7 @@ VisualTest {
     }
     Frame {
         msec: 8640
-        image: "usingMultilineEdit.8.png"
+        hash: "b5c199f82cea188d2aafa4fa09f444fc"
     }
     Frame {
         msec: 8656
@@ -4130,7 +4130,7 @@ VisualTest {
     }
     Frame {
         msec: 9600
-        image: "usingMultilineEdit.9.png"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 9616
@@ -4410,7 +4410,7 @@ VisualTest {
     }
     Frame {
         msec: 10560
-        image: "usingMultilineEdit.10.png"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 10576
@@ -4658,7 +4658,7 @@ VisualTest {
     }
     Frame {
         msec: 11520
-        image: "usingMultilineEdit.11.png"
+        hash: "a6c8b66b0d3f1124a6a316209a1456ff"
     }
     Frame {
         msec: 11536
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.0.png
index 4f51246..daa0479 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.1.png
index a27067f..ec65f49 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.2.png
index e33a8b0..ec65f49 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.2.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.3.png
index fb35f56..ec65f49 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.3.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.4.png
index 9eab398..ec65f49 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.4.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.5.png
index 66edb6b..ec65f49 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.5.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.5.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.6.png
index 66edb6b..ec65f49 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.6.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.6.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml
index 475aee1..0bf29ab 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "d9acaa85ca366aac5a63f59b8913039a"
+        image: "wrap.0.png"
     }
     Key {
         type: 6
@@ -418,7 +418,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "wrap.0.png"
+        hash: "3e21db7face603e4a41010e10fdc35eb"
     }
     Frame {
         msec: 976
@@ -810,7 +810,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "wrap.1.png"
+        hash: "e5100e36d546b8af34bfc7a68317fa74"
     }
     Frame {
         msec: 1936
@@ -1186,7 +1186,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "wrap.2.png"
+        hash: "8ea955780d76128c025cf1a51c995075"
     }
     Frame {
         msec: 2896
@@ -1546,7 +1546,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "wrap.3.png"
+        hash: "63d557c9ea24a9e63d6bdfc6259c8bf9"
     }
     Frame {
         msec: 3856
@@ -1922,7 +1922,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "wrap.4.png"
+        hash: "6ae6a9c38541546561db9049a300bce6"
     }
     Frame {
         msec: 4816
@@ -2186,7 +2186,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "wrap.5.png"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 5776
@@ -2426,7 +2426,7 @@ VisualTest {
     }
     Frame {
         msec: 6720
-        image: "wrap.6.png"
+        hash: "41179a181fd4ae8bd15a259b66d90eea"
     }
     Frame {
         msec: 6736
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.0.png
index 5ab78c0..4f24b27 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.qml
index 6eb74ea..b9e40a1 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "65bbc5da769f475d1c47bdedb92ba65e"
+        image: "cursorDelegate.0.png"
     }
     Frame {
         msec: 32
@@ -306,7 +306,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "cursorDelegate.0.png"
+        hash: "a764060e409f44b5a2196e405f0e00e0"
     }
     Frame {
         msec: 976
@@ -642,7 +642,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "cursorDelegate.1.png"
+        hash: "627206a252bd6fcbf57d9f1cde0506bb"
     }
     Frame {
         msec: 1936
@@ -978,7 +978,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "cursorDelegate.2.png"
+        hash: "87968f62496d88d8ed800d76a2d41c25"
     }
     Frame {
         msec: 2896
@@ -1266,7 +1266,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "cursorDelegate.3.png"
+        hash: "4a080a5154c517e6bcf24b3a1f1d7f2c"
     }
     Frame {
         msec: 3856
@@ -1506,7 +1506,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "cursorDelegate.4.png"
+        hash: "7797530c0cec492d09390e8f5b6410e6"
     }
     Frame {
         msec: 4816
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.png
index 551a3de..a6593c9 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml
index c8f1f27..7d2f45e 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "eff6a4491bc00e5570ea73a1371f63fc"
+        image: "echoMode.0.png"
     }
     Frame {
         msec: 32
@@ -306,7 +306,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "echoMode.0.png"
+        hash: "b3504e4dbb653a7c039dcf8ab0351055"
     }
     Frame {
         msec: 976
@@ -650,7 +650,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "echoMode.1.png"
+        hash: "deab81e7fcc4ecc31d02fccc52a4cc17"
     }
     Key {
         type: 7
@@ -994,7 +994,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "echoMode.2.png"
+        hash: "34d00f787b814ad82c025c77d6be51a2"
     }
     Frame {
         msec: 2896
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.0.png
new file mode 100644
index 0000000..654a26d
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.qml
index 32330f4..c523060 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "09298802dfc053e2bb1b3bb2192ca5b2"
+        image: "hAlign.0.png"
     }
     Frame {
         msec: 32
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.0.png
index 313fcc2..e75900a 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.qml
index f014a30..3c7eb2c 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.qml
@@ -6,7 +6,7 @@ VisualTest {
     }
     Frame {
         msec: 16
-        hash: "9d5b9f785409527b8f315fef560a4688"
+        image: "usingLineEdit.0.png"
     }
     Frame {
         msec: 32
@@ -258,7 +258,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        image: "usingLineEdit.0.png"
+        hash: "ebd6e6bbd0edaffed688dd5fa2328393"
     }
     Mouse {
         type: 4
@@ -379,7 +379,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 0
+        modifiers: 67108864
         text: ""
         autorep: false
         count: 1
@@ -522,7 +522,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        image: "usingLineEdit.1.png"
+        hash: "957c85bfa6586d5d92aa3689c178944f"
     }
     Frame {
         msec: 1936
@@ -583,7 +583,7 @@ VisualTest {
     Key {
         type: 7
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
@@ -783,7 +783,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 0
+        modifiers: 67108864
         text: ""
         autorep: false
         count: 1
@@ -810,7 +810,7 @@ VisualTest {
     }
     Frame {
         msec: 2880
-        image: "usingLineEdit.2.png"
+        hash: "ebd6e6bbd0edaffed688dd5fa2328393"
     }
     Frame {
         msec: 2896
@@ -1082,7 +1082,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        image: "usingLineEdit.3.png"
+        hash: "3e9cbf56be37f593e907759285ddebdb"
     }
     Frame {
         msec: 3856
@@ -1175,7 +1175,7 @@ VisualTest {
     Key {
         type: 7
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
@@ -1338,7 +1338,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        image: "usingLineEdit.4.png"
+        hash: "39ce4d31df138a329a21056b8d397fd7"
     }
     Mouse {
         type: 3
@@ -1674,7 +1674,7 @@ VisualTest {
     }
     Frame {
         msec: 5760
-        image: "usingLineEdit.5.png"
+        hash: "48bb05f44207f641b573d43043882aa2"
     }
     Frame {
         msec: 5776
@@ -1823,7 +1823,7 @@ VisualTest {
     Key {
         type: 6
         key: 16777249
-        modifiers: 0
+        modifiers: 67108864
         text: ""
         autorep: false
         count: 1
@@ -2058,7 +2058,7 @@ VisualTest {
     }
     Frame {
         msec: 6720
-        image: "usingLineEdit.6.png"
+        hash: "ecfa95feb59486098b758894cba272c8"
     }
     Frame {
         msec: 6736
@@ -2327,7 +2327,7 @@ VisualTest {
     Key {
         type: 7
         key: 16777249
-        modifiers: 67108864
+        modifiers: 0
         text: ""
         autorep: false
         count: 1
@@ -2370,7 +2370,7 @@ VisualTest {
     }
     Frame {
         msec: 7680
-        image: "usingLineEdit.7.png"
+        hash: "28b1455bb7b150afb4bec88f3328a1f6"
     }
     Frame {
         msec: 7696
@@ -2682,7 +2682,7 @@ VisualTest {
     }
     Frame {
         msec: 8640
-        image: "usingLineEdit.8.png"
+        hash: "b7f624c97fc369c66314ecbb86549686"
     }
     Mouse {
         type: 5
@@ -3626,7 +3626,7 @@ VisualTest {
     }
     Frame {
         msec: 9600
-        image: "usingLineEdit.9.png"
+        hash: "0b4b632291769b48d942f5aea91a8ae5"
     }
     Mouse {
         type: 5
@@ -4154,7 +4154,7 @@ VisualTest {
     }
     Frame {
         msec: 10560
-        image: "usingLineEdit.10.png"
+        hash: "020ac5797abe98f97c4839afc67aac18"
     }
     Frame {
         msec: 10576
-- 
cgit v0.12


From 22c71ed42529277caa4dc8db03efd975b3910546 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@nokia.com>
Date: Mon, 15 Nov 2010 12:59:41 +0100
Subject: compile with quintptr instead of intptr_t

---
 .../declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
index 3dd69da..652404c 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
+++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
@@ -1566,7 +1566,7 @@ void tst_qdeclarativeecmascript::callQtInvokables()
 
     o.reset();
     {
-    QString expected = "MyInvokableObject(0x" + QString::number((intptr_t)&o, 16) + ")";
+    QString expected = "MyInvokableObject(0x" + QString::number((quintptr)&o, 16) + ")";
     QCOMPARE(engine->evaluate("object.method_QString(object)").isUndefined(), true);
     QCOMPARE(o.error(), false);
     QCOMPARE(o.invoked(), 11);
-- 
cgit v0.12


From 149cfee3fea478640384559e69209a16bfda44a9 Mon Sep 17 00:00:00 2001
From: Dominik Holland <dominik.holland@nokia.com>
Date: Mon, 15 Nov 2010 13:08:03 +0100
Subject: Fixed QGesture autotest for QGesture lazy deletion.

Reviewed By: Trust Me
---
 tests/auto/gestures/tst_gestures.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/tests/auto/gestures/tst_gestures.cpp b/tests/auto/gestures/tst_gestures.cpp
index 667cdd3..ee19125 100644
--- a/tests/auto/gestures/tst_gestures.cpp
+++ b/tests/auto/gestures/tst_gestures.cpp
@@ -1486,13 +1486,15 @@ void tst_Gestures::ungrabGesture() // a method on QWidget
     QVERIFY(customGestureA.data() != customGestureB.data());
 
     a->ungrabGesture(CustomGesture::GestureType);
-    QVERIFY(customGestureA.isNull());
+    //We changed the deletion of Gestures to lazy during QT-4022, so we can't ensure the QGesture is deleted until now
     QVERIFY(!customGestureB.isNull());
 
     a->gestures.clear();
     a->reset();
     // send again to 'b' and make sure a never gets it.
     sendCustomGesture(&event, b);
+    //After all Gestures are processed in the QGestureManager, we can ensure the QGesture is now deleted
+    QVERIFY(customGestureA.isNull());
     QCOMPARE(a->gestureEventsReceived, 0);
     QCOMPARE(a->gestureOverrideEventsReceived, 0);
 }
-- 
cgit v0.12


From 32f8c01196f6ebc2bd18ee9f66929bdba61fea20 Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
Date: Tue, 2 Nov 2010 09:22:37 +0100
Subject: doc: Fix documentation of QTextEdit::setDocument

QTextEdit::setDocument() has failed to delete its current document
since June 2006 despite its claims of the otherwise. Since most Qt
versions now exhibit this behavior, the only safe way to fix the problem
is to change the documentation to reflect what actually happens.

Task-number: QTBUG-14049
Reviewed-by: Lars
---
 src/gui/widgets/qtextedit.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gui/widgets/qtextedit.cpp b/src/gui/widgets/qtextedit.cpp
index 4541730..6b3f444 100644
--- a/src/gui/widgets/qtextedit.cpp
+++ b/src/gui/widgets/qtextedit.cpp
@@ -773,7 +773,7 @@ Qt::Alignment QTextEdit::alignment() const
     is the document's parent object. The parent object of the provided document
     remains the owner of the object.
 
-    If the current document is a child of the text editor, then it is deleted.
+    The editor does not delete the current document, even if it is a child of the editor.
 
     \sa document()
 */
-- 
cgit v0.12


From 96b1ea7088f8d541bc4c5fbc87baaf56b0b2fd43 Mon Sep 17 00:00:00 2001
From: Morten Engvoldsen <morten.engvoldsen@nokia.com>
Date: Mon, 15 Nov 2010 18:34:38 +0100
Subject: Doc: Correcting references to Qt Declarative module.

---
 doc/src/declarative/declarativeui.qdoc         |  8 ++++----
 doc/src/declarative/elements.qdoc              |  2 +-
 doc/src/declarative/extending-tutorial.qdoc    |  4 ++--
 doc/src/declarative/qtbinding.qdoc             | 12 ++++++------
 doc/src/declarative/qtdeclarative.qdoc         |  2 +-
 doc/src/getting-started/gettingstartedqml.qdoc |  2 +-
 doc/src/qt4-intro.qdoc                         |  2 +-
 7 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/doc/src/declarative/declarativeui.qdoc b/doc/src/declarative/declarativeui.qdoc
index 28a8a70..eb469d6 100644
--- a/doc/src/declarative/declarativeui.qdoc
+++ b/doc/src/declarative/declarativeui.qdoc
@@ -45,7 +45,7 @@ language for describing user interfaces and a language runtime. A collection
 of C++ APIs is used to integrate these high level features with classic
 Qt applications.
 
-\section2 QML, Elements and the QtDeclarative Module
+\section2 QML, Elements and the Qt Declarative Module
 
 User interfaces and their behavior are described using QML, an extension to
 \l{About JavaScript}{JavaScript} that lets developers and designers
@@ -60,14 +60,14 @@ QObject-based type system, adds support for automatic
 \l{Property Binding}{property bindings} and provides
 \l{Network Transparency}{network transparency} at the language level.
 
-The QtDeclarative module implements the interface between the QML language
+The Qt Declarative module implements the interface between the QML language
 and the elements available to it. It also provides a C++ API that can be
 used to load and interact with QML files from within Qt applications.
 
 Qt Quick builds on \l{QML for Qt programmers}{Qt's existing strengths}.
 QML can be be used to incrementally extend an existing application or
 to build completely new applications.  QML is fully
-\l{Extending QML in C++}{extensible from C++} through the QtDeclarative
+\l{Extending QML in C++}{extensible from C++} through the Qt Declarative
 Module.
 
 \section1 Getting Started
@@ -139,7 +139,7 @@ Module.
 \o \l{QML Global Object}
 \o \l{QML Internationalization}
 \o \l{QML Security}
-\o \l{QtDeclarative Module}
+\o \l{Qt Declarative Module}
 \o \l{Debugging QML}
 \o \l{QML Viewer}
 \o \l{QML Performance}
diff --git a/doc/src/declarative/elements.qdoc b/doc/src/declarative/elements.qdoc
index 54f07a2..eaa6a82 100644
--- a/doc/src/declarative/elements.qdoc
+++ b/doc/src/declarative/elements.qdoc
@@ -32,7 +32,7 @@
   \brief A dictionary of standard QML elements.
 
   This is a dictionary of all standard QML elements made available
-  in the QtDeclarative module.
+  in the Qt Declarative module.
 
   To see the QML elements listed by functional area, see the
   \l{Groups Of Related QML Elements} page.
diff --git a/doc/src/declarative/extending-tutorial.qdoc b/doc/src/declarative/extending-tutorial.qdoc
index 2bfe62e..dff1d9c 100644
--- a/doc/src/declarative/extending-tutorial.qdoc
+++ b/doc/src/declarative/extending-tutorial.qdoc
@@ -29,7 +29,7 @@
 \page qml-extending-tutorial-index.html
 \title Tutorial: Writing QML extensions with C++
 
-The QtDeclarative module provides a set of APIs for extending QML through
+The Qt Declarative module provides a set of APIs for extending QML through
 C++ extensions. You can write extensions to add your own QML types, extend existing
 Qt types, or call C/C++ functions that are not accessible from ordinary QML code.
 
@@ -65,7 +65,7 @@ For example, this could be done to implement particular data models, or provide
 elements with custom painting and drawing capabilities, or access system features
 like network programming that are not accessible through built-in QML features.
 
-In this tutorial, we will show how to use the C++ classes in the QtDeclarative
+In this tutorial, we will show how to use the C++ classes in the Qt Declarative
 module to extend QML. The end result will be a simple Pie Chart display implemented by
 several custom QML types connected together through QML features like bindings and 
 signals, and made available to the QML runtime through a plugin.
diff --git a/doc/src/declarative/qtbinding.qdoc b/doc/src/declarative/qtbinding.qdoc
index 8a969eb..cd50503 100644
--- a/doc/src/declarative/qtbinding.qdoc
+++ b/doc/src/declarative/qtbinding.qdoc
@@ -31,7 +31,7 @@
 \title Using QML in C++ Applications
 
 QML is designed to be easily extensible from C++. The classes in the
-QtDeclarative module allow QML components to be loaded and manipulated from C++, and through
+Qt Declarative module allow QML components to be loaded and manipulated from C++, and through
 Qt's \l{The Meta-Object System}{meta-object system}, QML and C++ objects can easily
 communicate through Qt signals and slots. In addition, QML plugins can be written to create
 reusable QML components for distribution.
@@ -41,20 +41,20 @@ You may want to mix QML and C++ for a number of reasons. For example:
 \list
 \o To use functionality defined in a C++ source (for example, when using a C++ Qt-based data model, or
 calling functions in a third-party C++ library)
-\o To access functionality in the QtDeclarative module (for example, to dynamically generate
+\o To access functionality in the Qt Declarative module (for example, to dynamically generate
 images using QDeclarativeImageProvider)
 \o To write your own QML elements (whether for your applications, or for distribution to others)
 \endlist
 
-To use the QtDeclarative module, you must include and link to the module appropriately, as shown on
+To use the Qt Declarative module, you must include and link to the module appropriately, as shown on
 the \l {QtDeclarative}{module index page}. The \l {Qt Declarative UI Runtime} documentation
 shows how to build a basic C++ application that uses this module.
 
 
 \section1 Core module classes
 
-The QtDeclarative module provides a set of C++ APIs for extending your QML applications from C++ and
-embedding QML into C++ applications. There are several core classes in the QtDeclarative module
+The Qt Declarative module provides a set of C++ APIs for extending your QML applications from C++ and
+embedding QML into C++ applications. There are several core classes in the Qt Declarative module
 that provide the essential capabilities for doing this. These are:
 
 \list
@@ -520,7 +520,7 @@ a QColor-type property or to call a C++ function that requires a QColor paramete
 
 \section1 Writing QML plugins
 
-The QtDeclarative module includes the QDeclarativeExtensionPlugin class, which is an abstract
+The Qt Declarative module includes the QDeclarativeExtensionPlugin class, which is an abstract
 class for writing QML plugins. This allows QML extension types to be dynamically loaded into
 QML applications.
 
diff --git a/doc/src/declarative/qtdeclarative.qdoc b/doc/src/declarative/qtdeclarative.qdoc
index 7ecdc53..f2b2032 100644
--- a/doc/src/declarative/qtdeclarative.qdoc
+++ b/doc/src/declarative/qtdeclarative.qdoc
@@ -27,7 +27,7 @@
 
 /*!
   \module QtDeclarative
-  \title QtDeclarative Module
+  \title Qt Declarative Module
   \ingroup modules
 
   \brief The Qt Declarative module provides a declarative framework
diff --git a/doc/src/getting-started/gettingstartedqml.qdoc b/doc/src/getting-started/gettingstartedqml.qdoc
index 54fa098..b767587 100644
--- a/doc/src/getting-started/gettingstartedqml.qdoc
+++ b/doc/src/getting-started/gettingstartedqml.qdoc
@@ -42,7 +42,7 @@
     installation instructions and requirements for different platforms.
 
     Qt Quick includes a declarative language called
-    \l{Introduction to the QML language}{QML}, the \l{QtDeclarative Module}, and
+    \l{Introduction to the QML language}{QML}, the \l{Qt Declarative Module}, and
     \l{QML Viewer}.
 
     \section1 QML to Build User Interfaces
diff --git a/doc/src/qt4-intro.qdoc b/doc/src/qt4-intro.qdoc
index 2384051..62decbb 100644
--- a/doc/src/qt4-intro.qdoc
+++ b/doc/src/qt4-intro.qdoc
@@ -466,7 +466,7 @@
     collaborate tightly and create animated and fluid user experiences,
     using existing knowledge in script language and design.
 
-    \i QtDeclarative is a C++ library that provides the underlying engine,
+    \i Qt Declarative is a C++ library that provides the underlying engine,
     which translates the declarative description of the UI in QML into
     items on a QGraphicsScene. The library also provides APIs to bind
     custom C++ types and elements to QML, and to connect the QML UI with
-- 
cgit v0.12


From 013fe9236fbc54eb40a19461cfa65d5fb8334f06 Mon Sep 17 00:00:00 2001
From: Morten Engvoldsen <morten.engvoldsen@nokia.com>
Date: Mon, 15 Nov 2010 18:41:15 +0100
Subject: Doc: correcting heading - Beginning Qt Quick - into - Intro to Qt
 Quick

---
 doc/src/declarative/declarativeui.qdoc |   2 +-
 doc/src/declarative/qml-intro.qdoc     |   2 +-
 doc/src/declarative/qmlinuse.qdoc      | 499 +++++++++++++++++++++++++++++++++
 3 files changed, 501 insertions(+), 2 deletions(-)
 create mode 100644 doc/src/declarative/qmlinuse.qdoc

diff --git a/doc/src/declarative/declarativeui.qdoc b/doc/src/declarative/declarativeui.qdoc
index eb469d6..01e1302 100644
--- a/doc/src/declarative/declarativeui.qdoc
+++ b/doc/src/declarative/declarativeui.qdoc
@@ -77,7 +77,7 @@ Module.
 \o \l{Introduction to the QML language}
 \o \l{QML for Qt Programmers}
 \o \l{Getting Started Programming with QML}
-\o \l{Beginning Qt Quick}
+\o \l{Intro to Qt Quick}
 \endlist
 
 \list
diff --git a/doc/src/declarative/qml-intro.qdoc b/doc/src/declarative/qml-intro.qdoc
index f891e01..e02ce8f 100644
--- a/doc/src/declarative/qml-intro.qdoc
+++ b/doc/src/declarative/qml-intro.qdoc
@@ -29,7 +29,7 @@
 
 /*!
 \page qml-intro.html
-\title Beginning Qt Quick
+\title Intro to Qt Quick
 
 \section1 Overview
 
diff --git a/doc/src/declarative/qmlinuse.qdoc b/doc/src/declarative/qmlinuse.qdoc
new file mode 100644
index 0000000..90ce02c
--- /dev/null
+++ b/doc/src/declarative/qmlinuse.qdoc
@@ -0,0 +1,499 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** Commercial Usage
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in a
+** written agreement between you and Nokia.
+**
+** GNU Free Documentation License
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of this
+** file.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+\page qmlinuse.html
+\title Using QML elements
+
+\raw HTML
+          <div class="item group">
+            <div class="secondaryx">
+              <div class="toc">
+                <h3>
+                  <a name="toc">QML Elements</a></h3>
+                <ul>
+                  <li class="level1"><a href="#basicElements">Basic QML Elements</a></li>
+                  <li class="level1"><a href="#visualElements">QML Visual Elements</a></li>
+                  <li class="level1"><a href="#AnimAndTrans">QML Animation and Transition Elements</a></li>
+                  <li class="level1"><a href="#interactElement">Basic QML Interaction Elements</a></li>
+                  <li class="level1"><a href="#eventElements">QML Event Elements</a></li>
+                  <li class="level1"><a href="#Position">QML Positioning Elements</a></li>
+                  <li class="level1"><a href="#stateElement">QML State Elements</a></li>
+                  <li class="level1"><a href="#transformElement">QML Transform Elements</a></li>
+                  <li class="level1"><a href="#utilityElement">QML Utility Elements</a></li>
+                  <li class="level1"><a href="#modelView">Models and View Elements</a></li>
+                  <li class="level1"><a href="#paths">Paths</a></li>
+                  <li class="level1"><a href="#ParticleElement">Particle Elements</a></li>
+                  <li class="level1"><a href="#bridge">Bridge Elements</a></li>
+                </ul>
+              </div>
+            </div>
+            <div class="primary">
+              <h1>
+                Groups Of Related QML Elements</h1>
+              <p>
+                QML Elements are grouped by their respective functionalities. Certain elements are
+                suited for building complex components while other elements strictly dictate appearances
+                and color.</p>
+              <div class="cols two group unclear">
+                <div class="col first">
+                  <p>
+                    <i>add something about elements in use in general</i></p>
+                </div>
+                <div class="col">
+                  <img src="images/quick_screens.png" />
+                </div>
+              </div>
+            </div>
+          </div>
+          <!-- tech domains start -->
+          <div class="item group">
+            <hr>
+            <div class="secondary">
+              <div class="box">
+                <!-- video box -->
+                <h3>
+                  image heading</h3>
+                <img src="" />
+                <p>
+                  img descr.</p>
+              </div>
+              <!-- video box end -->
+            </div>
+            <div class="primary">
+              <h2><a name="basicElements"> Basic QML Elements</a></h2>
+              <p>
+                Basic elements can be extended to form more complex elements.</p>
+              <b>Elements:</b>
+              <ul>
+                <li><a href="qml-item.html">Item Element</a>
+                  - The Item is the most basic of all visual items in QML. Many visual elements inherit
+                  properties from the Item element.</li>
+                <li><a href="qml-component.html">Component Element</a>
+                  - The Component element encapsulates a QML component definition.</li>
+              </ul>
+            </div>
+          </div>
+          <!-- next -->
+          <div class="item group">
+            <hr>
+            <div class="secondary">
+              <div class="box">
+                <!-- video box -->
+                <h3>
+                  image heading</h3>
+                <img src="" />
+                <p>
+                  img descr.</p>
+              </div>
+              <!-- video box end -->
+            </div>
+            <div class="primary">
+              <h2><a name="visualElements">QML Visual Elements</a></h2>
+              <p>
+                Visual elements offer various interactive and graphical functionalities. Visual
+                elements can directly set properties that dictate appearances.</p>
+              <b>Elements:</b>
+              <ul>
+                <li><a href="qml-borderimage.html">BorderImage
+                  Element</a> - The BorderImage element provides an image that can be used as a border.</li>
+                <li><a href="qml-gradient.html">Gradient Element</a>
+                  - The Gradient item defines a gradient fill.</li>
+                <li><a href="qml-gradientstop.html">GradientStop
+                  Element</a> - The GradientStop item defines the color at a position in a Gradient.</li>
+                <li><a href="qml-image.html">Image Element</a>
+                  - The Image element displays an image from a source.</li>
+                <li><a href="qml-rectangle.html">Rectangle Element</a>
+                  - The Rectangle item provides a filled rectangle.</li>
+                <li><a href="qml-text.html">Text Element</a>
+                  - The Text item allows the addition of formatted text to a scene.</li>
+                <li><a href="qml-textedit.html">TextEdit Element</a>
+                  - The TextEdit item displays multiple lines of editable formatted text.</li>
+                <li><a href="qml-textinput.html">TextInput Element</a>
+                  - The TextInput item displays an editable line of text.</li>
+              </ul>
+            </div>
+          </div>
+          <!-- next -->
+          <div class="item group">
+            <hr>
+            <div class="secondary">
+              <div class="box">
+                <!-- video box -->
+                <h3>
+                  image heading</h3>
+                <img src="" />
+                <p>
+                  img descr.</p>
+              </div>
+              <!-- video box end -->
+            </div>
+            <div class="primary">
+              <h2><a name="AnimAndTrans">QML Animation and Transition Elements</a></h2>
+              <p>
+                Animation and transition elements control animation behaviors. Animations can run
+                in parallel or in series for different value types.
+              </p>
+              <b>Elements:</b>
+              <ul>
+                <li><a href="qml-anchoranimation.html">AnchorAnimation Element</a> -
+                  The AnchorAnimation element animates changes in anchor values.</li>
+                <li><a href="qml-animation.html">Animation Element</a> - The Animation
+                  element is the base of all QML animations.</li>
+                <li><a href="qml-behavior.html">Behavior Element</a> - The Behavior element allows you to specify a default animation for a property change.</li>
+                <li><a href="qml-coloranimation.html">ColorAnimation Element</a> - The ColorAnimation element animates changes in color values.</li>
+                <li><a href="qml-numberanimation.html">NumberAnimation Element</a> - The NumberAnimation element animates changes in qreal-type values.</li>
+                <li><a href="qml-parallelanimation.html">ParallelAnimation Element</a> - The ParallelAnimation element allows animations to be run in parallel.</li>
+                <li><a href="qml-parentanimation.html">ParentAnimation Element</a> - The ParentAnimation element animates changes in parent values.</li>
+                <li><a href="qml-pauseanimation.html">PauseAnimation Element</a> - The PauseAnimation element provides a pause during an animation.</li>
+                <li><a href="qml-propertyaction.html">PropertyAction Element</a> - The PropertyAction element allows immediate property changes during animation.</li>
+                <li><a href="qml-propertyanimation.html">PropertyAnimation Element</a> - The PropertyAnimation element animates changes in property values.</li>
+                <li><a href="qml-rotationanimation.html">RotationAnimation Element</a> - The RotationAnimation element animates changes in rotational values.</li>
+                <li><a href="qml-scriptaction.html">ScriptAction Element</a> - The ScriptAction element allows scripts to be run during an animation.</li>
+                <li><a href="qml-sequentialanimation.html">SequentialAnimation Element</a> - The SequentialAnimation element allows animations to be run sequentially.</li>
+                <li><a href="qml-smoothedanimation.html">SmoothedAnimation Element</a> - The SmoothedAnimation element allows a property to smoothly track a value.</li>
+                <li><a href="qml-springanimation.html">SpringAnimation Element</a> - The SpringAnimation element allows a property to track a value in a spring-like
+                  motion.</li>
+                <li><a href="qml-transition.html">Transition Element</a> - The Transition element defines animated transitions that occur on state changes.</li>
+                <li><a href="qml-vector3danimation.html">Vector3dAnimation Element</a> - The Vector3dAnimation element animates changes in QVector3d values.</li>
+              </ul>
+            </div>
+          </div>
+          <!-- next -->
+          <div class="item group">
+            <hr>
+            <div class="secondary">
+              <div class="box">
+                <!-- video box -->
+                <h3>
+                  image heading</h3>
+                <img src="" />
+                <p>
+                  img descr.</p>
+              </div>
+              <!-- video box end -->
+            </div>
+            <div class="primary">
+              <h2><a name="interactElement">QML Interaction Elements</h2></a>
+              <p>
+                These elements define basic interactions such as touch movements and focus management.</p>
+              <b>Elements:</b>
+              <ul>
+                <li><a href="qml-flickable.html">Flickable Element</a> - The Flickable item provides a surface that can be "flicked".</li>
+                <li><a href="qml-flipable.html">Flipable Element</a> - The Flipable item provides a surface that can be flipped or reflected.</li>
+                <li><a href="qml-focuspanel.html">FocusPanel Element</a> - The FocusPanel item explicitly creates a focus panel.</li>
+                <li><a href="qml-focusscope.html">FocusScope Element</a> - The FocusScope object explicitly creates a focus scope for focus management.</li>
+                <li><a href="qml-gesturearea.html">GestureArea Element</a> - The GestureArea item enables simple gesture handling.</li>
+                <li><a href="qml-keynavigation.html">KeyNavigation Element</a> - The KeyNavigation attached property supports key navigation by arrow keys.</li>
+                <li><a href="qml-keys.html">Keys Element</a> - The Keys attached property provides key handling to Items.</li>
+                <li><a href="qml-mousearea.html">MouseArea Element</a> - The MouseArea item enables simple mouse handling.</li>
+              </ul>
+            </div>
+          </div>
+          <!-- next -->
+          <div class="item group">
+            <hr>
+            <div class="secondary">
+              <div class="box">
+                <!-- video box -->
+                <h3>
+                  image heading</h3>
+                <img src="" />
+                <p>
+                  img descr.</p>
+              </div>
+              <!-- video box end -->
+            </div>
+            <div class="primary">
+              <h2><a name="eventElements">QML Event Elements</a></h2>
+              <p>
+                Key and mouse events information are provided in these event elements.</p>
+              <b>Elements:</b>
+              <ul>
+                <li><a href="qml-keyevent.html">KeyEvent Element</a> - The KeyEvent
+                  object provides information about a key event.</li>
+                <li><a href="qml-mouseevent.html">MouseEvent Element</a> - The MouseEvent
+                  object provides information about a mouse event.</li>
+              </ul>
+            </div>
+          </div>
+          <!-- next -->
+          <div class="item group">
+            <hr>
+            <div class="secondary">
+              <div class="box">
+                <!-- video box -->
+                <h3>
+                  image heading</h3>
+                <img src="" />
+                <p>
+                  img descr.</p>
+              </div>
+              <!-- video box end -->
+            </div>
+            <div class="primary">
+              <h2><a name="Position">QML Positioning Elements</a></h2>
+              <p>
+                Using positioning elements, layouts can be defined and their children accessed through
+                an index.</p>
+              <b>Elements:</b>
+              <ul>
+                <li><a href="qml-column.html">Column Element</a> - The Column
+                  item arranges its children vertically.</li>
+                <li><a href="qml-flow.html">Flow Element</a> - The Flow item
+                  arranges its children side by side, wrapping as necessary.</li>
+                <li><a href="qml-grid.html">Grid Element</a> - The Grid item
+                  positions its children in a grid.</li>
+                <li><a href="qml-row.html">Row Element</a> - The Row item
+                  arranges its children horizontally.</li>
+                <li><a href="qml-repeater.html">Repeater Element</a> - The Repeater element allows you to repeat an Item-based component using a model.</li>
+              </ul>
+            </div>
+          </div>
+          <!-- next -->
+          <div class="item group">
+            <hr>
+            <div class="secondary">
+              <div class="box">
+                <!-- video box -->
+                <h3>
+                  image heading</h3>
+                <img src="" />
+                <p>
+                  img descr.</p>
+              </div>
+              <!-- video box end -->
+            </div>
+            <div class="primary">
+
+              <h2><a name="stateElement">QML State Elements</a></h2>
+              <p>
+                States and groups of states are formed using state elements.</p>
+              <b>Elements:</b>
+              <ul>
+                <li><a href="qml-anchorchanges.html">AnchorChanges Element</a> - The AnchorChanges element allows you to change the anchors of an item in a state.</li>
+                <li><a href="qml-parentchange.html">ParentChange Element</a> - The ParentChange element allows you to reparent an Item in a state change.</li>
+                <li><a href="qml-propertychanges.html">PropertyChanges Element</a> - The PropertyChanges element describes new property bindings or values for a state.</li>
+                <li><a href="qml-state.html">State Element</a> - The State
+                  element defines configurations of objects and properties.</li>
+                <li><a href="qml-statechangescript.html">StateChangeScript Element</a> - The StateChangeScript element allows you to run a script in a state.</li>
+                <li><a href="qml-stategroup.html">StateGroup Element</a> - The StateGroup element provides state support for non-Item elements.</li>
+              </ul>
+            </div>
+          </div>
+          <!-- next -->
+          <div class="item group">
+            <hr>
+            <div class="secondary">
+              <div class="box">
+                <!-- video box -->
+                <h3>
+                  image heading</h3>
+                <img src="" />
+                <p>
+                  img descr.</p>
+              </div>
+              <!-- video box end -->
+            </div>
+            <div class="primary">
+              <h2><a name="transformElement">QML Transform Elements</a></h2>
+              <p>
+                Advanced handling of transformations is controlled in transform elements.</p>
+              <b>Elements:</b>
+              <ul>
+                <li><a href="qml-rotation.html">Rotation Element</a> - The Rotation object provides a way to rotate an Item.</li>
+                <li><a href="qml-scale.html">Scale Element</a> - The Scale element provides a way to scale an Item.</li>
+                <li><a href="qml-transform.html">Transform Element</a> - The Transform element provide a way of building advanced transformations on Items.</li>
+                <li><a href="qml-translate.html">Translate Element</a> - The Translate object provides a way to move an Item without changing its x or y properties.</li>
+              </ul>
+            </div>
+          </div>
+          <!-- next -->
+          <div class="item group">
+            <hr>
+            <div class="secondary">
+              <div class="box">
+                <!-- video box -->
+                <h3>
+                  image heading</h3>
+                <img src="" />
+                <p>
+                  img descr.</p>
+              </div>
+              <!-- video box end -->
+            </div>
+            <div class="primary">
+              <h2><a name="utilityElement">QML Utility Elements</a></h2>
+              <p>
+                These elements handle assorted operations such as event timing, Qt enumerations,
+                and font loading.</p>
+              <b>Elements:</b>
+              <ul>
+                <li><a href="qml-binding.html">Binding Element</a> - The Binding element allows arbitrary property bindings to be created.</li>
+                <li><a href="qml-connections.html">Connections Element</a> - A Connections element describes generalized connections to signals.</li>
+                <li><a href="qml-doublevalidator.html">DoubleValidator Element</a> - Provides a validator for non-integer numbers.</li>
+                <li><a href="qml-fontloader.html">FontLoader Element</a> - The FontLoader element allows fonts to be loaded by name or URL.</li>
+                <li><a href="qml-intvalidator.html">IntValidator Element</a> - This element provides a validator for integer values.</li>
+                <li><a href="qml-layoutitem.html">LayoutItem Element</a> - The LayoutItem element allows declarative UI elements to be placed inside Qt's Graphics View layouts.</li>
+                <li><a href="qml-loader.html">Loader Element</a> - The Loader item allows dynamically loading an Item-based subtree from a URL or Component.</li>
+                <li><a href="qml-package.html">Package Element</a> - Package provides a bundle for shared contexts in multiple views.</li>
+                <li><a href="qml-qt.html">Qt Element</a> - The QML global Qt object provides useful enums and functions from Qt.</li>
+                <li><a href="qml-qtobject.html">QtObject Element</a> - The QtObject element is the most basic element in QML.</li>
+                <li><a href="qml-regexpvalidator.html">RegExpValidator Element</a> - This element provides a validator for regular expressions.</li>
+                <li><a href="qml-systempalette.html">SystemPalette Element</a> - The SystemPalette element provides access to the Qt palettes.</li>
+                <li><a href="qml-timer.html">Timer Element</a> - The Timer item triggers a handler at a specified interval.</li>
+                <li><a href="qml-workerscript.html">WorkerScript Element</a> - The WorkerScript element enables the use of threads in QML.</li>
+              </ul>
+            </div>
+          </div>
+          <!-- next -->
+          <div class="item group">
+            <hr>
+            <div class="secondary">
+              <div class="box">
+                <!-- video box -->
+                <h3>
+                  image heading</h3>
+                <img src="" />
+                <p>
+                  img descr.</p>
+              </div>
+              <!-- video box end -->
+            </div>
+            <div class="primary">
+              <h2><a name="modelView">Models and View Elements</a></h2>
+              <p>
+                Models and views are used to organize data and control their layouts using delegates.
+                Models dictate the data formation and views control the layouts of data in the model.</p>
+              <b>View Elements:</b>
+              <ul>
+                <li><a href="qml-gridview.html">GridView Element</a> - The GridView item provides a grid view of items provided by a model.</li>
+                <li><a href="qml-listview.html">ListView Element</a> - The ListView item provides a list view of items provided by a model.</li>
+                <li><a href="qml-pathview.html">PathView Element</a> - The PathView element lays out model-provided items on a path.</li>
+                <li><a href="qml-webview.html">WebView Element</a> - The WebView item allows you to add Web content to a canvas.</li>
+              </ul>
+              <b>Model Elements:</b>
+              <ul>
+                <li><a href="qml-folderlistmodel.html">FolderListModel Element</a> - The FolderListModel provides a model of the contents of a file system folder.</li>
+                <li><a href="qml-listelement.html">ListElement Element</a> - A ListElement defines a data item in a ListModel.</li>
+                <li><a href="qml-listmodel.html">ListModel Element</a> - The ListModel element defines a free-form list data source.</li>
+                <li><a href="qml-visualdatamodel.html">VisualDataModel Element</a> - The VisualDataModel encapsulates a model and delegate.</li>
+                <li><a href="qml-visualitemmodel.html">VisualItemModel Element</a> - The VisualItemModel allows items to be provided to a view.</li>
+                <li><a href="qml-xmllistmodel.html">XmlListModel Element</a> - The XmlListModel element is used to specify a model using XPath expressions.</li>
+                <li><a href="qml-xmlrole.html">XmlRole Element</a> - The XmlRole element allows you to specify a role for an XmlListModel.</li>
+              </ul>
+            </div>
+          </div>
+          <!-- next -->
+          <div class="item group">
+            <hr>
+            <div class="secondary">
+              <div class="box">
+                <!-- video box -->
+                <h3>
+                  image heading</h3>
+                <img src="" />
+                <p>
+                  img descr.</p>
+              </div>
+              <!-- video box end -->
+            </div>
+            <div class="primary">
+              <h2><a name="paths">Paths</a></h2>
+              <p>
+                QML components can be arranged along paths. Path elements allow control over different
+                path types.</p>
+              <b>Elements:</b>
+              <ul>
+                <li><a href="qml-path.html">Path Element</a> - A Path object defines a path for use by PathView.</li>
+                <li><a href="qml-pathattribute.html">PathAttribute Element</a> - The PathAttribute allows setting an attribute at a given position in a Path.</li>
+                <li><a href="qml-pathcubic.html">PathCubic Element</a> - The PathCubic defines a cubic Bezier curve with two control points.</li>
+                <li><a href="qml-pathelement.html">PathElement Element</a> - PathElement is the base path type.</li>
+                <li><a href="qml-pathline.html">PathLine Element</a> - The PathLine defines a straight line.</li>
+                <li><a href="qml-pathpercent.html">PathPercent Element</a> - The PathPercent manipulates the way a path is interpreted.</li>
+                <li><a href="qml-pathquad.html">PathQuad Element</a> - The PathQuad defines a quadratic Bezier curve with a control point.</li>
+              </ul>
+            </div>
+          </div>
+          <!-- next -->
+          <div class="item group">
+            <hr>
+            <div class="secondary">
+              <div class="box">
+                <!-- video box -->
+                <h3>
+                  image heading</h3>
+                <img src="" />
+                <p>
+                  img descr.</p>
+              </div>
+              <!-- video box end -->
+            </div>
+            <div class="primary">
+              <h2><a name="ParticleElement">Particle Elements</a></h2>
+              <p>
+                Particle effects are declared and controlled using particle elements.</p>
+              <b>Elements:</b>
+              <ul>
+                <li><a href="qml-particlemotiongravity.html">ParticleMotionGravity Element</a> - The ParticleMotionGravity object moves particles towards a point.</li>
+                <li><a href="qml-particlemotionlinear.html">ParticleMotionLinear Element</a> - The ParticleMotionLinear object moves particles linearly.</li>
+                <li><a href="qml-particlemotionwander.html">ParticleMotionWander Element</a> - The ParticleMotionWander object moves particles in a somewhat random fashion.</li>
+                <li><a href="qml-particles.html">Particles Element</a> - The Particles object generates and moves particles.</li>
+              </ul>
+            </div>
+          </div>
+          <!-- next -->
+          <div class="item group">
+            <hr>
+            <div class="secondary">
+              <div class="box">
+                <!-- video box -->
+                <h3>
+                  image heading</h3>
+                <img src="" />
+                <p>
+                  img descr.</p>
+              </div>
+              <!-- video box end -->
+            </div>
+            <div class="primary">
+              <h2><a name="bridge">Bridge Elements</a></h2>
+              <p>
+                Bridge elements allow direct communication between C++ and QML entities.</p>
+              <b>Elements:</b>
+              <ul>
+                <li><a href="qml-layoutitem.html">LayoutItem Element</a> - The LayoutItem element allows declarative UI elements to be placed inside Qt's Graphics View layouts.</li>
+              </ul>
+            </div>
+          </div>
+
+\endraw
+
+
+
+*/
+
-- 
cgit v0.12

