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;