diff --git a/src/Skia/Avalonia.Skia/FontManagerImpl.cs b/src/Skia/Avalonia.Skia/FontManagerImpl.cs index 075a2cc746..125dd0e455 100644 --- a/src/Skia/Avalonia.Skia/FontManagerImpl.cs +++ b/src/Skia/Avalonia.Skia/FontManagerImpl.cs @@ -122,9 +122,7 @@ namespace Avalonia.Skia skTypeface = _skFontManager.MatchFamily(familyName, fontStyle); - if (skTypeface is null - || (!skTypeface.FamilyName.Equals(familyName, StringComparison.Ordinal) - && defaultName.Equals(skTypeface.FamilyName, StringComparison.Ordinal))) + if (skTypeface is null || defaultName.Equals(skTypeface.FamilyName, StringComparison.Ordinal)) { continue; } diff --git a/src/Skia/Avalonia.Skia/SKTypefaceCollection.cs b/src/Skia/Avalonia.Skia/SKTypefaceCollection.cs index f66df9e6e9..1f3f20730f 100644 --- a/src/Skia/Avalonia.Skia/SKTypefaceCollection.cs +++ b/src/Skia/Avalonia.Skia/SKTypefaceCollection.cs @@ -59,15 +59,30 @@ namespace Avalonia.Skia return typeface; } - //Nothing was found so we try some regular cases. + if (TryFindStretchFallback(key, out typeface)) + { + return typeface; + } + + //Nothing was found so we try some regular typeface. if (_typefaces.TryGetValue(new Typeface(key.FontFamily), out typeface)) { return typeface; } - return _typefaces.TryGetValue(new Typeface(key.FontFamily, FontStyle.Italic), out typeface) ? - typeface : - null; + SKTypeface skTypeface = null; + + foreach(var pair in _typefaces) + { + skTypeface = pair.Value; + + if (skTypeface.FamilyName.Contains(key.FontFamily.Name)) + { + return skTypeface; + } + } + + return skTypeface; } private bool TryFindStretchFallback(Typeface key, out SKTypeface typeface) diff --git a/tests/Avalonia.Skia.UnitTests/Media/SKTypefaceCollectionCacheTests.cs b/tests/Avalonia.Skia.UnitTests/Media/SKTypefaceCollectionCacheTests.cs index ddf4a36dcd..64050bd85e 100644 --- a/tests/Avalonia.Skia.UnitTests/Media/SKTypefaceCollectionCacheTests.cs +++ b/tests/Avalonia.Skia.UnitTests/Media/SKTypefaceCollectionCacheTests.cs @@ -28,7 +28,7 @@ namespace Avalonia.Skia.UnitTests.Media } [Fact] - public void Should_Get_Null_For_Invalid_FamilyName() + public void Should_Get_Typeface_For_Invalid_FamilyName() { using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface)) { @@ -39,7 +39,24 @@ namespace Avalonia.Skia.UnitTests.Media var typeface = notoMonoCollection.Get(new Typeface("ABC")); - Assert.Null(typeface); + Assert.NotNull(typeface); + } + } + + [Fact] + public void Should_Get_Typeface_For_Partial_FamilyName() + { + using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface)) + { + var fontFamily = new FontFamily("resm:Avalonia.Skia.UnitTests.Assets?assembly=Avalonia.Skia.UnitTests#T"); + + var fontCollection = SKTypefaceCollectionCache.GetOrAddTypefaceCollection(fontFamily); + + var typeface = fontCollection.Get(new Typeface(fontFamily)); + + Assert.NotNull(typeface); + + Assert.Equal("Twitter Color Emoji", typeface.FamilyName); } } }