tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp
changeset 3 41300fa6a67c
parent 0 1918ee327afb
child 4 3b1da2848fc7
child 7 f7bc934e204c
child 18 2f34d5167611
--- a/tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp	Tue Jan 26 12:42:25 2010 +0200
+++ b/tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp	Tue Feb 02 00:43:10 2010 +0200
@@ -49,6 +49,7 @@
 #include <QtGui/qstyleoption.h>
 
 #include "../../shared/util.h"
+#include <private/qgraphicseffect_p.h>
 
 //TESTED_CLASS=
 //TESTED_FILES=
@@ -68,6 +69,7 @@
     void opacity();
     void grayscale();
     void colorize();
+    void drawPixmapItem();
 };
 
 void tst_QGraphicsEffect::initTestCase()
@@ -131,16 +133,16 @@
     int margin() const
     { return m_margin; }
 
-    void draw(QPainter *painter, QGraphicsEffectSource *source)
+    void draw(QPainter *painter)
     {
         ++numRepaints;
         if (doNothingInDraw)
             return;
-        m_source = source;
+        m_source = source();
         m_painter = painter;
-        m_styleOption = source->styleOption();
+        m_styleOption = source()->styleOption();
         m_opacity = painter->opacity();
-        source->draw(painter);
+        drawSource(painter);
     }
 
     void sourceChanged(QGraphicsEffect::ChangeFlags flags)
@@ -195,8 +197,8 @@
     // Uninstall effect on QGraphicsItem.
     effect->reset();
     item->setGraphicsEffect(0);
-    QVERIFY(!effect->source());
-    QVERIFY(effect->m_sourceChangedFlags & QGraphicsEffect::SourceDetached);
+    QVERIFY(!effect);
+    effect = new CustomEffect;
 
     // The item takes ownership and should delete the effect when destroyed.
     item->setGraphicsEffect(effect);
@@ -248,10 +250,10 @@
     QCOMPARE(effect->boundingRect(), effect->boundingRectFor(itemRect));
 
     // Uninstall effect on QGraphicsItem.
+    QPointer<CustomEffect> ptr = effect;
     item->setGraphicsEffect(0);
-    QCOMPARE(effect->boundingRect(), QRectF());
+    QVERIFY(!ptr);
 
-    delete effect;
     delete item;
 }
 
@@ -342,11 +344,11 @@
     QCOMPARE(item->numRepaints, 0);
 
     // Make sure uninstalling an effect triggers a repaint.
+    QPointer<CustomEffect> ptr = effect;
     item->setGraphicsEffect(0);
+    QVERIFY(!ptr);
     QTest::qWait(50);
-    QCOMPARE(effect->numRepaints, 0);
     QCOMPARE(item->numRepaints, 1);
-    delete effect;
 }
 
 void tst_QGraphicsEffect::opacity()
@@ -379,7 +381,8 @@
     item->setPen(Qt::NoPen);
     item->setBrush(QColor(122, 193, 66)); // Qt light green
 
-    QGraphicsGrayscaleEffect *effect = new QGraphicsGrayscaleEffect;
+    QGraphicsColorizeEffect *effect = new QGraphicsColorizeEffect;
+    effect->setColor(Qt::black);
     item->setGraphicsEffect(effect);
 
     QPainter painter;
@@ -463,6 +466,54 @@
     QCOMPARE(image.pixel(10, 10), qRgb(122, 193, 66));
 }
 
+class PixmapItemEffect : public QGraphicsEffect
+{
+public:
+    PixmapItemEffect(const QPixmap &source)
+        : QGraphicsEffect()
+        , pixmap(source)
+        , repaints(0)
+    {}
+
+    QRectF boundingRectFor(const QRectF &rect) const
+    { return rect; }
+
+    void draw(QPainter *painter)
+    {
+        QVERIFY(sourcePixmap(Qt::LogicalCoordinates).pixmapData() == pixmap.pixmapData());
+        QVERIFY((painter->worldTransform().type() <= QTransform::TxTranslate) == (sourcePixmap(Qt::DeviceCoordinates).pixmapData() == pixmap.pixmapData()));
+
+        ++repaints;
+    }
+    QPixmap pixmap;
+    int repaints;
+};
+
+void tst_QGraphicsEffect::drawPixmapItem()
+{
+    QImage image(32, 32, QImage::Format_RGB32);
+    QPainter p(&image);
+    p.fillRect(0, 0, 32, 16, Qt::blue);
+    p.fillRect(0, 16, 32, 16, Qt::red);
+    p.end();
+
+    QGraphicsScene scene;
+    QGraphicsPixmapItem *item = new QGraphicsPixmapItem(QPixmap::fromImage(image));
+    scene.addItem(item);
+
+    PixmapItemEffect *effect = new PixmapItemEffect(item->pixmap());
+    item->setGraphicsEffect(effect);
+
+    QGraphicsView view(&scene);
+    view.show();
+    QTest::qWaitForWindowShown(&view);
+
+    item->rotate(180);
+    QTest::qWait(50);
+
+    QTRY_VERIFY(effect->repaints >= 2);
+}
+
 QTEST_MAIN(tst_QGraphicsEffect)
 #include "tst_qgraphicseffect.moc"