From 5aedb778707f2707d66eb848276e8c2f0b4d447c Mon Sep 17 00:00:00 2001 From: ABBAPOH <ABBAPOH@nextmail.ru> Date: Fri, 13 Dec 2013 19:21:27 +0400 Subject: [PATCH] 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> --- 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 2b132b5f..428659fd 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 542bd357..582a0133 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 -- GitLab