From b2959352867ab890a3a0069155d97072b5a54c3e Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Mon, 7 Nov 2022 18:40:33 +0100 Subject: [PATCH] Fix unpositioned GlyphRuns --- .../Avalonia.Skia/PlatformRenderInterface.cs | 10 +++++----- .../Avalonia.RenderTests/Media/GlyphRunTests.cs | 6 ++++-- ...hould_Render_GlyphRun_Positioned.expected.png | Bin 0 -> 5420 bytes ...uld_Render_GlyphRun_UnPositioned.expected.png | Bin 0 -> 5420 bytes ...hould_Render_GlyphRun_Positioned.expected.png | Bin 0 -> 4966 bytes ...uld_Render_GlyphRun_UnPositioned.expected.png | Bin 0 -> 4966 bytes 6 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 tests/TestFiles/Direct2D1/Media/GlyphRun/Should_Render_GlyphRun_Positioned.expected.png create mode 100644 tests/TestFiles/Direct2D1/Media/GlyphRun/Should_Render_GlyphRun_UnPositioned.expected.png create mode 100644 tests/TestFiles/Skia/Media/GlyphRun/Should_Render_GlyphRun_Positioned.expected.png create mode 100644 tests/TestFiles/Skia/Media/GlyphRun/Should_Render_GlyphRun_UnPositioned.expected.png diff --git a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs index dd3badb2d8..f34e25299c 100644 --- a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs +++ b/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 glyphIndices, + public IGlyphRunImpl CreateGlyphRun(IGlyphTypeface glyphTypeface, double fontRenderingEmSize, IReadOnlyList glyphIndices, IReadOnlyList glyphAdvances, IReadOnlyList 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]; } diff --git a/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs b/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs index f6440e7fd4..fb90038a74 100644 --- a/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs +++ b/tests/Avalonia.RenderTests/Media/GlyphRunTests.cs @@ -166,9 +166,11 @@ namespace Avalonia.Direct2D1.RenderTests.Media var glyphIndices = new[] { glyphTypeface.GetGlyph('A'), glyphTypeface.GetGlyph('B'), glyphTypeface.GetGlyph('C') }; - var scale = glyphTypeface.Metrics.DesignEmHeight / 100.0; + var scale = 100.0 / glyphTypeface.Metrics.DesignEmHeight; - var advances = new[] { glyphTypeface.GetGlyphAdvance(glyphIndices[0]) * scale, glyphTypeface.GetGlyphAdvance(glyphIndices[1]) * scale, glyphTypeface.GetGlyphAdvance(glyphIndices[2]) * scale }; + var advance = glyphTypeface.GetGlyphAdvance(glyphIndices[0]) * scale; + + var advances = new[] { advance, advance, advance}; var characters = new[] { 'A', 'B', 'C' }; diff --git a/tests/TestFiles/Direct2D1/Media/GlyphRun/Should_Render_GlyphRun_Positioned.expected.png b/tests/TestFiles/Direct2D1/Media/GlyphRun/Should_Render_GlyphRun_Positioned.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..913266b6523a39fff08811b22e809c003b2c678f GIT binary patch literal 5420 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 Oq{% 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 N5HM?#Vk7tH{|C(Tfx`d* literal 0 HcmV?d00001 diff --git a/tests/TestFiles/Skia/Media/GlyphRun/Should_Render_GlyphRun_UnPositioned.expected.png b/tests/TestFiles/Skia/Media/GlyphRun/Should_Render_GlyphRun_UnPositioned.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..4b8371541e228a3062aacacf216bfbec2c9c40d1 GIT binary patch literal 4966 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 N5HM?#Vk7tH{|C(Tfx`d* literal 0 HcmV?d00001