summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2021-03-14 14:04:30 +0100
committerNicolas Werner <nicolas.werner@hotmail.de>2021-03-14 14:04:30 +0100
commit98e0b95635fdf48f79064766ffca330d7bbd390b (patch)
tree3f60b184be8d876426a91550e8d2e2a7b14df06b /src
parentMerge pull request #493 from Jedi18/quickswitcher_qml (diff)
downloadnheko-98e0b95635fdf48f79064766ffca330d7bbd390b.tar.xz
Reduce allocations when escaping emoji
Diffstat (limited to 'src')
-rw-r--r--src/Utils.cpp21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/Utils.cpp b/src/Utils.cpp

index 7106d865..5c03c52f 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp
@@ -13,6 +13,7 @@ #include <QProcessEnvironment> #include <QScreen> #include <QSettings> +#include <QStringBuilder> #include <QTextDocument> #include <QXmlStreamReader> @@ -66,7 +67,8 @@ utils::codepointIsEmoji(uint code) QString utils::replaceEmoji(const QString &body) { - QString fmtBody = ""; + QString fmtBody; + fmtBody.reserve(body.size()); QVector<uint> utf32_string = body.toUcs4(); @@ -74,21 +76,28 @@ utils::replaceEmoji(const QString &body) for (auto &code : utf32_string) { if (utils::codepointIsEmoji(code)) { if (!insideFontBlock) { - fmtBody += QString("<font face=\"" + - UserSettings::instance()->emojiFont() + "\">"); + fmtBody += QStringLiteral("<font face=\"") % + UserSettings::instance()->emojiFont() % + QStringLiteral("\">"); insideFontBlock = true; } } else { if (insideFontBlock) { - fmtBody += "</font>"; + fmtBody += QStringLiteral("</font>"); insideFontBlock = false; } } - fmtBody += QString::fromUcs4(&code, 1); + if (QChar::requiresSurrogates(code)) { + QChar emoji[] = {static_cast<ushort>(QChar::highSurrogate(code)), + static_cast<ushort>(QChar::lowSurrogate(code))}; + fmtBody.append(emoji, 2); + } else { + fmtBody.append(QChar(static_cast<ushort>(code))); + } } if (insideFontBlock) { - fmtBody += "</font>"; + fmtBody += QStringLiteral("</font>"); } return fmtBody;