summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorABBAPOH <ABBAPOH@nextmail.ru>2013-12-01 12:47:53 +0400
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-12-02 09:51:20 +0100
commit65fa7497f2561d30a3e82668f9fc29fa6f789a8d (patch)
treec2531019501ba280b09ed11ab5f7c1d82e429528
parenta5f8d2544def6aaad020ac3a8c8297295eeb2407 (diff)
Fix writing images in DDS handler
Change-Id: If433528eb4cfa7448f171e083dd2bb559dbc2f4a Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
-rw-r--r--src/plugins/imageformats/dds/qddshandler.cpp15
-rw-r--r--tests/auto/dds/tst_qdds.cpp29
2 files changed, 37 insertions, 7 deletions
diff --git a/src/plugins/imageformats/dds/qddshandler.cpp b/src/plugins/imageformats/dds/qddshandler.cpp
index 8dd5ed3..01a8782 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 de05ec4..4464b99 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"