From 76ced3f179f18f5f28416291140f5804c8a905b9 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Sat, 14 Mar 2020 12:29:48 +0100 Subject: Change signature of initScripts to take out pointer to a QVLA This avoids one additional copy of data that we've been doing before. Change-Id: I3fae0ebe0cded632b41fdcf7efc01d5c7f2dc181 Reviewed-by: Konstantin Ritt --- src/corelib/text/qtextboundaryfinder.cpp | 19 ++----------------- src/corelib/text/qunicodetools.cpp | 6 +++--- src/corelib/text/qunicodetools_p.h | 6 ++++-- src/gui/text/qtextengine.cpp | 12 ++++++++---- 4 files changed, 17 insertions(+), 26 deletions(-) (limited to 'src') diff --git a/src/corelib/text/qtextboundaryfinder.cpp b/src/corelib/text/qtextboundaryfinder.cpp index ebdba6b2c5..fdbb7f0176 100644 --- a/src/corelib/text/qtextboundaryfinder.cpp +++ b/src/corelib/text/qtextboundaryfinder.cpp @@ -53,23 +53,8 @@ static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int { const ushort *string = reinterpret_cast(chars); - QVarLengthArray scriptItems; - { - QVarLengthArray scripts(length); - - 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; - item.script = scripts[start]; - scriptItems.append(item); - start = i; - } - } - } + QUnicodeTools::ScriptItemArray scriptItems; + QUnicodeTools::initScripts(string, length, &scriptItems); QUnicodeTools::CharAttributeOptions options; switch (type) { diff --git a/src/corelib/text/qunicodetools.cpp b/src/corelib/text/qunicodetools.cpp index 0db3dc74c6..76072f8282 100644 --- a/src/corelib/text/qunicodetools.cpp +++ b/src/corelib/text/qunicodetools.cpp @@ -792,7 +792,7 @@ Q_CORE_EXPORT void initCharAttributes(const ushort *string, int length, // // ---------------------------------------------------------------------------- -Q_CORE_EXPORT void initScripts(const ushort *string, int length, uchar *scripts) +Q_CORE_EXPORT void initScripts(const ushort *string, int length, ScriptItemArray *scripts) { int sor = 0; int eor = 0; @@ -832,7 +832,7 @@ Q_CORE_EXPORT void initScripts(const ushort *string, int length, uchar *scripts) Q_ASSERT(script > QChar::Script_Common); Q_ASSERT(sor < eor); - ::memset(scripts + sor, script, (eor - sor) * sizeof(uchar)); + scripts->append(ScriptItem{sor, script}); sor = eor; script = nscript; @@ -840,7 +840,7 @@ Q_CORE_EXPORT void initScripts(const ushort *string, int length, uchar *scripts) Q_ASSERT(script >= QChar::Script_Common); Q_ASSERT(eor == length); - ::memset(scripts + sor, script, (eor - sor) * sizeof(uchar)); + scripts->append(ScriptItem{sor, script}); } } // namespace QUnicodeTools diff --git a/src/corelib/text/qunicodetools_p.h b/src/corelib/text/qunicodetools_p.h index ed6fcb5d65..6294d9ceb4 100644 --- a/src/corelib/text/qunicodetools_p.h +++ b/src/corelib/text/qunicodetools_p.h @@ -53,6 +53,7 @@ #include #include +#include QT_BEGIN_NAMESPACE @@ -71,13 +72,14 @@ Q_DECLARE_TYPEINFO(QCharAttributes, Q_PRIMITIVE_TYPE); namespace QUnicodeTools { -// ### temporary struct ScriptItem { int position; int script; }; +using ScriptItemArray = QVarLengthArray; + } // namespace QUnicodeTools Q_DECLARE_TYPEINFO(QUnicodeTools::ScriptItem, Q_PRIMITIVE_TYPE); namespace QUnicodeTools { @@ -101,7 +103,7 @@ Q_CORE_EXPORT void initCharAttributes(const ushort *string, int length, QCharAttributes *attributes, CharAttributeOptions options = DefaultOptionsCompat); -Q_CORE_EXPORT void initScripts(const ushort *string, int length, uchar *scripts); +Q_CORE_EXPORT void initScripts(const ushort *string, int length, ScriptItemArray *scripts); } // namespace QUnicodeTools diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index f9c4a3949c..2deae6f4ba 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -2098,10 +2098,14 @@ void QTextEngine::itemize() const layoutData->hasBidi = bidi.process(); { - QVarLengthArray scripts(length); - QUnicodeTools::initScripts(string, length, scripts.data()); - for (int i = 0; i < length; ++i) - analysis[i].script = scripts.at(i); + QUnicodeTools::ScriptItemArray scriptItems; + QUnicodeTools::initScripts(string, length, &scriptItems); + for (int i = 0; i < scriptItems.length(); ++i) { + const auto &item = scriptItems.at(i); + int end = i < scriptItems.length() - 1 ? scriptItems.at(i + 1).position : length; + for (int j = item.position; j < end; ++j) + analysis[j].script = item.script; + } } const ushort *uc = string; -- cgit v1.2.3