diff --git a/src/Avalonia.Visuals/Media/FontFamily.cs b/src/Avalonia.Visuals/Media/FontFamily.cs
index 665dfc1129..d263097e6a 100644
--- a/src/Avalonia.Visuals/Media/FontFamily.cs
+++ b/src/Avalonia.Visuals/Media/FontFamily.cs
@@ -12,7 +12,7 @@ namespace Avalonia.Media
{
static FontFamily()
{
- Default = new FontFamily(FontManager.Default.DefaultFontFamilyName);
+ Default = new FontFamily(FontManager.DefaultFontFamilyName);
}
///
@@ -60,8 +60,11 @@ namespace Avalonia.Media
///
/// Represents all font families in the system. This can be an expensive call depending on platform implementation.
///
+ ///
+ /// Consider using the new instead.
+ ///
public static IEnumerable SystemFontFamilies =>
- FontManager.Default.GetInstalledFontFamilyNames().Select(name => new FontFamily(name));
+ FontManager.GetInstalledFontFamilyNames().Select(name => new FontFamily(name));
///
/// Gets the primary family name of the font family.
diff --git a/src/Avalonia.Visuals/Media/FontManager.cs b/src/Avalonia.Visuals/Media/FontManager.cs
index e89471ede8..95d91e7df1 100644
--- a/src/Avalonia.Visuals/Media/FontManager.cs
+++ b/src/Avalonia.Visuals/Media/FontManager.cs
@@ -1,99 +1,55 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
-using System;
using System.Collections.Generic;
using System.Globalization;
using Avalonia.Platform;
namespace Avalonia.Media
{
- public abstract class FontManager : IFontManagerImpl
+ public static class FontManager
{
- public static readonly FontManager Default = CreateDefaultFontManger();
+ private static readonly IFontManagerImpl s_platformImpl = GetPlatformImpl();
- ///
- public string DefaultFontFamilyName { get; protected set; }
+ ///
+ public static string DefaultFontFamilyName => s_platformImpl.DefaultFontFamilyName;
- private static FontManager CreateDefaultFontManger()
- {
- var platformImpl = AvaloniaLocator.Current.GetService();
-
- if(platformImpl == null)
- {
- return new EmptyFontManager();
- }
-
- return new PlatformFontManger(platformImpl);
- }
+ ///
+ public static IEnumerable GetInstalledFontFamilyNames(bool checkForUpdates = false) =>
+ s_platformImpl.GetInstalledFontFamilyNames(checkForUpdates);
- ///
- public abstract IEnumerable GetInstalledFontFamilyNames(bool checkForUpdates = false);
+ ///
+ public static Typeface GetTypeface(FontFamily fontFamily, FontWeight fontWeight, FontStyle fontStyle) =>
+ s_platformImpl.GetTypeface(fontFamily, fontWeight, fontStyle);
- ///
- public abstract IGlyphTypefaceImpl CreateGlyphTypeface(Typeface typeface);
-
- ///
- public abstract Typeface GetTypeface(FontFamily fontFamily, FontWeight fontWeight, FontStyle fontStyle);
-
- ///
- public abstract Typeface MatchCharacter(int codepoint, FontWeight fontWeight = default,
+ ///
+ public static Typeface MatchCharacter(int codepoint, FontWeight fontWeight = default,
FontStyle fontStyle = default,
- FontFamily fontFamily = null, CultureInfo culture = null);
+ FontFamily fontFamily = null, CultureInfo culture = null) =>
+ s_platformImpl.MatchCharacter(codepoint, fontWeight, fontStyle, fontFamily, culture);
- private class PlatformFontManger : FontManager
+ private static IFontManagerImpl GetPlatformImpl()
{
- private readonly IFontManagerImpl _platformImpl;
-
- public PlatformFontManger(IFontManagerImpl platformImpl)
- {
- _platformImpl = platformImpl;
-
- DefaultFontFamilyName = _platformImpl.DefaultFontFamilyName;
- }
-
- public override IEnumerable GetInstalledFontFamilyNames(bool checkForUpdates = false) =>
- _platformImpl.GetInstalledFontFamilyNames(checkForUpdates);
-
- public override IGlyphTypefaceImpl CreateGlyphTypeface(Typeface typeface) => _platformImpl.CreateGlyphTypeface(typeface);
-
- public override Typeface GetTypeface(FontFamily fontFamily, FontWeight fontWeight, FontStyle fontStyle) =>
- _platformImpl.GetTypeface(fontFamily, fontWeight, fontStyle);
+ var platformImpl = AvaloniaLocator.Current.GetService();
- public override Typeface MatchCharacter(int codepoint, FontWeight fontWeight = default,
- FontStyle fontStyle = default,
- FontFamily fontFamily = null, CultureInfo culture = null) =>
- _platformImpl.MatchCharacter(codepoint, fontWeight, fontStyle, fontFamily, culture);
+ return platformImpl ?? new EmptyFontManagerImpl();
}
- private class EmptyFontManager : FontManager
+ private class EmptyFontManagerImpl : IFontManagerImpl
{
- private readonly string[] _defaultFontFamilies = { "Arial" };
-
- public EmptyFontManager()
- {
- DefaultFontFamilyName = "Arial";
- }
-
- public override IEnumerable GetInstalledFontFamilyNames(bool checkForUpdates = false)
- {
- return _defaultFontFamilies;
- }
+ public string DefaultFontFamilyName => "Arial";
- public override IGlyphTypefaceImpl CreateGlyphTypeface(Typeface typeface)
- {
- throw new NotSupportedException();
- }
+ public IEnumerable GetInstalledFontFamilyNames(bool checkForUpdates = false) => new[] { "Arial" };
- public override Typeface GetTypeface(FontFamily fontFamily, FontWeight fontWeight, FontStyle fontStyle)
+ public Typeface GetTypeface(FontFamily fontFamily, FontWeight fontWeight, FontStyle fontStyle)
{
- throw new NotSupportedException();
+ return new Typeface(fontFamily, fontWeight, fontStyle);
}
- public override Typeface MatchCharacter(int codepoint, FontWeight fontWeight = default, FontStyle fontStyle = default,
+ public Typeface MatchCharacter(int codepoint, FontWeight fontWeight = default, FontStyle fontStyle = default,
FontFamily fontFamily = null, CultureInfo culture = null)
{
- throw new NotSupportedException();
+ return null;
}
}
}
diff --git a/src/Avalonia.Visuals/Media/GlyphTypeface.cs b/src/Avalonia.Visuals/Media/GlyphTypeface.cs
index 1c959a86c5..cba7c8c795 100644
--- a/src/Avalonia.Visuals/Media/GlyphTypeface.cs
+++ b/src/Avalonia.Visuals/Media/GlyphTypeface.cs
@@ -9,7 +9,10 @@ namespace Avalonia.Media
{
public class GlyphTypeface : IDisposable
{
- public GlyphTypeface(Typeface typeface) : this(FontManager.Default.CreateGlyphTypeface(typeface))
+ private static readonly IPlatformRenderInterface s_platformRenderInterface =
+ AvaloniaLocator.Current.GetService();
+
+ public GlyphTypeface(Typeface typeface) : this(s_platformRenderInterface.CreateGlyphTypeface(typeface))
{
}
diff --git a/src/Avalonia.Visuals/Platform/IFontManagerImpl.cs b/src/Avalonia.Visuals/Platform/IFontManagerImpl.cs
index 236631edde..254b5d07d1 100644
--- a/src/Avalonia.Visuals/Platform/IFontManagerImpl.cs
+++ b/src/Avalonia.Visuals/Platform/IFontManagerImpl.cs
@@ -20,15 +20,6 @@ namespace Avalonia.Platform
///
IEnumerable GetInstalledFontFamilyNames(bool checkForUpdates = false);
- ///
- /// Creates a glyph typeface for specified typeface.
- ///
- /// The typeface.
- ///
- /// The glyph typeface implementation.
- ///
- IGlyphTypefaceImpl CreateGlyphTypeface(Typeface typeface);
-
///
/// Get a typeface from specified parameters.
///
diff --git a/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs b/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs
index 619d3088b4..5a0a7b2f19 100644
--- a/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs
+++ b/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs
@@ -111,5 +111,14 @@ namespace Avalonia.Platform
/// The number of bytes per row.
/// An .
IBitmapImpl LoadBitmap(PixelFormat format, IntPtr data, PixelSize size, Vector dpi, int stride);
+
+ ///
+ /// Creates a glyph typeface for specified typeface.
+ ///
+ /// The typeface.
+ ///
+ /// The glyph typeface implementation.
+ ///
+ IGlyphTypefaceImpl CreateGlyphTypeface(Typeface typeface);
}
}
diff --git a/src/Skia/Avalonia.Skia/FontManagerImpl.cs b/src/Skia/Avalonia.Skia/FontManagerImpl.cs
index 6c67438533..03de82178a 100644
--- a/src/Skia/Avalonia.Skia/FontManagerImpl.cs
+++ b/src/Skia/Avalonia.Skia/FontManagerImpl.cs
@@ -1,7 +1,6 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
-using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Globalization;
using Avalonia.Media;
@@ -14,9 +13,6 @@ namespace Avalonia.Skia
{
private SKFontManager _skFontManager = SKFontManager.Default;
- private readonly ConcurrentDictionary _glyphTypefaceCache =
- new ConcurrentDictionary();
-
public FontManagerImpl()
{
DefaultFontFamilyName = SKTypeface.Default.FamilyName;
@@ -34,11 +30,6 @@ namespace Avalonia.Skia
return _skFontManager.FontFamilies;
}
- public IGlyphTypefaceImpl CreateGlyphTypeface(Typeface typeface)
- {
- return _glyphTypefaceCache.GetOrAdd(typeface, new GlyphTypefaceImpl(typeface));
- }
-
public Typeface GetTypeface(FontFamily fontFamily, FontWeight fontWeight, FontStyle fontStyle)
{
return TypefaceCache.Get(fontFamily.Name, fontWeight, fontStyle).Typeface;
diff --git a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs
index e4ad0c1b24..ee0cfb2f06 100644
--- a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs
+++ b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs
@@ -2,6 +2,7 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
+using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using Avalonia.Controls.Platform.Surfaces;
@@ -17,6 +18,9 @@ namespace Avalonia.Skia
///
internal class PlatformRenderInterface : IPlatformRenderInterface
{
+ private readonly ConcurrentDictionary _glyphTypefaceCache =
+ new ConcurrentDictionary();
+
private readonly ICustomSkiaGpu _customSkiaGpu;
private GRContext GrContext { get; }
@@ -150,5 +154,10 @@ namespace Avalonia.Skia
{
return new WriteableBitmapImpl(size, dpi, format);
}
+
+ public IGlyphTypefaceImpl CreateGlyphTypeface(Typeface typeface)
+ {
+ return _glyphTypefaceCache.GetOrAdd(typeface, new GlyphTypefaceImpl(typeface));
+ }
}
}
diff --git a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs
index e76596e925..1bda5157a5 100644
--- a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs
+++ b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs
@@ -2,6 +2,7 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
+using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using Avalonia.Controls;
@@ -27,6 +28,8 @@ namespace Avalonia.Direct2D1
{
public class Direct2D1Platform : IPlatformRenderInterface
{
+ private readonly ConcurrentDictionary _glyphTypefaceCache =
+ new ConcurrentDictionary();
private static readonly Direct2D1Platform s_instance = new Direct2D1Platform();
public static SharpDX.Direct3D11.Device Direct3D11Device { get; private set; }
@@ -190,5 +193,10 @@ namespace Avalonia.Direct2D1
{
return new WicBitmapImpl(format, data, size, dpi, stride);
}
+
+ public IGlyphTypefaceImpl CreateGlyphTypeface(Typeface typeface)
+ {
+ return _glyphTypefaceCache.GetOrAdd(typeface, new GlyphTypefaceImpl(typeface));
+ }
}
}
diff --git a/src/Windows/Avalonia.Direct2D1/Media/FontManagerImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/FontManagerImpl.cs
index de1a4cf2d1..94de397652 100644
--- a/src/Windows/Avalonia.Direct2D1/Media/FontManagerImpl.cs
+++ b/src/Windows/Avalonia.Direct2D1/Media/FontManagerImpl.cs
@@ -1,7 +1,6 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
-using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Globalization;
using Avalonia.Media;
@@ -15,9 +14,6 @@ namespace Avalonia.Direct2D1.Media
{
internal class FontManagerImpl : IFontManagerImpl
{
- private readonly ConcurrentDictionary _glyphTypefaceCache =
- new ConcurrentDictionary();
-
public FontManagerImpl()
{
//ToDo: Implement a real lookup of the system's default font.
@@ -40,11 +36,6 @@ namespace Avalonia.Direct2D1.Media
return fontFamilies;
}
- public IGlyphTypefaceImpl CreateGlyphTypeface(Typeface typeface)
- {
- return _glyphTypefaceCache.GetOrAdd(typeface, new GlyphTypefaceImpl(typeface));
- }
-
public Typeface GetTypeface(FontFamily fontFamily, FontWeight fontWeight, FontStyle fontStyle)
{
//ToDo: Implement caching.