From e20a8c69a761a9771ead99eed1abd38f4eeca38a Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Mon, 19 Jan 2015 12:58:36 +0100 Subject: [PATCH] D-Bus tray icons: make endian conversion work again Endian conversion needs to be done on aligned data, but the data is stored unaligned in the QByteArray. So the new qFromUnaligned() function is needed. Change-Id: I12f9e52cea81d06129b306709bb9d2cd004f04e1 Reviewed-by: Thiago Macieira --- src/platformsupport/dbustray/qdbustraytypes.cpp | 15 +++++++-------- src/platformsupport/dbustray/qdbustraytypes_p.h | 3 +++ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/platformsupport/dbustray/qdbustraytypes.cpp b/src/platformsupport/dbustray/qdbustraytypes.cpp index de0c3c30a6..b954ffe412 100644 --- a/src/platformsupport/dbustray/qdbustraytypes.cpp +++ b/src/platformsupport/dbustray/qdbustraytypes.cpp @@ -93,14 +93,13 @@ QXdgDBusImageVector iconToQXdgDBusImageVector(const QIcon &icon) painter.drawImage((maxSize - im.width()) / 2, (maxSize - im.height()) / 2, im); im = padded; } - QXdgDBusImageStruct kim; - kim.width = im.width(); - kim.height = im.height(); - kim.data = QByteArray(reinterpret_cast(im.constBits()), im.byteCount()); - if (QSysInfo::ByteOrder == QSysInfo::LittleEndian) { - for (char *ptr = kim.data.begin(); ptr < kim.data.end(); ptr += 4) - qToUnaligned(qToBigEndian(*ptr), reinterpret_cast(ptr)); - } + // copy and endian-convert + QXdgDBusImageStruct kim(im.width(), im.height()); + const uchar *end = im.constBits() + im.byteCount(); + uchar *dest = reinterpret_cast(kim.data.data()); + for (const uchar *src = im.constBits(); src < end; src += 4, dest += 4) + qToUnaligned(qToBigEndian(qFromUnaligned(src)), dest); + ret << kim; } return ret; diff --git a/src/platformsupport/dbustray/qdbustraytypes_p.h b/src/platformsupport/dbustray/qdbustraytypes_p.h index 2e1421eccd..c7f8ec0c30 100644 --- a/src/platformsupport/dbustray/qdbustraytypes_p.h +++ b/src/platformsupport/dbustray/qdbustraytypes_p.h @@ -49,6 +49,9 @@ QT_BEGIN_NAMESPACE // Custom message type to send icons across D-Bus struct QXdgDBusImageStruct { + QXdgDBusImageStruct() { } + QXdgDBusImageStruct(int w, int h) + : width(w), height(h), data(width * height * 4, 0) { } int width; int height; QByteArray data;