From 20980df29323cae6e7888d512109fd4a4f312ce8 Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Fri, 8 Sep 2023 13:05:53 +0300 Subject: [PATCH] QTextDocument::toPlainText: avoid unconditional detach Let's find replaceable chars and then do detach Change-Id: I4a4360d73a97af2388f4f2f284949ffcfbc48836 Reviewed-by: Edward Welbourne --- src/gui/text/qtextdocument.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp index e8f04e5d09..dc24db1efb 100644 --- a/src/gui/text/qtextdocument.cpp +++ b/src/gui/text/qtextdocument.cpp @@ -1200,10 +1200,18 @@ QString QTextDocument::toPlainText() const Q_D(const QTextDocument); QString txt = d->plainText(); - QChar *uc = txt.data(); - QChar *e = uc + txt.size(); + constexpr char16_t delims[] = { 0xfdd0, 0xfdd1, + QChar::ParagraphSeparator, QChar::LineSeparator, QChar::Nbsp }; - for (; uc != e; ++uc) { + const size_t pos = std::u16string_view(txt).find_first_of( + std::u16string_view(delims, std::size(delims))); + if (pos == std::u16string_view::npos) + return txt; + + QChar *uc = txt.data(); + QChar *const e = uc + txt.size(); + + for (uc += pos; uc != e; ++uc) { switch (uc->unicode()) { case 0xfdd0: // QTextBeginningOfFrame case 0xfdd1: // QTextEndOfFrame