|
|
|
@ -4,6 +4,7 @@ |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using System.Text; |
|
|
|
using Perspex.Media; |
|
|
|
using Perspex.Platform; |
|
|
|
using Splat; |
|
|
|
@ -13,6 +14,7 @@ namespace Perspex.Cairo.Media |
|
|
|
public class FormattedTextImpl : IFormattedTextImpl |
|
|
|
{ |
|
|
|
private Size _size; |
|
|
|
private string _text; |
|
|
|
|
|
|
|
public FormattedTextImpl( |
|
|
|
Pango.Context context, |
|
|
|
@ -26,6 +28,7 @@ namespace Perspex.Cairo.Media |
|
|
|
Contract.Requires<NullReferenceException>(context != null); |
|
|
|
|
|
|
|
Layout = new Pango.Layout(context); |
|
|
|
_text = text; |
|
|
|
Layout.SetText(text); |
|
|
|
Layout.FontDescription = new Pango.FontDescription |
|
|
|
{ |
|
|
|
@ -49,7 +52,7 @@ namespace Perspex.Cairo.Media |
|
|
|
set |
|
|
|
{ |
|
|
|
_size = value; |
|
|
|
Layout.Width = double.IsPositiveInfinity(value.Width) ? |
|
|
|
Layout.Width = double.IsPositiveInfinity(value.Width) ? |
|
|
|
-1 : Pango.Units.FromDouble(value.Width); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -80,6 +83,8 @@ namespace Perspex.Cairo.Media |
|
|
|
out textPosition, |
|
|
|
out trailing); |
|
|
|
|
|
|
|
textPosition = PangoIndexToTextIndex(textPosition); |
|
|
|
|
|
|
|
return new TextHitTestResult |
|
|
|
{ |
|
|
|
IsInside = isInside, |
|
|
|
@ -88,9 +93,19 @@ namespace Perspex.Cairo.Media |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
int PangoIndexToTextIndex(int pangoIndex) |
|
|
|
{ |
|
|
|
return Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(_text), 0, Math.Min(pangoIndex, _text.Length)).Length; |
|
|
|
} |
|
|
|
|
|
|
|
public Rect HitTestTextPosition(int index) |
|
|
|
{ |
|
|
|
return Layout.IndexToPos(index).ToPerspex(); |
|
|
|
return Layout.IndexToPos(TextIndexToPangoIndex(index)).ToPerspex(); |
|
|
|
} |
|
|
|
|
|
|
|
int TextIndexToPangoIndex(int textIndex) |
|
|
|
{ |
|
|
|
return Encoding.UTF8.GetByteCount(textIndex < _text.Length ? _text.Remove(textIndex) : _text); |
|
|
|
} |
|
|
|
|
|
|
|
public IEnumerable<Rect> HitTestTextRange(int index, int length) |
|
|
|
@ -124,8 +139,8 @@ namespace Perspex.Cairo.Media |
|
|
|
color.Parse(string.Format("#{0}", scb.Color.ToString().Substring(3))); |
|
|
|
|
|
|
|
var brushAttr = new Pango.AttrForeground(color); |
|
|
|
brushAttr.StartIndex = (uint)startIndex; |
|
|
|
brushAttr.EndIndex = (uint)(startIndex + count); |
|
|
|
brushAttr.StartIndex = (uint)TextIndexToPangoIndex(startIndex); |
|
|
|
brushAttr.EndIndex = (uint)TextIndexToPangoIndex(startIndex + count); |
|
|
|
|
|
|
|
Layout.Attributes.Insert(brushAttr); |
|
|
|
} |
|
|
|
|