Replace explicit surrogate handlers by inline methods of QChar class
Merge-request: 1284 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> (cherry picked from commit 50af55095afe1ba048dde357b771485ef2188778) Change-Id: I0b1967145ad62243afc2060a6ae4ca141a9609fd Reviewed-on: http://codereview.qt-project.org/4587 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
This commit is contained in:
parent
338244e9bf
commit
560e68e2bd
@ -90,8 +90,8 @@ QByteArray QUtf8::convertFromUnicode(const QChar *uc, int len, QTextCodec::Conve
|
||||
while (ch < end) {
|
||||
uint u = ch->unicode();
|
||||
if (surrogate_high >= 0) {
|
||||
if (u >= 0xdc00 && u < 0xe000) {
|
||||
u = (surrogate_high - 0xd800)*0x400 + (u - 0xdc00) + 0x10000;
|
||||
if (ch->isLowSurrogate()) {
|
||||
u = QChar::surrogateToUcs4(surrogate_high, u);
|
||||
surrogate_high = -1;
|
||||
} else {
|
||||
// high surrogate without low
|
||||
@ -101,13 +101,13 @@ QByteArray QUtf8::convertFromUnicode(const QChar *uc, int len, QTextCodec::Conve
|
||||
surrogate_high = -1;
|
||||
continue;
|
||||
}
|
||||
} else if (u >= 0xdc00 && u < 0xe000) {
|
||||
} else if (ch->isLowSurrogate()) {
|
||||
// low surrogate without high
|
||||
*cursor = replacement;
|
||||
++ch;
|
||||
++invalid;
|
||||
continue;
|
||||
} else if (u >= 0xd800 && u < 0xdc00) {
|
||||
} else if (ch->isHighSurrogate()) {
|
||||
surrogate_high = u;
|
||||
++ch;
|
||||
continue;
|
||||
|
@ -1381,11 +1381,11 @@ QString QKeySequencePrivate::encodeString(int key, QKeySequence::SequenceFormat
|
||||
QString p;
|
||||
|
||||
if (key && key < Qt::Key_Escape && key != Qt::Key_Space) {
|
||||
if (key < 0x10000) {
|
||||
p = QChar(key & 0xffff).toUpper();
|
||||
if (!QChar::requiresSurrogates(key)) {
|
||||
p = QChar(ushort(key)).toUpper();
|
||||
} else {
|
||||
p = QChar((key-0x10000)/0x400+0xd800);
|
||||
p += QChar((key-0x10000)%400+0xdc00);
|
||||
p += QChar(QChar::highSurrogate(key));
|
||||
p += QChar(QChar::lowSurrogate(key));
|
||||
}
|
||||
} else if (key >= Qt::Key_F1 && key <= Qt::Key_F35) {
|
||||
p = nativeText ? QShortcut::tr("F%1").arg(key - Qt::Key_F1 + 1)
|
||||
@ -1418,11 +1418,11 @@ NonSymbol:
|
||||
// Or else characters like Qt::Key_aring may not get displayed
|
||||
// (Really depends on you locale)
|
||||
if (!keyname[i].name) {
|
||||
if (key < 0x10000) {
|
||||
p = QChar(key & 0xffff).toUpper();
|
||||
if (!QChar::requiresSurrogates(key)) {
|
||||
p = QChar(ushort(key)).toUpper();
|
||||
} else {
|
||||
p = QChar((key-0x10000)/0x400+0xd800);
|
||||
p += QChar((key-0x10000)%400+0xdc00);
|
||||
p += QChar(QChar::highSurrogate(key));
|
||||
p += QChar(QChar::lowSurrogate(key));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1342,8 +1342,7 @@ bool QFontEngineMulti::stringToCMap(const QChar *str, int len,
|
||||
|
||||
int glyph_pos = 0;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
bool surrogate = (str[i].unicode() >= 0xd800 && str[i].unicode() < 0xdc00 && i < len-1
|
||||
&& str[i+1].unicode() >= 0xdc00 && str[i+1].unicode() < 0xe000);
|
||||
bool surrogate = (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate());
|
||||
|
||||
if (glyphs->glyphs[glyph_pos] == 0 && str[i].category() != QChar::Separator_Line) {
|
||||
QGlyphLayoutInstance tmp = glyphs->instance(glyph_pos);
|
||||
|
@ -1417,15 +1417,12 @@ void QFontEngineFT::getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_me
|
||||
|
||||
static inline unsigned int getChar(const QChar *str, int &i, const int len)
|
||||
{
|
||||
unsigned int uc = str[i].unicode();
|
||||
if (uc >= 0xd800 && uc < 0xdc00 && i < len-1) {
|
||||
uint low = str[i+1].unicode();
|
||||
if (low >= 0xdc00 && low < 0xe000) {
|
||||
uc = (uc - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
|
||||
++i;
|
||||
}
|
||||
uint ucs4 = str[i].unicode();
|
||||
if (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()) {
|
||||
++i;
|
||||
ucs4 = QChar::surrogateToUcs4(ucs4, str[i].unicode());
|
||||
}
|
||||
return uc;
|
||||
return ucs4;
|
||||
}
|
||||
|
||||
bool QFontEngineFT::canRender(const QChar *string, int len)
|
||||
|
@ -257,10 +257,8 @@ static OSStatus atsuPostLayoutCallback(ATSULayoutOperationSelector selector, ATS
|
||||
#if !defined(QT_NO_DEBUG)
|
||||
int surrogates = 0;
|
||||
const QChar *str = item->string;
|
||||
for (int i = item->from; i < item->from + item->length - 1; ++i) {
|
||||
surrogates += (str[i].unicode() >= 0xd800 && str[i].unicode() < 0xdc00
|
||||
&& str[i+1].unicode() >= 0xdc00 && str[i+1].unicode() < 0xe000);
|
||||
}
|
||||
for (int i = item->from; i < item->from + item->length - 1; ++i)
|
||||
surrogates += (str[i].isHighSurrogate() && str[i+1].isLowSurrogate());
|
||||
#endif
|
||||
for (nextCharStop = item->from; nextCharStop < item->from + item->length; ++nextCharStop)
|
||||
if (item->charAttributes[nextCharStop].charStop)
|
||||
@ -328,10 +326,8 @@ static OSStatus atsuPostLayoutCallback(ATSULayoutOperationSelector selector, ATS
|
||||
if (charOffset < item->length - 1) {
|
||||
QChar current = item->string[item->from + charOffset];
|
||||
QChar next = item->string[item->from + charOffset + 1];
|
||||
if (current.unicode() >= 0xd800 && current.unicode() < 0xdc00
|
||||
&& next.unicode() >= 0xdc00 && next.unicode() < 0xe000) {
|
||||
if (current.isHighSurrogate() && next.isLowSurrogate())
|
||||
item->log_clusters[charOffset + 1] = currentClusterGlyph;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -738,15 +734,12 @@ QFontEngineMac::~QFontEngineMac()
|
||||
|
||||
static inline unsigned int getChar(const QChar *str, int &i, const int len)
|
||||
{
|
||||
unsigned int uc = str[i].unicode();
|
||||
if (uc >= 0xd800 && uc < 0xdc00 && i < len-1) {
|
||||
uint low = str[i+1].unicode();
|
||||
if (low >= 0xdc00 && low < 0xe000) {
|
||||
uc = (uc - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
|
||||
++i;
|
||||
}
|
||||
uint ucs4 = str[i].unicode();
|
||||
if (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()) {
|
||||
++i;
|
||||
ucs4 = QChar::surrogateToUcs4(ucs4, str[i].unicode());
|
||||
}
|
||||
return uc;
|
||||
return ucs4;
|
||||
}
|
||||
|
||||
// Not used directly for shaping, only used to calculate m_averageCharWidth
|
||||
|
@ -226,15 +226,12 @@ QVariant QFontEngineQPA::extractHeaderField(const uchar *data, HeaderTag request
|
||||
|
||||
static inline unsigned int getChar(const QChar *str, int &i, const int len)
|
||||
{
|
||||
unsigned int uc = str[i].unicode();
|
||||
if (uc >= 0xd800 && uc < 0xdc00 && i < len-1) {
|
||||
uint low = str[i+1].unicode();
|
||||
if (low >= 0xdc00 && low < 0xe000) {
|
||||
uc = (uc - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
|
||||
++i;
|
||||
}
|
||||
uint ucs4 = str[i].unicode();
|
||||
if (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()) {
|
||||
++i;
|
||||
ucs4 = QChar::surrogateToUcs4(ucs4, str[i].unicode());
|
||||
}
|
||||
return uc;
|
||||
return ucs4;
|
||||
}
|
||||
|
||||
QFontEngineQPA::QFontEngineQPA(const QFontDef &def, const QByteArray &data)
|
||||
|
@ -278,15 +278,12 @@ QList<QByteArray> QFontEngineQPF::cleanUpAfterClientCrash(const QList<int> &cras
|
||||
|
||||
static inline unsigned int getChar(const QChar *str, int &i, const int len)
|
||||
{
|
||||
unsigned int uc = str[i].unicode();
|
||||
if (uc >= 0xd800 && uc < 0xdc00 && i < len-1) {
|
||||
uint low = str[i+1].unicode();
|
||||
if (low >= 0xdc00 && low < 0xe000) {
|
||||
uc = (uc - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
|
||||
++i;
|
||||
}
|
||||
uint ucs4 = str[i].unicode();
|
||||
if (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()) {
|
||||
++i;
|
||||
ucs4 = QChar::surrogateToUcs4(ucs4, str[i].unicode());
|
||||
}
|
||||
return uc;
|
||||
return ucs4;
|
||||
}
|
||||
#ifdef QT_FONTS_ARE_RESOURCES
|
||||
QFontEngineQPF::QFontEngineQPF(const QFontDef &def, const uchar *bytes, int size)
|
||||
|
@ -87,15 +87,12 @@ QT_END_INCLUDE_NAMESPACE
|
||||
|
||||
static inline unsigned int getChar(const QChar *str, int &i, const int len)
|
||||
{
|
||||
unsigned int uc = str[i].unicode();
|
||||
if (uc >= 0xd800 && uc < 0xdc00 && i < len-1) {
|
||||
uint low = str[i+1].unicode();
|
||||
if (low >= 0xdc00 && low < 0xe000) {
|
||||
uc = (uc - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
|
||||
++i;
|
||||
}
|
||||
uint ucs4 = str[i].unicode();
|
||||
if (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()) {
|
||||
++i;
|
||||
ucs4 = QChar::surrogateToUcs4(ucs4, str[i].unicode());
|
||||
}
|
||||
return uc;
|
||||
return ucs4;
|
||||
}
|
||||
|
||||
#define FM_SMOOTH 1
|
||||
|
@ -233,15 +233,12 @@ bool QSymbianTypeFaceExtras::symbianFontTableApiAvailable()
|
||||
// duplicated from qfontengine_xyz.cpp
|
||||
static inline unsigned int getChar(const QChar *str, int &i, const int len)
|
||||
{
|
||||
unsigned int uc = str[i].unicode();
|
||||
if (uc >= 0xd800 && uc < 0xdc00 && i < len-1) {
|
||||
uint low = str[i+1].unicode();
|
||||
if (low >= 0xdc00 && low < 0xe000) {
|
||||
uc = (uc - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
|
||||
++i;
|
||||
}
|
||||
uint ucs4 = str[i].unicode();
|
||||
if (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()) {
|
||||
++i;
|
||||
ucs4 = QChar::surrogateToUcs4(ucs4, str[i].unicode());
|
||||
}
|
||||
return uc;
|
||||
return ucs4;
|
||||
}
|
||||
|
||||
extern QString qt_symbian_fontNameWithAppFontMarker(const QString &fontName); // qfontdatabase_s60.cpp
|
||||
|
@ -224,15 +224,12 @@ void QFontEngineWin::getCMap()
|
||||
|
||||
inline unsigned int getChar(const QChar *str, int &i, const int len)
|
||||
{
|
||||
unsigned int uc = str[i].unicode();
|
||||
if (uc >= 0xd800 && uc < 0xdc00 && i < len-1) {
|
||||
uint low = str[i+1].unicode();
|
||||
if (low >= 0xdc00 && low < 0xe000) {
|
||||
uc = (uc - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
|
||||
++i;
|
||||
}
|
||||
uint ucs4 = str[i].unicode();
|
||||
if (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()) {
|
||||
++i;
|
||||
ucs4 = QChar::surrogateToUcs4(ucs4, str[i].unicode());
|
||||
}
|
||||
return uc;
|
||||
return ucs4;
|
||||
}
|
||||
|
||||
int QFontEngineWin::getGlyphIndexes(const QChar *str, int numChars, QGlyphLayout *glyphs, bool mirrored) const
|
||||
|
@ -358,9 +358,7 @@ bool QFontEngineXLFD::stringToCMap(const QChar *s, int len, QGlyphLayout *glyphs
|
||||
QVarLengthArray<ushort> _s(len);
|
||||
QChar *str = (QChar *)_s.data();
|
||||
for (int i = 0; i < len; ++i) {
|
||||
if (i < len - 1
|
||||
&& s[i].unicode() >= 0xd800 && s[i].unicode() < 0xdc00
|
||||
&& s[i+1].unicode() >= 0xdc00 && s[i].unicode() < 0xe000) {
|
||||
if (s[i].isHighSurrogate() && i < len-1 && s[i+1].isLowSurrogate()) {
|
||||
*str = QChar();
|
||||
++i;
|
||||
} else {
|
||||
|
@ -269,15 +269,12 @@ QFixed QFontEngineDirectWrite::emSquareSize() const
|
||||
|
||||
inline unsigned int getChar(const QChar *str, int &i, const int len)
|
||||
{
|
||||
unsigned int uc = str[i].unicode();
|
||||
if (uc >= 0xd800 && uc < 0xdc00 && i < len-1) {
|
||||
uint low = str[i+1].unicode();
|
||||
if (low >= 0xdc00 && low < 0xe000) {
|
||||
uc = (uc - 0xd800)*0x400 + (low - 0xdc00) + 0x10000;
|
||||
++i;
|
||||
}
|
||||
uint ucs4 = str[i].unicode();
|
||||
if (str[i].isHighSurrogate() && i < len-1 && str[i+1].isLowSurrogate()) {
|
||||
++i;
|
||||
ucs4 = QChar::surrogateToUcs4( ucs4, str[i].unicode());
|
||||
}
|
||||
return uc;
|
||||
return ucs4;
|
||||
}
|
||||
|
||||
bool QFontEngineDirectWrite::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs,
|
||||
|
@ -1511,11 +1511,11 @@ void QTextCursor::deletePreviousChar()
|
||||
const QTextFragmentData * const frag = fragIt.value();
|
||||
int fpos = fragIt.position();
|
||||
QChar uc = d->priv->buffer().at(d->anchor - fpos + frag->stringPosition);
|
||||
if (d->anchor > fpos && uc.unicode() >= 0xdc00 && uc.unicode() < 0xe000) {
|
||||
if (d->anchor > fpos && uc.isLowSurrogate()) {
|
||||
// second half of a surrogate, check if we have the first half as well,
|
||||
// if yes delete both at once
|
||||
uc = d->priv->buffer().at(d->anchor - 1 - fpos + frag->stringPosition);
|
||||
if (uc.unicode() >= 0xd800 && uc.unicode() < 0xdc00)
|
||||
if (uc.isHighSurrogate())
|
||||
--d->anchor;
|
||||
}
|
||||
|
||||
|
@ -993,8 +993,7 @@ static void heuristicSetGlyphAttributes(const QChar *uc, int length, QGlyphLayou
|
||||
|
||||
int glyph_pos = 0;
|
||||
for (int i = 0; i < length; i++) {
|
||||
if (uc[i].unicode() >= 0xd800 && uc[i].unicode() < 0xdc00 && i < length-1
|
||||
&& uc[i+1].unicode() >= 0xdc00 && uc[i+1].unicode() < 0xe000) {
|
||||
if (uc[i].isHighSurrogate() && i < length-1 && uc[i+1].isLowSurrogate()) {
|
||||
logClusters[i] = glyph_pos;
|
||||
logClusters[++i] = glyph_pos;
|
||||
} else {
|
||||
|
@ -820,15 +820,11 @@ QString QTextHtmlParser::parseEntity()
|
||||
if (uc >= 0x80 && uc < 0x80 + (sizeof(windowsLatin1ExtendedCharacters)/sizeof(windowsLatin1ExtendedCharacters[0])))
|
||||
uc = windowsLatin1ExtendedCharacters[uc - 0x80];
|
||||
QString str;
|
||||
if (uc > 0xffff) {
|
||||
// surrogate pair
|
||||
uc -= 0x10000;
|
||||
ushort high = uc/0x400 + 0xd800;
|
||||
ushort low = uc%0x400 + 0xdc00;
|
||||
str.append(QChar(high));
|
||||
str.append(QChar(low));
|
||||
if (QChar::requiresSurrogates(uc)) {
|
||||
str += QChar(QChar::highSurrogate(uc));
|
||||
str += QChar(QChar::lowSurrogate(uc));
|
||||
} else {
|
||||
str.append(QChar(uc));
|
||||
str = QChar(uc);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
@ -217,12 +217,10 @@ void QLineControl::backspace()
|
||||
--m_cursor;
|
||||
if (m_maskData)
|
||||
m_cursor = prevMaskBlank(m_cursor);
|
||||
QChar uc = m_text.at(m_cursor);
|
||||
if (m_cursor > 0 && uc.unicode() >= 0xdc00 && uc.unicode() < 0xe000) {
|
||||
if (m_cursor > 0 && m_text.at(m_cursor).isLowSurrogate()) {
|
||||
// second half of a surrogate, check if we have the first half as well,
|
||||
// if yes delete both at once
|
||||
uc = m_text.at(m_cursor - 1);
|
||||
if (uc.unicode() >= 0xd800 && uc.unicode() < 0xdc00) {
|
||||
if (m_text.at(m_cursor - 1).isHighSurrogate()) {
|
||||
internalDelete(true);
|
||||
--m_cursor;
|
||||
}
|
||||
|
@ -108,10 +108,10 @@ QByteArray QGb18030Codec::convertFromUnicode(const QChar *uc, int len, Converter
|
||||
int len;
|
||||
uchar buf[4];
|
||||
if (high >= 0) {
|
||||
if (ch >= 0xdc00 && ch < 0xe000) {
|
||||
if (uc[i].isLowSurrogate()) {
|
||||
// valid surrogate pair
|
||||
++i;
|
||||
uint u = (high-0xd800)*0x400+(ch-0xdc00)+0x10000;
|
||||
uint u = QChar::surrogateToUcs4(high, uc[i].unicode());
|
||||
len = qt_UnicodeToGb18030(u, buf);
|
||||
if (len >= 2) {
|
||||
for (int j=0; j<len; j++)
|
||||
@ -129,10 +129,10 @@ QByteArray QGb18030Codec::convertFromUnicode(const QChar *uc, int len, Converter
|
||||
}
|
||||
}
|
||||
|
||||
if (ch < 0x80) {
|
||||
if (IsLatin(ch)) {
|
||||
// ASCII
|
||||
*cursor++ = ch;
|
||||
} else if ((ch >= 0xd800 && ch < 0xdc00)) {
|
||||
} else if (uc[i].isHighSurrogate()) {
|
||||
// surrogates area. check for correct encoding
|
||||
// we need at least one more character, first the high surrogate, then the low one
|
||||
high = ch;
|
||||
@ -181,7 +181,7 @@ QString QGb18030Codec::convertToUnicode(const char* chars, int len, ConverterSta
|
||||
uchar ch = chars[i];
|
||||
switch (nbuf) {
|
||||
case 0:
|
||||
if (ch < 0x80) {
|
||||
if (IsLatin(ch)) {
|
||||
// ASCII
|
||||
resultData[unicodeLen] = ch;
|
||||
++unicodeLen;
|
||||
@ -339,7 +339,7 @@ QString QGbkCodec::convertToUnicode(const char* chars, int len, ConverterState *
|
||||
uchar ch = chars[i];
|
||||
switch (nbuf) {
|
||||
case 0:
|
||||
if (ch < 0x80) {
|
||||
if (IsLatin(ch)) {
|
||||
// ASCII
|
||||
resultData[unicodeLen] = ch;
|
||||
++unicodeLen;
|
||||
@ -487,7 +487,7 @@ QString QGb2312Codec::convertToUnicode(const char* chars, int len, ConverterStat
|
||||
uchar ch = chars[i];
|
||||
switch (nbuf) {
|
||||
case 0:
|
||||
if (ch < 0x80) {
|
||||
if (IsLatin(ch)) {
|
||||
// ASCII
|
||||
resultData[unicodeLen] = ch;
|
||||
++unicodeLen;
|
||||
|
Loading…
Reference in New Issue
Block a user