From c2d58f5a0b1402741a23552c6e9a0da467ca434e Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Tue, 6 Oct 2020 16:26:30 +0300 Subject: [PATCH] fix #4806 ensure at least one character is returned on the first text run measure --- .../Media/TextFormatting/TextFormatterImpl.cs | 12 ++++++++++-- .../Media/TextFormatting/TextLineImpl.cs | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Visuals/Media/TextFormatting/TextFormatterImpl.cs b/src/Avalonia.Visuals/Media/TextFormatting/TextFormatterImpl.cs index 3e85f0f6f0..e65f96bf61 100644 --- a/src/Avalonia.Visuals/Media/TextFormatting/TextFormatterImpl.cs +++ b/src/Avalonia.Visuals/Media/TextFormatting/TextFormatterImpl.cs @@ -47,8 +47,9 @@ namespace Avalonia.Media.TextFormatting /// /// The text run. /// The available width. + /// Index of the textCharacters parent TextRun /// - internal static int MeasureCharacters(ShapedTextCharacters textCharacters, double availableWidth) + internal static int MeasureCharacters(ShapedTextCharacters textCharacters, double availableWidth, int textRunIndex) { var glyphRun = textCharacters.GlyphRun; @@ -73,6 +74,13 @@ namespace Avalonia.Media.TextFormatting if (currentWidth + advance > availableWidth) { + if(glyphCount == 0 && textRunIndex == 0) + { + //we need to return at least one characted on the first run + //or we risk to get a infinity loop when width is less than one character width + //issue #4806 + glyphCount = 1; + } break; } @@ -350,7 +358,7 @@ namespace Avalonia.Media.TextFormatting if (currentWidth + currentRun.Size.Width > availableWidth) { - var measuredLength = MeasureCharacters(currentRun, paragraphWidth - currentWidth); + var measuredLength = MeasureCharacters(currentRun, paragraphWidth - currentWidth, runIndex); var breakFound = false; diff --git a/src/Avalonia.Visuals/Media/TextFormatting/TextLineImpl.cs b/src/Avalonia.Visuals/Media/TextFormatting/TextLineImpl.cs index f5e87d097b..aa7759fc16 100644 --- a/src/Avalonia.Visuals/Media/TextFormatting/TextLineImpl.cs +++ b/src/Avalonia.Visuals/Media/TextFormatting/TextLineImpl.cs @@ -75,7 +75,7 @@ namespace Avalonia.Media.TextFormatting if (currentWidth > availableWidth) { - var measuredLength = TextFormatterImpl.MeasureCharacters(currentRun, availableWidth); + var measuredLength = TextFormatterImpl.MeasureCharacters(currentRun, availableWidth, runIndex); var currentBreakPosition = 0;