diff options
author | Benjamin Poulain <benjamin.poulain@nokia.com> | 2010-06-25 14:05:25 (GMT) |
---|---|---|
committer | Benjamin Poulain <benjamin.poulain@nokia.com> | 2010-06-25 14:08:42 (GMT) |
commit | 860094d4e2614c0926f2af0e3538412ece31f726 (patch) | |
tree | 1f634b4db962e3a4fd07228e7ea41253ba51e3cd | |
parent | 075648e46650797f2b520f98513a7aed9f0ffec7 (diff) | |
download | Qt-860094d4e2614c0926f2af0e3538412ece31f726.zip Qt-860094d4e2614c0926f2af0e3538412ece31f726.tar.gz Qt-860094d4e2614c0926f2af0e3538412ece31f726.tar.bz2 |
Avoid memory allocation when converting from Gbk to unicode.
This change is the equivalent of
19e1b32bdeeeb5c7865038cab97b40dbac0e6c42 and
987458462994497f764baf253baca0faabdb63cc but for the Gbk case.
It improve performance by avoiding the constructor of QChar and
by allocating the memory once instead of doing it for each
character.
This also fix QTBUG-11704.
Reviewed-by: Andreas Kling
-rw-r--r-- | src/plugins/codecs/cn/qgb18030codec.cpp | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/plugins/codecs/cn/qgb18030codec.cpp b/src/plugins/codecs/cn/qgb18030codec.cpp index 3f2eec7..e10c8b1 100644 --- a/src/plugins/codecs/cn/qgb18030codec.cpp +++ b/src/plugins/codecs/cn/qgb18030codec.cpp @@ -319,7 +319,7 @@ QString QGbkCodec::convertToUnicode(const char* chars, int len, ConverterState * { uchar buf[2]; int nbuf = 0; - QChar replacement = QChar::ReplacementCharacter; + ushort replacement = QChar::ReplacementCharacter; if (state) { if (state->flags & ConvertInvalidToNull) replacement = QChar::Null; @@ -330,6 +330,9 @@ QString QGbkCodec::convertToUnicode(const char* chars, int len, ConverterState * int invalid = 0; QString result; + result.resize(len); + int unicodeLen = 0; + ushort *const resultData = reinterpret_cast<ushort*>(result.data()); //qDebug("QGbkDecoder::toUnicode(const char* chars = \"%s\", int len = %d)", chars, len); for (int i=0; i<len; i++) { @@ -338,14 +341,16 @@ QString QGbkCodec::convertToUnicode(const char* chars, int len, ConverterState * case 0: if (ch < 0x80) { // ASCII - result += QLatin1Char(ch); + resultData[unicodeLen] = ch; + ++unicodeLen; } else if (Is1stByte(ch)) { // GBK 1st byte? buf[0] = ch; nbuf = 1; } else { // Invalid - result += replacement; + resultData[unicodeLen] = replacement; + ++unicodeLen; ++invalid; } break; @@ -356,21 +361,25 @@ QString QGbkCodec::convertToUnicode(const char* chars, int len, ConverterState * int clen = 2; uint u = qt_Gb18030ToUnicode(buf, clen); if (clen == 2) { - result += qValidChar(u); + resultData[unicodeLen] = qValidChar(static_cast<ushort>(u)); + ++unicodeLen; } else { - result += replacement; + resultData[unicodeLen] = replacement; + ++unicodeLen; ++invalid; } nbuf = 0; } else { // Error - result += replacement; + resultData[unicodeLen] = replacement; + ++unicodeLen; ++invalid; nbuf = 0; } break; } } + result.resize(unicodeLen); if (state) { state->remainingChars = nbuf; |