From 1451a7ed406a397cdbda894e493c8df6172d4cf1 Mon Sep 17 00:00:00 2001 From: Benedikt Schroeder Date: Sun, 16 Jun 2019 15:16:24 +0200 Subject: [PATCH] Make sure System font can be used with all face variations --- src/Skia/Avalonia.Skia/FormattedTextImpl.cs | 4 ++-- .../Avalonia.Skia/SKTypefaceCollection.cs | 2 +- src/Skia/Avalonia.Skia/TypefaceCache.cs | 23 ++++++++++--------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/Skia/Avalonia.Skia/FormattedTextImpl.cs b/src/Skia/Avalonia.Skia/FormattedTextImpl.cs index b701e60660..eb7b65cdce 100644 --- a/src/Skia/Avalonia.Skia/FormattedTextImpl.cs +++ b/src/Skia/Avalonia.Skia/FormattedTextImpl.cs @@ -28,7 +28,7 @@ namespace Avalonia.Skia // Replace 0 characters with zero-width spaces (200B) Text = Text.Replace((char)0, (char)0x200B); - SKTypeface skiaTypeface = TypefaceCache.Default; + SKTypeface skiaTypeface = null; if (typeface.FontFamily.Key != null) { @@ -45,7 +45,7 @@ namespace Avalonia.Skia familyName, typeface.Style, typeface.Weight); - if (skiaTypeface != TypefaceCache.Default) break; + if (skiaTypeface.FamilyName != TypefaceCache.DefaultFamilyName) break; } } else diff --git a/src/Skia/Avalonia.Skia/SKTypefaceCollection.cs b/src/Skia/Avalonia.Skia/SKTypefaceCollection.cs index 17c51dbb6e..17448127b0 100644 --- a/src/Skia/Avalonia.Skia/SKTypefaceCollection.cs +++ b/src/Skia/Avalonia.Skia/SKTypefaceCollection.cs @@ -47,7 +47,7 @@ namespace Avalonia.Skia if (!_fontFamilies.TryGetValue(typeface.FontFamily.Name, out var fontFamily)) { - return TypefaceCache.Default; + return TypefaceCache.GetTypeface(TypefaceCache.DefaultFamilyName, typeface.Style, typeface.Weight); } var weight = (SKFontStyleWeight)typeface.Weight; diff --git a/src/Skia/Avalonia.Skia/TypefaceCache.cs b/src/Skia/Avalonia.Skia/TypefaceCache.cs index 94b9e89962..9e270114d2 100644 --- a/src/Skia/Avalonia.Skia/TypefaceCache.cs +++ b/src/Skia/Avalonia.Skia/TypefaceCache.cs @@ -12,8 +12,10 @@ namespace Avalonia.Skia /// internal static class TypefaceCache { - public static SKTypeface Default = CreateDefaultTypeface(); - static readonly Dictionary> Cache = new Dictionary>(); + public static readonly string DefaultFamilyName = CreateDefaultFamilyName(); + + private static readonly Dictionary> s_cache = + new Dictionary>(); struct FontKey { @@ -49,26 +51,26 @@ namespace Avalonia.Skia // Equals and GetHashCode ommitted } - private static SKTypeface CreateDefaultTypeface() + private static string CreateDefaultFamilyName() { - var defaultTypeface = SKTypeface.FromFamilyName(FontFamily.Default.Name) ?? SKTypeface.FromFamilyName(null); + var defaultTypeface = SKTypeface.CreateDefault(); - return defaultTypeface; + return defaultTypeface.FamilyName; } private static SKTypeface GetTypeface(string name, FontKey key) { var familyKey = name; - if (!Cache.TryGetValue(familyKey, out var entry)) + if (!s_cache.TryGetValue(familyKey, out var entry)) { - Cache[familyKey] = entry = new Dictionary(); + s_cache[familyKey] = entry = new Dictionary(); } if (!entry.TryGetValue(key, out var typeface)) { - typeface = SKTypeface.FromFamilyName(familyKey, key.Weight, SKFontStyleWidth.Normal, key.Slant) - ?? Default; + typeface = SKTypeface.FromFamilyName(familyKey, key.Weight, SKFontStyleWidth.Normal, key.Slant) ?? + GetTypeface(DefaultFamilyName, key); entry[key] = typeface; } @@ -78,7 +80,7 @@ namespace Avalonia.Skia public static SKTypeface GetTypeface(string name, FontStyle style, FontWeight weight) { - SKFontStyleSlant skStyle = SKFontStyleSlant.Upright; + var skStyle = SKFontStyleSlant.Upright; switch (style) { @@ -93,6 +95,5 @@ namespace Avalonia.Skia return GetTypeface(name, new FontKey((SKFontStyleWeight)weight, skStyle)); } - } }