Browse Source

Merge pull request #2227 from jeffreye/system-fonts

System fonts
Nikita Tsukanov 6 years ago
parent
commit
3d4fb2c54b

+ 9 - 0
samples/ControlCatalog/Pages/DropDownPage.xaml

@@ -27,6 +27,15 @@
           <TextBox Text="TextBox"/>
           <TextBox Text="TextBox"/>
         </DropDownItem>
         </DropDownItem>
       </DropDown>
       </DropDown>
+
+
+       <DropDown x:Name="fontDropDown"  SelectedIndex="0">
+            <DropDown.ItemTemplate>
+                <DataTemplate>
+                    <TextBlock Text="{Binding Name}" FontFamily="{Binding}" />
+                </DataTemplate>
+            </DropDown.ItemTemplate>
+       </DropDown>
     </StackPanel>
     </StackPanel>
 
 
   </StackPanel>
   </StackPanel>

+ 3 - 0
samples/ControlCatalog/Pages/DropDownPage.xaml.cs

@@ -13,6 +13,9 @@ namespace ControlCatalog.Pages
         private void InitializeComponent()
         private void InitializeComponent()
         {
         {
             AvaloniaXamlLoader.Load(this);
             AvaloniaXamlLoader.Load(this);
+            var fontDropDown = this.Find<DropDown>("fontDropDown");
+            fontDropDown.Items = Avalonia.Media.FontFamily.SystemFontFamilies;
+            fontDropDown.SelectedIndex = 0;
         }
         }
     }
     }
 }
 }

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

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

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

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

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

@@ -19,6 +19,8 @@ namespace Avalonia.Skia
     {
     {
         private GRContext GrContext { get; }
         private GRContext GrContext { get; }
 
 
+        public IEnumerable<string> InstalledFontNames => SKFontManager.Default.FontFamilies;
+
         public PlatformRenderInterface()
         public PlatformRenderInterface()
         {
         {
             var gl = AvaloniaLocator.Current.GetService<IWindowingPlatformGlFeature>();
             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 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 readonly object s_initLock = new object();
         private static bool s_initialized = false;
         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
     internal static class Direct2D1FontCollectionCache
     {
     {
         private static readonly ConcurrentDictionary<FontFamilyKey, SharpDX.DirectWrite.FontCollection> s_cachedCollections;
         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()
         static Direct2D1FontCollectionCache()
         {
         {

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

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

+ 2 - 0
tests/Avalonia.Visuals.UnitTests/VisualTree/MockRenderInterface.cs

@@ -8,6 +8,8 @@ namespace Avalonia.Visuals.UnitTests.VisualTree
 {
 {
     class MockRenderInterface : IPlatformRenderInterface
     class MockRenderInterface : IPlatformRenderInterface
     {
     {
+        public IEnumerable<string> InstalledFontNames => new string[0];
+
         public IFormattedTextImpl CreateFormattedText(
         public IFormattedTextImpl CreateFormattedText(
             string text,
             string text,
             Typeface typeface,
             Typeface typeface,