File indexing completed on 2024-04-21 14:59:21

0001 /*
0002     SPDX-FileCopyrightText: 2020 Kai Uwe Broulik <kde@broulik.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include <QImage>
0008 #include <QImageReader>
0009 #include <QTest>
0010 
0011 static bool imgEquals(const QImage &im1, const QImage &im2)
0012 {
0013     const int height = im1.height();
0014     const int width = im1.width();
0015     for (int i = 0; i < height; ++i) {
0016         const auto *line1 = reinterpret_cast<const quint8 *>(im1.scanLine(i));
0017         const auto *line2 = reinterpret_cast<const quint8 *>(im2.scanLine(i));
0018         for (int j = 0; j < width; ++j) {
0019             if (line1[j] - line2[j] != 0) {
0020                 return false;
0021             }
0022         }
0023     }
0024     return true;
0025 }
0026 
0027 class AniTests : public QObject
0028 {
0029     Q_OBJECT
0030 
0031 private Q_SLOTS:
0032     void initTestCase()
0033     {
0034         QCoreApplication::addLibraryPath(QStringLiteral(PLUGIN_DIR));
0035     }
0036 
0037     void testReadMetadata()
0038     {
0039         QImageReader reader(QFINDTESTDATA("ani/test.ani"));
0040 
0041         QVERIFY(reader.canRead());
0042 
0043         QCOMPARE(reader.imageCount(), 4);
0044 
0045         QCOMPARE(reader.size(), QSize(32, 32));
0046 
0047         QCOMPARE(reader.text(QStringLiteral("Title")), QStringLiteral("ANI Test"));
0048         QCOMPARE(reader.text(QStringLiteral("Author")), QStringLiteral("KDE Community"));
0049     }
0050 
0051     void textRead()
0052     {
0053         QImageReader reader(QFINDTESTDATA("ani/test.ani"));
0054         QVERIFY(reader.canRead());
0055         QCOMPARE(reader.currentImageNumber(), 0);
0056 
0057         QImage aniFrame;
0058         QVERIFY(reader.read(&aniFrame));
0059 
0060         QImage img1(QFINDTESTDATA("ani/test_1.png"));
0061         img1.convertTo(aniFrame.format());
0062 
0063         QVERIFY(imgEquals(aniFrame, img1));
0064 
0065         QCOMPARE(reader.nextImageDelay(), 166); // 10 "jiffies"
0066 
0067         QVERIFY(reader.canRead());
0068         // that read() above should have advanced us to the next frame
0069         QCOMPARE(reader.currentImageNumber(), 1);
0070 
0071         QVERIFY(reader.read(&aniFrame));
0072         QImage img2(QFINDTESTDATA("ani/test_2.png"));
0073         img2.convertTo(aniFrame.format());
0074 
0075         QVERIFY(imgEquals(aniFrame, img2));
0076 
0077         // The "middle" frame has a longer delay than the others
0078         QCOMPARE(reader.nextImageDelay(), 333); // 20 "jiffies"
0079 
0080         QVERIFY(reader.canRead());
0081         QCOMPARE(reader.currentImageNumber(), 2);
0082 
0083         QVERIFY(reader.read(&aniFrame));
0084         QImage img3(QFINDTESTDATA("ani/test_3.png"));
0085         img3.convertTo(aniFrame.format());
0086 
0087         QVERIFY(imgEquals(aniFrame, img3));
0088 
0089         QCOMPARE(reader.nextImageDelay(), 166);
0090 
0091         QVERIFY(reader.canRead());
0092         QCOMPARE(reader.currentImageNumber(), 3);
0093 
0094         QVERIFY(reader.read(&aniFrame));
0095         // custom sequence in the ANI file should get us back to img2
0096         QVERIFY(imgEquals(aniFrame, img2));
0097 
0098         QCOMPARE(reader.nextImageDelay(), 166);
0099 
0100         // We should have reached the end now
0101         QVERIFY(!reader.canRead());
0102         QVERIFY(!reader.read(&aniFrame));
0103 
0104         // Jump back to the start
0105         QVERIFY(reader.jumpToImage(0));
0106 
0107         QVERIFY(reader.canRead());
0108         QCOMPARE(reader.currentImageNumber(), 0);
0109 
0110         QCOMPARE(reader.nextImageDelay(), 166);
0111 
0112         QVERIFY(reader.read(&aniFrame));
0113         QVERIFY(imgEquals(aniFrame, img1));
0114     }
0115 };
0116 
0117 QTEST_MAIN(AniTests)
0118 
0119 #include "anitest.moc"