summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools/qtextboundaryfinder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/tools/qtextboundaryfinder.cpp')
-rw-r--r--src/corelib/tools/qtextboundaryfinder.cpp39
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;