Browse Source

fix #4806 ensure at least one character is returned on the first text run measure

pull/4807/head
Andrey Kunchev 6 years ago
parent
commit
c2d58f5a0b
  1. 12
      src/Avalonia.Visuals/Media/TextFormatting/TextFormatterImpl.cs
  2. 2
      src/Avalonia.Visuals/Media/TextFormatting/TextLineImpl.cs

12
src/Avalonia.Visuals/Media/TextFormatting/TextFormatterImpl.cs

@ -47,8 +47,9 @@ namespace Avalonia.Media.TextFormatting
/// </summary> /// </summary>
/// <param name="textCharacters">The text run.</param> /// <param name="textCharacters">The text run.</param>
/// <param name="availableWidth">The available width.</param> /// <param name="availableWidth">The available width.</param>
/// <param name="textRunIndex">Index of the textCharacters parent TextRun</param>
/// <returns></returns> /// <returns></returns>
internal static int MeasureCharacters(ShapedTextCharacters textCharacters, double availableWidth) internal static int MeasureCharacters(ShapedTextCharacters textCharacters, double availableWidth, int textRunIndex)
{ {
var glyphRun = textCharacters.GlyphRun; var glyphRun = textCharacters.GlyphRun;
@ -73,6 +74,13 @@ namespace Avalonia.Media.TextFormatting
if (currentWidth + advance > availableWidth) 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; break;
} }
@ -350,7 +358,7 @@ namespace Avalonia.Media.TextFormatting
if (currentWidth + currentRun.Size.Width > availableWidth) if (currentWidth + currentRun.Size.Width > availableWidth)
{ {
var measuredLength = MeasureCharacters(currentRun, paragraphWidth - currentWidth); var measuredLength = MeasureCharacters(currentRun, paragraphWidth - currentWidth, runIndex);
var breakFound = false; var breakFound = false;

2
src/Avalonia.Visuals/Media/TextFormatting/TextLineImpl.cs

@ -75,7 +75,7 @@ namespace Avalonia.Media.TextFormatting
if (currentWidth > availableWidth) if (currentWidth > availableWidth)
{ {
var measuredLength = TextFormatterImpl.MeasureCharacters(currentRun, availableWidth); var measuredLength = TextFormatterImpl.MeasureCharacters(currentRun, availableWidth, runIndex);
var currentBreakPosition = 0; var currentBreakPosition = 0;

Loading…
Cancel
Save