diff --git a/src/plugins/imageformats/dds/qddshandler.cpp b/src/plugins/imageformats/dds/qddshandler.cpp index 8dd5ed35ac1ae3776b18a8533ad2032839ce29a0..01a878280332c0cdfb123d86dff4ccd213b96483 100644 --- a/src/plugins/imageformats/dds/qddshandler.cpp +++ b/src/plugins/imageformats/dds/qddshandler.cpp @@ -1266,18 +1266,19 @@ bool QDDSHandler::read(QImage *outImage) bool QDDSHandler::write(const QImage &outImage) { - QDataStream s( device() ); + const QImage image = outImage.convertToFormat(QImage::Format_ARGB32); + + QDataStream s(device()); s.setByteOrder(QDataStream::LittleEndian); - // Filling header DDSHeader dds; // Filling header dds.magic = ddsMagic; dds.size = 124; dds.flags = DDSHeader::FlagCaps | DDSHeader::FlagHeight | DDSHeader::FlagWidth | DDSHeader::FlagPixelFormat; - dds.height = outImage.height(); - dds.width = outImage.width(); + dds.height = image.height(); + dds.width = image.width(); dds.pitchOrLinearSize = 128; dds.depth = 0; dds.mipMapCount = 0; @@ -1300,9 +1301,9 @@ bool QDDSHandler::write(const QImage &outImage) dds.pixelFormat.bBitMask = 0x000000ff; s << dds; - for (int width = 0; width < outImage.width(); width++) { - for (int height = 0; height < outImage.height(); height++) { - QRgb pixel = outImage.pixel(height, width);; + for (int width = 0; width < image.width(); width++) { + for (int height = 0; height < image.height(); height++) { + QRgb pixel = image.pixel(height, width);; quint32 color; quint8 alpha = qAlpha(pixel); quint8 red = qRed(pixel); diff --git a/tests/auto/dds/tst_qdds.cpp b/tests/auto/dds/tst_qdds.cpp index de05ec4f56725b1e445157835b1015522c11ebca..4464b991d2c65985c084ef1b05bfca51632de78d 100644 --- a/tests/auto/dds/tst_qdds.cpp +++ b/tests/auto/dds/tst_qdds.cpp @@ -52,6 +52,8 @@ private slots: void readImage(); void testMipmaps_data(); void testMipmaps(); + void testWriteImage_data(); + void testWriteImage(); }; void tst_qdds::readImage_data() @@ -149,5 +151,32 @@ void tst_qdds::testMipmaps() } } +void tst_qdds::testWriteImage_data() +{ + QTest::addColumn<QString>("fileName"); + QTest::addColumn<QSize>("size"); + + QTest::newRow("1") << QString("A8R8G8B8") << QSize(64, 64); +} + +void tst_qdds::testWriteImage() +{ + QFETCH(QString, fileName); + QFETCH(QSize, size); + + const QString path = fileName + QStringLiteral(".dds"); + const QString sourcePath = QStringLiteral(":/dds/") + fileName + QStringLiteral(".dds"); + + QImage image(sourcePath); + QVERIFY(!image.isNull()); + QVERIFY(image.size() == size); + + QImageWriter writer(path, QByteArrayLiteral("dds")); + QVERIFY2(writer.canWrite(), qPrintable(writer.errorString())); + QVERIFY2(writer.write(image), qPrintable(writer.errorString())); + + QVERIFY(image == QImage(path)); +} + QTEST_MAIN(tst_qdds) #include "tst_qdds.moc"