tests/auto/qimagereader/tst_qimagereader.cpp
changeset 7 f7bc934e204c
parent 3 41300fa6a67c
child 30 5dc02b23752f
equal deleted inserted replaced
3:41300fa6a67c 7:f7bc934e204c
     1 /****************************************************************************
     1 /****************************************************************************
     2 **
     2 **
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     4 ** All rights reserved.
     4 ** All rights reserved.
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
     6 **
     6 **
     7 ** This file is part of the test suite of the Qt Toolkit.
     7 ** This file is part of the test suite of the Qt Toolkit.
     8 **
     8 **
   139     void imageFormatBeforeRead();
   139     void imageFormatBeforeRead();
   140 
   140 
   141 #if defined QTEST_HAVE_GIF
   141 #if defined QTEST_HAVE_GIF
   142     void gifHandlerBugs();
   142     void gifHandlerBugs();
   143     void animatedGif();
   143     void animatedGif();
       
   144     void gifImageCount();
       
   145     void gifLoopCount();
   144 #endif
   146 #endif
   145 
   147 
   146     void readCorruptImage_data();
   148     void readCorruptImage_data();
   147     void readCorruptImage();
   149     void readCorruptImage();
   148     void readCorruptBmp();
   150     void readCorruptBmp();
   320     QTest::newRow("PPM: teapot") << "teapot" << QSize(200, 200) << QByteArray("ppm");
   322     QTest::newRow("PPM: teapot") << "teapot" << QSize(200, 200) << QByteArray("ppm");
   321     QTest::newRow("PPM: runners") << "runners.ppm" << QSize(400, 400) << QByteArray("ppm");
   323     QTest::newRow("PPM: runners") << "runners.ppm" << QSize(400, 400) << QByteArray("ppm");
   322     QTest::newRow("PPM: test") << "test.ppm" << QSize(10, 10) << QByteArray("ppm");
   324     QTest::newRow("PPM: test") << "test.ppm" << QSize(10, 10) << QByteArray("ppm");
   323     QTest::newRow("XBM: gnus") << "gnus" << QSize(200, 200) << QByteArray("xbm");
   325     QTest::newRow("XBM: gnus") << "gnus" << QSize(200, 200) << QByteArray("xbm");
   324 #ifdef QTEST_HAVE_JPEG
   326 #ifdef QTEST_HAVE_JPEG
   325     QTest::newRow("JPEG: beavis") << "beavis" << QSize(200, 200) << QByteArray("jpeg");
   327     QTest::newRow("JPEG: beavis A") << "beavis" << QSize(200, 200) << QByteArray("jpeg");
       
   328     QTest::newRow("JPEG: beavis B") << "beavis" << QSize(175, 175) << QByteArray("jpeg");
       
   329     QTest::newRow("JPEG: beavis C") << "beavis" << QSize(100, 100) << QByteArray("jpeg");
       
   330     QTest::newRow("JPEG: beavis D") << "beavis" << QSize(100, 200) << QByteArray("jpeg");
       
   331     QTest::newRow("JPEG: beavis E") << "beavis" << QSize(200, 100) << QByteArray("jpeg");
       
   332     QTest::newRow("JPEG: beavis F") << "beavis" << QSize(87, 87) << QByteArray("jpeg");
       
   333     QTest::newRow("JPEG: beavis G") << "beavis" << QSize(50, 45) << QByteArray("jpeg");
       
   334     QTest::newRow("JPEG: beavis H") << "beavis" << QSize(43, 43) << QByteArray("jpeg");
       
   335     QTest::newRow("JPEG: beavis I") << "beavis" << QSize(25, 25) << QByteArray("jpeg");
   326 #endif // QTEST_HAVE_JPEG
   336 #endif // QTEST_HAVE_JPEG
   327 #ifdef QTEST_HAVE_GIF
   337 #ifdef QTEST_HAVE_GIF
   328     QTest::newRow("GIF: earth") << "earth" << QSize(200, 200) << QByteArray("gif");
   338     QTest::newRow("GIF: earth") << "earth" << QSize(200, 200) << QByteArray("gif");
   329     QTest::newRow("GIF: trolltech") << "trolltech" << QSize(200, 200) << QByteArray("gif");
   339     QTest::newRow("GIF: trolltech") << "trolltech" << QSize(200, 200) << QByteArray("gif");
   330 #endif // QTEST_HAVE_GIF
   340 #endif // QTEST_HAVE_GIF
   715         QVERIFY(io1.canRead());  QVERIFY(io2.canRead());
   725         QVERIFY(io1.canRead());  QVERIFY(io2.canRead());
   716         QImage im1 = io1.read(); QImage im2 = io2.read();
   726         QImage im1 = io1.read(); QImage im2 = io2.read();
   717         QVERIFY(!im1.isNull());  QVERIFY(!im2.isNull());
   727         QVERIFY(!im1.isNull());  QVERIFY(!im2.isNull());
   718         QCOMPARE(im1.convertToFormat(QImage::Format_ARGB32), im2.convertToFormat(QImage::Format_ARGB32));
   728         QCOMPARE(im1.convertToFormat(QImage::Format_ARGB32), im2.convertToFormat(QImage::Format_ARGB32));
   719     }
   729     }
       
   730 
       
   731     // Check the undocumented feature.
       
   732     {
       
   733         QImageReader io(prefix + "endless-anim.gif");
       
   734         QVERIFY(io.canRead());
       
   735         QCOMPARE(io.loopCount(), -1);
       
   736     }
   720 }
   737 }
   721 
   738 
   722 void tst_QImageReader::animatedGif()
   739 void tst_QImageReader::animatedGif()
   723 {
   740 {
   724     QImageReader io(":images/qt.gif");
   741     QImageReader io(":images/qt.gif");
   729         QString frameName = QString(":images/qt%1.gif").arg(++i);
   746         QString frameName = QString(":images/qt%1.gif").arg(++i);
   730         QCOMPARE(image, QImage(frameName));
   747         QCOMPARE(image, QImage(frameName));
   731         image = io.read();
   748         image = io.read();
   732     }
   749     }
   733 }
   750 }
       
   751 
       
   752 // http://bugreports.qt.nokia.com/browse/QTBUG-6696
       
   753 // Check the count of images in various call orders...
       
   754 void tst_QImageReader::gifImageCount()
       
   755 {
       
   756     // just read every frame... and see how much we got..
       
   757     {
       
   758         QImageReader io(":images/four-frames.gif");
       
   759 
       
   760         QVERIFY(io.canRead());
       
   761         QImage blackFrame = io.read();
       
   762 
       
   763         QVERIFY(io.canRead());
       
   764         QImage whiteFrame = io.read();
       
   765 
       
   766         QVERIFY(io.canRead());
       
   767         QImage greenFrame = io.read();
       
   768 
       
   769         QVERIFY(io.imageCount() == 4);
       
   770 
       
   771         QVERIFY(io.canRead());
       
   772         QImage blueFrame = io.read();
       
   773 
       
   774         QVERIFY(!io.canRead());
       
   775         QImage emptyFrame = io.read();
       
   776 
       
   777         QVERIFY(!io.canRead());
       
   778         QCOMPARE(blackFrame.pixel(0,0), qRgb(0, 0, 0));
       
   779         QCOMPARE(blackFrame.size(), QSize(64,64));
       
   780 
       
   781         QCOMPARE(whiteFrame.pixel(0,0), qRgb(0xff, 0xff, 0xff));
       
   782         QCOMPARE(whiteFrame.size(), QSize(64,64));
       
   783 
       
   784         QCOMPARE(greenFrame.pixel(0,0), qRgb(0x0, 0xff, 0x0));
       
   785         QCOMPARE(greenFrame.size(), QSize(64,64));
       
   786 
       
   787         QCOMPARE(blueFrame.pixel(0,0), qRgb(0x0, 0x0, 0xff));
       
   788         QCOMPARE(blueFrame.size(), QSize(64,64));
       
   789         QVERIFY(emptyFrame.isNull());
       
   790     }
       
   791 
       
   792     // Read and get the size
       
   793     {
       
   794         QImageReader io(":images/four-frames.gif");
       
   795 
       
   796         QVERIFY(io.canRead());
       
   797         QCOMPARE(io.size(), QSize(64,64));
       
   798 
       
   799         QVERIFY(io.canRead());
       
   800         QCOMPARE(io.size(), QSize(64,64));
       
   801         QCOMPARE(io.size(), QSize(64,64));
       
   802         QVERIFY(io.canRead());
       
   803         QImage blackFrame = io.read();
       
   804 
       
   805         QVERIFY(io.canRead());
       
   806         QCOMPARE(io.size(), QSize(64,64));
       
   807         QCOMPARE(io.size(), QSize(64,64));
       
   808         QVERIFY(io.canRead());
       
   809         QImage whiteFrame = io.read();
       
   810 
       
   811         QVERIFY(io.canRead());
       
   812         QCOMPARE(io.size(), QSize(64,64));
       
   813         QCOMPARE(io.size(), QSize(64,64));
       
   814         QVERIFY(io.canRead());
       
   815         QImage greenFrame = io.read();
       
   816 
       
   817         QVERIFY(io.canRead());
       
   818         QCOMPARE(io.size(), QSize(64,64));
       
   819         QCOMPARE(io.size(), QSize(64,64));
       
   820         QVERIFY(io.canRead());
       
   821         QImage blueFrame = io.read();
       
   822 
       
   823         QVERIFY(!io.canRead());
       
   824         QCOMPARE(io.size(), QSize());
       
   825         QCOMPARE(io.size(), QSize());
       
   826         QVERIFY(!io.canRead());
       
   827         QImage emptyFrame = io.read();
       
   828 
       
   829         QVERIFY(!io.canRead());
       
   830         QCOMPARE(blackFrame.pixel(0,0), qRgb(0, 0, 0));
       
   831         QCOMPARE(blackFrame.size(), QSize(64,64));
       
   832 
       
   833         QCOMPARE(whiteFrame.pixel(0,0), qRgb(0xff, 0xff, 0xff));
       
   834         QCOMPARE(whiteFrame.size(), QSize(64,64));
       
   835 
       
   836         QCOMPARE(greenFrame.pixel(0,0), qRgb(0x0, 0xff, 0x0));
       
   837         QCOMPARE(greenFrame.size(), QSize(64,64));
       
   838 
       
   839         QCOMPARE(blueFrame.pixel(0,0), qRgb(0x0, 0x0, 0xff));
       
   840         QCOMPARE(blueFrame.size(), QSize(64,64));
       
   841         QVERIFY(emptyFrame.isNull());
       
   842     }
       
   843 
       
   844     // Do a Size query as substitute for canRead
       
   845     {
       
   846         QImageReader io(":images/four-frames.gif");
       
   847 
       
   848         QCOMPARE(io.size(), QSize(64,64));
       
   849         QCOMPARE(io.size(), QSize(64,64));
       
   850         QImage blackFrame = io.read();
       
   851 
       
   852         QCOMPARE(io.size(), QSize(64,64));
       
   853         QCOMPARE(io.size(), QSize(64,64));
       
   854         QImage whiteFrame = io.read();
       
   855 
       
   856         QCOMPARE(io.size(), QSize(64,64));
       
   857         QCOMPARE(io.size(), QSize(64,64));
       
   858         QImage greenFrame = io.read();
       
   859 
       
   860         QCOMPARE(io.size(), QSize(64,64));
       
   861         QCOMPARE(io.size(), QSize(64,64));
       
   862         QImage blueFrame = io.read();
       
   863 
       
   864         QCOMPARE(io.size(), QSize());
       
   865         QVERIFY(!io.canRead());
       
   866         QImage emptyFrame = io.read();
       
   867 
       
   868         QVERIFY(!io.canRead());
       
   869         QCOMPARE(blackFrame.pixel(0,0), qRgb(0, 0, 0));
       
   870         QCOMPARE(blackFrame.size(), QSize(64,64));
       
   871 
       
   872         QCOMPARE(whiteFrame.pixel(0,0), qRgb(0xff, 0xff, 0xff));
       
   873         QCOMPARE(whiteFrame.size(), QSize(64,64));
       
   874 
       
   875         QCOMPARE(greenFrame.pixel(0,0), qRgb(0x0, 0xff, 0x0));
       
   876         QCOMPARE(greenFrame.size(), QSize(64,64));
       
   877 
       
   878         QCOMPARE(blueFrame.pixel(0,0), qRgb(0x0, 0x0, 0xff));
       
   879         QCOMPARE(blueFrame.size(), QSize(64,64));
       
   880         QVERIFY(emptyFrame.isNull());
       
   881     }
       
   882     {
       
   883         QImageReader io(":images/trolltech.gif");
       
   884         QVERIFY(io.imageCount() == 34);
       
   885         QVERIFY(io.size() == QSize(128,64));
       
   886     }
       
   887 }
       
   888 
       
   889 void tst_QImageReader::gifLoopCount()
       
   890 {
       
   891     {
       
   892         QImageReader io(":images/qt-gif-anim.gif");
       
   893         QCOMPARE(io.loopCount(), -1); // infinite loop
       
   894     }
       
   895     {
       
   896         QImageReader io(":images/qt-gif-noanim.gif");
       
   897         QCOMPARE(io.loopCount(), 0); // no loop
       
   898     }
       
   899 }
       
   900 
   734 #endif
   901 #endif
   735 
   902 
   736 class Server : public QObject
   903 class Server : public QObject
   737 {
   904 {
   738     Q_OBJECT
   905     Q_OBJECT
  1464         QVERIFY(reader.read().isNull());
  1631         QVERIFY(reader.read().isNull());
  1465         reader.setAutoDetectImageFormat(true);
  1632         reader.setAutoDetectImageFormat(true);
  1466         QVERIFY(reader.canRead());
  1633         QVERIFY(reader.canRead());
  1467         QVERIFY(!reader.read().isNull());
  1634         QVERIFY(!reader.read().isNull());
  1468     }
  1635     }
       
  1636 
       
  1637 #ifdef QTEST_HAVE_JPEG
       
  1638     {
       
  1639         QImageReader io(prefix + "YCbCr_rgb.jpg");
       
  1640         io.setAutoDetectImageFormat(false);
       
  1641         // This should fail since no format string is given
       
  1642         QImage image;
       
  1643         QVERIFY(!io.read(&image));
       
  1644     }
       
  1645     {
       
  1646         QImageReader io(prefix + "YCbCr_rgb.jpg", "jpg");
       
  1647         io.setAutoDetectImageFormat(false);
       
  1648         QImage image;
       
  1649         QVERIFY(io.read(&image));
       
  1650     }
       
  1651 #endif
       
  1652     {
       
  1653         QImageReader io(prefix + "tst7.png");
       
  1654         io.setAutoDetectImageFormat(false);
       
  1655         // This should fail since no format string is given
       
  1656         QImage image;
       
  1657         QVERIFY(!io.read(&image));
       
  1658     }
       
  1659     {
       
  1660         QImageReader io(prefix + "tst7.png", "png");
       
  1661         io.setAutoDetectImageFormat(false);
       
  1662         QImage image;
       
  1663         QVERIFY(io.read(&image));
       
  1664     }
  1469 }
  1665 }
  1470 
  1666 
  1471 void tst_QImageReader::fileNameProbing()
  1667 void tst_QImageReader::fileNameProbing()
  1472 {
  1668 {
  1473     QString name("doesnotexist.png");
  1669     QString name("doesnotexist.png");
  1485 {
  1681 {
  1486     QTest::addColumn<QString>("fileName");
  1682     QTest::addColumn<QString>("fileName");
  1487 
  1683 
  1488     QTest::newRow("floppy (16px,32px - 16 colors)") << "35floppy.ico";
  1684     QTest::newRow("floppy (16px,32px - 16 colors)") << "35floppy.ico";
  1489     QTest::newRow("semitransparent") << "semitransparent.ico";
  1685     QTest::newRow("semitransparent") << "semitransparent.ico";
  1490     QTest::newRow("slightlybroken") << "kde_favicon.ico";
  1686     QTest::newRow("slightlybrokenBMPHeader") << "kde_favicon.ico";
       
  1687     QTest::newRow("sightlybrokenIconHeader") << "connect.ico";
  1491 }
  1688 }
  1492 
  1689 
  1493 void tst_QImageReader::pixelCompareWithBaseline()
  1690 void tst_QImageReader::pixelCompareWithBaseline()
  1494 {
  1691 {
  1495     QFETCH(QString, fileName);
  1692     QFETCH(QString, fileName);
  1496 
  1693 
       
  1694     static int enteredCount = 0;    // Used for better error diagnostics if something fails. We
       
  1695     static int loadFailCount = 0;   // don't know if the reason load() fails is that the plugin
       
  1696                                     // does not exist or because of a bug in the plugin. But if at
       
  1697                                     // least one file succeeded we know that the plugin was built.
       
  1698                                     // The other failures are then real failures.
  1497     QImage icoImg;
  1699     QImage icoImg;
       
  1700     const QString inputFileName(QString::fromAscii("images/%1").arg(fileName));
       
  1701     QFileInfo fi(inputFileName);
       
  1702 
       
  1703     ++enteredCount;
  1498     // might fail if the plugin does not exist, which is ok.
  1704     // might fail if the plugin does not exist, which is ok.
  1499     if (icoImg.load(QString::fromAscii("images/%1").arg(fileName))) {
  1705     if (icoImg.load(inputFileName)) {
  1500         QString baselineFileName = QString::fromAscii("baseline/%1").arg(fileName);
  1706         icoImg = icoImg.convertToFormat(QImage::Format_ARGB32_Premultiplied);
       
  1707         const QString baselineFileName(QString::fromAscii("baseline/%1.png").arg(fi.baseName()));
  1501 #if 0
  1708 #if 0
  1502         icoImg.save(baselineFileName);
  1709         icoImg.save(baselineFileName);
  1503 #else
  1710 #else
  1504         QImage baseImg;
  1711         QImage baseImg;
  1505         QVERIFY(baseImg.load(baselineFileName));
  1712         QVERIFY(baseImg.load(baselineFileName));
       
  1713         baseImg = baseImg.convertToFormat(QImage::Format_ARGB32_Premultiplied);
       
  1714         QCOMPARE(int(baseImg.format()), int(icoImg.format()));
  1506         QCOMPARE(baseImg, icoImg);
  1715         QCOMPARE(baseImg, icoImg);
  1507 #endif
  1716 #endif
       
  1717     } else {
       
  1718         ++loadFailCount;
       
  1719         if (enteredCount != loadFailCount) {
       
  1720             QFAIL("Plugin is built, but some did not load properly");
       
  1721         } else {
       
  1722             qWarning("loading failed, check if ico plugin is built");
       
  1723         }
  1508     }
  1724     }
  1509 }
  1725 }
  1510 
  1726 
  1511 
  1727 
  1512 void tst_QImageReader::testIgnoresFormatAndExtension_data()
  1728 void tst_QImageReader::testIgnoresFormatAndExtension_data()