|
|
|
@ -3,6 +3,8 @@ using System.Collections; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.IO; |
|
|
|
using System.Linq; |
|
|
|
using System.Threading; |
|
|
|
|
|
|
|
using Avalonia.Controls.Platform.Surfaces; |
|
|
|
using Avalonia.Media; |
|
|
|
using Avalonia.OpenGL; |
|
|
|
@ -166,12 +168,13 @@ namespace Avalonia.Skia |
|
|
|
LinearMetrics = true |
|
|
|
}; |
|
|
|
|
|
|
|
private static readonly SKTextBlobBuilder s_textBlobBuilder = new SKTextBlobBuilder(); |
|
|
|
private static readonly ThreadLocal<SKTextBlobBuilder> s_textBlobBuilderThreadLocal = new ThreadLocal<SKTextBlobBuilder>(() => new SKTextBlobBuilder()); |
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
public IGlyphRunImpl CreateGlyphRun(GlyphRun glyphRun, out double width) |
|
|
|
{ |
|
|
|
var count = glyphRun.GlyphIndices.Length; |
|
|
|
var textBlobBuilder = s_textBlobBuilderThreadLocal.Value; |
|
|
|
|
|
|
|
var glyphTypeface = (GlyphTypefaceImpl)glyphRun.GlyphTypeface.PlatformImpl; |
|
|
|
|
|
|
|
@ -191,15 +194,15 @@ namespace Avalonia.Skia |
|
|
|
{ |
|
|
|
if (glyphTypeface.IsFixedPitch) |
|
|
|
{ |
|
|
|
s_textBlobBuilder.AddRun(glyphRun.GlyphIndices.Buffer.Span, s_font); |
|
|
|
textBlobBuilder.AddRun(glyphRun.GlyphIndices.Buffer.Span, s_font); |
|
|
|
|
|
|
|
textBlob = s_textBlobBuilder.Build(); |
|
|
|
textBlob = textBlobBuilder.Build(); |
|
|
|
|
|
|
|
width = glyphTypeface.GetGlyphAdvance(glyphRun.GlyphIndices[0]) * scale * glyphRun.GlyphIndices.Length; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
var buffer = s_textBlobBuilder.AllocateHorizontalRun(s_font, count, 0); |
|
|
|
var buffer = textBlobBuilder.AllocateHorizontalRun(s_font, count, 0); |
|
|
|
|
|
|
|
var positions = buffer.GetPositionSpan(); |
|
|
|
|
|
|
|
@ -219,12 +222,12 @@ namespace Avalonia.Skia |
|
|
|
|
|
|
|
buffer.SetGlyphs(glyphRun.GlyphIndices.Buffer.Span); |
|
|
|
|
|
|
|
textBlob = s_textBlobBuilder.Build(); |
|
|
|
textBlob = textBlobBuilder.Build(); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
var buffer = s_textBlobBuilder.AllocatePositionedRun(s_font, count); |
|
|
|
var buffer = textBlobBuilder.AllocatePositionedRun(s_font, count); |
|
|
|
|
|
|
|
var glyphPositions = buffer.GetPositionSpan(); |
|
|
|
|
|
|
|
@ -250,7 +253,7 @@ namespace Avalonia.Skia |
|
|
|
|
|
|
|
width = currentX; |
|
|
|
|
|
|
|
textBlob = s_textBlobBuilder.Build(); |
|
|
|
textBlob = textBlobBuilder.Build(); |
|
|
|
} |
|
|
|
|
|
|
|
return new GlyphRunImpl(textBlob); |
|
|
|
|