summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Burchell <robin+qt@viroteck.net>2014-05-31 11:51:44 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-06-05 19:10:58 +0200
commit9e01483cdfff068517e29c674e0332818e76cb21 (patch)
treea843f62d0bd1f2ceb23f3715ded6867e71b234ea
parent3b00497d50a022a359cce59696195dce43615b00 (diff)
Make the ICO image handler capable of reading CUR files too.
This simple patch was an unfortunate victim of the Gitorious to Gerrit transition. (https://qt.gitorious.org/qt/qt/merge_requests/1179) As noted in the Gitorious review, a small bug in readHeader is also fixed: || instead of &&. Done-with: Pali Rohár Task-number: QTBUG-12684 Change-Id: I1fe16359b9b68c10e518904c6a5c58b00fb7379b Reviewed-by: Yoann Lopes <yoann.lopes@digia.com>
-rw-r--r--src/plugins/imageformats/ico/ico.json2
-rw-r--r--src/plugins/imageformats/ico/main.cpp2
-rw-r--r--src/plugins/imageformats/ico/qicohandler.cpp10
-rw-r--r--tests/auto/gui/image/qicoimageformat/icons/valid/yellow.curbin0 -> 4286 bytes
-rw-r--r--tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp19
5 files changed, 22 insertions, 11 deletions
diff --git a/src/plugins/imageformats/ico/ico.json b/src/plugins/imageformats/ico/ico.json
index bd46e07e54..14093ee471 100644
--- a/src/plugins/imageformats/ico/ico.json
+++ b/src/plugins/imageformats/ico/ico.json
@@ -1,4 +1,4 @@
{
- "Keys": [ "ico" ],
+ "Keys": [ "ico", "cur" ],
"MimeTypes": [ "image/vnd.microsoft.icon" ]
}
diff --git a/src/plugins/imageformats/ico/main.cpp b/src/plugins/imageformats/ico/main.cpp
index 05e6e1885c..2ff2f36fdc 100644
--- a/src/plugins/imageformats/ico/main.cpp
+++ b/src/plugins/imageformats/ico/main.cpp
@@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE
QImageIOPlugin::Capabilities QICOPlugin::capabilities(QIODevice *device, const QByteArray &format) const
{
- if (format == "ico")
+ if (format == "ico" || format == "cur")
return Capabilities(CanRead | CanWrite);
if (!format.isEmpty())
return 0;
diff --git a/src/plugins/imageformats/ico/qicohandler.cpp b/src/plugins/imageformats/ico/qicohandler.cpp
index 77bb727a51..b65bcdfacb 100644
--- a/src/plugins/imageformats/ico/qicohandler.cpp
+++ b/src/plugins/imageformats/ico/qicohandler.cpp
@@ -75,7 +75,7 @@ typedef struct
typedef struct
{
quint16 idReserved; // Reserved
- quint16 idType; // resource type (1 for icons)
+ quint16 idType; // resource type (1 for icons, 2 for cursors)
quint16 idCount; // how many images?
ICONDIRENTRY idEntries[1]; // the entries for each image
} ICONDIR, *LPICONDIR;
@@ -275,10 +275,10 @@ bool ICOReader::canRead(QIODevice *iodev)
readBytes += ICONDIRENTRY_SIZE;
// ICO format does not have a magic identifier, so we read 6 different values, which will hopefully be enough to identify the file.
if ( ikonDir.idReserved == 0
- && ikonDir.idType == 1
+ && (ikonDir.idType == 1 || ikonDir.idType == 2)
&& ikonDir.idEntries[0].bReserved == 0
- && ikonDir.idEntries[0].wPlanes <= 1
- && ikonDir.idEntries[0].wBitCount <= 32 // Bits per pixel
+ && (ikonDir.idEntries[0].wPlanes <= 1 || ikonDir.idType == 2)
+ && (ikonDir.idEntries[0].wBitCount <= 32 || ikonDir.idType == 2) // Bits per pixel
&& ikonDir.idEntries[0].dwBytesInRes >= 40 // Must be over 40, since sizeof (infoheader) == 40
) {
isProbablyICO = true;
@@ -339,7 +339,7 @@ bool ICOReader::readHeader()
if (iod && !headerRead) {
startpos = iod->pos();
if (readIconDir(iod, &iconDir)) {
- if (iconDir.idReserved == 0 || iconDir.idType == 1)
+ if (iconDir.idReserved == 0 && (iconDir.idType == 1 || iconDir.idType == 2))
headerRead = true;
}
}
diff --git a/tests/auto/gui/image/qicoimageformat/icons/valid/yellow.cur b/tests/auto/gui/image/qicoimageformat/icons/valid/yellow.cur
new file mode 100644
index 0000000000..0a649aa7f7
--- /dev/null
+++ b/tests/auto/gui/image/qicoimageformat/icons/valid/yellow.cur
Binary files differ
diff --git a/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp b/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp
index cd9d4b448e..71adbabb84 100644
--- a/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp
+++ b/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp
@@ -111,9 +111,17 @@ void tst_QIcoImageFormat::cleanupTestCase()
void tst_QIcoImageFormat::format()
{
- QImageReader reader(m_IconPath + "/valid/35FLOPPY.ICO", "ico");
- QByteArray fmt = reader.format();
- QCOMPARE(const_cast<const char*>(fmt.data()), "ico" );
+ {
+ QImageReader reader(m_IconPath + "/valid/35FLOPPY.ICO", "ico");
+ QByteArray fmt = reader.format();
+ QCOMPARE(const_cast<const char*>(fmt.data()), "ico" );
+ }
+
+ {
+ QImageReader reader(m_IconPath + "/valid/yellow.cur", "ico");
+ QByteArray fmt = reader.format();
+ QCOMPARE(const_cast<const char*>(fmt.data()), "ico" );
+ }
}
void tst_QIcoImageFormat::canRead_data()
@@ -133,6 +141,7 @@ void tst_QIcoImageFormat::canRead_data()
QTest::newRow("103x16px, 24BPP") << "valid/trolltechlogo_tiny.ico" << 1;
QTest::newRow("includes 32BPP w/alpha") << "valid/semitransparent.ico" << 1;
QTest::newRow("PNG compression") << "valid/Qt.ico" << 1;
+ QTest::newRow("CUR file") << "valid/yellow.cur" << 1;
}
void tst_QIcoImageFormat::canRead()
@@ -203,7 +212,7 @@ void tst_QIcoImageFormat::imageCount_data()
QTest::newRow("invalid floppy (first 8 bytes = 0xff)") << "invalid/35floppy.ico" << 0;
QTest::newRow("includes 32BPP w/alpha") << "valid/semitransparent.ico" << 9;
QTest::newRow("PNG compression") << "valid/Qt.ico" << 4;
-
+ QTest::newRow("CUR file") << "valid/yellow.cur" << 1;
}
void tst_QIcoImageFormat::imageCount()
@@ -231,6 +240,7 @@ void tst_QIcoImageFormat::jumpToNextImage_data()
QTest::newRow("16px16c, 32px32c, 32px256c 2") << "valid/WORLDH.ico" << 3;
QTest::newRow("includes 32BPP w/alpha") << "valid/semitransparent.ico" << 9;
QTest::newRow("PNG compression") << "valid/Qt.ico" << 4;
+ QTest::newRow("CUR file") << "valid/yellow.cur" << 1;
}
void tst_QIcoImageFormat::jumpToNextImage()
@@ -281,6 +291,7 @@ void tst_QIcoImageFormat::nextImageDelay_data()
QTest::newRow("invalid floppy (first 8 bytes = 0xff)") << "invalid/35floppy.ico" << -1;
QTest::newRow("includes 32BPP w/alpha") << "valid/semitransparent.ico" << 9;
QTest::newRow("PNG compression") << "valid/Qt.ico" << 4;
+ QTest::newRow("CUR file") << "valid/yellow.cur" << 1;
}
void tst_QIcoImageFormat::nextImageDelay()