From 5aedb778707f2707d66eb848276e8c2f0b4d447c Mon Sep 17 00:00:00 2001 From: ABBAPOH Date: Fri, 13 Dec 2013 19:21:27 +0400 Subject: Do not try to rescan device in case of an error in DDS plugin. Change-Id: I64b49294476fc3bbf77620d839b88b0ecea68e23 Reviewed-by: Friedemann Kleint Reviewed-by: Alex Char Reviewed-by: Konstantin Ritt --- src/plugins/imageformats/dds/qddshandler.cpp | 18 ++++++++++-------- 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(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 -- cgit v1.2.3