summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorABBAPOH <ABBAPOH@nextmail.ru>2013-12-13 19:21:27 +0400
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-12-16 11:47:46 +0100
commit5aedb778707f2707d66eb848276e8c2f0b4d447c (patch)
treefc915f35922cb6a18dbed2fbdd45742653600335
parent481275bf95128b71a2b70f99142a3e39a3b3507e (diff)
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>
-rw-r--r--src/plugins/imageformats/dds/qddshandler.cpp18
-rw-r--r--src/plugins/imageformats/dds/qddshandler.h10
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