diff options
author | ABBAPOH <ABBAPOH@nextmail.ru> | 2013-12-13 19:21:27 +0400 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-12-16 11:47:46 +0100 |
commit | 5aedb778707f2707d66eb848276e8c2f0b4d447c (patch) | |
tree | fc915f35922cb6a18dbed2fbdd45742653600335 /src/plugins | |
parent | 481275bf95128b71a2b70f99142a3e39a3b3507e (diff) | |
download | qtimageformats-5aedb778707f2707d66eb848276e8c2f0b4d447c.tar.gz |
Do not try to rescan device in case of an error in DDS plugin.
Change-Id: I64b49294476fc3bbf77620d839b88b0ecea68e23
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: Alex Char <prevedtest@gmail.com>
Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/imageformats/dds/qddshandler.cpp | 18 | ||||
-rw-r--r-- | src/plugins/imageformats/dds/qddshandler.h | 10 |
2 files changed, 18 insertions, 10 deletions
diff --git a/src/plugins/imageformats/dds/qddshandler.cpp b/src/plugins/imageformats/dds/qddshandler.cpp index 2b132b5..428659f 100644 --- a/src/plugins/imageformats/dds/qddshandler.cpp +++ b/src/plugins/imageformats/dds/qddshandler.cpp @@ -1227,7 +1227,7 @@ static QImage readCubeMap(QDataStream &s, const DDSHeader &dds, const int fmt) QDDSHandler::QDDSHandler() : m_currentImage(0), - m_headerCached(false) + m_scanState(ScanNotScanned) { } @@ -1247,7 +1247,7 @@ bool QDDSHandler::canRead() const bool QDDSHandler::read(QImage *outImage) { - if (!ensureHeaderCached() || device()->isSequential()) + if (!ensureScanned() || device()->isSequential()) return false; qint64 pos = headerSize + mipmapOffset(m_header, m_format, m_currentImage); @@ -1321,7 +1321,7 @@ bool QDDSHandler::write(const QImage &outImage) QVariant QDDSHandler::option(QImageIOHandler::ImageOption option) const { - if (!supportsOption(option) || !ensureHeaderCached()) + if (!supportsOption(option) || !ensureScanned()) return QVariant(); switch (option) { @@ -1341,7 +1341,7 @@ bool QDDSHandler::supportsOption(QImageIOHandler::ImageOption option) const int QDDSHandler::imageCount() const { - if (!ensureHeaderCached()) + if (!ensureScanned()) return 0; return qMax<quint32>(1, m_header.mipMapCount); @@ -1369,10 +1369,12 @@ bool QDDSHandler::canRead(QIODevice *device) return device->peek(4) == QByteArrayLiteral("DDS "); } -bool QDDSHandler::ensureHeaderCached() const +bool QDDSHandler::ensureScanned() const { - if (m_headerCached) - return true; + if (m_scanState != ScanNotScanned) + return m_scanState == ScanSuccess; + + m_scanState = ScanError; if (device()->isSequential()) { qWarning() << "Sequential devices are not supported"; @@ -1399,7 +1401,7 @@ bool QDDSHandler::ensureHeaderCached() const that->m_format = getFormat(m_header); - m_headerCached = true; + m_scanState = ScanSuccess; return true; } diff --git a/src/plugins/imageformats/dds/qddshandler.h b/src/plugins/imageformats/dds/qddshandler.h index 542bd35..582a013 100644 --- a/src/plugins/imageformats/dds/qddshandler.h +++ b/src/plugins/imageformats/dds/qddshandler.h @@ -70,15 +70,21 @@ public: static bool canRead(QIODevice *device); private: - bool ensureHeaderCached() const; + bool ensureScanned() const; bool verifyHeader(const DDSHeader &dds) const; private: + enum ScanState { + ScanError = -1, + ScanNotScanned = 0, + ScanSuccess = 1, + }; + DDSHeader m_header; int m_format; DDSHeaderDX10 m_header10; int m_currentImage; - mutable bool m_headerCached; + mutable ScanState m_scanState; }; QT_END_NAMESPACE |