From 010aed34334fbf0937fb0bfb9c0a83b93092a77a Mon Sep 17 00:00:00 2001 From: net2cn Date: Mon, 20 Jan 2025 00:23:20 +0800 Subject: [PATCH] fix: TextBlock enters an infinite loop if the given available space is too small to fit even one character. --- sources/engine/Stride.UI/Controls/TextBlock.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/sources/engine/Stride.UI/Controls/TextBlock.cs b/sources/engine/Stride.UI/Controls/TextBlock.cs index 698434e79a..8bb25ece4d 100644 --- a/sources/engine/Stride.UI/Controls/TextBlock.cs +++ b/sources/engine/Stride.UI/Controls/TextBlock.cs @@ -296,6 +296,7 @@ private void UpdateWrappedText(Vector3 availableSpace) float lineCurrentSize; var indexNextCharacter = 0; var indexOfLastSpace = -1; + char currentCharacter = text[0]; while (true) { @@ -304,7 +305,7 @@ private void UpdateWrappedText(Vector3 availableSpace) if (lineCurrentSize > availableWidth || indexOfNewLine + indexNextCharacter >= text.Length) break; - var currentCharacter = text[indexOfNewLine + indexNextCharacter]; + currentCharacter = text[indexOfNewLine + indexNextCharacter]; if (currentCharacter == '\n') { @@ -329,7 +330,13 @@ private void UpdateWrappedText(Vector3 availableSpace) } // we reached the end of the line. - if (indexOfLastSpace < 0) // no space in the line + if (currentLine.Length <= 1 || CalculateTextSize(currentLine).X <= 0) // just one or all empty characters... just go one by one. + { + currentLine.Clear(); + currentLine.Append(currentCharacter); + indexOfNewLine += indexNextCharacter; + } + else if (indexOfLastSpace < 0) // no space in the line { // remove last extra character currentLine.Remove(currentLine.Length - 1, 1);