Browse Source

Merge pull request #9375 from Gillibald/fixes/unPositionedGlyphRuns

Fixes unpositioned GlyphRuns
pull/9409/head
Benedikt Stebner 3 years ago
committed by GitHub
parent
commit
a4c2d8ee8b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      src/Skia/Avalonia.Skia/PlatformRenderInterface.cs
  2. 113
      tests/Avalonia.RenderTests/Media/GlyphRunTests.cs
  3. BIN
      tests/TestFiles/Direct2D1/Media/GlyphRun/Should_Render_GlyphRun_Positioned.expected.png
  4. BIN
      tests/TestFiles/Direct2D1/Media/GlyphRun/Should_Render_GlyphRun_UnPositioned.expected.png
  5. BIN
      tests/TestFiles/Skia/Media/GlyphRun/Should_Render_GlyphRun_Positioned.expected.png
  6. BIN
      tests/TestFiles/Skia/Media/GlyphRun/Should_Render_GlyphRun_UnPositioned.expected.png

10
src/Skia/Avalonia.Skia/PlatformRenderInterface.cs

@ -242,7 +242,7 @@ namespace Avalonia.Skia
"Current GPU acceleration backend does not support OpenGL integration");
}
public IGlyphRunImpl CreateGlyphRun(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, IReadOnlyList<ushort> glyphIndices,
public IGlyphRunImpl CreateGlyphRun(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, IReadOnlyList<ushort> glyphIndices,
IReadOnlyList<double> glyphAdvances, IReadOnlyList<Vector> glyphOffsets)
{
if (glyphTypeface == null)
@ -273,7 +273,7 @@ namespace Avalonia.Skia
var count = glyphIndices.Count;
if(glyphOffsets != null && glyphAdvances != null)
if (glyphOffsets != null && glyphAdvances != null)
{
var runBuffer = builder.AllocatePositionedRun(font, count);
@ -295,7 +295,7 @@ namespace Avalonia.Skia
}
else
{
if(glyphAdvances != null)
if (glyphAdvances != null)
{
var runBuffer = builder.AllocateHorizontalRun(font, count, 0);
@ -304,7 +304,7 @@ namespace Avalonia.Skia
var currentX = 0.0;
for (int i = 0; i < glyphOffsets.Count; i++)
for (int i = 0; i < glyphAdvances.Count; i++)
{
glyphSpan[i] = glyphIndices[i];
@ -319,7 +319,7 @@ namespace Avalonia.Skia
var glyphSpan = runBuffer.GetGlyphSpan();
for (int i = 0; i < glyphOffsets.Count; i++)
for (int i = 0; i < glyphIndices.Count; i++)
{
glyphSpan[i] = glyphIndices[i];
}

113
tests/Avalonia.RenderTests/Media/GlyphRunTests.cs

@ -50,6 +50,66 @@ namespace Avalonia.Direct2D1.RenderTests.Media
CompareImages();
}
[Win32Fact("For consistent results")]
public async Task Should_Render_GlyphRun_UnPositioned()
{
var control = new UnPositionedGlyphRunControl
{
[TextElement.ForegroundProperty] = new LinearGradientBrush
{
StartPoint = new RelativePoint(0, 0.5, RelativeUnit.Relative),
EndPoint = new RelativePoint(1, 0.5, RelativeUnit.Relative),
GradientStops =
{
new GradientStop { Color = Colors.Red, Offset = 0 },
new GradientStop { Color = Colors.Blue, Offset = 1 }
}
}
};
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 190,
Height = 120,
Child = control
};
await RenderToFile(target);
CompareImages();
}
[Win32Fact("For consistent results")]
public async Task Should_Render_GlyphRun_Positioned()
{
var control = new PositionedGlyphRunControl
{
[TextElement.ForegroundProperty] = new LinearGradientBrush
{
StartPoint = new RelativePoint(0, 0.5, RelativeUnit.Relative),
EndPoint = new RelativePoint(1, 0.5, RelativeUnit.Relative),
GradientStops =
{
new GradientStop { Color = Colors.Red, Offset = 0 },
new GradientStop { Color = Colors.Blue, Offset = 1 }
}
}
};
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 190,
Height = 120,
Child = control
};
await RenderToFile(target);
CompareImages();
}
public class GlyphRunGeometryControl : Control
{
public GlyphRunGeometryControl()
@ -74,5 +134,58 @@ namespace Avalonia.Direct2D1.RenderTests.Media
context.DrawGeometry(foreground, null, Geometry);
}
}
public class UnPositionedGlyphRunControl : Control
{
public UnPositionedGlyphRunControl()
{
var glyphTypeface = new Typeface(TestFontFamily).GlyphTypeface;
var glyphIndices = new[] { glyphTypeface.GetGlyph('A'), glyphTypeface.GetGlyph('B'), glyphTypeface.GetGlyph('C') };
var characters = new[] { 'A', 'B', 'C' };
GlyphRun = new GlyphRun(glyphTypeface, 100, characters, glyphIndices);
}
public GlyphRun GlyphRun { get; }
public override void Render(DrawingContext context)
{
var foreground = TextElement.GetForeground(this);
context.DrawGlyphRun(foreground, GlyphRun);
}
}
public class PositionedGlyphRunControl : Control
{
public PositionedGlyphRunControl()
{
var glyphTypeface = new Typeface(TestFontFamily).GlyphTypeface;
var glyphIndices = new[] { glyphTypeface.GetGlyph('A'), glyphTypeface.GetGlyph('B'), glyphTypeface.GetGlyph('C') };
var scale = 100.0 / glyphTypeface.Metrics.DesignEmHeight;
var advance = glyphTypeface.GetGlyphAdvance(glyphIndices[0]) * scale;
var advances = new[] { advance, advance, advance};
var characters = new[] { 'A', 'B', 'C' };
GlyphRun = new GlyphRun(glyphTypeface, 100, characters, glyphIndices, advances);
}
public GlyphRun GlyphRun { get; }
public override void Render(DrawingContext context)
{
var foreground = TextElement.GetForeground(this);
context.DrawGlyphRun(foreground, GlyphRun);
}
}
}
}

BIN
tests/TestFiles/Direct2D1/Media/GlyphRun/Should_Render_GlyphRun_Positioned.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
tests/TestFiles/Direct2D1/Media/GlyphRun/Should_Render_GlyphRun_UnPositioned.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
tests/TestFiles/Skia/Media/GlyphRun/Should_Render_GlyphRun_Positioned.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
tests/TestFiles/Skia/Media/GlyphRun/Should_Render_GlyphRun_UnPositioned.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Loading…
Cancel
Save