From 44fa2152bd7dd6494fa8ae304cc28ca45283fe5a Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Fri, 20 Dec 2019 14:23:16 +0200 Subject: [PATCH 1/3] add failing test for #3376 --- .../FontManagerImplTests.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/Avalonia.Skia.UnitTests/FontManagerImplTests.cs b/tests/Avalonia.Skia.UnitTests/FontManagerImplTests.cs index 927f98b32b..fdd88dab0e 100644 --- a/tests/Avalonia.Skia.UnitTests/FontManagerImplTests.cs +++ b/tests/Avalonia.Skia.UnitTests/FontManagerImplTests.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Reflection; using Avalonia.Media; using Avalonia.Platform; @@ -29,6 +30,23 @@ namespace Avalonia.Skia.UnitTests Assert.Equal(SKTypeface.Default.FontSlant, skTypeface.FontSlant); } + [Fact] + public void Should_Create_Typeface_From_Fallback_Bold() + { + var fontManager = new FontManagerImpl(); + + //we need to have a valid font name different from the default one + string fontName = fontManager.GetInstalledFontFamilyNames().First(); + + var glyphTypeface = (GlyphTypefaceImpl)fontManager.CreateGlyphTypeface( + new Typeface(new FontFamily($"A, B, {fontName}"), FontWeight.Bold)); + + var skTypeface = glyphTypeface.Typeface; + + Assert.Equal(fontName, skTypeface.FamilyName); + Assert.Equal(SKFontStyle.Bold.Weight, skTypeface.FontWeight); + } + [Fact] public void Should_Create_Typeface_For_Unknown_Font() { From dd864dd5c91dd7bd60aef78c262a4f264ccd07a5 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Fri, 20 Dec 2019 14:23:40 +0200 Subject: [PATCH 2/3] add a test for same situation for direct2d --- .../Media/FontManagerImplTests.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/Avalonia.Direct2D1.UnitTests/Media/FontManagerImplTests.cs b/tests/Avalonia.Direct2D1.UnitTests/Media/FontManagerImplTests.cs index 82471915f4..3320bcebca 100644 --- a/tests/Avalonia.Direct2D1.UnitTests/Media/FontManagerImplTests.cs +++ b/tests/Avalonia.Direct2D1.UnitTests/Media/FontManagerImplTests.cs @@ -36,6 +36,30 @@ namespace Avalonia.Direct2D1.UnitTests.Media } } + [Fact] + public void Should_Create_Typeface_From_Fallback_Bold() + { + using (AvaloniaLocator.EnterScope()) + { + Direct2D1Platform.Initialize(); + + var fontManager = new FontManagerImpl(); + + var defaultName = fontManager.GetDefaultFontFamilyName(); + + var glyphTypeface = (GlyphTypefaceImpl)fontManager.CreateGlyphTypeface( + new Typeface(new FontFamily("A, B, Arial"), FontWeight.Bold)); + + var font = glyphTypeface.DWFont; + + Assert.Equal("Arial", font.FontFamily.FamilyNames.GetString(0)); + + Assert.Equal(SharpDX.DirectWrite.FontWeight.Bold, font.Weight); + + Assert.Equal(SharpDX.DirectWrite.FontStyle.Normal, font.Style); + } + } + [Fact] public void Should_Create_Typeface_For_Unknown_Font() { From c64cc71c6c68413e414c662e7d73d7fdfe4454d8 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Fri, 20 Dec 2019 14:26:13 +0200 Subject: [PATCH 3/3] fix fontfallback for font with some styles like bold/italic etc. --- src/Skia/Avalonia.Skia/FontManagerImpl.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Skia/Avalonia.Skia/FontManagerImpl.cs b/src/Skia/Avalonia.Skia/FontManagerImpl.cs index 727947e59d..60d6ecaabc 100644 --- a/src/Skia/Avalonia.Skia/FontManagerImpl.cs +++ b/src/Skia/Avalonia.Skia/FontManagerImpl.cs @@ -89,12 +89,15 @@ namespace Avalonia.Skia if (typeface.FontFamily.Key == null) { + var defaultName = SKTypeface.Default.FamilyName; + foreach (var familyName in typeface.FontFamily.FamilyNames) { skTypeface = SKTypeface.FromFamilyName(familyName, (SKFontStyleWeight)typeface.Weight, SKFontStyleWidth.Normal, (SKFontStyleSlant)typeface.Style); - if (skTypeface == SKTypeface.Default) + if (!skTypeface.FamilyName.Equals(familyName, StringComparison.Ordinal) && + defaultName.Equals(skTypeface.FamilyName, StringComparison.Ordinal)) { continue; }