瀏覽代碼

#2222 Get all fonts in the system

Jeffrey Ye 6 年之前
父節點
當前提交
2ed745d493

+ 7 - 0
src/Avalonia.Visuals/Media/FontFamily.cs

@@ -5,6 +5,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using Avalonia.Media.Fonts;
+using Avalonia.Platform;
 
 namespace Avalonia.Media
 {
@@ -51,6 +52,12 @@ namespace Avalonia.Media
         /// </summary>
         public static FontFamily Default => new FontFamily(String.Empty);
 
+        /// <summary>
+        /// Represents all font families in the system
+        /// </summary>
+        public static IEnumerable<FontFamily> SystemFontFamilies =>
+            AvaloniaLocator.Current.GetService<IPlatformRenderInterface>().InstalledFontNames.Select(name => new FontFamily(name));
+
         /// <summary>
         /// Gets the primary family name of the font family.
         /// </summary>

+ 5 - 0
src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs

@@ -13,6 +13,11 @@ namespace Avalonia.Platform
     /// </summary>
     public interface IPlatformRenderInterface
     {
+        /// <summary>
+        /// Get all installed fonts in the system
+        /// </summary>
+        IEnumerable<string> InstalledFontNames { get; }
+
         /// <summary>
         /// Creates a formatted text implementation.
         /// </summary>

+ 2 - 0
src/Skia/Avalonia.Skia/PlatformRenderInterface.cs

@@ -19,6 +19,8 @@ namespace Avalonia.Skia
     {
         private GRContext GrContext { get; }
 
+        public IEnumerable<string> InstalledFontNames => SKFontManager.Default.FontFamilies;
+
         public PlatformRenderInterface()
         {
             var gl = AvaloniaLocator.Current.GetService<IWindowingPlatformGlFeature>();

+ 13 - 0
src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs

@@ -41,6 +41,19 @@ namespace Avalonia.Direct2D1
 
         public static SharpDX.DXGI.Device1 DxgiDevice { get; private set; }
 
+        public IEnumerable<string> InstalledFontNames
+        {
+            get
+            {
+                var cache = Direct2D1FontCollectionCache.s_installedFontCollection;
+                var length = cache.FontFamilyCount;
+                for (int i = 0; i < length; i++)
+                {
+                    var names = cache.GetFontFamily(i).FamilyNames;
+                    yield return names.GetString(0);
+                }
+            }
+        }
 
         private static readonly object s_initLock = new object();
         private static bool s_initialized = false;

+ 1 - 1
src/Windows/Avalonia.Direct2D1/Media/Direct2D1FontCollectionCache.cs

@@ -7,7 +7,7 @@ namespace Avalonia.Direct2D1.Media
     internal static class Direct2D1FontCollectionCache
     {
         private static readonly ConcurrentDictionary<FontFamilyKey, SharpDX.DirectWrite.FontCollection> s_cachedCollections;
-        private static readonly SharpDX.DirectWrite.FontCollection s_installedFontCollection;
+        internal static readonly SharpDX.DirectWrite.FontCollection s_installedFontCollection;
 
         static Direct2D1FontCollectionCache()
         {

+ 2 - 0
tests/Avalonia.UnitTests/MockPlatformRenderInterface.cs

@@ -9,6 +9,8 @@ namespace Avalonia.UnitTests
 {
     public class MockPlatformRenderInterface : IPlatformRenderInterface
     {
+        public IEnumerable<string> InstalledFontNames => Mock.Of<IEnumerable<string>>();
+
         public IFormattedTextImpl CreateFormattedText(
             string text,
             Typeface typeface,