diff options
Diffstat (limited to 'src/corelib/tools/qtextboundaryfinder.cpp')
-rw-r--r-- | src/corelib/tools/qtextboundaryfinder.cpp | 39 |
1 files changed, 12 insertions, 27 deletions
diff --git a/src/corelib/tools/qtextboundaryfinder.cpp b/src/corelib/tools/qtextboundaryfinder.cpp index 51b4ece4b1..5e8aed579d 100644 --- a/src/corelib/tools/qtextboundaryfinder.cpp +++ b/src/corelib/tools/qtextboundaryfinder.cpp @@ -53,39 +53,24 @@ public: static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int length, QCharAttributes *attributes) { + const ushort *string = reinterpret_cast<const ushort *>(chars); + QVarLengthArray<QUnicodeTools::ScriptItem> scriptItems; + { + QVarLengthArray<uchar> scripts(length); - const ushort *string = reinterpret_cast<const ushort *>(chars); - const ushort *unicode = string; - // correctly assign script, isTab and isObject to the script analysis - const ushort *uc = unicode; - const ushort *e = uc + length; - uchar script = QChar::Script_Common; - uchar lastScript = QChar::Script_Common; - const ushort *start = uc; - while (uc < e) { - int s = QChar::script(*uc); - if (s != QChar::Script_Inherited) - script = s; - if (*uc == QChar::ObjectReplacementCharacter || *uc == QChar::LineSeparator || *uc == 9) - script = QChar::Script_Common; - if (script != lastScript) { - if (uc != start) { + QUnicodeTools::initScripts(string, length, scripts.data()); + + int start = 0; + for (int i = start + 1; i <= length; ++i) { + if (i == length || scripts[i] != scripts[start]) { QUnicodeTools::ScriptItem item; - item.position = start - string; - item.script = lastScript; + item.position = start; + item.script = scripts[start]; scriptItems.append(item); - start = uc; + start = i; } - lastScript = script; } - ++uc; - } - if (uc != start) { - QUnicodeTools::ScriptItem item; - item.position = start - string; - item.script = lastScript; - scriptItems.append(item); } QUnicodeTools::CharAttributeOptions options = 0; |