File indexing completed on 2025-04-20 09:43:05
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"