diff --git a/Perspex.SceneGraph/Media/FormattedText.cs b/Perspex.SceneGraph/Media/FormattedText.cs index 3d0915bc96..d6dc09665e 100644 --- a/Perspex.SceneGraph/Media/FormattedText.cs +++ b/Perspex.SceneGraph/Media/FormattedText.cs @@ -7,6 +7,7 @@ namespace Perspex.Media { using System; + using System.Collections.Generic; using Perspex.Platform; using Splat; @@ -78,6 +79,11 @@ namespace Perspex.Media return this.PlatformImpl.HitTestTextPosition(index); } + public IEnumerable HitTestTextRange(int index, int length, Point origin) + { + return this.PlatformImpl.HitTestTextRange(index, length, origin); + } + public Size Measure() { return this.PlatformImpl.Measure(); diff --git a/Perspex.SceneGraph/Platform/IFormattedTextImpl.cs b/Perspex.SceneGraph/Platform/IFormattedTextImpl.cs index 91727b7b3b..f6be627172 100644 --- a/Perspex.SceneGraph/Platform/IFormattedTextImpl.cs +++ b/Perspex.SceneGraph/Platform/IFormattedTextImpl.cs @@ -7,6 +7,7 @@ namespace Perspex.Platform { using System; + using System.Collections.Generic; using Perspex.Media; public interface IFormattedTextImpl : IDisposable @@ -17,6 +18,8 @@ namespace Perspex.Platform Rect HitTestTextPosition(int index); + IEnumerable HitTestTextRange(int index, int length, Point origin); + Size Measure(); } } diff --git a/Windows/Perspex.Direct2D1/Media/FormattedTextImpl.cs b/Windows/Perspex.Direct2D1/Media/FormattedTextImpl.cs index b5e987b213..edf9888a24 100644 --- a/Windows/Perspex.Direct2D1/Media/FormattedTextImpl.cs +++ b/Windows/Perspex.Direct2D1/Media/FormattedTextImpl.cs @@ -7,6 +7,8 @@ namespace Perspex.Direct2D1.Media { using System; + using System.Collections.Generic; + using System.Linq; using Perspex.Media; using Perspex.Platform; using Splat; @@ -60,7 +62,7 @@ namespace Perspex.Direct2D1.Media SharpDX.Bool isTrailingHit; SharpDX.Bool isInside; - DWrite.HitTestMetrics result = this.TextLayout.HitTestPoint( + var result = this.TextLayout.HitTestPoint( (float)point.X, (float)point.Y, out isTrailingHit, @@ -78,7 +80,7 @@ namespace Perspex.Direct2D1.Media float x; float y; - DWrite.HitTestMetrics result = this.TextLayout.HitTestTextPosition( + var result = this.TextLayout.HitTestTextPosition( index, false, out x, @@ -87,6 +89,17 @@ namespace Perspex.Direct2D1.Media return new Rect(result.Left, result.Top, result.Width, result.Height); } + public IEnumerable HitTestTextRange(int index, int length, Point origin) + { + var result = this.TextLayout.HitTestTextRange( + index, + length, + (float)origin.X, + (float)origin.Y); + + return result.Select(x => new Rect(x.Left, x.Top, x.Width, x.Height)); + } + public Size Measure() { return new Size(