Browse Source

Try to fix GetDistanceFromCharacterHit for drawable runs

pull/7746/head
Benedikt Stebner 4 years ago
parent
commit
e7e7a95e5d
  1. 5
      src/Avalonia.Visuals/Media/TextFormatting/TextLineImpl.cs
  2. 41
      tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs

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

@ -328,6 +328,11 @@ namespace Avalonia.Media.TextFormatting
return currentDistance; return currentDistance;
} }
if(characterIndex == currentPosition + textRun.TextSourceLength)
{
return currentDistance + textRun.Size.Width;
}
break; break;
} }
} }

41
tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs

@ -520,22 +520,46 @@ namespace Avalonia.Skia.UnitTests.Media.TextFormatting
} }
} }
[Fact]
public void Should_Get_Distance_From_CharacterHit_Drawable_Runs()
{
using (Start())
{
var defaultProperties = new GenericTextRunProperties(Typeface.Default);
var textSource = new DrawableRunTextSource();
var formatter = new TextFormatterImpl();
var textLine =
formatter.FormatLine(textSource, 0, double.PositiveInfinity,
new GenericTextParagraphProperties(defaultProperties));
var distance = textLine.GetDistanceFromCharacterHit(new CharacterHit(1));
Assert.Equal(14, distance);
distance = textLine.GetDistanceFromCharacterHit(new CharacterHit(2));
Assert.True(distance > 14);
}
}
private class DrawableRunTextSource : ITextSource private class DrawableRunTextSource : ITextSource
{ {
const string Text = "A_A_"; const string Text = "_A_A";
public TextRun? GetTextRun(int textSourceIndex) public TextRun? GetTextRun(int textSourceIndex)
{ {
switch (textSourceIndex) switch (textSourceIndex)
{ {
case 0: case 0:
return new TextCharacters(new ReadOnlySlice<char>(Text.AsMemory(), 0, 1), new GenericTextRunProperties(Typeface.Default)); return new CustomDrawableRun();
case 1: case 1:
return new CustomDrawableRun(1); return new TextCharacters(new ReadOnlySlice<char>(Text.AsMemory(), 1, 1), new GenericTextRunProperties(Typeface.Default));
case 2: case 2:
return new TextCharacters(new ReadOnlySlice<char>(Text.AsMemory(), 2, 1, 2), new GenericTextRunProperties(Typeface.Default)); return new CustomDrawableRun();
case 3: case 3:
return new CustomDrawableRun(3); return new TextCharacters(new ReadOnlySlice<char>(Text.AsMemory(), 3, 1, 3), new GenericTextRunProperties(Typeface.Default));
default: default:
return null; return null;
} }
@ -544,13 +568,6 @@ namespace Avalonia.Skia.UnitTests.Media.TextFormatting
private class CustomDrawableRun : DrawableTextRun private class CustomDrawableRun : DrawableTextRun
{ {
public CustomDrawableRun(int start)
{
Text = new ReadOnlySlice<char>(new char[1], start, DefaultTextSourceLength);
}
public override ReadOnlySlice<char> Text { get; }
public override Size Size => new(14, 14); public override Size Size => new(14, 14);
public override double Baseline => 14; public override double Baseline => 14;
public override void Draw(DrawingContext drawingContext, Point origin) public override void Draw(DrawingContext drawingContext, Point origin)

Loading…
Cancel
Save