From 89e74637ef701d63828ef39bc16fb85323f0413c Mon Sep 17 00:00:00 2001 From: Zufu Liu Date: Sun, 18 May 2025 09:24:34 +1000 Subject: Modify wrapping fix to be more efficient. https://github.com/notepad-plus-plus/notepad-plus-plus/pull/16373 --- src/Document.cxx | 6 ------ src/PositionCache.cxx | 5 ++++- 2 files changed, 4 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/Document.cxx b/src/Document.cxx index 7dbe499a2..e6f8f3543 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -1314,16 +1314,10 @@ bool Scintilla::Internal::DiscardLastCombinedCharacter(std::string_view &text) n // Modified to move Sk (Symbol Modifier) from ccs-base to ccs-extend to preserve modified emoji // May break before and after Control which is defined as most of ccC? but not some of ccCf and ccCn // so treat ccCc, ccCs, ccCo as base for now. - // Treat \r\n as a single item to avoid separating the characters. std::string_view truncated = text; while (truncated.length() > UTF8MaxBytes) { // Give up when short - if (truncated.substr(truncated.length()-2) == "\r\n") { - truncated.remove_suffix(2); - text = truncated; - return true; - } const CharacterExtracted ce = LastCharacter(truncated); const CharacterCategory cc = CategoriseCharacter(static_cast(ce.character)); truncated.remove_suffix(ce.widthBytes); diff --git a/src/PositionCache.cxx b/src/PositionCache.cxx index 89276d2a0..c332af609 100644 --- a/src/PositionCache.cxx +++ b/src/PositionCache.cxx @@ -377,7 +377,10 @@ void LineLayout::WrapLine(const Document *pdoc, Sci::Position posLineStart, Wrap if (!foundBreak) { if (CpUtf8 == pdoc->dbcsCodePage) { // Go back before a base character, commonly a letter as modifiers are after the letter they modify - std::string_view svWithoutLast(&chars[lastLineStart], CharacterBoundary(p + 1, 1) - lastLineStart); + const Sci::Position afterLastCharacter = CharacterBoundary(p + 1, 1); + const Sci::Position afterWrap = std::min( + afterLastCharacter, numCharsBeforeEOL + 1); // Limit to one byte of line end + std::string_view svWithoutLast(&chars[lastLineStart], afterWrap - lastLineStart); if (DiscardLastCombinedCharacter(svWithoutLast) && !svWithoutLast.empty()) { lastGoodBreak = lastLineStart + static_cast(svWithoutLast.length()); foundBreak = true; -- cgit v1.2.3