void ImageDocument::setContents(const ImageContents &contents) { Q_D(ImageDocument); if (contents.isNull()) { clear(); return; } const auto header = contents.header(); d->type = header.type(); d->size = header.size(); d->imageFormat = header.imageFormat(); d->imageCount = header.imageCount(); d->mipmapCount = header.mipmapCount(); d->frameDelay = header.frameDelay(); d->loopCount = header.loopCount(); for (int index = 0; index < d->imageCount; ++index) { for (int level = 0; level < d->mipmapCount; ++level) { auto image = contents.image(index, level); std::unique_ptr<ImageDocumentItem> item(new ImageDocumentItem(this)); item->setSize(image.size()); item->setImage(image); d->items[ImageDocumentPrivate::ImageIndex(index, level)] = std::move(item); } } emit contentsChanged(); }
QImage ImageContents::image(int index, int level) const { if (index < 0 || index >= imageCount()) return QImage(); if (level < 0 || level >= mipmapCount()) return QImage(); return d->images.value(ImageContentsData::ImageIndex(index, level)); }
void TestDds::testMipmaps() { QFETCH(QString, fileName); QFETCH(QSize, size); QFETCH(int, mipmapCount); const QString path = QStringLiteral(":/data/") + fileName + QStringLiteral(".dds"); ImageIO reader(path); // QVERIFY(reader.canRead()); const auto result = reader.read(); const auto &status = result.first; const auto &contents = result.second; const auto header = contents.header(); QVERIFY2(status, qPrintable(status.toString())); QCOMPARE(header.mipmapCount(), mipmapCount); for (int i = 0; i < header.mipmapCount(); ++i) { QImage image = contents.image(0, i); QVERIFY(!image.isNull()); QCOMPARE(image.size(), size / (1 << i)); QString sourcePath = QString(":/data/%1 %2.png").arg(fileName).arg(i); QVERIFY(compareImages(image, QImage(sourcePath)) == true); } }