From 9c94158ae7da372eedc75c96001d056989ba1c8b Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Tue, 25 Jul 2023 08:38:52 +0200 Subject: [PATCH 1/2] Make sure TextLine.GetCharacterHitFromDistance for mixed buffers --- .../Media/TextFormatting/TextLineImpl.cs | 2 +- .../Media/TextFormatting/TextLineTests.cs | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs b/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs index 44f53420de..86c29941e7 100644 --- a/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs +++ b/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs @@ -216,7 +216,7 @@ namespace Avalonia.Media.TextFormatting if (_paragraphProperties.FlowDirection == FlowDirection.LeftToRight) { - currentPosition = lineLength - lastRun.Length; + currentPosition = FirstTextSourceIndex + Length - lastRun.Length; } return GetRunCharacterHit(lastRun, currentPosition, distance); diff --git a/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs b/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs index d576a64523..96c592702b 100644 --- a/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs +++ b/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs @@ -822,6 +822,26 @@ namespace Avalonia.Skia.UnitTests.Media.TextFormatting } } + [Fact] + public void Should_GetCharacterHitFromDistance_From_Mixed_TextBuffer() + { + using (Start()) + { + var defaultProperties = new GenericTextRunProperties(Typeface.Default); + var textSource = new MixedTextBufferTextSource(); + + var formatter = new TextFormatterImpl(); + + var textLine = + formatter.FormatLine(textSource, 20, double.PositiveInfinity, + new GenericTextParagraphProperties(defaultProperties)); + + var characterHit = textLine.GetCharacterHitFromDistance(double.PositiveInfinity); + + Assert.Equal(40, characterHit.FirstCharacterIndex + characterHit.TrailingLength); + } + } + private class MixedTextBufferTextSource : ITextSource { public TextRun? GetTextRun(int textSourceIndex) From 1e64c51879118e24caeb967400f8d8d7f0ba8493 Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Tue, 25 Jul 2023 09:29:58 +0200 Subject: [PATCH 2/2] Adjust test --- .../Media/TextFormatting/TextLineTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs b/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs index 96c592702b..a3bbdc9a7c 100644 --- a/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs +++ b/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs @@ -713,7 +713,7 @@ namespace Avalonia.Skia.UnitTests.Media.TextFormatting var characterHit = textLine.GetCharacterHitFromDistance(1000); - Assert.Equal(10, characterHit.FirstCharacterIndex); + Assert.Equal(11, characterHit.FirstCharacterIndex); Assert.Equal(1, characterHit.TrailingLength); } }