From 408ca46193f70ff66d060f7b7c506a97fee945e2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Trond=20Kjern=C3=A5sen?= <trond@trolltech.com>
Date: Thu, 28 May 2009 15:07:01 +0200
Subject: Fixed a problem with streaming QIcons containing multiple pixmaps.

If pixmaps were added through QIcon::addFile() with different sizes
than the sizes of the pixmaps themselves, streaming the icon in didn't
work properly.

Task-number: 254374
Reviewed-by: Kim
---
 src/gui/image/qicon.cpp        |  9 ++++++---
 tests/auto/qicon/tst_qicon.cpp | 43 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 3 deletions(-)

diff --git a/src/gui/image/qicon.cpp b/src/gui/image/qicon.cpp
index a880a13..0799ea7 100644
--- a/src/gui/image/qicon.cpp
+++ b/src/gui/image/qicon.cpp
@@ -428,10 +428,13 @@ bool QPixmapIconEngine::read(QDataStream &in)
         in >> sz;
         in >> mode;
         in >> state;
-        if (pm.isNull())
+        if (pm.isNull()) {
             addFile(fileName, sz, QIcon::Mode(mode), QIcon::State(state));
-        else
-            addPixmap(pm, QIcon::Mode(mode), QIcon::State(state));
+        } else {
+            QPixmapIconEngineEntry pe(fileName, sz, QIcon::Mode(mode), QIcon::State(state));
+            pe.pixmap = pm;
+            pixmaps += pe;
+        }
     }
     return true;
 }
diff --git a/tests/auto/qicon/tst_qicon.cpp b/tests/auto/qicon/tst_qicon.cpp
index 4e9a880..1dd223f 100644
--- a/tests/auto/qicon/tst_qicon.cpp
+++ b/tests/auto/qicon/tst_qicon.cpp
@@ -72,6 +72,8 @@ private slots:
     void svg();
     void addFile();
     void availableSizes();
+    void streamAvailableSizes_data();
+    void streamAvailableSizes();
 
     void task184901_badCache();
     void task223279_inconsistentAddFile();
@@ -540,6 +542,47 @@ void tst_QIcon::availableSizes()
     }
 }
 
+void tst_QIcon::streamAvailableSizes_data()
+{
+    QTest::addColumn<QIcon>("icon");
+
+    QIcon icon;
+    icon.addFile(":/image.png", QSize(32,32));
+    QTest::newRow( "32x32" ) << icon;
+    icon.addFile(":/image.png", QSize(64,64));
+    QTest::newRow( "64x64" ) << icon;
+    icon.addFile(":/image.png", QSize(128,128));
+    QTest::newRow( "128x128" ) << icon;
+    icon.addFile(":/image.png", QSize(256,256));
+    QTest::newRow( "256x256" ) << icon;
+}
+
+void tst_QIcon::streamAvailableSizes()
+{
+    QFETCH(QIcon, icon);
+
+    QByteArray ba;
+    // write to QByteArray
+    {
+        QBuffer buffer(&ba);
+        buffer.open(QIODevice::WriteOnly);
+        QDataStream stream(&buffer);
+        stream << icon;
+    }
+
+    // read from QByteArray
+    {
+        QBuffer buffer(&ba);
+        buffer.open(QIODevice::ReadOnly);
+        QDataStream stream(&buffer);
+        QIcon i;
+        stream >> i;
+        QCOMPARE(i.isNull(), icon.isNull());
+        QCOMPARE(i.availableSizes(), icon.availableSizes());
+    }
+}
+
+
 static inline bool operator<(const QSize &lhs, const QSize &rhs)
 {
     if (lhs.width() < rhs.width())
-- 
cgit v0.12