Improve the UTF-16 and UTF-32 codecs with <qendian.h>

This is just the low-hanging fruit. Those algorithms could be much
further improved, but they are so seldom-used that it's not worth it.

Change-Id: I6a540578e810472bb455fffd15332b2a7a1ac901
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
This commit is contained in:
Thiago Macieira 2018-05-29 11:42:40 -05:00
parent d0427759c6
commit e79b56e504

View File

@ -756,26 +756,16 @@ QByteArray QUtf16::convertFromUnicode(const QChar *uc, int len, QTextCodec::Conv
char *data = d.data(); char *data = d.data();
if (!state || !(state->flags & QTextCodec::IgnoreHeader)) { if (!state || !(state->flags & QTextCodec::IgnoreHeader)) {
QChar bom(QChar::ByteOrderMark); QChar bom(QChar::ByteOrderMark);
if (endian == BigEndianness) { if (endian == BigEndianness)
data[0] = bom.row(); qToBigEndian(bom.unicode(), data);
data[1] = bom.cell(); else
} else { qToLittleEndian(bom.unicode(), data);
data[0] = bom.cell();
data[1] = bom.row();
}
data += 2; data += 2;
} }
if (endian == BigEndianness) { if (endian == BigEndianness)
for (int i = 0; i < len; ++i) { qToBigEndian<ushort>(uc, len, data);
*(data++) = uc[i].row(); else
*(data++) = uc[i].cell(); qToLittleEndian<ushort>(uc, len, data);
}
} else {
for (int i = 0; i < len; ++i) {
*(data++) = uc[i].cell();
*(data++) = uc[i].row();
}
}
if (state) { if (state) {
state->remainingChars = 0; state->remainingChars = 0;
@ -891,20 +881,14 @@ QByteArray QUtf32::convertFromUnicode(const QChar *uc, int len, QTextCodec::Conv
if (endian == BigEndianness) { if (endian == BigEndianness) {
while (i.hasNext()) { while (i.hasNext()) {
uint cp = i.next(); uint cp = i.next();
qToBigEndian(cp, data);
*(data++) = cp >> 24; data += 4;
*(data++) = (cp >> 16) & 0xff;
*(data++) = (cp >> 8) & 0xff;
*(data++) = cp & 0xff;
} }
} else { } else {
while (i.hasNext()) { while (i.hasNext()) {
uint cp = i.next(); uint cp = i.next();
qToLittleEndian(cp, data);
*(data++) = cp & 0xff; data += 4;
*(data++) = (cp >> 8) & 0xff;
*(data++) = (cp >> 16) & 0xff;
*(data++) = cp >> 24;
} }
} }