From 374cdd1549562e4e2e47c5950c6cb9589d567e41 Mon Sep 17 00:00:00 2001 From: Benedikt Schroeder Date: Wed, 14 Oct 2020 07:15:00 +0200 Subject: [PATCH 1/2] Use Skia's font metrics --- src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs | 44 ++++++++------------- 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs b/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs index 5571bd890d..c649f3d8bf 100644 --- a/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs +++ b/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs @@ -1,6 +1,5 @@ using System; using System.Runtime.InteropServices; -using Avalonia.Media; using Avalonia.Platform; using HarfBuzzSharp; using SkiaSharp; @@ -24,40 +23,31 @@ namespace Avalonia.Skia Font.SetFunctionsOpenType(); - Font.GetScale(out var xScale, out _); + DesignEmHeight = (short)Typeface.UnitsPerEm; - DesignEmHeight = (short)xScale; + var metrics = Typeface.ToFont().Metrics; - if (!Font.TryGetHorizontalFontExtents(out var fontExtents)) - { - Font.TryGetVerticalFontExtents(out fontExtents); - } + Ascent = (int)(metrics.Ascent / 12.0 * Typeface.UnitsPerEm); - Ascent = -fontExtents.Ascender; + Descent = (int)(metrics.Descent / 12.0 * Typeface.UnitsPerEm); - Descent = -fontExtents.Descender; + LineGap = (int)(metrics.Leading / 12.0 * Typeface.UnitsPerEm); - LineGap = fontExtents.LineGap; + UnderlinePosition = metrics.UnderlinePosition != null ? + (int)(metrics.UnderlinePosition / 12.0 * Typeface.UnitsPerEm) : + 0; - if (Font.OpenTypeMetrics.TryGetPosition(OpenTypeMetricsTag.UnderlineOffset, out var underlinePosition)) - { - UnderlinePosition = underlinePosition; - } + UnderlineThickness = metrics.UnderlineThickness != null ? + (int)(metrics.UnderlineThickness / 12.0 * Typeface.UnitsPerEm) : + 0; - if (Font.OpenTypeMetrics.TryGetPosition(OpenTypeMetricsTag.UnderlineSize, out var underlineThickness)) - { - UnderlineThickness = underlineThickness; - } + StrikethroughPosition = metrics.StrikeoutPosition != null ? + (int)(metrics.StrikeoutPosition / 12.0 * Typeface.UnitsPerEm) : + 0; - if (Font.OpenTypeMetrics.TryGetPosition(OpenTypeMetricsTag.StrikeoutOffset, out var strikethroughPosition)) - { - StrikethroughPosition = strikethroughPosition; - } - - if (Font.OpenTypeMetrics.TryGetPosition(OpenTypeMetricsTag.StrikeoutSize, out var strikethroughThickness)) - { - StrikethroughThickness = strikethroughThickness; - } + StrikethroughThickness = metrics.StrikeoutThickness != null ? + (int)(metrics.StrikeoutThickness / 12.0 * Typeface.UnitsPerEm) : + 0; IsFixedPitch = Typeface.IsFixedPitch; } From 7cb133a33a41a8073a840fe538bfcceafb676604 Mon Sep 17 00:00:00 2001 From: Benedikt Schroeder Date: Wed, 14 Oct 2020 11:50:42 +0200 Subject: [PATCH 2/2] Introduce defaultFontRenderingEmSize --- src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs b/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs index c649f3d8bf..ceccc481f9 100644 --- a/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs +++ b/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs @@ -27,26 +27,28 @@ namespace Avalonia.Skia var metrics = Typeface.ToFont().Metrics; - Ascent = (int)(metrics.Ascent / 12.0 * Typeface.UnitsPerEm); + const double defaultFontRenderingEmSize = 12.0; - Descent = (int)(metrics.Descent / 12.0 * Typeface.UnitsPerEm); + Ascent = (int)(metrics.Ascent / defaultFontRenderingEmSize * Typeface.UnitsPerEm); - LineGap = (int)(metrics.Leading / 12.0 * Typeface.UnitsPerEm); + Descent = (int)(metrics.Descent / defaultFontRenderingEmSize * Typeface.UnitsPerEm); + + LineGap = (int)(metrics.Leading / defaultFontRenderingEmSize * Typeface.UnitsPerEm); UnderlinePosition = metrics.UnderlinePosition != null ? - (int)(metrics.UnderlinePosition / 12.0 * Typeface.UnitsPerEm) : + (int)(metrics.UnderlinePosition / defaultFontRenderingEmSize * Typeface.UnitsPerEm) : 0; UnderlineThickness = metrics.UnderlineThickness != null ? - (int)(metrics.UnderlineThickness / 12.0 * Typeface.UnitsPerEm) : + (int)(metrics.UnderlineThickness / defaultFontRenderingEmSize * Typeface.UnitsPerEm) : 0; StrikethroughPosition = metrics.StrikeoutPosition != null ? - (int)(metrics.StrikeoutPosition / 12.0 * Typeface.UnitsPerEm) : + (int)(metrics.StrikeoutPosition / defaultFontRenderingEmSize * Typeface.UnitsPerEm) : 0; StrikethroughThickness = metrics.StrikeoutThickness != null ? - (int)(metrics.StrikeoutThickness / 12.0 * Typeface.UnitsPerEm) : + (int)(metrics.StrikeoutThickness / defaultFontRenderingEmSize * Typeface.UnitsPerEm) : 0; IsFixedPitch = Typeface.IsFixedPitch;