Fix anchor jitters that could occur during animation.
authorMichael Brasser <michael.brasser@nokia.com>
Fri, 10 Feb 2012 00:15:13 +0000 (10:15 +1000)
committerQt by Nokia <qt-info@nokia.com>
Mon, 13 Feb 2012 00:36:13 +0000 (01:36 +0100)
The anchors were using a different definition of center than the
actual center (9337c140cab7db1285f893b66d0e56423a74c253). With
this change center-anchored Rectangles may sometimes have fuzzy
antialiasing again.

Task-number: QTBUG-12441
Task-number: QTBUG-21730
Change-Id: Iaf61409c7c523510d0d657fe7ba96f29a8610090
Reviewed-by: Martin Jones <martin.jones@nokia.com>
src/quick/items/qquickanchors.cpp
tests/auto/qtquick2/qquickanchors/data/centerin.qml
tests/auto/qtquick2/qquickanchors/tst_qquickanchors.cpp

index 2d852f7..2df304e 100644 (file)
@@ -51,24 +51,14 @@ QT_BEGIN_NAMESPACE
 //TODO: should we cache relationships, so we don't have to check each time (parent-child or sibling)?
 //TODO: support non-parent, non-sibling (need to find lowest common ancestor)
 
-static qreal hcenter(QQuickItem *item)
+static inline qreal hcenter(QQuickItem *item)
 {
-    qreal width = item->width();
-    int iw = width;
-    if (iw % 2)
-        return (width + 1) / 2;
-    else
-        return width / 2;
+    return item->width() / 2;
 }
 
-static qreal vcenter(QQuickItem *item)
+static inline qreal vcenter(QQuickItem *item)
 {
-    qreal height = item->height();
-    int ih = height;
-    if (ih % 2)
-        return (height + 1) / 2;
-    else
-        return height / 2;
+    return item->height() / 2;
 }
 
 //### const item?
index e5f64f1..e6c9179 100644 (file)
@@ -9,4 +9,10 @@ Rectangle {
         anchors.verticalCenterOffset: 30
         anchors.horizontalCenterOffset: 10
     }
+
+    Rectangle {
+        objectName: "centered2"
+        width: 11; height: 11; color: "green"
+        anchors.centerIn: parent;
+    }
 }
index ff3426b..d046f4e 100644 (file)
@@ -535,6 +535,11 @@ void tst_qquickanchors::centerIn()
     QCOMPARE(rect->x(), 75.0 - 20.0);
     QCOMPARE(rect->y(), 75.0 - 10.0);
 
+    //QTBUG-21730 (use actual center to prevent animation jitter)
+    QQuickRectangle* rect2 = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("centered2"));
+    QCOMPARE(rect2->x(), 94.5);
+    QCOMPARE(rect2->y(), 94.5);
+
     delete view;
 }
 
@@ -567,7 +572,6 @@ void tst_qquickanchors::centerInRotation()
     QQuickRectangle* outer = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("outer"));
     QQuickRectangle* inner = findItem<QQuickRectangle>(view->rootObject(), QLatin1String("inner"));
 
-    QEXPECT_FAIL("", "QTBUG-12441", Abort);
     QCOMPARE(outer->x(), qreal(49.5));
     QCOMPARE(outer->y(), qreal(49.5));
     QCOMPARE(inner->x(), qreal(25.5));