From d3ac35fdc0d5580946f886208e081634cbef6fbb Mon Sep 17 00:00:00 2001
From: aavit <qt-info@nokia.com>
Date: Wed, 24 Nov 2010 15:01:42 +0100
Subject: Stream raw image data instead of PNG: more info, and faster.

---
 tests/arthur/common/baselineprotocol.cpp | 47 ++++++++++++++++++++++++++++++--
 tests/arthur/common/baselineprotocol.h   |  7 +++--
 2 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/tests/arthur/common/baselineprotocol.cpp b/tests/arthur/common/baselineprotocol.cpp
index 6d26e9a..5ed58b4 100644
--- a/tests/arthur/common/baselineprotocol.cpp
+++ b/tests/arthur/common/baselineprotocol.cpp
@@ -206,10 +206,52 @@ QString ImageItem::formatAsString() const
     return QLS(formatNames[renderFormat]);
 }
 
+void ImageItem::writeImageToStream(QDataStream &out) const
+{
+    if (image.isNull() || image.format() == QImage::Format_Invalid) {
+        out << quint8(0);
+        return;
+    }
+    out << quint8('Q') << quint8(image.format());
+    out << quint8(QSysInfo::ByteOrder) << quint8(0);       // pad to multiple of 4 bytes
+    out << quint32(image.width()) << quint32(image.height()) << quint32(image.bytesPerLine());
+    out << qCompress((const uchar *)image.constBits(), image.byteCount());
+    //# can be followed by colormap for formats that use it
+}
+
+void ImageItem::readImageFromStream(QDataStream &in)
+{
+    quint8 hdr, fmt, endian, pad;
+    quint32 width, height, bpl;
+    QByteArray data;
+
+    in >> hdr;
+    if (hdr != 'Q') {
+        image = QImage();
+        return;
+    }
+    in >> fmt >> endian >> pad;
+    if (!fmt || fmt >= QImage::NImageFormats) {
+        image = QImage();
+        return;
+    }
+    if (endian != QSysInfo::ByteOrder) {
+        qWarning("ImageItem cannot read streamed image with different endianness");
+        image = QImage();
+        return;
+    }
+    in >> width >> height >> bpl;
+    in >> data;
+    data = qUncompress(data);
+    QImage res((const uchar *)data.constData(), width, height, bpl, QImage::Format(fmt));
+    image = res.copy();  //# yuck, seems there is currently no way to avoid data copy
+}
+
 QDataStream & operator<< (QDataStream &stream, const ImageItem &ii)
 {
     stream << ii.scriptName << ii.scriptChecksum << quint8(ii.status) << quint8(ii.renderFormat)
-           << quint8(ii.engine) << ii.image << ii.imageChecksums;
+           << quint8(ii.engine) << ii.imageChecksums;
+    ii.writeImageToStream(stream);
     return stream;
 }
 
@@ -217,10 +259,11 @@ QDataStream & operator>> (QDataStream &stream, ImageItem &ii)
 {
     quint8 encFormat, encStatus, encEngine;
     stream >> ii.scriptName >> ii.scriptChecksum >> encStatus >> encFormat
-           >> encEngine >> ii.image >> ii.imageChecksums;
+           >> encEngine >> ii.imageChecksums;
     ii.renderFormat = QImage::Format(encFormat);
     ii.status = ImageItem::ItemStatus(encStatus);
     ii.engine = ImageItem::GraphicsEngine(encEngine);
+    ii.readImageFromStream(stream);
     return stream;
 }
 
diff --git a/tests/arthur/common/baselineprotocol.h b/tests/arthur/common/baselineprotocol.h
index 9f59454..baffb4a 100644
--- a/tests/arthur/common/baselineprotocol.h
+++ b/tests/arthur/common/baselineprotocol.h
@@ -84,6 +84,9 @@ public:
     QString engineAsString() const;
     QString formatAsString() const;
 
+    void writeImageToStream(QDataStream &stream) const;
+    void readImageFromStream(QDataStream &stream);
+
     enum ItemStatus {
         Ok = 0,
         BaselineNotFound = 1,
@@ -105,7 +108,7 @@ public:
     quint16 scriptChecksum;
 };
 QDataStream & operator<< (QDataStream &stream, const ImageItem &ii);
-QDataStream & operator>> (QDataStream& stream, ImageItem& ii);
+QDataStream & operator>> (QDataStream &stream, ImageItem& ii);
 
 Q_DECLARE_METATYPE(ImageItem);
 
@@ -121,7 +124,7 @@ public:
     // Important constants here
     // ****************************************************
     enum Constant {
-        ProtocolVersion = 2,
+        ProtocolVersion = 3,
         ServerPort = 54129,
         Timeout = 5000
     };
-- 
cgit v0.12