src/gui/image/qimagereader.cpp
changeset 18 2f34d5167611
parent 0 1918ee327afb
child 30 5dc02b23752f
--- a/src/gui/image/qimagereader.cpp	Tue Feb 02 00:43:10 2010 +0200
+++ b/src/gui/image/qimagereader.cpp	Fri Apr 16 15:50:13 2010 +0300
@@ -1,6 +1,6 @@
 /****************************************************************************
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
 ** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
@@ -263,25 +263,37 @@
             device->seek(pos);
     }
 
-    if (!handler && !testFormat.isEmpty() && autoDetectImageFormat && !ignoresFormatAndExtension) {
+    if (!handler && !testFormat.isEmpty() && !ignoresFormatAndExtension) {
         // check if any plugin supports the format (they are not allowed to
         // read from the device yet).
         const qint64 pos = device ? device->pos() : 0;
-        for (int i = 0; i < keys.size(); ++i) {
-            if (i != suffixPluginIndex) {
-                QImageIOPlugin *plugin = qobject_cast<QImageIOPlugin *>(l->instance(keys.at(i)));
-                if (plugin && plugin->capabilities(device, testFormat) & QImageIOPlugin::CanRead) {
+
+        if (autoDetectImageFormat) {
+            for (int i = 0; i < keys.size(); ++i) {
+                if (i != suffixPluginIndex) {
+                    QImageIOPlugin *plugin = qobject_cast<QImageIOPlugin *>(l->instance(keys.at(i)));
+                    if (plugin && plugin->capabilities(device, testFormat) & QImageIOPlugin::CanRead) {
 #ifdef QIMAGEREADER_DEBUG
-                    qDebug() << "QImageReader::createReadHandler: the" << keys.at(i) << "plugin can read this format";
+                        qDebug() << "QImageReader::createReadHandler: the" << keys.at(i) << "plugin can read this format";
 #endif
-                    handler = plugin->create(device, testFormat);
-                    break;
+                        handler = plugin->create(device, testFormat);
+                        break;
+                    }
                 }
             }
+        } else {
+            QImageIOPlugin *plugin = qobject_cast<QImageIOPlugin *>(l->instance(QLatin1String(testFormat)));
+            if (plugin && plugin->capabilities(device, testFormat) & QImageIOPlugin::CanRead) {
+#ifdef QIMAGEREADER_DEBUG
+                qDebug() << "QImageReader::createReadHandler: the" << testFormat << "plugin can read this format";
+#endif
+                handler = plugin->create(device, testFormat);
+            }
         }
         if (device && !device->isSequential())
             device->seek(pos);
     }
+
 #endif // QT_NO_LIBRARY
 
     // if we don't have a handler yet, check if we have built-in support for
@@ -471,7 +483,6 @@
     handler = 0;
     quality = -1;
     imageReaderError = QImageReader::UnknownError;
-    errorString = QLatin1String(QT_TRANSLATE_NOOP(QImageReader, "Unknown error"));
 
     q = qq;
 }
@@ -1214,11 +1225,12 @@
 }
 
 /*!
-    For image formats that support animation, this function returns
-    the number of times the animation should loop. Otherwise, it
-    returns -1.
+    For image formats that support animation, this function returns the number
+    of times the animation should loop. If this function returns -1, it can
+    either mean the animation should loop forever, or that an error occurred.
+    If an error occurred, canRead() will return false.
 
-    \sa supportsAnimation(), QImageIOHandler::loopCount()
+    \sa supportsAnimation(), QImageIOHandler::loopCount(), canRead()
 */
 int QImageReader::loopCount() const
 {
@@ -1228,13 +1240,13 @@
 }
 
 /*!
-    For image formats that support animation, this function returns
-    the total number of images in the animation.
+    For image formats that support animation, this function returns the total
+    number of images in the animation. If the format does not support
+    animation, 0 is returned.
 
-    Certain animation formats do not support this feature, in which
-    case 0 is returned.
+    This function returns -1 if an error occurred.
 
-    \sa supportsAnimation(), QImageIOHandler::imageCount()
+    \sa supportsAnimation(), QImageIOHandler::imageCount(), canRead()
 */
 int QImageReader::imageCount() const
 {
@@ -1244,11 +1256,13 @@
 }
 
 /*!
-    For image formats that support animation, this function returns
-    the number of milliseconds to wait until displaying the next frame
-    in the animation. Otherwise, 0 is returned.
+    For image formats that support animation, this function returns the number
+    of milliseconds to wait until displaying the next frame in the animation.
+    If the image format doesn't support animation, 0 is returned.
 
-    \sa supportsAnimation(), QImageIOHandler::nextImageDelay()
+    This function returns -1 if an error occurred.
+
+    \sa supportsAnimation(), QImageIOHandler::nextImageDelay(), canRead()
 */
 int QImageReader::nextImageDelay() const
 {
@@ -1258,11 +1272,13 @@
 }
 
 /*!
-    For image formats that support animation, this function returns
-    the sequence number of the current frame. Otherwise, -1 is
-    returned.
+    For image formats that support animation, this function returns the
+    sequence number of the current frame. If the image format doesn't support
+    animation, 0 is returned.
 
-    \sa supportsAnimation(), QImageIOHandler::currentImageNumber()
+    This function returns -1 if an error occurred.
+
+    \sa supportsAnimation(), QImageIOHandler::currentImageNumber(), canRead()
 */
 int QImageReader::currentImageNumber() const
 {
@@ -1302,6 +1318,8 @@
 */
 QString QImageReader::errorString() const
 {
+    if (d->errorString.isEmpty())
+        return QLatin1String(QT_TRANSLATE_NOOP(QImageReader, "Unknown error"));
     return d->errorString;
 }